/** * finds a package by name and version if provided * * @param RepositoryInterface $installedRepo * @param RepositoryInterface $repos * @param string $name * @param string $version * @return array array(CompletePackageInterface, array of versions) * @throws \InvalidArgumentException */ protected function getPackage(RepositoryInterface $installedRepo, RepositoryInterface $repos, $name, $version = null) { $name = strtolower($name); if ($version) { $parser = new VersionParser(); $version = $parser->normalize($version); } $match = null; $matches = array(); $repos->filterPackages(function ($package) use($name, $version, &$matches) { if ($package->getName() === $name) { $matches[] = $package; } }, 'Composer\\Package\\CompletePackage'); if (null === $version) { // search for a locally installed version foreach ($matches as $package) { if ($installedRepo->hasPackage($package)) { $match = $package; break; } } if (!$match) { // fallback to the highest version foreach ($matches as $package) { if (null === $match || version_compare($package->getVersion(), $match->getVersion(), '>=')) { $match = $package; } } } } else { // select the specified version foreach ($matches as $package) { if ($package->getVersion() === $version) { $match = $package; } } } // build versions array $versions = array(); foreach ($matches as $package) { $versions[$package->getPrettyVersion()] = $package->getVersion(); } return array($match, $versions); }