1 | var path = require('path');
|
2 | var _ = require('lodash');
|
3 | var util = require('util');
|
4 | var Shipit = module.exports;
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | function computeReleases(result) {
|
14 | if (!result.stdout) return null;
|
15 |
|
16 |
|
17 | var dirs = result.stdout.replace(/\n$/, '');
|
18 |
|
19 |
|
20 | return dirs.split('\n');
|
21 | }
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | function equalValues(values) {
|
31 | return values.every(function (value) {
|
32 | return _.isEqual(value, values[0]);
|
33 | });
|
34 | }
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 | function computeReleaseDirname(result) {
|
44 | if (!result.stdout) return null;
|
45 |
|
46 |
|
47 | var target = result.stdout.replace(/\n$/, '');
|
48 |
|
49 | return target.split(path.sep).pop();
|
50 | }
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | Shipit.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 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 | Shipit.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 |
|
106 |
|
107 |
|
108 | Shipit.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 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 | Shipit.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 |
|
138 | Shipit.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 |
|
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 |
|
161 | var compareRevision = remotes[0] + '/' + shipit.config.branch;
|
162 |
|
163 |
|
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 | };
|