UNPKG

1.3 kBJavaScriptView Raw
1var la = require('lazy-ass')
2var gitBlame = require('./blame')
3var check = require('check-more-types')
4var q = require('q')
5var R = require('ramda')
6
7function toArray (x) {
8 return Array.isArray(x) ? x : [x]
9}
10
11function zipBlames (filenames, blames) {
12 la(check.array(blames), 'blame info', blames)
13 console.log('found blame info for', blames.length, 'files')
14 la(
15 check.sameLength(filenames, blames),
16 'mismatch in blame lengths',
17 filenames,
18 blames
19 )
20
21 var lineBlames = blames.map(toArray)
22 var fileBlame = R.zipObj(filenames, lineBlames)
23 return fileBlame
24}
25
26// assumes we are inside folder where filenames make sense
27// probably inside git repo folder and filenames are relative
28// to the repo's root
29function commitForEachLine (filenames) {
30 console.log('blames for', filenames)
31
32 var blamePromises = filenames.map(function (name) {
33 return R.partial(gitBlame, [name])
34 })
35
36 var blameInfo = []
37 function keepBlameInfo (chain, fn) {
38 return chain.then(fn).then(function (blameForFile) {
39 blameInfo.push(blameForFile)
40 })
41 }
42
43 return blamePromises
44 .reduce(keepBlameInfo, q())
45 .then(R.always(blameInfo))
46 .then(R.partial(zipBlames, [filenames]))
47}
48
49module.exports = check.defend(
50 commitForEachLine,
51 check.arrayOfStrings,
52 'need filenames'
53)