diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index aa7213060..ba1cbda28 100644 --- a/src/Composer/Command/InitCommand.php +++ b/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 @@ -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)); + } }