From 8858b27ced8eeea6dd10b52c76dab2d4539e5e4d Mon Sep 17 00:00:00 2001 From: AjiYakin Date: Sun, 9 Apr 2017 01:47:46 +0700 Subject: [PATCH] Warn identical names w/ different capitalization - extract zip archive Warn about identical names with different capitalization on zip archive extract failure (Not a directory) Issue #5938 --- src/Composer/Downloader/ZipDownloader.php | 2 ++ .../Test/Downloader/ZipDownloaderTest.php | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) 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 */