feat(pre): add option to provide own commit message analyzer

This commit is contained in:
Stephan Bönnemann 2015-04-22 17:15:10 +02:00
parent 29469e0b8a
commit e445effdcf
6 changed files with 53 additions and 31 deletions

View File

@ -1,6 +1,8 @@
#!/usr/bin/env node
'use strict'
var readFile = require('fs').readFileSync
var abbrev = require('abbrev')
var minimist = require('minimist')
@ -21,6 +23,8 @@ var argv = minimist(process.argv.slice(2), {
}
})
var plugins = JSON.parse(readFile('./package.json')).release || {}
var npmArgv = process.env.npm_config_argv ?
minimist(JSON.parse(process.env.npm_config_argv).cooked) :
{_: []}
@ -46,7 +50,7 @@ if (~argv._.indexOf('pre')) {
// require a correct setup during publish
if (publish && !argv.debug && !require('../src/verify')(argv)) process.exit(1)
require('../src/pre')(argv, efh(function (result) {
require('../src/pre')(argv, plugins, efh(function (result) {
if (!result) {
console.log('Nothing changed. Not publishing.')
process.exit(1)

View File

@ -1,9 +1,21 @@
'use strict'
var parseRawCommit = require('conventional-changelog/lib/git').parseRawCommit
module.exports = function (commits) {
var type = null
commits.every(function (commit) {
commits
.map(function (commit) {
return parseRawCommit(commit.hash + '\n' + commit.message)
})
.filter(function (commit) {
return !!commit
})
.every(function (commit) {
if (commit.breaks.length) {
type = 'major'
return false

27
lib/commits.js Normal file
View File

@ -0,0 +1,27 @@
'use strict'
var exec = require('child_process').exec
var efh = require('./error').efh
module.exports = function (from, cb) {
var range = (from ? from + '..' : '') + 'HEAD'
exec(
'git log -E --format=%H==SPLIT==%s==END== ' + range,
efh(cb)(function (stdout) {
cb(null, String(stdout).split('==END==\n')
.filter(function (raw) {
return !!raw.trim()
})
.map(function (raw) {
var data = raw.split('==SPLIT==')
return {
hash: data[0],
message: data[1]
}
}))
})
)
}

View File

@ -1,15 +0,0 @@
'use strict'
var git = require('conventional-changelog/lib/git')
var efh = require('../error').efh
module.exports = function (from, cb) {
git.getCommits({
log: console.log.bind(console),
warn: console.warn.bind(console),
from: from
}, efh(cb)(function (commits) {
cb(null, commits)
}))
}

View File

@ -1,11 +0,0 @@
'use strict'
var analyze = require('./analyze')
var commits = require('./commits')
var efh = require('../error').efh
module.exports = function (gitHead, cb) {
commits(gitHead, efh(cb)(function (commits) {
cb(null, analyze(commits))
}))
}

View File

@ -4,16 +4,21 @@ var fs = require('fs')
var semver = require('semver')
var type = require('../lib/type')
var getCommits = require('../lib/commits')
var npmInfo = require('../lib/npm-info')
var efh = require('../lib/error').efh
module.exports = function (options, cb) {
module.exports = function (options, plugins, cb) {
var path = './package.json'
var pkg = JSON.parse(fs.readFileSync(path))
if (!pkg.name) return cb(new Error('Package must have a name'))
npmInfo(pkg.name, efh(cb)(function (res) {
type(res.gitHead, efh(cb)(function (type) {
getCommits(res.gitHead, efh(cb)(function (commits) {
var analyzer = require(plugins.analyzer || '../lib/analyzer')
var type = analyzer(commits)
if (!type) return cb(null, null)
pkg.version = !res.version ? '1.0.0' : semver.inc(res.version, type)
if (!options.debug) fs.writeFileSync(path, JSON.stringify(pkg, null, 2))