Code coverage report for ggit/src/blame.js

Statements: 100% (19 / 19)      Branches: 100% (0 / 0)      Functions: 100% (2 / 2)      Lines: 100% (19 / 19)      Ignored: none     

All files » ggit/src/ » blame.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 511 1 1 1 1     1 1                               1 1 1                   1 1 1   1 1   1   1 1     1  
require('lazy-ass');
var check = require('check-types');
var exec = require('./exec');
var path = require('path');
var fs = require('fs');
 
// from git blame --porcelain string output to object
function toBlameInfo(blamePorcelainOutput) {
  la(check.unemptyString(blamePorcelainOutput),
    'expected string output', blamePorcelainOutput);
  /*
    full-commit-id 73 79 1
    author Joe
    author-mail <joe@email.com>
    author-time 1401904426
    author-tz -0400
    committer Andy
    committer-mail <andy@email.com>
    committer-time 1401904426
    committer-tz -0400
    summary Blah blah blah
    filename path/to/file/from/repo/root
    // current line from file
  */
  var lines = blamePorcelainOutput.split('\n');
  la(lines.length > 3, 'few lines in output', blamePorcelainOutput);
  return {
    commit: lines[0].split(' ')[0],
    author: lines[1].replace('author ', ''),
    committer: lines[5].replace('committer ', ''),
    summary: lines[9].replace('summary ', ''),
    filename: lines[10].replace('filename ', ''), // wrt repo root
    line: lines[11].trim()
  };
}
 
function blame(filename, lineNumber) {
  la(check.unemptyString(filename), 'missing filename');
  la(check.positiveNumber(lineNumber),
    'file', filename, 'missing line number (starting with 1)', lineNumber);
  var fullFilename = path.resolve(filename);
  la(fs.existsSync(filename), 'file', fullFilename, 'not found, based on', filename);
 
  console.log('who to blame for', fullFilename, lineNumber);
  // http://git-scm.com/docs/git-blame
  var cmd = 'git blame --porcelain -L ' + lineNumber + ',' + lineNumber + ' ' + fullFilename;
  return exec(cmd).then(toBlameInfo);
};
 
module.exports = blame;