ソースを参照

Fix edge case where one adds a target-dir on a package that didnt have one before, refs #2279

Jordi Boggiano 11 年 前
コミット
807600b255

+ 9 - 1
src/Composer/Installer/LibraryInstaller.php

@@ -161,7 +161,15 @@ class LibraryInstaller implements InstallerInterface
         $initialDownloadPath = $this->getInstallPath($initial);
         $targetDownloadPath = $this->getInstallPath($target);
         if ($targetDownloadPath !== $initialDownloadPath) {
-            $this->filesystem->copyThenRemove($initialDownloadPath, $targetDownloadPath);
+            // if the target is part of the initial dir, we force a remove + install
+            // to avoid the rename wiping the target dir as part of the initial dir cleanup
+            if (strpos($initialDownloadPath, $targetDownloadPath) === 0) {
+                $this->removeCode($initial);
+                $this->installCode($target);
+                return;
+            }
+
+            $this->filesystem->rename($initialDownloadPath, $targetDownloadPath);
         }
         $this->downloadManager->update($initial, $target, $targetDownloadPath);
     }

+ 1 - 1
tests/Composer/Test/Installer/LibraryInstallerTest.php

@@ -135,7 +135,7 @@ class LibraryInstallerTest extends TestCase
           ->getMock();
         $filesystem
           ->expects($this->once())
-          ->method('copyThenRemove')
+          ->method('rename')
           ->with($this->vendorDir.'/package1', $this->vendorDir.'/package1/newtarget');
 
         $initial = $this->createPackageMock();