Coverage

84%
77
65
12

/ssh-adapter.js

84%
77
65
12
LineHitsSource
1/* jshint node: true */
21'use strict';
31var CoreObject = require('core-object');
41var Promise = require('ember-cli/lib/ext/promise');
51var SilentError = require('ember-cli/lib/errors/silent');
61var ssh2 = require('ssh2');
7
81module.exports = CoreObject.extend({
9 init: function() {
108 CoreObject.prototype.init.apply(this, arguments);
118 if (!this.config) {
120 return Promise.reject(new SilentError('You must supply a config'));
13 }
14
158 this.client = new ssh2.Client();
16 },
17
18 activate: function(revision) {
192 return this._getFileList()
20 .then(this._excludeCurrentRevisionFile.bind(this))
21 .then(this._getRevisions.bind(this))
22 .then(this._activateRevision.bind(this, revision))
23 .then(this._printSuccessMessage.bind(this, 'Revision activated: ' + revision));
24 },
25
26 list: function() {
274 return this._list()
28 .then(this._printRevisions.bind(this));
29 },
30
31 upload: function(buffer) {
322 var key = this.taggingAdapter.createTag();
332 return this._uploadIfMissing(buffer, key);
34 },
35
36 _list: function() {
376 return this._getFileList()
38 .then(this._sortFileList.bind(this))
39 .then(this._excludeCurrentRevisionFile.bind(this))
40 .then(this._getRevisions.bind(this));
41 },
42
43 _getFileList: function() {
448 var conn = this.client;
458 var config = this.config;
468 return new Promise(function (resolve, reject) {
478 conn.on('ready', function () {
4810 conn.sftp(function(err, sftp) {
4910 if (err) {
500 throw err;
51 }
5210 sftp.readdir(config.remoteDir, function(err, list) {
5310 if (err) {
540 reject(err);
55 } else {
5610 conn.end();
5710 resolve(list);
58 }
59 });
60 });
61 }).on('error', function (error) {
620 reject(error);
63 }).connect({
64 host: config.host,
65 username: config.username,
66 privateKey: require('fs').readFileSync(config.privateKeyFile),
67 });
68 });
69 },
70
71 _sortFileList: function(fileList) {
726 return fileList.sort(function(a, b) {
733 return b.attrs.mtime - a.attrs.mtime;
74 });
75 },
76
77 _getRevisions: function(files) {
788 return files.map(function(file) {
799 return file.filename.substring(0, (file.filename.length - 5));
80 });
81 },
82
83 _excludeCurrentRevisionFile: function(data) {
848 return data.filter(function (file) {
8510 return file.filename !== 'index.html';
86 });
87 },
88
89 _activateRevision: function (targetRevision, revisions) {
902 if (revisions.indexOf(targetRevision) > -1) {
911 var conn = this.client;
921 var config = this.config;
931 var revisionFile = config.remoteDir + targetRevision + '.html';
941 var indexFile = config.remoteDir + 'index.html';
951 return new Promise(function (resolve, reject) {
961 conn.on('ready', function () {
971 conn.sftp(function(err, sftp) {
981 if (err) {
990 throw err;
100 }
1011 sftp.unlink(indexFile, function (err) {
1021 if (err) {
1030 throw err;
104 }
1051 sftp.symlink(revisionFile, indexFile, function(err) {
1061 if (err) {
1070 reject(err);
108 } else {
1091 conn.end();
1101 resolve();
111 }
112 });
113 });
114 });
115 }).on('error', function (error) {
1160 reject(error);
117 }).connect({
118 host: config.host,
119 username: config.username,
120 privateKey: require('fs').readFileSync(config.privateKeyFile),
121 });
122 });
123 } else {
1241 return this._printErrorMessage("Revision doesn't exist");
125 }
126 },
127
128 _uploadIfMissing: function(value, key) {
1292 var conn = this.client;
1302 var config = this.config;
1312 return new Promise(function(resolve, reject) {
1322 this._list()
133 .then(function(revisions) {
1342 if (revisions.indexOf(key) < 0) {
1351 conn.on('ready', function () {
1361 conn.sftp(function(err, sftp) {
1371 if (err) {
1380 throw err;
139 }
1401 var writeStream = sftp.createWriteStream(config.remoteDir + key + '.html');
1411 writeStream.on('error', function(err) {
1420 reject(err);
143 });
1441 writeStream.on('finish', function() {
1451 resolve();
146 });
1471 writeStream.write(value);
148 });
149 }).on('error', function (error) {
1500 reject(error);
151 }).connect({
152 host: config.host,
153 username: config.username,
154 privateKey: require('fs').readFileSync(config.privateKeyFile),
155 });
156 } else {
1571 reject(new SilentError('Revision already uploaded.'));
158 }
159 }.bind(this))
160 .catch(function (error) {
1610 reject(error);
162 });
163 }.bind(this));
164 },
165
166 _printRevisions: function(list) {
1674 var header = 'Found the following revisions:';
1684 var revisionsList = list.join('\n');
1694 return this._printSuccessMessage('\n' + header + '\n\n' + revisionsList + '\n');
170 },
171
172 _printSuccessMessage: function (message) {
1735 return this.ui.writeLine(message);
174 },
175
176 _printErrorMessage: function (message) {
1771 return Promise.reject(new SilentError(message));
178 },
179
180});
181