You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.1 KiB
91 lines
2.1 KiB
'use strict'
|
|
|
|
const dargs = require('dargs')
|
|
const execFile = require('child_process').execFile
|
|
const split = require('split2')
|
|
const stream = require('stream')
|
|
const template = require('lodash/template')
|
|
const through = require('through2')
|
|
|
|
const DELIMITER = '------------------------ >8 ------------------------'
|
|
|
|
function normalizeExecOpts (execOpts) {
|
|
execOpts = execOpts || {}
|
|
execOpts.cwd = execOpts.cwd || process.cwd()
|
|
return execOpts
|
|
}
|
|
|
|
function normalizeGitOpts (gitOpts) {
|
|
gitOpts = gitOpts || {}
|
|
gitOpts.format = gitOpts.format || '%B'
|
|
gitOpts.from = gitOpts.from || ''
|
|
gitOpts.to = gitOpts.to || 'HEAD'
|
|
return gitOpts
|
|
}
|
|
|
|
function getGitArgs (gitOpts) {
|
|
const gitFormat = template('--format=<%= format %>%n' + DELIMITER)(gitOpts)
|
|
const gitFromTo = [gitOpts.from, gitOpts.to].filter(Boolean).join('..')
|
|
|
|
const gitArgs = ['log', gitFormat, gitFromTo]
|
|
.concat(dargs(gitOpts, {
|
|
excludes: ['debug', 'from', 'to', 'format', 'path']
|
|
}))
|
|
|
|
// allow commits to focus on a single directory
|
|
// this is useful for monorepos.
|
|
if (gitOpts.path) {
|
|
gitArgs.push('--', gitOpts.path)
|
|
}
|
|
|
|
return gitArgs
|
|
}
|
|
|
|
function gitRawCommits (rawGitOpts, rawExecOpts) {
|
|
const readable = new stream.Readable()
|
|
readable._read = function () {}
|
|
|
|
const gitOpts = normalizeGitOpts(rawGitOpts)
|
|
const execOpts = normalizeExecOpts(rawExecOpts)
|
|
const args = getGitArgs(gitOpts)
|
|
|
|
if (gitOpts.debug) {
|
|
gitOpts.debug('Your git-log command is:\ngit ' + args.join(' '))
|
|
}
|
|
|
|
let isError = false
|
|
|
|
const child = execFile('git', args, {
|
|
cwd: execOpts.cwd,
|
|
maxBuffer: Infinity
|
|
})
|
|
|
|
child.stdout
|
|
.pipe(split(DELIMITER + '\n'))
|
|
.pipe(through(function (chunk, enc, cb) {
|
|
readable.push(chunk)
|
|
isError = false
|
|
|
|
cb()
|
|
}, function (cb) {
|
|
setImmediate(function () {
|
|
if (!isError) {
|
|
readable.push(null)
|
|
readable.emit('close')
|
|
}
|
|
|
|
cb()
|
|
})
|
|
}))
|
|
|
|
child.stderr
|
|
.pipe(through.obj(function (chunk) {
|
|
isError = true
|
|
readable.emit('error', new Error(chunk))
|
|
readable.emit('close')
|
|
}))
|
|
|
|
return readable
|
|
}
|
|
|
|
module.exports = gitRawCommits
|
|
|