Skip to content

Commit 36b33dd

Browse files
committed
add scm table
moves old behaviour in separate file as well
1 parent 60643e5 commit 36b33dd

File tree

5 files changed

+252
-86
lines changed

5 files changed

+252
-86
lines changed

Diff for: index.js

+11-86
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
'use strict';
33

44
var DeployPluginBase = require('ember-cli-deploy-plugin');
5-
var moment = require('moment');
5+
var ScmTable = require('./lib/scm-table');
6+
var LegacyTable = require('./lib/legacy-table');
7+
var _ = require('lodash');
68

79
module.exports = {
810
name: 'ember-cli-deploy-display-revisions',
@@ -18,100 +20,23 @@ module.exports = {
1820
},
1921

2022
displayRevisions: function(context) {
21-
if(!context.revisions) {
23+
var table;
24+
if(!context.revisions || context.revisions.length === 0) {
2225
this.log("Could not display latest revisions because no revisions were found in context.", {color: 'yellow'});
2326
return;
2427
}
2528

2629
var revisions = context.revisions.slice(0, this.readConfig("amount"));
2730

28-
var keys = this._getKeys(revisions);
31+
var hasRevisionData = _.every(context.revisions, 'revisionData');
2932

30-
this._displayHeader(keys, revisions);
31-
32-
revisions.forEach(function(revision) {
33-
this._displayRow(keys, revision);
34-
}.bind(this));
35-
},
36-
_displayRow: function(keys, revision) {
37-
var row = "";
38-
if(revision.active) {
39-
row += ">";
33+
if (hasRevisionData) {
34+
table = new ScmTable(this, revisions);
35+
table.display();
4036
} else {
41-
row += " ";
37+
table = new LegacyTable(this, revisions);
38+
table.display();
4239
}
43-
44-
var lastKey = keys[keys.length - 1];
45-
46-
keys.forEach(function(key) {
47-
var value = revision[key.name] ? revision[key.name] : "";
48-
49-
if(key.name === 'timestamp') {
50-
value = moment(value).format("YYYY/MM/DD HH:mm:ss");
51-
}
52-
53-
if(key.maxLength !== -1) {
54-
value = String(value).substr(0, key.maxLength);
55-
}
56-
57-
row += " " + value + " ";
58-
59-
var fillerLength = key.maxLength - value.length;
60-
for(var i = 0; i < fillerLength; i++) {
61-
row += " ";
62-
}
63-
if(key !== lastKey) {
64-
row += "|";
65-
}
66-
});
67-
68-
this.log(row);
69-
},
70-
_getKeys: function(revisions) {
71-
var keys = [
72-
{name: 'version', maxLength: 7},
73-
{name: 'timestamp', maxLength: 19},
74-
{name: 'deployer', maxLength: 10},
75-
{name: 'revision', maxLength: -1}
76-
];
77-
var presentKeys = [];
78-
keys.forEach(function(key) {
79-
if(this._hasKey(key.name, revisions)) {
80-
presentKeys.push(key);
81-
}
82-
}.bind(this));
83-
return presentKeys;
84-
},
85-
_displayHeader: function(keys) {
86-
var keyHeader = " ";
87-
var lastKey = keys[keys.length - 1];
88-
89-
keys.forEach(function(key) {
90-
var shortKey = key.maxLength === -1 ? key.name : key.name.substr(0, key.maxLength);
91-
keyHeader += " " + shortKey + " ";
92-
93-
var fillerLength = key.maxLength === -1 ? 0 : key.maxLength - shortKey.length;
94-
for(var i = 0; i < fillerLength; i++) {
95-
keyHeader += " ";
96-
}
97-
98-
// revision hash needs an unknown amount of space, don't display closing |
99-
if(key !== lastKey) {
100-
keyHeader += "|";
101-
}
102-
});
103-
this.log(keyHeader);
104-
105-
var underline = "";
106-
for(var i = 0; i < keyHeader.length; i++) {
107-
underline += "=";
108-
}
109-
this.log(underline);
110-
},
111-
_hasKey: function(key, revisions) {
112-
return revisions.some(function(revision) {
113-
return Object.keys(revision).indexOf(key) !== -1;
114-
});
11540
}
11641
});
11742

Diff for: lib/legacy-table.js

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
var moment = require('moment');
2+
3+
var CoreObject = require('core-object');
4+
var Promise = require('ember-cli/lib/ext/promise');
5+
6+
module.exports = CoreObject.extend({
7+
init: function(plugin, revisions) {
8+
this._plugin = plugin;
9+
this.revisions = revisions;
10+
},
11+
12+
log: function() {
13+
this._plugin.log.apply(this._plugin, arguments);
14+
},
15+
16+
display: function() {
17+
var revisions = this.revisions;
18+
var keys = this._getKeys(revisions);
19+
20+
this._displayHeader(keys, revisions);
21+
22+
revisions.forEach(function(revision) {
23+
this._displayRow(keys, revision);
24+
}.bind(this));
25+
},
26+
27+
_displayRow: function(keys, revision) {
28+
var row = "";
29+
if(revision.active) {
30+
row += ">";
31+
} else {
32+
row += " ";
33+
}
34+
35+
var lastKey = keys[keys.length - 1];
36+
37+
keys.forEach(function(key) {
38+
var value = revision[key.name] ? revision[key.name] : "";
39+
40+
if(key.name === 'timestamp') {
41+
value = moment(value).format("YYYY/MM/DD HH:mm:ss");
42+
}
43+
44+
if(key.maxLength !== -1) {
45+
value = String(value).substr(0, key.maxLength);
46+
}
47+
48+
row += " " + value + " ";
49+
50+
var fillerLength = key.maxLength - value.length;
51+
for(var i = 0; i < fillerLength; i++) {
52+
row += " ";
53+
}
54+
if(key !== lastKey) {
55+
row += "|";
56+
}
57+
});
58+
59+
this.log(row);
60+
},
61+
62+
_getKeys: function(revisions) {
63+
var keys = [
64+
{name: 'version', maxLength: 7},
65+
{name: 'timestamp', maxLength: 19},
66+
{name: 'deployer', maxLength: 10},
67+
{name: 'revision', maxLength: -1}
68+
];
69+
var presentKeys = [];
70+
keys.forEach(function(key) {
71+
if(this._hasKey(key.name, revisions)) {
72+
presentKeys.push(key);
73+
}
74+
}.bind(this));
75+
return presentKeys;
76+
},
77+
78+
_displayHeader: function(keys) {
79+
var keyHeader = " ";
80+
var lastKey = keys[keys.length - 1];
81+
82+
keys.forEach(function(key) {
83+
var shortKey = key.maxLength === -1 ? key.name : key.name.substr(0, key.maxLength);
84+
keyHeader += " " + shortKey + " ";
85+
86+
var fillerLength = key.maxLength === -1 ? 0 : key.maxLength - shortKey.length;
87+
for(var i = 0; i < fillerLength; i++) {
88+
keyHeader += " ";
89+
}
90+
91+
// revision hash needs an unknown amount of space, don't display closing |
92+
if(key !== lastKey) {
93+
keyHeader += "|";
94+
}
95+
});
96+
this.log(keyHeader);
97+
98+
var underline = "";
99+
for(var i = 0; i < keyHeader.length; i++) {
100+
underline += "=";
101+
}
102+
this.log(underline);
103+
},
104+
_hasKey: function(key, revisions) {
105+
return revisions.some(function(revision) {
106+
return Object.keys(revision).indexOf(key) !== -1;
107+
});
108+
}
109+
});

Diff for: lib/scm-table.js

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/* jshint node: true */
2+
var Table = require('cli-table2');
3+
var moment = require('moment');
4+
5+
var CoreObject = require('core-object');
6+
var Promise = require('ember-cli/lib/ext/promise');
7+
8+
module.exports = CoreObject.extend({
9+
init: function(plugin, revisions) {
10+
this._plugin = plugin;
11+
this.revisions = revisions;
12+
},
13+
14+
display: function(revisions) {
15+
var table = this._createTable();
16+
this._tableRows(table);
17+
18+
this._plugin.log(table.toString(), {plain: true});
19+
return Promise.resolve();
20+
},
21+
22+
_isWide: function() {
23+
return process.stdout.columns >= 98;
24+
},
25+
26+
_tableHeader: function() {
27+
var head = ['RevisionKey', 'Commit', 'User', 'Branch'];
28+
29+
if (this._isWide()) {
30+
head.push('Deploy time');
31+
}
32+
return head;
33+
},
34+
35+
_createTable: function() {
36+
var head = this._tableHeader();
37+
38+
return new Table({
39+
head: head,
40+
wordWrap: true,
41+
chars: {
42+
'top': '',
43+
'top-mid': '',
44+
'top-left': '',
45+
'top-right': '',
46+
'bottom': '',
47+
'mid': '',
48+
'middle': '',
49+
'mid-mid': '',
50+
'bottom-mid': '',
51+
'bottom-left': '',
52+
'bottom-right': '',
53+
'left': '',
54+
'left-mid': '',
55+
'right': '',
56+
'right-mid': ''
57+
}
58+
});
59+
},
60+
61+
_tableRows: function(table) {
62+
this.revisions.forEach(function(revision) {
63+
var data = revision.revisionData;
64+
65+
var row = [
66+
((revision.active) ? '> ' : ' ') + data.revisionKey,
67+
data.scm.sha.substr(0,8),
68+
data.scm.email,
69+
data.scm.branch,
70+
];
71+
72+
if (this._isWide()) {
73+
var value = moment(data.timestamp).format("YYYY/MM/DD HH:mm:ss");
74+
row.push(value);
75+
}
76+
77+
table.push(row);
78+
79+
}.bind(this));
80+
},
81+
82+
});

Diff for: package.json

+3
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@
3636
"ember-export-application-global": "^1.0.2",
3737
"ember-try": "0.0.4",
3838
"glob": "^5.0.5",
39+
"lodash": "^3.10.1",
3940
"mocha": "^2.2.4"
4041
},
4142
"keywords": [
4243
"ember-addon",
4344
"ember-cli-deploy-plugin"
4445
],
4546
"dependencies": {
47+
"cli-table2": "^0.2.0",
48+
"core-object": "^2.0.0",
4649
"ember-cli-babel": "^5.0.0",
4750
"ember-cli-deploy-plugin": "^0.2.1",
4851
"moment": "2.10.6"

Diff for: tests/unit/index-nodetest.js

+47
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,53 @@ describe('displayRevisions plugin', function() {
9999
});
100100
});
101101
});
102+
describe('displayRevisions hook with revisionData', function() {
103+
var plugin, context;
104+
105+
beforeEach(function() {
106+
plugin = subject.createDeployPlugin({
107+
name: 'display-revisions'
108+
});
109+
110+
context = {
111+
ui: mockUi,
112+
config: { },
113+
commandOptions: {
114+
amount: 3
115+
},
116+
revisions: [
117+
{ revision: "rev:first", revisionData: {revisionKey: 'rev:first', scm: {sha: '99ee96e7ee7d36717524bd6489d2eff966c83c3d', email: 'mattia@mail.com', branch: 'foo'}, timestamp: 1032123125000}},
118+
{ revision: "rev:second", revisionData: {revisionKey: 'rev:second', scm: {sha: 'eeee96e7ee7d36717524bd6489d2eff966c83c3d', email: 'aaron@mail.com', branch: 'bar'}, timestamp: 1032123127000}},
119+
{ revision: "rev:third", revisionData: {revisionKey: 'rev:third', scm: {sha: 'ffee96e7ee7d36717524bd6489d2eff966c83c3d', email: 'luke@mail.com', branch: 'foo'}, timestamp: 1032123128000}},
120+
]
121+
};
122+
plugin.beforeHook(context);
123+
plugin.configure(context);
124+
});
125+
126+
it('lists revisions', function() {
127+
plugin.displayRevisions(context);
128+
var messages = mockUi.messages.reduce(function(previous, current) {
129+
if (current.indexOf("rev:") !== -1) {
130+
previous.push(current);
131+
}
132+
133+
return previous;
134+
}, []);
135+
assert.equal(messages.length, 1); // logs a single message as table
136+
var message = messages[0];
137+
assert.match(message, /RevisionKey/);
138+
assert.match(message, /Commit/);
139+
assert.match(message, /User/);
140+
assert.match(message, /Branch/);
141+
142+
var lines = message.split("\n");
143+
assert.equal(lines.length, 4); // logs headers and 3 revisions
144+
var revisionLine = lines[1];
145+
assert.match(revisionLine, /rev:first/);
146+
assert.match(revisionLine, /mattia@mail.com/);
147+
});
148+
});
102149

103150
describe('displayRevisions hook', function() {
104151
var plugin, context;

0 commit comments

Comments
 (0)