diff --git a/src/build/index.js b/src/build/index.js index 1ce756b4..e2cffc9b 100644 --- a/src/build/index.js +++ b/src/build/index.js @@ -102,8 +102,13 @@ exports.build = function (appPath, argv, cb) { return logger.error('another build is already in progress'); } - logger.error(err); - logger.log('build failed'); + logger.info('build failed'); + logger.error('exception: ' + err.stack); + if (process.send) { + process.send({ + err: err.stack + }); + } process.exit(1); }) .success(function () { diff --git a/src/serve/appRoutes.js b/src/serve/appRoutes.js index 8252cebb..962c0512 100644 --- a/src/serve/appRoutes.js +++ b/src/serve/appRoutes.js @@ -115,6 +115,12 @@ exports.addToAPI = function (opts, api) { ); }); } + }) + .catch(function(e) { + logger.error('Error building app', e); + res.status(500).send({ + message: e + }); }); }) .catch(function (e) { diff --git a/src/serve/buildQueue.js b/src/serve/buildQueue.js index acff9687..0f78c5ed 100644 --- a/src/serve/buildQueue.js +++ b/src/serve/buildQueue.js @@ -74,7 +74,7 @@ var BuildItem = Class(function () { logger.log('starting build', this.appPath, this.buildOpts.target); - this._build = childProcess.fork(buildFork, [(args)]) + this._build = childProcess.fork(buildFork, [args]) .on('message', this._onFinish.bind(this)) .on('close', this._onClose.bind(this)); }; @@ -118,7 +118,9 @@ var BuildItem = Class(function () { // if the fork terminated normally, done will be true here if (this.done) { return; } - this._reject({message: 'build failed'}); + this._reject({ + message: 'build failed (closed before done)' + }); this.done = true; if (this._onStop) { this._onStop(); diff --git a/src/web/Simulator.js b/src/web/Simulator.js index 5e27a5d9..d639a423 100644 --- a/src/web/Simulator.js +++ b/src/web/Simulator.js @@ -234,6 +234,14 @@ var Simulator = exports = Class(function () { }, function (err) { this.logger.error('Unable to simulate', this._app); this.logger.error(err); + + this._requiresHardRebuild = true; + + if (err.response && err.response.message) { + this._ui.showBuildFailed(err.response.message); + } else { + this._ui.showBuildFailed('Unknown failure, please check devkit server logs.'); + } }); }); diff --git a/src/web/stylesheets/simulator.styl b/src/web/stylesheets/simulator.styl index 882c8a9b..e81e230d 100644 --- a/src/web/stylesheets/simulator.styl +++ b/src/web/stylesheets/simulator.styl @@ -295,6 +295,16 @@ else width 100% height 100% + #buildFailedContainer + position absolute + top 0px + left 0px + width 100% + height 100% + padding 20px + background rgba(40, 0, 0, 0.7) + word-wrap break-word + .spinnerContainer position absolute top 0px diff --git a/src/web/ui/Chrome.js b/src/web/ui/Chrome.js index 12e3af00..cd7a018a 100644 --- a/src/web/ui/Chrome.js +++ b/src/web/ui/Chrome.js @@ -60,6 +60,10 @@ exports = Class(CenterLayout, function (supr) { {id: 'background', type: FrameBackground}, {id: 'splashImage'}, {id: 'resizeHandle'}, + {id: 'buildFailedContainer', children: [ + {tag: 'h3', text: 'Build failed'}, + {id: 'buildFailedMessage', tag: 'p', text: ''} + ]}, {id: 'build-spinner', class: 'spinnerContainer', children: [ {class: 'spinner'}, {tag: 'p', text: 'Building app'} @@ -90,6 +94,8 @@ exports = Class(CenterLayout, function (supr) { this.buildWidget = function () { supr(this, 'buildWidget', arguments); + $.style(this['buildFailedContainer'], {display: 'none'}); + var opts = this._opts; this._validOrientations = {}; @@ -223,10 +229,11 @@ exports = Class(CenterLayout, function (supr) { }; this.setBuilding = function (isBuilding) { - // Make sure we remove game simulation overhead when building this.setPaused(isBuilding); + $.style(this['buildFailedContainer'], {display: 'none'}); + var spinner = this['build-spinner']; if (!isBuilding) { @@ -245,6 +252,13 @@ exports = Class(CenterLayout, function (supr) { } }; + this.showBuildFailed = function(msg) { + $.style(this['buildFailedContainer'], {display: 'block'}); + $.removeClass(this['build-spinner'], 'visible'); + + $.setText(this.buildFailedMessage, msg); + }; + this._onMenuOpen = function (menu) { $.addClass(this.toolbar, 'menu-open'); if (menu == this.overflowMenu) {