Skip to content

Commit ba65e8d

Browse files
author
Eddie Flores
committed
Implement the upload method.
1 parent 098e912 commit ba65e8d

File tree

1 file changed

+106
-2
lines changed

1 file changed

+106
-2
lines changed

lib/ssh-adapter.js

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,115 @@ var list = function () {
138138
});
139139
};
140140

141+
var createDirectory = function (conn, revisionDir) {
142+
return new Promise(function (resolve, reject) {
143+
conn.exec('mkdir ' + revisionDir, function (error, mkdirStream) {
144+
if (error) {
145+
reject(error);
146+
return;
147+
}
148+
mkdirStream.on('error', reject);
149+
mkdirStream.on('close', resolve);
150+
});
151+
});
152+
};
153+
154+
var uploadIndex = function (sftp, indexPath, indexBuffer) {
155+
return new Promise(function (resolve, reject){
156+
var stream = sftp.createWriteStream(indexPath);
157+
stream.on('error', reject);
158+
stream.on('end', reject);
159+
stream.on('close', resolve);
160+
161+
stream.write(indexBuffer);
162+
stream.end();
163+
});
164+
};
165+
var uploadMeta = function (sftp, metaPath, metaBuffer) {
166+
return new Promise(function (resolve, reject){
167+
var stream = sftp.createWriteStream(metaPath);
168+
stream.on('error', reject);
169+
stream.on('end', reject);
170+
stream.on('close', resolve);
171+
172+
stream.write(metaBuffer);
173+
stream.end();
174+
});
175+
};
176+
177+
var uploadRevisionFiles = function (conn, revisionId, indexContents, metaContents) {
178+
var _this = this,
179+
revisionDir = _this.config.remoteDir + revisionId,
180+
indexPath = revisionDir + '/index.html',
181+
metaPath = revisionDir + '/meta.json';
182+
183+
return new Promise(function (resolve, reject) {
184+
conn.sftp(function (err, sftp) {
185+
186+
if (err) {
187+
reject(err);
188+
return;
189+
}
190+
191+
Promise.all([
192+
uploadIndex(sftp, indexPath, indexContents),
193+
uploadMeta(sftp, metaPath, metaContents)
194+
]).then(resolve, reject);
195+
196+
});
197+
});
198+
199+
};
200+
141201
/**
142202
* Upload the latest revision.
143203
*/
144-
var upload = function () {
145-
console.log('Upload will be implemented');
204+
var upload = function (indexBuffer) {
205+
206+
var _this = this;
207+
return new Promise(function (resolve, reject) {
208+
209+
var syncExec = _this.syncExec || require('sync-exec'),
210+
commandResult = syncExec("git log -n 1 --pretty=format:'{%n \"commit\": \"%H\",%n \"author\": \"%an <%ae>\",%n \"date\": \"%ad\",%n \"message\": \"%f\"%n},' $@ | perl -pe 'BEGIN{print \"[\"}; END{print \"]\n\"}' | perl -pe 's/},]/}]/'").stdout,
211+
commandResultJSON = JSON.parse(commandResult),
212+
shortCommitId = commandResultJSON[0].commit.slice(0, 7),
213+
commitMessage = commandResultJSON[0].message,
214+
conn = _this.conn,
215+
config = _this.config,
216+
revisionDir = config.remoteDir + shortCommitId,
217+
host = config.host,
218+
username = config.username;
219+
220+
221+
conn.on('ready', function () {
222+
console.log('+- Connected.');
223+
var creatingDir = createDirectory(conn, revisionDir);
224+
creatingDir.then(function () {
225+
226+
console.log('+- Created directory at ' + revisionDir + '.');
227+
228+
var uploadingFiles = uploadRevisionFiles.call(_this, conn, shortCommitId, indexBuffer, commandResult);
229+
230+
uploadingFiles.then(function (){
231+
console.log('+- Uploaded revision ' + shortCommitId + ': "' + commitMessage.replace(/-/g, ' ') + '".\n');
232+
resolve();
233+
}, function(err) {
234+
console.log('x- Uploaded nothing - error: ', err + '\n');
235+
reject(err);
236+
});
237+
238+
}, reject);
239+
});
240+
241+
conn.on('error', reject);
242+
243+
conn.connect({
244+
host: host,
245+
username: username,
246+
privateKey: require('fs').readFileSync(config.privateKeyFile)
247+
});
248+
249+
});
146250
};
147251

148252
/**

0 commit comments

Comments
 (0)