* Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Repository\RepositoryInterface; use Composer\Package\PackageInterface; /** * @author Nils Adermann */ class DefaultPolicy implements PolicyInterface { public function allowUninstall() { return false; } public function allowDowngrade() { return false; } public function versionCompare(PackageInterface $a, PackageInterface $b, $operator) { return version_compare($a->getVersion(), $b->getVersion(), $operator); } public function findUpdatePackages(Solver $solver, Pool $pool, RepositoryInterface $repo, PackageInterface $package, $allowAll = false) { $packages = array(); foreach ($pool->whatProvides($package->getName()) as $candidate) { // skip old packages unless downgrades are an option if (!$allowAll && !$this->allowDowngrade() && $this->versionCompare($package, $candidate, '>')) { continue; } if ($candidate != $package) { $packages[] = $candidate; } } return $packages; } public function installable(Solver $solver, Pool $pool, RepositoryInterface $repo, PackageInterface $package) { // todo: package blacklist? return true; } public function selectPreferedPackages(Solver $solver, Pool $pool, RepositoryInterface $installed, array $literals) { // prefer installed, newest version, recommended, highest priority repository, ... $newest = $this->selectNewestPackages($installed, $literals); $selected = array(); foreach ($newest as $literal) { if ($literal->getPackage()->getRepository() === $installed) { $selected[] = $literal; } } if (count($selected)) { return $selected; } return $newest; } public function selectNewestPackages(RepositoryInterface $installed, array $literals) { $maxLiterals = array($literals[0]); $maxPackage = $literals[0]->getPackage(); foreach ($literals as $i => $literal) { if (0 === $i) { continue; } if ($this->versionCompare($literal->getPackage(), $maxPackage, '>')) { $maxPackage = $literal->getPackage(); $maxLiterals = array($literal); } else if ($this->versionCompare($literal->getPackage(), $maxPackage, '==')) { $maxLiterals[] = $literal; } } return $maxLiterals; } }