From 55c42d0dbbc94b0fd4dc677e835a6b284007ca74 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Thu, 13 Aug 2015 12:45:25 -0400 Subject: [PATCH 01/46] fix(windows) revive windows build, installer minor misconfigs that prevented installer from building --- package.json | 2 +- tasks/win32.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8cbd3e22143..3900303b9ae 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "browserify": "^10.2.4", "del": "^1.2.0", "electron-installer-dmg": "^0.1.0", - "electron-installer-squirrel-windows": "0.0.1", + "electron-installer-squirrel-windows": "^0.2.0", "electron-packager": "^5.0.0", "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", diff --git a/tasks/win32.js b/tasks/win32.js index ff876185ff2..93cd8b6601f 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -6,11 +6,11 @@ var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); var debug = require('debug')('scout:tasks:win32'); -var NAME = pkg.name; +var NAME = pkg.product_name; var APP_PATH = path.join('dist', NAME + '-win32-ia32'); var CONFIG = module.exports = { - name: NAME, + name: pkg.product_name, dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), appPath: APP_PATH, @@ -53,7 +53,7 @@ module.exports.installer = function(done) { packager(CONFIG, function(err) { if (err) return done(err); - var unpacked = path.resolve(__dirname, '..' + path.join(APP_PATH, 'resources', 'app')); + var unpacked = path.resolve(__dirname, path.join('..', APP_PATH, 'resources', 'app')); debug('Deleting `%s` so app is loaded from .asar', unpacked); del(unpacked, function() { createInstaller(CONFIG, function(err) { From 407c4989a26227037ba9c3e42fb252193c0a6142 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Fri, 14 Aug 2015 18:15:56 -0400 Subject: [PATCH 02/46] fix(windows) tweaks --- tasks/win32.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasks/win32.js b/tasks/win32.js index 93cd8b6601f..66c2def76da 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -23,6 +23,7 @@ var CONFIG = module.exports = { icon: path.resolve(__dirname, '../images/win32/scout.icon'), overwrite: true, asar: true, + prune: true, 'version-string': { CompanyName: 'MongoDB Inc.', LegalCopyright: '2015 MongoDB Inc.', @@ -53,7 +54,7 @@ module.exports.installer = function(done) { packager(CONFIG, function(err) { if (err) return done(err); - var unpacked = path.resolve(__dirname, path.join('..', APP_PATH, 'resources', 'app')); + var unpacked = path.resolve(CONFIG.BUILD); debug('Deleting `%s` so app is loaded from .asar', unpacked); del(unpacked, function() { createInstaller(CONFIG, function(err) { From 2849ac584490a51a6c99be9e1f6d07e0820ec120 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Thu, 13 Aug 2015 12:45:25 -0400 Subject: [PATCH 03/46] fix(windows) revive windows build, installer minor misconfigs that prevented installer from building --- package.json | 2 +- tasks/win32.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 481a3830cc2..41ab0544714 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "browserify": "^10.2.4", "del": "^1.2.0", "electron-installer-dmg": "^0.1.0", - "electron-installer-squirrel-windows": "0.0.1", + "electron-installer-squirrel-windows": "^0.2.0", "electron-packager": "^5.0.0", "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", diff --git a/tasks/win32.js b/tasks/win32.js index f29354cebc5..bae2b18261a 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -22,6 +22,7 @@ var CONFIG = module.exports = { icon: path.resolve(__dirname, '../images/win32/scout.icon'), overwrite: true, asar: true, + prune: true, 'version-string': { CompanyName: 'MongoDB Inc.', LegalCopyright: '2015 MongoDB Inc.', @@ -51,7 +52,7 @@ module.exports.installer = function(done) { packager(CONFIG, function(err) { if (err) return done(err); - var unpacked = path.resolve(__dirname, '..' + path.join(APP_PATH, 'resources', 'app')); + var unpacked = path.resolve(CONFIG.BUILD); debug('Deleting `%s` so app is loaded from .asar', unpacked); del(unpacked, function() { createInstaller(CONFIG, function(err) { From 0f4e9e40d9e72c988a4aa37a35e40f81c07434e5 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Mon, 31 Aug 2015 09:39:09 -0400 Subject: [PATCH 04/46] fix(windows) add/remove shortcuts --- main.js | 8 +++++--- package.json | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/main.js b/main.js index c9c99b50db9..f39ed13dcba 100644 --- a/main.js +++ b/main.js @@ -5,7 +5,9 @@ if (process.env.NODE_ENV === 'development') { process.env.DEBUG = 'mon*,sco*'; } -// @todo (imlucas): Use subprocess instead? -require('scout-server').start(); +if (!require('electron-squirrel-startup')) { + // @todo (imlucas): Use subprocess instead? + require('scout-server').start(); -require('./src/electron'); + require('./src/electron'); +} diff --git a/package.json b/package.json index 41ab0544714..b23279375ab 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "d3": "^3.5.5", "debug": "^2.2.0", "domready": "^1.0.8", + "electron-squirrel-startup": "^0.1.2", "event-stream": "^3.3.1", "font-awesome": "https://github.com/FortAwesome/Font-Awesome/archive/v4.3.0.tar.gz", "jade": "^1.11.0", From d15f65e5116607a16346c36fe92c0467309ee32e Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Mon, 31 Aug 2015 15:36:31 -0400 Subject: [PATCH 05/46] fix(windows) installer_filename path --- .evergreen.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.evergreen.yml b/.evergreen.yml index dc3c9d65d72..bcbbc0486fc 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -124,7 +124,7 @@ buildvariants: add_environment: "APPDATA=C:\\Program Files (x86)\\nodejs\\node_modules" add_path: "/cygdrive/c/Program Files (x86)/nodejs" installer_content_type: "application/octet-stream" - installer_filename: "MongoDB Scout.exe" + installer_filename: "MongoDBScoutSetup.exe" exe: ".exe" num_cores: $(grep -c ^processor /proc/cpuinfo) tasks: From a6556af2f1b5a117fd845106d2837a1af63812c6 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Mon, 31 Aug 2015 19:04:11 -0400 Subject: [PATCH 06/46] fix(windows) pin electron-squirrel-startup 0.1.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b23279375ab..fe98e2d7727 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "d3": "^3.5.5", "debug": "^2.2.0", "domready": "^1.0.8", - "electron-squirrel-startup": "^0.1.2", + "electron-squirrel-startup": "0.1.2", "event-stream": "^3.3.1", "font-awesome": "https://github.com/FortAwesome/Font-Awesome/archive/v4.3.0.tar.gz", "jade": "^1.11.0", From 0e8c558f6b65f55e337504fcf05bc8f617b246e3 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Mon, 31 Aug 2015 21:30:21 -0400 Subject: [PATCH 07/46] fix(windows) NOSPACE_PRODUCT_NAME --- tasks/win32.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tasks/win32.js b/tasks/win32.js index bae2b18261a..576cf62a440 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -6,16 +6,18 @@ var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); var debug = require('debug')('scout:tasks:win32'); -var APP_PATH = path.resolve(__dirname, '../dist/' + pkg.product_name + '-win32-ia32'); +var NOSPACE_PRODUCT_NAME = pkg.product_name.replace(' ', '-'); + +var APP_PATH = path.resolve(__dirname, '../dist/' + NOSPACE_PRODUCT_NAME + '-win32-ia32'); var CONFIG = module.exports = { - name: pkg.product_name, + name: NOSPACE_PRODUCT_NAME, dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), appPath: APP_PATH, path: APP_PATH, BUILD: path.join(APP_PATH, 'resources', 'app'), - ELECTRON: path.join(APP_PATH, pkg.product_name + '.exe'), + ELECTRON: path.join(APP_PATH, NOSPACE_PRODUCT_NAME + '.exe'), platform: 'win32', arch: 'ia32', version: pkg.electron_version, From dc328e97473c4e721635d9954796f5139747140f Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Mon, 31 Aug 2015 22:52:43 -0400 Subject: [PATCH 08/46] Revert "fix(windows) NOSPACE_PRODUCT_NAME" This reverts commit 0e8c558f6b65f55e337504fcf05bc8f617b246e3. --- tasks/win32.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tasks/win32.js b/tasks/win32.js index 576cf62a440..bae2b18261a 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -6,18 +6,16 @@ var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); var debug = require('debug')('scout:tasks:win32'); -var NOSPACE_PRODUCT_NAME = pkg.product_name.replace(' ', '-'); - -var APP_PATH = path.resolve(__dirname, '../dist/' + NOSPACE_PRODUCT_NAME + '-win32-ia32'); +var APP_PATH = path.resolve(__dirname, '../dist/' + pkg.product_name + '-win32-ia32'); var CONFIG = module.exports = { - name: NOSPACE_PRODUCT_NAME, + name: pkg.product_name, dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), appPath: APP_PATH, path: APP_PATH, BUILD: path.join(APP_PATH, 'resources', 'app'), - ELECTRON: path.join(APP_PATH, NOSPACE_PRODUCT_NAME + '.exe'), + ELECTRON: path.join(APP_PATH, pkg.product_name + '.exe'), platform: 'win32', arch: 'ia32', version: pkg.electron_version, From 8a5c58aae4a1fa2b0ede416593dbceec34ba0233 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Mon, 31 Aug 2015 22:53:08 -0400 Subject: [PATCH 09/46] Revert "fix(windows) pin electron-squirrel-startup 0.1.2" This reverts commit a6556af2f1b5a117fd845106d2837a1af63812c6. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fe98e2d7727..b23279375ab 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "d3": "^3.5.5", "debug": "^2.2.0", "domready": "^1.0.8", - "electron-squirrel-startup": "0.1.2", + "electron-squirrel-startup": "^0.1.2", "event-stream": "^3.3.1", "font-awesome": "https://github.com/FortAwesome/Font-Awesome/archive/v4.3.0.tar.gz", "jade": "^1.11.0", From 046f342644088e19176f9ffeb2d34de02f1dd12c Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Mon, 31 Aug 2015 21:30:21 -0400 Subject: [PATCH 10/46] fix(windows) NOSPACE_PRODUCT_NAME --- tasks/win32.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tasks/win32.js b/tasks/win32.js index bae2b18261a..0aacce3a95b 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -6,16 +6,19 @@ var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); var debug = require('debug')('scout:tasks:win32'); -var APP_PATH = path.resolve(__dirname, '../dist/' + pkg.product_name + '-win32-ia32'); +var NOSPACE_PRODUCT_NAME = pkg.product_name.replace(' ', ''); + +var APP_PATH = path.resolve(__dirname, '../dist/' + NOSPACE_PRODUCT_NAME + '-win32-ia32'); var CONFIG = module.exports = { - name: pkg.product_name, + name: NOSPACE_PRODUCT_NAME, dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), appPath: APP_PATH, path: APP_PATH, BUILD: path.join(APP_PATH, 'resources', 'app'), - ELECTRON: path.join(APP_PATH, pkg.product_name + '.exe'), + ELECTRON: path.join(APP_PATH, NOSPACE_PRODUCT_NAME + '.exe'), + exe: NOSPACE_PRODUCT_NAME + '.exe', // for installer platform: 'win32', arch: 'ia32', version: pkg.electron_version, From c18feae505181c7b32e13f954fe07b77b3559e56 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Tue, 1 Sep 2015 00:18:29 -0700 Subject: [PATCH 11/46] fix(windows) pin electron-installer-squirrel-windows to reset-munged-exe branch --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fe98e2d7727..911b3536849 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "browserify": "^10.2.4", "del": "^1.2.0", "electron-installer-dmg": "^0.1.0", - "electron-installer-squirrel-windows": "^0.2.0", + "electron-installer-squirrel-windows": "mongodb-js/electron-installer-squirrel-windows#reset-munged-exe", "electron-packager": "^5.0.0", "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", From ea4e6c9caecc51843329839f49fb189cb174fe4d Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Tue, 1 Sep 2015 00:55:00 -0700 Subject: [PATCH 12/46] fix(windows) make asar toggleable for win32 --- tasks/win32.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/tasks/win32.js b/tasks/win32.js index 0aacce3a95b..d5f67e58da7 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -4,6 +4,9 @@ var fs = require('fs'); var del = require('del'); var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); +var series = require('run-series'); +var _ = require('lodash'); + var debug = require('debug')('scout:tasks:win32'); var NOSPACE_PRODUCT_NAME = pkg.product_name.replace(' ', ''); @@ -18,7 +21,7 @@ var CONFIG = module.exports = { path: APP_PATH, BUILD: path.join(APP_PATH, 'resources', 'app'), ELECTRON: path.join(APP_PATH, NOSPACE_PRODUCT_NAME + '.exe'), - exe: NOSPACE_PRODUCT_NAME + '.exe', // for installer + exe: NOSPACE_PRODUCT_NAME + '.exe', // for installer platform: 'win32', arch: 'ia32', version: pkg.electron_version, @@ -52,16 +55,20 @@ module.exports.build = function(done) { module.exports.installer = function(done) { debug('Packaging into `%s`', path.join(APP_PATH, 'resources', 'app.asar')); - packager(CONFIG, function(err) { - if (err) return done(err); + var tasks = [ + _.partial(packager, CONFIG) + ]; + + if (CONFIG.asar) { var unpacked = path.resolve(CONFIG.BUILD); debug('Deleting `%s` so app is loaded from .asar', unpacked); - del(unpacked, function() { - createInstaller(CONFIG, function(err) { - if (err) return done(err); - done(); - }); - }); + tasks.push(_.partial(del, unpacked)); + } + + tasks.push(_.partial(createInstaller, CONFIG)); + + series(tasks, function(err) { + if (err) return done(err); }); }; From 9fca157f09ddbdc68722a9258bcc810b3b156900 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Tue, 1 Sep 2015 12:47:32 -0400 Subject: [PATCH 13/46] bump electron-installer-squirrel-windows and refactor so windows installer works. --- package.json | 2 +- tasks/win32.js | 75 +------------------------------------------------- 2 files changed, 2 insertions(+), 75 deletions(-) diff --git a/package.json b/package.json index 911b3536849..e80ae06099d 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "browserify": "^10.2.4", "del": "^1.2.0", "electron-installer-dmg": "^0.1.0", - "electron-installer-squirrel-windows": "mongodb-js/electron-installer-squirrel-windows#reset-munged-exe", + "electron-installer-squirrel-windows": "^0.4.0", "electron-packager": "^5.0.0", "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", diff --git a/tasks/win32.js b/tasks/win32.js index d5f67e58da7..5cc74ba6629 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -1,74 +1 @@ -var path = require('path'); -var pkg = require(path.resolve(__dirname, '../package.json')); -var fs = require('fs'); -var del = require('del'); -var packager = require('electron-packager'); -var createInstaller = require('electron-installer-squirrel-windows'); -var series = require('run-series'); -var _ = require('lodash'); - -var debug = require('debug')('scout:tasks:win32'); - -var NOSPACE_PRODUCT_NAME = pkg.product_name.replace(' ', ''); - -var APP_PATH = path.resolve(__dirname, '../dist/' + NOSPACE_PRODUCT_NAME + '-win32-ia32'); - -var CONFIG = module.exports = { - name: NOSPACE_PRODUCT_NAME, - dir: path.resolve(__dirname, '../build'), - out: path.resolve(__dirname, '../dist'), - appPath: APP_PATH, - path: APP_PATH, - BUILD: path.join(APP_PATH, 'resources', 'app'), - ELECTRON: path.join(APP_PATH, NOSPACE_PRODUCT_NAME + '.exe'), - exe: NOSPACE_PRODUCT_NAME + '.exe', // for installer - platform: 'win32', - arch: 'ia32', - version: pkg.electron_version, - icon: path.resolve(__dirname, '../images/win32/scout.icon'), - overwrite: true, - asar: true, - prune: true, - 'version-string': { - CompanyName: 'MongoDB Inc.', - LegalCopyright: '2015 MongoDB Inc.', - FileDescription: 'The MongoDB GUI.', - FileVersion: pkg.version, - ProductVersion: pkg.version, - ProductName: pkg.product_name, - InternalName: pkg.name - } -}; - -debug('packager config: ', JSON.stringify(CONFIG, null, 2)); - -module.exports.build = function(done) { - fs.exists(APP_PATH, function(exists) { - if (exists) { - debug('.app already exists. skipping packager run.'); - return done(); - } - debug('running packager to create electron binaries...'); - packager(CONFIG, done); - }); -}; - -module.exports.installer = function(done) { - debug('Packaging into `%s`', path.join(APP_PATH, 'resources', 'app.asar')); - - var tasks = [ - _.partial(packager, CONFIG) - ]; - - if (CONFIG.asar) { - var unpacked = path.resolve(CONFIG.BUILD); - debug('Deleting `%s` so app is loaded from .asar', unpacked); - tasks.push(_.partial(del, unpacked)); - } - - tasks.push(_.partial(createInstaller, CONFIG)); - - series(tasks, function(err) { - if (err) return done(err); - }); -}; +var path = require('path'); var pkg = require(path.resolve(__dirname, '../package.json')); var fs = require('fs'); var del = require('del'); var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); var debug = require('debug')('scout:tasks:win32'); var APP_PATH = path.resolve(__dirname, '../dist/MongoDBScout-win32-ia32'); module.exports.ELECTRON = path.join(APP_PATH, 'MongoDBScout.exe'); module.exports.BUILD = path.join(APP_PATH, 'resources', 'app'); var PACKAGER_CONFIG = { name: 'MongoDBScout', dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), path: APP_PATH, platform: 'win32', arch: 'ia32', version: pkg.electron_version, icon: path.resolve(__dirname, '../images/win32/scout.icon'), overwrite: true, asar: true, prune: true, 'version-string': { CompanyName: 'MongoDB Inc.', LegalCopyright: '2015 MongoDB Inc.', FileDescription: 'The MongoDB GUI.', FileVersion: pkg.version, ProductVersion: pkg.version, ProductName: pkg.product_name, InternalName: pkg.name } }; var INSTALLER_CONFIG = { name: 'MongoDBScout', path: APP_PATH, out: path.resolve(__dirname, '../dist'), overwrite: true }; debug('packager config: ', JSON.stringify(PACKAGER_CONFIG, null, 2)); debug('installer config: ', JSON.stringify(INSTALLER_CONFIG, null, 2)); module.exports.build = function(done) { fs.exists(APP_PATH, function(exists) { if (exists) { debug('.app already exists. skipping packager run.'); return done(); } debug('running packager to create electron binaries...'); packager(PACKAGER_CONFIG, done); }); }; module.exports.installer = function(done) { debug('Creating installer...'); debug('Packaging into `%s`...', path.join(APP_PATH, 'resources', 'app.asar')); packager(PACKAGER_CONFIG, function(err) { if (err) return done(err); var unpacked = module.exports.BUILD; debug('Deleting `%s` so app is loaded from .asar', unpacked); del(unpacked, function() { debug('Running electron-installer-squirrel-windows...'); createInstaller(INSTALLER_CONFIG, function(err) { if (err) return done(err); done(); }); }); }); }; \ No newline at end of file From 4a8177d5ed590d81a6c887fb66de0319686e1ced Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Tue, 1 Sep 2015 12:56:37 -0400 Subject: [PATCH 14/46] Revert "bump electron-installer-squirrel-windows and refactor so windows installer works." This reverts commit 9fca157f09ddbdc68722a9258bcc810b3b156900. --- package.json | 2 +- tasks/win32.js | 75 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e80ae06099d..911b3536849 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "browserify": "^10.2.4", "del": "^1.2.0", "electron-installer-dmg": "^0.1.0", - "electron-installer-squirrel-windows": "^0.4.0", + "electron-installer-squirrel-windows": "mongodb-js/electron-installer-squirrel-windows#reset-munged-exe", "electron-packager": "^5.0.0", "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", diff --git a/tasks/win32.js b/tasks/win32.js index 5cc74ba6629..d5f67e58da7 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -1 +1,74 @@ -var path = require('path'); var pkg = require(path.resolve(__dirname, '../package.json')); var fs = require('fs'); var del = require('del'); var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); var debug = require('debug')('scout:tasks:win32'); var APP_PATH = path.resolve(__dirname, '../dist/MongoDBScout-win32-ia32'); module.exports.ELECTRON = path.join(APP_PATH, 'MongoDBScout.exe'); module.exports.BUILD = path.join(APP_PATH, 'resources', 'app'); var PACKAGER_CONFIG = { name: 'MongoDBScout', dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), path: APP_PATH, platform: 'win32', arch: 'ia32', version: pkg.electron_version, icon: path.resolve(__dirname, '../images/win32/scout.icon'), overwrite: true, asar: true, prune: true, 'version-string': { CompanyName: 'MongoDB Inc.', LegalCopyright: '2015 MongoDB Inc.', FileDescription: 'The MongoDB GUI.', FileVersion: pkg.version, ProductVersion: pkg.version, ProductName: pkg.product_name, InternalName: pkg.name } }; var INSTALLER_CONFIG = { name: 'MongoDBScout', path: APP_PATH, out: path.resolve(__dirname, '../dist'), overwrite: true }; debug('packager config: ', JSON.stringify(PACKAGER_CONFIG, null, 2)); debug('installer config: ', JSON.stringify(INSTALLER_CONFIG, null, 2)); module.exports.build = function(done) { fs.exists(APP_PATH, function(exists) { if (exists) { debug('.app already exists. skipping packager run.'); return done(); } debug('running packager to create electron binaries...'); packager(PACKAGER_CONFIG, done); }); }; module.exports.installer = function(done) { debug('Creating installer...'); debug('Packaging into `%s`...', path.join(APP_PATH, 'resources', 'app.asar')); packager(PACKAGER_CONFIG, function(err) { if (err) return done(err); var unpacked = module.exports.BUILD; debug('Deleting `%s` so app is loaded from .asar', unpacked); del(unpacked, function() { debug('Running electron-installer-squirrel-windows...'); createInstaller(INSTALLER_CONFIG, function(err) { if (err) return done(err); done(); }); }); }); }; \ No newline at end of file +var path = require('path'); +var pkg = require(path.resolve(__dirname, '../package.json')); +var fs = require('fs'); +var del = require('del'); +var packager = require('electron-packager'); +var createInstaller = require('electron-installer-squirrel-windows'); +var series = require('run-series'); +var _ = require('lodash'); + +var debug = require('debug')('scout:tasks:win32'); + +var NOSPACE_PRODUCT_NAME = pkg.product_name.replace(' ', ''); + +var APP_PATH = path.resolve(__dirname, '../dist/' + NOSPACE_PRODUCT_NAME + '-win32-ia32'); + +var CONFIG = module.exports = { + name: NOSPACE_PRODUCT_NAME, + dir: path.resolve(__dirname, '../build'), + out: path.resolve(__dirname, '../dist'), + appPath: APP_PATH, + path: APP_PATH, + BUILD: path.join(APP_PATH, 'resources', 'app'), + ELECTRON: path.join(APP_PATH, NOSPACE_PRODUCT_NAME + '.exe'), + exe: NOSPACE_PRODUCT_NAME + '.exe', // for installer + platform: 'win32', + arch: 'ia32', + version: pkg.electron_version, + icon: path.resolve(__dirname, '../images/win32/scout.icon'), + overwrite: true, + asar: true, + prune: true, + 'version-string': { + CompanyName: 'MongoDB Inc.', + LegalCopyright: '2015 MongoDB Inc.', + FileDescription: 'The MongoDB GUI.', + FileVersion: pkg.version, + ProductVersion: pkg.version, + ProductName: pkg.product_name, + InternalName: pkg.name + } +}; + +debug('packager config: ', JSON.stringify(CONFIG, null, 2)); + +module.exports.build = function(done) { + fs.exists(APP_PATH, function(exists) { + if (exists) { + debug('.app already exists. skipping packager run.'); + return done(); + } + debug('running packager to create electron binaries...'); + packager(CONFIG, done); + }); +}; + +module.exports.installer = function(done) { + debug('Packaging into `%s`', path.join(APP_PATH, 'resources', 'app.asar')); + + var tasks = [ + _.partial(packager, CONFIG) + ]; + + if (CONFIG.asar) { + var unpacked = path.resolve(CONFIG.BUILD); + debug('Deleting `%s` so app is loaded from .asar', unpacked); + tasks.push(_.partial(del, unpacked)); + } + + tasks.push(_.partial(createInstaller, CONFIG)); + + series(tasks, function(err) { + if (err) return done(err); + }); +}; From 17445bcc9831ffbc54971fc65ea4fea7c350799a Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Tue, 1 Sep 2015 13:02:16 -0400 Subject: [PATCH 15/46] new rev of electron-installer-squirrel-windows to fix issues with whitespace. --- package.json | 2 +- tasks/win32.js | 40 +++++++++++++++++++--------------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 911b3536849..e80ae06099d 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "browserify": "^10.2.4", "del": "^1.2.0", "electron-installer-dmg": "^0.1.0", - "electron-installer-squirrel-windows": "mongodb-js/electron-installer-squirrel-windows#reset-munged-exe", + "electron-installer-squirrel-windows": "^0.4.0", "electron-packager": "^5.0.0", "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", diff --git a/tasks/win32.js b/tasks/win32.js index d5f67e58da7..b5c3ffb19a6 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -6,22 +6,17 @@ var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); var series = require('run-series'); var _ = require('lodash'); - var debug = require('debug')('scout:tasks:win32'); -var NOSPACE_PRODUCT_NAME = pkg.product_name.replace(' ', ''); - -var APP_PATH = path.resolve(__dirname, '../dist/' + NOSPACE_PRODUCT_NAME + '-win32-ia32'); +var APP_PATH = path.resolve(__dirname, '../dist/MongoDBScout-win32-ia32'); +module.exports.BUILD = path.join(APP_PATH, 'resources', 'app'); +module.exports.ELECTRON = path.join(APP_PATH, 'MongoDBScout.exe'); -var CONFIG = module.exports = { - name: NOSPACE_PRODUCT_NAME, +var PACKAGER_CONFIG = { + name: 'MongoDBScout', dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), - appPath: APP_PATH, path: APP_PATH, - BUILD: path.join(APP_PATH, 'resources', 'app'), - ELECTRON: path.join(APP_PATH, NOSPACE_PRODUCT_NAME + '.exe'), - exe: NOSPACE_PRODUCT_NAME + '.exe', // for installer platform: 'win32', arch: 'ia32', version: pkg.electron_version, @@ -39,8 +34,15 @@ var CONFIG = module.exports = { InternalName: pkg.name } }; +var INSTALLER_CONFIG = { + name: 'MongoDBScout', + path: APP_PATH, + out: path.resolve(__dirname, '../dist'), + overwrite: true +}; -debug('packager config: ', JSON.stringify(CONFIG, null, 2)); +debug('packager config: ', JSON.stringify(PACKAGER_CONFIG, null, 2)); +debug('installer config: ', JSON.stringify(INSTALLER_CONFIG, null, 2)); module.exports.build = function(done) { fs.exists(APP_PATH, function(exists) { @@ -49,7 +51,7 @@ module.exports.build = function(done) { return done(); } debug('running packager to create electron binaries...'); - packager(CONFIG, done); + packager(INSTALLER_CONFIG, done); }); }; @@ -57,18 +59,14 @@ module.exports.installer = function(done) { debug('Packaging into `%s`', path.join(APP_PATH, 'resources', 'app.asar')); var tasks = [ - _.partial(packager, CONFIG) + _.partial(packager, PACKAGER_CONFIG), + _.partial(createInstaller, INSTALLER_CONFIG), + _.partial(del, module.exports.BUILD) ]; - if (CONFIG.asar) { - var unpacked = path.resolve(CONFIG.BUILD); - debug('Deleting `%s` so app is loaded from .asar', unpacked); - tasks.push(_.partial(del, unpacked)); - } - - tasks.push(_.partial(createInstaller, CONFIG)); - series(tasks, function(err) { if (err) return done(err); + console.log('Installer created!'); + done(); }); }; From b3176bbe3ce62e9c9b3e56718b25fe1ae6e3998a Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Tue, 1 Sep 2015 13:16:08 -0400 Subject: [PATCH 16/46] fix typo --- tasks/win32.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/win32.js b/tasks/win32.js index b5c3ffb19a6..1890ce6af8a 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -51,7 +51,7 @@ module.exports.build = function(done) { return done(); } debug('running packager to create electron binaries...'); - packager(INSTALLER_CONFIG, done); + packager(PACKAGER_CONFIG, done); }); }; From 3f61ec77a27ad280e386d7650f8c480123ada8be Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Tue, 1 Sep 2015 19:46:00 -0400 Subject: [PATCH 17/46] Bump electron to 0.31.1 and refactor a bit to make windows work. --- main.js | 11 +-------- package.json | 2 +- src/electron/auto-updater.js | 10 ++++++--- src/electron/index.js | 43 +++++++++++++++++++++++------------- tasks/win32.js | 3 +-- 5 files changed, 38 insertions(+), 31 deletions(-) diff --git a/main.js b/main.js index f39ed13dcba..27f0d2c78ad 100644 --- a/main.js +++ b/main.js @@ -1,13 +1,4 @@ /** * The main entrpoint Electron will execute. */ -if (process.env.NODE_ENV === 'development') { - process.env.DEBUG = 'mon*,sco*'; -} - -if (!require('electron-squirrel-startup')) { - // @todo (imlucas): Use subprocess instead? - require('scout-server').start(); - - require('./src/electron'); -} +require('./src/electron'); diff --git a/package.json b/package.json index db5329ff721..7fb7a856996 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "The MongoDB GUI.", "version": "0.3.0", "main": "main.js", - "electron_version": "0.30.5", + "electron_version": "0.31.1", "product_name": "MongoDB Scout", "authors": "MongoDB Inc.", "check": { diff --git a/src/electron/auto-updater.js b/src/electron/auto-updater.js index e57822f0ff0..f7e838a5fa9 100644 --- a/src/electron/auto-updater.js +++ b/src/electron/auto-updater.js @@ -1,6 +1,7 @@ var app = require('app'); var updater = module.exports = require('auto-updater'); var debug = require('debug')('scout-electron:auto-updater'); + var FEED_URL = 'http://squirrel.mongodb.parts/scout/releases/latest?version=' + app.getVersion(); debug('Using feed url', FEED_URL); @@ -25,9 +26,12 @@ updater.on('update-downloaded', function() { debug('Update downloaded', arguments); }); -updater.setFeedUrl(FEED_URL); - -app.on('ready', function() { +app.on('check for updates', function(){ debug('checking for updates...'); updater.checkForUpdates(); }); + +app.on('ready', function() { + updater.setFeedUrl(FEED_URL); + app.emit('check for updates'); +}); diff --git a/src/electron/index.js b/src/electron/index.js index 586c4fbda28..fa5dd508f08 100644 --- a/src/electron/index.js +++ b/src/electron/index.js @@ -1,29 +1,42 @@ if (process.env.NODE_ENV === 'development') { - require('./livereload'); + process.env.DEBUG = 'mon*,sco*'; +} +if(require('electron-squirrel-startup')){ + console.log('Squirrel.Windows event handled.'); + return; } - var app = require('app'); var debug = require('debug')('scout-electron'); -var mongo = require('./mongo'); app.on('window-all-closed', function() { debug('All windows closed. Quitting app.'); app.quit(); }); -mongo.start(function() { - debug('mongo started!'); -}); +app.on('ready', function(){ + if (process.env.NODE_ENV === 'development') { + require('./livereload'); + } -app.on('before-quit', function() { - mongo.stop(function() { - debug('mongo stopped'); + // @todo (imlucas): Use subprocess instead? + process.nextTick(function(){ + console.log('requiring scout-server...'); + var server = require('scout-server'); + process.nextTick(function(){ + console.log('starting scout-server...'); + server.start(); + }); }); }); -module.exports = { - autoupdater: require('./auto-updater'), - crashreporter: require('./crash-reporter'), - windows: require('./window-manager'), - menu: require('./menu') -}; +debug('requiring auto-updater...'); +require('./auto-updater'); + +debug('requiring crash-reporter...'); +require('./crash-reporter'); + +debug('requiring window-manager...'); +require('./window-manager'); + +debug('requiring menu...'); +require('./menu'); diff --git a/tasks/win32.js b/tasks/win32.js index b5c3ffb19a6..017f9968d7a 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -16,7 +16,6 @@ var PACKAGER_CONFIG = { name: 'MongoDBScout', dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), - path: APP_PATH, platform: 'win32', arch: 'ia32', version: pkg.electron_version, @@ -51,7 +50,7 @@ module.exports.build = function(done) { return done(); } debug('running packager to create electron binaries...'); - packager(INSTALLER_CONFIG, done); + packager(PACKAGER_CONFIG, done); }); }; From dae3dd22c1816922573f4ca3bea21d296bffaac2 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Wed, 2 Sep 2015 14:06:40 -0400 Subject: [PATCH 18/46] Trying to install npm@3 on build machines for more reliability --- .evergreen.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.evergreen.yml b/.evergreen.yml index bcbbc0486fc..b983f70a14b 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -30,8 +30,15 @@ functions: set -o verbose export PATH="$PATH:${add_path|}" test -n "${add_environment|}" && export "${add_environment|}" + # Install npm 3 beta + npm install -g npm@3 + # Fix $PATH on Windows so the version of npm we just + # installed is used, instead of what's already installed. + export PATH="`npm -g bin`:$PATH" ${node|node} --version + which ${node|node} ${npm|npm} --version + which ${npm|npm} ${npm|npm} install "npm test" : - command: shell.exec From 98c1eee9b4619a0dc0365668c09e8a1e1b9afb52 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Tue, 1 Sep 2015 19:48:57 -0400 Subject: [PATCH 19/46] npm depdupe when building release so asar doesnt freak --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index 04c3585b335..e602fc1496c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -158,7 +158,7 @@ gulp.task('dev:npm-install', ['copy:electron'], shell.task('npm install', { cwd: 'build/' })); -gulp.task('release:npm-install', ['copy:electron'], shell.task('npm install --production', { +gulp.task('release:npm-install', ['copy:electron'], shell.task('npm install --production && npm dedupe', { cwd: 'build/' })); From f7279409f504c5a1969b3a25856d1159b9a4f0a1 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Wed, 2 Sep 2015 11:10:10 -0400 Subject: [PATCH 20/46] Roll electron back to 0.30.5 Fixes weird serialization bug spotted by @kangas --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7fb7a856996..db5329ff721 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "The MongoDB GUI.", "version": "0.3.0", "main": "main.js", - "electron_version": "0.31.1", + "electron_version": "0.30.5", "product_name": "MongoDB Scout", "authors": "MongoDB Inc.", "check": { From b81a03319c3c6a69225af8f39ad45a7abf46f484 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Wed, 2 Sep 2015 14:31:58 -0400 Subject: [PATCH 21/46] Don't run npm dedupe to test npm@3 fix --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index e602fc1496c..04c3585b335 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -158,7 +158,7 @@ gulp.task('dev:npm-install', ['copy:electron'], shell.task('npm install', { cwd: 'build/' })); -gulp.task('release:npm-install', ['copy:electron'], shell.task('npm install --production && npm dedupe', { +gulp.task('release:npm-install', ['copy:electron'], shell.task('npm install --production', { cwd: 'build/' })); From 383e492ed0968ec4f609237c66cae88dc4046347 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Wed, 2 Sep 2015 16:52:48 -0400 Subject: [PATCH 22/46] Start scout-server as a subproc. --- src/electron/index.js | 16 ++++------ src/electron/scout-server-ctl.js | 53 ++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 src/electron/scout-server-ctl.js diff --git a/src/electron/index.js b/src/electron/index.js index fa5dd508f08..9ae0eaaffdb 100644 --- a/src/electron/index.js +++ b/src/electron/index.js @@ -2,9 +2,9 @@ if (process.env.NODE_ENV === 'development') { process.env.DEBUG = 'mon*,sco*'; } if(require('electron-squirrel-startup')){ - console.log('Squirrel.Windows event handled.'); - return; + return console.log('Squirrel.Windows event handled.'); } +var serverctl = require('./scout-server-ctl'); var app = require('app'); var debug = require('debug')('scout-electron'); @@ -14,17 +14,13 @@ app.on('window-all-closed', function() { }); app.on('ready', function(){ - if (process.env.NODE_ENV === 'development') { - require('./livereload'); - } - - // @todo (imlucas): Use subprocess instead? process.nextTick(function(){ - console.log('requiring scout-server...'); - var server = require('scout-server'); process.nextTick(function(){ console.log('starting scout-server...'); - server.start(); + serverctl.start(function(err){ + if(err) return console.error(err); + console.log('Server started!'); + }); }); }); }); diff --git a/src/electron/scout-server-ctl.js b/src/electron/scout-server-ctl.js new file mode 100644 index 00000000000..c6920935ab8 --- /dev/null +++ b/src/electron/scout-server-ctl.js @@ -0,0 +1,53 @@ +var fs = require('fs'); +var path = require('path'); +var PID_FILE = path.resolve(__dirname, 'scout-server.pid'); +var child_process = require('child_process'); +var BIN = path.resolve(__dirname, '../../node_modules/.bin/scout-server'); +var debug = require('debug')('scout-server:ctl'); + +var getPID = function(done) { + fs.exists(PID_FILE, function(exists) { + if (!exists) return done(null, -1); + + fs.readFile(PID_FILE, 'utf-8', function(err, buf) { + if (err) return done(err); + + done(null, parseInt(buf, 10)); + }); + }); +}; + + +var killIfRunning = function(done) { + getPID(function(err, pid) { + if (err) return done(err); + + if (pid === -1) { + debug('no pid file'); + return done(); + } + + debug('killing existing pid', pid); + try { + process.kill(pid, 'SIGTERM'); + } catch (err) { + if (err.code === 'ESRCH') { + debug('orphaned pid file'); + } + } + + fs.unlink(PID_FILE, done); + }); +}; + +module.exports.start = function(done) { + console.log('Starting!', BIN); + killIfRunning(function(err) { + if (err) return done(err); + + var server = child_process.fork(BIN); + fs.writeFile(PID_FILE, server.pid, done); + }); +}; + +module.exports.stop = killIfRunning; From 089cbb3d4a274bd82f1e4366869d30fd24adf304 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 01:08:35 -0400 Subject: [PATCH 23/46] move scout-server to a child process --- bin/mongodb-scout-server.js | 16 +++ bin/mongodb-scout.js | 21 +++ gulpfile.js | 236 +++++++++++++++++++++---------- package.json | 4 +- src/electron/auto-updater.js | 8 +- src/electron/index.js | 41 +++--- src/electron/scout-server-ctl.js | 33 ++++- tasks/win32.js | 19 +-- 8 files changed, 256 insertions(+), 122 deletions(-) create mode 100644 bin/mongodb-scout-server.js create mode 100644 bin/mongodb-scout.js diff --git a/bin/mongodb-scout-server.js b/bin/mongodb-scout-server.js new file mode 100644 index 00000000000..3859bb2ec43 --- /dev/null +++ b/bin/mongodb-scout-server.js @@ -0,0 +1,16 @@ +/** + * The entrypoint bin/mongodb-scout-server.js will call + * to start the server. + */ +var debug = require('debug')('scout:bin:mongodb-scout-server'); +var path = require('path'); + +var src = path.join(process.env.RESOURCES_PATH, 'scout-server.asar'); +debug('loading server from `%s`...', src); +var server = require(src); +server.server.on('error', function(err) { + console.error('mongodb-scout-server encountered an error', err.stack); + console.log('error data %j', err); +}); +debug('starting...'); +server.start(); diff --git a/bin/mongodb-scout.js b/bin/mongodb-scout.js new file mode 100644 index 00000000000..54a8bb43e12 --- /dev/null +++ b/bin/mongodb-scout.js @@ -0,0 +1,21 @@ +/** + * The main entrypoint Electron will run when launching the application. + */ +if (!process.atomBinding) { + console.error('mongodb-scout.js must be run in electron!'); + process.exit(0); +} + +if (process.env.NODE_ENV === 'development') { + process.env.DEBUG = 'mon*,sco*'; +} + +var debug = require('debug')('scout:bin:mongodb-scout'); + +// @see http://npm.im/electron-squirrel-startup +if (require('electron-squirrel-startup')) { + debug('Handled Squirrel.Windows event. Bye!'); +} else { + debug('require ../src/electron'); + require('../src/electron'); +} diff --git a/gulpfile.js b/gulpfile.js index 04c3585b335..f291302c045 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,3 +1,15 @@ +/** + * # Welcome to Scout's gulpfile! + * + * Here are a few tips to guide you on your quest: + * + * - [Gulp](http://gulpjs.com) is a toolkit for workflow automation + * - Use the `DEBUG` environment variable if you run into trouble! @see http://npm.im/debug + * - Check out the [gulp cookbook](http://git.io/vGye8) for more info + * - Remember to smile and floss + */ +var path = require('path'); +var spawn = require('child_process').spawn; var browserify = require('browserify'); var watchify = require('watchify'); var source = require('vinyl-source-stream'); @@ -9,91 +21,102 @@ var sourcemaps = require('gulp-sourcemaps'); var buffer = require('vinyl-buffer'); var merge = require('merge-stream'); var shell = require('gulp-shell'); -var path = require('path'); var del = require('del'); -var spawn = require('child_process').spawn; - +var sequence = require('run-sequence'); +var asar = require('gulp-asar'); var notify = require('./tasks/notify'); var pkg = require('./package.json'); +var debug = require('debug')('scout:gulp'); + // Platform specific tasks var platform = require(path.join(__dirname, 'tasks', process.platform)); -gulp.task('dev:configure', function() { - process.env.NODE_ENV = 'development'; -}); - -gulp.task('release:configure', function() { +/** + * # release + * + * `npm run release` calls this to build Scout + * and generate installers for users. + */ +gulp.task('release', function(done) { process.env.NODE_ENV = 'production'; + sequence([ + 'build', + 'electron:build-installer' + ], done); }); -// `npm start` calls this. -gulp.task('dev', ['dev:build-app', 'dev:build-js', 'dev:remove-unpacked-app'], function() { - var child = spawn(path.resolve(platform.ELECTRON), ['build/']); - child.stderr.pipe(process.stderr); - child.stdout.pipe(process.stdout); - child.on('exit', function(code) { - process.exit(code); - }); - return gulp.start('dev:watch'); -}); - -gulp.task('dev:build-app', ['dev:configure', 'dev:build-electron'], function() { - return gulp.start('pages', 'less', 'copy:fonts', 'copy:images', 'copy:electron'); -}); - -gulp.task('dev:remove-unpacked-app', ['dev:build-electron'], function() { - // deletes the `app` folder in electron build - // so `platform:start` can just point the electron renderer at `BUILD` - // and we don't have to do all kinds of crazy copying. - return del(platform.BUILD); -}); -gulp.task('dev:build-electron', platform.build); - -// `npm run release` calls this. -gulp.task('release', ['release:build-app'], function() { - return gulp.start('release:electron:build-installer'); +/** + * # build + */ +gulp.task('build', function(done) { + sequence( + [ + 'build:pages', + 'build:less', + 'copy:fonts', + 'copy:images', + 'copy:text', + 'copy:js' + ], + 'npm:install', + 'build:js', + 'electron:build', + 'build:server' + , done); }); -gulp.task('release:build-app', [ - 'js', - 'pages', - 'less', - 'copy:fonts', - 'copy:images', - 'copy:electron' -]); - -gulp.task('release:electron:build-installer', ['release:build-app'], platform.installer); - -var bundler = browserify(pkg.browserify).transform('jadeify'); -gulp.task('js', ['release:npm-install'], function() { - return bundler.bundle() - .on('error', notify('js')) - .pipe(source('index.js')) - .pipe(buffer()) - .pipe(sourcemaps.init({ - loadMaps: true - })) - .pipe(sourcemaps.write('./')) - .pipe(gulp.dest('build/')); +/** + * # dev + * + * `npm start` calls this which you call at least once a day + * so if there is something bugging you, post a message in flowdock! + */ +gulp.task('dev', function(done) { + process.env.NODE_ENV = 'development'; + sequence( + 'build', + 'electron:start', + 'watch' + , done); }); -gulp.task('dev:watch', function() { - gulp.watch(['src/{*,**/*}.less', 'styles/*.less'], ['less']); - gulp.watch(['src/*.jade'], ['pages']); +/** + * # watch + * + * Once you build the app and start it up, the next thing you'll want to do + * is actually change things. `watch` handles applying the correct + * tasks to your change so you can actually view the results. + */ +gulp.task('watch', function() { + gulp.watch(['src/{*,**/*}.less', 'styles/*.less'], ['build:less']); + gulp.watch(['src/*.jade'], ['build:pages']); gulp.watch('images/{*,**/*}', ['copy:images']); gulp.watch('fonts/*', ['copy:fonts']); - gulp.watch(['main.js', 'src/electron/*', 'settings.json'], ['copy:electron']); - gulp.watch('package.json', ['copy:electron', 'dev:npm-install']); + gulp.watch(['src/electron/*', 'bin/*'], ['copy:js']); + gulp.watch('package.json', function(done) { + sequence('copy:package.json', 'npm:install', done); + }); }); + /** - * Gulp's [fast browserify builds recipe](http://git.io/iiCk-A) + * Use browserify to compile the UI js. */ -gulp.task('dev:build-js', [ - 'dev:build-app', - 'dev:npm-install'], function() { +gulp.task('build:js', function() { + var bundler = browserify(pkg.browserify).transform('jadeify'); + if (process.env.NODE_ENV === 'production') { + return bundler.bundle() + .on('error', notify('js')) + .pipe(source('index.js')) + .pipe(buffer()) + .pipe(sourcemaps.init({ + loadMaps: true + })) + .pipe(sourcemaps.write('./')) + .pipe(gulp.dest('build/')); + } + // @see [fast browserify builds recipe](http://git.io/iiCk-A) var b; function rebundle(files) { if (files) { @@ -112,8 +135,10 @@ gulp.task('dev:build-js', [ return rebundle(); }); -// Compile LESS to CSS. -gulp.task('less', function() { +/** + * Compile LESS to CSS. + */ +gulp.task('build:less', function() { return gulp.src('src/*.less') .pipe(sourcemaps.init()) .pipe(less(pkg.less)) @@ -122,8 +147,13 @@ gulp.task('less', function() { .pipe(gulp.dest('build/')); }); -// Compile jade templates to HTML files. -gulp.task('pages', function() { +/** + * Compile jade templates to static HTML files. + * require('*.jade') statements you see in `src` + * are compiled via the `jadeify` browserify transform. + * @see build:js + */ +gulp.task('build:pages', function() { return gulp.src('src/index.jade') .pipe(jade({ locals: { @@ -134,7 +164,48 @@ gulp.task('pages', function() { .pipe(gulp.dest('build/')); }); -// Things that should be copied into `build/`. +/** + * Creates an [asar](http://npm.im/asar) of scout-server + * and copies it into the electron app. This allows + * the server to run as a child_process of the main + * electron process. + * @see bin/mongodb-scout-server.js + */ +gulp.task('build:server', function() { + debug('packaging `scout-server` into app resources...'); + return gulp.src('./node_modules/scout-server/{*,**/*}') + .pipe(asar('scout-server.asar')) + .pipe(gulp.dest(platform.RESOURCES)); +}); + +/** + * ## electron + */ +gulp.task('electron:start', function() { + var child = spawn(path.resolve(platform.ELECTRON), ['build/']); + child.stderr.pipe(process.stderr); + child.stdout.pipe(process.stdout); + child.on('exit', function(code) { + process.exit(code); + }); +}); + +gulp.task('electron:build', function(done) { + platform.build(function(err) { + if (err) return done(err); + if (process.env.NODE_ENV === 'development') { + debug('removing `%s` for dev mode...', path.join(platform.RESOURCES, 'app.asar')); + return del(path.join(platform.RESOURCES, 'app.asar'), done); + } + done(); + }); +}); + +gulp.task('electron:build-installer', platform.installer); + +/** + * ## Things that should be copied into `build/`. + */ gulp.task('copy:fonts', function() { return gulp.src(pkg.fonts) .pipe(gulp.dest('build/fonts')); @@ -145,20 +216,29 @@ gulp.task('copy:images', function() { .pipe(gulp.dest('build/images')); }); -gulp.task('copy:electron', function() { +gulp.task('copy:package.json', function() { + return gulp.src('package.json') + .pipe(gulp.dest('build/')); +}); + +gulp.task('copy:text', function() { + return gulp.src(['README.md']) + .pipe(gulp.dest('build/')); +}); + +// Copy non-UI js into the build. +gulp.task('copy:js', function() { return merge( - gulp.src(['main.js', 'package.json', 'settings.json', 'README.md']) + gulp.src(['main.js']) .pipe(gulp.dest('build/')), gulp.src(['src/electron/*']) - .pipe(gulp.dest('build/src/electron')) + .pipe(gulp.dest('build/src/electron')), + gulp.src(['bin/*']) + .pipe(gulp.dest('build/bin')) ); }); -gulp.task('dev:npm-install', ['copy:electron'], shell.task('npm install', { - cwd: 'build/' -})); - -gulp.task('release:npm-install', ['copy:electron'], shell.task('npm install --production', { +gulp.task('npm:install', shell.task('npm install --production', { cwd: 'build/' })); diff --git a/package.json b/package.json index db5329ff721..78c7c9c88e7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "scout", "description": "The MongoDB GUI.", "version": "0.3.0", - "main": "main.js", + "main": "bin/mongodb-scout.js", "electron_version": "0.30.5", "product_name": "MongoDB Scout", "authors": "MongoDB Inc.", @@ -110,6 +110,7 @@ "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", "gulp": "^3.9.0", + "gulp-asar": "0.0.2", "gulp-jade": "^1.0.1", "gulp-less": "^3.0.3", "gulp-shell": "^0.4.2", @@ -124,6 +125,7 @@ "node-notifier": "^4.2.3", "phantomjs": "^1.9.17", "pre-commit": "^1.0.10", + "run-sequence": "^1.1.2", "run-series": "^1.1.2", "stream-combiner2": "^1.0.2", "vinyl-buffer": "^1.0.0", diff --git a/src/electron/auto-updater.js b/src/electron/auto-updater.js index f7e838a5fa9..2bda9964c83 100644 --- a/src/electron/auto-updater.js +++ b/src/electron/auto-updater.js @@ -7,11 +7,11 @@ var FEED_URL = 'http://squirrel.mongodb.parts/scout/releases/latest?version=' + debug('Using feed url', FEED_URL); updater.on('checking-for-update', function() { - debug('checking for update', arguments); + debug('checking for update...'); }); -updater.on('error', function(err) { - debug('error checking for update', err); +updater.on('error', function() { + debug('error checking for update'); }); updater.on('update-available', function() { @@ -26,7 +26,7 @@ updater.on('update-downloaded', function() { debug('Update downloaded', arguments); }); -app.on('check for updates', function(){ +app.on('check for updates', function() { debug('checking for updates...'); updater.checkForUpdates(); }); diff --git a/src/electron/index.js b/src/electron/index.js index 9ae0eaaffdb..792cbd25e47 100644 --- a/src/electron/index.js +++ b/src/electron/index.js @@ -1,11 +1,5 @@ -if (process.env.NODE_ENV === 'development') { - process.env.DEBUG = 'mon*,sco*'; -} -if(require('electron-squirrel-startup')){ - return console.log('Squirrel.Windows event handled.'); -} -var serverctl = require('./scout-server-ctl'); var app = require('app'); +var serverctl = require('./scout-server-ctl'); var debug = require('debug')('scout-electron'); app.on('window-all-closed', function() { @@ -13,26 +7,25 @@ app.on('window-all-closed', function() { app.quit(); }); -app.on('ready', function(){ - process.nextTick(function(){ - process.nextTick(function(){ - console.log('starting scout-server...'); - serverctl.start(function(err){ - if(err) return console.error(err); - console.log('Server started!'); - }); - }); +app.on('quit', function() { + debug('app quitting! stopping server..'); + serverctl.stop(function(err) { + if (err) { + debug('Error stopping server...', err); + } + debug('Server stopped! Bye!'); }); }); -debug('requiring auto-updater...'); -require('./auto-updater'); +serverctl.start(function(err) { + if (err) { + debug('Error starting server...', err); + } else { + debug('Server started!'); + } +}); -debug('requiring crash-reporter...'); +require('./auto-updater'); require('./crash-reporter'); - -debug('requiring window-manager...'); -require('./window-manager'); - -debug('requiring menu...'); require('./menu'); +require('./window-manager'); diff --git a/src/electron/scout-server-ctl.js b/src/electron/scout-server-ctl.js index c6920935ab8..e7c5606a4df 100644 --- a/src/electron/scout-server-ctl.js +++ b/src/electron/scout-server-ctl.js @@ -1,10 +1,27 @@ +/** + * Run scout-server as a child_process so the UI is more + * insulated from potential network problems and so the + * rest of the app has a much smaller footprint on the + * main electron process. + * + * `scout-server-ctl` forks a new process of + * `bin/mongodb-scout-server.js` tracking it's PID + * so it can be killed off when the main process quits, + * as well as cleaning up any zombie processes on start. + */ var fs = require('fs'); var path = require('path'); -var PID_FILE = path.resolve(__dirname, 'scout-server.pid'); +var app = require('app'); var child_process = require('child_process'); -var BIN = path.resolve(__dirname, '../../node_modules/.bin/scout-server'); -var debug = require('debug')('scout-server:ctl'); +var debug = require('debug')('scout:electron:scout-server-ctl'); +// Where we'll keep the process id. +var PID_FILE = path.resolve(app.getPath('appData'), '.mongodb-scout-server.pid'); + +// Path to the file we'll fork. +var BIN = path.resolve(__dirname, '../../bin/mongodb-scout-server.js'); + +// Load the pid from `PID_FILE` var getPID = function(done) { fs.exists(PID_FILE, function(exists) { if (!exists) return done(null, -1); @@ -17,7 +34,6 @@ var getPID = function(done) { }); }; - var killIfRunning = function(done) { getPID(function(err, pid) { if (err) return done(err); @@ -41,11 +57,16 @@ var killIfRunning = function(done) { }; module.exports.start = function(done) { - console.log('Starting!', BIN); killIfRunning(function(err) { if (err) return done(err); - var server = child_process.fork(BIN); + var server = child_process.fork(BIN, [], { + env: { + ATOM_SHELL_INTERNAL_RUN_AS_NODE: 1, + RESOURCES_PATH: process.resourcesPath + } + }); + debug('scout-server started with pid `%s`', server.pid); fs.writeFile(PID_FILE, server.pid, done); }); }; diff --git a/tasks/win32.js b/tasks/win32.js index 017f9968d7a..ac3e93f2c57 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -1,7 +1,6 @@ var path = require('path'); var pkg = require(path.resolve(__dirname, '../package.json')); var fs = require('fs'); -var del = require('del'); var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); var series = require('run-series'); @@ -9,14 +8,16 @@ var _ = require('lodash'); var debug = require('debug')('scout:tasks:win32'); var APP_PATH = path.resolve(__dirname, '../dist/MongoDBScout-win32-ia32'); -module.exports.BUILD = path.join(APP_PATH, 'resources', 'app'); module.exports.ELECTRON = path.join(APP_PATH, 'MongoDBScout.exe'); +module.exports.RESOURCES = path.join(APP_PATH, 'resources'); + var PACKAGER_CONFIG = { name: 'MongoDBScout', dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), platform: 'win32', + ignore: new RegExp('(scout-server.asar|node_modules/scout-server)'), arch: 'ia32', version: pkg.electron_version, icon: path.resolve(__dirname, '../images/win32/scout.icon'), @@ -40,17 +41,18 @@ var INSTALLER_CONFIG = { overwrite: true }; -debug('packager config: ', JSON.stringify(PACKAGER_CONFIG, null, 2)); -debug('installer config: ', JSON.stringify(INSTALLER_CONFIG, null, 2)); - module.exports.build = function(done) { fs.exists(APP_PATH, function(exists) { if (exists) { debug('.app already exists. skipping packager run.'); - return done(); + return done(null, false); } debug('running packager to create electron binaries...'); - packager(PACKAGER_CONFIG, done); + packager(PACKAGER_CONFIG, function(err, res) { + if (err) return done(err); + debug('Packager result', res); + done(null, true); + }); }); }; @@ -59,8 +61,7 @@ module.exports.installer = function(done) { var tasks = [ _.partial(packager, PACKAGER_CONFIG), - _.partial(createInstaller, INSTALLER_CONFIG), - _.partial(del, module.exports.BUILD) + _.partial(createInstaller, INSTALLER_CONFIG) ]; series(tasks, function(err) { From a8593a4255f69b2d928e402eec4f0ab03736cde3 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 01:14:56 -0400 Subject: [PATCH 24/46] fix(gulp): stupid race on release task --- gulpfile.js | 12 +++++++----- tasks/darwin.js | 6 ++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index f291302c045..bcecf48c912 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -40,10 +40,12 @@ var platform = require(path.join(__dirname, 'tasks', process.platform)); */ gulp.task('release', function(done) { process.env.NODE_ENV = 'production'; - sequence([ + sequence( 'build', + 'electron:build', + 'build:server', 'electron:build-installer' - ], done); + , done); }); /** @@ -60,9 +62,7 @@ gulp.task('build', function(done) { 'copy:js' ], 'npm:install', - 'build:js', - 'electron:build', - 'build:server' + 'build:js' , done); }); @@ -76,6 +76,8 @@ gulp.task('dev', function(done) { process.env.NODE_ENV = 'development'; sequence( 'build', + 'electron:build', + 'build:server', 'electron:start', 'watch' , done); diff --git a/tasks/darwin.js b/tasks/darwin.js index 868e2c7fc22..968ae59eb84 100644 --- a/tasks/darwin.js +++ b/tasks/darwin.js @@ -18,6 +18,7 @@ var CONFIG = module.exports = { name: pkg.product_name, dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), + ignore: new RegExp('(scout-server.asar|node_modules/scout-server)'), appPath: APP_PATH, PACKAGE: PACKAGE, BUILD: path.join(APP_PATH, 'Contents', 'Resources', 'app'), @@ -56,6 +57,8 @@ var CONFIG = module.exports = { ] }; +module.exports.RESOURCES = path.join(APP_PATH, 'Contents', 'Resources'); + // Adjust config via environment variables if (process.env.SCOUT_INSTALLER_UNSIGNED !== undefined) { CONFIG.sign = null; @@ -69,8 +72,7 @@ module.exports.build = function(done) { debug('.app already exists. skipping packager run.'); return done(); } - - debug('running packager...'); + debug('running packager to create electron binaries...'); packager(CONFIG, done); }); }; From 9a912f9da0a3f1c7653ed647c727df996f870e5c Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 01:25:13 -0400 Subject: [PATCH 25/46] fix(gulp): add back package.json copy --- gulpfile.js | 3 ++- package.json | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index bcecf48c912..a8f821190e7 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -59,7 +59,8 @@ gulp.task('build', function(done) { 'copy:fonts', 'copy:images', 'copy:text', - 'copy:js' + 'copy:js', + 'copy:package.json' ], 'npm:install', 'build:js' diff --git a/package.json b/package.json index 78c7c9c88e7..19a514c1b09 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "ignore": [ "build/**", "dist/**", - "src/minicharts/d3-tip.js" + "src/minicharts/d3-tip.js", ] }, "dependency-check": { @@ -27,7 +27,10 @@ "browser-window", "menu", "jade", - "ampersand-state" + "ampersand-state", + "scout-server", + "tiny-lr", + "watch" ] }, "fonts": [ From f3cb52779f7c9fd407ab7a4691210550b434fcba Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 01:26:06 -0400 Subject: [PATCH 26/46] tired eyes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19a514c1b09..b7806d18fa5 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "ignore": [ "build/**", "dist/**", - "src/minicharts/d3-tip.js", + "src/minicharts/d3-tip.js" ] }, "dependency-check": { From d9c3b77920c0698e75d39ed31025e8d6118b862f Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Thu, 3 Sep 2015 09:06:56 -0400 Subject: [PATCH 27/46] Revert "fix(windows) installer_filename path" This reverts commit d15f65e5116607a16346c36fe92c0467309ee32e. --- .evergreen.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.evergreen.yml b/.evergreen.yml index b983f70a14b..4fb710ae1ac 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -131,7 +131,7 @@ buildvariants: add_environment: "APPDATA=C:\\Program Files (x86)\\nodejs\\node_modules" add_path: "/cygdrive/c/Program Files (x86)/nodejs" installer_content_type: "application/octet-stream" - installer_filename: "MongoDBScoutSetup.exe" + installer_filename: "MongoDB Scout.exe" exe: ".exe" num_cores: $(grep -c ^processor /proc/cpuinfo) tasks: From 4d3b4b4438f2f5e3dd2e25dcc5b8d5cc2a2eb0b7 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Thu, 3 Sep 2015 09:07:01 -0400 Subject: [PATCH 28/46] Revert "Trying to install npm@3 on build machines for more reliability" This reverts commit dae3dd22c1816922573f4ca3bea21d296bffaac2. --- .evergreen.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.evergreen.yml b/.evergreen.yml index 4fb710ae1ac..dc3c9d65d72 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -30,15 +30,8 @@ functions: set -o verbose export PATH="$PATH:${add_path|}" test -n "${add_environment|}" && export "${add_environment|}" - # Install npm 3 beta - npm install -g npm@3 - # Fix $PATH on Windows so the version of npm we just - # installed is used, instead of what's already installed. - export PATH="`npm -g bin`:$PATH" ${node|node} --version - which ${node|node} ${npm|npm} --version - which ${npm|npm} ${npm|npm} install "npm test" : - command: shell.exec From aba9caf50d9c8716a1fd580f8aa49b4e097c554a Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 14:22:14 -0400 Subject: [PATCH 29/46] start crash-reporter first to inspect .dmp files --- src/electron/crash-reporter.js | 2 +- src/electron/index.js | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/electron/crash-reporter.js b/src/electron/crash-reporter.js index fa884d112c3..a9e34c6ddf6 100644 --- a/src/electron/crash-reporter.js +++ b/src/electron/crash-reporter.js @@ -1,7 +1,7 @@ var reporter = module.exports = require('crash-reporter'); reporter.start({ - productName: 'Scout', + productName: 'Scout', // @todo (imlucas): standardize w/ package.json companyName: 'MongoDB', submitUrl: 'http://breakpad.mongodb.parts/post', autoSubmit: true diff --git a/src/electron/index.js b/src/electron/index.js index 792cbd25e47..b0af56d986d 100644 --- a/src/electron/index.js +++ b/src/electron/index.js @@ -1,3 +1,10 @@ +// Start crash-reporter asap so if anything goes +// wrong, we can at least view the crash reports +// locally. When a crash occurs, a `.dmp` file +// will be created in `/tmp/Scout` +// (`~\AppData\Local\Temp\Scout` on Windows). +require('./crash-reporter'); + var app = require('app'); var serverctl = require('./scout-server-ctl'); var debug = require('debug')('scout-electron'); @@ -26,6 +33,5 @@ serverctl.start(function(err) { }); require('./auto-updater'); -require('./crash-reporter'); require('./menu'); require('./window-manager'); From 35c86d387ecca9939e51747401d260f61cc71219 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 14:23:15 -0400 Subject: [PATCH 30/46] switch scout-server-ctl to spawn instead of fork MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fork doesn’t really work on windows --- src/electron/scout-server-ctl.js | 49 ++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/src/electron/scout-server-ctl.js b/src/electron/scout-server-ctl.js index e7c5606a4df..f80390cee7b 100644 --- a/src/electron/scout-server-ctl.js +++ b/src/electron/scout-server-ctl.js @@ -19,9 +19,13 @@ var debug = require('debug')('scout:electron:scout-server-ctl'); var PID_FILE = path.resolve(app.getPath('appData'), '.mongodb-scout-server.pid'); // Path to the file we'll fork. -var BIN = path.resolve(__dirname, '../../bin/mongodb-scout-server.js'); +var BIN = path.resolve(process.resourcesPath, './bin/mongodb-scout-server.js'); -// Load the pid from `PID_FILE` +/** + * Load the pid from `PID_FILE` + * @param {Function} done - `(err, number)` callback + * @api private + */ var getPID = function(done) { fs.exists(PID_FILE, function(exists) { if (!exists) return done(null, -1); @@ -34,6 +38,15 @@ var getPID = function(done) { }); }; +/** + * If there is something in `PID_FILE`, + * a previous attempt to start may have + * gone awry and we should treat it as + * an orphaned process. However, + * we also handle the case of the + * `PID_FILE` just not being cleaned up properly. + * @param {Function} done - `(err)` callback + */ var killIfRunning = function(done) { getPID(function(err, pid) { if (err) return done(err); @@ -56,17 +69,41 @@ var killIfRunning = function(done) { }); }; +/** + * Try and start scout-server as a child_process. + * @param {Function} done - `(err)` callback + */ module.exports.start = function(done) { killIfRunning(function(err) { if (err) return done(err); - var server = child_process.fork(BIN, [], { + // @note (imlucas): You're probably flinching that + // spaces in these paths aren't escaped. But fear + // not! `child_process.exec` has space escape issues + // but not `child_process.spawn`! + debug('spawning: `%s %s`...', process.execPath, BIN); + var server = child_process.spawn(process.execPath, [BIN], { env: { - ATOM_SHELL_INTERNAL_RUN_AS_NODE: 1, + ATOM_SHELL_INTERNAL_RUN_AS_NODE: '1', RESOURCES_PATH: process.resourcesPath - } + }, + cwd: process.resourcesPath + }); + server.stdout.on('data', function(buf) { + debug('> server: %s', buf.toString('utf-8')); }); - debug('scout-server started with pid `%s`', server.pid); + server.stderr.on('data', function(buf) { + debug('> server-stderr: %s', buf.toString('utf-8')); + }); + + // @todo (imlucas): Use `require('http').createClient()` and + // http://npm.im/backoff to hit `http://localhost:29017/health-check`. + // If the HTTP request fails or returns a non 200 HTTP status + // the server didn't actually start and we should treat it as an + // error starting the server. This handles the case of user's + // having another service that is *not* `scout-server` occupying + // our default port. + debug('scout-server started with pid `%s`!', server.pid); fs.writeFile(PID_FILE, server.pid, done); }); }; From 1c9c414d2af7e118dc2da08ed19d9272e528d6ec Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 14:23:48 -0400 Subject: [PATCH 31/46] better debug message when overriding window.open --- src/electron/window-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index 157520ca230..08b043b0f28 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -46,7 +46,7 @@ module.exports.create = function(opts) { _window.loadUrl(opts.url); _window.webContents.on('new-window', function(event, url, frameName, disposition) { - debug('got new-window event!', event, url, frameName, disposition); + debug('intercepting new-window (disregard the "error" message preventDefault is about to cause)'); event.preventDefault(); module.exports.create({ url: 'file://' + RESOURCES + '/index.html' + decodeURIComponent(url.replace('file://', '')) From 5d2ee2d3420fd57802299b70ba38bdaa31a90309 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 14:24:36 -0400 Subject: [PATCH 32/46] fix(gulp): put bin files in the right place --- gulpfile.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index a8f821190e7..c41eebf2324 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -43,6 +43,7 @@ gulp.task('release', function(done) { sequence( 'build', 'electron:build', + 'copy:bin', 'build:server', 'electron:build-installer' , done); @@ -79,6 +80,7 @@ gulp.task('dev', function(done) { 'build', 'electron:build', 'build:server', + 'copy:bin', 'electron:start', 'watch' , done); @@ -181,6 +183,13 @@ gulp.task('build:server', function() { .pipe(gulp.dest(platform.RESOURCES)); }); +gulp.task('server:prune', function() { + debug('packaging `scout-server` into app resources...'); + return gulp.src('./node_modules/scout-server/{*,**/*}') + .pipe(asar('scout-server.asar')) + .pipe(gulp.dest(platform.RESOURCES)); +}); + /** * ## electron */ @@ -235,13 +244,18 @@ gulp.task('copy:js', function() { gulp.src(['main.js']) .pipe(gulp.dest('build/')), gulp.src(['src/electron/*']) - .pipe(gulp.dest('build/src/electron')), - gulp.src(['bin/*']) - .pipe(gulp.dest('build/bin')) + .pipe(gulp.dest('build/src/electron')) ); }); -gulp.task('npm:install', shell.task('npm install --production', { +gulp.task('copy:bin', function() { + return gulp.src(['bin/*']) + .pipe(gulp.dest( + path.join(platform.RESOURCES, 'bin') + )); +}); + +gulp.task('npm:install', shell.task('npm install --production && npm dedupe', { cwd: 'build/' })); From b8079ed3bf9360f289087bd304ebe82b39a4ca1a Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 14:25:23 -0400 Subject: [PATCH 33/46] lint cleanup --- src/electron/window-manager.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index 08b043b0f28..e125d339cd3 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -45,8 +45,9 @@ module.exports.create = function(opts) { attachMenu(_window); _window.loadUrl(opts.url); - _window.webContents.on('new-window', function(event, url, frameName, disposition) { - debug('intercepting new-window (disregard the "error" message preventDefault is about to cause)'); + _window.webContents.on('new-window', function(event, url) { + debug('intercepting new-window (disregard the "error" message ' + + 'preventDefault is about to cause)'); event.preventDefault(); module.exports.create({ url: 'file://' + RESOURCES + '/index.html' + decodeURIComponent(url.replace('file://', '')) From cd877399aa7e3b707be70fbd80402080e68e62df Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 14:37:55 -0400 Subject: [PATCH 34/46] fix(gulp): shouldn't pass callback to sequence when package.json changed --- gulpfile.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index c41eebf2324..afde5fbba53 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -99,8 +99,9 @@ gulp.task('watch', function() { gulp.watch('images/{*,**/*}', ['copy:images']); gulp.watch('fonts/*', ['copy:fonts']); gulp.watch(['src/electron/*', 'bin/*'], ['copy:js']); - gulp.watch('package.json', function(done) { - sequence('copy:package.json', 'npm:install', done); + gulp.watch('package.json', function() { + gutil.log('package.json changed!'); + sequence('copy:package.json', 'npm:install'); }); }); From a68c1ed1bffec5c9b26210c8877684a0f6ae9ff9 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 14:39:03 -0400 Subject: [PATCH 35/46] bump electron to v0.30.6 [Changelog](https://github.com/atom/electron/releases/tag/v0.30.6) Mac - Fix bad rendering performance. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b7806d18fa5..60bc5b80bf3 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { - "name": "scout", + "name": "mongodb-scout", "description": "The MongoDB GUI.", "version": "0.3.0", "main": "bin/mongodb-scout.js", - "electron_version": "0.30.5", + "electron_version": "0.30.6", "product_name": "MongoDB Scout", "authors": "MongoDB Inc.", "check": { From 7266e0fd0f29d9a3a2fc7e49ee2f3adcf9e203ac Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Thu, 3 Sep 2015 15:25:32 -0400 Subject: [PATCH 36/46] experimental task to detect a potential win32 MAX_PATH problem --- gulpfile.js | 2 +- package.json | 1 + tasks/windows-max-path-length-check.js | 39 ++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tasks/windows-max-path-length-check.js diff --git a/gulpfile.js b/gulpfile.js index afde5fbba53..4dcac835c85 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -256,7 +256,7 @@ gulp.task('copy:bin', function() { )); }); -gulp.task('npm:install', shell.task('npm install --production && npm dedupe', { +gulp.task('npm:install', shell.task('npm install --production && npm dedupe --quiet --loglevel error', { cwd: 'build/' })); diff --git a/package.json b/package.json index 60bc5b80bf3..55b159d76a3 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "electron-squirrel-startup": "^0.1.2", "event-stream": "^3.3.1", "font-awesome": "https://github.com/FortAwesome/Font-Awesome/archive/v4.3.0.tar.gz", + "glob": "^5.0.14", "jade": "^1.11.0", "jquery": "^2.1.4", "local-links": "^1.4.0", diff --git a/tasks/windows-max-path-length-check.js b/tasks/windows-max-path-length-check.js new file mode 100644 index 00000000000..37ee59a3f47 --- /dev/null +++ b/tasks/windows-max-path-length-check.js @@ -0,0 +1,39 @@ +/** + * Will you hit the [Windows Maximum Path Length Limitation][1]? + * + * [1]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath + */ +process.env.DEBUG = '*'; +var fs = require('fs'); +var path = require('path'); +var debug = require('debug')('windows-max-path-length-check'); +var platform = require(path.join(__dirname, process.platform)); +var glob = require('glob'); + +const MAX_PATH = 260; + +module.exports = function(src, dest, done) { + if (typeof dest === 'function') { + done = dest; + dest = src; + } + + src = path.resolve(src); + + glob.glob(src, {}, function(err, files) { + if (err) return done(err); + + debug('Checking %d files', files.length); + var destPaths = files.map(function(file) { + return file.replace(process.cwd(), dest); + }); + + var tooLong = destPaths.filter(function(file) { + return file.length + 1 >= MAX_PATH; + }); + debug('%d paths too long!', tooLong.length); + debug('paths that are too long: ', tooLong); + }); +}; + +module.exports(path.join(process.cwd(), 'build/{!*.asar,*,**/*}'), path.resolve(platform.RESOURCES), console.error.bind(console)); From 410170903d445a5c36dc333b6ebf367b78e7d8bf Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Fri, 4 Sep 2015 18:29:26 -0400 Subject: [PATCH 37/46] fix(gulp): use our fork of gulp-asar thats not broken.. --- bin/mongodb-scout-server.js | 16 ---------------- bin/mongodb-scout.js | 21 --------------------- gulpfile.js | 12 ++++++------ package.json | 2 +- 4 files changed, 7 insertions(+), 44 deletions(-) diff --git a/bin/mongodb-scout-server.js b/bin/mongodb-scout-server.js index 3859bb2ec43..e69de29bb2d 100644 --- a/bin/mongodb-scout-server.js +++ b/bin/mongodb-scout-server.js @@ -1,16 +0,0 @@ -/** - * The entrypoint bin/mongodb-scout-server.js will call - * to start the server. - */ -var debug = require('debug')('scout:bin:mongodb-scout-server'); -var path = require('path'); - -var src = path.join(process.env.RESOURCES_PATH, 'scout-server.asar'); -debug('loading server from `%s`...', src); -var server = require(src); -server.server.on('error', function(err) { - console.error('mongodb-scout-server encountered an error', err.stack); - console.log('error data %j', err); -}); -debug('starting...'); -server.start(); diff --git a/bin/mongodb-scout.js b/bin/mongodb-scout.js index 54a8bb43e12..e69de29bb2d 100644 --- a/bin/mongodb-scout.js +++ b/bin/mongodb-scout.js @@ -1,21 +0,0 @@ -/** - * The main entrypoint Electron will run when launching the application. - */ -if (!process.atomBinding) { - console.error('mongodb-scout.js must be run in electron!'); - process.exit(0); -} - -if (process.env.NODE_ENV === 'development') { - process.env.DEBUG = 'mon*,sco*'; -} - -var debug = require('debug')('scout:bin:mongodb-scout'); - -// @see http://npm.im/electron-squirrel-startup -if (require('electron-squirrel-startup')) { - debug('Handled Squirrel.Windows event. Bye!'); -} else { - debug('require ../src/electron'); - require('../src/electron'); -} diff --git a/gulpfile.js b/gulpfile.js index 4dcac835c85..fd48f5faffc 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -23,7 +23,7 @@ var merge = require('merge-stream'); var shell = require('gulp-shell'); var del = require('del'); var sequence = require('run-sequence'); -var asar = require('gulp-asar'); + var notify = require('./tasks/notify'); var pkg = require('./package.json'); @@ -178,10 +178,10 @@ gulp.task('build:pages', function() { * @see bin/mongodb-scout-server.js */ gulp.task('build:server', function() { - debug('packaging `scout-server` into app resources...'); - return gulp.src('./node_modules/scout-server/{*,**/*}') - .pipe(asar('scout-server.asar')) - .pipe(gulp.dest(platform.RESOURCES)); + // debug('packaging `scout-server` into app resources...'); + // return gulp.src('./node_modules/scout-server/{*,**/*}') + // .pipe(asar('scout-server.asar')) + // .pipe(gulp.dest(platform.RESOURCES)); }); gulp.task('server:prune', function() { @@ -256,7 +256,7 @@ gulp.task('copy:bin', function() { )); }); -gulp.task('npm:install', shell.task('npm install --production && npm dedupe --quiet --loglevel error', { +gulp.task('npm:install', shell.task('npm install --production --quiet --loglevel error', { cwd: 'build/' })); diff --git a/package.json b/package.json index 55b159d76a3..9c99318f912 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", "gulp": "^3.9.0", - "gulp-asar": "0.0.2", + "gulp-asar": "mongodb-js/gulp-asar", "gulp-jade": "^1.0.1", "gulp-less": "^3.0.3", "gulp-shell": "^0.4.2", From 4492ec91cf015558aa42dfd36727771f4577f587 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Fri, 4 Sep 2015 21:04:55 -0400 Subject: [PATCH 38/46] get mac build running again --- bin/mongodb-scout-server.js | 0 bin/mongodb-scout.js | 0 gulpfile.js | 27 +++++++--------- package.json | 6 ++-- src/electron/scout-server-ctl.js | 20 +++++++++--- src/field-list/index.js | 4 ++- src/field-list/type-list-item.js | 4 ++- src/minicharts/d3fns/boolean.js | 12 +++++-- src/minicharts/d3fns/date.js | 20 +++++++++--- src/minicharts/d3fns/few.js | 24 ++++++++++---- src/minicharts/d3fns/many.js | 44 +++++++++++++++++++------- src/minicharts/d3fns/number.js | 20 +++++++++--- src/minicharts/d3fns/string.js | 12 +++++-- src/minicharts/querybuilder.js | 8 +++-- src/models/sampled-schema.js | 4 ++- src/models/scout-client-mixin.js | 8 +++-- src/refine-view/index.js | 4 ++- src/sidebar/index.js | 4 ++- tasks/darwin.js | 5 +-- tasks/win32.js | 9 ++++-- tasks/windows-max-path-length-check.js | 7 ++-- 21 files changed, 169 insertions(+), 73 deletions(-) delete mode 100644 bin/mongodb-scout-server.js delete mode 100644 bin/mongodb-scout.js diff --git a/bin/mongodb-scout-server.js b/bin/mongodb-scout-server.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/bin/mongodb-scout.js b/bin/mongodb-scout.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/gulpfile.js b/gulpfile.js index fd48f5faffc..e7da7075986 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,3 +1,5 @@ +process.env.DEBUG = '*'; + /** * # Welcome to Scout's gulpfile! * @@ -43,7 +45,6 @@ gulp.task('release', function(done) { sequence( 'build', 'electron:build', - 'copy:bin', 'build:server', 'electron:build-installer' , done); @@ -80,7 +81,6 @@ gulp.task('dev', function(done) { 'build', 'electron:build', 'build:server', - 'copy:bin', 'electron:start', 'watch' , done); @@ -185,10 +185,10 @@ gulp.task('build:server', function() { }); gulp.task('server:prune', function() { - debug('packaging `scout-server` into app resources...'); - return gulp.src('./node_modules/scout-server/{*,**/*}') - .pipe(asar('scout-server.asar')) - .pipe(gulp.dest(platform.RESOURCES)); + // debug('packaging `scout-server` into app resources...'); + // return gulp.src('./node_modules/scout-server/{*,**/*}') + // .pipe(asar('scout-server.asar')) + // .pipe(gulp.dest(platform.RESOURCES)); }); /** @@ -205,10 +205,12 @@ gulp.task('electron:start', function() { gulp.task('electron:build', function(done) { platform.build(function(err) { - if (err) return done(err); + if (err) { + return done(err); + } if (process.env.NODE_ENV === 'development') { - debug('removing `%s` for dev mode...', path.join(platform.RESOURCES, 'app.asar')); - return del(path.join(platform.RESOURCES, 'app.asar'), done); + debug('removing `%s` for dev mode...', path.join(platform.RESOURCES, 'app')); + return del(path.join(platform.RESOURCES, 'app'), done); } done(); }); @@ -249,13 +251,6 @@ gulp.task('copy:js', function() { ); }); -gulp.task('copy:bin', function() { - return gulp.src(['bin/*']) - .pipe(gulp.dest( - path.join(platform.RESOURCES, 'bin') - )); -}); - gulp.task('npm:install', shell.task('npm install --production --quiet --loglevel error', { cwd: 'build/' })); diff --git a/package.json b/package.json index 9c99318f912..63de6574e8a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "mongodb-scout", "description": "The MongoDB GUI.", "version": "0.3.0", - "main": "bin/mongodb-scout.js", + "main": "main.js", "electron_version": "0.30.6", "product_name": "MongoDB Scout", "authors": "MongoDB Inc.", @@ -30,7 +30,9 @@ "ampersand-state", "scout-server", "tiny-lr", - "watch" + "watch", + "glob", + "electron-squirrel-startup" ] }, "fonts": [ diff --git a/src/electron/scout-server-ctl.js b/src/electron/scout-server-ctl.js index f80390cee7b..18a70e6d1d9 100644 --- a/src/electron/scout-server-ctl.js +++ b/src/electron/scout-server-ctl.js @@ -19,7 +19,9 @@ var debug = require('debug')('scout:electron:scout-server-ctl'); var PID_FILE = path.resolve(app.getPath('appData'), '.mongodb-scout-server.pid'); // Path to the file we'll fork. -var BIN = path.resolve(process.resourcesPath, './bin/mongodb-scout-server.js'); +// var BIN = path.resolve(process.resourcesPath, +// './app/node_modules/scout-server/bin/scout-server.js'); +var BIN = path.resolve(__dirname, '../../node_modules/scout-server/bin/scout-server.js'); /** * Load the pid from `PID_FILE` @@ -28,10 +30,14 @@ var BIN = path.resolve(process.resourcesPath, './bin/mongodb-scout-server.js'); */ var getPID = function(done) { fs.exists(PID_FILE, function(exists) { - if (!exists) return done(null, -1); + if (!exists) { + return done(null, -1); + } fs.readFile(PID_FILE, 'utf-8', function(err, buf) { - if (err) return done(err); + if (err) { + return done(err); + } done(null, parseInt(buf, 10)); }); @@ -49,7 +55,9 @@ var getPID = function(done) { */ var killIfRunning = function(done) { getPID(function(err, pid) { - if (err) return done(err); + if (err) { + return done(err); + } if (pid === -1) { debug('no pid file'); @@ -75,7 +83,9 @@ var killIfRunning = function(done) { */ module.exports.start = function(done) { killIfRunning(function(err) { - if (err) return done(err); + if (err) { + return done(err); + } // @note (imlucas): You're probably flinching that // spaces in these paths aren't escaped. But fear diff --git a/src/field-list/index.js b/src/field-list/index.js index f4960639b6f..67f18542e7e 100644 --- a/src/field-list/index.js +++ b/src/field-list/index.js @@ -11,7 +11,9 @@ var SampledSchema = require('../models/sampled-schema'); function handleCaret(el) { var $el = $(el); // only apply to own caret, not children carets - if ($el.next().text() !== this.model.name) return; + if ($el.next().text() !== this.model.name) { + return; + } if (this.model.fields || this.model.arrayFields) { $el.addClass('caret'); } else { diff --git a/src/field-list/type-list-item.js b/src/field-list/type-list-item.js index b03c3a487bf..e968692514d 100644 --- a/src/field-list/type-list-item.js +++ b/src/field-list/type-list-item.js @@ -53,7 +53,9 @@ module.exports = View.extend(tooltipMixin, { }, typeClicked: function() { // no clicks on Undefined allowed - if (this.model.getId() === 'Undefined') return; + if (this.model.getId() === 'Undefined') { + return; + } var fieldView = this.parent.parent; if (fieldView.type_model !== this.model) { fieldView.type_model = this.model; diff --git a/src/minicharts/d3fns/boolean.js b/src/minicharts/d3fns/boolean.js index 304df58db12..cacb8f6ca5e 100644 --- a/src/minicharts/d3fns/boolean.js +++ b/src/minicharts/d3fns/boolean.js @@ -57,19 +57,25 @@ var minicharts_d3fns_boolean = function() { } chart.width = function(value) { - if (!arguments.length) return width; + if (!arguments.length) { + return width; + } width = value; return chart; }; chart.height = function(value) { - if (!arguments.length) return height; + if (!arguments.length) { + return height; + } height = value; return chart; }; chart.options = function(value) { - if (!arguments.length) return options; + if (!arguments.length) { + return options; + } _.assign(options, value); return chart; }; diff --git a/src/minicharts/d3fns/date.js b/src/minicharts/d3fns/date.js index e8a7d0595ed..24fbcef8b1c 100644 --- a/src/minicharts/d3fns/date.js +++ b/src/minicharts/d3fns/date.js @@ -77,7 +77,9 @@ var minicharts_d3fns_date = function() { var pos = barcodeX(d.dt); return s[0] > pos || pos > s[1]; }); - if (!options.view) return; + if (!options.view) { + return; + } if (numSelected !== options.view.queryAll('.selectable.selected').length) { // number of selected items has changed, trigger querybuilder event var evt = { @@ -96,7 +98,9 @@ var minicharts_d3fns_date = function() { } d3.select(this).call(brush.clear()); - if (!options.view) return; + if (!options.view) { + return; + } var evt = { type: 'drag', source: 'many' @@ -344,19 +348,25 @@ var minicharts_d3fns_date = function() { } chart.width = function(value) { - if (!arguments.length) return width; + if (!arguments.length) { + return width; + } width = value; return chart; }; chart.height = function(value) { - if (!arguments.length) return height; + if (!arguments.length) { + return height; + } height = value; return chart; }; chart.options = function(value) { - if (!arguments.length) return options; + if (!arguments.length) { + return options; + } _.assign(options, value); return chart; }; diff --git a/src/minicharts/d3fns/few.js b/src/minicharts/d3fns/few.js index a3f72664981..db7d5e00198 100644 --- a/src/minicharts/d3fns/few.js +++ b/src/minicharts/d3fns/few.js @@ -32,7 +32,9 @@ var minicharts_d3fns_few = function() { // --- end chart setup --- function handleClick(d) { - if (!options.view) return; + if (!options.view) { + return; + } var fgRect = $(this).siblings('rect.selectable')[0]; var evt = { d: d, @@ -72,7 +74,9 @@ var minicharts_d3fns_few = function() { return s[0] > right || left > s[1]; }); - if (!options.view) return; + if (!options.view) { + return; + } if (numSelected !== options.view.queryAll('rect.selectable.selected').length) { // number of selected items has changed, trigger querybuilder event var evt = { @@ -91,7 +95,9 @@ var minicharts_d3fns_few = function() { } d3.select(this).call(brush.clear()); - if (!options.view) return; + if (!options.view) { + return; + } var evt = { type: 'drag', source: 'many' @@ -237,19 +243,25 @@ var minicharts_d3fns_few = function() { } chart.width = function(value) { - if (!arguments.length) return width; + if (!arguments.length) { + return width; + } width = value; return chart; }; chart.height = function(value) { - if (!arguments.length) return height; + if (!arguments.length) { + return height; + } height = value; return chart; }; chart.options = function(value) { - if (!arguments.length) return options; + if (!arguments.length) { + return options; + } _.assign(options, value); return chart; }; diff --git a/src/minicharts/d3fns/many.js b/src/minicharts/d3fns/many.js index f36f54c7ff9..6fbae9d188c 100644 --- a/src/minicharts/d3fns/many.js +++ b/src/minicharts/d3fns/many.js @@ -37,7 +37,9 @@ var minicharts_d3fns_many = function() { // --- end chart setup --- function handleClick(d) { - if (!options.view || !options.selectable) return; + if (!options.view || !options.selectable) { + return; + } var evt = { d: d, self: this, @@ -76,7 +78,9 @@ var minicharts_d3fns_many = function() { return s[0] > right || left > s[1]; }); - if (!options.view) return; + if (!options.view) { + return; + } if (numSelected !== options.view.queryAll('rect.selectable.selected').length) { // number of selected items has changed, trigger querybuilder event var evt = { @@ -95,7 +99,9 @@ var minicharts_d3fns_many = function() { } d3.select(this).call(brush.clear()); - if (!options.view) return; + if (!options.view) { + return; + } var evt = { type: 'drag', source: 'many' @@ -104,7 +110,9 @@ var minicharts_d3fns_many = function() { } function handleMouseDown() { - if (!options.selectable) return; + if (!options.selectable) { + return; + } var bar = this; var parent = $(this).closest('.minichart'); var background = parent.find('g.brush > rect.background')[0]; @@ -160,13 +168,21 @@ var minicharts_d3fns_many = function() { if (options.labels) { _.defaults(labels, { 'text-anchor': function(d, i) { - if (i === 0) return 'start'; - if (i === data.length - 1) return 'end'; + if (i === 0) { + return 'start'; + } + if (i === data.length - 1) { + return 'end'; + } return 'middle'; }, x: labels['text-anchor'] === 'middle' ? xScale.rangeBand() / 2 : function(d, i) { - if (i === 0) return 0; - if (i === data.length - 1) return xScale.rangeBand(); + if (i === 0) { + return 0; + } + if (i === data.length - 1) { + return xScale.rangeBand(); + } return xScale.rangeBand() / 2; }, y: height + 5, @@ -331,19 +347,25 @@ var minicharts_d3fns_many = function() { } chart.width = function(value) { - if (!arguments.length) return width; + if (!arguments.length) { + return width; + } width = value; return chart; }; chart.height = function(value) { - if (!arguments.length) return height; + if (!arguments.length) { + return height; + } height = value; return chart; }; chart.options = function(value) { - if (!arguments.length) return options; + if (!arguments.length) { + return options; + } _.assign(options, value); return chart; }; diff --git a/src/minicharts/d3fns/number.js b/src/minicharts/d3fns/number.js index 5f7471ca9bd..756e836f346 100644 --- a/src/minicharts/d3fns/number.js +++ b/src/minicharts/d3fns/number.js @@ -77,8 +77,12 @@ var minicharts_d3fns_number = function() { } else { labels = { text: function(d, i) { - if (i === 0) return 'min: ' + d3.min(data); - if (i === grouped.length - 1) return 'max: ' + d3.max(data); + if (i === 0) { + return 'min: ' + d3.min(data); + } + if (i === grouped.length - 1) { + return 'max: ' + d3.max(data); + } return ''; } }; @@ -97,19 +101,25 @@ var minicharts_d3fns_number = function() { } chart.width = function(value) { - if (!arguments.length) return width; + if (!arguments.length) { + return width; + } width = value; return chart; }; chart.height = function(value) { - if (!arguments.length) return height; + if (!arguments.length) { + return height; + } height = value; return chart; }; chart.options = function(value) { - if (!arguments.length) return options; + if (!arguments.length) { + return options; + } _.assign(options, value); return chart; }; diff --git a/src/minicharts/d3fns/string.js b/src/minicharts/d3fns/string.js index 85e5f55b733..d4685be9ab7 100644 --- a/src/minicharts/d3fns/string.js +++ b/src/minicharts/d3fns/string.js @@ -60,19 +60,25 @@ var minicharts_d3fns_string = function() { } chart.width = function(value) { - if (!arguments.length) return width; + if (!arguments.length) { + return width; + } width = value; return chart; }; chart.height = function(value) { - if (!arguments.length) return height; + if (!arguments.length) { + return height; + } height = value; return chart; }; chart.options = function(value) { - if (!arguments.length) return options; + if (!arguments.length) { + return options; + } _.assign(options, value); return chart; }; diff --git a/src/minicharts/querybuilder.js b/src/minicharts/querybuilder.js index 9925d9e544d..5f0d067d981 100644 --- a/src/minicharts/querybuilder.js +++ b/src/minicharts/querybuilder.js @@ -411,7 +411,9 @@ module.exports = { * @param {Value} value value pushed down from refine bar for this minichart */ processValue: function(value) { - if (!this.rendered) return; + if (!this.rendered) { + return; + } var message = { elements: this.queryAll('.selectable') @@ -473,7 +475,9 @@ module.exports = { * @return {Any} value to be returned that can be used for comparisons < and > */ _getOrderedValueHelper: function(d) { - if (!d._bsontype) return d; + if (!d._bsontype) { + return d; + } return d._bsontype === 'ObjectID' ? d.getTimestamp() : d; }, /** diff --git a/src/models/sampled-schema.js b/src/models/sampled-schema.js index dabcee8db72..801a28dd597 100644 --- a/src/models/sampled-schema.js +++ b/src/models/sampled-schema.js @@ -110,7 +110,9 @@ module.exports = Schema.extend({ var onEnd = function(err) { model.is_fetching = false; - if (err) return options.error(model, err); + if (err) { + return options.error(model, err); + } model.documents.reset(docs); model.documents.trigger('sync'); options.success({}); diff --git a/src/models/scout-client-mixin.js b/src/models/scout-client-mixin.js index 885807832a0..f4a4c99ebc9 100644 --- a/src/models/scout-client-mixin.js +++ b/src/models/scout-client-mixin.js @@ -15,7 +15,9 @@ module.exports = { var success = options.success; options.success = function(resp) { - if (!model.set(model.parse(resp, options), options)) return false; + if (!model.set(model.parse(resp, options), options)) { + return false; + } if (success) { success(model, resp, options); } @@ -25,7 +27,9 @@ module.exports = { wrapError(this, options); var done = function(err, res) { - if (err) return options.error({}, 'error', err.message); + if (err) { + return options.error({}, 'error', err.message); + } raf(function call_scout_client_success() { options.success(res, 'success', res); }); diff --git a/src/refine-view/index.js b/src/refine-view/index.js index 6939882c2bc..e8a0103b6fb 100644 --- a/src/refine-view/index.js +++ b/src/refine-view/index.js @@ -105,7 +105,9 @@ module.exports = AmpersandView.extend({ refineClicked: function() { // The UI should not allow hitting refine on invalid queries, but just to be sure we // deny it here, too. - if (!this.editableQuery.valid) return; + if (!this.editableQuery.valid) { + return; + } this.volatileQueryOptions.query = this.editableQuery.queryObject; // clone the query this.queryOptions.query = new Query(this.volatileQueryOptions.query.serialize(), { diff --git a/src/sidebar/index.js b/src/sidebar/index.js index 1c49347034b..37cdb7088d8 100644 --- a/src/sidebar/index.js +++ b/src/sidebar/index.js @@ -25,7 +25,9 @@ var SidebarView = View.extend({ }, { type: function() { var content = document.querySelector('.content'); - if (!content) return; + if (!content) { + return; + } if (this.open) { content.classList.add('with-sidebar'); } else { diff --git a/tasks/darwin.js b/tasks/darwin.js index 968ae59eb84..6092b1b3eb8 100644 --- a/tasks/darwin.js +++ b/tasks/darwin.js @@ -29,7 +29,6 @@ var CONFIG = module.exports = { icon: path.resolve(__dirname, '../images/darwin/scout.icns'), background: path.resolve(__dirname, '../images/darwin/background.png'), overwrite: true, - asar: true, prune: true, 'app-bundle-id': 'com.mongodb.scout', 'app-version': pkg.version, @@ -97,6 +96,8 @@ module.exports.installer = function(done) { tasks.push(_.partial(createDMG, CONFIG)); series(tasks, function(err) { - if (err) return done(err); + if (err) { + return done(err); + } }); }; diff --git a/tasks/win32.js b/tasks/win32.js index ac3e93f2c57..c71c645effa 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -22,7 +22,6 @@ var PACKAGER_CONFIG = { version: pkg.electron_version, icon: path.resolve(__dirname, '../images/win32/scout.icon'), overwrite: true, - asar: true, prune: true, 'version-string': { CompanyName: 'MongoDB Inc.', @@ -49,7 +48,9 @@ module.exports.build = function(done) { } debug('running packager to create electron binaries...'); packager(PACKAGER_CONFIG, function(err, res) { - if (err) return done(err); + if (err) { + return done(err); + } debug('Packager result', res); done(null, true); }); @@ -65,7 +66,9 @@ module.exports.installer = function(done) { ]; series(tasks, function(err) { - if (err) return done(err); + if (err) { + return done(err); + } console.log('Installer created!'); done(); }); diff --git a/tasks/windows-max-path-length-check.js b/tasks/windows-max-path-length-check.js index 37ee59a3f47..ce149e705d3 100644 --- a/tasks/windows-max-path-length-check.js +++ b/tasks/windows-max-path-length-check.js @@ -4,13 +4,12 @@ * [1]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath */ process.env.DEBUG = '*'; -var fs = require('fs'); var path = require('path'); var debug = require('debug')('windows-max-path-length-check'); var platform = require(path.join(__dirname, process.platform)); var glob = require('glob'); -const MAX_PATH = 260; +var MAX_PATH = 260; module.exports = function(src, dest, done) { if (typeof dest === 'function') { @@ -21,7 +20,9 @@ module.exports = function(src, dest, done) { src = path.resolve(src); glob.glob(src, {}, function(err, files) { - if (err) return done(err); + if (err) { + return done(err); + } debug('Checking %d files', files.length); var destPaths = files.map(function(file) { From f9a62e010e46be95beaef4a895e8ad0cc3d082b5 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 5 Sep 2015 01:35:39 -0400 Subject: [PATCH 39/46] hooray for npm@3 --- gulpfile.js | 33 ++++++++-------------------- package.json | 13 ++++++----- src/electron/index.js | 50 ++++++++++++++++++++++--------------------- tasks/win32.js | 9 +------- 4 files changed, 42 insertions(+), 63 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index e7da7075986..3372d011318 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -98,14 +98,13 @@ gulp.task('watch', function() { gulp.watch(['src/*.jade'], ['build:pages']); gulp.watch('images/{*,**/*}', ['copy:images']); gulp.watch('fonts/*', ['copy:fonts']); - gulp.watch(['src/electron/*', 'bin/*'], ['copy:js']); + gulp.watch(['src/electron/*'], ['copy:js']); gulp.watch('package.json', function() { gutil.log('package.json changed!'); sequence('copy:package.json', 'npm:install'); }); }); - /** * Use browserify to compile the UI js. */ @@ -171,25 +170,15 @@ gulp.task('build:pages', function() { }); /** - * Creates an [asar](http://npm.im/asar) of scout-server - * and copies it into the electron app. This allows - * the server to run as a child_process of the main - * electron process. - * @see bin/mongodb-scout-server.js + * Install scout-server separately while we're + * using tarballs from S3 as they're filtered + * out by default. */ -gulp.task('build:server', function() { - // debug('packaging `scout-server` into app resources...'); - // return gulp.src('./node_modules/scout-server/{*,**/*}') - // .pipe(asar('scout-server.asar')) - // .pipe(gulp.dest(platform.RESOURCES)); -}); - -gulp.task('server:prune', function() { - // debug('packaging `scout-server` into app resources...'); - // return gulp.src('./node_modules/scout-server/{*,**/*}') - // .pipe(asar('scout-server.asar')) - // .pipe(gulp.dest(platform.RESOURCES)); -}); +gulp.task('build:server', shell.task( + 'npm version && npm install --production --quiet --loglevel error ' + + pkg.dependencies['scout-server'], { + cwd: path.join(platform.RESOURCES, 'app') + })); /** * ## electron @@ -208,10 +197,6 @@ gulp.task('electron:build', function(done) { if (err) { return done(err); } - if (process.env.NODE_ENV === 'development') { - debug('removing `%s` for dev mode...', path.join(platform.RESOURCES, 'app')); - return del(path.join(platform.RESOURCES, 'app'), done); - } done(); }); }); diff --git a/package.json b/package.json index 63de6574e8a..16fb57ffad7 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,11 @@ "url": "git://github.com/10gen/scout.git" }, "dependencies": { + "debug": "^2.2.0", + "scout-server": "http://bin.mongodb.org/js/scout-server/v0.0.4/scout-server-0.0.4.tar.gz", + "electron-squirrel-startup": "^0.1.2" + }, + "devDependencies": { "ampersand-app": "^1.0.4", "ampersand-collection": "^1.4.5", "ampersand-collection-filterable": "^0.2.1", @@ -80,9 +85,7 @@ "bootstrap": "https://github.com/twbs/bootstrap/archive/v3.3.5.tar.gz", "bugsnag-js": "^2.4.8", "d3": "^3.5.5", - "debug": "^2.2.0", "domready": "^1.0.8", - "electron-squirrel-startup": "^0.1.2", "event-stream": "^3.3.1", "font-awesome": "https://github.com/FortAwesome/Font-Awesome/archive/v4.3.0.tar.gz", "glob": "^5.0.14", @@ -103,11 +106,8 @@ "raf": "^3.0.0", "scout-brain": "http://bin.mongodb.org/js/scout-brain/v0.0.2/scout-brain-0.0.2.tar.gz", "scout-client": "http://bin.mongodb.org/js/scout-client/v0.0.5/scout-client-0.0.5.tar.gz", - "scout-server": "http://bin.mongodb.org/js/scout-server/v0.0.4/scout-server-0.0.4.tar.gz", "tiny-lr": "^0.1.6", - "watch": "^0.16.0" - }, - "devDependencies": { + "watch": "^0.16.0", "browserify": "^10.2.4", "del": "^1.2.0", "electron-installer-dmg": "^0.1.0", @@ -116,7 +116,6 @@ "eslint": "^0.24.1", "eslint-config-mongodb-js": "^0.1.4", "gulp": "^3.9.0", - "gulp-asar": "mongodb-js/gulp-asar", "gulp-jade": "^1.0.1", "gulp-less": "^3.0.3", "gulp-shell": "^0.4.2", diff --git a/src/electron/index.js b/src/electron/index.js index b0af56d986d..74d6d44a9a3 100644 --- a/src/electron/index.js +++ b/src/electron/index.js @@ -5,33 +5,35 @@ // (`~\AppData\Local\Temp\Scout` on Windows). require('./crash-reporter'); -var app = require('app'); -var serverctl = require('./scout-server-ctl'); -var debug = require('debug')('scout-electron'); +if(!require('electron-squirrel-startup')){ + var app = require('app'); + var serverctl = require('./scout-server-ctl'); + var debug = require('debug')('scout-electron'); -app.on('window-all-closed', function() { - debug('All windows closed. Quitting app.'); - app.quit(); -}); + app.on('window-all-closed', function() { + debug('All windows closed. Quitting app.'); + app.quit(); + }); + + app.on('quit', function() { + debug('app quitting! stopping server..'); + serverctl.stop(function(err) { + if (err) { + debug('Error stopping server...', err); + } + debug('Server stopped! Bye!'); + }); + }); -app.on('quit', function() { - debug('app quitting! stopping server..'); - serverctl.stop(function(err) { + serverctl.start(function(err) { if (err) { - debug('Error stopping server...', err); + debug('Error starting server...', err); + } else { + debug('Server started!'); } - debug('Server stopped! Bye!'); }); -}); - -serverctl.start(function(err) { - if (err) { - debug('Error starting server...', err); - } else { - debug('Server started!'); - } -}); -require('./auto-updater'); -require('./menu'); -require('./window-manager'); + require('./auto-updater'); + require('./menu'); + require('./window-manager'); +} diff --git a/tasks/win32.js b/tasks/win32.js index c71c645effa..a6398e0c3ce 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -58,14 +58,7 @@ module.exports.build = function(done) { }; module.exports.installer = function(done) { - debug('Packaging into `%s`', path.join(APP_PATH, 'resources', 'app.asar')); - - var tasks = [ - _.partial(packager, PACKAGER_CONFIG), - _.partial(createInstaller, INSTALLER_CONFIG) - ]; - - series(tasks, function(err) { + createInstaller(INSTALLER_CONFIG, function(err) { if (err) { return done(err); } From 8ce3b8a5c29316a9812ca46703b85fd1b21b4349 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 5 Sep 2015 01:36:37 -0400 Subject: [PATCH 40/46] when suddenly a weird UI error fixes it but have only seen on windows so need to confirm when on the same planet --- src/home/collection.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/home/collection.js b/src/home/collection.js index 44f8a83b007..b38de8afc0b 100644 --- a/src/home/collection.js +++ b/src/home/collection.js @@ -11,7 +11,7 @@ var app = require('ampersand-app'); var debug = require('debug')('scout:home:collection'); var MongoDBCollectionView = View.extend({ - modelType: 'Collection', + //modelType: 'Collection', template: require('./collection.jade'), props: { sidebar_open: { @@ -61,10 +61,10 @@ var MongoDBCollectionView = View.extend({ ] }, children: { - model: MongoDBCollection, schema: SampledSchema }, initialize: function() { + this.model = new MongoDBCollection(); app.statusbar.watch(this, this.schema); this.listenToAndRun(this.parent, 'change:ns', this.onCollectionChanged.bind(this)); }, From 56fefb74f1c84c6f9f9f6126cb38b2342df6881b Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 5 Sep 2015 02:31:45 -0400 Subject: [PATCH 41/46] switch windows to x64 builds --- gulpfile.js | 5 +++-- tasks/win32.js | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 3372d011318..fef11ddbbfa 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -174,9 +174,10 @@ gulp.task('build:pages', function() { * using tarballs from S3 as they're filtered * out by default. */ +var format = require('util').format; gulp.task('build:server', shell.task( - 'npm version && npm install --production --quiet --loglevel error ' - + pkg.dependencies['scout-server'], { + format('npm install --production %s', + pkg.dependencies['scout-server']), { cwd: path.join(platform.RESOURCES, 'app') })); diff --git a/tasks/win32.js b/tasks/win32.js index a6398e0c3ce..085b67f1f94 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -7,7 +7,7 @@ var series = require('run-series'); var _ = require('lodash'); var debug = require('debug')('scout:tasks:win32'); -var APP_PATH = path.resolve(__dirname, '../dist/MongoDBScout-win32-ia32'); +var APP_PATH = path.resolve(__dirname, '../dist/MongoDBScout-win32-x64'); module.exports.ELECTRON = path.join(APP_PATH, 'MongoDBScout.exe'); module.exports.RESOURCES = path.join(APP_PATH, 'resources'); @@ -18,7 +18,7 @@ var PACKAGER_CONFIG = { out: path.resolve(__dirname, '../dist'), platform: 'win32', ignore: new RegExp('(scout-server.asar|node_modules/scout-server)'), - arch: 'ia32', + arch: 'x64', version: pkg.electron_version, icon: path.resolve(__dirname, '../images/win32/scout.icon'), overwrite: true, From f303b50a39752db305ec21cebf90b2301610b89c Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 5 Sep 2015 03:04:55 -0400 Subject: [PATCH 42/46] dont need to prune anymore since we've switched to npm@3 + fmt --- gulpfile.js | 4 +--- src/electron/index.js | 2 +- src/home/collection.js | 2 +- tasks/darwin.js | 1 - tasks/win32.js | 4 ---- 5 files changed, 3 insertions(+), 10 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index fef11ddbbfa..7ce0518685b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -29,8 +29,6 @@ var sequence = require('run-sequence'); var notify = require('./tasks/notify'); var pkg = require('./package.json'); -var debug = require('debug')('scout:gulp'); - // Platform specific tasks var platform = require(path.join(__dirname, 'tasks', process.platform)); @@ -177,7 +175,7 @@ gulp.task('build:pages', function() { var format = require('util').format; gulp.task('build:server', shell.task( format('npm install --production %s', - pkg.dependencies['scout-server']), { + pkg.dependencies['scout-server']), { cwd: path.join(platform.RESOURCES, 'app') })); diff --git a/src/electron/index.js b/src/electron/index.js index 74d6d44a9a3..74a145a053f 100644 --- a/src/electron/index.js +++ b/src/electron/index.js @@ -5,7 +5,7 @@ // (`~\AppData\Local\Temp\Scout` on Windows). require('./crash-reporter'); -if(!require('electron-squirrel-startup')){ +if (!require('electron-squirrel-startup')) { var app = require('app'); var serverctl = require('./scout-server-ctl'); var debug = require('debug')('scout-electron'); diff --git a/src/home/collection.js b/src/home/collection.js index b38de8afc0b..043358b88f7 100644 --- a/src/home/collection.js +++ b/src/home/collection.js @@ -11,7 +11,7 @@ var app = require('ampersand-app'); var debug = require('debug')('scout:home:collection'); var MongoDBCollectionView = View.extend({ - //modelType: 'Collection', + // modelType: 'Collection', template: require('./collection.jade'), props: { sidebar_open: { diff --git a/tasks/darwin.js b/tasks/darwin.js index 6092b1b3eb8..86e9510b74d 100644 --- a/tasks/darwin.js +++ b/tasks/darwin.js @@ -29,7 +29,6 @@ var CONFIG = module.exports = { icon: path.resolve(__dirname, '../images/darwin/scout.icns'), background: path.resolve(__dirname, '../images/darwin/background.png'), overwrite: true, - prune: true, 'app-bundle-id': 'com.mongodb.scout', 'app-version': pkg.version, sign: '90E39AA7832E95369F0FC6DAF823A04DFBD9CF7A', diff --git a/tasks/win32.js b/tasks/win32.js index 085b67f1f94..90d29c6cdc2 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -3,15 +3,12 @@ var pkg = require(path.resolve(__dirname, '../package.json')); var fs = require('fs'); var packager = require('electron-packager'); var createInstaller = require('electron-installer-squirrel-windows'); -var series = require('run-series'); -var _ = require('lodash'); var debug = require('debug')('scout:tasks:win32'); var APP_PATH = path.resolve(__dirname, '../dist/MongoDBScout-win32-x64'); module.exports.ELECTRON = path.join(APP_PATH, 'MongoDBScout.exe'); module.exports.RESOURCES = path.join(APP_PATH, 'resources'); - var PACKAGER_CONFIG = { name: 'MongoDBScout', dir: path.resolve(__dirname, '../build'), @@ -22,7 +19,6 @@ var PACKAGER_CONFIG = { version: pkg.electron_version, icon: path.resolve(__dirname, '../images/win32/scout.icon'), overwrite: true, - prune: true, 'version-string': { CompanyName: 'MongoDB Inc.', LegalCopyright: '2015 MongoDB Inc.', From dcd78c9bbee6adada20184b86a79e22e1411a787 Mon Sep 17 00:00:00 2001 From: Matt Kangas Date: Mon, 7 Sep 2015 16:11:37 -0400 Subject: [PATCH 43/46] fix(osx) signed installer build bug Fix bug introduced by yours truly in ed5004c --- tasks/darwin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/darwin.js b/tasks/darwin.js index 86e9510b74d..1c349137dcd 100644 --- a/tasks/darwin.js +++ b/tasks/darwin.js @@ -89,7 +89,7 @@ module.exports.installer = function(done) { ]; if (CONFIG.sign) { - tasks.push(_.partial(verify, CONFIG)); + tasks.push(verify); } tasks.push(_.partial(createDMG, CONFIG)); From 7c341009e11dcd7e8bfa36a96124ea6484e0d45f Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Mon, 7 Sep 2015 21:50:05 -0400 Subject: [PATCH 44/46] don't re-run packager when building installer done on a higher level in gulpfile.js --- tasks/darwin.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tasks/darwin.js b/tasks/darwin.js index 1c349137dcd..85b05ce8f1f 100644 --- a/tasks/darwin.js +++ b/tasks/darwin.js @@ -82,12 +82,9 @@ var verify = function(done) { }; module.exports.installer = function(done) { - debug('running packager...'); - - var tasks = [ - _.partial(packager, CONFIG) - ]; + debug('creating installer...'); + var tasks = []; if (CONFIG.sign) { tasks.push(verify); } @@ -96,7 +93,10 @@ module.exports.installer = function(done) { series(tasks, function(err) { if (err) { + console.error(err.stack); return done(err); } + console.log('Installer created!'); + done(); }); }; From af8be5806a67e8e95d889ecadf40efad9f0c851a Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Mon, 7 Sep 2015 22:08:43 -0400 Subject: [PATCH 45/46] standardizing win32+darwin builds --- gulpfile.js | 14 -------------- tasks/darwin.js | 47 ++++++++++++++++++++++++++--------------------- tasks/win32.js | 3 ++- 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 7ce0518685b..e281c0bd1f2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -43,7 +43,6 @@ gulp.task('release', function(done) { sequence( 'build', 'electron:build', - 'build:server', 'electron:build-installer' , done); }); @@ -78,7 +77,6 @@ gulp.task('dev', function(done) { sequence( 'build', 'electron:build', - 'build:server', 'electron:start', 'watch' , done); @@ -167,18 +165,6 @@ gulp.task('build:pages', function() { .pipe(gulp.dest('build/')); }); -/** - * Install scout-server separately while we're - * using tarballs from S3 as they're filtered - * out by default. - */ -var format = require('util').format; -gulp.task('build:server', shell.task( - format('npm install --production %s', - pkg.dependencies['scout-server']), { - cwd: path.join(platform.RESOURCES, 'app') - })); - /** * ## electron */ diff --git a/tasks/darwin.js b/tasks/darwin.js index 85b05ce8f1f..c24ae3d9a51 100644 --- a/tasks/darwin.js +++ b/tasks/darwin.js @@ -14,21 +14,19 @@ var APP_PATH = path.join(PACKAGE, NAME + '.app'); var packager = require('electron-packager'); var createDMG = require('electron-installer-dmg'); -var CONFIG = module.exports = { +module.exports.ELECTRON = path.join(APP_PATH, 'Contents', 'MacOS', 'Electron'); +module.exports.RESOURCES = path.join(APP_PATH, 'Contents', 'Resources'); + +var PACKAGER_CONFIG = { name: pkg.product_name, dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), - ignore: new RegExp('(scout-server.asar|node_modules/scout-server)'), - appPath: APP_PATH, - PACKAGE: PACKAGE, - BUILD: path.join(APP_PATH, 'Contents', 'Resources', 'app'), - ELECTRON: path.join(APP_PATH, 'Contents', 'MacOS', 'Electron'), platform: 'darwin', arch: 'x64', version: pkg.electron_version, icon: path.resolve(__dirname, '../images/darwin/scout.icns'), - background: path.resolve(__dirname, '../images/darwin/background.png'), overwrite: true, + prune: true, 'app-bundle-id': 'com.mongodb.scout', 'app-version': pkg.version, sign: '90E39AA7832E95369F0FC6DAF823A04DFBD9CF7A', @@ -37,7 +35,23 @@ var CONFIG = module.exports = { name: 'MongoDB Prototcol', schemes: ['mongodb'] } - ], + ] +}; + +// Adjust config via environment variables +if (process.env.SCOUT_INSTALLER_UNSIGNED !== undefined) { + PACKAGER_CONFIG.sign = null; +} + +// @todo (imlucas): Standardize `electron-installer-dmg` +// options w/ `electron-installer-squirrel-windows`. +var INSTALLER_CONFIG = { + name: pkg.product_name, + out: path.resolve(__dirname, '../dist'), + icon: path.resolve(__dirname, '../images/darwin/scout.icns'), + appPath: APP_PATH, + overwrite: true, + background: path.resolve(__dirname, '../images/darwin/background.png'), // The following only modifies "x","y" values from defaults contents: [ { @@ -55,15 +69,6 @@ var CONFIG = module.exports = { ] }; -module.exports.RESOURCES = path.join(APP_PATH, 'Contents', 'Resources'); - -// Adjust config via environment variables -if (process.env.SCOUT_INSTALLER_UNSIGNED !== undefined) { - CONFIG.sign = null; -} - -debug('packager config: ', JSON.stringify(CONFIG, null, 2)); - module.exports.build = function(done) { fs.exists(APP_PATH, function(exists) { if (exists) { @@ -71,12 +76,12 @@ module.exports.build = function(done) { return done(); } debug('running packager to create electron binaries...'); - packager(CONFIG, done); + packager(PACKAGER_CONFIG, done); }); }; var verify = function(done) { - var cmd = 'codesign --verify "' + CONFIG.appPath + '"'; + var cmd = 'codesign --verify "' + PACKAGER_CONFIG.appPath + '"'; debug('Running', cmd); cp.exec(cmd, done); }; @@ -85,11 +90,11 @@ module.exports.installer = function(done) { debug('creating installer...'); var tasks = []; - if (CONFIG.sign) { + if (PACKAGER_CONFIG.sign) { tasks.push(verify); } - tasks.push(_.partial(createDMG, CONFIG)); + tasks.push(_.partial(createDMG, INSTALLER_CONFIG)); series(tasks, function(err) { if (err) { diff --git a/tasks/win32.js b/tasks/win32.js index 90d29c6cdc2..9193422d3e5 100644 --- a/tasks/win32.js +++ b/tasks/win32.js @@ -14,11 +14,11 @@ var PACKAGER_CONFIG = { dir: path.resolve(__dirname, '../build'), out: path.resolve(__dirname, '../dist'), platform: 'win32', - ignore: new RegExp('(scout-server.asar|node_modules/scout-server)'), arch: 'x64', version: pkg.electron_version, icon: path.resolve(__dirname, '../images/win32/scout.icon'), overwrite: true, + prune: true, 'version-string': { CompanyName: 'MongoDB Inc.', LegalCopyright: '2015 MongoDB Inc.', @@ -29,6 +29,7 @@ var PACKAGER_CONFIG = { InternalName: pkg.name } }; + var INSTALLER_CONFIG = { name: 'MongoDBScout', path: APP_PATH, From 9f40931f6c4d92aa29bf1b90b8c79a298b9fdb05 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Mon, 7 Sep 2015 22:31:51 -0400 Subject: [PATCH 46/46] better debug msg when verifying code signature on darwin --- tasks/darwin.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/darwin.js b/tasks/darwin.js index c24ae3d9a51..78a87b7b1e7 100644 --- a/tasks/darwin.js +++ b/tasks/darwin.js @@ -81,8 +81,8 @@ module.exports.build = function(done) { }; var verify = function(done) { - var cmd = 'codesign --verify "' + PACKAGER_CONFIG.appPath + '"'; - debug('Running', cmd); + var cmd = 'codesign --verify "' + APP_PATH + '"'; + debug('Verifying `%s` has been signed...', APP_PATH); cp.exec(cmd, done); };