From b7ef35a5eeaa704f52ba171247b46b639502453f Mon Sep 17 00:00:00 2001 From: Tobbe Date: Sun, 23 Jul 2017 21:10:36 +0200 Subject: [PATCH 1/4] Make it possible to set preserve-paths in dependency extras. --- src/PluginWrapper.php | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/PluginWrapper.php b/src/PluginWrapper.php index 3d387db..a38e341 100644 --- a/src/PluginWrapper.php +++ b/src/PluginWrapper.php @@ -64,7 +64,7 @@ public function prePackage(PackageEvent $event) $preserver = new PathPreserver( $paths, - $this->getPreservePaths(), + $this->getPreservePaths($packages), $this->composer->getConfig()->get('cache-dir'), $this->filesystem, $this->io @@ -158,13 +158,46 @@ protected function getUniqueNameFromPackages(array $packages) } /** - * Get preserve paths from root configuration. + * Get preserve paths. + * + * @param \Composer\Package\PackageInterface[] $packages * * @return string[] */ - protected function getPreservePaths() + protected function getPreservePaths($packages) { $extra = $this->composer->getPackage()->getExtra(); + $paths = array(); + + /* + * Root package allows that preserve paths from dependencies are also evaluated. + * Negative check as this feature is developed for situations where the root package + * can not be adjusted, but paths must be preserved. + */ + if(!isset($extra['preserve-paths-ignore-dependencies']) || !$extra['preserve-paths-ignore-dependencies']) { + foreach ($packages as $package) { + $paths = array_merge($paths, $this->extractPathsFromExtra($package->getExtra(), false)); + } + } + + $paths = array_unique(array_merge($paths, $this->extractPathsFromExtra($extra))); + + return $this->absolutePaths($paths); + } + + /** + * Extract the paths from the extra data. + * + * @param array $extra + * @param boolean $root + * + * @return string[] + */ + protected function extractPathsFromExtra($extra, $root = true) { + // Package does not explicitly allow to preserve paths if used as dependency. + if(!$root && (!isset($extra['preserve-as-from-dependency']) || $extra['preserve-paths-as-dependency'] != true)) { + return array(); + } if (!isset($extra['preserve-paths'])) { $paths = array(); @@ -174,7 +207,7 @@ protected function getPreservePaths() $paths = array_values((array) $extra['preserve-paths']); } - return $this->absolutePaths($paths); + return $paths; } /** From 9e21b2c05fdc9da67079b91e0032e3b49526ae30 Mon Sep 17 00:00:00 2001 From: Tobbe Date: Sun, 23 Jul 2017 21:19:32 +0200 Subject: [PATCH 2/4] Update readme. --- README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 845c3e0..0927853 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Simply install the plugin with composer: `composer require drupal-composer/prese ## Configuration -For configuring the paths you need to set `preserve-paths` within the `extra` of your root `composer.json`. +For configuring the paths you need to set `preserve-paths` within the `extra` of your `composer.json`. ```json { @@ -31,6 +31,24 @@ For configuring the paths you need to set `preserve-paths` within the `extra` of } ``` +In case you need to set the `preserve-paths` option in a dependent package, you must also set `preserve-paths-as-dependency` in the `composer.json` of the dependency. + +```json +{ + "extra": { + "preserve-paths-as-dependency": true, + "preserve-paths": [ + "web/sites/all/modules/contrib", + "web/sites/all/themes/contrib", + "web/sites/all/libraries", + "web/sites/all/drush" + ] + } +} +``` + +You can disable this setting in your root `composer.json` by setting `preserve-paths-ignore-dependencies` to true. + ## Example An example composer.json using [composer/installers](https://packagist.org/packages/composer/installers): From b70aa4bcb0026a2653c27dd83d0b2fbf44ebcb4b Mon Sep 17 00:00:00 2001 From: Tobbe Date: Sun, 23 Jul 2017 23:02:02 +0200 Subject: [PATCH 3/4] Fix issues with code styling. --- src/PluginWrapper.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/PluginWrapper.php b/src/PluginWrapper.php index a38e341..46dbfee 100644 --- a/src/PluginWrapper.php +++ b/src/PluginWrapper.php @@ -174,7 +174,7 @@ protected function getPreservePaths($packages) * Negative check as this feature is developed for situations where the root package * can not be adjusted, but paths must be preserved. */ - if(!isset($extra['preserve-paths-ignore-dependencies']) || !$extra['preserve-paths-ignore-dependencies']) { + if (!isset($extra['preserve-paths-ignore-dependencies']) || !$extra['preserve-paths-ignore-dependencies']) { foreach ($packages as $package) { $paths = array_merge($paths, $this->extractPathsFromExtra($package->getExtra(), false)); } @@ -193,9 +193,10 @@ protected function getPreservePaths($packages) * * @return string[] */ - protected function extractPathsFromExtra($extra, $root = true) { + protected function extractPathsFromExtra($extra, $root = true) + { // Package does not explicitly allow to preserve paths if used as dependency. - if(!$root && (!isset($extra['preserve-as-from-dependency']) || $extra['preserve-paths-as-dependency'] != true)) { + if (!$root && (!isset($extra['preserve-as-from-dependency']) || $extra['preserve-paths-as-dependency'] != true)) { return array(); } From 2c5b91a2505a7bdf3ccd65153016db58ee66ea53 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 22 Feb 2018 21:54:46 +0100 Subject: [PATCH 4/4] Fix typo --- src/PluginWrapper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PluginWrapper.php b/src/PluginWrapper.php index 46dbfee..db5a7c9 100644 --- a/src/PluginWrapper.php +++ b/src/PluginWrapper.php @@ -196,7 +196,7 @@ protected function getPreservePaths($packages) protected function extractPathsFromExtra($extra, $root = true) { // Package does not explicitly allow to preserve paths if used as dependency. - if (!$root && (!isset($extra['preserve-as-from-dependency']) || $extra['preserve-paths-as-dependency'] != true)) { + if (!$root && (!isset($extra['preserve-paths-as-dependency']) || $extra['preserve-paths-as-dependency'] != true)) { return array(); }