1 | var path = require('path2/posix');
|
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 | Shipit.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 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | Shipit.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 |
|
111 | Shipit.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 |
|
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 |
|
134 | var compareRevision = remotes[0] + '/' + shipit.config.branch;
|
135 |
|
136 |
|
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 | };
|