From 211c874b93b1a24a65ad591380e7e6ce859a130b Mon Sep 17 00:00:00 2001 From: Guillaume ZITTA Date: Mon, 13 Feb 2017 14:00:48 +0100 Subject: [PATCH] split into 2 extract methods --- src/Composer/Downloader/ZipDownloader.php | 85 +++++++++++++++-------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/src/Composer/Downloader/ZipDownloader.php b/src/Composer/Downloader/ZipDownloader.php index b84f0d836..00dd61a2b 100644 --- a/src/Composer/Downloader/ZipDownloader.php +++ b/src/Composer/Downloader/ZipDownloader.php @@ -59,7 +59,59 @@ class ZipDownloader extends ArchiveDownloader return parent::download($package, $path, $output); } - /* + /** + * extract $file to $path with "unzip" command + * + * @param string $file File to extract + * @param string $path Path where to extract file + * @return bool True if succeed + */ + protected function extractWithUnzip($file, $path) + { + $processError = null; + $command = 'unzip -qq '.ProcessExecutor::escape($file).' -d '.ProcessExecutor::escape($path); + if (!Platform::isWindows()) { + $command .= ' && chmod -R u+w ' . ProcessExecutor::escape($path); + } + + try { + if (0 === $this->process->execute($command, $ignoredOutput)) { + return TRUE; + } + + $processError = 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput(); + } catch (\Exception $e) { + $processError = 'Failed to execute ' . $command . "\n\n" . $e->getMessage(); + } + + throw new \RuntimeException($processError); + } + + /** + * extract $file to $path with ZipArchive + * + * @param string $file File to extract + * @param string $path Path where to extract file + * @return bool True if succeed + */ + protected function extractWithZipArchive($file, $path) + { + $zipArchive = new ZipArchive(); + + if (true !== ($retval = $zipArchive->open($file))) { + throw new \UnexpectedValueException(rtrim($this->getErrorMessage($retval, $file)."\n"), $retval); + } + + if (true !== $zipArchive->extractTo($path)) { + throw new \RuntimeException(rtrim("There was an error extracting the ZIP file, it is either corrupted or using an invalid format.\n")); + } + + $zipArchive->close(); + + return TRUE; + } + + /** * extract $file to $path * * @param string $file File to extract @@ -67,38 +119,13 @@ class ZipDownloader extends ArchiveDownloader */ protected function extract($file, $path) { - $processError = null; - if (self::$hasSystemUnzip && !(class_exists('ZipArchive') && Platform::isWindows())) { - $command = 'unzip -qq '.ProcessExecutor::escape($file).' -d '.ProcessExecutor::escape($path); - if (!Platform::isWindows()) { - $command .= ' && chmod -R u+w ' . ProcessExecutor::escape($path); + if ( $this->extractWithUnzip($file, $path) ) { + return; } - - try { - if (0 === $this->process->execute($command, $ignoredOutput)) { - return; - } - - $processError = 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput(); - } catch (\Exception $e) { - $processError = 'Failed to execute ' . $command . "\n\n" . $e->getMessage(); - } - - throw new \RuntimeException($processError); } - $zipArchive = new ZipArchive(); - - if (true !== ($retval = $zipArchive->open($file))) { - throw new \UnexpectedValueException(rtrim($this->getErrorMessage($retval, $file)."\n".$processError), $retval); - } - - if (true !== $zipArchive->extractTo($path)) { - throw new \RuntimeException(rtrim("There was an error extracting the ZIP file, it is either corrupted or using an invalid format.\n".$processError)); - } - - $zipArchive->close(); + $this->extractWithZipArchive($file, $path); } /**