From 7df531bc4e6d7669962e8f4c53f3d8ba239996fb Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 22 Jan 2019 08:53:52 -0800 Subject: [PATCH] build: fix release asset download for now (#16486) --- package-lock.json | 81 +++++++++++++++++++++++++++++++---------------- package.json | 4 ++- script/release.js | 66 +++++++++++++++++++++++--------------- 3 files changed, 97 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index dfb1b10246d4..4c4244049902 100644 --- a/package-lock.json +++ b/package-lock.json @@ -672,6 +672,16 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "dev": true, + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1550,7 +1560,7 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", "dev": true }, "clang-format": { @@ -1934,6 +1944,15 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -4147,7 +4166,7 @@ "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=", "dev": true }, "find-up": { @@ -4230,6 +4249,26 @@ } } }, + "follow-redirects": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", + "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4369,15 +4408,13 @@ "version": "1.0.0", "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4394,22 +4431,19 @@ "version": "1.1.0", "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -4540,8 +4574,7 @@ "version": "2.0.3", "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -4555,7 +4588,6 @@ "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4572,7 +4604,6 @@ "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4581,15 +4612,13 @@ "version": "0.0.8", "resolved": false, "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "resolved": false, "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -4610,7 +4639,6 @@ "resolved": false, "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -4699,8 +4727,7 @@ "version": "1.0.1", "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -4714,7 +4741,6 @@ "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -4852,7 +4878,6 @@ "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5230,7 +5255,7 @@ "gunzip-maybe": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.1.tgz", - "integrity": "sha1-Occu2J0bSbpwjhh3ZQBIiQKlICc=", + "integrity": "sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g==", "dev": true, "requires": { "browserify-zlib": "^0.1.4", @@ -10282,7 +10307,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, @@ -10788,7 +10813,7 @@ "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "requires": { "through": "2" @@ -10806,7 +10831,7 @@ "split2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha1-GGsldbz4PoW30YRldWI47k7kJJM=", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { "through2": "^2.0.2" @@ -13125,4 +13150,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index a19316c5a002..120ffe1b4ebf 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,12 @@ "@octokit/rest": "^16.3.2", "aliasify": "^2.1.0", "asar": "^0.11.0", + "axios": "^0.18.0", "browserify": "^13.1.0", "check-for-leaks": "^1.0.2", "clang-format": "^1.2.3", "colors": "^1.1.2", + "content-disposition": "^0.5.3", "dotenv-safe": "^4.0.4", "dugite": "^1.45.0", "electron-docs-linter": "^2.4.0", @@ -84,4 +86,4 @@ "remark -qf" ] } -} \ No newline at end of file +} diff --git a/script/release.js b/script/release.js index 168660bb96f4..591f9db849e0 100755 --- a/script/release.js +++ b/script/release.js @@ -6,14 +6,11 @@ const args = require('minimist')(process.argv.slice(2), { boolean: [ 'validateRelease', 'skipVersionCheck', - 'automaticRelease', - 'verboseNugget' - ], - default: { 'verboseNugget': false } + 'automaticRelease' + ] }) const fs = require('fs') const { execSync } = require('child_process') -const nugget = require('nugget') const pkg = require('../package.json') const pkgVersion = `v${pkg.version}` const pass = '\u2713'.green @@ -22,6 +19,8 @@ const fail = '\u2717'.red const sumchecker = require('sumchecker') const temp = require('temp').track() const { URL } = require('url') +const axios = require('axios') +const contentDisposition = require('content-disposition') const octokit = require('@octokit/rest')() octokit.authenticate({ @@ -46,11 +45,11 @@ async function getDraftRelease (version, skipValidation) { const draft = drafts[0] if (!skipValidation) { failureCount = 0 - check(drafts.length === 1, 'one draft exists', true) + check(drafts.length === 1, 'Draft exists.', true) if (versionToCheck.indexOf('beta') > -1) { - check(draft.prerelease, 'draft is a prerelease') + check(draft.prerelease, 'Draft is a prerelease.') } - check(draft.body.length > 50 && !draft.body.includes('(placeholder)'), 'draft has release notes') + check(draft.body.length > 50 && !draft.body.includes('(placeholder)'), 'Draft has release notes.') check((failureCount === 0), `Draft release looks good to go.`, true) } return draft @@ -315,12 +314,10 @@ async function verifyAssets (release) { const assetDetails = await octokit.repos.getReleaseAsset({ owner: 'electron', repo: targetRepo, - asset_id: asset.id, - headers: { - Accept: 'application/octet-stream' - } + asset_id: asset.id }) - await downloadFiles(assetDetails.meta.location, downloadDir, asset.name) + const downloadURL = assetDetails.data.url.replace('://', '://' + process.env.ELECTRON_GITHUB_TOKEN + ':@') + await downloadFiles(downloadURL, downloadDir, asset.name) return asset.name })).catch(err => { console.log(`${fail} Error downloading files from GitHub`, err) @@ -339,21 +336,40 @@ async function verifyAssets (release) { }) } -function downloadFiles (urls, directory, targetName) { - return new Promise((resolve, reject) => { - const nuggetOpts = { dir: directory } - nuggetOpts.quiet = !args.verboseNugget - if (targetName) nuggetOpts.target = targetName +async function downloadFiles (urls, directory, targetName) { + const allUrls = Array.isArray(urls) ? urls : [urls] - nugget(urls, nuggetOpts, (err) => { - if (err) { - reject(err) - } else { - console.log(`${pass} all files downloaded successfully!`) - resolve() + await Promise.all(allUrls.map(async (targetUrl) => { + const axiosResponse = await axios.get(targetUrl, { + responseType: 'stream', + headers: { + Accept: 'application/octet-stream' } }) - }) + + if (axiosResponse.status !== 200) { + throw new Error(`Expected 200 status fetching "${targetUrl}" but got "${axiosResponse.status}"`) + } + let fileName = targetName + if (!fileName) { + if (axiosResponse.headers['content-disposition']) { + const parsed = contentDisposition.parse(axiosResponse.headers['content-disposition']) + fileName = parsed.parameters.filename + } + } + if (!fileName) { + const url = new URL(targetUrl) + fileName = path.basename(url.pathname) + } + if (!fileName) throw new Error(`Unknown filename for request: "${targetUrl}"`) + const writeStream = fs.createWriteStream(path.resolve(directory, fileName)) + axiosResponse.data.pipe(writeStream) + return new Promise((resolve, reject) => { + writeStream.on('error', reject) + axiosResponse.data.on('error', reject) + writeStream.on('close', resolve) + }) + })) } async function verifyShasums (urls, isS3) {