Skip to content

Commit 19aa609

Browse files
committed
Merge pull request #8 from ember-cli-deploy/enrich-revision-data
display new scm revisionData
2 parents 60643e5 + ca41efe commit 19aa609

File tree

6 files changed

+286
-90
lines changed

6 files changed

+286
-90
lines changed

README.md

+25
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,31 @@ Display a list of deployed revisions using [ember-cli-deploy](https://github.com
88

99
* `ember install ember-cli-deploy-display-revisions`
1010

11+
## Configuration Options
12+
13+
### Defaults
14+
15+
```
16+
ENV['display-revisions'] = {
17+
amount: 10,
18+
revisions: function(context) {
19+
return context.revisions;
20+
}
21+
}
22+
```
23+
24+
### amount
25+
26+
Number of revisions displayed in the results table
27+
28+
*Default:* `10`
29+
30+
### revisions
31+
32+
The data to be displayed
33+
34+
*Default:* `context.revisions`, usually received from `fetchRevisions`
35+
1136
## Usage
1237

1338
* `ember deploy:list <environment>` to list the latest 10 revisions

index.js

+17-87
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',
@@ -15,103 +17,31 @@ module.exports = {
1517
amount: function(context) {
1618
return context.commandOptions.amount || 10;
1719
},
20+
21+
revisions: function(context) {
22+
return context.revisions;
23+
}
1824
},
1925

2026
displayRevisions: function(context) {
21-
if(!context.revisions) {
27+
var table;
28+
var revisions = this.readConfig('revisions');
29+
if(!revisions || revisions.length === 0) {
2230
this.log("Could not display latest revisions because no revisions were found in context.", {color: 'yellow'});
2331
return;
2432
}
2533

26-
var revisions = context.revisions.slice(0, this.readConfig("amount"));
27-
28-
var keys = this._getKeys(revisions);
34+
revisions = revisions.slice(0, this.readConfig("amount"));
2935

30-
this._displayHeader(keys, revisions);
36+
var hasRevisionData = _.every(revisions, 'revisionData');
3137

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 += ">";
38+
if (hasRevisionData) {
39+
table = new ScmTable(this, revisions);
40+
table.display();
4041
} else {
41-
row += " ";
42+
table = new LegacyTable(this, revisions);
43+
table.display();
4244
}
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-
});
11545
}
11646
});
11747

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+
});

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.logRaw(table.toString());
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+
});

package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,18 @@
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",
47-
"ember-cli-deploy-plugin": "^0.2.1",
50+
"ember-cli-deploy-plugin": "^0.2.3",
4851
"moment": "2.10.6"
4952
},
5053
"ember-addon": {

0 commit comments

Comments
 (0)