Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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