Skip to content

Commit

Permalink
fixed error message when an alias cannot be resolved to a package
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed Apr 6, 2017
1 parent 07ddfbb commit b8bcfaf
Showing 1 changed file with 38 additions and 2 deletions.
40 changes: 38 additions & 2 deletions src/PackageResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public function __construct(Downloader $downloader)

public function resolve(array $arguments = [])
{
$versionParser = new VersionParser();

// first pass split on : and = to separate package names and versions
$explodedArguments = [];
foreach ($arguments as $argument) {
Expand All @@ -49,8 +51,15 @@ public function resolve(array $arguments = [])
self::$aliases = $this->downloader->getContents('/aliases.json');
}

while (isset(self::$aliases[$argument])) {
if (isset(self::$aliases[$argument])) {
$argument = self::$aliases[$argument];
} else {
// is it a version or an alias that does not exist?
try {
$versionParser->parseConstraints($argument);
} catch (\UnexpectedValueException $e) {
$this->throwAlternatives($argument);
}
}
}

Expand All @@ -59,7 +68,7 @@ public function resolve(array $arguments = [])

// third pass to resolve versions
$requires= [];
foreach ((new VersionParser())->parseNameVersionPairs($packages) as $package) {
foreach ($versionParser->parseNameVersionPairs($packages) as $package) {
$requires[] = $package['name'].$this->parseVersion($package['name'], $package['version'] ?? null);
}

Expand Down Expand Up @@ -88,4 +97,31 @@ private function parseVersion($package, $version)

return ':'.$version;
}

private function throwAlternatives($argument)
{
$alternatives = [];
foreach (self::$aliases as $alias => $package) {
$lev = levenshtein($argument, $alias);
if ($lev <= strlen($argument) / 3 || false !== strpos($alias, $argument)) {
$alternatives[$package][] = $alias;
}
}

if ($alternatives) {
$message = sprintf('"%s" is not a valid alias. ', $argument);
if (1 == count($alternatives)) {
$message .= "Did you mean this:\n";
} else {
$message .= "Did you mean one of these:\n";
}
foreach ($alternatives as $package => $aliases) {
$message .= sprintf(" \"%s\", supported aliases: \"%s\"\n", $package, implode('", "', $aliases));
}
} else {
$message = sprintf('Could not parse version constraint "%s".', $argument);
}

throw new \UnexpectedValueException($message);
}
}

0 comments on commit b8bcfaf

Please sign in to comment.