Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100755 167 lines (150 sloc) 3.801 kb
53e4da8 Vojta Jina chore: fix compare-master-to-stable script
vojtajina authored
1 #!/usr/bin/env node
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
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) {
bfb6af7 Vojta Jina chore: make compare-master-to-stable script more flexible
vojtajina authored
124 var master = tags.pop();
125 var stable = tags.pop();
126
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
127 return [
bfb6af7 Vojta Jina chore: make compare-master-to-stable script more flexible
vojtajina authored
128 { name: stable.replace(/\d+$/, 'x'), tag: stable },
129 { name: 'master', tag: master}
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
130 ];
131 }).
132 then(allInSeries(function (branch) {
133 return checkout(branch.name).
134 then(function () {
135 return getTheLog(branch.tag);
136 }).
137 then(function (log) {
138 return log.
139 filter(identity);
140 }).
141 then(function (log) {
142 branch.full = log.map(function (line) {
143 line = line.split(' ');
144 var sha = line.shift();
145 var msg = line.join(' ');
146 return sha + (msg.toLowerCase().indexOf('fix') === -1 ? ' ' : ' * ') + msg;
147 });
148 branch.log = log.map(function (line) {
149 return line.substr(41)
150 });
151 return branch;
152 });
153 })).
154 then(function (pairs) {
155 compareBranches(pairs[0], pairs[1]);
156 console.log('\n');
157 compareBranches(pairs[1], pairs[0]);
158 return pairs;
159 }).
160 then(function () {
161 return checkout(currentBranch);
162 }).
163 catch(function (e) {
164 console.log(e.stack);
165 });
166
Something went wrong with that request. Please try again.