Code coverage report for src/commit-per-line.js

Statements: 100% (24 / 24)      Branches: 50% (1 / 2)      Functions: 100% (6 / 6)      Lines: 100% (24 / 24)      Ignored: none     

All files » src/ » commit-per-line.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 501 1 1 1 1   1 1     1 1 1 1     1 1 1           1 1   1 1     1 1 1     1       1             1    
require('lazy-ass');
var gitBlame = require('./blame');
var check = require('check-more-types');
var q = require('q');
var R = require('ramda');
 
function toArray(x) {
  return Array.isArray(x) ? x : [x];
}
 
function zipBlames(filenames, blames) {
  la(check.array(blames), 'blame info', blames);
  console.log('found blame info for', blames.length, 'files');
  la(check.sameLength(filenames, blames),
    'mismatch in blame lengths', filenames, blames);
 
  var lineBlames = blames.map(toArray);
  var fileBlame = R.zipObj(filenames, lineBlames);
  return fileBlame;
}
 
// assumes we are inside folder where filenames make sense
// probably inside git repo folder and filenames are relative
// to the repo's root
function commitForEachLine(filenames) {
  console.log('blames for', filenames);
 
  var blamePromises = filenames.map(function (name) {
    return R.lPartial(gitBlame, name);
  });
 
  var blameInfo = [];
  function keepBlameInfo(chain, fn) {
    return chain
      .then(fn)
      .then(function (blameForFile) {
        blameInfo.push(blameForFile);
      });
  }
 
  return blamePromises.reduce(keepBlameInfo, q())
    .then(R.always(blameInfo))
    .then(
      R.lPartial(zipBlames, filenames)
    );
}
 
module.exports = check.defend(commitForEachLine,
  check.arrayOfStrings, 'need filenames');