ggit
Version:
Local promise-returning git command wrappers
139 lines (120 loc) • 3.28 kB
JavaScript
var Promise = require('bluebird')
var la = require('lazy-ass')
var check = require('check-more-types')
var exec = require('./exec')
var moment = require('moment-timezone')
var numstat = require('./commit-numstat')
var branchName = require('./branch-name')
var R = require('ramda')
var debug = require('debug')('ggit')
function cropString (n, s) {
if (s.length < n) {
return s
}
return s.substr(0, n) + '...'
}
/**
* Returns object with commit and default build information
*/
function defaultBuildInfo (id) {
var short = id.substr(0, 7)
var currentTime = moment()
var data = {
id: id,
short: short,
savedAt: currentTime.toISOString(),
// TODO pass timezone?
EST: currentTime.tz('America/New_York').format()
}
return data
}
function addBuildInfo (options, id, message, branch) {
la(check.unemptyString(id), 'missing commit id', id)
la(check.maybe.string(message), 'invalid message', message)
la(check.maybe.string(branch), 'invalid branch name', branch)
debug('build info for commit', id)
const data = defaultBuildInfo(id)
if (message) {
debug('adding commit message to build data')
data.message = cropString(15, message)
}
if (branch) {
debug('adding branch name', branch)
data.branch = branch
}
if (options.version) {
debug('adding version %s from options', options.version)
la(check.unemptyString(options.version), 'invalid options.version', options)
data.version = options.version
} else {
debug('reading version from package.json?')
var exists = require('fs').existsSync
var read = require('fs').readFileSync
if (exists('./package.json')) {
var pkg = JSON.parse(read('./package.json', 'utf8'))
debug('loaded package.json version %s', pkg.version)
data.version = pkg.version
}
}
return data
}
function getHerokuCommit () {
const env = process.env
if (env.SOURCE_VERSION && check.unemptyString(env.SOURCE_VERSION)) {
return env.SOURCE_VERSION
}
}
function getCircleCiCommit () {
const env = process.env
if (env.CIRCLE_SHA1 && check.unemptyString(env.CIRCLE_SHA1)) {
return env.CIRCLE_SHA1
}
}
function getGitCommit () {
var cmd = 'git log --format="%H" -n 1'
return exec.exec(cmd)
}
function findCommit () {
var ciSha = getHerokuCommit() || getCircleCiCommit()
if (ciSha) {
return Promise.resolve(ciSha)
}
return getGitCommit()
}
function cleanOutput (str) {
la(check.unemptyString(str), 'expected commit id string', str)
return str.trim()
}
function buildInfo (options) {
options = options || {}
function getMessage (id) {
if (!options.message) {
debug('no need to get commit message for %s', id)
return Promise.resolve()
}
debug('getMessage for commit %s', id)
return numstat(id).then(R.prop('message'))
}
var commitId
return findCommit()
.then(cleanOutput)
.then(
R.tap(function (id) {
commitId = id
})
)
.then(getMessage)
.then(function (message) {
return branchName().then(function (name) {
return addBuildInfo(options, commitId, message, name)
})
})
}
module.exports = {
buildInfo,
addBuildInfo,
getHerokuCommit,
getCircleCiCommit,
defaultBuildInfo
}