浏览代码

Fixed update alias packages in dry-run mode

Martin Hasoň 12 年之前
父节点
当前提交
02f92e678f

+ 7 - 4
src/Composer/Installer.php

@@ -809,12 +809,15 @@ class Installer
      */
     private function mockLocalRepositories(RepositoryManager $rm)
     {
-        $packages = array_map(function ($p) {
-            return clone $p;
-        }, $rm->getLocalRepository()->getPackages());
+        $packages = array();
+        foreach ($rm->getLocalRepository()->getPackages() as $package) {
+            $packages[(string) $package] = clone $package;
+        }
         foreach ($packages as $key => $package) {
             if ($package instanceof AliasPackage) {
-                unset($packages[$key]);
+                $alias = (string) $package->getAliasOf();
+                $packages[$key] = new AliasPackage($packages[$alias], $package->getVersion(), $package->getPrettyVersion());
+                unset($packages[$alias]);
             }
         }
         $rm->setLocalRepository(

+ 40 - 0
tests/Composer/Test/Fixtures/installer/update-all-dry-run.test

@@ -0,0 +1,40 @@
+--TEST--
+Updates updateable packages in dry-run mode
+--COMPOSER--
+{
+    "repositories": [
+        {
+            "type": "package",
+            "package": [
+                { "name": "a/a", "version": "1.0.0" },
+                { "name": "a/a", "version": "1.0.1" },
+                { "name": "a/a", "version": "1.1.0" },
+
+                { "name": "a/b", "version": "1.0.0" },
+                { "name": "a/b", "version": "1.0.1" },
+                { "name": "a/b", "version": "2.0.0" },
+
+                { "name": "a/c", "version": "1.0.0" },
+                { "name": "a/c", "version": "2.0.0" }
+            ]
+        }
+    ],
+    "require": {
+        "a/a": "1.0.*",
+        "a/c": "1.*"
+    },
+    "require-dev": {
+        "a/b": "*"
+    }
+}
+--INSTALLED--
+[
+    { "name": "a/a", "version": "1.0.0" },
+    { "name": "a/c", "version": "1.0.0" },
+    { "name": "a/b", "version": "1.0.0" }
+]
+--RUN--
+update --dev --dry-run
+--EXPECT--
+Updating a/a (1.0.0) to a/a (1.0.1)
+Updating a/b (1.0.0) to a/b (2.0.0)

+ 44 - 0
tests/Composer/Test/Fixtures/installer/update-installed-alias-dry-run.test

@@ -0,0 +1,44 @@
+--TEST--
+Updates installed alias packages in dry-run mode
+--COMPOSER--
+{
+    "repositories": [
+        {
+            "type": "package",
+            "package": [
+                {
+                    "name": "a/a", "version": "dev-master",
+                    "require": { "b/b": "2.0.*" },
+                    "source": { "reference": "abcdef", "url": "", "type": "git" },
+                    "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }
+                },
+                {
+                    "name": "b/b", "version": "dev-master",
+                    "source": { "reference": "123456", "url": "", "type": "git" },
+                    "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }
+                }
+            ]
+        }
+    ],
+    "require": {
+        "a/a": "~1.0@dev",
+        "b/b": "@dev"
+    }
+}
+--INSTALLED--
+[
+    {
+        "name": "a/a", "version": "dev-master",
+        "require": { "b/b": "2.0.*" },
+        "source": { "reference": "abcdef", "url": "", "type": "git" },
+        "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }
+    },
+    {
+        "name": "b/b", "version": "dev-master",
+        "source": { "reference": "123456", "url": "", "type": "git" },
+        "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }
+    }
+]
+--RUN--
+update --dry-run
+--EXPECT--

+ 44 - 0
tests/Composer/Test/Fixtures/installer/update-installed-alias.test

@@ -0,0 +1,44 @@
+--TEST--
+Updates installed alias packages
+--COMPOSER--
+{
+    "repositories": [
+        {
+            "type": "package",
+            "package": [
+                {
+                    "name": "a/a", "version": "dev-master",
+                    "require": { "b/b": "2.0.*" },
+                    "source": { "reference": "abcdef", "url": "", "type": "git" },
+                    "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }
+                },
+                {
+                    "name": "b/b", "version": "dev-master",
+                    "source": { "reference": "123456", "url": "", "type": "git" },
+                    "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }
+                }
+            ]
+        }
+    ],
+    "require": {
+        "a/a": "~1.0@dev",
+        "b/b": "@dev"
+    }
+}
+--INSTALLED--
+[
+    {
+        "name": "a/a", "version": "dev-master",
+        "require": { "b/b": "2.0.*" },
+        "source": { "reference": "abcdef", "url": "", "type": "git" },
+        "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }
+    },
+    {
+        "name": "b/b", "version": "dev-master",
+        "source": { "reference": "123456", "url": "", "type": "git" },
+        "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }
+    }
+]
+--RUN--
+update
+--EXPECT--

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

@@ -200,7 +200,9 @@ class InstallerTest extends TestCase
 
         $application = new Application;
         $application->get('install')->setCode(function ($input, $output) use ($installer) {
-            $installer->setDevMode($input->getOption('dev'));
+            $installer
+                ->setDevMode($input->getOption('dev'))
+                ->setDryRun($input->getOption('dry-run'));
 
             return $installer->run() ? 0 : 1;
         });
@@ -209,6 +211,7 @@ class InstallerTest extends TestCase
             $installer
                 ->setDevMode($input->getOption('dev'))
                 ->setUpdate(true)
+                ->setDryRun($input->getOption('dry-run'))
                 ->setUpdateWhitelist($input->getArgument('packages'));
 
             return $installer->run() ? 0 : 1;