From a13b59571bd550d7a00054cc1479bf64f478cff3 Mon Sep 17 00:00:00 2001
From: Kieran <kieran@supportpal.com>
Date: Wed, 29 Jul 2020 13:23:39 +0100
Subject: [PATCH] fix(packagist): prevent packages.json being added twice
 (#6853)

Co-authored-by: Rhys Arkins <rhys@arkins.net>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
---
 lib/manager/composer/__fixtures__/composer4.json    |  4 ++++
 .../composer/__snapshots__/extract.spec.ts.snap     |  1 +
 lib/manager/composer/extract.spec.ts                |  2 +-
 lib/manager/composer/extract.ts                     | 13 ++++++++++++-
 4 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/lib/manager/composer/__fixtures__/composer4.json b/lib/manager/composer/__fixtures__/composer4.json
index 89e3d1dd42..2a1f21d3ec 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 d29731eb95..e51fb13efe 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 17a4f48071..ff3fe792f1 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 1a53277532..28d64d14f4 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(
-- 
GitLab