Sfoglia il codice sorgente

Change dependency processing for update with whitelisted packages
By default dependencies of white listed packages are no longer installed automaticaly.
To Install dependencies of whitelisted packages use --with-dependencies.
- rework after review comments
- precise documentation of option
- add missing punctuation marks

Phillip Look 11 anni fa
parent
commit
07a7284ffc

+ 3 - 1
doc/03-cli.md

@@ -122,7 +122,9 @@ You can also use wildcards to update a bunch of packages at once:
   autoloader. This is recommended especially for production, but can take
   a bit of time to run so it is currently not done by default.
 * **--lock:** Only updates the lock file hash to suppress warning about the
-  lock file being out of date
+  lock file being out of date.
+* **--with-dependencies** Add also all dependencies of whitelisted packages to the whitelist.
+  So all packages with their dependencies are updated recursively.
 
 ## require
 

+ 3 - 1
src/Composer/Command/UpdateCommand.php

@@ -43,8 +43,9 @@ class UpdateCommand extends Command
                 new InputOption('no-custom-installers', null, InputOption::VALUE_NONE, 'DEPRECATED: Use no-plugins instead.'),
                 new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.'),
                 new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'),
+                new InputOption('with-dependencies', null, InputOption::VALUE_NONE, 'Add also all dependencies of whitelisted packages to the whitelist.'),
                 new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'),
-                new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump')
+                new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump.')
             ))
             ->setHelp(<<<EOT
 The <info>update</info> command reads the composer.json file from the
@@ -107,6 +108,7 @@ EOT
             ->setOptimizeAutoloader($input->getOption('optimize-autoloader'))
             ->setUpdate(true)
             ->setUpdateWhitelist($input->getOption('lock') ? array('lock') : $input->getArgument('packages'))
+            ->setWhitelistDependencies($input->getOption('with-dependencies'))
         ;
 
         if ($input->getOption('no-plugins')) {

+ 18 - 0
src/Composer/Installer.php

@@ -106,6 +106,7 @@ class Installer
     protected $update = false;
     protected $runScripts = true;
     protected $updateWhitelist = null;
+    protected $whitelistDependencies = false;
 
     /**
      * @var array
@@ -851,6 +852,10 @@ class Installer
                 $seen[$package->getId()] = true;
                 $this->updateWhitelist[$package->getName()] = true;
 
+                if (!$this->whitelistDependencies) {
+                    continue;
+                }
+
                 $requires = $package->getRequires();
 
                 foreach ($requires as $require) {
@@ -1051,6 +1056,19 @@ class Installer
         return $this;
     }
 
+    /**
+     * Should dependencies of whitelisted packages be updated recursively?
+     *
+     * @param  boolean $updateDependencies
+     * @return Installer
+     */
+    public function setWhitelistDependencies($updateDependencies = true)
+    {
+        $this->whitelistDependencies = (boolean) $updateDependencies;
+
+        return $this;
+    }
+
     /**
      * Disables plugins.
      *

+ 2 - 2
tests/Composer/Test/Fixtures/installer/update-whitelist-locked-require.test

@@ -1,5 +1,5 @@
 --TEST--
-Update with a package whitelist only updates those packages and their dependencies if they are not present in composer.json
+Update with a package whitelist only updates those packages if they are not present in composer.json
 --COMPOSER--
 {
     "repositories": [
@@ -30,7 +30,7 @@ Update with a package whitelist only updates those packages and their dependenci
     { "name": "fixed-sub-dependency", "version": "1.0.0" }
 ]
 --RUN--
-update whitelisted
+update whitelisted dependency
 --EXPECT--
 Updating dependency (1.0.0) to dependency (1.1.0)
 Updating whitelisted (1.0.0) to whitelisted (1.1.0)

+ 40 - 0
tests/Composer/Test/Fixtures/installer/update-whitelist-with-dependencies.test

@@ -0,0 +1,40 @@
+--TEST--
+Update with a package whitelist only updates those packages and their dependencies listed as command arguments
+--COMPOSER--
+{
+    "repositories": [
+        {
+            "type": "package",
+            "package": [
+                { "name": "fixed", "version": "1.1.0" },
+                { "name": "fixed", "version": "1.0.0" },
+                { "name": "whitelisted", "version": "1.1.0", "require": { "dependency": "1.1.0" } },
+                { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.0.0" } },
+                { "name": "dependency", "version": "1.1.0" },
+                { "name": "dependency", "version": "1.0.0" },
+                { "name": "unrelated", "version": "1.1.0", "require": { "unrelated-dependency": "1.*" }  },
+                { "name": "unrelated", "version": "1.0.0", "require": { "unrelated-dependency": "1.*" }  },
+                { "name": "unrelated-dependency", "version": "1.1.0" },
+                { "name": "unrelated-dependency", "version": "1.0.0" }
+            ]
+        }
+    ],
+    "require": {
+        "fixed": "1.*",
+        "whitelisted": "1.*",
+        "unrelated": "1.*"
+    }
+}
+--INSTALLED--
+[
+    { "name": "fixed", "version": "1.0.0" },
+    { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.0.0" } },
+    { "name": "dependency", "version": "1.0.0" },
+    { "name": "unrelated", "version": "1.0.0", "require": { "unrelated-dependency": "1.*" } },
+    { "name": "unrelated-dependency", "version": "1.0.0" }
+]
+--RUN--
+update whitelisted --with-dependencies
+--EXPECT--
+Updating dependency (1.0.0) to dependency (1.1.0)
+Updating whitelisted (1.0.0) to whitelisted (1.1.0)

+ 38 - 0
tests/Composer/Test/Fixtures/installer/update-whitelist-with-dependency-conflict.test

@@ -0,0 +1,38 @@
+--TEST--
+Update with a package whitelist only updates whitelisted packages if no dependency conflicts
+--COMPOSER--
+{
+    "repositories": [
+        {
+            "type": "package",
+            "package": [
+                { "name": "fixed", "version": "1.1.0" },
+                { "name": "fixed", "version": "1.0.0" },
+                { "name": "whitelisted", "version": "1.1.0", "require": { "dependency": "1.1.0" } },
+                { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.0.0" } },
+                { "name": "dependency", "version": "1.1.0" },
+                { "name": "dependency", "version": "1.0.0" },
+                { "name": "unrelated", "version": "1.1.0", "require": { "unrelated-dependency": "1.*" }  },
+                { "name": "unrelated", "version": "1.0.0", "require": { "unrelated-dependency": "1.*" }  },
+                { "name": "unrelated-dependency", "version": "1.1.0" },
+                { "name": "unrelated-dependency", "version": "1.0.0" }
+            ]
+        }
+    ],
+    "require": {
+        "fixed": "1.*",
+        "whitelisted": "1.*",
+        "unrelated": "1.*"
+    }
+}
+--INSTALLED--
+[
+    { "name": "fixed", "version": "1.0.0" },
+    { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.0.0" } },
+    { "name": "dependency", "version": "1.0.0" },
+    { "name": "unrelated", "version": "1.0.0", "require": { "unrelated-dependency": "1.*" } },
+    { "name": "unrelated-dependency", "version": "1.0.0" }
+]
+--RUN--
+update whitelisted
+--EXPECT--

+ 4 - 5
tests/Composer/Test/Fixtures/installer/update-whitelist.test

@@ -1,5 +1,5 @@
 --TEST--
-Update with a package whitelist only updates those packages and their dependencies listed as command arguments
+Update with a package whitelist only updates those packages listed as command arguments
 --COMPOSER--
 {
     "repositories": [
@@ -8,8 +8,8 @@ Update with a package whitelist only updates those packages and their dependenci
             "package": [
                 { "name": "fixed", "version": "1.1.0" },
                 { "name": "fixed", "version": "1.0.0" },
-                { "name": "whitelisted", "version": "1.1.0", "require": { "dependency": "1.1.0" } },
-                { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.0.0" } },
+                { "name": "whitelisted", "version": "1.1.0", "require": { "dependency": "1.*" } },
+                { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.*" } },
                 { "name": "dependency", "version": "1.1.0" },
                 { "name": "dependency", "version": "1.0.0" },
                 { "name": "unrelated", "version": "1.1.0", "require": { "unrelated-dependency": "1.*" }  },
@@ -28,7 +28,7 @@ Update with a package whitelist only updates those packages and their dependenci
 --INSTALLED--
 [
     { "name": "fixed", "version": "1.0.0" },
-    { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.0.0" } },
+    { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.*" } },
     { "name": "dependency", "version": "1.0.0" },
     { "name": "unrelated", "version": "1.0.0", "require": { "unrelated-dependency": "1.*" } },
     { "name": "unrelated-dependency", "version": "1.0.0" }
@@ -36,5 +36,4 @@ Update with a package whitelist only updates those packages and their dependenci
 --RUN--
 update whitelisted
 --EXPECT--
-Updating dependency (1.0.0) to dependency (1.1.0)
 Updating whitelisted (1.0.0) to whitelisted (1.1.0)

+ 2 - 1
tests/Composer/Test/InstallerTest.php

@@ -214,7 +214,8 @@ class InstallerTest extends TestCase
                 ->setDevMode($input->getOption('dev'))
                 ->setUpdate(true)
                 ->setDryRun($input->getOption('dry-run'))
-                ->setUpdateWhitelist($input->getArgument('packages'));
+                ->setUpdateWhitelist($input->getArgument('packages'))
+                ->setWhitelistDependencies($input->getOption('with-dependencies'));
 
             return $installer->run() ? 0 : 1;
         });