示例#1
0
 /**
  * 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);
 }