From e568c5f700f5cd7056116be28a1dc92fcd4ee33b Mon Sep 17 00:00:00 2001 From: phenaproxima <phenaproxima@205645.no-reply.drupal.org> Date: Tue, 26 Oct 2021 18:14:51 +0000 Subject: [PATCH] Issue #3245846 by phenaproxima, tedbow: Move ExcludedPathsTrait to pre-create and pre-apply events in Package Manager --- automatic_updates.services.yml | 7 ++++- .../src}/Event/ExcludedPathsTrait.php | 6 ++-- package_manager/src/Event/PreApplyEvent.php | 3 ++ package_manager/src/Event/PreCreateEvent.php | 3 ++ package_manager/src/Stage.php | 26 +++++++--------- src/Event/ExcludedPathsSubscriber.php | 30 ++++++++++++++----- src/Event/PreCommitEvent.php | 1 + src/Event/PreStartEvent.php | 1 + src/Updater.php | 26 +++------------- 9 files changed, 53 insertions(+), 50 deletions(-) rename {src => package_manager/src}/Event/ExcludedPathsTrait.php (79%) diff --git a/automatic_updates.services.yml b/automatic_updates.services.yml index 21b97e6d11..ca0bd0dedb 100644 --- a/automatic_updates.services.yml +++ b/automatic_updates.services.yml @@ -23,7 +23,12 @@ services: - { name: event_subscriber } automatic_updates.excluded_paths_subscriber: class: Drupal\automatic_updates\Event\ExcludedPathsSubscriber - arguments: ['%app.root%', '%site.path%', '@file_system', '@stream_wrapper_manager'] + arguments: + - '%app.root%' + - '%site.path%' + - '@file_system' + - '@stream_wrapper_manager' + - '@extension.list.module' tags: - { name: event_subscriber } automatic_updates.staged_projects_validator: diff --git a/src/Event/ExcludedPathsTrait.php b/package_manager/src/Event/ExcludedPathsTrait.php similarity index 79% rename from src/Event/ExcludedPathsTrait.php rename to package_manager/src/Event/ExcludedPathsTrait.php index 15443cff82..3648446b80 100644 --- a/src/Event/ExcludedPathsTrait.php +++ b/package_manager/src/Event/ExcludedPathsTrait.php @@ -1,6 +1,6 @@ <?php -namespace Drupal\automatic_updates\Event; +namespace Drupal\package_manager\Event; /** * Common functionality for events which can collect excluded paths. @@ -15,7 +15,7 @@ trait ExcludedPathsTrait { protected $excludedPaths = []; /** - * Adds an absolute path to exclude from the update operation. + * Adds an absolute path to exclude from the current operation. * * @todo This should only accept paths relative to the active directory. * @@ -27,7 +27,7 @@ trait ExcludedPathsTrait { } /** - * Returns the paths to exclude from the update operation. + * Returns the paths to exclude from the current operation. * * @return string[] * The paths to exclude. diff --git a/package_manager/src/Event/PreApplyEvent.php b/package_manager/src/Event/PreApplyEvent.php index 3ffdf0d175..aa0f26785a 100644 --- a/package_manager/src/Event/PreApplyEvent.php +++ b/package_manager/src/Event/PreApplyEvent.php @@ -6,4 +6,7 @@ namespace Drupal\package_manager\Event; * Event fired before staged changes are synced to the active directory. */ class PreApplyEvent extends StageEvent { + + use ExcludedPathsTrait; + } diff --git a/package_manager/src/Event/PreCreateEvent.php b/package_manager/src/Event/PreCreateEvent.php index c893738bee..d76cb2437b 100644 --- a/package_manager/src/Event/PreCreateEvent.php +++ b/package_manager/src/Event/PreCreateEvent.php @@ -6,4 +6,7 @@ namespace Drupal\package_manager\Event; * Event fired before a staging area is created. */ class PreCreateEvent extends StageEvent { + + use ExcludedPathsTrait; + } diff --git a/package_manager/src/Stage.php b/package_manager/src/Stage.php index a6fd0abd0a..562ef8f927 100644 --- a/package_manager/src/Stage.php +++ b/package_manager/src/Stage.php @@ -97,18 +97,15 @@ class Stage { /** * Copies the active code base into the staging area. - * - * @param array|null $exclusions - * Paths to exclude from being copied into the staging area. - * - * @todo Remove the $exclusions parameter when this method fires events. */ - public function create(?array $exclusions = []): void { + public function create(): void { $active_dir = $this->pathLocator->getActiveDirectory(); $stage_dir = $this->pathLocator->getStageDirectory(); - $this->dispatch(new PreCreateEvent()); - $this->beginner->begin($active_dir, $stage_dir, $exclusions); + $event = new PreCreateEvent(); + $this->dispatch($event); + + $this->beginner->begin($active_dir, $stage_dir, $event->getExcludedPaths()); $this->dispatch(new PostCreateEvent()); } @@ -129,18 +126,15 @@ class Stage { /** * Applies staged changes to the active directory. - * - * @param array|null $exclusions - * Paths to exclude from being copied into the active directory. - * - * @todo Remove the $exclusions parameter when this method fires events. */ - public function apply(?array $exclusions = []): void { + public function apply(): void { $active_dir = $this->pathLocator->getActiveDirectory(); $stage_dir = $this->pathLocator->getStageDirectory(); - $this->dispatch(new PreApplyEvent()); - $this->committer->commit($stage_dir, $active_dir, $exclusions); + $event = new PreApplyEvent(); + $this->dispatch($event); + + $this->committer->commit($stage_dir, $active_dir, $event->getExcludedPaths()); $this->dispatch(new PostApplyEvent()); } diff --git a/src/Event/ExcludedPathsSubscriber.php b/src/Event/ExcludedPathsSubscriber.php index be81f1ab56..e7cc8ec17d 100644 --- a/src/Event/ExcludedPathsSubscriber.php +++ b/src/Event/ExcludedPathsSubscriber.php @@ -2,9 +2,12 @@ namespace Drupal\automatic_updates\Event; +use Drupal\Core\Extension\ModuleExtensionList; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\StreamWrapper\LocalStream; use Drupal\Core\StreamWrapper\StreamWrapperManagerInterface; +use Drupal\package_manager\Event\PreApplyEvent; +use Drupal\package_manager\Event\PreCreateEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** @@ -40,6 +43,13 @@ class ExcludedPathsSubscriber implements EventSubscriberInterface { */ protected $streamWrapperManager; + /** + * The module list service. + * + * @var \Drupal\Core\Extension\ModuleExtensionList + */ + protected $moduleList; + /** * Constructs an UpdateSubscriber. * @@ -51,21 +61,24 @@ class ExcludedPathsSubscriber implements EventSubscriberInterface { * The file system service. * @param \Drupal\Core\StreamWrapper\StreamWrapperManagerInterface $stream_wrapper_manager * The stream wrapper manager service. + * @param \Drupal\Core\Extension\ModuleExtensionList $module_list + * The module list service. */ - public function __construct(string $app_root, string $site_path, FileSystemInterface $file_system, StreamWrapperManagerInterface $stream_wrapper_manager) { + public function __construct(string $app_root, string $site_path, FileSystemInterface $file_system, StreamWrapperManagerInterface $stream_wrapper_manager, ModuleExtensionList $module_list) { $this->appRoot = $app_root; $this->sitePath = $site_path; $this->fileSystem = $file_system; $this->streamWrapperManager = $stream_wrapper_manager; + $this->moduleList = $module_list; } /** * Reacts before staged updates are committed the active directory. * - * @param \Drupal\automatic_updates\Event\PreCommitEvent $event + * @param \Drupal\package_manager\Event\PreApplyEvent $event * The event object. */ - public function preCommit(PreCommitEvent $event): void { + public function preApply(PreApplyEvent $event): void { // Don't copy anything from the staging area's sites/default. // @todo Make this a lot smarter in https://www.drupal.org/i/3228955. $event->excludePath('sites/default'); @@ -79,10 +92,10 @@ class ExcludedPathsSubscriber implements EventSubscriberInterface { /** * Reacts to the beginning of an update process. * - * @param \Drupal\automatic_updates\Event\PreStartEvent $event + * @param \Drupal\package_manager\Event\PreCreateEvent $event * The event object. */ - public function preStart(PreStartEvent $event): void { + public function preCreate(PreCreateEvent $event): void { // Automated test site directories should never be staged. $event->excludePath('sites/simpletest'); @@ -100,7 +113,8 @@ class ExcludedPathsSubscriber implements EventSubscriberInterface { } // If this module is a git clone, exclude it. if (is_dir(__DIR__ . '/../../.git')) { - $event->excludePath($this->fileSystem->realpath(__DIR__ . '/../..')); + $dir = $this->moduleList->getPath('automatic_updates'); + $event->excludePath($dir); } // Exclude site-specific settings files. @@ -157,8 +171,8 @@ class ExcludedPathsSubscriber implements EventSubscriberInterface { */ public static function getSubscribedEvents() { return [ - PreStartEvent::class => 'preStart', - PreCommitEvent::class => 'preCommit', + PreCreateEvent::class => 'preCreate', + PreApplyEvent::class => 'preApply', ]; } diff --git a/src/Event/PreCommitEvent.php b/src/Event/PreCommitEvent.php index f568d9cdd9..010faca493 100644 --- a/src/Event/PreCommitEvent.php +++ b/src/Event/PreCommitEvent.php @@ -3,6 +3,7 @@ namespace Drupal\automatic_updates\Event; use Drupal\package_manager\ComposerUtility; +use Drupal\package_manager\Event\ExcludedPathsTrait; /** * Event fired before staged changes are copied into the active site. diff --git a/src/Event/PreStartEvent.php b/src/Event/PreStartEvent.php index 3fd40f35b3..02450fe055 100644 --- a/src/Event/PreStartEvent.php +++ b/src/Event/PreStartEvent.php @@ -3,6 +3,7 @@ namespace Drupal\automatic_updates\Event; use Drupal\package_manager\ComposerUtility; +use Drupal\package_manager\Event\ExcludedPathsTrait; /** * Event fired before an update begins. diff --git a/src/Updater.php b/src/Updater.php index d3d6e4df11..3ca468e408 100644 --- a/src/Updater.php +++ b/src/Updater.php @@ -117,28 +117,11 @@ class Updater { $packages[$package] = $project_versions['drupal']; } $stage_key = $this->createActiveStage($packages); - /** @var \Drupal\automatic_updates\Event\PreStartEvent $event */ - $event = $this->dispatchUpdateEvent(new PreStartEvent($composer, $packages)); - $this->stage->create($this->getExclusions($event)); + $this->dispatchUpdateEvent(new PreStartEvent($composer, $packages)); + $this->stage->create(); return $stage_key; } - /** - * Gets the excluded paths collected by an event object. - * - * @param \Drupal\automatic_updates\Event\PreStartEvent|\Drupal\automatic_updates\Event\PreCommitEvent $event - * The event object. - * - * @return string[] - * The paths to exclude, relative to the active directory. - */ - private function getExclusions(UpdateEvent $event): array { - $make_relative = function (string $path): string { - return str_replace($this->pathLocator->getActiveDirectory() . '/', '', $path); - }; - return array_map($make_relative, $event->getExcludedPaths()); - } - /** * Stages the update. */ @@ -157,9 +140,8 @@ class Updater { $stage_dir = $this->pathLocator->getStageDirectory(); $stage_composer = ComposerUtility::createForDirectory($stage_dir); - /** @var \Drupal\automatic_updates\Event\PreCommitEvent $event */ - $event = $this->dispatchUpdateEvent(new PreCommitEvent($active_composer, $stage_composer)); - $this->stage->apply($this->getExclusions($event)); + $this->dispatchUpdateEvent(new PreCommitEvent($active_composer, $stage_composer)); + $this->stage->apply(); $this->dispatchUpdateEvent(new PostCommitEvent($active_composer)); } -- GitLab