public function testFindPackage() { $arrayRepoOne = new ArrayRepository(); $arrayRepoOne->addPackage($this->getPackage('foo', '1')); $arrayRepoTwo = new ArrayRepository(); $arrayRepoTwo->addPackage($this->getPackage('bar', '1')); $repo = new CompositeRepository(array($arrayRepoOne, $arrayRepoTwo)); $this->assertEquals('foo', $repo->findPackage('foo', '1')->getName(), "Should find package 'foo/1' and get name of 'foo'"); $this->assertEquals('1', $repo->findPackage('foo', '1')->getPrettyVersion(), "Should find package 'foo/1' and get pretty version of '1'"); $this->assertEquals('bar', $repo->findPackage('bar', '1')->getName(), "Should find package 'bar/1' and get name of 'bar'"); $this->assertEquals('1', $repo->findPackage('bar', '1')->getPrettyVersion(), "Should find package 'bar/1' and get pretty version of '1'"); $this->assertNull($repo->findPackage('foo', '2'), "Should not find package 'foo/2'"); }
/** * Execute the command. * * @param InputInterface $input * @param OutputInterface $output * @param bool $inverted Whether to invert matching process (why-not vs why behaviour) * @return int|null Exit code of the operation. */ protected function doExecute(InputInterface $input, OutputInterface $output, $inverted = false) { // Emit command event on startup $composer = $this->getComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, $this->getName(), $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); // Prepare repositories and set up a pool $platformOverrides = $composer->getConfig()->get('platform') ?: array(); $repository = new CompositeRepository(array(new ArrayRepository(array($composer->getPackage())), $composer->getRepositoryManager()->getLocalRepository(), new PlatformRepository(array(), $platformOverrides))); $pool = new Pool(); $pool->addRepository($repository); // Parse package name and constraint list($needle, $textConstraint) = array_pad(explode(':', $input->getArgument(self::ARGUMENT_PACKAGE)), 2, $input->getArgument(self::ARGUMENT_CONSTRAINT)); // Find packages that are or provide the requested package first $packages = $pool->whatProvides($needle); if (empty($packages)) { throw new \InvalidArgumentException(sprintf('Could not find package "%s" in your project', $needle)); } // If the version we ask for is not installed then we need to locate it in remote repos and add it. // This is needed for why-not to resolve conflicts from an uninstalled version against installed packages. if (!$repository->findPackage($needle, $textConstraint)) { $defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos($this->getIO())); if ($match = $defaultRepos->findPackage($needle, $textConstraint)) { $repository->addRepository(new ArrayRepository(array(clone $match))); } } // Include replaced packages for inverted lookups as they are then the actual starting point to consider $needles = array($needle); if ($inverted) { foreach ($packages as $package) { $needles = array_merge($needles, array_map(function (Link $link) { return $link->getTarget(); }, $package->getReplaces())); } } // Parse constraint if one was supplied if ('*' !== $textConstraint) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($textConstraint); } else { $constraint = null; } // Parse rendering options $renderTree = $input->getOption(self::OPTION_TREE); $recursive = $renderTree || $input->getOption(self::OPTION_RECURSIVE); // Resolve dependencies $results = $repository->getDependents($needles, $constraint, $inverted, $recursive); if (empty($results)) { $extra = null !== $constraint ? sprintf(' in versions %smatching %s', $inverted ? 'not ' : '', $textConstraint) : ''; $this->getIO()->writeError(sprintf('<info>There is no installed package depending on "%s"%s</info>', $needle, $extra)); } elseif ($renderTree) { $this->initStyles($output); $root = $packages[0]; $this->getIO()->write(sprintf('<info>%s</info> %s %s', $root->getPrettyName(), $root->getPrettyVersion(), $root->getDescription())); $this->printTree($results); } else { $this->printTable($output, $results); } return 0; }
/** * If the version we ask for is not installed then we need to locate it in * remote repos and add it. * * This is needed for why-not to resolve conflicts from an uninstalled * version against installed packages. * * @param string $packageName Package to inspect. * @param string $textConstraint Optional version constraint * @param bool $onlyLocal * * @return Pool */ private function getRequiredPool($packageName, $textConstraint, $onlyLocal) { if ($onlyLocal === false) { return $this->getPool(); } $composer = $this->getComposer(); $pool = new Pool(); // Prepare repositories and set up a pool $platformOverrides = $composer->getConfig()->get('platform') ?: []; /** @var BasePackage $rootPackage */ $rootPackage = $composer->getPackage(); if ($rootPackage->getRepository() === null) { $packageRepo = new ArrayRepository([$composer->getPackage()]); $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $platformRepo = new PlatformRepository([], $platformOverrides); $compositeRepository = new CompositeRepository([$packageRepo, $localRepo, $platformRepo]); $pool->addRepository($compositeRepository); $defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos($this->getIO())); $match = $defaultRepos->findPackage($packageName, $textConstraint); if ($match) { $compositeRepository->addRepository(new ArrayRepository([clone $match])); } } return $pool; }