Ver Fonte

Merge remote-tracking branch 'lulco/search-similar-package'

Jordi Boggiano há 7 anos atrás
pai
commit
b94d55d1a9
1 ficheiros alterados com 21 adições e 3 exclusões
  1. 21 3
      src/Composer/Command/InitCommand.php

+ 21 - 3
src/Composer/Command/InitCommand.php

@@ -13,20 +13,20 @@
 namespace Composer\Command;
 
 use Composer\DependencyResolver\Pool;
-use Composer\Json\JsonFile;
 use Composer\Factory;
-use Composer\Repository\RepositoryFactory;
+use Composer\Json\JsonFile;
 use Composer\Package\BasePackage;
 use Composer\Package\Version\VersionParser;
 use Composer\Package\Version\VersionSelector;
 use Composer\Repository\CompositeRepository;
 use Composer\Repository\PlatformRepository;
+use Composer\Repository\RepositoryFactory;
 use Composer\Util\ProcessExecutor;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Process\Process;
 use Symfony\Component\Process\ExecutableFinder;
+use Symfony\Component\Process\Process;
 
 /**
  * @author Justin Rainbow <justin.rainbow@gmail.com>
@@ -644,6 +644,14 @@ EOT
                     'Could not find package %s at any version matching your PHP version %s', $name, $phpVersion
                 ));
             }
+            $similar = $this->findSimilar($name);
+            if ($similar) {
+                throw new \InvalidArgumentException(sprintf(
+                    "Could not find package %s.\n\nDid you mean " . (count($similar) > 1 ? 'one of these' : 'this') . "?\n    %s",
+                    $name,
+                    implode("\n    ", $similar)
+                ));
+            }
             throw new \InvalidArgumentException(sprintf(
                 'Could not find package %s at any version for your minimum-stability (%s). Check the package spelling or your minimum-stability',
                 $name,
@@ -653,4 +661,14 @@ EOT
 
         return $versionSelector->findRecommendedRequireVersion($package);
     }
+
+    private function findSimilar($package)
+    {
+        $results = $this->repos->search($package);
+        foreach ($results as $result) {
+            $similarPackages[$result['name']] = levenshtein($package, $result['name']);
+        }
+        asort($similarPackages);
+        return array_keys(array_slice($similarPackages, 0, 5));
+    }
 }