Skip to content

Commit 0165914

Browse files
gr2mpvdlg
authored andcommitted
fix(package): update github to version 13.0.0
1 parent edec102 commit 0165914

5 files changed

Lines changed: 103 additions & 110 deletions

File tree

lib/publish.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
const {basename} = require('path');
1+
const {basename, extname} = require('path');
22
const {parse} = require('url');
3-
const {stat} = require('fs-extra');
3+
const {stat, readFile} = require('fs-extra');
44
const parseGithubUrl = require('parse-github-url');
55
const GitHubApi = require('github');
66
const pEachSeries = require('p-each-series');
77
const debug = require('debug')('semantic-release:publish-github');
8+
const mime = require('mime');
89
const resolveConfig = require('./resolve-config');
910

1011
module.exports = async (pluginConfig, {branch, repositoryUrl}, {version, gitHead, gitTag, notes}, logger) => {
@@ -35,8 +36,8 @@ module.exports = async (pluginConfig, {branch, repositoryUrl}, {version, gitHead
3536
await github.gitdata.createReference({owner, repo, ref, sha: gitHead});
3637
}
3738

38-
const {data: {id, html_url}} = await github.repos.createRelease(release); // eslint-disable-line camelcase
39-
logger.log('Published Github release: %s', html_url);
39+
const {data: {html_url: htmlUrl, upload_url: uploadUrl}} = await github.repos.createRelease(release);
40+
logger.log('Published Github release: %s', htmlUrl);
4041

4142
if (assets && assets.length > 0) {
4243
// Make requests serially to avoid hitting the rate limit (https://developer.github.com/v3/guides/best-practices-for-integrators/#dealing-with-abuse-rate-limits)
@@ -54,15 +55,23 @@ module.exports = async (pluginConfig, {branch, repositoryUrl}, {version, gitHead
5455
return;
5556
}
5657
const fileName = asset.name || basename(filePath);
57-
const upload = {owner, repo, id, filePath, name: fileName};
58+
const upload = {
59+
owner,
60+
repo,
61+
url: uploadUrl,
62+
file: await readFile(filePath),
63+
contentType: mime.getType(extname(fileName)),
64+
contentLength: file.size,
65+
name: fileName,
66+
};
5867
debug('file path: %o', filePath);
5968
debug('file name: %o', fileName);
6069
if (asset.label) {
6170
upload.label = asset.label;
6271
}
6372

64-
const {data: {browser_download_url}} = await github.repos.uploadAsset(upload); // eslint-disable-line camelcase
65-
logger.log('Published file %s', browser_download_url);
73+
const {data: {browser_download_url: downloadUrl}} = await github.repos.uploadAsset(upload);
74+
logger.log('Published file %s', downloadUrl);
6675
});
6776
}
6877
};

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"@semantic-release/error": "^2.1.0",
2020
"debug": "^3.1.0",
2121
"fs-extra": "^4.0.2",
22-
"github": "^12.0.5",
22+
"github": "^13.0.0",
23+
"mime": "^2.0.3",
2324
"p-each-series": "^1.0.0",
2425
"parse-github-url": "^1.0.1"
2526
},

test/helpers/mock-github.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ export function authenticate(
1818
* Retun a `nock` object setup to respond to a github release upload request. Other expectation and responses can be chained.
1919
*
2020
* @param {String} [githubToken='GH_TOKEN'] The github token to return in the authentication response.
21-
* @param {String} [githubUrl='https://uploads.github.com'] The url on which to intercept http requests.
21+
* @param {String} [uploadUrl] The url on which to intercept http requests.
2222
* @return {Object} A `nock` object ready to respond to a github file upload request.
2323
*/
24-
export function upload({githubToken = 'GH_TOKEN', githubUrl = 'https://uploads.github.com'} = {}) {
25-
return nock(`${githubUrl}${githubUrl === 'https://uploads.github.com' ? '' : '/api/uploads'}`, {
26-
reqheaders: {Authorization: `token ${githubToken}`},
24+
export function upload({githubToken = 'GH_TOKEN', uploadUrl, contentType = 'text/plain', contentLength} = {}) {
25+
return nock(uploadUrl, {
26+
reqheaders: {Authorization: `token ${githubToken}`, 'content-type': contentType, 'content-length': contentLength},
2727
});
2828
}

test/integration.test.js

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {escape} from 'querystring';
22
import test from 'ava';
3+
import {stat} from 'fs-extra';
34
import {stub, match} from 'sinon';
45
import clearModule from 'clear-module';
56
import SemanticReleaseError from '@semantic-release/error';
@@ -113,6 +114,8 @@ test.serial('Publish a release with an array of assets', async t => {
113114
const assetUrl = `https://github.com/${owner}/${repo}/releases/download/${nextRelease.version}/upload.txt`;
114115
const otherAssetUrl = `https://github.com/${owner}/${repo}/releases/download/${nextRelease.version}/other_file.txt`;
115116
const releaseId = 1;
117+
const uploadUri = `/api/uploads/repos/${owner}/${repo}/releases/${releaseId}/assets`;
118+
const uploadUrl = `https://github.com${uploadUri}{?name,label}`;
116119

117120
const github = authenticate({githubToken})
118121
.get(`/repos/${owner}/${repo}`)
@@ -127,16 +130,22 @@ test.serial('Publish a release with an array of assets', async t => {
127130
name: nextRelease.gitTag,
128131
body: nextRelease.notes,
129132
})
130-
.reply(200, {html_url: releaseUrl, id: releaseId});
131-
132-
const githubUpload = upload({githubToken})
133-
.post(`/repos/${owner}/${repo}/releases/${releaseId}/assets?name=${escape('upload.txt')}`)
134-
.reply(200, {browser_download_url: assetUrl})
135-
.post(
136-
`/repos/${owner}/${repo}/releases/${releaseId}/assets?name=${escape('other_file.txt')}&label=${escape(
137-
'Other File'
138-
)}`
139-
)
133+
.reply(200, {upload_url: uploadUrl, html_url: releaseUrl});
134+
135+
const githubUpload1 = upload({
136+
githubToken,
137+
uploadUrl: 'https://github.com',
138+
contentLength: (await stat('test/fixtures/upload.txt')).size,
139+
})
140+
.post(`${uploadUri}?name=${escape('upload.txt')}`)
141+
.reply(200, {browser_download_url: assetUrl});
142+
143+
const githubUpload2 = upload({
144+
githubToken,
145+
uploadUrl: 'https://github.com',
146+
contentLength: (await stat('test/fixtures/upload_other.txt')).size,
147+
})
148+
.post(`${uploadUri}?name=${escape('other_file.txt')}&label=${escape('Other File')}`)
140149
.reply(200, {browser_download_url: otherAssetUrl});
141150

142151
await t.context.m.publish({githubToken, assets}, {nextRelease, options, logger: t.context.logger});
@@ -145,7 +154,8 @@ test.serial('Publish a release with an array of assets', async t => {
145154
t.true(t.context.log.calledWith(match.string, assetUrl));
146155
t.true(t.context.log.calledWith(match.string, otherAssetUrl));
147156
t.true(github.isDone());
148-
t.true(githubUpload.isDone());
157+
t.true(githubUpload1.isDone());
158+
t.true(githubUpload2.isDone());
149159
});
150160

151161
test.serial('Verify Github auth and release', async t => {
@@ -166,6 +176,8 @@ test.serial('Verify Github auth and release', async t => {
166176
const assetUrl = `https://github.com/${owner}/${repo}/releases/download/${nextRelease.version}/upload.txt`;
167177
const otherAssetUrl = `https://github.com/${owner}/${repo}/releases/download/${nextRelease.version}/other_file.txt`;
168178
const releaseId = 1;
179+
const uploadUri = `/api/uploads/repos/${owner}/${repo}/releases/${releaseId}/assets`;
180+
const uploadUrl = `https://github.com${uploadUri}{?name,label}`;
169181

170182
const github = authenticate({githubToken: process.env.GH_TOKEN})
171183
.get(`/repos/${owner}/${repo}`)
@@ -180,16 +192,22 @@ test.serial('Verify Github auth and release', async t => {
180192
name: nextRelease.gitTag,
181193
body: nextRelease.notes,
182194
})
183-
.reply(200, {html_url: releaseUrl, id: releaseId});
184-
185-
const githubUpload = upload({githubToken: process.env.GH_TOKEN})
186-
.post(`/repos/${owner}/${repo}/releases/${releaseId}/assets?name=${escape('upload.txt')}`)
187-
.reply(200, {browser_download_url: assetUrl})
188-
.post(
189-
`/repos/${owner}/${repo}/releases/${releaseId}/assets?name=${escape('other_file.txt')}&label=${escape(
190-
'Other File'
191-
)}`
192-
)
195+
.reply(200, {upload_url: uploadUrl, html_url: releaseUrl});
196+
197+
const githubUpload1 = upload({
198+
githubToken: process.env.GH_TOKEN,
199+
uploadUrl: 'https://github.com',
200+
contentLength: (await stat('test/fixtures/upload.txt')).size,
201+
})
202+
.post(`${uploadUri}?name=${escape('upload.txt')}`)
203+
.reply(200, {browser_download_url: assetUrl});
204+
205+
const githubUpload2 = upload({
206+
githubToken: process.env.GH_TOKEN,
207+
uploadUrl: 'https://github.com',
208+
contentLength: (await stat('test/fixtures/upload_other.txt')).size,
209+
})
210+
.post(`${uploadUri}?name=${escape('other_file.txt')}&label=${escape('Other File')}`)
193211
.reply(200, {browser_download_url: otherAssetUrl});
194212

195213
await t.notThrows(t.context.m.verifyConditions({}, {options}));
@@ -199,5 +217,6 @@ test.serial('Verify Github auth and release', async t => {
199217
t.true(t.context.log.calledWith(match.string, assetUrl));
200218
t.true(t.context.log.calledWith(match.string, otherAssetUrl));
201219
t.true(github.isDone());
202-
t.true(githubUpload.isDone());
220+
t.true(githubUpload1.isDone());
221+
t.true(githubUpload2.isDone());
203222
});

0 commit comments

Comments
 (0)