Browse Source

Change strategy for ZipDownloader

Try to use unzip command-line before ZipArchive as this one does not correctly handle file permissions whereas unzip does.
Romain Neutron 12 years ago
parent
commit
72d4bea89e
1 changed files with 17 additions and 11 deletions
  1. 17 11
      src/Composer/Downloader/ZipDownloader.php

+ 17 - 11
src/Composer/Downloader/ZipDownloader.php

@@ -33,6 +33,19 @@ class ZipDownloader extends ArchiveDownloader
 
     protected function extract($file, $path)
     {
+        $processError = null;
+
+        // try to use unzip on *nix
+        if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
+
+            $command = 'unzip '.escapeshellarg($file).' -d '.escapeshellarg($path);
+            if (0 === $this->process->execute($command, $ignoredOutput)) {
+                return;
+            }
+
+            $processError = 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput();
+        }
+
         if (!class_exists('ZipArchive')) {
             // php.ini path is added to the error message to help users find the correct file
             $iniPath = php_ini_loaded_file();
@@ -43,19 +56,12 @@ class ZipDownloader extends ArchiveDownloader
                 $iniMessage = 'A php.ini file does not exist. You will have to create one.';
             }
 
-            $error = "You need the zip extension enabled to use the ZipDownloader.\n".
-                $iniMessage;
+            $error = "Could not decompress the archive, enable the PHP zip extension or install unzip.\n".
+                $iniMessage . "\n" . $processError;
 
-            // try to use unzip on *nix
             if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
-                $command = 'unzip '.escapeshellarg($file).' -d '.escapeshellarg($path);
-                if (0 === $this->process->execute($command, $ignoredOutput)) {
-                    return;
-                }
-
-                $error = "Could not decompress the archive, enable the PHP zip extension or install unzip.\n".
-                    $iniMessage . "\n" .
-                    'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput();
+                $error = "You need the zip extension enabled to use the ZipDownloader.\n".
+                    $iniMessage;
             }
 
             throw new \RuntimeException($error);