You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.8 KiB
103 lines
2.8 KiB
5 years ago
|
const ghrepos = require('ghrepos')
|
||
|
const ghutils = require('ghutils')
|
||
|
const after = require('after')
|
||
|
const xtend = require('xtend')
|
||
|
const template = require('url-template')
|
||
|
const basename = require('path').basename
|
||
|
const fs = require('fs')
|
||
|
const getMime = require('simple-mime')('application/octet-stream')
|
||
|
const ghget = ghutils.ghget
|
||
|
const ghpost = ghutils.ghpost
|
||
|
|
||
|
function baseUrl (org, repo) {
|
||
|
return ghrepos.baseUrl(org, repo) + '/releases'
|
||
|
}
|
||
|
|
||
|
function getLatest (auth, org, repo, options, callback) {
|
||
|
getBase(auth, org, repo, 'latest', options, callback)
|
||
|
}
|
||
|
|
||
|
function getById (auth, org, repo, id, options, callback) {
|
||
|
getBase(auth, org, repo, id, options, callback)
|
||
|
}
|
||
|
|
||
|
function getByTag (auth, org, repo, tag, options, callback) {
|
||
|
getBase(auth, org, repo, 'tags/' + tag, options, callback)
|
||
|
}
|
||
|
|
||
|
function create (auth, org, repo, data, options, callback) {
|
||
|
if (typeof options === 'function') {
|
||
|
callback = options
|
||
|
options = {}
|
||
|
}
|
||
|
ghutils.ghpost(auth, baseUrl(org, repo), data, options, callback)
|
||
|
}
|
||
|
|
||
|
function uploadAssets (auth, org, repo, tail, files, options, callback) {
|
||
|
if (typeof options === 'function') {
|
||
|
callback = options
|
||
|
options = {}
|
||
|
}
|
||
|
|
||
|
if (typeof files === 'string') files = [ files ]
|
||
|
|
||
|
getBase(auth, org, repo, tail, options, function (err, release) {
|
||
|
if (err) return callback(err)
|
||
|
|
||
|
if (typeof release.upload_url !== 'string') {
|
||
|
return callback(new Error('invalid upload_url'))
|
||
|
}
|
||
|
|
||
|
var results = []
|
||
|
|
||
|
var done = after(files.length, function (err) {
|
||
|
callback(err, results)
|
||
|
})
|
||
|
|
||
|
var assetTemplate = template.parse(release.upload_url)
|
||
|
|
||
|
files.forEach(function (path) {
|
||
|
fs.stat(path, function (err, stats) {
|
||
|
if (err || !stats) {
|
||
|
return done(err || new Error('failed to get file stats'))
|
||
|
}
|
||
|
|
||
|
if (stats.isDirectory()) {
|
||
|
return done(new Error('can only upload files'))
|
||
|
}
|
||
|
|
||
|
var opts = xtend(options, {
|
||
|
headers: {
|
||
|
'content-length': stats.size,
|
||
|
'content-type': getMime(path)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
var name = basename(path)
|
||
|
var uploadUrl = assetTemplate.expand({ name: name })
|
||
|
|
||
|
ghpost(auth, uploadUrl, fs.createReadStream(path), opts, function (err, result) {
|
||
|
if (!err) results.push(result)
|
||
|
done(err)
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
}
|
||
|
|
||
|
function getBase (auth, org, repo, tail, options, callback) {
|
||
|
if (typeof options === 'function') {
|
||
|
callback = options
|
||
|
options = {}
|
||
|
}
|
||
|
var url = baseUrl(org, repo) + '/' + tail
|
||
|
ghget(auth, url, options, callback)
|
||
|
}
|
||
|
|
||
|
module.exports.list = ghrepos.createLister('releases')
|
||
|
module.exports.getLatest = getLatest
|
||
|
module.exports.getById = getById
|
||
|
module.exports.getByTag = getByTag
|
||
|
module.exports.create = create
|
||
|
module.exports.uploadAssets = uploadAssets
|