public function testFindPackages() { $arrayRepoOne = new ArrayRepository(); $arrayRepoOne->addPackage($this->getPackage('foo', '1')); $arrayRepoOne->addPackage($this->getPackage('foo', '2')); $arrayRepoOne->addPackage($this->getPackage('bat', '1')); $arrayRepoTwo = new ArrayRepository(); $arrayRepoTwo->addPackage($this->getPackage('bar', '1')); $arrayRepoTwo->addPackage($this->getPackage('bar', '2')); $arrayRepoTwo->addPackage($this->getPackage('foo', '3')); $repo = new CompositeRepository(array($arrayRepoOne, $arrayRepoTwo)); $bats = $repo->findPackages('bat'); $this->assertCount(1, $bats, "Should find one instance of 'bats' (defined in just one repository)"); $this->assertEquals('bat', $bats[0]->getName(), "Should find packages named 'bat'"); $bars = $repo->findPackages('bar'); $this->assertCount(2, $bars, "Should find two instances of 'bar' (both defined in the same repository)"); $this->assertEquals('bar', $bars[0]->getName(), "Should find packages named 'bar'"); $foos = $repo->findPackages('foo'); $this->assertCount(3, $foos, "Should find three instances of 'foo' (two defined in one repository, the third in the other)"); $this->assertEquals('foo', $foos[0]->getName(), "Should find packages named 'foo'"); }
/** * Search for packages. * * @param array $tokens * @param int $searchIn * * @return CompletePackageInterface[] */ protected function searchPackages(array $tokens, $searchIn) { $repositoryManager = $this->getRepositoryManager(); $platformRepo = new PlatformRepository(); $localRepository = $repositoryManager->getLocalRepository(); $installedRepository = new CompositeRepository(array($localRepository, $platformRepo)); $repositories = new CompositeRepository(array_merge(array($installedRepository), $repositoryManager->getRepositories())); $results = $repositories->search(implode(' ', $tokens), $searchIn); $contaoVersion = VERSION . (is_numeric(BUILD) ? '.' . BUILD : '-' . BUILD); $constraint = $this->createConstraint('=', $contaoVersion); $constraint->setPrettyString($contaoVersion); $packages = array(); foreach ($results as $result) { if (!isset($packages[$result['name']])) { /** @var PackageInterface[] $versions */ $versions = $repositories->findPackages($result['name']); /** @var PackageInterface|CompletePackageInterface $latestVersion */ $latestVersion = false; $packages[$result['name']] = $result; if (count($versions)) { $packages[$result['name']]['type'] = $versions[0]->getType(); $packages[$result['name']]['description'] = $versions[0] instanceof CompletePackageInterface ? $versions[0]->getDescription() : ''; $packages[$result['name']]['contao-compatible'] = null; foreach ($versions as $version) { $requires = $version->getRequires(); if (isset($requires['contao/core']) && $requires['contao/core'] instanceof Link) { /** @var Link $link */ $link = $requires['contao/core']; if ($link->getConstraint()->matches($constraint)) { $packages[$result['name']]['contao-compatible'] = true; if (!$latestVersion || $version->getReleaseDate() > $latestVersion->getReleaseDate()) { $latestVersion = $version; } } } } } if ($packages[$result['name']]['contao-compatible'] === null) { $packages[$result['name']]['contao-compatible'] = true; } if ($latestVersion) { $packages[$result['name']]['type'] = $latestVersion->getType(); if ($latestVersion instanceof CompletePackageInterface) { $packages[$result['name']]['description'] = $latestVersion->getDescription(); } } } } return $packages; }
protected function selectPackage(IOInterface $io, $packageName, $version = null) { $io->writeError('<info>Searching for the specified package.</info>'); if ($composer = $this->getComposer(false)) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $repo = new CompositeRepository(array_merge(array($localRepo), $composer->getRepositoryManager()->getRepositories())); } else { $defaultRepos = Factory::createDefaultRepositories($this->getIO()); $io->writeError('No composer.json found in the current directory, searching packages from ' . implode(', ', array_keys($defaultRepos))); $repo = new CompositeRepository($defaultRepos); } $packages = $repo->findPackages($packageName, $version); if (count($packages) > 1) { $package = reset($packages); $io->writeError('<info>Found multiple matches, selected ' . $package->getPrettyString() . '.</info>'); $io->writeError('Alternatives were ' . implode(', ', array_map(function ($p) { return $p->getPrettyString(); }, $packages)) . '.'); $io->writeError('<comment>Please use a more specific constraint to pick a different package.</comment>'); } elseif ($packages) { $package = reset($packages); $io->writeError('<info>Found an exact match ' . $package->getPrettyString() . '.</info>'); } else { $io->writeError('<error>Could not find a package matching ' . $packageName . '.</error>'); return false; } return $package; }
/** * Returns a package tag list. * * @param CompletePackageInterface $package * * @return array */ public function getPackageTags(CompletePackageInterface $package) { $ds = DIRECTORY_SEPARATOR; putenv("COMPOSER_HOME={$this->vendorDir}{$ds}composer"); $repos = Factory::createDefaultRepositories(new NullIO()); $compositeRepo = new CompositeRepository($repos); $pkgs = $compositeRepo->findPackages($package->getPrettyName()); $tags = array(); foreach ($pkgs as $pkg) { $tags[] = $pkg->getPrettyVersion(); } return $tags; }