From b9a44a0057e8f8dc33ef3d72bf330ac5999ae965 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 30 Apr 2013 10:37:03 +0200 Subject: [PATCH] Add RootAliasPackage, fixes #1842 --- src/Composer/Installer.php | 5 +- src/Composer/Package/Loader/ArrayLoader.php | 8 +- .../Package/Loader/RootPackageLoader.php | 20 ++--- src/Composer/Package/RootAliasPackage.php | 89 +++++++++++++++++++ src/Composer/Package/RootPackageInterface.php | 21 +++++ 5 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 src/Composer/Package/RootAliasPackage.php diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 8fa0f132b..ba602832c 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -174,11 +174,14 @@ class Installer $this->downloadManager->setPreferDist(true); } - // create installed repo, this contains all local packages + platform packages (php & extensions) + // clone root package to have one in the installed repo that does not require anything + // we don't want it to be uninstallable, but its requirements should not conflict + // with the lock file for example $installedRootPackage = clone $this->package; $installedRootPackage->setRequires(array()); $installedRootPackage->setDevRequires(array()); + // create installed repo, this contains all local packages + platform packages (php & extensions) $localRepo = $this->repositoryManager->getLocalRepository(); $platformRepo = new PlatformRepository(); $repos = array( diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index 1cfcf50d9..3940bdeb0 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -14,6 +14,8 @@ namespace Composer\Package\Loader; use Composer\Package; use Composer\Package\AliasPackage; +use Composer\Package\RootAliasPackage; +use Composer\Package\RootPackageInterface; use Composer\Package\Version\VersionParser; /** @@ -184,7 +186,11 @@ class ArrayLoader implements LoaderInterface } if ($aliasNormalized = $this->getBranchAlias($config)) { - $package = new AliasPackage($package, $aliasNormalized, preg_replace('{(\.9{7})+}', '.x', $aliasNormalized)); + if ($package instanceof RootPackageInterface) { + $package = new RootAliasPackage($package, $aliasNormalized, preg_replace('{(\.9{7})+}', '.x', $aliasNormalized)); + } else { + $package = new AliasPackage($package, $aliasNormalized, preg_replace('{(\.9{7})+}', '.x', $aliasNormalized)); + } } return $package; diff --git a/src/Composer/Package/Loader/RootPackageLoader.php b/src/Composer/Package/Loader/RootPackageLoader.php index 2e603871d..17f49e4b3 100644 --- a/src/Composer/Package/Loader/RootPackageLoader.php +++ b/src/Composer/Package/Loader/RootPackageLoader.php @@ -65,10 +65,10 @@ class RootPackageLoader extends ArrayLoader $version = $config['version']; } - $package = parent::load($config, $class); + $realPackage = $package = parent::load($config, $class); - if ($package instanceof AliasPackage) { - $package = $package->getAliasOf(); + if ($realPackage instanceof AliasPackage) { + $realPackage = $package->getAliasOf(); } $aliases = array(); @@ -79,7 +79,7 @@ class RootPackageLoader extends ArrayLoader $linkInfo = BasePackage::$supportedLinkTypes[$linkType]; $method = 'get'.ucfirst($linkInfo['method']); $links = array(); - foreach ($package->$method() as $link) { + foreach ($realPackage->$method() as $link) { $links[$link->getTarget()] = $link->getConstraint()->getPrettyString(); } $aliases = $this->extractAliases($links, $aliases); @@ -88,23 +88,23 @@ class RootPackageLoader extends ArrayLoader } } - $package->setAliases($aliases); - $package->setStabilityFlags($stabilityFlags); - $package->setReferences($references); + $realPackage->setAliases($aliases); + $realPackage->setStabilityFlags($stabilityFlags); + $realPackage->setReferences($references); if (isset($config['minimum-stability'])) { - $package->setMinimumStability(VersionParser::normalizeStability($config['minimum-stability'])); + $realPackage->setMinimumStability(VersionParser::normalizeStability($config['minimum-stability'])); } if (isset($config['prefer-stable'])) { - $package->setPreferStable((bool) $config['prefer-stable']); + $realPackage->setPreferStable((bool) $config['prefer-stable']); } $repos = Factory::createDefaultRepositories(null, $this->config, $this->manager); foreach ($repos as $repo) { $this->manager->addRepository($repo); } - $package->setRepositories($this->config->getRepositories()); + $realPackage->setRepositories($this->config->getRepositories()); return $package; } diff --git a/src/Composer/Package/RootAliasPackage.php b/src/Composer/Package/RootAliasPackage.php new file mode 100644 index 000000000..ef717d0a8 --- /dev/null +++ b/src/Composer/Package/RootAliasPackage.php @@ -0,0 +1,89 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Package; + +use Composer\Package\LinkConstraint\VersionConstraint; +use Composer\Package\Version\VersionParser; + +/** + * @author Jordi Boggiano + */ +class RootAliasPackage extends AliasPackage implements RootPackageInterface +{ + public function __construct(RootPackageInterface $aliasOf, $version, $prettyVersion) + { + parent::__construct($aliasOf, $version, $prettyVersion); + } + + /** + * {@inheritDoc} + */ + public function getAliases() + { + return $this->aliasOf->getAliases(); + } + + /** + * {@inheritDoc} + */ + public function getMinimumStability() + { + return $this->aliasOf->getMinimumStability(); + } + + /** + * {@inheritDoc} + */ + public function getStabilityFlags() + { + return $this->aliasOf->getStabilityFlags(); + } + + /** + * {@inheritDoc} + */ + public function getReferences() + { + return $this->aliasOf->getReferences(); + } + + /** + * {@inheritDoc} + */ + public function getPreferStable() + { + return $this->aliasOf->getPreferStable(); + } + + /** + * {@inheritDoc} + */ + public function setRequires(array $require) + { + return $this->aliasOf->setRequires($require); + } + + /** + * {@inheritDoc} + */ + public function setDevRequires(array $devRequire) + { + return $this->aliasOf->setDevRequires($devRequire); + } + + public function __clone() + { + parent::__clone(); + $this->aliasOf = clone $this->aliasOf; + } +} diff --git a/src/Composer/Package/RootPackageInterface.php b/src/Composer/Package/RootPackageInterface.php index 4f10d196d..7bee86324 100644 --- a/src/Composer/Package/RootPackageInterface.php +++ b/src/Composer/Package/RootPackageInterface.php @@ -50,4 +50,25 @@ interface RootPackageInterface extends CompletePackageInterface * @return array */ public function getReferences(); + + /** + * Returns true if the root package prefers picking stable packages over unstable ones + * + * @return bool + */ + public function getPreferStable(); + + /** + * Set the required packages + * + * @param array $requires A set of package links + */ + public function setRequires(array $requires); + + /** + * Set the recommended packages + * + * @param array $devRequires A set of package links + */ + public function setDevRequires(array $devRequires); }