ggit
Version:
Local promise-returning git command wrappers
105 lines (88 loc) • 2.4 kB
JavaScript
var la = require('lazy-ass')
var check = require('check-more-types')
var debug = require('debug')('ggit')
/**
* parses date, author, message from a merge commit.
*/
function commitMergeMeta (lines) {
la(lines.length > 3, 'expected more lines', lines)
var commit = lines[0].split(' ')[1].trim()
var author = lines[2].split(':')[1].trim()
// remove Date:
var date = lines[3].substr(5).trim()
var message = lines[5].trim()
return {
commit: commit,
author: author,
date: date,
message: message
}
}
/**
* parses date, author, message from a regular or merge commit.
*/
function commitMeta (lines) {
la(lines.length > 3, 'expected more lines', lines)
if (lines[1].indexOf('Merge:') !== -1) {
return commitMergeMeta(lines)
}
var commit = lines[0].split(' ')[1].trim()
var author = lines[1].split(':')[1].trim()
// remove Date:
var date = lines[2].substr(5).trim()
var message = lines[4].trim()
return {
commit: commit,
author: author,
date: date,
message: message
}
}
/*
parses git show --numstat output, which is something like this
$ git show --numstat 46350c2
commit 46350c2c9980551d338ce1ad0d8eff7bea9713ec
Author: Gleb Bahmutov <gleb.bahmutov@gmail.com>
Date: Mon Jan 13 19:04:06 2014 -0500
better gruntfile
1 1 .jshintrc
54 25 Gruntfile.js
9 0 complexity.json
2 1 package.json
*/
function isValidLine (line) {
var rex = /^\s*\d+\s+\d+[\w\W]+$/
return line && rex.test(line)
}
la(isValidLine('1 1 time-method-call.js'))
la(isValidLine(' 1 0 README.md'))
function parseNumstat (stdout) {
la(check.unemptyString(stdout), 'missing numstat output', stdout)
var lines = stdout.split('\n')
la(lines.length > 3, 'expected more lines', stdout)
var info = commitMeta(lines)
debug('commit meta %o', info)
var k = 6
var fileChanges = {}
for (; k < lines.length; k += 1) {
if (isValidLine(lines[k])) {
var parts = lines[k].split('\t')
var added = Number(parts[0].trim())
var deleted = Number(parts[1].trim())
var filename = parts[2].trim()
fileChanges[filename] = {
filename: filename,
added: added,
deleted: deleted
}
}
}
debug('parsed numstat %o', fileChanges)
info.changes = fileChanges
return info
}
module.exports = {
commitMeta,
isValidLine,
parseNumstat
}