diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index 7f146c2e5..e8826687a 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -329,6 +329,7 @@ EOT return $result; } + $versionParser = new VersionParser(); while (null !== $package = $dialog->ask($output, $prompt)) { $matches = $this->findPackages($package); @@ -354,22 +355,32 @@ EOT $this->getIO()->writeError($choices); $this->getIO()->writeError(''); - $validator = function ($selection) use ($matches) { + $validator = function ($selection) use ($matches, $versionParser) { if ('' === $selection) { return false; } - if (!is_numeric($selection) && preg_match('{^\s*(\S+)\s+(\S.*)\s*$}', $selection, $matches)) { - return $matches[1].' '.$matches[2]; - } + if (is_numeric($selection) && isset($matches[(int) $selection])) { + $package = $matches[(int) $selection]; - if (!isset($matches[(int) $selection])) { - throw new \Exception('Not a valid selection'); + return $package['name']; } - $package = $matches[(int) $selection]; + if (preg_match('{^\s*(?P[\S/]+)(?:\s+(?P\S+))?\s*$}', $selection, $packageMatches)) { + if (isset($packageMatches['version'])) { + // parsing `acme/example ~2.3` + + // validate version constraint + $versionParser->parseConstraints($packageMatches['version']); + + return $packageMatches['name'].' '.$packageMatches['version']; + } + + // parsing `acme/example` + return $packageMatches['name']; + } - return $package['name']; + throw new \Exception('Not a valid selection'); }; $package = $dialog->askAndValidate($output, $dialog->getQuestion('Enter package # to add, or the complete package name if it is not listed', false, ':'), $validator, 3);