diff --git a/src/Composer/Downloader/ZipDownloader.php b/src/Composer/Downloader/ZipDownloader.php index 73e5d61b0..b3685268b 100644 --- a/src/Composer/Downloader/ZipDownloader.php +++ b/src/Composer/Downloader/ZipDownloader.php @@ -29,10 +29,11 @@ use ZipArchive; */ class ZipDownloader extends ArchiveDownloader { + private static $hasSystemUnzip; + private static $hasZipArchive; + private static $isWindows; + protected $process; - public static $hasSystemUnzip; - public static $hasZipArchive; - public static $isWindows; private $zipArchiveObject; public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null) @@ -80,12 +81,12 @@ class ZipDownloader extends ArchiveDownloader */ protected function extractWithSystemUnzip($file, $path, $isLastChance) { - if (! self::$hasZipArchive) { + if (!self::$hasZipArchive) { // Force Exception throwing if the Other alternative is not available $isLastChance = true; } - if (! self::$hasSystemUnzip && ! $isLastChance) { + if (!self::$hasSystemUnzip && !$isLastChance) { // This was call as the favorite extract way, but is not available // We switch to the alternative return $this->extractWithZipArchive($file, $path, true); @@ -107,17 +108,14 @@ class ZipDownloader extends ArchiveDownloader $processError = $e; } - if (! self::$hasZipArchive) { - $isLastChance = true; - } - if ($isLastChance) { throw $processError; - } else { - $this->io->write($processError->getMessage()); - $this->io->write('Unzip with unzip command failed, falling back to ZipArchive class'); - return $this->extractWithZipArchive($file, $path, true); } + + $this->io->writeError(' '.$processError->getMessage()); + $this->io->writeError(' Unzip with unzip command failed, falling back to ZipArchive class'); + + return $this->extractWithZipArchive($file, $path, true); } /** @@ -130,12 +128,12 @@ class ZipDownloader extends ArchiveDownloader */ protected function extractWithZipArchive($file, $path, $isLastChance) { - if (! self::$hasSystemUnzip) { + if (!self::$hasSystemUnzip) { // Force Exception throwing if the Other alternative is not available $isLastChance = true; } - if (! self::$hasZipArchive && ! $isLastChance) { + if (!self::$hasZipArchive && !$isLastChance) { // This was call as the favorite extract way, but is not available // We switch to the alternative return $this->extractWithSystemUnzip($file, $path, true); @@ -150,10 +148,11 @@ class ZipDownloader extends ArchiveDownloader if (true === $extractResult) { $zipArchive->close(); + return true; - } else { - $processError = new \RuntimeException(rtrim("There was an error extracting the ZIP file, it is either corrupted or using an invalid format.\n")); } + + $processError = new \RuntimeException(rtrim("There was an error extracting the ZIP file, it is either corrupted or using an invalid format.\n")); } else { $processError = new \UnexpectedValueException(rtrim($this->getErrorMessage($retval, $file)."\n"), $retval); } @@ -163,11 +162,12 @@ class ZipDownloader extends ArchiveDownloader if ($isLastChance) { throw $processError; - } else { - $this->io->write($processError->getMessage()); - $this->io->write('Unzip with ZipArchive class failed, falling back to unzip command'); - return $this->extractWithSystemUnzip($file, $path, true); } + + $this->io->writeError(' '.$processError->getMessage()); + $this->io->writeError(' Unzip with ZipArchive class failed, falling back to unzip command'); + + return $this->extractWithSystemUnzip($file, $path, true); } /** diff --git a/tests/Composer/Test/Downloader/ZipDownloaderTest.php b/tests/Composer/Test/Downloader/ZipDownloaderTest.php index 4cadda847..00174d398 100644 --- a/tests/Composer/Test/Downloader/ZipDownloaderTest.php +++ b/tests/Composer/Test/Downloader/ZipDownloaderTest.php @@ -37,8 +37,8 @@ class ZipDownloaderTest extends TestCase { $fs = new Filesystem; $fs->removeDirectory($this->testDir); - ZipDownloader::$hasSystemUnzip = null; - ZipDownloader::$hasZipArchive = null; + $this->setPrivateProperty('hasSystemUnzip', null); + $this->setPrivateProperty('hasZipArchive', null); } public function setPrivateProperty($name, $value, $obj = null) @@ -95,7 +95,7 @@ class ZipDownloaderTest extends TestCase $downloader = new ZipDownloader($this->io, $this->config); - ZipDownloader::$hasSystemUnzip = false; + $this->setPrivateProperty('hasSystemUnzip', false); try { $downloader->download($packageMock, sys_get_temp_dir().'/composer-zip-test'); @@ -111,8 +111,8 @@ class ZipDownloaderTest extends TestCase */ public function testZipArchiveOnlyFailed() { - MockedZipDownloader::$hasSystemUnzip = false; - MockedZipDownloader::$hasZipArchive = true; + $this->setPrivateProperty('hasSystemUnzip', false); + $this->setPrivateProperty('hasZipArchive', true); $downloader = new MockedZipDownloader($this->io, $this->config); $zipArchive = $this->getMock('ZipArchive'); @@ -132,8 +132,8 @@ class ZipDownloaderTest extends TestCase */ public function testZipArchiveOnlyGood() { - MockedZipDownloader::$hasSystemUnzip = false; - MockedZipDownloader::$hasZipArchive = true; + $this->setPrivateProperty('hasSystemUnzip', false); + $this->setPrivateProperty('hasZipArchive', true); $downloader = new MockedZipDownloader($this->io, $this->config); $zipArchive = $this->getMock('ZipArchive'); @@ -154,8 +154,8 @@ class ZipDownloaderTest extends TestCase */ public function testSystemUnzipOnlyFailed() { - MockedZipDownloader::$hasSystemUnzip = true; - MockedZipDownloader::$hasZipArchive = false; + $this->setPrivateProperty('hasSystemUnzip', true); + $this->setPrivateProperty('hasZipArchive', false); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $processExecutor->expects($this->at(0)) ->method('execute') @@ -167,8 +167,8 @@ class ZipDownloaderTest extends TestCase public function testSystemUnzipOnlyGood() { - MockedZipDownloader::$hasSystemUnzip = true; - MockedZipDownloader::$hasZipArchive = false; + $this->setPrivateProperty('hasSystemUnzip', true); + $this->setPrivateProperty('hasZipArchive', false); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $processExecutor->expects($this->at(0)) ->method('execute') @@ -180,9 +180,9 @@ class ZipDownloaderTest extends TestCase public function testNonWindowsFallbackGood() { - MockedZipDownloader::$isWindows = false; - MockedZipDownloader::$hasSystemUnzip = true; - MockedZipDownloader::$hasZipArchive = true; + $this->setPrivateProperty('isWindows', false); + $this->setPrivateProperty('hasSystemUnzip', true); + $this->setPrivateProperty('hasZipArchive', true); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $processExecutor->expects($this->at(0)) @@ -208,9 +208,9 @@ class ZipDownloaderTest extends TestCase */ public function testNonWindowsFallbackFailed() { - MockedZipDownloader::$isWindows = false; - MockedZipDownloader::$hasSystemUnzip = true; - MockedZipDownloader::$hasZipArchive = true; + $this->setPrivateProperty('isWindows', false); + $this->setPrivateProperty('hasSystemUnzip', true); + $this->setPrivateProperty('hasZipArchive', true); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $processExecutor->expects($this->at(0)) @@ -232,9 +232,9 @@ class ZipDownloaderTest extends TestCase public function testWindowsFallbackGood() { - MockedZipDownloader::$isWindows = true; - MockedZipDownloader::$hasSystemUnzip = true; - MockedZipDownloader::$hasZipArchive = true; + $this->setPrivateProperty('isWindows', true); + $this->setPrivateProperty('hasSystemUnzip', true); + $this->setPrivateProperty('hasZipArchive', true); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $processExecutor->expects($this->atLeastOnce()) @@ -260,9 +260,9 @@ class ZipDownloaderTest extends TestCase */ public function testWindowsFallbackFailed() { - MockedZipDownloader::$isWindows = true; - MockedZipDownloader::$hasSystemUnzip = true; - MockedZipDownloader::$hasZipArchive = true; + $this->setPrivateProperty('isWindows', true); + $this->setPrivateProperty('hasSystemUnzip', true); + $this->setPrivateProperty('hasZipArchive', true); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $processExecutor->expects($this->atLeastOnce())