diff --git a/automatic_updates.services.yml b/automatic_updates.services.yml index 6e06bb184986b93e107c70d3005e226d88e60d3e..ba461c980c55784a45dfbd30f29ef480d33052a7 100644 --- a/automatic_updates.services.yml +++ b/automatic_updates.services.yml @@ -105,8 +105,6 @@ services: - { name: event_subscriber } automatic_updates.validator.scaffold_file_permissions: class: Drupal\automatic_updates\Validator\ScaffoldFilePermissionsValidator - arguments: - - '@package_manager.path_locator' tags: - { name: event_subscriber } automatic_updates.validator.cron_server: diff --git a/src/Validator/ScaffoldFilePermissionsValidator.php b/src/Validator/ScaffoldFilePermissionsValidator.php index ab7b68d2d646fe04703b4ad3a8c989056a51da94..72f7957d13824c7b1b05e84c4a642d72f018b014 100644 --- a/src/Validator/ScaffoldFilePermissionsValidator.php +++ b/src/Validator/ScaffoldFilePermissionsValidator.php @@ -6,7 +6,7 @@ namespace Drupal\automatic_updates\Validator; use Drupal\automatic_updates\Updater; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\package_manager\ComposerUtility; +use Drupal\package_manager\ComposerInspector; use Drupal\package_manager\Event\PreApplyEvent; use Drupal\package_manager\Event\PreCreateEvent; use Drupal\package_manager\Event\PreOperationStageEvent; @@ -27,13 +27,17 @@ final class ScaffoldFilePermissionsValidator implements EventSubscriberInterface use StringTranslationTrait; /** - * Constructs a SiteDirectoryPermissionsValidator object. + * Constructs a ScaffoldFilePermissionsValidator object. * + * @param \Drupal\package_manager\ComposerInspector $composerInspector + * The Composer inspector service. * @param \Drupal\package_manager\PathLocator $pathLocator * The path locator service. */ - public function __construct(protected PathLocator $pathLocator) { - } + public function __construct( + private ComposerInspector $composerInspector, + private PathLocator $pathLocator, + ) {} /** * Validates that scaffold files have the appropriate permissions. @@ -53,15 +57,14 @@ final class ScaffoldFilePermissionsValidator implements EventSubscriberInterface } $site_dir .= '/sites/default'; - $stage = $event->stage; - $active_scaffold_files = $this->getDefaultSiteFilesFromScaffold($stage->getActiveComposer()); + $active_scaffold_files = $this->getDefaultSiteFilesFromScaffold($this->pathLocator->getProjectRoot()); // If the active directory and stage directory have different files // scaffolded into `sites/default` (i.e., files were added, renamed, or // deleted), the site directory itself must be writable for the changes to // be applied. if ($event instanceof PreApplyEvent) { - $staged_scaffold_files = $this->getDefaultSiteFilesFromScaffold($stage->getStageComposer()); + $staged_scaffold_files = $this->getDefaultSiteFilesFromScaffold($event->stage->getStageDirectory()); if ($active_scaffold_files !== $staged_scaffold_files) { $paths[] = $site_dir; @@ -88,8 +91,8 @@ final class ScaffoldFilePermissionsValidator implements EventSubscriberInterface /** * Returns the list of file names scaffolded into `sites/default`. * - * @param \Drupal\package_manager\ComposerUtility $composer - * A Composer utility helper for a directory. + * @param string $working_dir + * The directory in which to run Composer. * * @return string[] * The names of files that are scaffolded into `sites/default`, stripped @@ -99,13 +102,12 @@ final class ScaffoldFilePermissionsValidator implements EventSubscriberInterface * directory doesn't have the `drupal/core` package installed, the returned * array will be empty. */ - protected function getDefaultSiteFilesFromScaffold(ComposerUtility $composer): array { - $installed = $composer->getInstalledPackages(); + protected function getDefaultSiteFilesFromScaffold(string $working_dir): array { + $installed = $this->composerInspector->getInstalledPackagesList($working_dir); - if (array_key_exists('drupal/core', $installed)) { - $extra = $installed['drupal/core']->getExtra(); + if (isset($installed['drupal/core'])) { // We expect Drupal core to provide a list of scaffold files. - $files = $extra['drupal-scaffold']['file-mapping']; + $files = (array) json_decode($this->composerInspector->getConfig('extra.drupal-scaffold.file-mapping', $installed['drupal/core']->path . '/composer.json')); } else { $files = [];