From 2fc0e9b8184a42974755fd57718ddb10daee63de Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Tue, 9 Apr 2024 08:27:02 +0100 Subject: [PATCH] Issue #3438034 by tannguyenhn, adwivedi008, alex.skrypnyk, alexpott: Fix Composer Scaffold plugin event listeners (cherry picked from commit f35f0419c73a5c8e6cd382f4bc144e16b600abe0) --- composer/Plugin/Scaffold/Handler.php | 3 +- .../Scaffold/Functional/ComposerHookTest.php | 11 ++++ .../composer.json | 17 +++++ ...ComposerPluginImplementsScaffoldEvents.php | 64 +++++++++++++++++++ .../composer.json.tmpl | 44 +++++++++++++ 5 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-plugin-implements-scaffold-events/composer.json create mode 100644 core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-plugin-implements-scaffold-events/src/ComposerPluginImplementsScaffoldEvents.php create mode 100644 core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/scaffold-events-fixture/composer.json.tmpl diff --git a/composer/Plugin/Scaffold/Handler.php b/composer/Plugin/Scaffold/Handler.php index 3e51f909a335..a3e9914bb394 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 1b2099f2e3a7..dda93939b669 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 000000000000..41a60f74c463 --- /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 000000000000..63b785fcf1b3 --- /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 000000000000..18e5c3149ef4 --- /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 + } + } +} -- GitLab