From 753a8345cb44f8a5a5610a7d33fcb46642c69062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Mon, 1 Apr 2013 08:10:15 +0200 Subject: [PATCH] Added support for the alias of an aliased package --- src/Composer/DependencyResolver/Pool.php | 8 +-- src/Composer/Installer.php | 2 - src/Composer/Package/AliasPackage.php | 24 --------- src/Composer/Package/Loader/ArrayLoader.php | 10 ++-- src/Composer/Package/Package.php | 51 ------------------- src/Composer/Package/PackageInterface.php | 14 ----- src/Composer/Package/RootPackage.php | 19 +++++++ src/Composer/Package/RootPackageInterface.php | 7 +++ src/Composer/Repository/ArrayRepository.php | 13 +++-- .../Repository/ComposerRepository.php | 20 ++++---- .../installer/install-aliased-alias.test | 36 +++++++++++++ .../Test/Mock/InstallationManagerMock.php | 7 ++- .../Test/Package/Loader/ArrayLoaderTest.php | 14 +++++ .../Test/Repository/ArrayRepositoryTest.php | 14 +++++ 14 files changed, 120 insertions(+), 119 deletions(-) create mode 100644 tests/Composer/Test/Fixtures/installer/install-aliased-alias.test diff --git a/src/Composer/DependencyResolver/Pool.php b/src/Composer/DependencyResolver/Pool.php index b3d1db70b..11c792048 100644 --- a/src/Composer/DependencyResolver/Pool.php +++ b/src/Composer/DependencyResolver/Pool.php @@ -170,12 +170,14 @@ class Pool $name = $package->getName(); if (isset($rootAliases[$name][$package->getVersion()])) { $alias = $rootAliases[$name][$package->getVersion()]; - $package->setAlias($alias['alias_normalized']); - $package->setPrettyAlias($alias['alias']); - $package->getRepository()->addPackage($aliasPackage = new AliasPackage($package, $alias['alias_normalized'], $alias['alias'])); + if ($package instanceof AliasPackage) { + $package = $package->getAliasOf(); + } + $aliasPackage = new AliasPackage($package, $alias['alias_normalized'], $alias['alias']); $aliasPackage->setRootPackageAlias(true); $aliasPackage->setId($this->id++); + $package->getRepository()->addPackage($aliasPackage); $this->packages[] = $aliasPackage; foreach ($aliasPackage->getNames() as $name) { diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 2970a9cb3..9a4fea1ab 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -687,8 +687,6 @@ class Installer foreach ($versions as $version => $alias) { $packages = $platformRepo->findPackages($package, $version); foreach ($packages as $package) { - $package->setAlias($alias['alias_normalized']); - $package->setPrettyAlias($alias['alias']); $aliasPackage = new AliasPackage($package, $alias['alias_normalized'], $alias['alias']); $aliasPackage->setRootPackageAlias(true); $platformRepo->addPackage($aliasPackage); diff --git a/src/Composer/Package/AliasPackage.php b/src/Composer/Package/AliasPackage.php index 7f16aaac9..dc9359cd4 100644 --- a/src/Composer/Package/AliasPackage.php +++ b/src/Composer/Package/AliasPackage.php @@ -175,22 +175,6 @@ class AliasPackage extends BasePackage implements CompletePackageInterface return $this->rootPackageAlias; } - /** - * {@inheritDoc} - */ - public function getAlias() - { - return ''; - } - - /** - * {@inheritDoc} - */ - public function getPrettyAlias() - { - return ''; - } - /*************************************** * Wrappers around the aliased package * ***************************************/ @@ -251,14 +235,6 @@ class AliasPackage extends BasePackage implements CompletePackageInterface { return $this->aliasOf->getScripts(); } - public function setAliases(array $aliases) - { - return $this->aliasOf->setAliases($aliases); - } - public function getAliases() - { - return $this->aliasOf->getAliases(); - } public function getLicense() { return $this->aliasOf->getLicense(); diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index ffb0aa126..1cfcf50d9 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -13,6 +13,7 @@ namespace Composer\Package\Loader; use Composer\Package; +use Composer\Package\AliasPackage; use Composer\Package\Version\VersionParser; /** @@ -100,11 +101,6 @@ class ArrayLoader implements LoaderInterface $package->setDistSha1Checksum(isset($config['dist']['shasum']) ? $config['dist']['shasum'] : null); } - if ($aliasNormalized = $this->getBranchAlias($config)) { - $package->setAlias($aliasNormalized); - $package->setPrettyAlias(preg_replace('{(\.9{7})+}', '.x', $aliasNormalized)); - } - foreach (Package\BasePackage::$supportedLinkTypes as $type => $opts) { if (isset($config[$type])) { $method = 'set'.ucfirst($opts['method']); @@ -187,6 +183,10 @@ class ArrayLoader implements LoaderInterface } } + if ($aliasNormalized = $this->getBranchAlias($config)) { + $package = new AliasPackage($package, $aliasNormalized, preg_replace('{(\.9{7})+}', '.x', $aliasNormalized)); + } + return $package; } diff --git a/src/Composer/Package/Package.php b/src/Composer/Package/Package.php index 802fa74aa..90157d9a0 100644 --- a/src/Composer/Package/Package.php +++ b/src/Composer/Package/Package.php @@ -36,9 +36,6 @@ class Package extends BasePackage protected $releaseDate; protected $extra = array(); protected $binaries = array(); - protected $aliases = array(); - protected $alias; - protected $prettyAlias; protected $dev; protected $stability; protected $notificationUrl; @@ -155,54 +152,6 @@ class Package extends BasePackage return $this->binaries; } - /** - * @param array $aliases - */ - public function setAliases(array $aliases) - { - $this->aliases = $aliases; - } - - /** - * {@inheritDoc} - */ - public function getAliases() - { - return $this->aliases; - } - - /** - * @param string $alias - */ - public function setAlias($alias) - { - $this->alias = $alias; - } - - /** - * {@inheritDoc} - */ - public function getAlias() - { - return $this->alias; - } - - /** - * @param string $prettyAlias - */ - public function setPrettyAlias($prettyAlias) - { - $this->prettyAlias = $prettyAlias; - } - - /** - * {@inheritDoc} - */ - public function getPrettyAlias() - { - return $this->prettyAlias; - } - /** * {@inheritDoc} */ diff --git a/src/Composer/Package/PackageInterface.php b/src/Composer/Package/PackageInterface.php index 227ce42c3..a3c8a2793 100644 --- a/src/Composer/Package/PackageInterface.php +++ b/src/Composer/Package/PackageInterface.php @@ -267,20 +267,6 @@ interface PackageInterface */ public function getBinaries(); - /** - * Returns a version this package should be aliased to - * - * @return string - */ - public function getAlias(); - - /** - * Returns a non-normalized version this package should be aliased to - * - * @return string - */ - public function getPrettyAlias(); - /** * Returns package unique name, constructed from name and version. * diff --git a/src/Composer/Package/RootPackage.php b/src/Composer/Package/RootPackage.php index 9112e3237..b2e812990 100644 --- a/src/Composer/Package/RootPackage.php +++ b/src/Composer/Package/RootPackage.php @@ -23,6 +23,7 @@ class RootPackage extends CompletePackage implements RootPackageInterface protected $preferStable = false; protected $stabilityFlags = array(); protected $references = array(); + protected $aliases = array(); /** * Set the minimumStability @@ -95,4 +96,22 @@ class RootPackage extends CompletePackage implements RootPackageInterface { return $this->references; } + + /** + * Set the aliases + * + * @param array $aliases + */ + public function setAliases(array $aliases) + { + $this->aliases = $aliases; + } + + /** + * {@inheritDoc} + */ + public function getAliases() + { + return $this->aliases; + } } diff --git a/src/Composer/Package/RootPackageInterface.php b/src/Composer/Package/RootPackageInterface.php index 501376f66..4f10d196d 100644 --- a/src/Composer/Package/RootPackageInterface.php +++ b/src/Composer/Package/RootPackageInterface.php @@ -19,6 +19,13 @@ namespace Composer\Package; */ interface RootPackageInterface extends CompletePackageInterface { + /** + * Returns a set of package names and theirs aliases + * + * @return array + */ + public function getAliases(); + /** * Returns the minimum stability of the package * diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index 72fe242c7..7e9d9c047 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -124,18 +124,17 @@ class ArrayRepository implements RepositoryInterface $package->setRepository($this); $this->packages[] = $package; - // create alias package on the fly if needed - if ($package->getAlias()) { - $alias = $this->createAliasPackage($package); - if (!$this->hasPackage($alias)) { - $this->addPackage($alias); + if ($package instanceof AliasPackage) { + $aliasedPackage = $package->getAliasOf(); + if (null === $aliasedPackage->getRepository()) { + $this->addPackage($aliasedPackage); } } } - protected function createAliasPackage(PackageInterface $package, $alias = null, $prettyAlias = null) + protected function createAliasPackage(PackageInterface $package, $alias, $prettyAlias) { - return new AliasPackage($package, $alias ?: $package->getAlias(), $prettyAlias ?: $package->getPrettyAlias()); + return new AliasPackage($package instanceof AliasPackage ? $package->getAliasOf() : $package, $alias, $prettyAlias); } /** diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index 8f73fafa1..76c1f1dc3 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -322,16 +322,18 @@ class ComposerRepository extends ArrayRepository implements StreamableRepository $package = $this->createPackage($version, 'Composer\Package\Package'); $package->setRepository($this); - $this->providers[$name][$version['uid']] = $package; - $this->providersByUid[$version['uid']] = $package; + if ($package instanceof AliasPackage) { + $aliased = $package->getAliasOf(); + $aliased->setRepository($this); - if ($package->getAlias()) { - $alias = $this->createAliasPackage($package); - $alias->setRepository($this); + $this->providers[$name][$version['uid']] = $aliased; + $this->providers[$name][$version['uid'].'-alias'] = $package; - $this->providers[$name][$version['uid'].'-alias'] = $alias; // override provider with its alias so it can be expanded in the if block above - $this->providersByUid[$version['uid']] = $alias; + $this->providersByUid[$version['uid']] = $package; + } else { + $this->providers[$name][$version['uid']] = $package; + $this->providersByUid[$version['uid']] = $package; } // handle root package aliases @@ -339,8 +341,8 @@ class ComposerRepository extends ArrayRepository implements StreamableRepository if (isset($this->rootAliases[$name][$package->getVersion()])) { $rootAliasData = $this->rootAliases[$name][$package->getVersion()]; - } elseif (($aliasNormalized = $package->getAlias()) && isset($this->rootAliases[$name][$aliasNormalized])) { - $rootAliasData = $this->rootAliases[$name][$aliasNormalized]; + } elseif ($package instanceof AliasPackage && isset($this->rootAliases[$name][$package->getAliasOf()->getVersion()])) { + $rootAliasData = $this->rootAliases[$name][$package->getAliasOf()->getVersion()]; } if (isset($rootAliasData)) { diff --git a/tests/Composer/Test/Fixtures/installer/install-aliased-alias.test b/tests/Composer/Test/Fixtures/installer/install-aliased-alias.test new file mode 100644 index 000000000..f535caa7e --- /dev/null +++ b/tests/Composer/Test/Fixtures/installer/install-aliased-alias.test @@ -0,0 +1,36 @@ +--TEST-- +Installing double aliased package +--COMPOSER-- +{ + "repositories": [ + { + "type": "package", + "package": [ + { + "name": "a/a", "version": "dev-master", + "dist": { "type": "file", "url": "" }, + "require": { + "b/b": "dev-master" + } + }, + { + "name": "b/b", "version": "dev-foo", + "extra": { "branch-alias": { "dev-foo": "1.0.x-dev" } }, + "dist": { "type": "file", "url": "" } + } + ] + } + ], + "require": { + "a/a": "dev-master", + "b/b": "1.0.x-dev as dev-master" + }, + "minimum-stability": "dev" +} +--RUN-- +install +--EXPECT-- +Installing b/b (dev-foo) +Marking b/b (dev-master) as installed, alias of b/b (dev-foo) +Installing a/a (dev-master) +Marking b/b (1.0.x-dev) as installed, alias of b/b (dev-foo) diff --git a/tests/Composer/Test/Mock/InstallationManagerMock.php b/tests/Composer/Test/Mock/InstallationManagerMock.php index 985b85879..e95229347 100644 --- a/tests/Composer/Test/Mock/InstallationManagerMock.php +++ b/tests/Composer/Test/Mock/InstallationManagerMock.php @@ -67,16 +67,15 @@ class InstallationManagerMock extends InstallationManager $this->installed[] = $package; $this->trace[] = (string) $operation; - if (!$repo->hasPackage($package)) { - $repo->addPackage($package); - } + parent::markAliasInstalled($repo, $operation); } public function markAliasUninstalled(RepositoryInterface $repo, MarkAliasUninstalledOperation $operation) { $this->uninstalled[] = $operation->getPackage(); $this->trace[] = (string) $operation; - $repo->removePackage($operation->getPackage()); + + parent::markAliasUninstalled($repo, $operation); } public function getTrace() diff --git a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php index 68aed0a23..248e251ef 100644 --- a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php @@ -123,4 +123,18 @@ class ArrayLoaderTest extends \PHPUnit_Framework_TestCase $dumper = new ArrayDumper; $this->assertEquals($config, $dumper->dump($package)); } + + public function testPackageWithBranchAlias() + { + $config = array( + 'name' => 'A', + 'version' => 'dev-master', + 'extra' => array('branch-alias' => array('dev-master' => '1.0.x-dev')), + ); + + $package = $this->loader->load($config); + + $this->assertInstanceOf('Composer\Package\AliasPackage', $package); + $this->assertEquals('1.0.x-dev', $package->getPrettyVersion()); + } } diff --git a/tests/Composer/Test/Repository/ArrayRepositoryTest.php b/tests/Composer/Test/Repository/ArrayRepositoryTest.php index ed05819b6..6852f7dd6 100644 --- a/tests/Composer/Test/Repository/ArrayRepositoryTest.php +++ b/tests/Composer/Test/Repository/ArrayRepositoryTest.php @@ -66,4 +66,18 @@ class ArrayRepositoryTest extends TestCase $this->assertCount(2, $bar); $this->assertEquals('bar', $bar[0]->getName()); } + + public function testAutomaticallyAddAliasedPackage() + { + $repo = new ArrayRepository(); + + $package = $this->getPackage('foo', '1'); + $alias = $this->getAliasPackage($package, '2'); + + $repo->addPackage($alias); + + $this->assertEquals(2, count($repo)); + $this->assertTrue($repo->hasPackage($this->getPackage('foo', '1'))); + $this->assertTrue($repo->hasPackage($this->getPackage('foo', '2'))); + } }