1
0
Fork 0

Explicitly deprecate misuse of the link setters to enforce the fact they expect maps (#10281)

pull/10286/head
Jordi Boggiano 2021-11-12 21:38:08 +01:00 committed by GitHub
parent 903173ead5
commit 65765a148a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 84 additions and 40 deletions

View File

@ -364,7 +364,8 @@ class ArrayLoader implements LoaderInterface
{ {
$res = array(); $res = array();
foreach ($links as $target => $constraint) { foreach ($links as $target => $constraint) {
$res[strtolower($target)] = $this->createLink($source, $sourceVersion, $description, $target, $constraint); $target = strtolower($target);
$res[$target] = $this->createLink($source, $sourceVersion, $description, $target, $constraint);
} }
return $res; return $res;

View File

@ -456,6 +456,10 @@ class Package extends BasePackage
*/ */
public function setRequires(array $requires) public function setRequires(array $requires)
{ {
if (isset($requires[0])) {
$requires = $this->convertLinksToMap($requires, 'setRequires');
}
$this->requires = $requires; $this->requires = $requires;
} }
@ -476,6 +480,10 @@ class Package extends BasePackage
*/ */
public function setConflicts(array $conflicts) public function setConflicts(array $conflicts)
{ {
if (isset($conflicts[0])) {
$conflicts = $this->convertLinksToMap($conflicts, 'setConflicts');
}
$this->conflicts = $conflicts; $this->conflicts = $conflicts;
} }
@ -497,6 +505,10 @@ class Package extends BasePackage
*/ */
public function setProvides(array $provides) public function setProvides(array $provides)
{ {
if (isset($provides[0])) {
$provides = $this->convertLinksToMap($provides, 'setProvides');
}
$this->provides = $provides; $this->provides = $provides;
} }
@ -518,6 +530,10 @@ class Package extends BasePackage
*/ */
public function setReplaces(array $replaces) public function setReplaces(array $replaces)
{ {
if (isset($replaces[0])) {
$replaces = $this->convertLinksToMap($replaces, 'setReplaces');
}
$this->replaces = $replaces; $this->replaces = $replaces;
} }
@ -539,6 +555,10 @@ class Package extends BasePackage
*/ */
public function setDevRequires(array $devRequires) public function setDevRequires(array $devRequires)
{ {
if (isset($devRequires[0])) {
$devRequires = $this->convertLinksToMap($devRequires, 'setDevRequires');
}
$this->devRequires = $devRequires; $this->devRequires = $devRequires;
} }
@ -752,4 +772,20 @@ class Package extends BasePackage
return $urls; return $urls;
} }
/**
* @param array<int, Link> $links
* @param string $source
* @return array<string, Link>
*/
private function convertLinksToMap(array $links, $source)
{
trigger_error('Package::'.$source.' must be called with a map of lowercased package name => Link object, got a indexed array, this is deprecated and you should fix your usage.');
$newLinks = array();
foreach ($links as $link) {
$newLinks[$link->getTarget()] = $link;
}
return $newLinks;
}
} }

View File

@ -249,7 +249,7 @@ interface PackageInterface
* Returns a set of links to packages which need to be installed before * Returns a set of links to packages which need to be installed before
* this package can be installed * this package can be installed
* *
* @return array<string, Link> An array of package links defining required packages * @return array<string, Link> A map of package links defining required packages, indexed by the require package's name
*/ */
public function getRequires(); public function getRequires();
@ -281,7 +281,7 @@ interface PackageInterface
* Returns a set of links to packages which are required to develop * Returns a set of links to packages which are required to develop
* this package. These are installed if in dev mode. * this package. These are installed if in dev mode.
* *
* @return array<string, Link> An array of package links defining packages required for development * @return array<string, Link> A map of package links defining packages required for development, indexed by the require package's name
*/ */
public function getDevRequires(); public function getDevRequires();

View File

@ -616,11 +616,18 @@ class PlatformRepository extends ArrayRepository
$lib = new CompletePackage('lib-'.$name, $version, $prettyVersion); $lib = new CompletePackage('lib-'.$name, $version, $prettyVersion);
$lib->setDescription($description); $lib->setDescription($description);
$links = function ($alias) use ($name, $version, $lib) { $replaceLinks = array();
return new Link('lib-'.$name, 'lib-'.$alias, new Constraint('=', $version), Link::TYPE_REPLACE, $lib->getPrettyVersion()); foreach ($replaces as $replace) {
}; $replace = strtolower($replace);
$lib->setReplaces(array_map($links, $replaces)); $replaceLinks[$replace] = new Link('lib-'.$name, 'lib-'.$replace, new Constraint('=', $version), Link::TYPE_REPLACE, $lib->getPrettyVersion());
$lib->setProvides(array_map($links, $provides)); }
$provideLinks = array();
foreach ($provides as $provide) {
$provide = strtolower($provide);
$provideLinks[$provide] = new Link('lib-'.$name, 'lib-'.$provide, new Constraint('=', $version), Link::TYPE_PROVIDE, $lib->getPrettyVersion());
}
$lib->setReplaces($replaceLinks);
$lib->setProvides($provideLinks);
$this->addPackage($lib); $this->addPackage($lib);
} }

View File

@ -1754,42 +1754,42 @@ EOF;
return array( return array(
'Typical project requirements' => array( 'Typical project requirements' => array(
array( array(
new Link('a', 'php', $versionParser->parseConstraints('^7.2')), 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2')),
new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')),
new Link('a', 'ext-json', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')),
), ),
'typical', 'typical',
), ),
'No PHP lower bound' => array( 'No PHP lower bound' => array(
array( array(
new Link('a', 'php', $versionParser->parseConstraints('< 8')), 'php' => new Link('a', 'php', $versionParser->parseConstraints('< 8')),
), ),
null, null,
), ),
'No PHP upper bound' => array( 'No PHP upper bound' => array(
array( array(
new Link('a', 'php', $versionParser->parseConstraints('>= 7.2')), 'php' => new Link('a', 'php', $versionParser->parseConstraints('>= 7.2')),
), ),
'no_php_upper_bound', 'no_php_upper_bound',
), ),
'Specific PHP release version' => array( 'Specific PHP release version' => array(
array( array(
new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')), 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')),
), ),
'specific_php_release', 'specific_php_release',
), ),
'No PHP required' => array( 'No PHP required' => array(
array( array(
new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')),
new Link('a', 'ext-json', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')),
), ),
'no_php_required', 'no_php_required',
), ),
'Ignoring all platform requirements skips check completely' => array( 'Ignoring all platform requirements skips check completely' => array(
array( array(
new Link('a', 'php', $versionParser->parseConstraints('^7.2')), 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2')),
new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')),
new Link('a', 'ext-json', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')),
), ),
null, null,
array(), array(),
@ -1798,10 +1798,10 @@ EOF;
), ),
'Ignored platform requirements are not checked for' => array( 'Ignored platform requirements are not checked for' => array(
array( array(
new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')), 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')),
new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')),
new Link('a', 'ext-json', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')),
new Link('a', 'ext-pdo', $versionParser->parseConstraints('*')), 'ext-pdo' => new Link('a', 'ext-pdo', $versionParser->parseConstraints('*')),
), ),
'no_php_required', 'no_php_required',
array(), array(),
@ -1810,12 +1810,12 @@ EOF;
), ),
'Via wildcard ignored platform requirements are not checked for' => array( 'Via wildcard ignored platform requirements are not checked for' => array(
array( array(
new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')), 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')),
new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')),
new Link('a', 'ext-json', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')),
new Link('a', 'ext-fileinfo', $versionParser->parseConstraints('*')), 'ext-fileinfo' => new Link('a', 'ext-fileinfo', $versionParser->parseConstraints('*')),
new Link('a', 'ext-filesystem', $versionParser->parseConstraints('*')), 'ext-filesystem' => new Link('a', 'ext-filesystem', $versionParser->parseConstraints('*')),
new Link('a', 'ext-filter', $versionParser->parseConstraints('*')), 'ext-filter' => new Link('a', 'ext-filter', $versionParser->parseConstraints('*')),
), ),
'no_php_required', 'no_php_required',
array(), array(),
@ -1824,26 +1824,26 @@ EOF;
), ),
'No extensions required' => array( 'No extensions required' => array(
array( array(
new Link('a', 'php', $versionParser->parseConstraints('^7.2')), 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2')),
), ),
'no_extensions_required', 'no_extensions_required',
), ),
'Replaced/provided extensions are not checked for + checking case insensitivity' => array( 'Replaced/provided extensions are not checked for + checking case insensitivity' => array(
array( array(
new Link('a', 'ext-xml', $versionParser->parseConstraints('^7.2')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('^7.2')),
new Link('a', 'ext-Pdo', $versionParser->parseConstraints('^7.2')), 'ext-pdo' => new Link('a', 'ext-Pdo', $versionParser->parseConstraints('^7.2')),
new Link('a', 'ext-bcMath', $versionParser->parseConstraints('^7.2')), 'ext-bcmath' => new Link('a', 'ext-bcMath', $versionParser->parseConstraints('^7.2')),
), ),
'replaced_provided_exts', 'replaced_provided_exts',
array( array(
// constraint does not satisfy all the ^7.2 requirement so we do not accept it as being replaced // constraint does not satisfy all the ^7.2 requirement so we do not accept it as being replaced
new Link('a', 'ext-PDO', $versionParser->parseConstraints('7.1.*')), 'ext-pdo' => new Link('a', 'ext-PDO', $versionParser->parseConstraints('7.1.*')),
// valid replace of bcmath so no need to check for it // valid replace of bcmath so no need to check for it
new Link('a', 'ext-BCMath', $versionParser->parseConstraints('^7.1')), 'ext-bcmath' => new Link('a', 'ext-BCMath', $versionParser->parseConstraints('^7.1')),
), ),
array( array(
// valid provide of ext-xml so no need to check for it // valid provide of ext-xml so no need to check for it
new Link('a', 'ext-XML', $versionParser->parseConstraints('*')), 'ext-xml' => new Link('a', 'ext-XML', $versionParser->parseConstraints('*')),
), ),
), ),
); );

View File

@ -215,13 +215,13 @@ class SolverTest extends TestCase
$this->repo->addPackage($extForPhp80 = $this->getPackage('ourcustom/ext-foobar', '1.0')); $this->repo->addPackage($extForPhp80 = $this->getPackage('ourcustom/ext-foobar', '1.0'));
$extForPhp74->setRequires(array( $extForPhp74->setRequires(array(
'php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array( 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array(
$this->getVersionConstraint('>=', '7.4.0'), $this->getVersionConstraint('>=', '7.4.0'),
$this->getVersionConstraint('<', '7.5.0'), $this->getVersionConstraint('<', '7.5.0'),
)), Link::TYPE_REQUIRE), )), Link::TYPE_REQUIRE),
)); ));
$extForPhp80->setRequires(array( $extForPhp80->setRequires(array(
'php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array( 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array(
$this->getVersionConstraint('>=', '8.0.0'), $this->getVersionConstraint('>=', '8.0.0'),
$this->getVersionConstraint('<', '8.1.0'), $this->getVersionConstraint('<', '8.1.0'),
)), Link::TYPE_REQUIRE), )), Link::TYPE_REQUIRE),
@ -264,13 +264,13 @@ class SolverTest extends TestCase
$this->repo->addPackage($extForPhp74 = $this->getPackage('ourcustom/ext-foobar', '1.0')); $this->repo->addPackage($extForPhp74 = $this->getPackage('ourcustom/ext-foobar', '1.0'));
$extForPhp80->setRequires(array( $extForPhp80->setRequires(array(
'php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array( 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array(
$this->getVersionConstraint('>=', '8.0.0'), $this->getVersionConstraint('>=', '8.0.0'),
$this->getVersionConstraint('<', '8.1.0'), $this->getVersionConstraint('<', '8.1.0'),
)), Link::TYPE_REQUIRE), )), Link::TYPE_REQUIRE),
)); ));
$extForPhp74->setRequires(array( $extForPhp74->setRequires(array(
'php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array( 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array(
$this->getVersionConstraint('>=', '7.4.0'), $this->getVersionConstraint('>=', '7.4.0'),
$this->getVersionConstraint('<', '7.5.0'), $this->getVersionConstraint('<', '7.5.0'),
)), Link::TYPE_REQUIRE), )), Link::TYPE_REQUIRE),