From 494da7f8c5b35f491f22a986ff5e8c456cc0e602 Mon Sep 17 00:00:00 2001 From: David Dias Date: Sun, 18 Feb 2018 10:15:10 +0100 Subject: [PATCH] feat: `ipfs version` flags + `ipfs repo version` (#1181) (#1188) --- src/cli/commands/version.js | 35 +++++++++++++++--- src/core/components/repo.js | 20 +++++++++- src/core/components/version.js | 15 ++++++-- test/cli/files.js | 2 +- test/cli/repo.js | 21 +++++++++++ test/cli/version.js | 53 +++++++++++++++++++++++++-- test/sharness/t0010-basic-commands.sh | 5 ++- 7 files changed, 135 insertions(+), 16 deletions(-) create mode 100644 test/cli/repo.js diff --git a/src/cli/commands/version.js b/src/cli/commands/version.js index 6d9ecb45d4..6bb8447a2f 100644 --- a/src/cli/commands/version.js +++ b/src/cli/commands/version.js @@ -1,5 +1,6 @@ 'use strict' +const os = require('os') const print = require('../utils').print module.exports = { @@ -11,26 +12,48 @@ module.exports = { number: { alias: 'n', type: 'boolean', - default: false + default: false, + describe: 'Print only the version number' }, commit: { type: 'boolean', - default: false + default: false, + describe: `Include the version's commit hash` }, repo: { type: 'boolean', - default: false + default: false, + describe: `Print only the repo's version number` + }, + all: { + type: 'boolean', + default: false, + describe: 'Print everything we have' } }, handler (argv) { - // TODO: handle argv.{repo|commit|number} - argv.ipfs.version((err, version) => { + argv.ipfs.version((err, data) => { if (err) { throw err } - print(`js-ipfs version: ${version.version}`) + const withCommit = argv.all || argv.commit + const parsedVersion = `${data.version}${withCommit ? `-${data.commit}` : ''}` + + if (argv.repo) { + // go-ipfs prints only the number, even without the --number flag. + print(data.repo) + } else if (argv.number) { + print(parsedVersion) + } else if (argv.all) { + print(`js-ipfs version: ${parsedVersion}`) + print(`Repo version: ${data.repo}`) + print(`System version: ${os.arch()}/${os.platform()}`) + print(`Node.js version: ${process.version}`) + } else { + print(`js-ipfs version: ${parsedVersion}`) + } }) } } diff --git a/src/core/components/repo.js b/src/core/components/repo.js index 989e07fd9e..dc330aba0e 100644 --- a/src/core/components/repo.js +++ b/src/core/components/repo.js @@ -1,6 +1,7 @@ 'use strict' const promisify = require('promisify-es6') +const repoVersion = require('ipfs-repo').repoVersion module.exports = function repo (self) { return { @@ -8,8 +9,25 @@ module.exports = function repo (self) { // 1. check if repo already exists }, + /** + * If the repo has been initialized, report the current version. + * Otherwise report the version that would be initialized. + * + * @param {function(Error, Number)} [callback] + * @returns {undefined} + */ version: promisify((callback) => { - self._repo.version.get(callback) + self._repo._isInitialized(err => { + if (err) { + if (/ENOENT|not yet initialized/.test(err.message)) { + // this repo has not been initialized + return callback(null, repoVersion) + } + return callback(err) + } + + self._repo.version.get(callback) + }) }), gc: () => {}, diff --git a/src/core/components/version.js b/src/core/components/version.js index 1d1fcca9c5..1afbc7a7fb 100644 --- a/src/core/components/version.js +++ b/src/core/components/version.js @@ -3,6 +3,7 @@ const pkg = require('../../../package.json') const promisify = require('promisify-es6') +// TODO add the commit hash of the current ipfs version to the response. module.exports = function version (self) { return promisify((opts, callback) => { if (typeof opts === 'function') { @@ -10,10 +11,16 @@ module.exports = function version (self) { opts = {} } - callback(null, { - version: pkg.version, - repo: '', - commit: '' + self.repo.version((err, repoVersion) => { + if (err) { + callback(err) + } + + callback(null, { + version: pkg.version, + repo: repoVersion, + commit: '' + }) }) }) } diff --git a/test/cli/files.js b/test/cli/files.js index 738b07e317..9fa95a0401 100644 --- a/test/cli/files.js +++ b/test/cli/files.js @@ -1,8 +1,8 @@ /* eslint-env mocha */ 'use strict' -const expect = require('chai').expect const fs = require('fs') +const expect = require('chai').expect const path = require('path') const compareDir = require('dir-compare').compareSync const rimraf = require('rimraf').sync diff --git a/test/cli/repo.js b/test/cli/repo.js new file mode 100644 index 0000000000..17c04aaaa3 --- /dev/null +++ b/test/cli/repo.js @@ -0,0 +1,21 @@ +/* eslint-env mocha */ +'use strict' + +const expect = require('chai').expect +const repoVersion = require('ipfs-repo').repoVersion + +const runOnAndOff = require('../utils/on-and-off') + +describe('repo', () => runOnAndOff((thing) => { + let ipfs + + before(() => { + ipfs = thing.ipfs + }) + + it('get the repo version', () => { + return ipfs('repo version').then((out) => { + expect(out).to.eql(`${repoVersion}\n`) + }) + }) +})) diff --git a/test/cli/version.js b/test/cli/version.js index 44986adf77..5bf740eb15 100644 --- a/test/cli/version.js +++ b/test/cli/version.js @@ -1,7 +1,10 @@ +/* eslint max-nested-callbacks: ["error", 5] */ /* eslint-env mocha */ 'use strict' +const os = require('os') const expect = require('chai').expect +const repoVersion = require('ipfs-repo').repoVersion const pkgversion = require('../../package.json').version const runOnAndOff = require('../utils/on-and-off') @@ -12,11 +15,55 @@ describe('version', () => runOnAndOff((thing) => { ipfs = thing.ipfs }) - it('get the version', () => { - return ipfs('version').then((out) => { + it('get the version', () => + ipfs('version').then(out => expect(out).to.eql( `js-ipfs version: ${pkgversion}\n` ) - }) + ) + ) + + it('handles --number', () => + ipfs('version --number').then(out => + expect(out).to.eql(`${pkgversion}\n`) + ) + ) + + it('handles --commit', () => + ipfs('version --commit').then(out => + expect(out).to.eql(`js-ipfs version: ${pkgversion}-\n`) + ) + ) + + describe('handles --all', function () { + it('prints js-ipfs version', () => + ipfs('version --all').then(out => { + expect(out).to.include(`js-ipfs version: ${pkgversion}`) + }) + ) + + it('prints repo version', () => + ipfs('version --all').then(out => { + expect(out).to.include(`Repo version: ${repoVersion}`) + }) + ) + + it('prints arch/platform', () => + ipfs('version --all').then(out => { + expect(out).to.include(`System version: ${os.arch()}/${os.platform()}`) + }) + ) + + it('prints Node.js version', () => + ipfs('version --all').then(out => { + expect(out).to.include(`Node.js version: ${process.version}`) + }) + ) }) + + it('handles --repo', () => + ipfs('version --repo').then(out => + expect(out).to.eql(`${repoVersion}\n`) + ) + ) })) diff --git a/test/sharness/t0010-basic-commands.sh b/test/sharness/t0010-basic-commands.sh index 402485051b..92f4354fdd 100755 --- a/test/sharness/t0010-basic-commands.sh +++ b/test/sharness/t0010-basic-commands.sh @@ -28,7 +28,10 @@ test_expect_success "ipfs version output looks good" ' test_expect_success "ipfs version --all has all required fields" ' ipfs version --all > version_all.txt && - grep "js-ipfs version" version_all.txt + grep "js-ipfs version" version_all.txt && + grep "Repo version" version_all.txt && + grep "System version" version_all.txt && + grep "Node.js version" version_all.txt ' test_expect_success "ipfs help succeeds" '