diff --git a/src/Composer/Downloader/ZipDownloader.php b/src/Composer/Downloader/ZipDownloader.php index 09c32ab8a..c4b5c7aa4 100644 --- a/src/Composer/Downloader/ZipDownloader.php +++ b/src/Composer/Downloader/ZipDownloader.php @@ -156,6 +156,8 @@ class ZipDownloader extends ArchiveDownloader } else { $processError = new \UnexpectedValueException(rtrim($this->getErrorMessage($retval, $file)."\n"), $retval); } + } catch (\ErrorException $ex) { + $processError = new \ErrorException('Archive may contain identical directory or file name with different capitalization (fails on case insensitive filesystems)'); } catch (\Exception $e) { $processError = $e; } diff --git a/tests/Composer/Test/Downloader/ZipDownloaderTest.php b/tests/Composer/Test/Downloader/ZipDownloaderTest.php index 00174d398..9b97a593d 100644 --- a/tests/Composer/Test/Downloader/ZipDownloaderTest.php +++ b/tests/Composer/Test/Downloader/ZipDownloaderTest.php @@ -127,6 +127,28 @@ class ZipDownloaderTest extends TestCase $downloader->extract('testfile.zip', 'vendor/dir'); } + /** + * @expectedException \ErrorException + * @expectedExceptionMessage Archive may contain identical directory or file name with different capitalization (fails on case insensitive filesystems) + */ + public function testZipArchiveExtractOnlyFailed() + { + $this->setPrivateProperty('hasSystemUnzip', false); + $this->setPrivateProperty('hasZipArchive', true); + $downloader = new MockedZipDownloader($this->io, $this->config); + + $zipArchive = $this->getMock('ZipArchive'); + $zipArchive->expects($this->at(0)) + ->method('open') + ->will($this->returnValue(true)); + $zipArchive->expects($this->at(1)) + ->method('extractTo') + ->will($this->throwException(new \ErrorException('Not a directory'))); + + $this->setPrivateProperty('zipArchiveObject', $zipArchive, $downloader); + $downloader->extract('testfile.zip', 'vendor/dir'); + } + /** * @group only */