Prechádzať zdrojové kódy

Fixed validator to accept 'a/b' and 'a/b ~2.3'

Wouter J 10 rokov pred
rodič
commit
3bf1ee939b
1 zmenil súbory, kde vykonal 19 pridanie a 8 odobranie
  1. 19 8
      src/Composer/Command/InitCommand.php

+ 19 - 8
src/Composer/Command/InitCommand.php

@@ -328,6 +328,7 @@ EOT
             return $result;
         }
 
+        $versionParser = new VersionParser();
         while (null !== $package = $dialog->ask($output, $prompt)) {
             $matches = $this->findPackages($package);
 
@@ -353,22 +354,32 @@ EOT
                     $output->writeln($choices);
                     $output->writeln('');
 
-                    $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<name>[\S/]+)(?:\s+(?P<version>\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);