From 6869a1a5cb8793303738f874d15549e961de794b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 16 Jul 2020 15:36:17 +0200 Subject: [PATCH] Clean up a little to make impl less invasive and to handle replacers/providers --- src/Composer/Command/ShowCommand.php | 65 ++++++++++------------------ 1 file changed, 22 insertions(+), 43 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 02b709c2d..08b53cef6 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -22,6 +22,7 @@ use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionSelector; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; +use Composer\Repository\InstalledArrayRepository; use Composer\Repository\ComposerRepository; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; @@ -196,17 +197,18 @@ EOT $installedRepo = new InstalledRepository(array($lockedRepo)); $repos = new CompositeRepository(array_merge(array($installedRepo), $composer->getRepositoryManager()->getRepositories())); } else { - $repos = $installedRepo = new InstalledRepository(array($this->getComposer()->getRepositoryManager()->getLocalRepository())); - $root = $composer->getPackage(); - $repo = $composer->getRepositoryManager()->getLocalRepository(); + // --installed / default case + if (!$composer) { + $composer = $this->getComposer(); + } + $rootPkg = $composer->getPackage(); + $repos = $installedRepo = new InstalledRepository(array($composer->getRepositoryManager()->getLocalRepository())); if ($input->getOption('no-dev')) { - $packages = $this->filterRequiredPackages($repo, $root); - } else { - $packages = $this->appendPackages($repo->getPackages(), array()); + $packages = $this->filterRequiredPackages($installedRepo, $rootPkg); + $repos = $installedRepo = new InstalledRepository(array(new InstalledArrayRepository(array_map(function ($pkg) { return clone $pkg; }, $packages)))); } - $packageNames = array_keys($packages); - $rootPkg = $this->getComposer()->getPackage(); + if (!$installedRepo->getPackages() && ($rootPkg->getRequires() || $rootPkg->getDevRequires())) { $io->writeError('No dependencies installed. Try running composer install or update.'); } @@ -358,13 +360,7 @@ EOT } } } else { - $root = $composer->getPackage(); - if ($input->getOption('no-dev')) { - $packageList = $this->filterRequiredPackages($repo, $root); - } else { - $packageList = $this->appendPackages($repo->getPackages(), array()); - } - foreach ($packageList as $package) { + foreach ($repo->getPackages() as $package) { if (!isset($packages[$type][$package->getName()]) || !is_object($packages[$type][$package->getName()]) || version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '<') @@ -1239,6 +1235,7 @@ EOT return $this->repositorySet; } + /** * Find package requires and child requires * @@ -1249,36 +1246,18 @@ EOT */ private function filterRequiredPackages(RepositoryInterface $repo, PackageInterface $package, $bucket = array()) { - $requires = array_keys($package->getRequires()); + $requires = $package->getRequires(); - $packageListNames = array_keys($bucket); - $packages = array_filter( - $repo->getPackages(), - function ($package) use ($requires, $packageListNames) { - return in_array($package->getName(), $requires, true) && ! in_array($package->getName(), $packageListNames, true); + foreach ($repo->getPackages() as $candidate) { + foreach ($candidate->getNames() as $name) { + if (isset($requires[$name])) { + if (!in_array($candidate, $bucket, true)) { + $bucket[] = $candidate; + $bucket = $this->filterRequiredPackages($repo, $candidate, $bucket); + } + break; + } } - ); - - $bucket = $this->appendPackages($packages, $bucket); - - foreach ($packages as $requiredPackage) { - $bucket = $this->filterRequiredPackages($repo, $requiredPackage, $bucket); - } - - return $bucket; - } - - /** - * Adds packages to the package list - * - * @param array $packages the list of packages to add - * @param array $bucket the list to add packages to - * @return array - */ - public function appendPackages(array $packages, array $bucket) - { - foreach ($packages as $package) { - $bucket[$package->getName()] = $package; } return $bucket;