diff --git a/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap b/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap index d317b5d8d5bc5d96ff4e578ffa77dba947f55e55..717e5cd9c7da884c20f710995ab580b519a490bc 100644 --- a/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap +++ b/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap @@ -39,3 +39,57 @@ Array [ }, ] `; + +exports[`datasource/github-releases getReleases supports ghe 1`] = ` +Object { + "releases": Array [ + Object { + "gitRef": "a", + "isStable": undefined, + "releaseTimestamp": "2020-03-09T13:00:00Z", + "version": "a", + }, + Object { + "gitRef": "v", + "isStable": undefined, + "releaseTimestamp": "2020-03-09T12:00:00Z", + "version": "v", + }, + Object { + "gitRef": "1.0.0", + "isStable": undefined, + "releaseTimestamp": "2020-03-09T11:00:00Z", + "version": "1.0.0", + }, + Object { + "gitRef": "v1.1.0", + "isStable": undefined, + "releaseTimestamp": "2020-03-09T10:00:00Z", + "version": "v1.1.0", + }, + Object { + "gitRef": "2.0.0", + "isStable": false, + "releaseTimestamp": "2020-04-09T10:00:00Z", + "version": "2.0.0", + }, + ], + "sourceUrl": "https://git.enterprise.com/some/dep", +} +`; + +exports[`datasource/github-releases getReleases supports ghe 2`] = ` +Array [ + Object { + "headers": Object { + "accept": "application/vnd.github.v3+json", + "accept-encoding": "gzip, deflate", + "authorization": "token some-token", + "host": "git.enterprise.com", + "user-agent": "https://github.com/renovatebot/renovate", + }, + "method": "GET", + "url": "https://git.enterprise.com/api/v3/repos/some/dep/releases?per_page=100", + }, +] +`; diff --git a/lib/datasource/github-releases/index.spec.ts b/lib/datasource/github-releases/index.spec.ts index 551950b6d7b9fbd3b8c1499424350cf098eba62b..4c3d5713967a0e9afdb295f4507f0004465f9e8f 100644 --- a/lib/datasource/github-releases/index.spec.ts +++ b/lib/datasource/github-releases/index.spec.ts @@ -2,11 +2,25 @@ import { getPkgReleases } from '..'; import * as httpMock from '../../../test/httpMock'; import * as _hostRules from '../../util/host-rules'; import { id as datasource } from '.'; +import * as github from '.'; jest.mock('../../util/host-rules'); const hostRules: any = _hostRules; const githubApiHost = 'https://api.github.com'; +const githubEnterpriseApiHost = 'https://git.enterprise.com'; + +const responseBody = [ + { tag_name: 'a', published_at: '2020-03-09T13:00:00Z' }, + { tag_name: 'v', published_at: '2020-03-09T12:00:00Z' }, + { tag_name: '1.0.0', published_at: '2020-03-09T11:00:00Z' }, + { tag_name: 'v1.1.0', published_at: '2020-03-09T10:00:00Z' }, + { + tag_name: '2.0.0', + published_at: '2020-04-09T10:00:00Z', + prerelease: true, + }, +]; describe('datasource/github-releases', () => { beforeEach(() => { @@ -26,17 +40,7 @@ describe('datasource/github-releases', () => { httpMock .scope(githubApiHost) .get('/repos/some/dep/releases?per_page=100') - .reply(200, [ - { tag_name: 'a', published_at: '2020-03-09T13:00:00Z' }, - { tag_name: 'v', published_at: '2020-03-09T12:00:00Z' }, - { tag_name: '1.0.0', published_at: '2020-03-09T11:00:00Z' }, - { tag_name: 'v1.1.0', published_at: '2020-03-09T10:00:00Z' }, - { - tag_name: '2.0.0', - published_at: '2020-04-09T10:00:00Z', - prerelease: true, - }, - ]); + .reply(200, responseBody); const res = await getPkgReleases({ datasource, @@ -52,5 +56,19 @@ describe('datasource/github-releases', () => { ).toBe(false); expect(httpMock.getTrace()).toMatchSnapshot(); }); + it('supports ghe', async () => { + const lookupName = 'some/dep'; + httpMock + .scope(githubEnterpriseApiHost) + .get(`/api/v3/repos/${lookupName}/releases?per_page=100`) + .reply(200, responseBody); + const res = await github.getReleases({ + registryUrl: 'https://git.enterprise.com', + lookupName, + }); + httpMock.getTrace(); + expect(res).toMatchSnapshot(); + expect(httpMock.getTrace()).toMatchSnapshot(); + }); }); }); diff --git a/lib/datasource/github-releases/index.ts b/lib/datasource/github-releases/index.ts index 55893b7e4ba31c598df821891ae40f841bbdde2c..a5b882b30c03bc26ff46a547870acf0ded270ed5 100644 --- a/lib/datasource/github-releases/index.ts +++ b/lib/datasource/github-releases/index.ts @@ -1,3 +1,4 @@ +import URL from 'url'; import * as packageCache from '../../util/cache/package'; import { GithubHttp } from '../../util/http/github'; import { GetReleasesConfig, ReleaseResult } from '../common'; @@ -26,6 +27,7 @@ type GithubRelease = { */ export async function getReleases({ lookupName: repo, + registryUrl: depHost, }: GetReleasesConfig): Promise<ReleaseResult | null> { const cachedResult = await packageCache.get<ReleaseResult>( cacheNamespace, @@ -35,13 +37,17 @@ export async function getReleases({ if (cachedResult) { return cachedResult; } - const url = `https://api.github.com/repos/${repo}/releases?per_page=100`; + const sourceUrlBase = depHost ?? `https://github.com/`; + const apiBaseUrl = depHost + ? URL.resolve(depHost, 'api/v3/') + : `https://api.github.com/`; + const url = URL.resolve(apiBaseUrl, `repos/${repo}/releases?per_page=100`); const res = await http.getJson<GithubRelease[]>(url, { paginate: true, }); const githubReleases = res.body; const dependency: ReleaseResult = { - sourceUrl: 'https://github.com/' + repo, + sourceUrl: URL.resolve(sourceUrlBase, repo), releases: null, }; dependency.releases = githubReleases.map(