Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100755 169 lines (151 sloc) 3.799 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
36831ec 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) {
452d1cd Pete Bacon Darwin chore(compare-master-to-stable): support beta release versions
petebacondarwin authored
106 var major = tags[0].split('.')[0];
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
107 return tags.
108 filter(function (ver) {
452d1cd Pete Bacon Darwin chore(compare-master-to-stable): support beta release versions
petebacondarwin authored
109 return semver(ver).major == major;
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
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) {
bfb6af7 Vojta Jina chore: make compare-master-to-stable script more flexible
vojtajina authored
126 var master = tags.pop();
127 var stable = tags.pop();
128
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
129 return [
bfb6af7 Vojta Jina chore: make compare-master-to-stable script more flexible
vojtajina authored
130 { name: stable.replace(/\d+$/, 'x'), tag: stable },
131 { name: 'master', tag: master}
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
132 ];
133 }).
134 then(allInSeries(function (branch) {
135 return checkout(branch.name).
136 then(function () {
137 return getTheLog(branch.tag);
138 }).
139 then(function (log) {
140 return log.
141 filter(identity);
142 }).
143 then(function (log) {
144 branch.full = log.map(function (line) {
145 line = line.split(' ');
146 var sha = line.shift();
147 var msg = line.join(' ');
c5f1ca3 ⭐caitp⭐ chore(compare-master-to-stable): make checks for bugfixes better
caitp authored
148 return sha + ((/fix\([^\)]+\):/i.test(msg)) ? ' * ' : ' ') + msg;
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
149 });
150 branch.log = log.map(function (line) {
36831ec Michał Gołębiowski refactor(jshint): reduce duplication & test all JS files
mzgol authored
151 return line.substr(41);
cf0e6f3 Brian Ford chore(release): add script for comparing master and stable branches
btford authored
152 });
153 return branch;
154 });
155 })).
156 then(function (pairs) {
157 compareBranches(pairs[0], pairs[1]);
158 console.log('\n');
159 compareBranches(pairs[1], pairs[0]);
160 return pairs;
161 }).
162 then(function () {
163 return checkout(currentBranch);
164 }).
165 catch(function (e) {
166 console.log(e.stack);
167 });
168
Something went wrong with that request. Please try again.