From 1efe02f2e1e93cc6b998e03143815bbe393169aa Mon Sep 17 00:00:00 2001 From: Michal Lulco Date: Mon, 11 Sep 2017 21:29:00 +0200 Subject: [PATCH] Search similar package when package could not be found --- src/Composer/Command/InitCommand.php | 31 +++++++--------------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index cfff0fe29..96862c473 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -649,9 +649,9 @@ EOT $similar = $this->findSimilar($name); if ($similar) { throw new \InvalidArgumentException(sprintf( - 'Could not find package %s. Did you mean: %s ?', + "Could not find package %s.\n\nDid you mean " . (count($similar) > 1 ? 'one of these' : 'this') . "?\n %s", $name, - $similar + implode("\n ", $similar) )); } throw new \InvalidArgumentException(sprintf( @@ -666,28 +666,11 @@ EOT private function findSimilar($package) { - $registeredPackages = $this->getPackages(); - $min = (strlen($package) / 4 + 1) * 10 + .1; - $similar = null; - foreach ($registeredPackages as $registeredPackage) { - $levenshtein = levenshtein($package, $registeredPackage, 10, 11, 10); - if ($levenshtein < $min) { - $min = $levenshtein; - $similar = $registeredPackage; - } - } - return $similar; - } - - private function getPackages() - { - $packages = array(); - foreach ($this->repos->getRepositories() as $repository) { - $repositoryPackages = $repository instanceof ComposerRepository ? $repository->getProviderNames() : $repository->getPackages(); - foreach ($repositoryPackages as $repositoryPackage) { - $packages[] = $repositoryPackage instanceof PackageInterface ? $repositoryPackage->getName() : $repositoryPackage; - } + $results = $this->repos->search($package); + foreach ($results as $result) { + $similarPackages[$result['name']] = levenshtein($package, $result['name']); } - return $packages; + asort($similarPackages); + return array_keys(array_slice($similarPackages, 0, 5)); } }