Browse Source

fixes rename bug (closes #900)

Johannes M. Schmitt 12 years ago
parent
commit
2a6b12fb65
2 changed files with 17 additions and 2 deletions
  1. 2 2
      src/Composer/Downloader/ArchiveDownloader.php
  2. 15 0
      src/Composer/Util/Filesystem.php

+ 2 - 2
src/Composer/Downloader/ArchiveDownloader.php

@@ -50,12 +50,12 @@ abstract class ArchiveDownloader extends FileDownloader
                 // Rename the content directory to avoid error when moving up
                 // a child folder with the same name
                 $temporaryName = md5(time().rand());
-                rename($contentDir, $temporaryName);
+                $this->filesystem->rename($contentDir, $temporaryName);
                 $contentDir = $temporaryName;
 
                 foreach (array_merge(glob($contentDir . '/.*'), glob($contentDir . '/*')) as $file) {
                     if (trim(basename($file), '.')) {
-                        rename($file, $path . '/' . basename($file));
+                        $this->filesystem->rename($file, $path . '/' . basename($file));
                     }
                 }
                 rmdir($contentDir);

+ 15 - 0
src/Composer/Util/Filesystem.php

@@ -14,6 +14,7 @@ namespace Composer\Util;
 
 /**
  * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
  */
 class Filesystem
 {
@@ -53,6 +54,20 @@ class Filesystem
         }
     }
 
+    public function rename($source, $target)
+    {
+        if (defined('PHP_WINDOWS_VERSION_BUILD') || ! function_exists('exec')) {
+            rename($source, $target);
+
+            return;
+        }
+
+        exec('mv '.escapeshellarg($source).' '.escapeshellarg($target), $output, $returnCode);
+        if (0 !== $returnCode) {
+            throw new \RuntimeException(sprintf('Could not rename "%s" to "%s".', $source, $target));
+        }
+    }
+
     /**
      * Returns the shortest path from $from to $to
      *