diff --git a/lib/datasource/npm.js b/lib/datasource/npm.js index fc01fd8dd27fed598b53751e62b22ecbcbb303f6..36f4ff9d7b99a4c16b229b41e38c9a6e5080c9be 100644 --- a/lib/datasource/npm.js +++ b/lib/datasource/npm.js @@ -146,17 +146,7 @@ async function getDependency(name, retries = 5) { let repositoryUrl; if (res.repository) { - const extraBaseUrls = []; - // istanbul ignore if - if (process.env.GITHUB_ENDPOINT) { - const parsedEndpoint = url.parse(process.env.GITHUB_ENDPOINT); - extraBaseUrls.push( - parsedEndpoint.hostname, - `gist.${parsedEndpoint.hostname}` - ); - } - - repositoryUrl = parse(res.repository.url, { extraBaseUrls }); + repositoryUrl = parse(res.repository.url); } if (!repositoryUrl) { repositoryUrl = res.homepage; diff --git a/lib/workers/pr/changelog/index.js b/lib/workers/pr/changelog/index.js index 341dbd843caca9815213b1b34519ab6004a9ec61..a52a93c4d01f969484e2d09ba1148ea51cb7c9d5 100644 --- a/lib/workers/pr/changelog/index.js +++ b/lib/workers/pr/changelog/index.js @@ -1,5 +1,3 @@ -const url = require('url'); - const { addReleaseNotes } = require('../release-notes'); const sourceCache = require('./source-cache'); @@ -18,77 +16,22 @@ async function getChangeLogJSON(args) { if (!fromVersion || fromVersion === newVersion) { return null; } - - let token; - let endpoint; - let gheBaseURL; - const opts = { - githubBaseURL: 'https://github.com/', - }; - - // istanbul ignore if - if (process.env.GITHUB_ENDPOINT) { - token = process.env.GITHUB_TOKEN; - endpoint = process.env.GITHUB_ENDPOINT; - const parsedEndpoint = url.parse(endpoint); - gheBaseURL = `${parsedEndpoint.protocol}//${parsedEndpoint.hostname}/`; + // Return from cache if present + let res = await sourceCache.getChangeLogJSON(args); + if (res) { + return addReleaseNotes(res); + } + let pkg = null; + if (['npm', 'meteor'].includes(manager)) { + pkg = await managerNpm.getPackage(args); } - try { - // Return from cache if present - let res = await sourceCache.getChangeLogJSON(args); - if (res) { - if (res.project && res.project.githubBaseURL !== gheBaseURL) { - logger.debug('Removing GHE token before calling addReleaseNotes'); - delete process.env.GITHUB_ENDPOINT; - process.env.GITHUB_TOKEN = process.env.GITHUB_COM_TOKEN; - } - } else { - let pkg = null; - if (['npm', 'meteor'].includes(manager)) { - pkg = await managerNpm.getPackage(args); - } - - if (manager === 'pip_requirements') { - pkg = await managerPip.getPackage(args); - } - - if ( - pkg && - pkg.repositoryUrl && - gheBaseURL && - pkg.repositoryUrl.startsWith(gheBaseURL) - ) { - logger.debug( - 'Found package hosted on internal GHE. Preserving GHE token' - ); - opts.githubBaseURL = gheBaseURL; - } else { - logger.debug('Removing GHE token before calling getChangeLogJSON'); - delete process.env.GITHUB_ENDPOINT; - process.env.GITHUB_TOKEN = process.env.GITHUB_COM_TOKEN; - } - - res = await sourceGithub.getChangeLogJSON({ - ...args, - ...pkg, - ...opts, - }); - - await sourceCache.setChangeLogJSON(args, res); - } + if (manager === 'pip_requirements') { + pkg = await managerPip.getPackage(args); + } - const output = await addReleaseNotes(res); + res = await sourceGithub.getChangeLogJSON({ ...args, ...pkg }); - return output; - } finally { - // wrap everything in a try/finally to ensure process.env.GITHUB_TOKEN is restore no matter if - // getChangeLogJSON and addReleaseNotes succed or fails - // istanbul ignore if - if (endpoint !== process.env.GITHUB_ENDPOINT) { - logger.debug('Restoring GHE token and endpoint'); - process.env.GITHUB_TOKEN = token; - process.env.GITHUB_ENDPOINT = endpoint; - } - } + await sourceCache.setChangeLogJSON(args, res); + return addReleaseNotes(res); } diff --git a/lib/workers/pr/changelog/source-github.js b/lib/workers/pr/changelog/source-github.js index 6a61089eff941367e721b58c99054037988c0e74..de39aecdea5200b47a6623a78c3a2a74b6e09f9f 100644 --- a/lib/workers/pr/changelog/source-github.js +++ b/lib/workers/pr/changelog/source-github.js @@ -9,9 +9,10 @@ async function getTags(repository) { try { const versions = {}; - const res = await ghGot(`repos/${repository}/tags?per_page=100`, { - paginate: true, - }); + const res = await ghGot( + `https://api.github.com/repos/${repository}/tags?per_page=100`, + { paginate: true } + ); const tags = (res && res.body) || []; @@ -46,7 +47,9 @@ async function getRepositoryHead(repository, version) { } logger.trace({ repository, version }, 'Looking for commit SHA by date'); try { - const res = await ghGot(`repos/${repository}/commits/@{${version.date}}`); + const res = await ghGot( + `https://api.github.com/repos/${repository}/commits/@{${version.date}}` + ); const commit = res && res.body; return commit && commit.sha; } catch (err) { @@ -56,7 +59,6 @@ async function getRepositoryHead(repository, version) { } async function getChangeLogJSON({ - githubBaseURL, repositoryUrl, fromVersion, newVersion, @@ -65,13 +67,13 @@ async function getChangeLogJSON({ logger.debug('Checking for github source URL manually'); const semverString = `>${fromVersion} <=${newVersion}`; logger.trace(`semverString: ${semverString}`); - if (!(repositoryUrl && repositoryUrl.startsWith(githubBaseURL))) { + if (!(repositoryUrl && repositoryUrl.startsWith('https://github.com/'))) { logger.debug('No repo found manually'); return null; } logger.debug({ url: repositoryUrl }, 'Found github URL manually'); const repository = repositoryUrl - .replace(githubBaseURL, '') + .replace('https://github.com/', '') .replace(/#.*/, ''); if (repository.split('/').length !== 2) { logger.debug('Invalid github URL found'); @@ -104,7 +106,7 @@ async function getChangeLogJSON({ const prevHead = await getHead(prev); const nextHead = await getHead(next); if (prevHead && nextHead) { - release.compare.url = `${githubBaseURL}${repository}/compare/${prevHead}...${nextHead}`; + release.compare.url = `https://github.com/${repository}/compare/${prevHead}...${nextHead}`; } releases.unshift(release); } @@ -112,7 +114,6 @@ async function getChangeLogJSON({ const res = { project: { - githubBaseURL, github: repository, repository: repositoryUrl, }, diff --git a/lib/workers/pr/index.js b/lib/workers/pr/index.js index 36f3fedd7dbac2a9037be3ce90171a42bfe7547f..2a01ad300755e60c8c7414072e225ec368d44ab6 100644 --- a/lib/workers/pr/index.js +++ b/lib/workers/pr/index.js @@ -103,6 +103,16 @@ async function ensurePr(prConfig) { const commitRepos = []; + let token; + let endpoint; + // istanbul ignore if + if (process.env.GITHUB_ENDPOINT) { + logger.debug('Removing GHE token before calling changelog'); + endpoint = process.env.GITHUB_ENDPOINT; + delete process.env.GITHUB_ENDPOINT; + token = process.env.GITHUB_TOKEN; + process.env.GITHUB_TOKEN = process.env.GITHUB_COM_TOKEN; + } // Get changelog and then generate template strings for (const upgrade of upgrades) { const upgradeKey = `${upgrade.depName}-${upgrade.manager}-${ @@ -139,6 +149,12 @@ async function ensurePr(prConfig) { } config.upgrades.push(upgrade); } + // istanbul ignore if + if (endpoint) { + logger.debug('Restoring GHE token and endpoint'); + process.env.GITHUB_TOKEN = token; + process.env.GITHUB_ENDPOINT = endpoint; + } // Update the config object Object.assign(config, upgrades[0]); diff --git a/lib/workers/pr/release-notes.js b/lib/workers/pr/release-notes.js index 06be88e0109077488ac27151dbf1090579e8ce3e..52c3887bda25c8d6c7c3e6b62facf53c6cd7ff55 100644 --- a/lib/workers/pr/release-notes.js +++ b/lib/workers/pr/release-notes.js @@ -16,7 +16,9 @@ module.exports = { async function getReleaseList(repository) { logger.debug('getReleaseList()'); try { - const res = await ghGot(`repos/${repository}/releases?per_page=100`); + const res = await ghGot( + `https://api.github.com/repos/${repository}/releases?per_page=100` + ); return res.body.map(release => ({ url: release.html_url, id: release.id, @@ -30,21 +32,19 @@ async function getReleaseList(repository) { } } -function massageBody(input, githubBaseURL) { +function massageBody(input) { let body = input || ''; // Convert line returns body = body.replace(/\r\n/g, '\n'); // semantic-release cleanup body = body.replace(/^<a name="[^"]*"><\/a>\n/, ''); body = body.replace( - new RegExp( - `^##? \\[[^\\]]*\\]\\(${githubBaseURL}[^/]*\\/[^/]*\\/compare\\/.*?\\n` - ), + /^##? \[[^\]]*\]\(https:\/\/github.com\/[^/]*\/[^/]*\/compare\/.*?\n/, '' ); // Clean-up unnecessary commits link body = `\n${body}\n`.replace( - new RegExp(`\\n${githubBaseURL}[^/]+\\/[^/]+\\/compare\\/[^\\n]+(\\n|$)`), + /\nhttps:\/\/github.com\/[^/]+\/[^/]+\/compare\/[^\n]+(\n|$)/, '\n' ); // Reduce headings size @@ -56,17 +56,17 @@ function massageBody(input, githubBaseURL) { return body.trim(); } -async function getReleaseNotes(repository, version, githubBaseURL) { +async function getReleaseNotes(repository, version) { logger.debug(`getReleaseNotes(${repository}, ${version})`); const releaseList = await getReleaseList(repository); let releaseNotes; releaseList.forEach(release => { if (release.tag === version || release.tag === `v${version}`) { releaseNotes = release; - releaseNotes.url = `${githubBaseURL}${repository}/releases/${ + releaseNotes.url = `https://github.com/${repository}/releases/${ release.tag }`; - releaseNotes.body = massageBody(releaseNotes.body, githubBaseURL); + releaseNotes.body = massageBody(releaseNotes.body); if (!releaseNotes.body.length) { releaseNotes = undefined; } @@ -100,11 +100,11 @@ function sectionize(text, level) { return result; } -async function getReleaseNotesMd(repository, version, githubBaseURL) { +async function getReleaseNotesMd(repository, version) { logger.trace(`getReleaseNotes(${repository}, ${version})`); let changelogMd = ''; try { - const apiPrefix = `repos/${repository}/contents/`; + const apiPrefix = `https://api.github.com/repos/${repository}/contents/`; const filesRes = await ghGot(apiPrefix); const files = filesRes.body .map(f => f.name) @@ -141,10 +141,10 @@ async function getReleaseNotesMd(repository, version, githubBaseURL) { for (const word of title) { if (word.includes(version)) { logger.trace({ body }, 'Found release notes for v' + version); - let url = `${githubBaseURL}${repository}/blob/master/CHANGELOG.md#`; + let url = `https://github.com/${repository}/blob/master/CHANGELOG.md#`; url += title.join('-').replace(/[^A-Za-z0-9-]/g, ''); return { - body: massageBody(body, githubBaseURL), + body: massageBody(body), url, }; } @@ -168,18 +168,10 @@ async function addReleaseNotes(input) { const output = { ...input, versions: [] }; const repository = input.project.github.replace(/\.git$/, ''); for (const v of input.versions) { - let releaseNotes = await getReleaseNotesMd( - repository, - v.version, - input.project.githubBaseURL - ); + let releaseNotes = await getReleaseNotesMd(repository, v.version); if (!releaseNotes) { logger.trace('No markdown release notes found for v' + v.version); - releaseNotes = await getReleaseNotes( - repository, - v.version, - input.project.githubBaseURL - ); + releaseNotes = await getReleaseNotes(repository, v.version); } // Small hack to force display of release notes when there is a compare url if (!releaseNotes && v.compare.url) { diff --git a/test/workers/pr/__snapshots__/changelog.spec.js.snap b/test/workers/pr/__snapshots__/changelog.spec.js.snap index f1a994ef45ca25b28865989752da8b8abdc2a637..62e5f122586fcdeaf602bb10b55afb8dba0a1b74 100644 --- a/test/workers/pr/__snapshots__/changelog.spec.js.snap +++ b/test/workers/pr/__snapshots__/changelog.spec.js.snap @@ -5,7 +5,6 @@ Object { "hasReleaseNotes": true, "project": Object { "github": "chalk/chalk", - "githubBaseURL": "https://github.com/", "repository": "https://github.com/chalk/chalk", }, "versions": Array [ @@ -58,7 +57,6 @@ Object { "hasReleaseNotes": true, "project": Object { "github": "chalk/chalk", - "githubBaseURL": "https://github.com/", "repository": "https://github.com/chalk/chalk", }, "versions": Array [ @@ -102,61 +100,11 @@ Object { } `; -exports[`workers/pr/changelog getChangeLogJSON supports github enterprise 1`] = ` -Object { - "hasReleaseNotes": true, - "project": Object { - "github": "chalk/chalk", - "githubBaseURL": "https://github-enterprise.example.com/", - "repository": "https://github-enterprise.example.com/chalk/chalk", - }, - "versions": Array [ - Object { - "changes": Array [], - "compare": Object {}, - "date": undefined, - "releaseNotes": undefined, - "version": "2.5.2", - }, - Object { - "changes": Array [], - "compare": Object {}, - "date": "2017-12-24T03:20:46.238Z", - "releaseNotes": undefined, - "version": "2.4.2", - }, - Object { - "changes": Array [], - "compare": Object { - "url": "https://github-enterprise.example.com/chalk/chalk/compare/npm_2.2.2...npm_2.3.0", - }, - "date": "2017-10-24T03:20:46.238Z", - "releaseNotes": Object { - "url": "https://github-enterprise.example.com/chalk/chalk/compare/npm_2.2.2...npm_2.3.0", - }, - "version": "2.3.0", - }, - Object { - "changes": Array [], - "compare": Object { - "url": "https://github-enterprise.example.com/chalk/chalk/compare/npm_1.0.0...npm_2.2.2", - }, - "date": undefined, - "releaseNotes": Object { - "url": "https://github-enterprise.example.com/chalk/chalk/compare/npm_1.0.0...npm_2.2.2", - }, - "version": "2.2.2", - }, - ], -} -`; - exports[`workers/pr/changelog getChangeLogJSON supports pip 1`] = ` Object { "hasReleaseNotes": false, "project": Object { "github": "chalk/chalk", - "githubBaseURL": "https://github.com/", "repository": "https://github.com/chalk/chalk", }, "versions": Array [ @@ -197,7 +145,6 @@ Object { "hasReleaseNotes": true, "project": Object { "github": "chalk/chalk", - "githubBaseURL": "https://github.com/", "repository": "https://github.com/chalk/chalk", }, "versions": Array [ @@ -250,7 +197,6 @@ Object { "hasReleaseNotes": true, "project": Object { "github": "chalk/chalk", - "githubBaseURL": "https://github.com/", "repository": "https://github.com/chalk/chalk", }, "versions": Array [ diff --git a/test/workers/pr/changelog.spec.js b/test/workers/pr/changelog.spec.js index 95091ba7015b06c3c7e78edf34d273f1f3610f2e..9f8b5d643fdd6cf953324733b08c2c344b0d1225 100644 --- a/test/workers/pr/changelog.spec.js +++ b/test/workers/pr/changelog.spec.js @@ -173,18 +173,5 @@ describe('workers/pr/changelog', () => { await getChangeLogJSON({ ...upgrade, manager: 'pip_requirements' }) ).toBe(null); }); - it('supports github enterprise', async () => { - // clear the mock - npmRegistry.getDependency.mockReset(); - const res = npmResponse(); - res.repositoryUrl = 'https://github-enterprise.example.com/chalk/chalk'; - npmRegistry.getDependency.mockReturnValueOnce(Promise.resolve(res)); - - const endpoint = process.env.GITHUB_ENDPOINT; - process.env.GITHUB_ENDPOINT = 'https://github-enterprise.example.com/'; - expect(await getChangeLogJSON({ ...upgrade })).toMatchSnapshot(); - - process.env.GITHUB_ENDPOINT = endpoint; - }); }); }); diff --git a/test/workers/pr/index.spec.js b/test/workers/pr/index.spec.js index daaab7ba23e3ec58591cca88ffe6cec5879a0f02..7e6ae6743250f9ad91ead95289c11b5a332e9308 100644 --- a/test/workers/pr/index.spec.js +++ b/test/workers/pr/index.spec.js @@ -6,7 +6,6 @@ jest.mock('../../../lib/workers/pr/changelog'); changelogHelper.getChangeLogJSON = jest.fn(); changelogHelper.getChangeLogJSON.mockReturnValue({ project: { - githubBaseURL: 'https://github.com/', github: 'renovateapp/dummy', repository: 'https://github.com/renovateapp/dummy', }, diff --git a/test/workers/pr/release-notes.spec.js b/test/workers/pr/release-notes.spec.js index 3b2a1f05d17397e337af70abaad754c8c74ce582..4a4ae3beff784eecf88a3daabb05330f07dd49e1 100644 --- a/test/workers/pr/release-notes.spec.js +++ b/test/workers/pr/release-notes.spec.js @@ -33,32 +33,20 @@ describe('workers/pr/release-notes', () => { ghGot.mockReturnValueOnce({ body: [{ tag_name: 'v1.0.0' }, { tag_name: 'v1.0.1' }], }); - const res = await getReleaseNotes( - 'some/repository', - '1.0.0', - 'https://github.com/' - ); + const res = await getReleaseNotes('some/repository', '1.0.0'); expect(res).toMatchSnapshot(); }); }); describe('getReleaseNotesMd()', () => { it('handles not found', async () => { - const res = await getReleaseNotesMd( - 'chalk', - '2.0.0', - 'https://github.com/' - ); + const res = await getReleaseNotesMd('chalk', '2.0.0'); expect(res).toBe(null); }); it('handles files mismatch', async () => { ghGot.mockReturnValueOnce({ body: [{ name: 'lib' }, { name: 'README.md' }], }); - const res = await getReleaseNotesMd( - 'chalk', - '2.0.0', - 'https://github.com/' - ); + const res = await getReleaseNotesMd('chalk', '2.0.0'); expect(res).toBe(null); }); it('handles wrong format', async () => { @@ -69,11 +57,7 @@ describe('workers/pr/release-notes', () => { content: Buffer.from('not really markdown').toString('base64'), }, }); - const res = await getReleaseNotesMd( - 'some/repository1', - '1.0.0', - 'https://github.com/' - ); + const res = await getReleaseNotesMd('some/repository1', '1.0.0'); expect(res).toBe(null); }); it('handles bad markdown', async () => { @@ -84,11 +68,7 @@ describe('workers/pr/release-notes', () => { content: Buffer.from(`#\nha\nha\n#\nha\nha`).toString('base64'), }, }); - const res = await getReleaseNotesMd( - 'some/repository2', - '1.0.0', - 'https://github.com/' - ); + const res = await getReleaseNotesMd('some/repository2', '1.0.0'); expect(res).toBe(null); }); it('parses angular.js', async () => { @@ -99,11 +79,7 @@ describe('workers/pr/release-notes', () => { content: Buffer.from(angularJsChangelogMd).toString('base64'), }, }); - const res = await getReleaseNotesMd( - 'angular/angular.js', - '1.6.9', - 'https://github.com/' - ); + const res = await getReleaseNotesMd('angular/angular.js', '1.6.9'); expect(res).not.toBe(null); expect(res).toMatchSnapshot(); }); @@ -115,11 +91,7 @@ describe('workers/pr/release-notes', () => { content: Buffer.from(jestChangelogMd).toString('base64'), }, }); - const res = await getReleaseNotesMd( - 'facebook/jest', - '22.0.0', - 'https://github.com/' - ); + const res = await getReleaseNotesMd('facebook/jest', '22.0.0'); expect(res).not.toBe(null); expect(res).toMatchSnapshot(); }); @@ -131,11 +103,7 @@ describe('workers/pr/release-notes', () => { content: Buffer.from(jsYamlChangelogMd).toString('base64'), }, }); - const res = await getReleaseNotesMd( - 'nodeca/js-yaml', - '3.10.0', - 'https://github.com/' - ); + const res = await getReleaseNotesMd('nodeca/js-yaml', '3.10.0'); expect(res).not.toBe(null); expect(res).toMatchSnapshot(); });