Show number of additional suggestions when not using --all, fixes #8788
parent
d6a9d78309
commit
fa14cd1353
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue