diff --git a/src/Composer/Downloader/ArchiveDownloader.php b/src/Composer/Downloader/ArchiveDownloader.php index 5da9350ea..b84b461a2 100644 --- a/src/Composer/Downloader/ArchiveDownloader.php +++ b/src/Composer/Downloader/ArchiveDownloader.php @@ -47,18 +47,23 @@ abstract class ArchiveDownloader extends FileDownloader if (1 === count($contentDir)) { $contentDir = $contentDir[0]; - // Rename the content directory to avoid error when moving up - // a child folder with the same name - $temporaryName = md5(time().rand()); - $this->filesystem->rename($contentDir, $temporaryName); - $contentDir = $temporaryName; + if (is_file($contentDir)) { + $this->filesystem->rename($contentDir, $path . '/' . basename($contentDir)); + } else { + // Rename the content directory to avoid error when moving up + // a child folder with the same name + $temporaryName = md5(time().rand()); + $this->filesystem->rename($contentDir, $temporaryName); + $contentDir = $temporaryName; - foreach (array_merge(glob($contentDir . '/.*'), glob($contentDir . '/*')) as $file) { - if (trim(basename($file), '.')) { - $this->filesystem->rename($file, $path . '/' . basename($file)); + foreach (array_merge(glob($contentDir . '/.*'), glob($contentDir . '/*')) as $file) { + if (trim(basename($file), '.')) { + $this->filesystem->rename($file, $path . '/' . basename($file)); + } } + + rmdir($contentDir); } - rmdir($contentDir); } } catch (\Exception $e) { // clean up