diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index 5885b033d..1644b8068 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -21,6 +21,7 @@ use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Request; use Composer\DependencyResolver\Operation; use Composer\Package\MemoryPackage; +use Composer\Package\Link; use Composer\Package\LinkConstraint\VersionConstraint; use Composer\Package\PackageInterface; use Composer\Repository\CompositeRepository; @@ -92,8 +93,10 @@ EOT $composer->getDownloadManager()->setPreferSource(true); } + $repoManager = $composer->getRepositoryManager(); + // create local repo, this contains all packages that are installed in the local project - $localRepo = $composer->getRepositoryManager()->getLocalRepository(); + $localRepo = $repoManager->getLocalRepository(); // create installed repo, this contains all local packages + platform packages (php & extensions) $installedRepo = new CompositeRepository(array($localRepo, new PlatformRepository())); if ($additionalInstalledRepository) { @@ -103,7 +106,7 @@ EOT // creating repository pool $pool = new Pool; $pool->addRepository($installedRepo); - foreach ($composer->getRepositoryManager()->getRepositories() as $repository) { + foreach ($repoManager->getRepositories() as $repository) { $pool->addRepository($repository); } @@ -148,6 +151,27 @@ EOT } } + // prepare aliased packages + foreach ($composer->getPackage()->getAliases() as $alias) { + $candidates = array_merge( + $repoManager->findPackages($alias['package'], $alias['version']), + $repoManager->getLocalRepository()->findPackages($alias['package'], $alias['version']) + ); + foreach ($candidates as $package) { + $replaces = $package->getReplaces(); + foreach ($replaces as $index => $link) { + // link is self.version, but must be replacing also the replaced version + if ('self.version' === $link->getPrettyConstraint()) { + $replaces[] = new Link($link->getSource(), $link->getTarget(), new VersionConstraint('=', $alias['replaces']), 'replaces', $alias['replaces']); + } + } + + // add replace of itself + $replaces[] = new Link($alias['package'], $alias['package'], new VersionConstraint('=', $alias['replaces']), 'replaces', $alias['replaces']); + $package->setReplaces($replaces); + } + } + // prepare solver $installationManager = $composer->getInstallationManager(); $policy = new DependencyResolver\DefaultPolicy(); @@ -179,7 +203,7 @@ EOT } // force update - $newPackage = $composer->getRepositoryManager()->findPackage($package->getName(), $package->getVersion()); + $newPackage = $repoManager->findPackage($package->getName(), $package->getVersion()); if ($newPackage && $newPackage->getSourceReference() !== $package->getSourceReference()) { $operations[] = new UpdateOperation($package, $newPackage); } diff --git a/src/Composer/Package/Loader/RootPackageLoader.php b/src/Composer/Package/Loader/RootPackageLoader.php index 26765c78a..657ff482c 100644 --- a/src/Composer/Package/Loader/RootPackageLoader.php +++ b/src/Composer/Package/Loader/RootPackageLoader.php @@ -43,6 +43,21 @@ class RootPackageLoader extends ArrayLoader $package = parent::load($config); + if (isset($config['require'])) { + $aliases = array(); + foreach ($config['require'] as $reqName => $reqVersion) { + if (preg_match('{^([^,\s]+) +as +([^,\s]+)$}', $reqVersion, $match)) { + $aliases[] = array( + 'package' => strtolower($reqName), + 'version' => $this->versionParser->normalize($match[1]), + 'replaces' => $this->versionParser->normalize($match[2]), + ); + } + } + + $package->setAliases($aliases); + } + if (isset($config['repositories'])) { foreach ($config['repositories'] as $index => $repo) { if (isset($repo['packagist']) && $repo['packagist'] === false) { diff --git a/src/Composer/Package/MemoryPackage.php b/src/Composer/Package/MemoryPackage.php index a57f2b6f6..a2a711027 100644 --- a/src/Composer/Package/MemoryPackage.php +++ b/src/Composer/Package/MemoryPackage.php @@ -41,6 +41,7 @@ class MemoryPackage extends BasePackage protected $extra = array(); protected $binaries = array(); protected $scripts = array(); + protected $aliases = array(); protected $dev; protected $requires = array(); @@ -156,6 +157,22 @@ class MemoryPackage extends BasePackage return $this->scripts; } + /** + * @param array $aliases + */ + public function setAliases(array $aliases) + { + $this->aliases = $aliases; + } + + /** + * {@inheritDoc} + */ + public function getAliases() + { + return $this->aliases; + } + /** * {@inheritDoc} */ diff --git a/src/Composer/Package/Version/VersionParser.php b/src/Composer/Package/Version/VersionParser.php index 716c24731..36a16ae09 100644 --- a/src/Composer/Package/Version/VersionParser.php +++ b/src/Composer/Package/Version/VersionParser.php @@ -34,6 +34,11 @@ class VersionParser { $version = trim($version); + // ignore aliases and just assume the alias is required instead of the source + if (preg_match('{^([^,\s]+) +as +([^,\s]+)$}', $version, $match)) { + $version = $match[1]; + } + // match master-like branches if (preg_match('{^(?:dev-)?(?:master|trunk|default)$}i', $version)) { return '9999999-dev'; diff --git a/tests/Composer/Test/Package/Version/VersionParserTest.php b/tests/Composer/Test/Package/Version/VersionParserTest.php index 64a3e79f4..d7336bd5a 100644 --- a/tests/Composer/Test/Package/Version/VersionParserTest.php +++ b/tests/Composer/Test/Package/Version/VersionParserTest.php @@ -53,6 +53,7 @@ class VersionParserTest extends \PHPUnit_Framework_TestCase 'parses trunk' => array('dev-trunk', '9999999-dev'), 'parses arbitrary' => array('dev-feature-foo', 'dev-feature-foo'), 'parses arbitrary2' => array('DEV-FOOBAR', 'dev-foobar'), + 'ignores aliases' => array('dev-master as 1.0.0', '9999999-dev'), ); }