Skip to content

Commit cf0e6f3

Browse files
btfordIgorMinar
authored andcommitted
chore(release): add script for comparing master and stable branches
1 parent 81b0b6e commit cf0e6f3

File tree

2 files changed

+166
-1
lines changed

2 files changed

+166
-1
lines changed

compare-master-to-stable.js

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
#!/usr/local/bin/node
2+
3+
var util = require('util');
4+
var cp = require('child_process');
5+
6+
var Q = require('q');
7+
var _ = require('lodash');
8+
var semver = require('semver');
9+
10+
var exec = function (cmd) {
11+
return function () {
12+
var args = Array.prototype.slice.call(arguments, 0);
13+
args.unshift(cmd);
14+
var fullCmd = util.format.apply(util, args);
15+
return Q.nfcall(cp.exec, fullCmd).then(function (out) {
16+
return out[0].split('\n');
17+
});
18+
};
19+
};
20+
21+
var andThen = function (fn, after) {
22+
return function () {
23+
return fn.apply(this, arguments).then(after);
24+
};
25+
};
26+
27+
var oneArg = function (fn) {
28+
return function (arg) {
29+
return fn(arg);
30+
};
31+
};
32+
33+
var oneLine = function (lines) {
34+
return lines[0].trim();
35+
};
36+
37+
var noArgs = function (fn) {
38+
return function () {
39+
return fn();
40+
};
41+
};
42+
43+
var identity = function (i) { return i; };
44+
45+
// like Q.all, but runs the comands in series
46+
// useful for ensuring env state (like which branch is checked out)
47+
var allInSeries = function (fn) {
48+
return function (args) {
49+
var results = [];
50+
var def;
51+
while (args.length > 0) {
52+
(function (arg) {
53+
if (def) {
54+
def = def.then(function () {
55+
return fn(arg);
56+
});
57+
} else {
58+
def = fn(arg);
59+
}
60+
def = def.then(function (res) {
61+
results.push(res);
62+
});
63+
}(args.pop()));
64+
}
65+
return def.then(function () {
66+
return results;
67+
});
68+
};
69+
};
70+
71+
var compareBranches = function (left, right) {
72+
console.log('# These commits are in ' + left.name + ' but not in ' + right.name + '\n');
73+
console.log(_(left.log).
74+
difference(right.log).
75+
map(function (line) {
76+
return left.full[left.log.indexOf(line)]; // lol O(n^2)
77+
}).
78+
value().
79+
join('\n'));
80+
};
81+
82+
var checkout = oneArg(exec('git checkout %s'));
83+
84+
var getCurrentBranch = andThen(noArgs(exec('git rev-parse --abbrev-ref HEAD')), oneLine);
85+
var getTags = noArgs(exec('git tag'));
86+
var getShaOfTag = oneArg(exec('git rev-list %s | head -n 1'));
87+
var getTheLog = oneArg(exec('git log --pretty=oneline %s..HEAD | cat'));
88+
89+
// remember this so we can restore state
90+
var currentBranch;
91+
92+
getCurrentBranch().
93+
then(function (branch) {
94+
currentBranch = branch;
95+
}).
96+
then(getTags).
97+
then(function (tags) {
98+
return tags.
99+
filter(semver.valid).
100+
map(semver.clean).
101+
sort(semver.rcompare);
102+
}).
103+
then(function (tags) {
104+
var major = tags[0].split('.')[0] + '.x';
105+
return tags.
106+
filter(function (ver) {
107+
return semver.satisfies(ver, major);
108+
});
109+
}).
110+
then(function (tags) {
111+
return _(tags).
112+
groupBy(function (tag) {
113+
return tag.split('.')[1];
114+
}).
115+
map(function (group) {
116+
return _.first(group);
117+
}).
118+
map(function (tag) {
119+
return 'v' + tag;
120+
}).
121+
value();
122+
}).
123+
then(function (tags) {
124+
return [
125+
{ name: 'v1.0.x', tag: tags[0] },
126+
{ name: 'master', tag: tags[1] }
127+
];
128+
}).
129+
then(allInSeries(function (branch) {
130+
return checkout(branch.name).
131+
then(function () {
132+
return getTheLog(branch.tag);
133+
}).
134+
then(function (log) {
135+
return log.
136+
filter(identity);
137+
}).
138+
then(function (log) {
139+
branch.full = log.map(function (line) {
140+
line = line.split(' ');
141+
var sha = line.shift();
142+
var msg = line.join(' ');
143+
return sha + (msg.toLowerCase().indexOf('fix') === -1 ? ' ' : ' * ') + msg;
144+
});
145+
branch.log = log.map(function (line) {
146+
return line.substr(41)
147+
});
148+
return branch;
149+
});
150+
})).
151+
then(function (pairs) {
152+
compareBranches(pairs[0], pairs[1]);
153+
console.log('\n');
154+
compareBranches(pairs[1], pairs[0]);
155+
return pairs;
156+
}).
157+
then(function () {
158+
return checkout(currentBranch);
159+
}).
160+
catch(function (e) {
161+
console.log(e.stack);
162+
});
163+

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535
"grunt-ddescribe-iit": "~0.0.1",
3636
"grunt-merge-conflict": "~0.0.1",
3737
"promises-aplus-tests": "~1.3.2",
38-
"grunt-shell": "~0.3.1"
38+
"grunt-shell": "~0.3.1",
39+
"semver": "~2.1.0",
40+
"lodash": "~1.3.1"
3941
},
4042
"licenses": [
4143
{

0 commit comments

Comments
 (0)