Allow querying InstalledVersions::isInstalled() for no-dev packages

main
Nicolas Grekas 3 years ago
parent 03e8cacd12
commit 7d4501816c

@ -53,13 +53,14 @@ class InstalledVersions
* This also returns true if the package name is provided or replaced by another package * This also returns true if the package name is provided or replaced by another package
* *
* @param string $packageName * @param string $packageName
* @param bool $includeDevRequirements
* @return bool * @return bool
*/ */
public static function isInstalled($packageName) public static function isInstalled($packageName, $includeDevRequirements = true)
{ {
foreach (self::getInstalled() as $installed) { foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) { if (isset($installed['versions'][$packageName])) {
return true; return $includeDevRequirements || empty($installed['versions'][$packageName]['dev-requirement']);
} }
} }
@ -73,10 +74,9 @@ class InstalledVersions
* *
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
* *
* @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param VersionParser $parser Install composer/semver to have access to this class and functionality
* @param string $packageName * @param string $packageName
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
*
* @return bool * @return bool
*/ */
public static function satisfies(VersionParser $parser, $packageName, $constraint) public static function satisfies(VersionParser $parser, $packageName, $constraint)

@ -125,7 +125,7 @@ class FilesystemRepository extends WritableArrayRepository
if ($this->dumpVersions) { if ($this->dumpVersions) {
$versions = $this->generateInstalledVersions($installationManager); $versions = $this->generateInstalledVersions($installationManager, $devMode);
$fs->filePutContentsIfModified($repoDir.'/installed.php', '<?php return '.var_export($versions, true).';'."\n"); $fs->filePutContentsIfModified($repoDir.'/installed.php', '<?php return '.var_export($versions, true).';'."\n");
$installedVersionsClass = file_get_contents(__DIR__.'/../InstalledVersions.php'); $installedVersionsClass = file_get_contents(__DIR__.'/../InstalledVersions.php');
@ -142,12 +142,13 @@ class FilesystemRepository extends WritableArrayRepository
/** /**
* @return ?array * @return ?array
*/ */
private function generateInstalledVersions(InstallationManager $installationManager) private function generateInstalledVersions(InstallationManager $installationManager, $devMode)
{ {
if (!$this->dumpVersions) { if (!$this->dumpVersions) {
return null; return null;
} }
$devPackages = array_flip($this->devPackageNames);
$versions = array('versions' => array()); $versions = array('versions' => array());
$packages = $this->getPackages(); $packages = $this->getPackages();
$packages[] = $rootPackage = $this->rootPackage; $packages[] = $rootPackage = $this->rootPackage;
@ -175,20 +176,28 @@ class FilesystemRepository extends WritableArrayRepository
'version' => $package->getVersion(), 'version' => $package->getVersion(),
'aliases' => array(), 'aliases' => array(),
'reference' => $reference, 'reference' => $reference,
'dev-requirement' => isset($devPackages[$package->getName()]),
); );
if ($package instanceof RootPackageInterface) { if ($package instanceof RootPackageInterface) {
$versions['root'] = $versions['versions'][$package->getName()]; $versions['root'] = $versions['versions'][$package->getName()];
$versions['root']['name'] = $package->getName(); $versions['root']['name'] = $package->getName();
$versions['root']['dev-requirement'] = $devMode;
} }
} }
// add provided/replaced packages // add provided/replaced packages
foreach ($packages as $package) { foreach ($packages as $package) {
$isDevPackage = isset($devPackages[$package->getName()]);
foreach ($package->getReplaces() as $replace) { foreach ($package->getReplaces() as $replace) {
// exclude platform replaces as when they are really there we can not check for their presence // exclude platform replaces as when they are really there we can not check for their presence
if (PlatformRepository::isPlatformPackage($replace->getTarget())) { if (PlatformRepository::isPlatformPackage($replace->getTarget())) {
continue; continue;
} }
if (!isset($versions['versions'][$replace->getTarget()]['dev-requirement'])) {
$versions['versions'][$replace->getTarget()]['dev-requirement'] = $isDevPackage;
} elseif (!$isDevPackage) {
$versions['versions'][$replace->getTarget()]['dev-requirement'] = false;
}
$replaced = $replace->getPrettyConstraint(); $replaced = $replace->getPrettyConstraint();
if ($replaced === 'self.version') { if ($replaced === 'self.version') {
$replaced = $package->getPrettyVersion(); $replaced = $package->getPrettyVersion();
@ -202,6 +211,11 @@ class FilesystemRepository extends WritableArrayRepository
if (PlatformRepository::isPlatformPackage($provide->getTarget())) { if (PlatformRepository::isPlatformPackage($provide->getTarget())) {
continue; continue;
} }
if (!isset($versions['versions'][$provide->getTarget()]['dev-requirement'])) {
$versions['versions'][$provide->getTarget()]['dev-requirement'] = $isDevPackage;
} elseif (!$isDevPackage) {
$versions['versions'][$provide->getTarget()]['dev-requirement'] = false;
}
$provided = $provide->getPrettyConstraint(); $provided = $provide->getPrettyConstraint();
if ($provided === 'self.version') { if ($provided === 'self.version') {
$provided = $package->getPrettyVersion(); $provided = $package->getPrettyVersion();

@ -54,9 +54,9 @@ class InstalledVersionsTest extends TestCase
/** /**
* @dataProvider isInstalledProvider * @dataProvider isInstalledProvider
*/ */
public function testIsInstalled($expected, $name, $constraint = null) public function testIsInstalled($expected, $name, $includeDevRequirements = true)
{ {
$this->assertSame($expected, InstalledVersions::isInstalled($name)); $this->assertSame($expected, InstalledVersions::isInstalled($name, $includeDevRequirements));
} }
public static function isInstalledProvider() public static function isInstalledProvider()
@ -65,10 +65,10 @@ class InstalledVersionsTest extends TestCase
array(true, 'foo/impl'), array(true, 'foo/impl'),
array(true, 'foo/replaced'), array(true, 'foo/replaced'),
array(true, 'c/c'), array(true, 'c/c'),
array(false, 'c/c', false),
array(true, '__root__'), array(true, '__root__'),
array(true, 'b/replacer'), array(true, 'b/replacer'),
array(false, 'not/there'), array(false, 'not/there'),
array(false, 'not/there', '^1.0'),
); );
} }
@ -191,6 +191,7 @@ class InstalledVersionsTest extends TestCase
'1.10.x-dev', '1.10.x-dev',
), ),
'reference' => 'sourceref-by-default', 'reference' => 'sourceref-by-default',
'dev-requirement' => true,
'name' => '__root__', 'name' => '__root__',
), InstalledVersions::getRootPackage()); ), InstalledVersions::getRootPackage());
} }

@ -130,6 +130,7 @@ class FilesystemRepositoryTest extends TestCase
$rootPackage = $this->getAliasPackage($rootPackage, '1.10.x-dev'); $rootPackage = $this->getAliasPackage($rootPackage, '1.10.x-dev');
$repository = new FilesystemRepository($json, true, $rootPackage); $repository = new FilesystemRepository($json, true, $rootPackage);
$repository->setDevPackageNames(array('c/c'));
$pkg = $this->getPackage('a/provider', '1.1'); $pkg = $this->getPackage('a/provider', '1.1');
$this->configureLinks($pkg, array('provide' => array('foo/impl' => '^1.1', 'foo/impl2' => '2.0'))); $this->configureLinks($pkg, array('provide' => array('foo/impl' => '^1.1', 'foo/impl2' => '2.0')));
$pkg->setDistReference('distref-as-no-source'); $pkg->setDistReference('distref-as-no-source');

@ -18,6 +18,7 @@ return array(
'1.10.x-dev', '1.10.x-dev',
), ),
'reference' => 'sourceref-by-default', 'reference' => 'sourceref-by-default',
'dev-requirement' => true,
'name' => '__root__', 'name' => '__root__',
), ),
'versions' => array( 'versions' => array(
@ -28,12 +29,14 @@ return array(
'1.10.x-dev', '1.10.x-dev',
), ),
'reference' => 'sourceref-by-default', 'reference' => 'sourceref-by-default',
'dev-requirement' => false,
), ),
'a/provider' => array( 'a/provider' => array(
'pretty_version' => '1.1', 'pretty_version' => '1.1',
'version' => '1.1.0.0', 'version' => '1.1.0.0',
'aliases' => array(), 'aliases' => array(),
'reference' => 'distref-as-no-source', 'reference' => 'distref-as-no-source',
'dev-requirement' => false,
), ),
'a/provider2' => array( 'a/provider2' => array(
'pretty_version' => '1.2', 'pretty_version' => '1.2',
@ -42,20 +45,24 @@ return array(
'1.4', '1.4',
), ),
'reference' => 'distref-as-installed-from-dist', 'reference' => 'distref-as-installed-from-dist',
'dev-requirement' => false,
), ),
'b/replacer' => array( 'b/replacer' => array(
'pretty_version' => '2.2', 'pretty_version' => '2.2',
'version' => '2.2.0.0', 'version' => '2.2.0.0',
'aliases' => array(), 'aliases' => array(),
'reference' => null, 'reference' => null,
'dev-requirement' => false,
), ),
'c/c' => array( 'c/c' => array(
'pretty_version' => '3.0', 'pretty_version' => '3.0',
'version' => '3.0.0.0', 'version' => '3.0.0.0',
'aliases' => array(), 'aliases' => array(),
'reference' => null, 'reference' => null,
'dev-requirement' => true,
), ),
'foo/impl' => array( 'foo/impl' => array(
'dev-requirement' => false,
'provided' => array( 'provided' => array(
'^1.1', '^1.1',
'1.2', '1.2',
@ -64,6 +71,7 @@ return array(
), ),
), ),
'foo/impl2' => array( 'foo/impl2' => array(
'dev-requirement' => false,
'provided' => array( 'provided' => array(
'2.0', '2.0',
), ),
@ -72,6 +80,7 @@ return array(
), ),
), ),
'foo/replaced' => array( 'foo/replaced' => array(
'dev-requirement' => false,
'replaced' => array( 'replaced' => array(
'^3.0', '^3.0',
), ),

@ -17,4 +17,5 @@ if (function_exists('date_default_timezone_set') && function_exists('date_defaul
} }
require __DIR__.'/../src/bootstrap.php'; require __DIR__.'/../src/bootstrap.php';
require __DIR__.'/../src/Composer/InstalledVersions.php';
require __DIR__.'/Composer/Test/TestCase.php'; require __DIR__.'/Composer/Test/TestCase.php';

Loading…
Cancel
Save