diff --git a/src/Composer/Package/Archiver/ArchiveManager.php b/src/Composer/Package/Archiver/ArchiveManager.php index 66aefdba6..76df21c55 100644 --- a/src/Composer/Package/Archiver/ArchiveManager.php +++ b/src/Composer/Package/Archiver/ArchiveManager.php @@ -45,6 +45,29 @@ class ArchiveManager $this->archivers[] = $archiver; } + /** + * Generate a distinct filename for a particular version of a package. + * + * @param PackageInterface $package The package to get a name for + * + * @return string A filename without an extension + */ + protected function getPackageFilename(PackageInterface $package) + { + $nameParts = array(preg_replace('#[^a-z0-9-_.]#i', '-', $package->getName())); + + if (preg_match('{^[a-f0-9]{40}$}', $package->getDistReference())) { + $nameParts = array_merge($nameParts, array($package->getDistReference(), $package->getDistType())); + } else { + $nameParts = array_merge($nameParts, array($package->getPrettyVersion(), $package->getDistReference(), $package->getDistType())); + } + + return implode('-', array_filter($nameParts, function ($p) { + return !empty($p); + })); + + } + /** * Create an archive of the specified package. * @@ -75,7 +98,7 @@ class ArchiveManager } $filesystem = new Filesystem(); - $packageName = preg_replace('#[^a-z0-9-_.]#i', '-', $package->getPrettyString()); + $packageName = $this->getPackageFilename($package); // Archive filename $filesystem->ensureDirectoryExists($targetDir);