-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathindex.js
117 lines (100 loc) · 2.75 KB
/
index.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
var recursive = require('recursive-readdir');
var Path = require("path");
var async = require("async");
var fs = require("fs");
var files = [];
var location = Path.join("tmp","wc"); //TODO: this ought to be better
var output = require('./reporters/console');
var argv = require('yargs')
.option('r', {
alias : 'repo',
demand: true,
describe: 'Repository to scan',
type: 'string',
nargs: 1
})
.option('t', {
alias : 'type',
demand: false,
default: 'auto',
describe: 'Type of repository. Accepts "git", "hg", "svn", or "auto"',
type: 'string',
nargs: 1
})
.argv;
if (argv.type === 'auto') {
if (argv.repo.indexOf('git') > -1) {
argv.type = 'git';
console.log("Auto-detected Git repository");
} else if (argv.repo.indexOf('svn') > -1) {
argv.type = 'svn';
console.log("Auto-detected SVN repository");
} else if (argv.repo.indexOf('hg') > -1) {
argv.type = 'hg';
console.log("Auto-detected Hg repository");
} else {
console.log("Could not detect repository type, please be explicit!");
}
}
var repoAdapter = require("./lib/" + argv.type.toLowerCase());
repoAdapter.init(argv.repo, location, function(err) {
if (err) {
output.reportError(err);
return;
}
recursive(location, [Path.join("**",".git","*"),".gitignore",Path.join("**",".svn","*"),".hg*"], function (err, lsFiles) {
lsFiles = lsFiles.filter(function (value, index, array){
var stats = fs.statSync(value);
return stats.size > 0;
});
async.eachSeries(lsFiles,function(file, cb) {
file = file.replace(location + Path.sep,"");
repoAdapter.getOwner(file,function(err, owner) {
if (!err) {
files.push({
"filename": file,
"owner": owner
});
};
cb(err);
})
}, function(err) {
if (err) {
output.reportError(err);
return;
}
var numfiles = files.length;
var candidates = {};
for (var i = 0; i < numfiles; i++) {
var owner = files[i].owner;
if (!candidates[owner]) {
candidates[owner] = 0;
}
candidates[owner]++;
}
//Sort the authors
var ownersSorted = Object.keys(candidates).sort(function(a,b){return candidates[b]-candidates[a]})
var numAuthors = ownersSorted.length;
var runningTotal = 0;
var busFactor = 0;
var dead = false;
for (var i = 0; i < numAuthors; i++) {
runningTotal += candidates[ownersSorted[i]];
if (!dead) busFactor++;
if (runningTotal >= numfiles/2 && !dead) {
dead = true;
}
}
var data = {
"repo": argv.repo,
"numfiles": numfiles,
"files": files,
"numAuthors": numAuthors,
"owners": candidates,
"ownersSorted": ownersSorted,
"busFactor": busFactor
};
output.report(data);
});
});
})