UNPKG

4.03 kBJavaScriptView Raw
1var path = require('path');
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 a specified release dirname.
79 *
80 * @param {int} backFromCurrent Number of releases back, starting from current
81 */
82
83Shipit.getPreviousReleaseDirname = function(backFromCurrent) {
84 var shipit = this;
85 backFromCurrent = parseInt(backFromCurrent || 1, 10);
86
87 return shipit.getCurrentReleaseDirname()
88 .then(function(currentRelease) {
89
90 if (!currentRelease) {
91 return null;
92 }
93
94 return shipit.getReleases()
95 .then(function(releases) {
96 var currentReleaseIndex = releases.indexOf(currentRelease);
97 var releaseIndex = currentReleaseIndex + backFromCurrent;
98 return releaseIndex !== -1 ? releases[releaseIndex] : null;
99 });
100 });
101
102};
103
104/**
105 * Return all remote releases.
106 */
107
108Shipit.getReleases = function() {
109 var shipit = this;
110
111 return shipit.remote('ls -r1 ' + shipit.releasesPath)
112 .then(function(results) {
113 var releases = results.map(computeReleases);
114
115 if (!equalValues(releases))
116 throw new Error('Remote servers are not synced.');
117
118 return releases[0];
119 });
120};
121
122/**
123 * Return SHA from remote REVISION file.
124 *
125 * @param {string} releaseDir Directory name of the relesase dir (YYYYMMDDHHmmss).
126 */
127
128Shipit.getRevision = function(releaseDir) {
129 var shipit = this;
130 var file = path.join(shipit.releasesPath, releaseDir, 'REVISION');
131
132 return shipit.remote('if [ -f ' + file + ' ]; then cat ' + file + ' 2>/dev/null; fi;')
133 .then(function(response) {
134 return response[0].stdout.trim();
135 });
136};
137
138Shipit.getPendingCommits = function() {
139 var shipit = this;
140
141 return shipit.getCurrentReleaseDirname()
142 .then(function(currentReleaseDirname) {
143 if (!currentReleaseDirname) {
144 return null;
145 }
146 return shipit.getRevision(currentReleaseDirname)
147 .then(function(deployedRevision) {
148 if (!deployedRevision) {
149 return null;
150 }
151
152 // Get local remotes.
153 return shipit.local('git remote').then(function(res) {
154 var remotes = res && res.stdout ? res.stdout.split(/\s/) : [];
155
156 if (remotes.length < 1) {
157 return null;
158 }
159
160 // Compare against currently undeployed revision
161 var compareRevision = remotes[0] + '/' + shipit.config.branch;
162
163 // Print diff
164 return shipit.local('git log --pretty=format:\"' + shipit.config.gitLogFormat + '\" ' + deployedRevision + '..' + compareRevision)
165 .then(function(response) {
166 response = response.stdout.trim();
167 return response || null;
168 });
169 });
170 });
171 });
172};