From 02b5f2e4be496788aa58b639d405170872c82879 Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Sun, 26 May 2019 19:05:05 +0200 Subject: [PATCH] refactor(gitlab): use util/got (#3814) --- lib/platform/gitlab/gl-got-wrapper.js | 77 +++++++-------------- lib/platform/gitlab/index.js | 4 +- package.json | 1 - test/globals.js | 1 - test/platform/gitlab/gl-got-wrapper.spec.js | 41 ++++++----- yarn.lock | 9 +-- 6 files changed, 48 insertions(+), 85 deletions(-) diff --git a/lib/platform/gitlab/gl-got-wrapper.js b/lib/platform/gitlab/gl-got-wrapper.js index 1f6fcbcc6b..7f303a5aee 100644 --- a/lib/platform/gitlab/gl-got-wrapper.js +++ b/lib/platform/gitlab/gl-got-wrapper.js @@ -1,59 +1,39 @@ const URL = require('url'); -const glGot = require('gl-got'); -const delay = require('delay'); - const parseLinkHeader = require('parse-link-header'); const hostRules = require('../../util/host-rules'); -let cache = {}; -let endpoint = 'https://gitlab.com/api/v4/'; +const got = require('../../util/got'); + +let baseUrl = 'https://gitlab.com/api/v4/'; -async function get(path, options, retries = 5) { - const url = URL.resolve(endpoint, path); +async function get(path, options) { + const url = URL.resolve(baseUrl, path); const opts = { - // TODO: Move to configurable host rules, or use utils/got - timeout: 60 * 1000, - ...hostRules.find({ hostType: 'gitlab', url }), ...options, + ...hostRules.find({ hostType: 'gitlab', url }), + json: true, }; - delete opts.endpoint; - const method = opts.method || 'get'; - const useCache = opts.useCache || true; - if (method === 'get' && useCache && cache[path]) { - logger.trace({ path }, 'Returning cached result'); - return cache[path]; + if (opts.token) { + opts.headers = { + ...opts.headers, + 'PRIVATE-TOKEN': opts.token, + }; + delete opts.token; } - logger.debug({ path }, method.toUpperCase()); - try { - const res = await glGot(url, opts); - if (opts.paginate) { - // Check if result is paginated - try { - const linkHeader = parseLinkHeader(res.headers.link); - if (linkHeader && linkHeader.next) { - res.body = res.body.concat( - (await get(linkHeader.next.url, opts, retries)).body - ); - } - } catch (err) /* istanbul ignore next */ { - logger.warn({ err }, 'Pagination error'); + delete opts.endpoint; + const res = await got(url, opts); + if (opts.paginate) { + // Check if result is paginated + try { + const linkHeader = parseLinkHeader(res.headers.link); + if (linkHeader && linkHeader.next) { + res.body = res.body.concat((await get(linkHeader.next.url, opts)).body); } + } catch (err) /* istanbul ignore next */ { + logger.warn({ err }, 'Pagination error'); } - if (method === 'get' && path.startsWith('projects/')) { - cache[path] = res; - } - return res; - } catch (err) /* istanbul ignore next */ { - if (retries < 1) { - throw err; - } - if (err.statusCode === 429) { - logger.info(`Sleeping 1 minute before retrying 429`); - await delay(60000); - return get(path, opts, retries - 1); - } - throw err; } + return res; } const helpers = ['get', 'post', 'put', 'patch', 'head', 'delete']; @@ -63,13 +43,8 @@ for (const x of helpers) { get(url, Object.assign({}, opts, { method: x.toUpperCase() })); } -get.reset = function reset() { - cache = null; - cache = {}; -}; - -get.setEndpoint = e => { - endpoint = e; +get.setBaseUrl = e => { + baseUrl = e; }; module.exports = get; diff --git a/lib/platform/gitlab/index.js b/lib/platform/gitlab/index.js index 3161bbeacc..66bc77ef8a 100644 --- a/lib/platform/gitlab/index.js +++ b/lib/platform/gitlab/index.js @@ -69,7 +69,7 @@ function initPlatform({ endpoint, token }) { const res = {}; if (endpoint) { res.endpoint = endpoint.replace(/\/?$/, '/'); // always add a trailing slash - get.setEndpoint(res.endpoint); + get.setBaseUrl(res.endpoint); defaults.endpoint = res.endpoint; } else { res.endpoint = defaults.endpoint; @@ -103,14 +103,12 @@ function cleanRepo() { config.storage.cleanRepo(); } // In theory most of this isn't necessary. In practice.. - get.reset(); config = {}; } // Initialize GitLab by getting base branch async function initRepo({ repository, localDir }) { config = {}; - get.reset(); config.repository = urlEscape(repository); config.localDir = localDir; let res; diff --git a/package.json b/package.json index bcd9b2357c..2d22289699 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,6 @@ "get-installed-path": "4.0.8", "gh-got": "8.1.0", "github-url-from-git": "1.5.0", - "gl-got": "9.0.3", "got": "9.6.0", "handlebars": "4.1.2", "ini": "1.3.5", diff --git a/test/globals.js b/test/globals.js index c86469b8b2..68b973942f 100644 --- a/test/globals.js +++ b/test/globals.js @@ -2,7 +2,6 @@ const upath = require('upath'); const os = require('os'); jest.mock('gh-got'); -jest.mock('gl-got'); const cache = require('../lib/workers/global/cache'); diff --git a/test/platform/gitlab/gl-got-wrapper.spec.js b/test/platform/gitlab/gl-got-wrapper.spec.js index 0941135bc5..b28c9a36b5 100644 --- a/test/platform/gitlab/gl-got-wrapper.spec.js +++ b/test/platform/gitlab/gl-got-wrapper.spec.js @@ -1,67 +1,66 @@ -const glGot = require('gl-got'); +const got = require('../../../lib/util/got'); const get = require('../../../lib/platform/gitlab/gl-got-wrapper'); +const hostRules = require('../../../lib/util/host-rules'); -describe('platform/gl-got-wrapper', () => { +jest.mock('../../../lib/util/got'); + +hostRules.add({ + hostType: 'gitlab', + token: 'abc123', +}); + +describe('platform/gitlab/gl-got-wrapper', () => { const body = ['a', 'b']; afterEach(() => { jest.resetAllMocks(); }); it('paginates', async () => { - glGot.mockReturnValueOnce({ + got.mockReturnValueOnce({ headers: { link: '<https://api.gitlab.com/search/code?q=addClass+user%3Amozilla&page=2>; rel="next", <https://api.gitlab.com/search/code?q=addClass+user%3Amozilla&page=34>; rel="last"', }, body: ['a'], }); - glGot.mockReturnValueOnce({ + got.mockReturnValueOnce({ headers: { link: '<https://api.gitlab.com/search/code?q=addClass+user%3Amozilla&page=3>; rel="next", <https://api.gitlab.com/search/code?q=addClass+user%3Amozilla&page=34>; rel="last"', }, body: ['b', 'c'], }); - glGot.mockReturnValueOnce({ + got.mockReturnValueOnce({ headers: {}, body: ['d'], }); const res = await get('some-url', { paginate: true }); expect(res.body).toHaveLength(4); - expect(glGot).toHaveBeenCalledTimes(3); + expect(got).toHaveBeenCalledTimes(3); }); it('attempts to paginate', async () => { - glGot.mockReturnValueOnce({ + got.mockReturnValueOnce({ headers: { link: '<https://api.gitlab.com/search/code?q=addClass+user%3Amozilla&page=34>; rel="last"', }, body: ['a'], }); - glGot.mockReturnValueOnce({ + got.mockReturnValueOnce({ headers: {}, body: ['b'], }); const res = await get('some-url', { paginate: true }); expect(res.body).toHaveLength(1); - expect(glGot).toHaveBeenCalledTimes(1); + expect(got).toHaveBeenCalledTimes(1); }); it('posts', async () => { - glGot.mockImplementationOnce(() => ({ + got.mockImplementationOnce(() => ({ body, })); const res = await get.post('some-url'); expect(res.body).toEqual(body); }); - it('returns cached', async () => { - get.reset(); - glGot.mockReturnValueOnce({ - body: {}, - }); - const res1 = await get('projects/foo'); - const res2 = await get('projects/foo'); - expect(res1).toEqual(res2); - }); - it('sets endpoint', () => { - get.setEndpoint('https://gitlab.renovatebot.com/api/v4/'); + it('sets baseUrl', () => { + get.setBaseUrl('https://gitlab.renovatebot.com/api/v4/'); }); }); diff --git a/yarn.lock b/yarn.lock index 40ee582928..a6bb6d9213 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3040,13 +3040,6 @@ github-url-from-git@1.5.0: resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" integrity sha1-+YX+3MCpqledyI16/waNVcxiUaA= -gl-got@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/gl-got/-/gl-got-9.0.3.tgz#ceddbbf71f09d9369d9179a35ca919ffb289259b" - integrity sha512-qT1Jx80DvD99G/gjG5ZHOEv9RS55mwyRakMhe4U4+BSvoTn0Mjjs01t7mRUHoB6TxaoublB2Bv0IYcXzOgKGrQ== - dependencies: - got "^9.2.0" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -3129,7 +3122,7 @@ globby@^9.0.0: pify "^4.0.1" slash "^2.0.0" -got@9.6.0, got@^9.2.0, got@^9.5.0: +got@9.6.0, got@^9.5.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== -- GitLab