From 2561a200bb6b2a169e39d44ea180f264e4f355d1 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Tue, 2 Aug 2022 23:38:30 +0100
Subject: [PATCH] Issue #3116405 by Spokje, Mile23, Hardik_Patel_12, jofitz,
 Sahana _N, andypost, alexpott, fgm: Warnings generated when using an
 optimized autoload file with Composer 1.10 / Composer 2

---
 composer.lock                                 | 28 +++++++++++-
 core/composer.json                            | 26 +++++++++++
 .../Drupal/Tests/ComposerIntegrationTest.php  | 44 +++++++++++++++++++
 3 files changed, 97 insertions(+), 1 deletion(-)

diff --git a/composer.lock b/composer.lock
index f19ae91d0f43..e72bc3b669ed 100644
--- a/composer.lock
+++ b/composer.lock
@@ -441,7 +441,7 @@
             "dist": {
                 "type": "path",
                 "url": "core",
-                "reference": "c3581356272302fa1757a8881289fd8e05c8ca07"
+                "reference": "aa03b1c4869c7a1f5907d9e4f1297c97781ba1da"
             },
             "require": {
                 "asm89/stack-cors": "^2.0.2",
@@ -486,6 +486,32 @@
             "conflict": {
                 "drush/drush": "<8.1.10"
             },
+            "replace": {
+                "drupal/core-annotation": "self.version",
+                "drupal/core-assertion": "self.version",
+                "drupal/core-class-finder": "self.version",
+                "drupal/core-datetime": "self.version",
+                "drupal/core-dependency-injection": "self.version",
+                "drupal/core-diff": "self.version",
+                "drupal/core-discovery": "self.version",
+                "drupal/core-event-dispatcher": "self.version",
+                "drupal/core-file-cache": "self.version",
+                "drupal/core-file-security": "self.version",
+                "drupal/core-filesystem": "self.version",
+                "drupal/core-front-matter": "self.version",
+                "drupal/core-gettext": "self.version",
+                "drupal/core-graph": "self.version",
+                "drupal/core-http-foundation": "self.version",
+                "drupal/core-php-storage": "self.version",
+                "drupal/core-plugin": "self.version",
+                "drupal/core-proxy-builder": "self.version",
+                "drupal/core-render": "self.version",
+                "drupal/core-serialization": "self.version",
+                "drupal/core-transliteration": "self.version",
+                "drupal/core-utility": "self.version",
+                "drupal/core-uuid": "self.version",
+                "drupal/core-version": "self.version"
+            },
             "type": "drupal-core",
             "extra": {
                 "drupal-scaffold": {
diff --git a/core/composer.json b/core/composer.json
index 0ca7697c5dca..8e751723b747 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -46,6 +46,32 @@
     "conflict": {
         "drush/drush": "<8.1.10"
     },
+    "replace": {
+        "drupal/core-annotation": "self.version",
+        "drupal/core-assertion": "self.version",
+        "drupal/core-class-finder": "self.version",
+        "drupal/core-datetime": "self.version",
+        "drupal/core-dependency-injection": "self.version",
+        "drupal/core-diff": "self.version",
+        "drupal/core-discovery": "self.version",
+        "drupal/core-event-dispatcher": "self.version",
+        "drupal/core-file-cache": "self.version",
+        "drupal/core-file-security": "self.version",
+        "drupal/core-filesystem": "self.version",
+        "drupal/core-front-matter": "self.version",
+        "drupal/core-gettext": "self.version",
+        "drupal/core-graph": "self.version",
+        "drupal/core-http-foundation": "self.version",
+        "drupal/core-php-storage": "self.version",
+        "drupal/core-plugin": "self.version",
+        "drupal/core-proxy-builder": "self.version",
+        "drupal/core-render": "self.version",
+        "drupal/core-serialization": "self.version",
+        "drupal/core-transliteration": "self.version",
+        "drupal/core-utility": "self.version",
+        "drupal/core-uuid": "self.version",
+        "drupal/core-version": "self.version"
+    },
     "minimum-stability": "dev",
     "prefer-stable": true,
     "autoload": {
diff --git a/core/tests/Drupal/Tests/ComposerIntegrationTest.php b/core/tests/Drupal/Tests/ComposerIntegrationTest.php
index 3d779d447edb..93342f01b245 100644
--- a/core/tests/Drupal/Tests/ComposerIntegrationTest.php
+++ b/core/tests/Drupal/Tests/ComposerIntegrationTest.php
@@ -4,6 +4,7 @@
 
 use Drupal\Composer\Plugin\VendorHardening\Config;
 use Drupal\Tests\Composer\ComposerIntegrationTrait;
+use Symfony\Component\Finder\Finder;
 
 /**
  * Tests Composer integration.
@@ -84,6 +85,49 @@ public function providerTestComposerJson() {
     return $data;
   }
 
+  /**
+   * Tests core's composer.json replace section.
+   *
+   * Verify that all core components are also listed in the 'replace' section of
+   * core's composer.json.
+   */
+  public function testAllCoreComponentsReplaced(): void {
+    // Assemble a path to core components.
+    $components_path = $this->root . '/core/lib/Drupal/Component';
+
+    // Grab the 'replace' section of the core composer.json file.
+    $json = json_decode(file_get_contents($this->root . '/core/composer.json'), FALSE);
+    $composer_replace_packages = (array) $json->replace;
+
+    // Get a list of all the composer.json files in the components path.
+    $components_composer_json_files = [];
+
+    $composer_json_finder = new Finder();
+    $composer_json_finder->name('composer.json')
+      ->in($components_path)
+      ->ignoreUnreadableDirs();
+
+    foreach ($composer_json_finder->getIterator() as $composer_json) {
+      $components_composer_json_files[$composer_json->getPathname()] = [$composer_json->getPathname()];
+    }
+
+    $this->assertNotEmpty($components_composer_json_files);
+    $this->assertCount(count($composer_replace_packages), $components_composer_json_files);
+
+    // Assert that each core components has a corresponding 'replace' in
+    // composer.json.
+    foreach ($components_composer_json_files as $components_composer_json_file) {
+      $json = json_decode(file_get_contents(reset($components_composer_json_file)), FALSE);
+      $component_name = $json->name;
+
+      $this->assertArrayHasKey(
+        $component_name,
+        $composer_replace_packages,
+        'Unable to find ' . $component_name . ' in replace list of composer.json'
+      );
+    }
+  }
+
   /**
    * Data provider for the scaffold files test for Drupal core.
    *
-- 
GitLab