Implement self update functionality and notification

This commit is contained in:
Juan Cruz Viotti 2015-03-04 14:40:40 -04:00
parent 9038b76d73
commit 06020c0344
7 changed files with 80 additions and 5 deletions

View File

@ -26,10 +26,11 @@
}, function(data, lite, callback) { }, function(data, lite, callback) {
var newVersion; var newVersion;
if (_.isEmpty(data)) { if (_.isEmpty(data)) {
return done(new Error('You are already running the latest version')); return callback(new Error('You are already running the latest version'));
} }
newVersion = _.last(_.first(_.last(data)).split('@')); newVersion = _.last(_.first(_.last(data)).split('@'));
return console.info("Upgraded " + packageJSON.name + " to v" + newVersion + "."); console.info("Upgraded " + packageJSON.name + " to v" + newVersion + ".");
return callback();
} }
], done); ], done);
} }

View File

@ -1,5 +1,5 @@
(function() { (function() {
var _, actions, async, capitano, changeProjectDirectory, errors, plugins, resin; var _, actions, async, capitano, changeProjectDirectory, errors, plugins, resin, update;
_ = require('lodash'); _ = require('lodash');
@ -15,6 +15,8 @@
plugins = require('./plugins'); plugins = require('./plugins');
update = require('./update');
capitano.permission('user', function(done) { capitano.permission('user', function(done) {
return resin.auth.isLoggedIn(function(isLoggedIn) { return resin.auth.isLoggedIn(function(isLoggedIn) {
if (!isLoggedIn) { if (!isLoggedIn) {
@ -145,6 +147,8 @@
async.waterfall([ async.waterfall([
function(callback) { function(callback) {
return update.check(callback);
}, function(callback) {
return plugins.register('resin-plugin-', callback); return plugins.register('resin-plugin-', callback);
}, function(callback) { }, function(callback) {
var dataPrefix; var dataPrefix;

37
build/update.js Normal file
View File

@ -0,0 +1,37 @@
(function() {
var packageJSON, updateAction, updateNotifier;
updateNotifier = require('update-notifier');
packageJSON = require('../package.json');
updateAction = require('./actions/update');
exports.perform = function(callback) {
return updateAction.update.action(null, null, callback);
};
exports.notify = function(update) {
if (!process.stdout.isTTY) {
return;
}
return console.log("> Major update available: " + update.current + " -> " + update.latest + "\n> Run resin update to update.\n> Beware that a major release might introduce breaking changes.\n");
};
exports.check = function(callback) {
var notifier;
notifier = updateNotifier({
pkg: packageJSON
});
if (notifier.update == null) {
return callback();
}
if (notifier.update.type === 'major') {
exports.notify(notifier.update);
return callback();
}
console.log("Performing " + notifier.update.type + " update, hold tight...");
return exports.perform(callback);
};
}).call(this);

View File

@ -35,9 +35,11 @@ exports.update =
(data, lite, callback) -> (data, lite, callback) ->
if _.isEmpty(data) if _.isEmpty(data)
return done(new Error('You are already running the latest version')) return callback(new Error('You are already running the latest version'))
newVersion = _.last(_.first(_.last(data)).split('@')) newVersion = _.last(_.first(_.last(data)).split('@'))
console.info("Upgraded #{packageJSON.name} to v#{newVersion}.") console.info("Upgraded #{packageJSON.name} to v#{newVersion}.")
return callback()
], done) ], done)

View File

@ -5,6 +5,7 @@ resin = require('resin-sdk')
actions = require('./actions') actions = require('./actions')
errors = require('./errors') errors = require('./errors')
plugins = require('./plugins') plugins = require('./plugins')
update = require('./update')
capitano.permission 'user', (done) -> capitano.permission 'user', (done) ->
resin.auth.isLoggedIn (isLoggedIn) -> resin.auth.isLoggedIn (isLoggedIn) ->
@ -117,6 +118,9 @@ changeProjectDirectory = (directory) ->
async.waterfall([ async.waterfall([
(callback) ->
update.check(callback)
(callback) -> (callback) ->
plugins.register('resin-plugin-', callback) plugins.register('resin-plugin-', callback)

26
lib/update.coffee Normal file
View File

@ -0,0 +1,26 @@
updateNotifier = require('update-notifier')
packageJSON = require('../package.json')
updateAction = require('./actions/update')
exports.perform = (callback) ->
updateAction.update.action(null, null, callback)
exports.notify = (update) ->
return if not process.stdout.isTTY
console.log """
> Major update available: #{update.current} -> #{update.latest}
> Run resin update to update.
> Beware that a major release might introduce breaking changes.\n
"""
exports.check = (callback) ->
notifier = updateNotifier(pkg: packageJSON)
return callback() if not notifier.update?
if notifier.update.type is 'major'
exports.notify(notifier.update)
return callback()
console.log("Performing #{notifier.update.type} update, hold tight...")
exports.perform(callback)

View File

@ -63,6 +63,7 @@
"progress-stream": "^0.5.0", "progress-stream": "^0.5.0",
"resin-cli-visuals": "resin-io/resin-cli-visuals", "resin-cli-visuals": "resin-io/resin-cli-visuals",
"resin-sdk": "^0.0.1", "resin-sdk": "^0.0.1",
"underscore.string": "~2.4.0" "underscore.string": "~2.4.0",
"update-notifier": "^0.3.1"
} }
} }