From 1488d68c3ae23cbe43bdfe8655136e7999aa9235 Mon Sep 17 00:00:00 2001
From: omkar podey <58183-omkar.podey@users.noreply.drupalcode.org>
Date: Wed, 10 May 2023 12:38:56 +0000
Subject: [PATCH] Issue #3345535 by tedbow, omkar.podey, Wim Leers:
 BaseRequirementsFulfilledValidator should listen to PreRequireEvent

---
 .../src/Validator/BaseRequirementValidatorTrait.php         | 2 ++
 .../src/Validator/BaseRequirementsFulfilledValidator.php    | 4 ++--
 package_manager/src/Validator/SymlinkValidator.php          | 6 ++++++
 .../src/Kernel/BaseRequirementsFulfilledValidatorTest.php   | 2 ++
 4 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/package_manager/src/Validator/BaseRequirementValidatorTrait.php b/package_manager/src/Validator/BaseRequirementValidatorTrait.php
index ef3d669c0d..85f90769a5 100644
--- a/package_manager/src/Validator/BaseRequirementValidatorTrait.php
+++ b/package_manager/src/Validator/BaseRequirementValidatorTrait.php
@@ -7,6 +7,7 @@ namespace Drupal\package_manager\Validator;
 use Drupal\package_manager\Event\PreApplyEvent;
 use Drupal\package_manager\Event\PreCreateEvent;
 use Drupal\package_manager\Event\PreOperationStageEvent;
+use Drupal\package_manager\Event\PreRequireEvent;
 use Drupal\package_manager\Event\StatusCheckEvent;
 
 /**
@@ -40,6 +41,7 @@ trait BaseRequirementValidatorTrait {
 
     return [
       PreCreateEvent::class => ['validate', $priority],
+      PreRequireEvent::class => ['validate', $priority],
       PreApplyEvent::class => ['validate', $priority],
       StatusCheckEvent::class => ['validate', $priority],
     ];
diff --git a/package_manager/src/Validator/BaseRequirementsFulfilledValidator.php b/package_manager/src/Validator/BaseRequirementsFulfilledValidator.php
index ba5093fc8d..c358744b6d 100644
--- a/package_manager/src/Validator/BaseRequirementsFulfilledValidator.php
+++ b/package_manager/src/Validator/BaseRequirementsFulfilledValidator.php
@@ -5,6 +5,7 @@ namespace Drupal\package_manager\Validator;
 use Drupal\package_manager\Event\PreApplyEvent;
 use Drupal\package_manager\Event\PreCreateEvent;
 use Drupal\package_manager\Event\PreOperationStageEvent;
+use Drupal\package_manager\Event\PreRequireEvent;
 use Drupal\package_manager\Event\StatusCheckEvent;
 use Drupal\system\SystemManager;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@@ -59,10 +60,9 @@ final class BaseRequirementsFulfilledValidator implements EventSubscriberInterfa
    * {@inheritdoc}
    */
   public static function getSubscribedEvents(): array {
-    // @todo Decide whether to also listen to PreRequireEvent in
-    //   https://drupal.org/i/3345535.
     return [
       PreCreateEvent::class => ['validate', self::PRIORITY],
+      PreRequireEvent::class => ['validate', self::PRIORITY],
       PreApplyEvent::class => ['validate', self::PRIORITY],
       StatusCheckEvent::class => ['validate', self::PRIORITY],
     ];
diff --git a/package_manager/src/Validator/SymlinkValidator.php b/package_manager/src/Validator/SymlinkValidator.php
index e30ac93f3c..80b7d50794 100644
--- a/package_manager/src/Validator/SymlinkValidator.php
+++ b/package_manager/src/Validator/SymlinkValidator.php
@@ -5,6 +5,7 @@ declare(strict_types = 1);
 namespace Drupal\package_manager\Validator;
 
 use Drupal\package_manager\Event\PreOperationStageEvent;
+use Drupal\package_manager\Event\PreRequireEvent;
 use Drupal\package_manager\PathLocator;
 use PhpTuf\ComposerStager\Domain\Aggregate\PreconditionsTree\NoUnsupportedLinksExistInterface;
 use PhpTuf\ComposerStager\Domain\Exception\PreconditionException;
@@ -46,6 +47,11 @@ final class SymlinkValidator implements EventSubscriberInterface {
    * Flags errors if the project root or stage directory contain symbolic links.
    */
   public function validate(PreOperationStageEvent $event): void {
+    if ($event instanceof PreRequireEvent) {
+      // We don't need to check symlinks again during PreRequireEvent; this was
+      // already just validated during PreCreateEvent.
+      return;
+    }
     $active_dir = $this->pathFactory->create($this->pathLocator->getProjectRoot());
 
     // The precondition requires us to pass both an active and stage directory,
diff --git a/package_manager/tests/src/Kernel/BaseRequirementsFulfilledValidatorTest.php b/package_manager/tests/src/Kernel/BaseRequirementsFulfilledValidatorTest.php
index a722b9c1c1..1a81004bfe 100644
--- a/package_manager/tests/src/Kernel/BaseRequirementsFulfilledValidatorTest.php
+++ b/package_manager/tests/src/Kernel/BaseRequirementsFulfilledValidatorTest.php
@@ -5,6 +5,7 @@ namespace Drupal\Tests\package_manager\Kernel;
 use Drupal\package_manager\Event\PreApplyEvent;
 use Drupal\package_manager\Event\PreCreateEvent;
 use Drupal\package_manager\Event\PreOperationStageEvent;
+use Drupal\package_manager\Event\PreRequireEvent;
 use Drupal\package_manager\Event\StatusCheckEvent;
 use Drupal\package_manager\ValidationResult;
 use Drupal\package_manager\Validator\BaseRequirementsFulfilledValidator;
@@ -56,6 +57,7 @@ class BaseRequirementsFulfilledValidatorTest extends PackageManagerKernelTestBas
   public function providerBaseRequirement(): array {
     return [
       [PreCreateEvent::class],
+      [PreRequireEvent::class],
       [PreApplyEvent::class],
       [StatusCheckEvent::class],
     ];
-- 
GitLab