@@ -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