diff options
-rw-r--r-- | .SRCINFO | 9 | ||||
-rw-r--r-- | 1928.patch | 967 | ||||
-rw-r--r-- | PKGBUILD | 29 |
3 files changed, 20 insertions, 985 deletions
@@ -1,22 +1,21 @@ pkgbase = tutanota-desktop pkgdesc = Official Tutanota email client - pkgver = 3.72.0 + pkgver = 3.73.1 pkgrel = 1 url = https://tutanota.com arch = x86_64 license = GPL3 makedepends = npm + makedepends = nvm depends = nss depends = libxss depends = libxtst depends = libappindicator-gtk3 depends = libnotify - source = https://github.com/tutao/tutanota/archive/tutanota-release-3.72.0.tar.gz - source = 1928.patch + source = https://github.com/tutao/tutanota/archive/tutanota-release-3.73.1.tar.gz source = tutanota-desktop source = tutanota-desktop.desktop - sha256sums = 2d2fad61b85fec6398a4efaaf5aa23be3049fe632439ebaf01604ecc21662136 - sha256sums = 614755f15fe792caf617829b19198d6a74b480436fea45568b315773c60a9ae6 + sha256sums = 4d49b222667da949be083fdebe8184b9f9d304cac0abc16a83fcab49e0edffca sha256sums = 4f91e842bd92a3312943854383e4929f9baf6cb684a7027aa55edcce1bf4ca16 sha256sums = 1215678e2fc23cfbeb73063f68dc440891e5b2e10734fa7f402e06860c292e31 diff --git a/1928.patch b/1928.patch deleted file mode 100644 index 3d3d8ec5c5e9..000000000000 --- a/1928.patch +++ /dev/null @@ -1,967 +0,0 @@ -From 4aed9bd33e5230b0c1e496c3ba75b41a2a74b231 Mon Sep 17 00:00:00 2001 -From: nig <nig@tutao.de> -Date: Thu, 26 Mar 2020 17:10:42 +0100 -Subject: [PATCH 1/4] [desktop] add builds w/o auto-updates and unpacked - builds, close #1857 - -adds some options to the dist.js build script: ---unpacked -disables the building of installers (dir target for all platforms) - ---out-dir <outDir> -move the built installers (or dirs) into the path outDir after building. -Defaults to build/desktop and build/desktop-test - ---custom-release -disable autoUpdate in the release target by not including an update url. ---- - buildSrc/DesktopBuilder.js | 45 ++++++++++++---------- - buildSrc/electron-package-json-template.js | 42 +++++++++++--------- - dist.js | 25 ++++++++---- - doc/BUILDING.md | 28 +++++++++++++- - src/desktop/ElectronUpdater.js | 10 +++++ - test/client/desktop/ElectronUpdaterTest.js | 42 ++++++++++++++++++++ - 6 files changed, 142 insertions(+), 50 deletions(-) - -diff --git a/buildSrc/DesktopBuilder.js b/buildSrc/DesktopBuilder.js -index 819fc78a1..9e144c836 100644 ---- a/buildSrc/DesktopBuilder.js -+++ b/buildSrc/DesktopBuilder.js -@@ -3,15 +3,14 @@ const babel = Promise.promisifyAll(require("babel-core")) - const fs = Promise.promisifyAll(require("fs-extra")) - const path = require("path") - -- --function build(dirname, version, targets, updateUrl, nameSuffix, notarize) { -+function build(dirname, version, targets, updateUrl, nameSuffix, notarize, outDir, unpacked) { - const targetString = Object.keys(targets) - .filter(k => typeof targets[k] !== "undefined") - .join(" ") - console.log("Building desktop client for v" + version + " (" + targetString + ")...") -- const updateSubDir = "desktop" + nameSuffix - const distDir = path.join(dirname, '/build/dist/') -- -+ outDir = path.join(outDir || path.join(distDir, ".."), 'desktop' + nameSuffix) -+ console.log("artifacts will be moved to", outDir) - const requiredEntities = fs.readdirSync(path.join(dirname, './src/api/entities/sys/')) - .map(fn => path.join(dirname, './src/api/entities/sys', fn)) - const languageFiles = fs.readdirSync(path.join(dirname, './src/translations/')) -@@ -24,14 +23,14 @@ function build(dirname, version, targets, updateUrl, nameSuffix, notarize) { - updateUrl, - path.join(dirname, "/resources/desktop-icons/logo-solo-red.png"), - nameSuffix !== "-snapshot", -- notarize -+ notarize, -+ unpacked - ) -- console.log("updateUrl is", updateUrl) - let writeConfig = fs.writeFileAsync("./build/dist/package.json", JSON.stringify(content), 'utf-8') - - //prepare files - return writeConfig -- .then(() => fs.removeAsync(path.join(distDir, "..", updateSubDir))) -+ .then(() => fs.removeAsync(outDir)) - .then(() => { - console.log("Tracing dependencies...") - transpile(['./src/desktop/DesktopMain.js', './src/desktop/preload.js'] -@@ -52,24 +51,28 @@ function build(dirname, version, targets, updateUrl, nameSuffix, notarize) { - }) - }) - .then(() => { -- console.log("Move output to /build/" + updateSubDir + "/...") -+ const installerDir = path.join(distDir, 'installers') -+ console.log("Move artifacts to", outDir) -+ const unpackedFilter = file => file.endsWith("-unpacked") || file === "mac" -+ const packedFilter = file => file.startsWith(content.name) || file.endsWith('.yml') -+ - return Promise.all( -- fs.readdirSync(path.join(distDir, '/installers')) -- .filter((file => file.startsWith(content.name) || file.endsWith('.yml'))) -+ fs.readdirSync(installerDir) -+ .filter(unpacked ? unpackedFilter : packedFilter) - .map(file => fs.moveAsync( -- path.join(distDir, '/installers/', file), -- path.join(distDir, `../${updateSubDir}`, file) -+ path.join(installerDir, file), -+ path.join(outDir, file) - ) - ) -- ).then(() => Promise.all([ -- fs.removeAsync(path.join(distDir, '/installers/')), -- fs.removeAsync(path.join(distDir, '/node_modules/')), -- fs.removeAsync(path.join(distDir, '/cache.json')), -- fs.removeAsync(path.join(distDir, '/package.json')), -- fs.removeAsync(path.join(distDir, '/package-lock.json')), -- fs.removeAsync(path.join(distDir, '/src/')), -- ])) -- }) -+ ) -+ }).then(() => Promise.all([ -+ fs.removeAsync(path.join(distDir, '/installers/')), -+ fs.removeAsync(path.join(distDir, '/node_modules/')), -+ fs.removeAsync(path.join(distDir, '/cache.json')), -+ fs.removeAsync(path.join(distDir, '/package.json')), -+ fs.removeAsync(path.join(distDir, '/package-lock.json')), -+ fs.removeAsync(path.join(distDir, '/src/')), -+ ])) - } - - /** -diff --git a/buildSrc/electron-package-json-template.js b/buildSrc/electron-package-json-template.js -index 3243f06d1..a24067fb3 100644 ---- a/buildSrc/electron-package-json-template.js -+++ b/buildSrc/electron-package-json-template.js -@@ -6,7 +6,7 @@ const pj = require('../package.json') - * 2. copied to app-desktop/build/dist from dist.js (DesktopBuilder) - */ - --module.exports = function (nameSuffix, version, targetUrl, iconPath, sign, notarize) { -+module.exports = function (nameSuffix, version, updateUrl, iconPath, sign, notarize, unpacked) { - return { - "name": "tutanota-desktop" + nameSuffix, - "main": "./src/desktop/DesktopMain.js", -@@ -88,12 +88,14 @@ module.exports = function (nameSuffix, version, targetUrl, iconPath, sign, notar - } - ], - "forceCodeSigning": sign || !!process.env.JENKINS, -- "publish": { -- "provider": "generic", -- "url": targetUrl, -- "channel": "latest", -- "publishAutoUpdate": true -- }, -+ "publish": updateUrl -+ ? { -+ "provider": "generic", -+ "url": updateUrl, -+ "channel": "latest", -+ "publishAutoUpdate": true -+ } -+ : undefined, - "directories": { - "output": "installers" - }, -@@ -112,7 +114,7 @@ module.exports = function (nameSuffix, version, targetUrl, iconPath, sign, notar - : undefined, - "target": [ - { -- "target": "nsis", -+ "target": unpacked ? "dir" : "nsis", - "arch": "x64" - } - ] -@@ -134,16 +136,18 @@ module.exports = function (nameSuffix, version, targetUrl, iconPath, sign, notar - "extendInfo": { - "LSUIElement": 1 //hide dock icon on startup - }, -- "target": [ -- { -- "target": "zip", -- "arch": "x64" -- }, -- { -- "target": "dmg", -- "arch": "x64" -- } -- ] -+ "target": unpacked -+ ? [{"target": "dir", "arch": "x64"}] -+ : [ -+ { -+ "target": "zip", -+ "arch": "x64" -+ }, -+ { -+ "target": "dmg", -+ "arch": "x64" -+ } -+ ] - }, - "linux": { - "icon": path.join(path.dirname(iconPath), "icon/"), -@@ -154,7 +158,7 @@ module.exports = function (nameSuffix, version, targetUrl, iconPath, sign, notar - }, - "target": [ - { -- "target": "AppImage", -+ "target": unpacked ? "dir" : "AppImage", - "arch": "x64" - } - ] -diff --git a/dist.js b/dist.js -index fce9a681d..ca1f54f09 100644 ---- a/dist.js -+++ b/dist.js -@@ -49,6 +49,9 @@ options - .option('-m --mac', 'Build desktop client for mac') - .option('-d, --deb', 'Build .deb package. Requires -wlm to be set or installers to be present') - .option('-p, --publish', 'Git tag and upload package, only allowed in release stage. Implies -d.') -+ .option('--custom-release', "use if manually building from source. doesn't install autoupdates, but may still notify about new releases") -+ .option('--unpacked', "don't pack the app into an installer") -+ .option('--out-dir <outDir>', "where to copy the client",) - .action((stage, host) => { - if (!["test", "prod", "local", "host", "release", undefined].includes(stage) - || (stage !== "host" && host) -@@ -177,26 +180,32 @@ function buildDesktopClient() { - if (options.desktop) { - const desktopBuilder = require('./buildSrc/DesktopBuilder.js') - if (options.stage === "release") { -- return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://mail.tutanota.com", version, "Desktop", true), bundles) -- .then(() => desktopBuilder.build(__dirname, version, options.desktop, "https://mail.tutanota.com/desktop", "", /*notarize*/true)) -- .then(() => createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://test.tutanota.com", version, "Desktop", true), bundles)) -- .then(() => desktopBuilder.build(__dirname, version, options.desktop, "https://test.tutanota.com/desktop", "-test", /*notarize*/true)) -+ const updateUrl = options.customRelease -+ ? "" -+ : "https://mail.tutanota.com/desktop" -+ const buildPromise = createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://mail.tutanota.com", version, "Desktop", true), bundles) -+ .then(() => desktopBuilder.build(__dirname, version, options.desktop, updateUrl, "", /*notarize*/true, options.outDir, options.unpacked)) -+ if (!options.customRelease) { // don't build the test version for manual/custom builds -+ buildPromise.then(() => createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://test.tutanota.com", version, "Desktop", true), bundles)) -+ .then(() => desktopBuilder.build(__dirname, version, options.desktop, "https://test.tutanota.com/desktop", "-test", /*notarize*/true, options.outDir, options.unpacked)) -+ } -+ return buildPromise - } else if (options.stage === "local") { - return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "http://localhost:9000", version, "Desktop", true), bundles) - .then(() => desktopBuilder.build(__dirname, `${new Date().getTime()}.0.0`, -- options.desktop, "http://localhost:9000", "-snapshot")) -+ options.desktop, "http://localhost:9000", "-snapshot", options.outDir, options.unpacked)) - } else if (options.stage === "test") { - return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://test.tutanota.com", version, "Desktop", true), bundles) - .then(() => desktopBuilder.build(__dirname, `${new Date().getTime()}.0.0`, -- options.desktop, "https://test.tutanota.com/desktop", "-test")) -+ options.desktop, "https://test.tutanota.com/desktop", "-test", options.outDir, options.unpacked)) - } else if (options.stage === "prod") { - return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://mail.tutanota.com", version, "Desktop", true), bundles) - .then(() => desktopBuilder.build(__dirname, `${new Date().getTime()}.0.0`, -- options.desktop, "http://localhost:9000/desktop", "")) -+ options.desktop, "http://localhost:9000/desktop", "", options.outDir, options.unpacked)) - } else { // stage = host - return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), options.host, version, "Desktop", true), bundles) - .then(() => desktopBuilder.build(__dirname, `${new Date().getTime()}.0.0`, -- options.desktop, "http://localhost:9000/desktop-snapshot", "-snapshot")) -+ options.desktop, "http://localhost:9000/desktop-snapshot", "-snapshot", options.outDir, options.unpacked)) - } - } - } -diff --git a/doc/BUILDING.md b/doc/BUILDING.md -index 75bf18373..b43010f65 100644 ---- a/doc/BUILDING.md -+++ b/doc/BUILDING.md -@@ -12,7 +12,7 @@ your own. If you prefer the auto-update feature, you can use the official [mail] - 1. Clone the repository: `git clone https://github.com/tutao/tutanota.git` - 2. Switch into the repository directory: `cd tutanota` - 3. Checkout the latest web release tag: `git checkout tutanota-release-xxx` --4. Do `npm install` -+4. run `npm install` to install dependencies. - 5. Build the web part: `node dist prod` - 6. Switch into the build directory: `cd build/dist` - 7. Run local server. Either use `node server` or `python -m SimpleHTTPServer 9000`. -@@ -21,7 +21,7 @@ your own. If you prefer the auto-update feature, you can use the official [mail] - ## Building and running your own Tutanota Android app - - If you build and install the Tutanota Android app by yourself, keep in mind that you will not get updates automatically. --If you prefer the auto-update feature, use the Google Play Store or F-Droid in the future. -+If you prefer the auto-update feature, download the app from the Google Play Store or F-Droid. - - #### Pre-requisites: - * An up-to-date version of Git is installed -@@ -37,3 +37,27 @@ If you prefer the auto-update feature, use the Google Play Store or F-Droid in t - 5. Create a keystore if you don't have one: `keytool -genkey -noprompt -keystore MyKeystore.jks -alias tutaKey -keyalg RSA -keysize 2048 -validity 10000 -deststoretype pkcs12 -storepass CHANGEME -keypass CHANGEME -dname "CN=com.example"` - 6. run `APK_SIGN_ALIAS="tutaKey" APK_SIGN_STORE='MyKeystore.jks' APK_SIGN_STORE_PASS="CHANGEME" APK_SIGN_KEY_PASS="CHANGEME" node android` - 7. Install the app on your device: `adb install -r <path-to-apk>` (path as printed by the build script) -+ -+## Building and running your own Tutanota Desktop client -+ -+Keep in mind that your own build of Tutanota Desktop will not update automatically. -+ -+### Pre-requisites: -+* An up-to-date version of Git is installed. -+* An up-to-date version of Node.js is installed -+ -+### Preparations: -+0. Open a terminal. -+1. Clone the repository: `git clone https://github.com/tutao/tutanota.git`. -+2. Switch into the Tutanota directory: `cd tutanota` -+3. Checkout the latest web release tag: `git checkout tutanota-release-xxx` -+4. Run `npm install` to install dependencies. -+ -+### Build: -+Linux: `node dist -l --custom-release` -+Windows: `node dist -w --custom-release` -+MacOs: `node dist -m --custom-release` -+ -+The client will be in `build/desktop/` -+Note that you can add `--unpacked` to the build command to skip the packaging of the installer. -+This will yield a directory containing the client that can be run without installation. -\ No newline at end of file -diff --git a/src/desktop/ElectronUpdater.js b/src/desktop/ElectronUpdater.js -index 6c8c61ccd..29269ca9b 100644 ---- a/src/desktop/ElectronUpdater.js -+++ b/src/desktop/ElectronUpdater.js -@@ -9,6 +9,8 @@ import type {DesktopConfigHandler} from './config/DesktopConfigHandler' - import {neverNull} from "../api/common/utils/Utils" - import {UpdateError} from "../api/common/error/UpdateError" - import {DesktopTray} from "./tray/DesktopTray" -+import fs from 'fs-extra' -+import path from 'path' - - export class ElectronUpdater { - _conf: DesktopConfigHandler; -@@ -91,6 +93,14 @@ export class ElectronUpdater { - +_enableAutoUpdateListener = () => this.start() - - start() { -+ try { -+ const appUpdateYmlPath = path.join(path.dirname(app.getPath('exe')), 'resources', 'app-update.yml') -+ fs.accessSync(appUpdateYmlPath, fs.constants.R_OK) -+ } catch (e) { -+ console.log("no update info on disk, disabling updater.") -+ return -+ } -+ - // if user changes auto update setting, we want to know - this._conf.removeListener('enableAutoUpdate', this._enableAutoUpdateListener) - .on('enableAutoUpdate', this._enableAutoUpdateListener) -diff --git a/test/client/desktop/ElectronUpdaterTest.js b/test/client/desktop/ElectronUpdaterTest.js -index 43580cec6..d5b4194db 100644 ---- a/test/client/desktop/ElectronUpdaterTest.js -+++ b/test/client/desktop/ElectronUpdaterTest.js -@@ -98,6 +98,13 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - } - } - -+ const fs = { -+ accessSync: () => {}, -+ constants: { -+ "R_OK": 1 -+ } -+ } -+ - const lang = { - lang: { - get: (key: string) => { -@@ -142,6 +149,7 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - - o("update is available", done => { - //mock node modules -+ const fsMock = n.mock('fs-extra', fs).set() - const forgeMock = n.mock('node-forge', nodeForge).set() - const autoUpdaterMock = n.mock('electron-updater', autoUpdater).set().autoUpdater - const electronMock = n.mock('electron', electron).set() -@@ -201,6 +209,7 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - - o("update is not available", done => { - //mock node modules -+ const fsMock = n.mock('fs-extra', fs).set() - const forgeMock = n.mock('node-forge', nodeForge).set() - const electronMock = n.mock('electron', electron).set() - const autoUpdaterMock = n.mock('electron-updater', autoUpdater) -@@ -242,6 +251,7 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - - o("enable autoUpdate while running", done => { - //mock node modules -+ const fsMock = n.mock('fs-extra', fs).set() - const forgeMock = n.mock('node-forge', nodeForge).set() - const electronMock = n.mock('electron', electron).set() - const autoUpdaterMock = n.mock('electron-updater', autoUpdater).set().autoUpdater -@@ -317,6 +327,7 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - - o("retry after autoUpdater reports an error", done => { - //mock node modules -+ const fsMock = n.mock('fs-extra', fs).set() - const forgeMock = n.mock('node-forge', nodeForge).set() - const electronMock = n.mock('electron', electron).set() - const autoUpdaterMock = n.mock('electron-updater', autoUpdater) -@@ -388,6 +399,7 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - const MAX_NUM_ERRORS = 5 - let threw = false - //mock node modules -+ const fsMock = n.mock('fs-extra', fs).set() - const forgeMock = n.mock('node-forge', nodeForge).set() - const electronMock = n.mock('electron', electron).set() - const autoUpdaterMock = n.mock('electron-updater', autoUpdater) -@@ -432,6 +444,7 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - o("works if second key is right one", done => { - - //mock node modules -+ const fsMock = n.mock('fs-extra', fs).set() - const forgeMock = n.mock('node-forge', nodeForge).with({ - publicKeyFromPem: (pem: string) => n.spyify(pem === "no" ? rightKey : wrongKey) - }).set() -@@ -492,4 +505,33 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - done() - }, 190) - }) -+ -+ o("updater disables itself if accessSync throws", function () { -+ //mock node modules -+ const fsMock = n.mock('fs-extra', fs).with({ -+ accessSync: undefined -+ }).set() -+ const forgeMock = n.mock('node-forge', nodeForge).set() -+ const autoUpdaterMock = n.mock('electron-updater', autoUpdater).set().autoUpdater -+ const electronMock = n.mock('electron', electron).set() -+ -+ //mock our modules -+ n.mock('./tray/DesktopTray', desktopTray).set() -+ n.mock('../misc/LanguageViewModel', lang).set() -+ -+ //mock instances -+ const confMock = n.mock('__conf', conf).set() -+ const notifierMock = n.mock('__notifier', notifier).set() -+ -+ const {ElectronUpdater} = n.subject('../../src/desktop/ElectronUpdater.js') -+ const upd = new ElectronUpdater(confMock, notifierMock) -+ -+ o(autoUpdaterMock.on.callCount).equals(5) -+ o(autoUpdaterMock.logger).equals(null) -+ -+ upd.start() -+ -+ o(confMock.removeListener.callCount).equals(0) -+ } -+ ) - }) - -From 9b5a5eee1bfbdaa6e45fdc49dc176a333989b88a Mon Sep 17 00:00:00 2001 -From: nig <nig@tutao.de> -Date: Tue, 31 Mar 2020 15:55:11 +0200 -Subject: [PATCH 2/4] [desktop] improve custom desktop builds - -- automatically build for current platform if no platform flag is given -- disable notarization on mac -- disable code signing for custom builds without updates ---- - buildSrc/DesktopBuilder.js | 2 +- - dist.js | 19 +++++++++++++------ - doc/BUILDING.md | 6 ++---- - 3 files changed, 16 insertions(+), 11 deletions(-) - -diff --git a/buildSrc/DesktopBuilder.js b/buildSrc/DesktopBuilder.js -index 9e144c836..8449c5923 100644 ---- a/buildSrc/DesktopBuilder.js -+++ b/buildSrc/DesktopBuilder.js -@@ -22,7 +22,7 @@ function build(dirname, version, targets, updateUrl, nameSuffix, notarize, outDi - version, - updateUrl, - path.join(dirname, "/resources/desktop-icons/logo-solo-red.png"), -- nameSuffix !== "-snapshot", -+ nameSuffix !== '-snapshot' && updateUrl !== "", // don't sign if it's a test build or if we don't download updates - notarize, - unpacked - ) -diff --git a/dist.js b/dist.js -index ca1f54f09..2731f8bf9 100644 ---- a/dist.js -+++ b/dist.js -@@ -49,7 +49,7 @@ options - .option('-m --mac', 'Build desktop client for mac') - .option('-d, --deb', 'Build .deb package. Requires -wlm to be set or installers to be present') - .option('-p, --publish', 'Git tag and upload package, only allowed in release stage. Implies -d.') -- .option('--custom-release', "use if manually building from source. doesn't install autoupdates, but may still notify about new releases") -+ .option('--custom-desktop-release', "use if manually building desktop client from source. doesn't install auto updates, but may still notify about new releases.") - .option('--unpacked', "don't pack the app into an installer") - .option('--out-dir <outDir>', "where to copy the client",) - .action((stage, host) => { -@@ -63,15 +63,21 @@ options - options.stage = stage || "release" - options.host = host - options.deb = options.deb || options.publish -- - options.desktop = { - win: options.win ? [] : undefined, - linux: options.linux ? [] : undefined, - mac: options.mac ? [] : undefined - } -+ - options.desktop = Object.values(options.desktop).some(Boolean) - ? options.desktop -- : undefined -+ : !!options.customDesktopRelease // no platform flags given, build desktop for current platform if customDesktopBuild flag is set. -+ ? { -+ win: process.platform === "win32" ? [] : undefined, -+ linux: process.platform === "linux" ? [] : undefined, -+ mac: process.platform === "darwin" ? [] : undefined -+ } -+ : undefined - }) - .parse(process.argv) - -@@ -180,12 +186,13 @@ function buildDesktopClient() { - if (options.desktop) { - const desktopBuilder = require('./buildSrc/DesktopBuilder.js') - if (options.stage === "release") { -- const updateUrl = options.customRelease -+ const updateUrl = options.customDesktopRelease - ? "" - : "https://mail.tutanota.com/desktop" -+ const notarize = !!options.customDesktopRelease - const buildPromise = createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://mail.tutanota.com", version, "Desktop", true), bundles) -- .then(() => desktopBuilder.build(__dirname, version, options.desktop, updateUrl, "", /*notarize*/true, options.outDir, options.unpacked)) -- if (!options.customRelease) { // don't build the test version for manual/custom builds -+ .then(() => desktopBuilder.build(__dirname, version, options.desktop, updateUrl, "", notarize, options.outDir, options.unpacked)) -+ if (!options.customDesktopRelease) { // don't build the test version for manual/custom builds - buildPromise.then(() => createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://test.tutanota.com", version, "Desktop", true), bundles)) - .then(() => desktopBuilder.build(__dirname, version, options.desktop, "https://test.tutanota.com/desktop", "-test", /*notarize*/true, options.outDir, options.unpacked)) - } -diff --git a/doc/BUILDING.md b/doc/BUILDING.md -index b43010f65..2e6994817 100644 ---- a/doc/BUILDING.md -+++ b/doc/BUILDING.md -@@ -54,10 +54,8 @@ Keep in mind that your own build of Tutanota Desktop will not update automatical - 4. Run `npm install` to install dependencies. - - ### Build: --Linux: `node dist -l --custom-release` --Windows: `node dist -w --custom-release` --MacOs: `node dist -m --custom-release` -+Run `node dist --custom-desktop-release`. - --The client will be in `build/desktop/` -+The client for your platform will be in `build/desktop/`. - Note that you can add `--unpacked` to the build command to skip the packaging of the installer. - This will yield a directory containing the client that can be run without installation. -\ No newline at end of file - -From 20d3255a294de040747d67103a375f0061035426 Mon Sep 17 00:00:00 2001 -From: nig <nig@tutao.de> -Date: Fri, 3 Apr 2020 08:10:16 +0200 -Subject: [PATCH 3/4] [desktop] hide auto update option for custom desktop - builds - ---- - src/desktop/ElectronUpdater.js | 5 +++++ - src/desktop/config/DesktopConfigHandler.js | 1 + - src/desktop/config/migrations/DesktopConfigMigrator.js | 2 ++ - src/desktop/config/migrations/migration-0001.js | 7 +++++++ - src/settings/DesktopSettingsViewer.js | 5 ++++- - test/client/desktop/ElectronUpdaterTest.js | 10 ++++++++++ - .../config/migrations/DesktopConfigMigratorTest.js | 6 ++++-- - 7 files changed, 33 insertions(+), 3 deletions(-) - create mode 100644 src/desktop/config/migrations/migration-0001.js - -diff --git a/src/desktop/ElectronUpdater.js b/src/desktop/ElectronUpdater.js -index 29269ca9b..e7e6009fd 100644 ---- a/src/desktop/ElectronUpdater.js -+++ b/src/desktop/ElectronUpdater.js -@@ -98,9 +98,14 @@ export class ElectronUpdater { - fs.accessSync(appUpdateYmlPath, fs.constants.R_OK) - } catch (e) { - console.log("no update info on disk, disabling updater.") -+ this._conf.setDesktopConfig('showAutoUpdateOption', false) - return - } - -+ // if we got here, we could theoretically download updates. -+ // show the option in the settings menu -+ this._conf.setDesktopConfig('showAutoUpdateOption', true) -+ - // if user changes auto update setting, we want to know - this._conf.removeListener('enableAutoUpdate', this._enableAutoUpdateListener) - .on('enableAutoUpdate', this._enableAutoUpdateListener) -diff --git a/src/desktop/config/DesktopConfigHandler.js b/src/desktop/config/DesktopConfigHandler.js -index ae753a1c1..d907968a6 100644 ---- a/src/desktop/config/DesktopConfigHandler.js -+++ b/src/desktop/config/DesktopConfigHandler.js -@@ -11,6 +11,7 @@ export const DesktopConfigKey = { - heartbeatTimeoutInSeconds: 'heartbeatTimeoutInSeconds', - defaultDownloadPath: 'defaultDownloadPath', - enableAutoUpdate: 'enableAutoUpdate', -+ showAutoUpdateOption: 'showAutoUpdateOption', - pushIdentifier: 'pushIdentifier', - runAsTrayApp: 'runAsTrayApp', - lastBounds: 'lastBounds', -diff --git a/src/desktop/config/migrations/DesktopConfigMigrator.js b/src/desktop/config/migrations/DesktopConfigMigrator.js -index 5914bc235..e23e22981 100644 ---- a/src/desktop/config/migrations/DesktopConfigMigrator.js -+++ b/src/desktop/config/migrations/DesktopConfigMigrator.js -@@ -15,6 +15,8 @@ export default function applyMigrations(migrationFunction: "migrateClient" | "mi - oldConfig = applyMigration(require('./migration-0000')[migrationFunction], oldConfig) - // no break, fallthrough applies all migrations in sequence - case 0: -+ oldConfig = applyMigration(require('./migration-0001')[migrationFunction], oldConfig) -+ case 1: - console.log("config up to date") - /* add new migrations as needed */ - break; -diff --git a/src/desktop/config/migrations/migration-0001.js b/src/desktop/config/migrations/migration-0001.js -new file mode 100644 -index 000000000..c46c19bf3 ---- /dev/null -+++ b/src/desktop/config/migrations/migration-0001.js -@@ -0,0 +1,7 @@ -+// @flow -+function migrate(oldConfig: any) { -+ return Object.assign(oldConfig, {"desktopConfigVersion": 1, "showAutoUpdateOption": true}) -+} -+ -+export const migrateClient = migrate -+export const migrateAdmin = migrate -\ No newline at end of file -diff --git a/src/settings/DesktopSettingsViewer.js b/src/settings/DesktopSettingsViewer.js -index 4591adcce..a27e03134 100644 ---- a/src/settings/DesktopSettingsViewer.js -+++ b/src/settings/DesktopSettingsViewer.js -@@ -32,6 +32,7 @@ export class DesktopSettingsViewer implements UpdatableSettingsViewer { - _runOnStartup: Stream<?boolean>; - _isIntegrated: Stream<?boolean>; - _isAutoUpdateEnabled: Stream<?boolean>; -+ _showAutoUpdateOption: Stream<?boolean>; - _isPathDialogOpen: boolean; - - constructor() { -@@ -40,6 +41,7 @@ export class DesktopSettingsViewer implements UpdatableSettingsViewer { - this._runOnStartup = stream(false) - this._isIntegrated = stream(false) - this._isAutoUpdateEnabled = stream(false) -+ this._showAutoUpdateOption = stream(true) - this._requestDesktopConfig() - } - -@@ -157,7 +159,7 @@ export class DesktopSettingsViewer implements UpdatableSettingsViewer { - m(DropDownSelectorN, setRunOnStartupAttrs), - m(TextFieldN, defaultDownloadPathAttrs), - env.platformId === 'linux' ? m(DropDownSelectorN, setDesktopIntegrationAttrs) : null, -- m(DropDownSelectorN, setAutoUpdateAttrs) -+ this._showAutoUpdateOption() ? m(DropDownSelectorN, setAutoUpdateAttrs) : null, - ]) - ] - } -@@ -190,6 +192,7 @@ export class DesktopSettingsViewer implements UpdatableSettingsViewer { - this._runAsTrayApp(desktopConfig.runAsTrayApp) - this._runOnStartup(desktopConfig.runOnStartup) - this._isIntegrated(desktopConfig.isIntegrated) -+ this._showAutoUpdateOption(desktopConfig.showAutoUpdateOption) - this._isAutoUpdateEnabled(desktopConfig.enableAutoUpdate) - m.redraw() - }) -diff --git a/test/client/desktop/ElectronUpdaterTest.js b/test/client/desktop/ElectronUpdaterTest.js -index d5b4194db..c686f1c39 100644 ---- a/test/client/desktop/ElectronUpdaterTest.js -+++ b/test/client/desktop/ElectronUpdaterTest.js -@@ -123,10 +123,13 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - const conf = { - removeListener: (key: string, cb: ()=>void) => n.spyify(conf), - on: (key: string) => n.spyify(conf), -+ setDesktopConfig: (key, value) => {}, - getDesktopConfig: (key: string) => { - switch (key) { - case 'enableAutoUpdate': - return true -+ case 'showAutoUpdateOption': -+ return true - default: - throw new Error(`unexpected getDesktopConfig key ${key}`) - } -@@ -170,6 +173,9 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - - upd.start() - -+ o(confMock.setDesktopConfig.callCount).equals(1) -+ o(confMock.setDesktopConfig.args).deepEquals(['showAutoUpdateOption', true]) -+ - // there is only one enableAutoUpdate listener - o(confMock.removeListener.callCount).equals(1) - o(confMock.removeListener.args[0]).equals('enableAutoUpdate') -@@ -278,6 +284,8 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - switch (key) { - case 'enableAutoUpdate': - return enabled -+ case 'showAutoUpdateOption': -+ return true - default: - throw new Error(`unexpected getDesktopConfig key ${key}`) - } -@@ -531,6 +539,8 @@ o.spec("ElectronUpdater Test", function (done, timeout) { - - upd.start() - -+ o(confMock.setDesktopConfig.callCount).equals(1) -+ o(confMock.setDesktopConfig.args).deepEquals(['showAutoUpdateOption', false]) - o(confMock.removeListener.callCount).equals(0) - } - ) -diff --git a/test/client/desktop/config/migrations/DesktopConfigMigratorTest.js b/test/client/desktop/config/migrations/DesktopConfigMigratorTest.js -index 47e3c943a..2f15ea616 100644 ---- a/test/client/desktop/config/migrations/DesktopConfigMigratorTest.js -+++ b/test/client/desktop/config/migrations/DesktopConfigMigratorTest.js -@@ -15,7 +15,8 @@ o.spec('desktop config migrator test', function () { - "defaultDownloadPath": null, - "enableAutoUpdate": true, - "runAsTrayApp": true, -- "desktopConfigVersion": 0 -+ "desktopConfigVersion": 1, -+ "showAutoUpdateOption": true, - } - - o(migrator("migrateClient", oldConfig, oldConfig)).deepEquals(requiredResult) -@@ -28,7 +29,8 @@ o.spec('desktop config migrator test', function () { - } - const requiredResult = { - "runAsTrayApp": true, -- "desktopConfigVersion": 0 -+ "desktopConfigVersion": 1, -+ "showAutoUpdateOption": true, - } - - o(migrator("migrateAdmin", oldConfig, oldConfig)).deepEquals(requiredResult) - -From 75330e12c0019db586c4cb91f3dbe0afa8a744b7 Mon Sep 17 00:00:00 2001 -From: nig <nig@tutao.de> -Date: Tue, 7 Apr 2020 10:32:03 +0200 -Subject: [PATCH 4/4] [desktop] define options object for desktopBuilder - ---- - buildSrc/DesktopBuilder.js | 58 ++++++++++++------ - buildSrc/electron-package-json-template.js | 4 +- - dist.js | 60 ++++++++++++++----- - make.js | 14 ++--- - src/desktop/ElectronUpdater.js | 2 + - .../migrations/DesktopConfigMigratorTest.js | 11 +++- - 6 files changed, 105 insertions(+), 44 deletions(-) - -diff --git a/buildSrc/DesktopBuilder.js b/buildSrc/DesktopBuilder.js -index 8449c5923..45fbaaa5f 100644 ---- a/buildSrc/DesktopBuilder.js -+++ b/buildSrc/DesktopBuilder.js -@@ -3,7 +3,17 @@ const babel = Promise.promisifyAll(require("babel-core")) - const fs = Promise.promisifyAll(require("fs-extra")) - const path = require("path") - --function build(dirname, version, targets, updateUrl, nameSuffix, notarize, outDir, unpacked) { -+function build(opts) { -+ let { -+ dirname, // directory this was called from -+ version, // application version that gets built -+ targets, // which desktop targets to build and how to package them -+ updateUrl, // where the client should pull its updates from, if any -+ nameSuffix, // suffix used to distinguish test-, prod- or snapshot builds on the same machine -+ notarize, // for the MacOs notarization feature -+ outDir, // where to copy the finished artifacts -+ unpacked // output desktop client without packing it into an installer -+ } = opts - const targetString = Object.keys(targets) - .filter(k => typeof targets[k] !== "undefined") - .join(" ") -@@ -17,15 +27,16 @@ function build(dirname, version, targets, updateUrl, nameSuffix, notarize, outDi - .map(fn => path.join(dirname, './src/translations', fn)) - - console.log("Updating electron-builder config...") -- const content = require('./electron-package-json-template')( -- nameSuffix, -- version, -- updateUrl, -- path.join(dirname, "/resources/desktop-icons/logo-solo-red.png"), -- nameSuffix !== '-snapshot' && updateUrl !== "", // don't sign if it's a test build or if we don't download updates -- notarize, -- unpacked -- ) -+ const content = require('./electron-package-json-template')({ -+ nameSuffix: nameSuffix, -+ version: version, -+ updateUrl: updateUrl, -+ iconPath: path.join(dirname, "/resources/desktop-icons/logo-solo-red.png"), -+ sign: nameSuffix !== '-snapshot' && updateUrl !== "", -+ nameSuffix: nameSuffix, -+ notarize: notarize, -+ unpacked: unpacked -+ }) - let writeConfig = fs.writeFileAsync("./build/dist/package.json", JSON.stringify(content), 'utf-8') - - //prepare files -@@ -53,17 +64,26 @@ function build(dirname, version, targets, updateUrl, nameSuffix, notarize, outDi - .then(() => { - const installerDir = path.join(distDir, 'installers') - console.log("Move artifacts to", outDir) -- const unpackedFilter = file => file.endsWith("-unpacked") || file === "mac" -- const packedFilter = file => file.startsWith(content.name) || file.endsWith('.yml') -+ const outFiles = fs.readdirSync(installerDir) -+ let filesToCopy -+ // the output of the builder is very inconsistently named and contains -+ // files that are irrelevant to us. these filters enable us to copy them -+ // without naming every possible file name explicitly -+ if (unpacked) { -+ // when the unpacked option is set, output is a directory for each platform, with -+ // the mac directory missing the "-unpacked" suffix. -+ filesToCopy = outFiles.filter(file => file.endsWith("-unpacked") || file === "mac") -+ } else { -+ // the installers start with the application name + suffix. the update manifests end in yml. -+ filesToCopy = outFiles.filter(file => file.startsWith(content.name) || file.endsWith('.yml')) -+ } - - return Promise.all( -- fs.readdirSync(installerDir) -- .filter(unpacked ? unpackedFilter : packedFilter) -- .map(file => fs.moveAsync( -- path.join(installerDir, file), -- path.join(outDir, file) -- ) -- ) -+ filesToCopy.map(file => fs.moveAsync( -+ path.join(installerDir, file), -+ path.join(outDir, file) -+ ) -+ ) - ) - }).then(() => Promise.all([ - fs.removeAsync(path.join(distDir, '/installers/')), -diff --git a/buildSrc/electron-package-json-template.js b/buildSrc/electron-package-json-template.js -index a24067fb3..5fc9e2706 100644 ---- a/buildSrc/electron-package-json-template.js -+++ b/buildSrc/electron-package-json-template.js -@@ -6,7 +6,9 @@ const pj = require('../package.json') - * 2. copied to app-desktop/build/dist from dist.js (DesktopBuilder) - */ - --module.exports = function (nameSuffix, version, updateUrl, iconPath, sign, notarize, unpacked) { -+module.exports = function (opts) { -+ const {nameSuffix, version, updateUrl, iconPath, sign, notarize, unpacked} = opts -+ - return { - "name": "tutanota-desktop" + nameSuffix, - "main": "./src/desktop/DesktopMain.js", -diff --git a/dist.js b/dist.js -index 2731f8bf9..c7dc6f993 100644 ---- a/dist.js -+++ b/dist.js -@@ -185,34 +185,66 @@ function buildWebapp() { - function buildDesktopClient() { - if (options.desktop) { - const desktopBuilder = require('./buildSrc/DesktopBuilder.js') -- if (options.stage === "release") { -- const updateUrl = options.customDesktopRelease -+ const desktopBaseOpts = { -+ dirname: __dirname, -+ version: version, -+ targets: options.desktop, -+ updateUrl: options.customDesktopRelease - ? "" -- : "https://mail.tutanota.com/desktop" -- const notarize = !!options.customDesktopRelease -+ : "https://mail.tutanota.com/desktop", -+ nameSuffix: "", -+ notarize: !!options.customDesktopRelease, -+ outDir: options.outDir, -+ unpacked: options.unpacked -+ } -+ if (options.stage === "release") { - const buildPromise = createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://mail.tutanota.com", version, "Desktop", true), bundles) -- .then(() => desktopBuilder.build(__dirname, version, options.desktop, updateUrl, "", notarize, options.outDir, options.unpacked)) -+ .then(() => desktopBuilder.build(desktopBaseOpts)) - if (!options.customDesktopRelease) { // don't build the test version for manual/custom builds -+ const desktopTestOpts = Object.assign({}, desktopBaseOpts, { -+ updateUrl: "https://test.tutanota.com", -+ nameSuffix: "-test", -+ notarize: true -+ }) - buildPromise.then(() => createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://test.tutanota.com", version, "Desktop", true), bundles)) -- .then(() => desktopBuilder.build(__dirname, version, options.desktop, "https://test.tutanota.com/desktop", "-test", /*notarize*/true, options.outDir, options.unpacked)) -+ .then(() => desktopBuilder.build(desktopTestOpts)) - } - return buildPromise - } else if (options.stage === "local") { -+ const desktopLocalOpts = Object.assign({}, desktopBaseOpts, { -+ version: `${new Date().getTime()}.0.0`, -+ updateUrl: "http://localhost:9000", -+ nameSuffix: "-snapshot", -+ notarize: false -+ }) - return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "http://localhost:9000", version, "Desktop", true), bundles) -- .then(() => desktopBuilder.build(__dirname, `${new Date().getTime()}.0.0`, -- options.desktop, "http://localhost:9000", "-snapshot", options.outDir, options.unpacked)) -+ .then(() => desktopBuilder.build(desktopLocalOpts)) - } else if (options.stage === "test") { -+ const desktopTestOpts = Object.assign({}, desktopBaseOpts, { -+ version: `${new Date().getTime()}.0.0`, -+ updateUrl: "https://test.tutanota.com/desktop", -+ nameSuffix: "-test", -+ notarize: false -+ }) - return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://test.tutanota.com", version, "Desktop", true), bundles) -- .then(() => desktopBuilder.build(__dirname, `${new Date().getTime()}.0.0`, -- options.desktop, "https://test.tutanota.com/desktop", "-test", options.outDir, options.unpacked)) -+ .then(() => desktopBuilder.build(desktopTestOpts)) - } else if (options.stage === "prod") { -+ const desktopProdOpts = Object.assign({}, desktopBaseOpts, { -+ version: `${new Date().getTime()}.0.0`, -+ updateUrl: "http://localhost:9000/desktop", -+ notarize: false -+ }) - return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), "https://mail.tutanota.com", version, "Desktop", true), bundles) -- .then(() => desktopBuilder.build(__dirname, `${new Date().getTime()}.0.0`, -- options.desktop, "http://localhost:9000/desktop", "", options.outDir, options.unpacked)) -+ .then(() => desktopBuilder.build(desktopProdOpts)) - } else { // stage = host -+ const desktopHostOpts = Object.assign({}, desktopBaseOpts, { -+ version: `${new Date().getTime()}.0.0`, -+ updateUrl: "http://localhost:9000/desktop-snapshot", -+ nameSuffix: "-snapshot", -+ notarize: false -+ }) - return createHtml(env.create(SystemConfig.distRuntimeConfig(bundles), options.host, version, "Desktop", true), bundles) -- .then(() => desktopBuilder.build(__dirname, `${new Date().getTime()}.0.0`, -- options.desktop, "http://localhost:9000/desktop-snapshot", "-snapshot", options.outDir, options.unpacked)) -+ .then(() => desktopBuilder.build(desktopHostOpts)) - } - } - } -diff --git a/make.js b/make.js -index 14ea97356..1530125fe 100644 ---- a/make.js -+++ b/make.js -@@ -87,13 +87,13 @@ function startDesktop() { - if (options.desktop) { - console.log("Trying to start desktop client...") - const version = require('./package.json').version -- const packageJSON = require('./buildSrc/electron-package-json-template.js')( -- "-debug", -- version, -- "http://localhost:9000", -- path.join(__dirname, "/resources/desktop-icons/logo-solo-red.png"), -- false -- ) -+ const packageJSON = require('./buildSrc/electron-package-json-template.js')({ -+ nameSuffix: "-debug", -+ version: version, -+ updateUrl: "http://localhost:9000", -+ iconPath: path.join(__dirname, "/resources/desktop-icons/logo-solo-red.png"), -+ sign: false -+ }) - const content = JSON.stringify(packageJSON) - return fs.writeFileAsync("./build/package.json", content, 'utf-8') - .then(() => { -diff --git a/src/desktop/ElectronUpdater.js b/src/desktop/ElectronUpdater.js -index e7e6009fd..efcdeef3c 100644 ---- a/src/desktop/ElectronUpdater.js -+++ b/src/desktop/ElectronUpdater.js -@@ -36,6 +36,8 @@ export class ElectronUpdater { - error: (m: string, ...args: any) => console.error.apply(console, ["autoUpdater error:\n", m].concat(args)), - } - autoUpdater.logger = null -+ // default behaviour is to just dl the update as soon as found, but we want to check the signature -+ // before doing telling the updater to get the file. - autoUpdater.autoDownload = false - autoUpdater.autoInstallOnAppQuit = false - autoUpdater.on('update-available', updateInfo => { -diff --git a/test/client/desktop/config/migrations/DesktopConfigMigratorTest.js b/test/client/desktop/config/migrations/DesktopConfigMigratorTest.js -index 2f15ea616..228808869 100644 ---- a/test/client/desktop/config/migrations/DesktopConfigMigratorTest.js -+++ b/test/client/desktop/config/migrations/DesktopConfigMigratorTest.js -@@ -7,9 +7,14 @@ o.spec('desktop config migrator test', function () { - o("migrations result in correct default config, client", function () { - const migrator = n.subject('../../src/desktop/config/migrations/DesktopConfigMigrator.js').default - const configPath = "../../../../../../buildSrc/electron-package-json-template.js" -- const oldConfig = require(configPath)( -- "", "0.0.0", "", "", "", false, false -- )["tutao-config"]["defaultDesktopConfig"] -+ const oldConfig = require(configPath)({ -+ nameSuffix: "", -+ version: "0.0.0", -+ updateUrl: "", -+ iconPath: "", -+ sign: false, -+ notarize: false -+ })["tutao-config"]["defaultDesktopConfig"] - const requiredResult = { - "heartbeatTimeoutInSeconds": 30, - "defaultDownloadPath": null, @@ -2,39 +2,42 @@ # Co-Maintainer: Aaron J. Graves <linux@ajgraves.com> # Contributor: ganthern <https://github.com/ganthern> pkgname=tutanota-desktop -pkgver=3.72.0 +pkgver=3.73.1 pkgrel=1 pkgdesc="Official Tutanota email client" arch=('x86_64') url="https://tutanota.com" license=('GPL3') depends=('nss' 'libxss' 'libxtst' 'libappindicator-gtk3' 'libnotify') -makedepends=('npm') +makedepends=('npm' 'nvm') source=("https://github.com/tutao/tutanota/archive/tutanota-release-$pkgver.tar.gz" - '1928.patch' "$pkgname" "$pkgname.desktop") -sha256sums=('2d2fad61b85fec6398a4efaaf5aa23be3049fe632439ebaf01604ecc21662136' - '614755f15fe792caf617829b19198d6a74b480436fea45568b315773c60a9ae6' +sha256sums=('4d49b222667da949be083fdebe8184b9f9d304cac0abc16a83fcab49e0edffca' '4f91e842bd92a3312943854383e4929f9baf6cb684a7027aa55edcce1bf4ca16' '1215678e2fc23cfbeb73063f68dc440891e5b2e10734fa7f402e06860c292e31') -prepare() { - cd "${pkgname%-*}-${pkgname%-*}-release-$pkgver" +build() { - # add builds w/o auto-updates and unpacked builds, close #1857 - patch -p1 -i "$srcdir/1928.patch" -} + # Use nodejs v10 until upstream fixes build with v14 + export npm_config_cache="$srcdir/npm-cache" + npm config delete prefix + source /usr/share/nvm/init-nvm.sh + local npm_prefix=$(npm config get prefix) + local nodeversion='10.20.1' + nvm install "$nodeversion" && nvm use "$nodeversion" -build() { cd "${pkgname%-*}-${pkgname%-*}-release-$pkgver" - npm install --cache "$srcdir/npm-cache" + npm install node dist -l --custom-desktop-release --unpacked + + # Restore node config from nvm + npm config set prefix "$npm_prefix" + nvm unalias default } package() { cd "${pkgname%-*}-${pkgname%-*}-release-$pkgver" - install -d "$pkgdir/opt/$pkgname" cp -r build/desktop/linux-unpacked/* \ "$pkgdir/opt/$pkgname" |