55 строки
1.3 KiB
JavaScript
55 строки
1.3 KiB
JavaScript
'use strict'
|
|
const got = require('got')
|
|
const api = require('./heroku-api')
|
|
const git = require('./git')
|
|
const Promise = require('bluebird')
|
|
const fs = Promise.promisifyAll(require('fs'))
|
|
|
|
function* uploadArchive (url, filePath) {
|
|
const request = got.stream.put(url, {
|
|
headers: {
|
|
'content-length': (yield fs.statAsync(filePath)).size
|
|
}
|
|
})
|
|
|
|
fs.createReadStream(filePath).pipe(request)
|
|
|
|
return new Promise((resolve, reject) => {
|
|
request.on('error', reject)
|
|
request.on('response', resolve)
|
|
})
|
|
}
|
|
|
|
function* prepareSource (ref, context, heroku) {
|
|
const [filePath, source] = yield [
|
|
git.createArchive(ref),
|
|
api.createSource(heroku)
|
|
]
|
|
yield uploadArchive(source.source_blob.put_url, filePath)
|
|
return Promise.resolve(source)
|
|
}
|
|
|
|
function* urlExists (url) {
|
|
return yield got.head(url)
|
|
}
|
|
|
|
function* createSourceBlob (ref, context, heroku) {
|
|
try {
|
|
const githubRepository = yield git.githubRepository()
|
|
const { user, repo } = githubRepository
|
|
const archiveLink = yield api.githubArchiveLink(heroku, user, repo, ref)
|
|
|
|
if (yield urlExists(archiveLink.archive_link)) {
|
|
return archiveLink.archive_link
|
|
}
|
|
} catch (ex) { }
|
|
|
|
const sourceBlob = yield prepareSource(ref, context, heroku)
|
|
return sourceBlob.source_blob.get_url
|
|
}
|
|
|
|
module.exports = {
|
|
createSourceBlob,
|
|
prepareSource
|
|
}
|