From 0ee9cc31e97f0565a57e39551de3d921f3ba5cd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6nnemann?= Date: Mon, 2 Feb 2015 04:13:21 +0100 Subject: [PATCH] feat(pre): add initial version of command --- lib/type/analyze.js | 20 ++++++++++++++++++++ lib/type/commits.js | 14 ++++++++++++++ lib/type/index.js | 12 ++++++++++++ lib/version.js | 18 ++++++++++++++++++ src/pre.js | 26 ++++++++++++++++++++++++++ 5 files changed, 90 insertions(+) create mode 100644 lib/type/analyze.js create mode 100644 lib/type/commits.js create mode 100644 lib/type/index.js create mode 100644 lib/version.js create mode 100644 src/pre.js diff --git a/lib/type/analyze.js b/lib/type/analyze.js new file mode 100644 index 00000000..966bb833 --- /dev/null +++ b/lib/type/analyze.js @@ -0,0 +1,20 @@ +'use strict' + +module.exports = function (commits) { + var type = null + + commits.every(function (commit) { + if (commit.breaks.length) { + type = 'major' + return false + } + + if (commit.type === 'feat') type = 'minor' + + if (!type && commit.type === 'fix') type = 'patch' + + return true + }) + + return type +} diff --git a/lib/type/commits.js b/lib/type/commits.js new file mode 100644 index 00000000..5cbe98e1 --- /dev/null +++ b/lib/type/commits.js @@ -0,0 +1,14 @@ +'use strict' + +var git = require('conventional-changelog/lib/git') + +module.exports = function (cb) { + git.latestTag(function (err, from) { + if (err) return cb(err) + + git.getCommits({from: from}, function (err, commits) { + if (err) return cb(err) + cb(null, commits) + }) + }) +} diff --git a/lib/type/index.js b/lib/type/index.js new file mode 100644 index 00000000..e17115ae --- /dev/null +++ b/lib/type/index.js @@ -0,0 +1,12 @@ +'use strict' + +var commits = require('./commits') +var analyze = require('./analyze') + +module.exports = function (cb) { + commits(function (err, commits) { + if (err) return cb(err) + + cb(null, analyze(commits)) + }) +} diff --git a/lib/version.js b/lib/version.js new file mode 100644 index 00000000..bc0d0a14 --- /dev/null +++ b/lib/version.js @@ -0,0 +1,18 @@ +'use strict' + +var exec = require('child_process').exec +var unlink = require('fs').unlinkSync + +module.exports = function (pkg, cb) { + if (!pkg.name) return cb('Package must have a name') + + exec('npm show ' + pkg.name + ' version', function(err, stdout, stderr) { + if (err) unlink('./npm-debug.log') + + if (err && /is not in the npm registry/m.test(stderr)) return cb(null, null, true) + + if (err) return cb(err) + + cb(null, stdout.trim()) + }) +} diff --git a/src/pre.js b/src/pre.js new file mode 100644 index 00000000..4ecdf919 --- /dev/null +++ b/src/pre.js @@ -0,0 +1,26 @@ +'use strict' + +var fs = require('fs') + +var semver = require('semver') + +var type = require('../lib/type') +var version = require('../lib/version') + +module.exports = function (options, cb) { + type(function (err, type) { + if (err) return cb(err) + if (!type) return cb(null, null) + + var path = './package.json' + var pkg = JSON.parse(fs.readFileSync(path)) + version(pkg, function (err, version, unpublished) { + if (err) return cb(err) + + pkg.version = unpublished ? '1.0.0' : semver.inc(version, type) + if (!options.debug) fs.writeFileSync(path, JSON.stringify(pkg, null, 2)) + + cb(null, pkg.version) + }) + }) +}