diff --git a/composer/Plugin/Scaffold/Handler.php b/composer/Plugin/Scaffold/Handler.php index 3e51f909a335238ffcf9d4054b511f486e206da5..a3e9914bb39445f433bebddcb5f88387f4364fa9 100644 --- a/composer/Plugin/Scaffold/Handler.php +++ b/composer/Plugin/Scaffold/Handler.php @@ -3,7 +3,6 @@ namespace Drupal\Composer\Plugin\Scaffold; use Composer\Composer; -use Composer\EventDispatcher\EventDispatcher; use Composer\Installer\PackageEvent; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; @@ -143,7 +142,7 @@ public function scaffold() { } // Call any pre-scaffold scripts that may be defined. - $dispatcher = new EventDispatcher($this->composer, $this->io); + $dispatcher = $this->composer->getEventDispatcher(); $dispatcher->dispatch(self::PRE_DRUPAL_SCAFFOLD_CMD); // Fetch the list of file mappings from each allowed package and normalize diff --git a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ComposerHookTest.php b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ComposerHookTest.php index 1b2099f2e3a7791867ad3d053ede5dad75ba479d..dda93939b669b31695730f2a0ab6fba70fe70dab 100644 --- a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ComposerHookTest.php +++ b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ComposerHookTest.php @@ -148,4 +148,15 @@ public function testScaffoldMessagesDoNotPrintTwice() { $this->assertStringNotContainsString('- Copy [web-root]/update.php from assets/update.php', $stdout); } + /** + * Tests to see if scaffold events are dispatched and picked up by the plugin. + */ + public function testScaffoldEvents(): void { + $topLevelProjectDir = 'scaffold-events-fixture'; + $sut = $this->fixturesDir . '/' . $topLevelProjectDir; + $output = $this->mustExec("composer install --no-ansi", $sut); + $this->assertStringContainsString('Hello preDrupalScaffoldCmd', $output); + $this->assertStringContainsString('Hello postDrupalScaffoldCmd', $output); + } + } diff --git a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-plugin-implements-scaffold-events/composer.json b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-plugin-implements-scaffold-events/composer.json new file mode 100644 index 0000000000000000000000000000000000000000..41a60f74c4637dad10b886ffe6abc05167bd09b7 --- /dev/null +++ b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-plugin-implements-scaffold-events/composer.json @@ -0,0 +1,17 @@ +{ + "name": "fixtures/composer-plugin-implements-scaffold-events", + "type": "composer-plugin", + "require": { + "php": ">=8.2", + "composer-plugin-api": "^2", + "drupal/core-composer-scaffold": "*" + }, + "autoload": { + "psr-4": { + "Drupal\\Tests\\fixture\\Composer\\Plugin\\": "src" + } + }, + "extra": { + "class": "Drupal\\Tests\\fixture\\Composer\\Plugin\\ComposerPluginImplementsScaffoldEvents" + } +} diff --git a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-plugin-implements-scaffold-events/src/ComposerPluginImplementsScaffoldEvents.php b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-plugin-implements-scaffold-events/src/ComposerPluginImplementsScaffoldEvents.php new file mode 100644 index 0000000000000000000000000000000000000000..63b785fcf1b3d9fd96dc29b02c0edec900da4ac3 --- /dev/null +++ b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-plugin-implements-scaffold-events/src/ComposerPluginImplementsScaffoldEvents.php @@ -0,0 +1,64 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\Tests\fixture\Composer\Plugin; + +use Composer\EventDispatcher\Event; +use Composer\EventDispatcher\EventSubscriberInterface; +use Composer\Plugin\PluginInterface; +use Composer\Composer; +use Composer\IO\IOInterface; +use Drupal\Composer\Plugin\Scaffold\Handler; + +/** + * A fixture composer plugin implement Drupal scaffold events. + */ +class ComposerPluginImplementsScaffoldEvents implements PluginInterface, EventSubscriberInterface { + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents(): array { + return [ + Handler::PRE_DRUPAL_SCAFFOLD_CMD => 'preDrupalScaffoldCmd', + Handler::POST_DRUPAL_SCAFFOLD_CMD => 'postDrupalScaffoldCmd', + ]; + } + + /** + * Implements pre Drupal scaffold cmd. + */ + public static function preDrupalScaffoldCmd(Event $event): void { + print 'Hello preDrupalScaffoldCmd' . PHP_EOL; + } + + /** + * Implements post Drupal scaffold cmd. + */ + public static function postDrupalScaffoldCmd(Event $event): void { + print 'Hello postDrupalScaffoldCmd' . PHP_EOL; + } + + /** + * {@inheritdoc} + */ + public function activate(Composer $composer, IOInterface $io) { + + } + + /** + * {@inheritdoc} + */ + public function deactivate(Composer $composer, IOInterface $io) { + + } + + /** + * {@inheritdoc} + */ + public function uninstall(Composer $composer, IOInterface $io) { + + } + +} diff --git a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/scaffold-events-fixture/composer.json.tmpl b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/scaffold-events-fixture/composer.json.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..18e5c3149ef411b31eac37f4323d19b9af251264 --- /dev/null +++ b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/scaffold-events-fixture/composer.json.tmpl @@ -0,0 +1,44 @@ +{ + "name": "fixtures/drupal-drupal", + "type": "project", + "minimum-stability": "dev", + "prefer-stable": true, + "repositories": { + "packagist.org": false, + "composer-scaffold": { + "type": "path", + "url": "__PROJECT_ROOT__", + "options": { + "symlink": true + } + }, + "fixtures/composer-plugin-implements-scaffold-events": { + "type": "path", + "url": "../composer-plugin-implements-scaffold-events", + "options": { + "symlink": true + } + } + }, + "require": { + "drupal/core-composer-scaffold": "*", + "fixtures/composer-plugin-implements-scaffold-events": "*" + }, + "extra": { + "drupal-scaffold": { + "allowed-packages": [ + "fixtures/composer-plugin-implements-scaffold-events" + ], + "locations": { + "web-root": "./" + }, + "symlink": __SYMLINK__ + } + }, + "config": { + "allow-plugins": { + "drupal/core-composer-scaffold": true, + "fixtures/composer-plugin-implements-scaffold-events": true + } + } +}