implement the version menu

This commit is contained in:
Eugene Mirotin 2017-03-22 13:50:06 +03:00
parent 3619b2f117
commit b629c3601e
4 changed files with 121 additions and 28 deletions

View File

@ -15,14 +15,48 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
var commandOptions, stepHandler; var commandOptions, formatVersion, resolveVersion, stepHandler;
commandOptions = require('./command-options'); commandOptions = require('./command-options');
formatVersion = function(v, isRecommended) {
var result;
result = "v" + v;
if (isRecommended) {
result += ' (recommended)';
}
return result;
};
resolveVersion = function(deviceType, version) {
var form, resin;
if (version !== 'menu') {
return Promise.resolve(version);
}
form = require('resin-cli-form');
resin = require('resin-sdk-preconfigured');
return resin.models.os.getSupportedVersions(deviceType).then(function(arg) {
var choices, recommended, versions;
versions = arg.versions, recommended = arg.recommended;
choices = versions.map(function(v) {
return {
value: v,
name: formatVersion(v, v === recommended)
};
});
return form.ask({
message: 'Select the OS version:',
type: 'list',
choices: choices,
"default": recommended
});
});
};
exports.download = { exports.download = {
signature: 'os download <type>', signature: 'os download <type>',
description: 'download an unconfigured os image', description: 'download an unconfigured os image',
help: 'Use this command to download an unconfigured os image for a certain device type.\nIf version is not specified the newest stable (non-pre-release) version of OS\nis downloaded if available, or the newest version otherwise (if all existing\nversions for the given device type are pre-release).\n\nExamples:\n\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version 1.24.1\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version ^1.20.0\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version latest\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version default', help: 'Use this command to download an unconfigured os image for a certain device type.\n\nIf version is not specified the newest stable (non-pre-release) version of OS\nis downloaded if available, or the newest version otherwise (if all existing\nversions for the given device type are pre-release).\n\nYou can pass `--version menu` to pick the OS version from the interactive menu\nof all available versions.\n\nExamples:\n\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version 1.24.1\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version ^1.20.0\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version latest\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version default\n $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version menu',
permission: 'user', permission: 'user',
options: [ options: [
{ {
@ -33,27 +67,32 @@ exports.download = {
required: 'You have to specify the output location' required: 'You have to specify the output location'
}, { }, {
signature: 'version', signature: 'version',
description: "exact version number, or a valid semver range,\nor 'latest' (includes pre-releases),\nor 'default' (excludes pre-releases if at least one stable version is available),\nor 'recommended' (excludes pre-releases, will fail if only pre-release versions are available)", description: "exact version number, or a valid semver range,\nor 'latest' (includes pre-releases),\nor 'default' (excludes pre-releases if at least one stable version is available),\nor 'recommended' (excludes pre-releases, will fail if only pre-release versions are available),\nor 'menu' (will show the interactive menu)",
parameter: 'version' parameter: 'version'
} }
], ],
action: function(params, options, done) { action: function(params, options, done) {
var displayVersion, fs, manager, rindle, unzip, version, visuals; var Promise, displayVersion, fs, manager, rindle, unzip, visuals;
Promise = require('bluebird');
unzip = require('unzip2'); unzip = require('unzip2');
fs = require('fs'); fs = require('fs');
rindle = require('rindle'); rindle = require('rindle');
manager = require('resin-image-manager'); manager = require('resin-image-manager');
visuals = require('resin-cli-visuals'); visuals = require('resin-cli-visuals');
console.info("Getting device operating system for " + params.type); console.info("Getting device operating system for " + params.type);
version = options.version; displayVersion = '';
if (!version) { return Promise["try"](function() {
version = 'default'; if (!options.version) {
displayVersion = ''; console.warn('OS version is not specified, using the default version: the newest stable (non-pre-release) version if available, or the newest version otherwise (if all existing versions for the given device type are pre-release).');
console.warn('OS version is not specified, using the default version: the newest stable (non-pre-release) version if available, or the newest version otherwise (if all existing versions for the given device type are pre-release)'); return 'default';
} else { }
displayVersion = " " + version; return resolveVersion(params.type, options.version);
} }).then(function(version) {
return manager.get(params.type, version).then(function(stream) { if (version !== 'default') {
displayVersion = " " + version;
}
return manager.get(params.type, version);
}).then(function(stream) {
var bar, output, spinner; var bar, output, spinner;
bar = new visuals.Progress("Downloading Device OS" + displayVersion); bar = new visuals.Progress("Downloading Device OS" + displayVersion);
spinner = new visuals.Spinner("Downloading Device OS" + displayVersion + " (size unknown)"); spinner = new visuals.Spinner("Downloading Device OS" + displayVersion + " (size unknown)");

View File

@ -784,9 +784,21 @@ device uuid
Use this command to download an unconfigured os image for a certain device type. Use this command to download an unconfigured os image for a certain device type.
If version is not specified the newest stable (non-pre-release) version of OS
is downloaded if available, or the newest version otherwise (if all existing
versions for the given device type are pre-release).
You can pass `--version menu` to pick the OS version from the interactive menu
of all available versions.
Examples: Examples:
$ resin os download parallella -o ../foo/bar/parallella.img $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version 1.24.1
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version ^1.20.0
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version latest
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version default
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version menu
### Options ### Options
@ -794,6 +806,14 @@ Examples:
output path output path
#### --version &#60;version&#62;
exact version number, or a valid semver range,
or 'latest' (includes pre-releases),
or 'default' (excludes pre-releases if at least one stable version is available),
or 'recommended' (excludes pre-releases, will fail if only pre-release versions are available),
or 'menu' (will show the interactive menu)
## os configure &#60;image&#62; &#60;uuid&#62; ## os configure &#60;image&#62; &#60;uuid&#62;
Use this command to configure a previously download operating system image with a device. Use this command to configure a previously download operating system image with a device.

View File

@ -16,15 +16,44 @@ limitations under the License.
commandOptions = require('./command-options') commandOptions = require('./command-options')
formatVersion = (v, isRecommended) ->
result = "v#{v}"
if isRecommended
result += ' (recommended)'
return result
resolveVersion = (deviceType, version) ->
if version isnt 'menu'
return Promise.resolve(version)
form = require('resin-cli-form')
resin = require('resin-sdk-preconfigured')
resin.models.os.getSupportedVersions(deviceType)
.then ({ versions, recommended }) ->
choices = versions.map (v) ->
value: v
name: formatVersion(v, v is recommended)
return form.ask
message: 'Select the OS version:'
type: 'list'
choices: choices
default: recommended
exports.download = exports.download =
signature: 'os download <type>' signature: 'os download <type>'
description: 'download an unconfigured os image' description: 'download an unconfigured os image'
help: ''' help: '''
Use this command to download an unconfigured os image for a certain device type. Use this command to download an unconfigured os image for a certain device type.
If version is not specified the newest stable (non-pre-release) version of OS If version is not specified the newest stable (non-pre-release) version of OS
is downloaded if available, or the newest version otherwise (if all existing is downloaded if available, or the newest version otherwise (if all existing
versions for the given device type are pre-release). versions for the given device type are pre-release).
You can pass `--version menu` to pick the OS version from the interactive menu
of all available versions.
Examples: Examples:
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img
@ -32,6 +61,7 @@ exports.download =
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version ^1.20.0 $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version ^1.20.0
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version latest $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version latest
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version default $ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version default
$ resin os download raspberrypi3 -o ../foo/bar/raspberry-pi.img --version menu
''' '''
permission: 'user' permission: 'user'
options: [ options: [
@ -48,12 +78,14 @@ exports.download =
exact version number, or a valid semver range, exact version number, or a valid semver range,
or 'latest' (includes pre-releases), or 'latest' (includes pre-releases),
or 'default' (excludes pre-releases if at least one stable version is available), or 'default' (excludes pre-releases if at least one stable version is available),
or 'recommended' (excludes pre-releases, will fail if only pre-release versions are available) or 'recommended' (excludes pre-releases, will fail if only pre-release versions are available),
or 'menu' (will show the interactive menu)
""" """
parameter: 'version' parameter: 'version'
} }
] ]
action: (params, options, done) -> action: (params, options, done) ->
Promise = require('bluebird')
unzip = require('unzip2') unzip = require('unzip2')
fs = require('fs') fs = require('fs')
rindle = require('rindle') rindle = require('rindle')
@ -62,18 +94,20 @@ exports.download =
console.info("Getting device operating system for #{params.type}") console.info("Getting device operating system for #{params.type}")
version = options.version displayVersion = ''
if not version Promise.try ->
version = 'default' if not options.version
displayVersion = '' console.warn('OS version is not specified, using the default version:
console.warn('OS version is not specified, using the default version: the newest stable (non-pre-release) version if available,
the newest stable (non-pre-release) version if available, or the newest version otherwise (if all existing
or the newest version otherwise (if all existing versions for the given device type are pre-release).')
versions for the given device type are pre-release)') return 'default'
else return resolveVersion(params.type, options.version)
displayVersion = " #{version}" .then (version) ->
if version isnt 'default'
manager.get(params.type, version).then (stream) -> displayVersion = " #{version}"
return manager.get(params.type, version)
.then (stream) ->
bar = new visuals.Progress("Downloading Device OS#{displayVersion}") bar = new visuals.Progress("Downloading Device OS#{displayVersion}")
spinner = new visuals.Spinner("Downloading Device OS#{displayVersion} (size unknown)") spinner = new visuals.Spinner("Downloading Device OS#{displayVersion} (size unknown)")

View File

@ -63,7 +63,7 @@
"resin-device-init": "^2.1.0", "resin-device-init": "^2.1.0",
"resin-image-fs": "^2.1.2", "resin-image-fs": "^2.1.2",
"resin-image-manager": "resin-io/resin-image-manager#36-versioned-downloads", "resin-image-manager": "resin-io/resin-image-manager#36-versioned-downloads",
"resin-sdk-preconfigured": "^0.1.0", "resin-sdk-preconfigured": "resin-io-modules/resin-sdk-preconfigured#update-sdk",
"resin-settings-client": "^3.5.0", "resin-settings-client": "^3.5.0",
"resin-sync": "^7.0.0", "resin-sync": "^7.0.0",
"rimraf": "^2.4.3", "rimraf": "^2.4.3",