Issue #3080205 by greg.1.anderson: Implicitly allow drupal/core and legacy scaffold projects to scaffold files

merge-requests/55/head
webchick 2019-09-20 08:52:52 -07:00
parent e70758877b
commit 6340ef5877
2 changed files with 31 additions and 4 deletions

View File

@ -62,6 +62,10 @@ class AllowedPackages implements PostPackageEventListenerInterface {
/**
* Gets a list of all packages that are allowed to copy scaffold files.
*
* We will implicitly allow the projects 'drupal/legacy-scaffold-assets'
* and 'drupal/core' to scaffold files, if they are present. Any other
* project must be explicitly whitelisted in the top-level composer.json
* file in order to be allowed to override scaffold files.
* Configuration for packages specified later will override configuration
* specified by packages listed earlier. In other words, the last listed
* package has the highest priority. The root package will always be returned
@ -71,12 +75,12 @@ class AllowedPackages implements PostPackageEventListenerInterface {
* An array of allowed Composer packages.
*/
public function getAllowedPackages() {
$options = $this->manageOptions->getOptions();
$allowed_packages = $this->recursiveGetAllowedPackages($options->allowedPackages());
$top_level_packages = $this->getTopLevelAllowedPackages();
$allowed_packages = $this->recursiveGetAllowedPackages($top_level_packages);
// If the root package defines any file mappings, then implicitly add it
// to the list of allowed packages. Add it at the end so that it overrides
// all the preceding packages.
if ($options->hasFileMapping()) {
if ($this->manageOptions->getOptions()->hasFileMapping()) {
$root_package = $this->composer->getPackage();
unset($allowed_packages[$root_package->getName()]);
$allowed_packages[$root_package->getName()] = $root_package;
@ -97,6 +101,26 @@ class AllowedPackages implements PostPackageEventListenerInterface {
}
}
/**
* Gets all packages that are allowed in the top-level composer.json.
*
* We will implicitly allow the projects 'drupal/legacy-scaffold-assets'
* and 'drupal/core' to scaffold files, if they are present. Any other
* project must be explicitly whitelisted in the top-level composer.json
* file in order to be allowed to override scaffold files.
*
* @return array
* An array of allowed Composer package names.
*/
protected function getTopLevelAllowedPackages() {
$implicit_packages = [
'drupal/legacy-scaffold-assets',
'drupal/core',
];
$top_level_packages = $this->manageOptions->getOptions()->allowedPackages();
return array_merge($implicit_packages, $top_level_packages);
}
/**
* Builds a name-to-package mapping from a list of package names.
*

View File

@ -224,7 +224,10 @@ class Handler {
if ($options->hasFileMapping()) {
return $this->createScaffoldOperations($package, $options->fileMapping());
}
if (!$options->hasAllowedPackages()) {
// Warn the user if they allow a package that does not have any scaffold
// files. We will ignore drupal/core, though, as it is implicitly allowed,
// but might not have scaffold files (version 8.7.x and earlier).
if (!$options->hasAllowedPackages() && ($package->getName() != 'drupal/core')) {
$this->io->writeError("The allowed package {$package->getName()} does not provide a file mapping for Composer Scaffold.");
}
return [];