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