1
0
Fork 0

Show number of additional suggestions when not using --all, fixes #8788

pull/8777/head^2
Jordi Boggiano 2020-04-23 10:23:56 +02:00
parent d6a9d78309
commit fa14cd1353
No known key found for this signature in database
GPG Key ID: 7BBD42C429EC80BC
2 changed files with 35 additions and 18 deletions

View File

@ -14,7 +14,7 @@ namespace Composer\Command;
use Composer\Repository\PlatformRepository; use Composer\Repository\PlatformRepository;
use Composer\Repository\RootPackageRepository; use Composer\Repository\RootPackageRepository;
use Composer\Repository\CompositeRepository; use Composer\Repository\InstalledRepository;
use Composer\Installer\SuggestedPackagesReporter; use Composer\Installer\SuggestedPackagesReporter;
use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
@ -67,15 +67,10 @@ EOT
$installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository();
} }
$installedRepo = new CompositeRepository($installedRepos); $installedRepo = new InstalledRepository($installedRepos);
$reporter = new SuggestedPackagesReporter($this->getIO()); $reporter = new SuggestedPackagesReporter($this->getIO());
$filter = $input->getArgument('packages'); $filter = $input->getArgument('packages');
if (empty($filter) && !$input->getOption('all')) {
$filter = array_map(function ($link) {
return $link->getTarget();
}, array_merge($composer->getPackage()->getRequires(), $composer->getPackage()->getDevRequires()));
}
foreach ($installedRepo->getPackages() as $package) { foreach ($installedRepo->getPackages() as $package) {
if (!empty($filter) && !in_array($package->getName(), $filter)) { if (!empty($filter) && !in_array($package->getName(), $filter)) {
continue; continue;
@ -100,7 +95,7 @@ EOT
$mode = SuggestedPackagesReporter::MODE_LIST; $mode = SuggestedPackagesReporter::MODE_LIST;
} }
$reporter->output($mode, $installedRepo); $reporter->output($mode, $installedRepo, empty($filter) && !$input->getOption('all') ? $composer->getPackage() : null);
return 0; return 0;
} }

View File

@ -14,7 +14,7 @@ namespace Composer\Installer;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\Repository\RepositoryInterface; use Composer\Repository\InstalledRepository;
use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Formatter\OutputFormatter;
/** /**
@ -98,12 +98,14 @@ class SuggestedPackagesReporter
* *
* Do not list the ones already installed if installed repository provided. * Do not list the ones already installed if installed repository provided.
* *
* @param int $mode One of the MODE_* constants from this class * @param int $mode One of the MODE_* constants from this class
* @param InstalledRepository $installedRepo If passed in, suggested packages which are installed already will be skipped
* @param PackageInterface $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package will be shown
* @return SuggestedPackagesReporter * @return SuggestedPackagesReporter
*/ */
public function output($mode, RepositoryInterface $installedRepo = null) public function output($mode, InstalledRepository $installedRepo = null, PackageInterface $onlyDependentsOf = null)
{ {
$suggestedPackages = $this->getFilteredSuggestions($installedRepo); $suggestedPackages = $this->getFilteredSuggestions($installedRepo, $onlyDependentsOf);
$suggesters = array(); $suggesters = array();
$suggested = array(); $suggested = array();
@ -151,19 +153,27 @@ class SuggestedPackagesReporter
} }
} }
if ($onlyDependentsOf) {
$allSuggestedPackages = $this->getFilteredSuggestions($installedRepo);
$diff = count($allSuggestedPackages) - count($suggestedPackages);
if ($diff) {
$this->io->write('<info>'.$diff.' additional suggestions</info> by transitive dependencies can be shown with <info>--all</info>');
}
}
return $this; return $this;
} }
/** /**
* Output number of new suggested packages and a hint to use suggest command. * Output number of new suggested packages and a hint to use suggest command.
**
* Do not list the ones already installed if installed repository provided.
* *
* @param InstalledRepository $installedRepo If passed in, suggested packages which are installed already will be skipped
* @param PackageInterface $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package will be shown
* @return SuggestedPackagesReporter * @return SuggestedPackagesReporter
*/ */
public function outputMinimalistic(RepositoryInterface $installedRepo = null) public function outputMinimalistic(InstalledRepository $installedRepo = null, PackageInterface $onlyDependentsOf = null)
{ {
$suggestedPackages = $this->getFilteredSuggestions($installedRepo); $suggestedPackages = $this->getFilteredSuggestions($installedRepo, $onlyDependentsOf);
if ($suggestedPackages) { if ($suggestedPackages) {
$this->io->writeError('<info>'.count($suggestedPackages).' package suggestions were added by new dependencies, use `composer suggest` to see details.</info>'); $this->io->writeError('<info>'.count($suggestedPackages).' package suggestions were added by new dependencies, use `composer suggest` to see details.</info>');
} }
@ -171,7 +181,12 @@ class SuggestedPackagesReporter
return $this; return $this;
} }
private function getFilteredSuggestions(RepositoryInterface $installedRepo = null) /**
* @param InstalledRepository $installedRepo If passed in, suggested packages which are installed already will be skipped
* @param PackageInterface $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package will be shown
* @return array[]
*/
private function getFilteredSuggestions(InstalledRepository $installedRepo = null, PackageInterface $onlyDependentsOf = null)
{ {
$suggestedPackages = $this->getPackages(); $suggestedPackages = $this->getPackages();
$installedNames = array(); $installedNames = array();
@ -184,9 +199,16 @@ class SuggestedPackagesReporter
} }
} }
$sourceFilter = array();
if ($onlyDependentsOf) {
$sourceFilter = array_map(function ($link) {
return $link->getTarget();
}, array_merge($onlyDependentsOf->getRequires(), $onlyDependentsOf->getDevRequires()));
}
$suggestions = array(); $suggestions = array();
foreach ($suggestedPackages as $suggestion) { foreach ($suggestedPackages as $suggestion) {
if (in_array($suggestion['target'], $installedNames)) { if (in_array($suggestion['target'], $installedNames) || ($sourceFilter && !in_array($suggestion['source'], $sourceFilter))) {
continue; continue;
} }