diff --git a/automatic_updates.services.yml b/automatic_updates.services.yml index aa836dbc00faa5b945a3d787a5ba1e991302c742..085ce2f35538f1299d7222f45f229b2631e0592a 100644 --- a/automatic_updates.services.yml +++ b/automatic_updates.services.yml @@ -64,3 +64,9 @@ services: class: Drupal\automatic_updates\Validator\CoreComposerValidator tags: - { name: event_subscriber } + automatic_updates.excluded_paths_subscriber: + class: Drupal\automatic_updates\Event\ExcludedPathsSubscriber + arguments: + - '@extension.list.module' + tags: + - { name: event_subscriber } diff --git a/package_manager/package_manager.services.yml b/package_manager/package_manager.services.yml index b0eb0f54b32f39ef8bfdaaa4abbab70efc279c42..59bfe79c0e6fb0c6a48f038a0e038dda0064d1c6 100644 --- a/package_manager/package_manager.services.yml +++ b/package_manager/package_manager.services.yml @@ -131,6 +131,5 @@ services: - '%site.path%' - '@file_system' - '@stream_wrapper_manager' - - '@extension.list.module' tags: - { name: event_subscriber } diff --git a/package_manager/src/EventSubscriber/ExcludedPathsSubscriber.php b/package_manager/src/EventSubscriber/ExcludedPathsSubscriber.php index a9921a3cda46a34be155afd970743760784d9244..f7e601c3f008c9b933c16063fb0898b1a57f48b2 100644 --- a/package_manager/src/EventSubscriber/ExcludedPathsSubscriber.php +++ b/package_manager/src/EventSubscriber/ExcludedPathsSubscriber.php @@ -2,7 +2,6 @@ namespace Drupal\package_manager\EventSubscriber; -use Drupal\Core\Extension\ModuleExtensionList; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\StreamWrapper\LocalStream; use Drupal\Core\StreamWrapper\StreamWrapperManagerInterface; @@ -43,13 +42,6 @@ class ExcludedPathsSubscriber implements EventSubscriberInterface { */ protected $streamWrapperManager; - /** - * The module list service. - * - * @var \Drupal\Core\Extension\ModuleExtensionList - */ - protected $moduleList; - /** * Constructs an UpdateSubscriber. * @@ -61,19 +53,16 @@ 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, ModuleExtensionList $module_list) { + public function __construct(string $app_root, string $site_path, FileSystemInterface $file_system, StreamWrapperManagerInterface $stream_wrapper_manager) { $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. + * Reacts before staged changes are committed the active directory. * * @param \Drupal\package_manager\Event\PreApplyEvent $event * The event object. @@ -90,7 +79,7 @@ class ExcludedPathsSubscriber implements EventSubscriberInterface { } /** - * Reacts to the beginning of an update process. + * Excludes paths from a staging area before it is created. * * @param \Drupal\package_manager\Event\PreCreateEvent $event * The event object. @@ -111,11 +100,6 @@ class ExcludedPathsSubscriber implements EventSubscriberInterface { if ($private = $this->getFilesPath('private')) { $event->excludePath($private); } - // If this module is a git clone, exclude it. - if (is_dir(__DIR__ . '/../../.git')) { - $dir = $this->moduleList->getPath('automatic_updates'); - $event->excludePath($dir); - } // Exclude site-specific settings files. $settings_files = [ diff --git a/package_manager/tests/fixtures/fake_site/composer.json b/package_manager/tests/fixtures/fake_site/composer.json new file mode 100644 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/package_manager/tests/fixtures/fake_site/composer.json @@ -0,0 +1 @@ +{} diff --git a/package_manager/tests/src/Functional/ExcludedPathsTest.php b/package_manager/tests/src/Functional/ExcludedPathsTest.php index 442ed640d8e9df7d0bdcf96ca9f58d9ed4d22dd4..b0dc9ebf6e21a8f693be0a0468671ba3f2793c0b 100644 --- a/package_manager/tests/src/Functional/ExcludedPathsTest.php +++ b/package_manager/tests/src/Functional/ExcludedPathsTest.php @@ -24,6 +24,9 @@ class ExcludedPathsTest extends BrowserTestBase { */ protected static $modules = ['package_manager']; + /** + * Tests that certain paths are excluded from staging areas. + */ public function testExcludedPaths(): void { $active_dir = __DIR__ . '/../../fixtures/fake_site'; $stage_dir = $this->siteDirectory . '/stage'; @@ -32,6 +35,8 @@ class ExcludedPathsTest extends BrowserTestBase { $path_locator->getActiveDirectory()->willReturn($active_dir); $path_locator->getStageDirectory()->willReturn($stage_dir); + // Ensure that we are using directories within the fake site fixture for + // public and private files. $settings = Settings::getAll(); $settings['file_public_path'] = 'sites/example.com/files'; $settings['file_private_path'] = 'private'; diff --git a/src/Event/ExcludedPathsSubscriber.php b/src/Event/ExcludedPathsSubscriber.php new file mode 100644 index 0000000000000000000000000000000000000000..ecc4b0ce68b5ab8f9916e202ff40e192e1a8f7b8 --- /dev/null +++ b/src/Event/ExcludedPathsSubscriber.php @@ -0,0 +1,54 @@ +<?php + +namespace Drupal\automatic_updates\Event; + +use Drupal\Core\Extension\ModuleExtensionList; +use Drupal\package_manager\Event\PreCreateEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +/** + * Defines an event subscriber to exclude certain paths from staging areas. + */ +class ExcludedPathsSubscriber implements EventSubscriberInterface { + + /** + * The module list service. + * + * @var \Drupal\Core\Extension\ModuleExtensionList + */ + protected $moduleList; + + /** + * Constructs an UpdateSubscriber. + * + * @param \Drupal\Core\Extension\ModuleExtensionList $module_list + * The module list service. + */ + public function __construct(ModuleExtensionList $module_list) { + $this->moduleList = $module_list; + } + + /** + * Excludes paths from a staging area before it is created. + * + * @param \Drupal\package_manager\Event\PreCreateEvent $event + * The event object. + */ + public function preCreate(PreCreateEvent $event): void { + // If this module is a git clone, exclude it. + if (is_dir(__DIR__ . '/../../.git')) { + $dir = $this->moduleList->getPath('automatic_updates'); + $event->excludePath($dir); + } + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() { + return [ + PreCreateEvent::class => 'preCreate', + ]; + } + +}