From a8abdd96392bfc8aa293be98f3c936e58b8e2881 Mon Sep 17 00:00:00 2001 From: xy2z Date: Sat, 12 Oct 2019 22:22:27 +0200 Subject: [PATCH 1/3] Hide installed packages from suggestions when package is not found --- src/Composer/Command/InitCommand.php | 6 ++++++ src/Composer/Repository/ArrayRepository.php | 14 ++++++++++++++ src/Composer/Repository/CompositeRepository.php | 15 +++++++++++++++ src/Composer/Repository/RepositoryInterface.php | 9 +++++++++ 4 files changed, 44 insertions(+) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index f4d6d99d3..7efdff049 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -792,7 +792,13 @@ EOT } $similarPackages = array(); + $installedRepo = $this->getComposer()->getRepositoryManager()->getLocalRepository(); + foreach ($results as $result) { + if ($installedRepo->hasPackageName($result['name'])) { + // Ignore installed package + continue; + } $similarPackages[$result['name']] = levenshtein($package, $result['name']); } asort($similarPackages); diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index 4f0409a60..4cfbe42f9 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -132,6 +132,20 @@ class ArrayRepository extends BaseRepository return false; } + /** + * {@inheritDoc} + */ + public function hasPackageName(string $packageName) + { + foreach ($this->getPackages() as $repoPackage) { + if ($packageName === $repoPackage->getName()) { + return true; + } + } + + return false; + } + /** * Adds a new package to the repository * diff --git a/src/Composer/Repository/CompositeRepository.php b/src/Composer/Repository/CompositeRepository.php index ce57504f0..c19a04a7b 100644 --- a/src/Composer/Repository/CompositeRepository.php +++ b/src/Composer/Repository/CompositeRepository.php @@ -64,6 +64,21 @@ class CompositeRepository extends BaseRepository return false; } + /** + * {@inheritdoc} + */ + public function hasPackageName(string $packageName) + { + foreach ($this->repositories as $repository) { + /* @var $repository RepositoryInterface */ + if ($repository->hasPackageName($packageName)) { + return true; + } + } + + return false; + } + /** * {@inheritdoc} */ diff --git a/src/Composer/Repository/RepositoryInterface.php b/src/Composer/Repository/RepositoryInterface.php index 9a2aaf3b5..8e1717fce 100644 --- a/src/Composer/Repository/RepositoryInterface.php +++ b/src/Composer/Repository/RepositoryInterface.php @@ -35,6 +35,15 @@ interface RepositoryInterface extends \Countable */ public function hasPackage(PackageInterface $package); + /** + * Checks if specified package name is registered (installed). + * + * @param string $package_name package name (vendor/project) + * + * @return bool + */ + public function hasPackageName(string $packageName); + /** * Searches for the first match of a package by name and version. * From 1a0d5dfacd3c0fdafcd4a120ee0b4ae0df5dbed7 Mon Sep 17 00:00:00 2001 From: xy2z Date: Thu, 24 Oct 2019 15:13:17 +0200 Subject: [PATCH 2/3] Now using findPackage() instead of HasPackageName() --- src/Composer/Command/InitCommand.php | 2 +- src/Composer/Repository/ArrayRepository.php | 14 -------------- src/Composer/Repository/CompositeRepository.php | 15 --------------- src/Composer/Repository/RepositoryInterface.php | 9 --------- 4 files changed, 1 insertion(+), 39 deletions(-) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index 7efdff049..d50e90c4e 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -795,7 +795,7 @@ EOT $installedRepo = $this->getComposer()->getRepositoryManager()->getLocalRepository(); foreach ($results as $result) { - if ($installedRepo->hasPackageName($result['name'])) { + if ($installedRepo->findPackage($result['name'], '*')) { // Ignore installed package continue; } diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index 4cfbe42f9..4f0409a60 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -132,20 +132,6 @@ class ArrayRepository extends BaseRepository return false; } - /** - * {@inheritDoc} - */ - public function hasPackageName(string $packageName) - { - foreach ($this->getPackages() as $repoPackage) { - if ($packageName === $repoPackage->getName()) { - return true; - } - } - - return false; - } - /** * Adds a new package to the repository * diff --git a/src/Composer/Repository/CompositeRepository.php b/src/Composer/Repository/CompositeRepository.php index c19a04a7b..ce57504f0 100644 --- a/src/Composer/Repository/CompositeRepository.php +++ b/src/Composer/Repository/CompositeRepository.php @@ -64,21 +64,6 @@ class CompositeRepository extends BaseRepository return false; } - /** - * {@inheritdoc} - */ - public function hasPackageName(string $packageName) - { - foreach ($this->repositories as $repository) { - /* @var $repository RepositoryInterface */ - if ($repository->hasPackageName($packageName)) { - return true; - } - } - - return false; - } - /** * {@inheritdoc} */ diff --git a/src/Composer/Repository/RepositoryInterface.php b/src/Composer/Repository/RepositoryInterface.php index 8e1717fce..9a2aaf3b5 100644 --- a/src/Composer/Repository/RepositoryInterface.php +++ b/src/Composer/Repository/RepositoryInterface.php @@ -35,15 +35,6 @@ interface RepositoryInterface extends \Countable */ public function hasPackage(PackageInterface $package); - /** - * Checks if specified package name is registered (installed). - * - * @param string $package_name package name (vendor/project) - * - * @return bool - */ - public function hasPackageName(string $packageName); - /** * Searches for the first match of a package by name and version. * From a91c946e273f673cc4cbe6e5b4f13f58003251b9 Mon Sep 17 00:00:00 2001 From: xy2z Date: Tue, 12 Nov 2019 16:32:04 +0100 Subject: [PATCH 3/3] Hide not-yet installed packages from "require" and "init" suggestions --- src/Composer/Command/InitCommand.php | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index d50e90c4e..d2e2c9e75 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -436,11 +436,40 @@ EOT } $versionParser = new VersionParser(); + + $composer = $this->getComposer(false); + $installedRepo = ($composer) ? $composer->getRepositoryManager()->getLocalRepository() : null; $io = $this->getIO(); while (null !== $package = $io->ask('Search for a package: ')) { $matches = $this->findPackages($package); if (count($matches)) { + // Exclude existing packages + $existingPackages = []; + foreach ($matches as $position => $foundPackage) { + if ($installedRepo && $installedRepo->findPackage($foundPackage['name'], '*')) { + $existingPackages[] = $position; + continue; + } + + foreach ($requires as $requiredPackage) { + $existingPackageName = substr($requiredPackage, 0, strpos($requiredPackage, ' ')); + + if ($foundPackage['name'] == $existingPackageName) { + $existingPackages[] = $position; + break; + } + } + } + + // Remove existing packages from search results. + if (!empty($existingPackages)) { + foreach ($existingPackages as $position) { + unset($matches[$position]); + } + $matches = array_values($matches); + } + $exactMatch = null; $choices = array(); foreach ($matches as $position => $foundPackage) {