Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100755 164 lines (148 sloc) 3.732 kb
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
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
Something went wrong with that request. Please try again.