diff --git a/lib/datasource/cdnjs/index.spec.ts b/lib/datasource/cdnjs/index.spec.ts index 4a387baa45b3acf310573f5bd30eec8bccf1c603..db88098d92930ead2fdedb9bb80f02e26c84148d 100644 --- a/lib/datasource/cdnjs/index.spec.ts +++ b/lib/datasource/cdnjs/index.spec.ts @@ -45,8 +45,8 @@ describe('datasource/cdnjs', () => { jest.clearAllMocks(); return global.renovateCache.rmAll(); }); - it('throws for empty result', async () => { - got.mockResolvedValueOnce(null); + it('throws for 429', async () => { + got.mockRejectedValueOnce({ statusCode: 429 }); await expect( getPkgReleases({ lookupName: 'foo/bar' }) ).rejects.toThrowError(DATASOURCE_FAILURE); @@ -55,19 +55,13 @@ describe('datasource/cdnjs', () => { got.mockResolvedValueOnce({}); expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull(); }); - it('returns null for 404', async () => { - got.mockRejectedValueOnce({ statusCode: 404 }); - expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull(); - }); - it('returns null for 401', async () => { - got.mockRejectedValueOnce({ statusCode: 401 }); - expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull(); - }); - it('throws for 429', async () => { - got.mockRejectedValueOnce({ statusCode: 429 }); - await expect( - getPkgReleases({ lookupName: 'foo/bar' }) - ).rejects.toThrowError(DATASOURCE_FAILURE); + it('throws for 404', async () => { + const err = new Error(); + err.statusCode = 404; + got.mockImplementationOnce(() => { + throw err; + }); + await expect(getPkgReleases({ lookupName: 'foo/bar' })).rejects.toThrow(); }); it('throws for 5xx', async () => { got.mockRejectedValueOnce({ statusCode: 502 }); @@ -75,19 +69,6 @@ describe('datasource/cdnjs', () => { getPkgReleases({ lookupName: 'foo/bar' }) ).rejects.toThrowError(DATASOURCE_FAILURE); }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - await expect( - getPkgReleases({ lookupName: 'foo/bar' }) - ).rejects.toThrowError(DATASOURCE_FAILURE); - }); - it('returns null with wrong auth token', async () => { - got.mockRejectedValueOnce({ statusCode: 401 }); - const res = await getPkgReleases({ lookupName: 'foo/bar' }); - expect(res).toBeNull(); - }); it('processes real data', async () => { got.mockResolvedValueOnce({ body: res1 }); const res = await getPkgReleases({ lookupName: 'd3-force/d3-force.js' }); diff --git a/lib/datasource/cdnjs/index.ts b/lib/datasource/cdnjs/index.ts index 68ed19489d5fa361dcc9bff69a424f5f8b008481..b39d73d299c3c08deadc91f20302cf8cac6607a2 100644 --- a/lib/datasource/cdnjs/index.ts +++ b/lib/datasource/cdnjs/index.ts @@ -88,23 +88,12 @@ export async function getPkgReleases({ return result; } catch (err) { - const errorData = { library, err }; - if ( err.statusCode === 429 || (err.statusCode >= 500 && err.statusCode < 600) ) { throw new DatasourceError(err); } - if (err.statusCode === 401) { - logger.debug(errorData, 'Authorization error'); - } else if (err.statusCode === 404) { - logger.debug(errorData, 'Package lookup error'); - } else { - logger.debug(errorData, 'CDNJS lookup failure: Unknown error'); - throw new DatasourceError(err); - } + throw err; } - - return null; } diff --git a/lib/datasource/crate/index.spec.ts b/lib/datasource/crate/index.spec.ts index 9dd47f443dce31d57a265374ca781a5ea9cdf2e0..83725e6e7ee7358579ac3c9e6342908590a9fddf 100644 --- a/lib/datasource/crate/index.spec.ts +++ b/lib/datasource/crate/index.spec.ts @@ -44,13 +44,13 @@ describe('datasource/crate', () => { await getPkgReleases({ lookupName: 'non_existent_crate' }) ).toBeNull(); }); - it('returns null for 404', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 404, - }) - ); - expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull(); + it('throws for 404', async () => { + const err = new Error(); + err.statusCode = 404; + got.mockImplementationOnce(() => { + throw err; + }); + await expect(getPkgReleases({ lookupName: 'foo/bar' })).rejects.toThrow(); }); it('throws for 5xx', async () => { got.mockImplementationOnce(() => @@ -67,12 +67,6 @@ describe('datasource/crate', () => { expect(e).toBeDefined(); expect(e).toMatchSnapshot(); }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull(); - }); it('processes real data', async () => { got.mockReturnValueOnce({ body: res1, diff --git a/lib/datasource/crate/index.ts b/lib/datasource/crate/index.ts index 0640c13f1a8d16c1f00f332a895f6e0d466c2e93..fc0caadc1a96eb73a6e436d84643bbc5ab543e72 100644 --- a/lib/datasource/crate/index.ts +++ b/lib/datasource/crate/index.ts @@ -95,18 +95,12 @@ export async function getPkgReleases({ await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); return result; } catch (err) { - if (err.statusCode === 404 || err.code === 'ENOTFOUND') { - logger.debug({ lookupName }, `Dependency lookup failure: not found`); - logger.debug({ err }, 'Crate lookup error'); - return null; - } if ( err.statusCode === 429 || (err.statusCode >= 500 && err.statusCode < 600) ) { throw new DatasourceError(err); } - logger.warn({ err, lookupName }, 'crates.io lookup failure: Unknown error'); - return null; + throw err; } } diff --git a/lib/datasource/dart/index.spec.ts b/lib/datasource/dart/index.spec.ts index 3e63fdb88d926df9e978e77a17d68c43fffe946e..1895e46e305ca274ac23990a54ea54f9cf8c2520 100644 --- a/lib/datasource/dart/index.spec.ts +++ b/lib/datasource/dart/index.spec.ts @@ -41,15 +41,13 @@ describe('datasource/dart', () => { await getPkgReleases({ lookupName: 'shared_preferences' }) ).toBeNull(); }); - it('returns null for 404', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 404, - }) - ); - expect( - await getPkgReleases({ lookupName: 'shared_preferences' }) - ).toBeNull(); + it('throws for 404', async () => { + const err = new Error(); + err.statusCode = 404; + got.mockImplementationOnce(() => { + throw err; + }); + await expect(getPkgReleases({ lookupName: 'foo/bar' })).rejects.toThrow(); }); it('throws for 5xx', async () => { got.mockImplementationOnce(() => @@ -66,14 +64,6 @@ describe('datasource/dart', () => { expect(e).toBeDefined(); expect(e).toMatchSnapshot(); }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - expect( - await getPkgReleases({ lookupName: 'shared_preferences' }) - ).toBeNull(); - }); it('processes real data', async () => { got.mockReturnValueOnce({ body }); const res = await getPkgReleases({ diff --git a/lib/datasource/dart/index.ts b/lib/datasource/dart/index.ts index 7c571066ad1cf01c73d404b350e3847cdef2536c..9edbe14dfbcf8534ee7a3995a5e10a2829ea5f51 100644 --- a/lib/datasource/dart/index.ts +++ b/lib/datasource/dart/index.ts @@ -1,5 +1,4 @@ import got from '../../util/got'; -import { logger } from '../../logger'; import { DatasourceError, ReleaseResult, GetReleasesConfig } from '../common'; export const id = 'dart'; @@ -27,22 +26,13 @@ export async function getPkgReleases({ json: true, }); } catch (err) { - if (err.statusCode === 404 || err.code === 'ENOTFOUND') { - logger.debug({ lookupName }, `Dependency lookup failure: not found`); - logger.debug({ err }, 'Dart lookup error'); - return null; - } if ( err.statusCode === 429 || (err.statusCode >= 500 && err.statusCode < 600) ) { throw new DatasourceError(err); } - logger.warn( - { err, lookupName }, - 'pub.dartlang.org lookup failure: Unknown error' - ); - return null; + throw err; } const body = raw && raw.body; diff --git a/lib/util/got/got.spec.ts b/lib/datasource/docker/got.spec.ts similarity index 97% rename from lib/util/got/got.spec.ts rename to lib/datasource/docker/got.spec.ts index a45da3edde641f4e9d563ff01bc15d8826779b8a..2d6180afec67138e1b2ee7b2bca582d08bf78a78 100644 --- a/lib/util/got/got.spec.ts +++ b/lib/datasource/docker/got.spec.ts @@ -1,5 +1,5 @@ import nock from 'nock'; -import { getConfigResponse } from '../../datasource/docker'; +import { getConfigResponse } from '.'; describe('getConfigResponse', () => { beforeEach(() => { diff --git a/lib/datasource/galaxy/index.spec.ts b/lib/datasource/galaxy/index.spec.ts index 4586051037d15d42a8c0a8c0f9c3640ff9c475e1..35b4c0892f4c30307e58daa38e2ba3d440580e92 100644 --- a/lib/datasource/galaxy/index.spec.ts +++ b/lib/datasource/galaxy/index.spec.ts @@ -35,28 +35,6 @@ describe('datasource/galaxy', () => { await getPkgReleases({ lookupName: 'non_existent_crate' }) ).toBeNull(); }); - it('returns null for empty list', async () => { - got.mockReturnValueOnce({ - body: '\n', - }); - expect( - await getPkgReleases({ lookupName: 'non_existent_crate' }) - ).toBeNull(); - }); - it('returns null for 404', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 404, - }) - ); - expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull(); - }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull(); - }); it('processes real data', async () => { got.mockReturnValueOnce({ body: res1, diff --git a/lib/datasource/galaxy/index.ts b/lib/datasource/galaxy/index.ts index b3a1a88d2e6fb5fa966e6a964de947a6800928fa..95961c90760f5020624263e497b2766b056aae32 100644 --- a/lib/datasource/galaxy/index.ts +++ b/lib/datasource/galaxy/index.ts @@ -31,73 +31,64 @@ export async function getPkgReleases({ projectName; const galaxyProjectUrl = baseUrl + userName + '/' + projectName; - try { - let res: any = await got(galaxyAPIUrl, { - hostType: id, - }); - if (!res || !res.body) { - logger.warn( - { dependency: lookupName }, - `Received invalid crate data from ${galaxyAPIUrl}` - ); - return null; - } + let res: any = await got(galaxyAPIUrl, { + hostType: id, + }); + if (!res || !res.body) { + logger.warn( + { dependency: lookupName }, + `Received invalid crate data from ${galaxyAPIUrl}` + ); + return null; + } - res = res.body; - const response = JSON.parse(res); + res = res.body; + const response = JSON.parse(res); - // istanbul ignore if - if (response.results.length > 1) { - logger.warn( - { dependency: lookupName }, - `Received multiple results from ${galaxyAPIUrl}` - ); - return null; - } - if (response.results.length === 0) { - logger.warn( - { dependency: lookupName }, - `Received no results from ${galaxyAPIUrl}` - ); - return null; - } - - const resultObject = response.results[0]; - const versions = resultObject.summary_fields.versions; + // istanbul ignore if + if (response.results.length > 1) { + logger.warn( + { dependency: lookupName }, + `Received multiple results from ${galaxyAPIUrl}` + ); + return null; + } + if (response.results.length === 0) { + logger.warn( + { dependency: lookupName }, + `Received no results from ${galaxyAPIUrl}` + ); + return null; + } - const result: ReleaseResult = { - releases: [], - }; + const resultObject = response.results[0]; + const versions = resultObject.summary_fields.versions; - result.dependencyUrl = galaxyProjectUrl; - if (resultObject.github_user && resultObject.github_repo) { - result.sourceUrl = - 'https://github.com/' + - resultObject.github_user + - '/' + - resultObject.github_repo; - } + const result: ReleaseResult = { + releases: [], + }; - result.releases = versions.map( - (version: { name: string; release_date: string }) => { - const release: Release = { - version: version.name, - releaseTimestamp: version.release_date, - }; + result.dependencyUrl = galaxyProjectUrl; + if (resultObject.github_user && resultObject.github_repo) { + result.sourceUrl = + 'https://github.com/' + + resultObject.github_user + + '/' + + resultObject.github_repo; + } - return release; - } - ); + result.releases = versions.map( + (version: { name: string; release_date: string }) => { + const release: Release = { + version: version.name, + releaseTimestamp: version.release_date, + }; - const cacheMinutes = 10; - await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); - return result; - } catch (err) { - if (err.statusCode === 404 || err.code === 'ENOTFOUND') { - logger.debug({ lookupName }, `Dependency lookup failure: not found`); - return null; + return release; } - logger.warn({ err, lookupName }, 'galaxy lookup failure: Unknown error'); - return null; - } + ); + + const cacheMinutes = 10; + await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); + return result; } diff --git a/lib/datasource/git-submodules/index.spec.ts b/lib/datasource/git-submodules/index.spec.ts index 1c611332e06e43ad2675d2d94cc3490f48a04397..5367212669f88d5ed1fd218b1295573c944d68a6 100644 --- a/lib/datasource/git-submodules/index.spec.ts +++ b/lib/datasource/git-submodules/index.spec.ts @@ -10,24 +10,6 @@ const registryUrls = [lookupName, 'master']; describe('datasource/git-submoduless', () => { beforeEach(() => global.renovateCache.rmAll()); describe('getPkgReleases', () => { - it('returns null if response is wrong', async () => { - simpleGit.mockReturnValue({ - listRemote() { - return Promise.resolve(null); - }, - }); - const versions = await getPkgReleases({ lookupName, registryUrls }); - expect(versions).toEqual(null); - }); - it('returns null if remote call throws exception', async () => { - simpleGit.mockReturnValue({ - listRemote() { - throw new Error(); - }, - }); - const versions = await getPkgReleases({ lookupName, registryUrls }); - expect(versions).toEqual(null); - }); it('returns versions filtered from tags', async () => { simpleGit.mockReturnValue({ listRemote() { diff --git a/lib/datasource/git-submodules/index.ts b/lib/datasource/git-submodules/index.ts index 95298dfd4920ae38bc2c53f5eb41cb2f492d8570..72ea9230897e1f712d3756f9bff2bd1c9a7a26c2 100644 --- a/lib/datasource/git-submodules/index.ts +++ b/lib/datasource/git-submodules/index.ts @@ -2,7 +2,6 @@ import Git from 'simple-git/promise'; import { URL } from 'url'; import { ReleaseResult, GetReleasesConfig, DigestConfig } from '../common'; -import { logger } from '../../logger'; export const id = 'git-submodules'; @@ -22,31 +21,26 @@ export async function getPkgReleases({ } const git = Git(); - try { - const newHash = ( - await git.listRemote(['--refs', registryUrls[0], registryUrls[1]]) - ) - .trim() - .split(/\t/)[0]; + const newHash = ( + await git.listRemote(['--refs', registryUrls[0], registryUrls[1]]) + ) + .trim() + .split(/\t/)[0]; - const sourceUrl = new URL(registryUrls[0]); - sourceUrl.username = ''; + const sourceUrl = new URL(registryUrls[0]); + sourceUrl.username = ''; - const result = { - sourceUrl: sourceUrl.href, - releases: [ - { - version: newHash, - }, - ], - }; - const cacheMinutes = 60; - await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); - return result; - } catch (err) { - logger.debug(`Error looking up tags in ${lookupName}`); - } - return null; + const result = { + sourceUrl: sourceUrl.href, + releases: [ + { + version: newHash, + }, + ], + }; + const cacheMinutes = 60; + await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); + return result; } export const getDigest = ( diff --git a/lib/datasource/git-tags/index.spec.ts b/lib/datasource/git-tags/index.spec.ts index ad93a28e55e1ee4a4263e9f2e67ca3509eecafe8..9c8af8973f4b3c9a61d1cb8aed43eacc8fcdb78d 100644 --- a/lib/datasource/git-tags/index.spec.ts +++ b/lib/datasource/git-tags/index.spec.ts @@ -10,24 +10,6 @@ const lookupName = 'https://github.com/example/example.git'; describe('datasource/git-tags', () => { beforeEach(() => global.renovateCache.rmAll()); describe('getPkgReleases', () => { - it('returns nil if response is wrong', async () => { - simpleGit.mockReturnValue({ - listRemote() { - return Promise.resolve(null); - }, - }); - const versions = await getPkgReleases({ lookupName }); - expect(versions).toEqual(null); - }); - it('returns nil if remote call throws exception', async () => { - simpleGit.mockReturnValue({ - listRemote() { - throw new Error(); - }, - }); - const versions = await getPkgReleases({ lookupName }); - expect(versions).toEqual(null); - }); it('returns versions filtered from tags', async () => { simpleGit.mockReturnValue({ listRemote() { diff --git a/lib/datasource/git-tags/index.ts b/lib/datasource/git-tags/index.ts index e2ccd341208c4f9d77c0bb0bbef90699689a1aab..a27210b034a22ccce2260e7485a9886569bcad7b 100644 --- a/lib/datasource/git-tags/index.ts +++ b/lib/datasource/git-tags/index.ts @@ -1,6 +1,5 @@ import simpleGit from 'simple-git/promise'; import * as semver from '../../versioning/semver'; -import { logger } from '../../logger'; import { ReleaseResult, GetReleasesConfig } from '../common'; export const id = 'git-tags'; @@ -15,38 +14,33 @@ export async function getPkgReleases({ lookupName, }: GetReleasesConfig): Promise<ReleaseResult | null> { const git = simpleGit(); - try { - const cachedResult = await renovateCache.get<ReleaseResult>( - cacheNamespace, - lookupName - ); - /* istanbul ignore next line */ - if (cachedResult) return cachedResult; + const cachedResult = await renovateCache.get<ReleaseResult>( + cacheNamespace, + lookupName + ); + /* istanbul ignore next line */ + if (cachedResult) return cachedResult; - // fetch remote tags - const lsRemote = await git.listRemote([ - '--sort=-v:refname', - '--tags', - lookupName, - ]); - // extract valid tags from git ls-remote which looks like 'commithash\trefs/tags/1.2.3 - const tags = lsRemote - .replace(/^.+?refs\/tags\//gm, '') - .split('\n') - .filter(tag => semver.isVersion(tag)); - const sourceUrl = lookupName.replace(/\.git$/, '').replace(/\/$/, ''); - const result: ReleaseResult = { - sourceUrl, - releases: tags.map(tag => ({ - version: tag, - gitRef: tag, - })), - }; + // fetch remote tags + const lsRemote = await git.listRemote([ + '--sort=-v:refname', + '--tags', + lookupName, + ]); + // extract valid tags from git ls-remote which looks like 'commithash\trefs/tags/1.2.3 + const tags = lsRemote + .replace(/^.+?refs\/tags\//gm, '') + .split('\n') + .filter(tag => semver.isVersion(tag)); + const sourceUrl = lookupName.replace(/\.git$/, '').replace(/\/$/, ''); + const result: ReleaseResult = { + sourceUrl, + releases: tags.map(tag => ({ + version: tag, + gitRef: tag, + })), + }; - await renovateCache.set(cacheNamespace, lookupName, result, cacheMinutes); - return result; - } catch (e) { - logger.debug(`Error looking up tags in ${lookupName}`); - } - return null; + await renovateCache.set(cacheNamespace, lookupName, result, cacheMinutes); + return result; } diff --git a/lib/datasource/github-releases/index.ts b/lib/datasource/github-releases/index.ts index f57f0434b5c394d5f70b9c9db47bd5ce5b3de97a..7965e2a4c4246c6ea3bf527b24d61e642e045979 100644 --- a/lib/datasource/github-releases/index.ts +++ b/lib/datasource/github-releases/index.ts @@ -1,6 +1,5 @@ import { api } from '../../platform/github/gh-got-wrapper'; import { ReleaseResult, GetReleasesConfig } from '../common'; -import { logger } from '../../logger'; const { get: ghGot } = api; @@ -21,7 +20,6 @@ const cacheNamespace = 'datasource-github-releases'; export async function getPkgReleases({ lookupName: repo, }: GetReleasesConfig): Promise<ReleaseResult | null> { - let versions: string[]; const cachedResult = await renovateCache.get<ReleaseResult>( cacheNamespace, repo @@ -30,20 +28,16 @@ export async function getPkgReleases({ if (cachedResult) { return cachedResult; } - try { - const url = `https://api.github.com/repos/${repo}/releases?per_page=100`; - type GitHubRelease = { - tag_name: string; - }[]; + const url = `https://api.github.com/repos/${repo}/releases?per_page=100`; + type GitHubRelease = { + tag_name: string; + }[]; - versions = ( - await ghGot<GitHubRelease>(url, { - paginate: true, - }) - ).body.map(o => o.tag_name); - } catch (err) /* istanbul ignore next */ { - logger.debug({ repo, err }, 'Error retrieving from github'); - } + const versions = ( + await ghGot<GitHubRelease>(url, { + paginate: true, + }) + ).body.map(o => o.tag_name); // istanbul ignore if if (!versions) { return null; diff --git a/lib/datasource/github-tags/index.ts b/lib/datasource/github-tags/index.ts index 9cfcf220602f0827a1f5f2fe1b29ef55e725094a..f71cfb5f8b823c287df9d32469a0d0fb9123b75b 100644 --- a/lib/datasource/github-tags/index.ts +++ b/lib/datasource/github-tags/index.ts @@ -111,7 +111,6 @@ export async function getDigest( export async function getPkgReleases({ lookupName: repo, }: GetReleasesConfig): Promise<ReleaseResult | null> { - let versions: string[]; const cachedResult = await renovateCache.get<ReleaseResult>( cacheNamespace, getCacheKey(repo, 'tags') @@ -120,24 +119,17 @@ export async function getPkgReleases({ if (cachedResult) { return cachedResult; } - try { - // tag - const url = `https://api.github.com/repos/${repo}/tags?per_page=100`; - type GitHubTag = { - name: string; - }[]; + // tag + const url = `https://api.github.com/repos/${repo}/tags?per_page=100`; + type GitHubTag = { + name: string; + }[]; - versions = ( - await ghGot<GitHubTag>(url, { - paginate: true, - }) - ).body.map(o => o.name); - } catch (err) { - logger.debug({ repo, err }, 'Error retrieving from github'); - } - if (!versions) { - return null; - } + const versions = ( + await ghGot<GitHubTag>(url, { + paginate: true, + }) + ).body.map(o => o.name); const dependency: ReleaseResult = { sourceUrl: 'https://github.com/' + repo, releases: null, diff --git a/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap b/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap index 73c1a863a9bf382789565979e3ac9183ac85587d..35f3f358db639cd4faf60cb6eae05ed2cdc59acb 100644 --- a/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap +++ b/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap @@ -1,5 +1,21 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`datasource/gitlab-tags getPkgReleases defaults to gitlab.com 1`] = ` +Object { + "releases": Array [ + Object { + "gitRef": "v1.0.0", + "version": "v1.0.0", + }, + Object { + "gitRef": "v1.1.0", + "version": "v1.1.0", + }, + ], + "sourceUrl": "https://gitlab.com/some/dep2", +} +`; + exports[`datasource/gitlab-tags getPkgReleases returns tags 1`] = ` Object { "releases": Array [ diff --git a/lib/datasource/gitlab-tags/index.spec.ts b/lib/datasource/gitlab-tags/index.spec.ts index d53087847a7839b48a55aa4a3fadbed35e043c4f..42e90c7b5e1e6ee7bb104a816256dc5ef8e40aad 100644 --- a/lib/datasource/gitlab-tags/index.spec.ts +++ b/lib/datasource/gitlab-tags/index.spec.ts @@ -23,5 +23,14 @@ describe('datasource/gitlab-tags', () => { expect(res).toMatchSnapshot(); expect(res.releases).toHaveLength(2); }); + it('defaults to gitlab.com', async () => { + const body = [{ name: 'v1.0.0' }, { name: 'v1.1.0' }]; + glGot.mockReturnValueOnce({ headers: {}, body }); + const res = await gitlab.getPkgReleases({ + lookupName: 'some/dep2', + }); + expect(res).toMatchSnapshot(); + expect(res.releases).toHaveLength(2); + }); }); }); diff --git a/lib/datasource/gitlab-tags/index.ts b/lib/datasource/gitlab-tags/index.ts index 9a2a46f50314249be8a37d021d4ebbc86884051c..2df871690990e1487ad0d6d7863aea46a54b38f9 100644 --- a/lib/datasource/gitlab-tags/index.ts +++ b/lib/datasource/gitlab-tags/index.ts @@ -1,6 +1,5 @@ import is from '@sindresorhus/is'; import { api } from '../../platform/gitlab/gl-got-wrapper'; -import { logger } from '../../logger'; import { GetReleasesConfig, ReleaseResult } from '../common'; const { get: glGot } = api; @@ -21,7 +20,6 @@ export async function getPkgReleases({ const depHost = is.nonEmptyArray(registryUrls) ? registryUrls[0].replace(/\/$/, '') : 'https://gitlab.com'; - let versions: string[]; const cachedResult = await renovateCache.get<ReleaseResult>( cacheNamespace, getCacheKey(depHost, repo) @@ -33,22 +31,17 @@ export async function getPkgReleases({ const urlEncodedRepo = encodeURIComponent(repo); - try { - // tag - const url = `${depHost}/api/v4/projects/${urlEncodedRepo}/repository/tags?per_page=100`; - type GlTag = { - name: string; - }[]; + // tag + const url = `${depHost}/api/v4/projects/${urlEncodedRepo}/repository/tags?per_page=100`; + type GlTag = { + name: string; + }[]; - versions = ( - await glGot<GlTag>(url, { - paginate: true, - }) - ).body.map(o => o.name); - } catch (err) { - // istanbul ignore next - logger.debug({ repo, err }, 'Error retrieving from Gitlab'); - } + const versions = ( + await glGot<GlTag>(url, { + paginate: true, + }) + ).body.map(o => o.name); // istanbul ignore if if (!versions) { diff --git a/lib/datasource/gradle-version/index.ts b/lib/datasource/gradle-version/index.ts index b7b212158dc16f51d37cc341b8cb72f5d388d2d0..3fe6b7c39f5421c2b63f59e0a337a307febce78a 100644 --- a/lib/datasource/gradle-version/index.ts +++ b/lib/datasource/gradle-version/index.ts @@ -1,6 +1,5 @@ import { coerce } from 'semver'; import is from '@sindresorhus/is'; -import { logger } from '../../logger'; import got from '../../util/got'; import { DatasourceError, @@ -56,8 +55,7 @@ export async function getPkgReleases({ if (err.host === 'services.gradle.org') { throw new DatasourceError(err); } - logger.debug({ err }, 'gradle-version err'); - return null; + throw err; } }) ); diff --git a/lib/datasource/helm/index.spec.ts b/lib/datasource/helm/index.spec.ts index 3fc7b7cfe7142a03d329910ae9c93f44bb5911dd..26301d9d05816c543c8394fce83e3d59f0d37b4c 100644 --- a/lib/datasource/helm/index.spec.ts +++ b/lib/datasource/helm/index.spec.ts @@ -55,18 +55,18 @@ describe('datasource/helm', () => { }) ).toBeNull(); }); - it('returns null for 404', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 404, - }) - ); - expect( - await getPkgReleases({ - lookupName: 'some_chart', + it('throws for 404', async () => { + const err = new Error(); + err.statusCode = 404; + got.mockImplementationOnce(() => { + throw err; + }); + await expect( + getPkgReleases({ + lookupName: 'foo/bar', registryUrls: ['example-repository.com'], }) - ).toBeNull(); + ).rejects.toThrow(); }); it('throws for 5xx', async () => { got.mockImplementationOnce(() => @@ -86,17 +86,6 @@ describe('datasource/helm', () => { expect(e).toBeDefined(); expect(e).toMatchSnapshot(); }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - expect( - await getPkgReleases({ - lookupName: 'some_chart', - registryUrls: ['example-repository.com'], - }) - ).toBeNull(); - }); it('returns null if index.yaml in response is empty', async () => { const res = { body: '# A comment' }; got.mockReturnValueOnce(res); diff --git a/lib/datasource/helm/index.ts b/lib/datasource/helm/index.ts index 0494a28306dc64c50ae62a91a577bcd50a5c0043..8ce40dcf62a4465073379f48ba08584173ed25cf 100644 --- a/lib/datasource/helm/index.ts +++ b/lib/datasource/helm/index.ts @@ -23,64 +23,37 @@ export async function getRepositoryData( return null; } } catch (err) { - // istanbul ignore if - if (err.code === 'ERR_INVALID_URL') { - logger.debug( - { helmRepository: repository }, - 'helm repository is not a valid URL - skipping' - ); - return null; - } - // istanbul ignore if - if (err.code === 'ENOTFOUND' || err.code === 'EAI_AGAIN') { - logger.debug({ err }, 'Could not connect to helm repository'); - return null; - } - if (err.statusCode === 404 || err.code === 'ENOTFOUND') { - logger.warn({ err }, 'index.yaml lookup error'); - return null; - } if ( err.statusCode === 429 || (err.statusCode >= 500 && err.statusCode < 600) ) { throw new DatasourceError(err); } - // istanbul ignore if - if (err.name === 'UnsupportedProtocolError') { - logger.debug({ repository }, 'Unsupported protocol'); - return null; - } - logger.warn( - { err }, - `helm datasource ${repository} lookup failure: Unknown error` - ); - return null; + throw err; } + let doc; try { - const doc = yaml.safeLoad(res.body, { json: true }); - if (!doc) { - logger.warn(`Failed to parse index.yaml from ${repository}`); - return null; - } - const result: ReleaseResult[] = Object.entries(doc.entries).map( - ([k, v]: [string, any]): ReleaseResult => ({ - name: k, - homepage: v[0].home, - sourceUrl: v[0].sources ? v[0].sources[0] : undefined, - releases: v.map((x: any) => ({ - version: x.version, - })), - }) - ); - const cacheMinutes = 20; - await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); - return result; + doc = yaml.safeLoad(res.body, { json: true }); } catch (err) { - logger.warn(`Failed to parse index.yaml from ${repository}`); logger.debug(err); + } + if (!doc) { + logger.warn(`Failed to parse index.yaml from ${repository}`); return null; } + const result: ReleaseResult[] = Object.entries(doc.entries).map( + ([k, v]: [string, any]): ReleaseResult => ({ + name: k, + homepage: v[0].home, + sourceUrl: v[0].sources ? v[0].sources[0] : undefined, + releases: v.map((x: any) => ({ + version: x.version, + })), + }) + ); + const cacheMinutes = 20; + await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); + return result; } export async function getPkgReleases({ diff --git a/lib/datasource/hex/index.spec.ts b/lib/datasource/hex/index.spec.ts index f55cd760874357523696d8ef0f6412a090313d89..8a262049a841d5633889cfe2b527ce348e1200ab 100644 --- a/lib/datasource/hex/index.spec.ts +++ b/lib/datasource/hex/index.spec.ts @@ -21,12 +21,6 @@ describe('datasource/hex', () => { beforeEach(() => { global.repoCache = {}; }); - it('returns null for empty result', async () => { - got.mockReturnValueOnce(null); - expect( - await getPkgReleases({ lookupName: 'non_existent_package' }) - ).toBeNull(); - }); it('returns null for missing fields', async () => { got.mockReturnValueOnce({}); expect( @@ -38,21 +32,13 @@ describe('datasource/hex', () => { await getPkgReleases({ lookupName: 'non_existent_package' }) ).toBeNull(); }); - it('returns null for 404', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 404, - }) - ); - expect(await getPkgReleases({ lookupName: 'some_package' })).toBeNull(); - }); - it('returns null for 401', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 401, - }) - ); - expect(await getPkgReleases({ lookupName: 'some_package' })).toBeNull(); + it('throws for 404', async () => { + const err = new Error(); + err.statusCode = 404; + got.mockImplementationOnce(() => { + throw err; + }); + await expect(getPkgReleases({ lookupName: 'foo/bar' })).rejects.toThrow(); }); it('throws for 429', async () => { got.mockImplementationOnce(() => @@ -74,22 +60,6 @@ describe('datasource/hex', () => { getPkgReleases({ lookupName: 'some_crate' }) ).rejects.toThrowError(DATASOURCE_FAILURE); }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - expect(await getPkgReleases({ lookupName: 'some_package' })).toBeNull(); - }); - it('returns null with wrong auth token', async () => { - hostRules.find.mockReturnValueOnce({ token: 'this_simple_token' }); - got.mockReturnValueOnce( - Promise.reject({ - statusCode: 401, - }) - ); - const res = await getPkgReleases({ lookupName: 'certifi' }); - expect(res).toBeNull(); - }); it('processes real data', async () => { got.mockReturnValueOnce({ body: res1, diff --git a/lib/datasource/hex/index.ts b/lib/datasource/hex/index.ts index a813bc451f258508b11dd2a6e9526af600a0361e..a001e717f0c5ed732fadd28904d56f207bbcf6c9 100644 --- a/lib/datasource/hex/index.ts +++ b/lib/datasource/hex/index.ts @@ -54,23 +54,12 @@ export async function getPkgReleases({ return result; } catch (err) { - const errorData = { lookupName, err }; - if ( err.statusCode === 429 || (err.statusCode >= 500 && err.statusCode < 600) ) { throw new DatasourceError(err); } - - if (err.statusCode === 401) { - logger.debug(errorData, 'Authorization error'); - } else if (err.statusCode === 404) { - logger.debug(errorData, 'Package lookup error'); - } else { - logger.warn(errorData, 'hex lookup failure: Unknown error'); - } + throw err; } - - return null; } diff --git a/lib/datasource/index.spec.ts b/lib/datasource/index.spec.ts index 7f0a7ea63fd54d331c55a57544c36913c6c3eb14..5d48d9ddf48dee70c5ec29953943245ea0abdd27 100644 --- a/lib/datasource/index.spec.ts +++ b/lib/datasource/index.spec.ts @@ -72,7 +72,7 @@ describe('datasource/index', () => { it('trims sourceUrl', async () => { npmDatasource.getPkgReleases.mockResolvedValue({ sourceUrl: ' https://abc.com', - releases: [], + releases: [{ version: '1.0.0' }, { version: '1.1.0' }], }); const res = await datasource.getPkgReleases({ datasource: datasourceNpm.id, diff --git a/lib/datasource/index.ts b/lib/datasource/index.ts index 12ad5745016493f598500d46699a33cf002fc0be..7c6c073130b5d4827a05a84c4506ffc65a394037 100644 --- a/lib/datasource/index.ts +++ b/lib/datasource/index.ts @@ -77,12 +77,43 @@ export async function getPkgReleases( ...config, lookupName, }); - } catch (e) /* istanbul ignore next */ { - if (e instanceof DatasourceError) { - e.datasource = datasource; - e.lookupName = lookupName; + } catch (err) /* istanbul ignore next */ { + logger.trace({ err }, 'getPkgReleases err'); + if (err instanceof DatasourceError) { + err.datasource = datasource; + err.lookupName = lookupName; + throw err; + } + const { name, url, code, statusCode, statusMessage } = err; + const logMeta = { + datasource, + lookupName, + url, + code, + statusCode, + statusMessage, + }; + const log = (reason: string, level = 'debug'): void => + logger[level]({ ...logMeta, reason }, `Datasource Error (ignored)`); + if (name === 'UnsupportedProtocolError') { + log('Unsupported Protocol'); + } else if (name === 'SyntaxError') { + log('Could not parse response'); + } else if (code === 'ERR_INVALID_URL') { + log('Invalid URL'); + } else if (code === 'ENOTFOUND' || code === 'EAI_AGAIN') { + log('Connection Error'); + } else if (statusCode === 401 || statusCode === 403) { + log('Unauthorized'); + } else if (statusCode === 404 || code === 'ENOTFOUND') { + log('Not Found'); + } else if (statusCode === 429) { + log('Rate Limited'); + } else if (statusCode >= 500 && statusCode < 600) { + log('Server Error'); + } else { + log('Unknown', 'info'); } - throw e; } if (!res) { return res; diff --git a/lib/datasource/metadata.spec.ts b/lib/datasource/metadata.spec.ts index 5a70c827b26c198e985d2a750fac9c381b67d89f..a9b53068db48c06ced4a7bc67ed5d60ab28ac461 100644 --- a/lib/datasource/metadata.spec.ts +++ b/lib/datasource/metadata.spec.ts @@ -78,4 +78,17 @@ describe('datasource/metadata', () => { addMetaData(dep, datasource, lookupName); expect(dep.sourceUrl).toEqual('https://github.com/mockk/mockk'); }); + it('Should move github homepage to sourceUrl', () => { + const dep = { + homepage: 'http://www.github.com/mockk/mockk/', + releases: [{ version: '1.9.3' }], + sourceUrl: undefined, + }; + const datasource = datasourceMaven.id; + const lookupName = 'io.mockk:mockk'; + + addMetaData(dep, datasource, lookupName); + expect(dep.sourceUrl).toEqual('https://github.com/mockk/mockk'); + expect(dep.homepage).toBeUndefined(); + }); }); diff --git a/lib/datasource/orb/index.spec.ts b/lib/datasource/orb/index.spec.ts index 5ede9da3e9b0ca61f7998691afb139ef1a285a2a..e82e7d71d67d5068899894ccb9a7854b95e127e8 100644 --- a/lib/datasource/orb/index.spec.ts +++ b/lib/datasource/orb/index.spec.ts @@ -33,14 +33,6 @@ describe('datasource/orb', () => { global.repoCache = {}; return global.renovateCache.rmAll(); }); - it('returns null for empty result', async () => { - got.post.mockReturnValueOnce({ body: {} }); - expect( - await datasource.getPkgReleases({ - lookupName: 'hyper-expanse/library-release-workflows', - }) - ).toBeNull(); - }); it('returns null for missing orb', async () => { got.post.mockReturnValueOnce({ body: { data: {} } }); expect( @@ -49,28 +41,6 @@ describe('datasource/orb', () => { }) ).toBeNull(); }); - it('returns null for 404', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 404, - }) - ); - expect( - await datasource.getPkgReleases({ - lookupName: 'hyper-expanse/library-release-workflows', - }) - ).toBeNull(); - }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - expect( - await datasource.getPkgReleases({ - lookupName: 'hyper-expanse/library-release-workflows', - }) - ).toBeNull(); - }); it('processes real data', async () => { got.post.mockReturnValueOnce({ body: orbData, diff --git a/lib/datasource/orb/index.ts b/lib/datasource/orb/index.ts index 24385098637109c5903e058cb831f42ea4f48788..a300bac9c52f7080e30d96ff07a454e45f82d946 100644 --- a/lib/datasource/orb/index.ts +++ b/lib/datasource/orb/index.ts @@ -35,45 +35,35 @@ export async function getPkgReleases({ query: `{orb(name:"${lookupName}"){name, homeUrl, versions {version, createdAt}}}`, variables: {}, }; - try { - const res: OrbRelease = ( - await got.post(url, { - body, - hostType: id, - json: true, - retry: 5, - }) - ).body.data.orb; - if (!res) { - logger.debug({ lookupName }, 'Failed to look up orb'); - return null; - } - // Simplify response before caching and returning - const dep: ReleaseResult = { - name: lookupName, - versions: {}, - releases: null, - }; - if (res.homeUrl && res.homeUrl.length) { - dep.homepage = res.homeUrl; - } - dep.homepage = - dep.homepage || `https://circleci.com/orbs/registry/orb/${lookupName}`; - const releases = res.versions.map(v => v.version); - dep.releases = releases.map(version => ({ - version, - })); - logger.trace({ dep }, 'dep'); - const cacheMinutes = 15; - await renovateCache.set(cacheNamespace, cacheKey, dep, cacheMinutes); - return dep; - } catch (err) /* istanbul ignore next */ { - logger.debug({ err }, 'CircleCI Orb lookup error'); - if (err.statusCode === 404 || err.code === 'ENOTFOUND') { - logger.debug({ lookupName }, `CircleCI Orb lookup failure: not found`); - return null; - } - logger.warn({ lookupName }, 'CircleCI Orb lookup failure: Unknown error'); + const res: OrbRelease = ( + await got.post(url, { + body, + hostType: id, + json: true, + retry: 5, + }) + ).body.data.orb; + if (!res) { + logger.debug({ lookupName }, 'Failed to look up orb'); return null; } + // Simplify response before caching and returning + const dep: ReleaseResult = { + name: lookupName, + versions: {}, + releases: null, + }; + if (res.homeUrl && res.homeUrl.length) { + dep.homepage = res.homeUrl; + } + dep.homepage = + dep.homepage || `https://circleci.com/orbs/registry/orb/${lookupName}`; + const releases = res.versions.map(v => v.version); + dep.releases = releases.map(version => ({ + version, + })); + logger.trace({ dep }, 'dep'); + const cacheMinutes = 15; + await renovateCache.set(cacheNamespace, cacheKey, dep, cacheMinutes); + return dep; } diff --git a/lib/datasource/terraform-module/index.spec.ts b/lib/datasource/terraform-module/index.spec.ts index a7483e0294060d140d37ba6f63b4d027a59ea984..031c0d0da8648c370f940ee9cc3f12867a34dd78 100644 --- a/lib/datasource/terraform-module/index.spec.ts +++ b/lib/datasource/terraform-module/index.spec.ts @@ -25,28 +25,6 @@ describe('datasource/terraform-module', () => { }) ).toBeNull(); }); - it('returns null for 404', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 404, - }) - ); - expect( - await terraform.getPkgReleases({ - lookupName: 'hashicorp/consul/aws', - }) - ).toBeNull(); - }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - expect( - await terraform.getPkgReleases({ - lookupName: 'hashicorp/consul/aws', - }) - ).toBeNull(); - }); it('processes real data', async () => { got.mockReturnValueOnce({ body: JSON.parse(consulData), diff --git a/lib/datasource/terraform-module/index.ts b/lib/datasource/terraform-module/index.ts index a9578d7753263f760c91b6d57ff0ccdf96bd208c..4bdde279b9417b4f64ae69d5f090301457f636c8 100644 --- a/lib/datasource/terraform-module/index.ts +++ b/lib/datasource/terraform-module/index.ts @@ -71,52 +71,34 @@ export async function getPkgReleases({ if (cachedResult) { return cachedResult; } - try { - const res: TerraformRelease = ( - await got(pkgUrl, { - json: true, - hostType: id, - }) - ).body; - const returnedName = res.namespace + '/' + res.name + '/' + res.provider; - if (returnedName !== repository) { - logger.warn({ pkgUrl }, 'Terraform registry result mismatch'); - return null; - } - // Simplify response before caching and returning - const dep: ReleaseResult = { - name: repository, - versions: {}, - releases: null, - }; - if (res.source) { - dep.sourceUrl = res.source; - } - dep.releases = res.versions.map(version => ({ - version, - })); - if (pkgUrl.startsWith('https://registry.terraform.io/')) { - dep.homepage = `https://registry.terraform.io/modules/${repository}`; - } - logger.trace({ dep }, 'dep'); - const cacheMinutes = 30; - await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes); - return dep; - } catch (err) { - if (err.statusCode === 404 || err.code === 'ENOTFOUND') { - logger.debug( - { lookupName }, - `Terraform registry lookup failure: not found` - ); - logger.debug({ - err, - }); - return null; - } - logger.warn( - { err, lookupName }, - 'Terraform registry failure: Unknown error' - ); + const res: TerraformRelease = ( + await got(pkgUrl, { + json: true, + hostType: id, + }) + ).body; + const returnedName = res.namespace + '/' + res.name + '/' + res.provider; + if (returnedName !== repository) { + logger.warn({ pkgUrl }, 'Terraform registry result mismatch'); return null; } + // Simplify response before caching and returning + const dep: ReleaseResult = { + name: repository, + versions: {}, + releases: null, + }; + if (res.source) { + dep.sourceUrl = res.source; + } + dep.releases = res.versions.map(version => ({ + version, + })); + if (pkgUrl.startsWith('https://registry.terraform.io/')) { + dep.homepage = `https://registry.terraform.io/modules/${repository}`; + } + logger.trace({ dep }, 'dep'); + const cacheMinutes = 30; + await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes); + return dep; } diff --git a/lib/datasource/terraform-provider/index.spec.ts b/lib/datasource/terraform-provider/index.spec.ts index 1b9155da27953da0418d0c09ebb192737ef970a2..d1112a0c9470c348204fb80cb1735edb57933f48 100644 --- a/lib/datasource/terraform-provider/index.spec.ts +++ b/lib/datasource/terraform-provider/index.spec.ts @@ -17,36 +17,6 @@ describe('datasource/terraform', () => { global.repoCache = {}; return global.renovateCache.rmAll(); }); - it('returns null for empty result', async () => { - got.mockReturnValueOnce({ body: {} }); - expect( - await terraformProvider.getPkgReleases({ - lookupName: 'azurerm', - }) - ).toBeNull(); - }); - it('returns null for 404', async () => { - got.mockImplementationOnce(() => - Promise.reject({ - statusCode: 404, - }) - ); - expect( - await terraformProvider.getPkgReleases({ - lookupName: 'azurerm', - }) - ).toBeNull(); - }); - it('returns null for unknown error', async () => { - got.mockImplementationOnce(() => { - throw new Error(); - }); - expect( - await terraformProvider.getPkgReleases({ - lookupName: 'azurerm', - }) - ).toBeNull(); - }); it('processes real data', async () => { got.mockReturnValueOnce({ body: JSON.parse(consulData), diff --git a/lib/datasource/terraform-provider/index.ts b/lib/datasource/terraform-provider/index.ts index 0c3544d3bd65e904973e76a745a68e8c760265b1..cc1f5c557e205f03b26fab23dc0f0b9c072b214a 100644 --- a/lib/datasource/terraform-provider/index.ts +++ b/lib/datasource/terraform-provider/index.ts @@ -34,47 +34,29 @@ export async function getPkgReleases({ if (cachedResult) { return cachedResult; } - try { - const res: TerraformProvider = ( - await got(pkgUrl, { - json: true, - hostType: id, - }) - ).body; - // Simplify response before caching and returning - const dep: ReleaseResult = { - name: repository, - versions: {}, - releases: null, - }; - if (res.source) { - dep.sourceUrl = res.source; - } - dep.releases = res.versions.map(version => ({ - version, - })); - if (pkgUrl.startsWith('https://registry.terraform.io/')) { - dep.homepage = `https://registry.terraform.io/providers/${repository}`; - } - logger.trace({ dep }, 'dep'); - const cacheMinutes = 30; - await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes); - return dep; - } catch (err) { - if (err.statusCode === 404 || err.code === 'ENOTFOUND') { - logger.debug( - { lookupName }, - `Terraform registry lookup failure: not found` - ); - logger.debug({ - err, - }); - return null; - } - logger.warn( - { err, lookupName }, - 'Terraform registry failure: Unknown error' - ); - return null; + const res: TerraformProvider = ( + await got(pkgUrl, { + json: true, + hostType: id, + }) + ).body; + // Simplify response before caching and returning + const dep: ReleaseResult = { + name: repository, + versions: {}, + releases: null, + }; + if (res.source) { + dep.sourceUrl = res.source; } + dep.releases = res.versions.map(version => ({ + version, + })); + if (pkgUrl.startsWith('https://registry.terraform.io/')) { + dep.homepage = `https://registry.terraform.io/providers/${repository}`; + } + logger.trace({ dep }, 'dep'); + const cacheMinutes = 30; + await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes); + return dep; } diff --git a/lib/util/clone.ts b/lib/util/clone.ts index 075e35be3a44b8c0cf2f31e0efc2e8122def72ce..ea80f56d2ef46660257e63441de4339e1f5c0dad 100644 --- a/lib/util/clone.ts +++ b/lib/util/clone.ts @@ -1,3 +1,3 @@ export function clone<T>(input: T): T { - return JSON.parse(JSON.stringify(input)); + return input ? JSON.parse(JSON.stringify(input)) : input; } diff --git a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap index 6dfd7d548e61e85544d0372aa342695be43f19b8..4fa22f3a714076fe0f194adcc304a4326f0c2742 100644 --- a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap +++ b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap @@ -194,8 +194,6 @@ Object { } `; -exports[`workers/repository/process/lookup .lookupUpdates() handles github 404 1`] = `Array []`; - exports[`workers/repository/process/lookup .lookupUpdates() handles packagist 1`] = `Array []`; exports[`workers/repository/process/lookup .lookupUpdates() handles pypi 404 1`] = `Array []`; diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts index 88c87c4d09b8fe47eeb800c2c8012c97c778c8d8..6049a7a2c675c901c3b3560e89463768e8312fcd 100644 --- a/lib/workers/repository/process/lookup/index.spec.ts +++ b/lib/workers/repository/process/lookup/index.spec.ts @@ -17,7 +17,6 @@ import * as datasourceNpm from '../../../../datasource/npm'; import * as datasourcePypi from '../../../../datasource/pypi'; import * as datasourcePackagist from '../../../../datasource/packagist'; import * as datasourceDocker from '../../../../datasource/docker'; -import * as datasourceGithubTags from '../../../../datasource/github-tags'; import * as datasourceGitSubmodules from '../../../../datasource/git-submodules'; jest.mock('../../../../datasource/docker'); @@ -982,23 +981,13 @@ describe('workers/repository/process/lookup', () => { .reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchSnapshot(); }); - it('handles github 404', async () => { - config.depName = 'foo'; - config.datasource = datasourceGithubTags.id; - config.packageFile = 'package.json'; - config.currentValue = '1.0.0'; - nock('https://pypi.org') - .get('/pypi/foo/json') - .reply(404); - expect((await lookup.lookupUpdates(config)).updates).toMatchSnapshot(); - }); it('handles pypi 404', async () => { config.depName = 'foo'; config.datasource = datasourcePypi.id; config.packageFile = 'requirements.txt'; config.currentValue = '1.0.0'; - nock('https://api.github.com') - .get('/repos/some/repo/git/refs/tags?per_page=100') + nock('https://pypi.org') + .get('/pypi/foo/json') .reply(404); expect((await lookup.lookupUpdates(config)).updates).toMatchSnapshot(); });