UNPKG

3.44 kBJavaScriptView Raw
1var path = require('path2/posix');
2var _ = require('lodash');
3var util = require('util');
4var Shipit = module.exports;
5
6/**
7 * Compute the current release dir name.
8 *
9 * @param {object} result
10 * @returns {string}
11 */
12
13function computeReleases(result) {
14 if (!result.stdout) return null;
15
16 // Trim last breakline.
17 var dirs = result.stdout.replace(/\n$/, '');
18
19 // Convert releases to an array.
20 return dirs.split('\n');
21}
22
23/**
24 * Test if all values are equal.
25 *
26 * @param {*[]} values
27 * @returns {boolean}
28 */
29
30function equalValues(values) {
31 return values.every(function (value) {
32 return _.isEqual(value, values[0]);
33 });
34}
35
36/**
37 * Compute the current release dir name.
38 *
39 * @param {object} result
40 * @returns {string}
41 */
42
43function computeReleaseDirname(result) {
44 if (!result.stdout) return null;
45
46 // Trim last breakline.
47 var target = result.stdout.replace(/\n$/, '');
48
49 return target.split(path.sep).pop();
50}
51
52/**
53 * Return the current release dirname.
54 */
55
56Shipit.getCurrentReleaseDirname = function() {
57 var shipit = this;
58
59 return shipit.remote(util.format('if [ -h %s ]; then readlink %s; fi', shipit.currentPath, shipit.currentPath))
60 .then(function(results) {
61 results = results || [];
62 var releaseDirnames = results.map(computeReleaseDirname);
63
64 if (!equalValues(releaseDirnames)) {
65 throw new Error('Remote servers are not synced.');
66 }
67
68 if (!releaseDirnames[0]) {
69 shipit.log('No current release found.');
70 return null;
71 }
72
73 return releaseDirnames[0];
74 });
75};
76
77/**
78 * Return all remote releases (newest first)
79 */
80
81Shipit.getReleases = function() {
82 var shipit = this;
83
84 return shipit.remote('ls -r1 ' + shipit.releasesPath)
85 .then(function(results) {
86 var releases = results.map(computeReleases);
87
88 if (!equalValues(releases))
89 throw new Error('Remote servers are not synced.');
90
91 return releases[0];
92 });
93};
94
95/**
96 * Return SHA from remote REVISION file.
97 *
98 * @param {string} releaseDir Directory name of the relesase dir (YYYYMMDDHHmmss).
99 */
100
101Shipit.getRevision = function(releaseDir) {
102 var shipit = this;
103 var file = path.join(shipit.releasesPath, releaseDir, 'REVISION');
104
105 return shipit.remote('if [ -f ' + file + ' ]; then cat ' + file + ' 2>/dev/null; fi;')
106 .then(function(response) {
107 return response[0].stdout.trim();
108 });
109};
110
111Shipit.getPendingCommits = function() {
112 var shipit = this;
113
114 return shipit.getCurrentReleaseDirname()
115 .then(function(currentReleaseDirname) {
116 if (!currentReleaseDirname) {
117 return null;
118 }
119 return shipit.getRevision(currentReleaseDirname)
120 .then(function(deployedRevision) {
121 if (!deployedRevision) {
122 return null;
123 }
124
125 // Get local remotes.
126 return shipit.local('git remote', {cwd: shipit.config.workspace}).then(function(res) {
127 var remotes = res && res.stdout ? res.stdout.split(/\s/) : [];
128
129 if (remotes.length < 1) {
130 return null;
131 }
132
133 // Compare against currently undeployed revision
134 var compareRevision = remotes[0] + '/' + shipit.config.branch;
135
136 // Print diff
137 return shipit.local('git log --pretty=format:\"' + shipit.config.gitLogFormat + '\" ' + deployedRevision + '..' + compareRevision, {cwd: shipit.config.workspace})
138 .then(function(response) {
139 response = response.stdout.trim();
140 return response || null;
141 });
142 });
143 });
144 });
145};