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.

102 lines
2.8 KiB

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