diff --git a/lib/manager/composer/__fixtures__/composer4.json b/lib/manager/composer/__fixtures__/composer4.json index 89e3d1dd42d7b84129aff0ebbe459ccd728049f6..2a1f21d3ec84dbb02fd536488433916dec63bbf3 100644 --- a/lib/manager/composer/__fixtures__/composer4.json +++ b/lib/manager/composer/__fixtures__/composer4.json @@ -15,6 +15,10 @@ { "type": "composer", "url": "https://wpackagist.org" + }, + { + "type": "composer", + "url": "https://gitlab.vendor.com/api/v4/group/2/-/packages/composer/packages.json" } ], "require": { diff --git a/lib/manager/composer/__snapshots__/extract.spec.ts.snap b/lib/manager/composer/__snapshots__/extract.spec.ts.snap index d29731eb95a26ebfa13b819da4ba757770f3801b..e51fb13efe2cbf80b626641461e517995ff77102 100644 --- a/lib/manager/composer/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/composer/__snapshots__/extract.spec.ts.snap @@ -600,6 +600,7 @@ Object { ], "registryUrls": Array [ "https://wpackagist.org", + "https://gitlab.vendor.com/api/v4/group/2/-/packages/composer", "https://packagist.org", ], } diff --git a/lib/manager/composer/extract.spec.ts b/lib/manager/composer/extract.spec.ts index 17a4f4807118e4287f78329ca7d47c14480bf09d..ff3fe792f1184392d7d1276015d0540bf3b7e56a 100644 --- a/lib/manager/composer/extract.spec.ts +++ b/lib/manager/composer/extract.spec.ts @@ -58,7 +58,7 @@ describe('lib/manager/composer/extract', () => { it('extracts repositories and registryUrls', async () => { const res = await extractPackageFile(requirements4, packageFile); expect(res).toMatchSnapshot(); - expect(res.registryUrls).toHaveLength(2); + expect(res.registryUrls).toHaveLength(3); }); it('extracts object repositories and registryUrls with lock file', async () => { fs.readLocalFile.mockResolvedValue(requirements5Lock); diff --git a/lib/manager/composer/extract.ts b/lib/manager/composer/extract.ts index 1a53277532d68dca7f0bc338726436046217aa06..28d64d14f4c8532d8e7dcdbeef24ddd9c1bfac97 100644 --- a/lib/manager/composer/extract.ts +++ b/lib/manager/composer/extract.ts @@ -29,6 +29,17 @@ interface ComposerConfig { 'require-dev': Record<string, string>; } +/** + * The regUrl is expected to be a base URL. GitLab composer repository installation guide specifies + * to use a base URL containing packages.json. Composer still works in this scenario by determining + * whether to add / remove packages.json from the URL. + * + * See https://github.com/composer/composer/blob/750a92b4b7aecda0e5b2f9b963f1cb1421900675/src/Composer/Repository/ComposerRepository.php#L815 + */ +function transformRegUrl(url: string): string { + return url.replace(/(\/packages\.json)$/, ''); +} + /** * Parse the repositories field from a composer.json * @@ -53,7 +64,7 @@ function parseRepositories( repositories[name] = repo; break; case 'composer': - registryUrls.push(repo.url); + registryUrls.push(transformRegUrl(repo.url)); break; case 'package': logger.debug(