-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGitTimeLapse.js
134 lines (108 loc) · 3.24 KB
/
GitTimeLapse.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// REQUIRES NODE HARMONY eg. ES6 features (generators, Promises)
// This program creates JSON states from a git repository
//
// [{fileName:name,
// commits:[{ id: id,
// contents:[],
//
// }]]
//
//
var exec = require('child_process').exec;
var fs = require('fs');
var Promise = require("es6-promise").Promise;
var snapshotSeperator = "1234";
var startDir;
exec("pwd",function(error,stdout,stderr){
startDir = stdout;
});
/*
var genTest = function* (init){
var i = init;
i+=yield i;
i += yield i;
return i;
};
var g = genTest(5);
console.log(g.next(5));
console.log(g.next(5));
console.log(g.next(5));
console.log(g.next(5));
console.log(g.next(5));
*/
var getGitFiles = function(dir){
return new Promise(function(resolve,reject){
exec("git ls-files",{cwd:dir},function(error,stdout,stderr){
if(error != null || stderr != ""){
reject(error+" \nstderr: "+stderr);
return;
}
var files = stdout.split("\n");
//Remove empty element
files = files.filter(function(el) {return el.length !== 0});
resolve(files);
});
});
};
var generateCommitsForFile = function(fileName,dir,callBack){
exec("git rev-list HEAD --count;",{cwd:dir},function(error,stdout,stderr){
var numberOfCommits = stdout;
console.log("Number:",stdout);
getContentsFromLastXCommits(fileName,dir,numberOfCommits-1,function(stdout,error){
//console.log(stdout);
var snapshots = stdout.split(snapshotSeperator);
callBack(snapshots,error);
});
});
};
var generateBashCommands= function(fileName,number){
var output = "";
for(var i=number;i>=0;i--){
output+="git --no-pager show master~"+i+":"+fileName+";echo "+snapshotSeperator+";";
}
return output;
};
var getContentsFromLastXCommits = function(fileName,dir,commitNumberFromHead,callBack){
var command = generateBashCommands(fileName,commitNumberFromHead);
console.log("Command",command);
var contents = exec(command,{cwd:dir},function(error,stdout,stderr){
//console.log(stdout,error,stderr,command);
callBack(stdout,error+stderr);
});
};
var generateSnapshotsObject = function(fileName,dir){
return new Promise(function(resolve,reject){
generateCommitsForFile(fileName,dir,function(result,error){
console.log("Kaviar");
if(error !== null){
reject(error);
}
var snapshots = {fileName:fileName,commits:result};
resolve(snapshots);
});
});
};
var generateSnapshotsOfGitRepo = function(dir){
return new Promise(function(resolve,reject){
getGitFiles(dir).then(function(result){
console.log("Results",result);
var snapshotPromises = [];
for(var file in result){
file = result[file];
var promise = generateSnapshotsObject(file,dir);
snapshotPromises.push(promise);
}
//Wait till all snapshots have been created before fulfilling
Promise.all(snapshotPromises).then(function(result){resolve(result);},function(error){reject(error);});
},function(error){reject(error);});
});
};
/*generateSnapshotsOfGitRepo("866fa3d5245197ebf806943a7a2d26395e8cd7b8").then(function(fileSnapshots){
console.log("All files have been collected",fileSnapshots.length);
console.log(fileSnapshots.reduce(function(pile,obj){return pile+obj.fileName+",";},""));
});
*/
module.exports ={
generateSnapshotsOfGitRepo:generateSnapshotsOfGitRepo,
getGitFiles:getGitFiles
};