From f74d4daacd5d57f7cf68ff357c01b2f636d15090 Mon Sep 17 00:00:00 2001
From: Adam G-H <32250-phenaproxima@users.noreply.drupalcode.org>
Date: Wed, 10 Jan 2024 13:47:34 +0000
Subject: [PATCH] Issue #3408483 by phenaproxima, Wim Leers: Support
 cweagans/composer-patches 2.x

---
 .../Validator/ComposerPatchesValidator.php    | 20 +++++++++++++++----
 .../Validator/ComposerPluginsValidator.php    |  2 +-
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/package_manager/src/Validator/ComposerPatchesValidator.php b/package_manager/src/Validator/ComposerPatchesValidator.php
index ba83ceedb1..e99124c34d 100644
--- a/package_manager/src/Validator/ComposerPatchesValidator.php
+++ b/package_manager/src/Validator/ComposerPatchesValidator.php
@@ -4,6 +4,7 @@ declare(strict_types = 1);
 
 namespace Drupal\package_manager\Validator;
 
+use Composer\Semver\Semver;
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
@@ -155,15 +156,26 @@ final class ComposerPatchesValidator implements EventSubscriberInterface {
    */
   private function computePatcherStatus(string $working_dir): array {
     $list = $this->composerInspector->getInstalledPackagesList($working_dir);
-    $is_installed = isset($list[static::PLUGIN_NAME]);
+    $installed_version = $list[static::PLUGIN_NAME]?->version;
 
     $info = $this->composerInspector->getRootPackageInfo($working_dir);
     $is_root_requirement = array_key_exists(static::PLUGIN_NAME, $info['requires'] ?? []) || array_key_exists(static::PLUGIN_NAME, $info['devRequires'] ?? []);
 
-    $extra = Json::decode($this->composerInspector->getConfig('extra', $working_dir));
-    $exit_on_failure = $extra['composer-exit-on-patch-failure'] ?? FALSE;
+    // The 2.x version of the plugin always exits with an error if a patch can't
+    // be applied.
+    if ($installed_version && Semver::satisfies($installed_version, '^2')) {
+      $exit_on_failure = TRUE;
+    }
+    else {
+      $extra = Json::decode($this->composerInspector->getConfig('extra', $working_dir));
+      $exit_on_failure = $extra['composer-exit-on-patch-failure'] ?? FALSE;
+    }
 
-    return [$is_installed, $is_root_requirement, $exit_on_failure];
+    return [
+      is_string($installed_version),
+      $is_root_requirement,
+      $exit_on_failure,
+    ];
   }
 
   /**
diff --git a/package_manager/src/Validator/ComposerPluginsValidator.php b/package_manager/src/Validator/ComposerPluginsValidator.php
index b584da44c8..ab07efaf46 100644
--- a/package_manager/src/Validator/ComposerPluginsValidator.php
+++ b/package_manager/src/Validator/ComposerPluginsValidator.php
@@ -64,7 +64,7 @@ final class ComposerPluginsValidator implements EventSubscriberInterface {
   private const SUPPORTED_PLUGINS_THAT_DO_MODIFY = [
     // cSpell:disable
     // @see \Drupal\package_manager\Validator\ComposerPatchesValidator
-    'cweagans/composer-patches' => '^1.7.3',
+    'cweagans/composer-patches' => '^1.7.3 || ^2',
     // @see \Drupal\package_manager\PathExcluder\VendorHardeningExcluder
     'drupal/core-vendor-hardening' => '*',
     'php-http/discovery' => '*',
-- 
GitLab