Merge pull request #10541 from Seldaek/init_req_fixes
Fix issues in require/init when dealing with virtual packages which do not existpull/10542/head
commit
7ee44e6461
|
@ -543,12 +543,6 @@ EOT
|
||||||
$requirement['version'],
|
$requirement['version'],
|
||||||
$requirement['name']
|
$requirement['name']
|
||||||
));
|
));
|
||||||
} else {
|
|
||||||
// check that the specified version/constraint exists before we proceed
|
|
||||||
list($name) = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $platformRepo, $preferredStability, $checkProvidedVersions ? $requirement['version'] : null, 'dev', $fixed);
|
|
||||||
|
|
||||||
// replace package name from packagist.org
|
|
||||||
$requirement['name'] = $name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$result[] = $requirement['name'] . ' ' . $requirement['version'];
|
$result[] = $requirement['name'] . ' ' . $requirement['version'];
|
||||||
|
@ -583,21 +577,9 @@ EOT
|
||||||
}
|
}
|
||||||
$matches = array_values($matches);
|
$matches = array_values($matches);
|
||||||
|
|
||||||
$exactMatch = null;
|
$exactMatch = false;
|
||||||
$choices = array();
|
foreach ($matches as $match) {
|
||||||
foreach ($matches as $position => $foundPackage) {
|
if ($match['name'] === $package) {
|
||||||
$abandoned = '';
|
|
||||||
if (isset($foundPackage['abandoned'])) {
|
|
||||||
if (is_string($foundPackage['abandoned'])) {
|
|
||||||
$replacement = sprintf('Use %s instead', $foundPackage['abandoned']);
|
|
||||||
} else {
|
|
||||||
$replacement = 'No replacement was suggested';
|
|
||||||
}
|
|
||||||
$abandoned = sprintf('<warning>Abandoned. %s.</warning>', $replacement);
|
|
||||||
}
|
|
||||||
|
|
||||||
$choices[] = sprintf(' <info>%5s</info> %s %s', "[$position]", $foundPackage['name'], $abandoned);
|
|
||||||
if ($foundPackage['name'] === $package) {
|
|
||||||
$exactMatch = true;
|
$exactMatch = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -605,6 +587,26 @@ EOT
|
||||||
|
|
||||||
// no match, prompt which to pick
|
// no match, prompt which to pick
|
||||||
if (!$exactMatch) {
|
if (!$exactMatch) {
|
||||||
|
$providers = $this->getRepos()->getProviders($package);
|
||||||
|
if (count($providers) > 0) {
|
||||||
|
array_unshift($matches, array('name' => $package, 'description' => ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
$choices = array();
|
||||||
|
foreach ($matches as $position => $foundPackage) {
|
||||||
|
$abandoned = '';
|
||||||
|
if (isset($foundPackage['abandoned'])) {
|
||||||
|
if (is_string($foundPackage['abandoned'])) {
|
||||||
|
$replacement = sprintf('Use %s instead', $foundPackage['abandoned']);
|
||||||
|
} else {
|
||||||
|
$replacement = 'No replacement was suggested';
|
||||||
|
}
|
||||||
|
$abandoned = sprintf('<warning>Abandoned. %s.</warning>', $replacement);
|
||||||
|
}
|
||||||
|
|
||||||
|
$choices[] = sprintf(' <info>%5s</info> %s %s', "[$position]", $foundPackage['name'], $abandoned);
|
||||||
|
}
|
||||||
|
|
||||||
$io->writeError(array(
|
$io->writeError(array(
|
||||||
'',
|
'',
|
||||||
sprintf('Found <info>%s</info> packages matching <info>%s</info>', count($matches), $package),
|
sprintf('Found <info>%s</info> packages matching <info>%s</info>', count($matches), $package),
|
||||||
|
@ -899,7 +901,8 @@ EOT
|
||||||
$platformRequirementFilter = PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs);
|
$platformRequirementFilter = PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs);
|
||||||
|
|
||||||
// find the latest version allowed in this repo set
|
// find the latest version allowed in this repo set
|
||||||
$versionSelector = new VersionSelector($this->getRepositorySet($input, $minimumStability), $platformRepo);
|
$repoSet = $this->getRepositorySet($input, $minimumStability);
|
||||||
|
$versionSelector = new VersionSelector($repoSet, $platformRepo);
|
||||||
$effectiveMinimumStability = $minimumStability ?: $this->getMinimumStability($input);
|
$effectiveMinimumStability = $minimumStability ?: $this->getMinimumStability($input);
|
||||||
|
|
||||||
$package = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, $platformRequirementFilter);
|
$package = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, $platformRequirementFilter);
|
||||||
|
@ -911,6 +914,22 @@ EOT
|
||||||
return array($name, $requiredVersion ?: '*');
|
return array($name, $requiredVersion ?: '*');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if it is a virtual package provided by others
|
||||||
|
$providers = $repoSet->getProviders($name);
|
||||||
|
if (count($providers) > 0) {
|
||||||
|
$constraint = '*';
|
||||||
|
if ($input->isInteractive()) {
|
||||||
|
$constraint = $this->getIO()->askAndValidate('Package "<info>'.$name.'</info>" does not exist but is provided by '.count($providers).' packages. Which version constraint would you like to use? [<info>*</info>] ', function ($value) {
|
||||||
|
$parser = new VersionParser();
|
||||||
|
$parser->parseConstraints($value);
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}, 3, '*');
|
||||||
|
}
|
||||||
|
|
||||||
|
return array($name, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
// Check whether the package requirements were the problem
|
// Check whether the package requirements were the problem
|
||||||
if (!($platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter) && ($candidate = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, PlatformRequirementFilterFactory::ignoreAll()))) {
|
if (!($platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter) && ($candidate = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, PlatformRequirementFilterFactory::ignoreAll()))) {
|
||||||
throw new \InvalidArgumentException(sprintf(
|
throw new \InvalidArgumentException(sprintf(
|
||||||
|
|
Loading…
Reference in New Issue