Ghost/ghost/release-utils/lib/releases.js

143 lines
3.6 KiB
JavaScript
Raw Normal View History

const fs = require('fs');
const os = require('os');
const Promise = require('bluebird');
const requestPromise = require('request-promise');
const request = require('request');
const localUtils = require('./utils');
module.exports.create = (options = {}) => {
let draft = true;
let prerelease = false;
let filterEmojiCommits = true;
localUtils.checkMissingOptions(options,
'changelogPath',
'github',
'github.username',
'github.token',
'userAgent',
'uri',
'tagName',
'releaseName'
);
if (options.hasOwnProperty('draft')) {
draft = options.draft;
}
if (options.hasOwnProperty('prerelease')) {
prerelease = options.prerelease;
}
if (options.hasOwnProperty('filterEmojiCommits')) {
filterEmojiCommits = options.filterEmojiCommits;
}
let content = fs.readFileSync(options.changelogPath).toString('utf8').split(os.EOL);
if (filterEmojiCommits) {
content = localUtils.filterEmojiCommits(content);
}
content = content.filter((item) => {
return item !== undefined;
});
if (options.gistUrl) {
content.push('');
content.push('You can see the [full change log](' + options.gistUrl + ') for the details of every change included in this release.');
}
const auth = 'Basic ' + new Buffer(options.github.username + ':' + options.github.token).toString('base64');
const reqOptions = {
uri: options.uri,
headers: {
'User-Agent': options.userAgent,
Authorization: auth
},
method: 'POST',
body: {
tag_name: options.tagName,
target_commitish: 'master',
name: options.releaseName,
body: content.join(os.EOL),
draft: draft,
prerelease: prerelease
},
json: true,
resolveWithFullResponse: true
};
return requestPromise(reqOptions)
.then((response) => {
return {
id: response.body.id,
releaseUrl: response.body.html_url,
uploadUrl: response.body.upload_url
};
});
};
module.exports.uploadZip = (options = {}) => {
localUtils.checkMissingOptions(options,
'zipPath',
'github',
'github.username',
'github.token',
'userAgent',
'uri'
);
const auth = 'Basic ' + new Buffer(options.github.username + ':' + options.github.token).toString('base64');
const stats = fs.statSync(options.zipPath);
const reqOptions = {
uri: options.uri,
headers: {
'User-Agent': options.userAgent,
Authorization: auth,
'Content-Type': 'application/zip',
'Content-Length': stats.size
},
method: 'POST',
json: true,
resolveWithFullResponse: true
};
return new Promise((resolve, reject) => {
fs.createReadStream(options.zipPath)
.pipe(request.post(reqOptions, (err, res) => {
if (err) {
return reject(err);
}
resolve({
downloadUrl: res.body.browser_download_url
});
}));
});
};
module.exports.get = (options = {}) => {
localUtils.checkMissingOptions(options,
'userAgent',
'uri'
);
const reqOptions = {
uri: options.uri,
headers: {
'User-Agent': options.userAgent
},
method: 'GET',
json: true
};
return requestPromise(reqOptions)
.then((response) => {
return response;
});
};