diff --git a/src/Composer/Package/AliasPackage.php b/src/Composer/Package/AliasPackage.php index ee93ec497..b0649ded0 100644 --- a/src/Composer/Package/AliasPackage.php +++ b/src/Composer/Package/AliasPackage.php @@ -392,6 +392,11 @@ class AliasPackage extends BasePackage implements CompletePackageInterface return $this->aliasOf->getArchiveExcludes(); } + public function isDefaultBranch() + { + return $this->aliasOf->isDefaultBranch(); + } + public function isAbandoned() { return $this->aliasOf->isAbandoned(); diff --git a/src/Composer/Package/Dumper/ArrayDumper.php b/src/Composer/Package/Dumper/ArrayDumper.php index dece598f1..ce8d0c215 100644 --- a/src/Composer/Package/Dumper/ArrayDumper.php +++ b/src/Composer/Package/Dumper/ArrayDumper.php @@ -92,6 +92,10 @@ class ArrayDumper $data['time'] = $package->getReleaseDate()->format(DATE_RFC3339); } + if ($package->isDefaultBranch()) { + $data['default_branch'] = true; + } + $data = $this->dumpValues($package, $keys, $data); if ($package instanceof CompletePackageInterface) { diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index 228632b42..d24d34d36 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -53,6 +53,9 @@ class ArrayLoader implements LoaderInterface } else { $version = $this->versionParser->normalize($config['version']); } + if (isset($config['default_branch']) && $config['default_branch'] === true) { + $version = '9999999-dev'; + } $package = new $class($config['name'], $version, $config['version']); $package->setType(isset($config['type']) ? strtolower($config['type']) : 'library'); @@ -75,6 +78,10 @@ class ArrayLoader implements LoaderInterface $package->setInstallationSource($config['installation-source']); } + if (isset($config['default_branch']) && $config['default_branch'] === true) { + $package->setIsDefaultBranch(true); + } + if (isset($config['source'])) { if (!isset($config['source']['type']) || !isset($config['source']['url']) || !isset($config['source']['reference'])) { throw new \UnexpectedValueException(sprintf( diff --git a/src/Composer/Package/Package.php b/src/Composer/Package/Package.php index 6c7b426e7..7ce40a507 100644 --- a/src/Composer/Package/Package.php +++ b/src/Composer/Package/Package.php @@ -58,6 +58,7 @@ class Package extends BasePackage protected $devAutoload = array(); protected $includePaths = array(); protected $archiveExcludes = array(); + protected $isDefaultBranch = false; /** * Creates a new in memory package. @@ -569,6 +570,22 @@ class Package extends BasePackage return $this->archiveExcludes; } + /** + * @param bool $defaultBranch + */ + public function setIsDefaultBranch($defaultBranch) + { + $this->isDefaultBranch = $defaultBranch; + } + + /** + * {@inheritDoc} + */ + public function isDefaultBranch() + { + return $this->isDefaultBranch; + } + /** * Replaces current version and pretty version with passed values. * It also sets stability. diff --git a/src/Composer/Package/PackageInterface.php b/src/Composer/Package/PackageInterface.php index cb16efa7e..c09c9e7ba 100644 --- a/src/Composer/Package/PackageInterface.php +++ b/src/Composer/Package/PackageInterface.php @@ -352,6 +352,11 @@ interface PackageInterface */ public function getArchiveExcludes(); + /** + * @return bool + */ + public function isDefaultBranch(); + /** * Returns a list of options to download package dist files * diff --git a/src/Composer/Repository/VcsRepository.php b/src/Composer/Repository/VcsRepository.php index ccc49396a..dd3aa83d1 100644 --- a/src/Composer/Repository/VcsRepository.php +++ b/src/Composer/Repository/VcsRepository.php @@ -149,8 +149,10 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt $this->loader = new ArrayLoader($this->versionParser); } + $hasRootIdentifierComposerJson = false; try { - if ($driver->hasComposerFile($driver->getRootIdentifier())) { + $hasRootIdentifierComposerJson = $driver->hasComposerFile($driver->getRootIdentifier()); + if ($hasRootIdentifierComposerJson) { $data = $driver->getComposerInformation($driver->getRootIdentifier()); $this->packageName = !empty($data['name']) ? $data['name'] : null; } @@ -211,6 +213,9 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt $data['version'] = preg_replace('{[.-]?dev$}i', '', $data['version']); $data['version_normalized'] = preg_replace('{(^dev-|[.-]?dev$)}i', '', $data['version_normalized']); + // make sure tag do not contain the default_branch marker + unset($data['default_branch']); + // broken package, version doesn't match tag if ($data['version_normalized'] !== $parsedTag) { if ($isVeryVerbose) { @@ -251,6 +256,11 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt } $branches = $driver->getBranches(); + // make sure the root identifier branch gets loaded first + if ($hasRootIdentifierComposerJson && isset($branches[$driver->getRootIdentifier()])) { + $branches = array($driver->getRootIdentifier() => $branches[$driver->getRootIdentifier()]) + $branches; + } + foreach ($branches as $branch => $identifier) { $msg = 'Reading composer.json of ' . ($this->packageName ?: $this->url) . ' (' . $branch . ')'; if ($isVeryVerbose) { @@ -280,6 +290,9 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt $prefix = substr($branch, 0, 1) === 'v' ? 'v' : ''; $version = $prefix . preg_replace('{(\.9{7})+}', '.x', $parsedBranch); } + if ($driver->getRootIdentifier() === $branch) { + $parsedBranch = '9999999-dev'; + } $cachedPackage = $this->getCachedPackageVersion($version, $identifier, $isVerbose, $isVeryVerbose); if ($cachedPackage) { @@ -305,6 +318,11 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt $data['version'] = $version; $data['version_normalized'] = $parsedBranch; + unset($data['default_branch']); + if ($driver->getRootIdentifier() === $branch) { + $data['default_branch'] = true; + } + if ($isVeryVerbose) { $this->io->writeError('Importing branch '.$branch.' ('.$data['version'].')'); }