Merge pull request #9699 from ochorocho/improve-installed-versions-9648
Add install-path and type to installedVersions.php and installed.php,…pull/9912/head
commit
da3d5e3143
|
@ -27,6 +27,14 @@ The main use cases for this class are the following:
|
||||||
\Composer\InstalledVersions::isInstalled('psr/log-implementation'); // returns bool
|
\Composer\InstalledVersions::isInstalled('psr/log-implementation'); // returns bool
|
||||||
```
|
```
|
||||||
|
|
||||||
|
As of Composer 2.1, you may also check if something was installed via require-dev or not by
|
||||||
|
passing false as second argument:
|
||||||
|
|
||||||
|
```php
|
||||||
|
\Composer\InstalledVersions::isInstalled('vendor/package'); // returns true assuming this package is installed
|
||||||
|
\Composer\InstalledVersions::isInstalled('vendor/package', false); // returns true if vendor/package is in require, false if in require-dev
|
||||||
|
```
|
||||||
|
|
||||||
Note that this can not be used to check whether platform packages are installed.
|
Note that this can not be used to check whether platform packages are installed.
|
||||||
|
|
||||||
### Knowing whether package X is installed in version Y
|
### Knowing whether package X is installed in version Y
|
||||||
|
@ -89,6 +97,35 @@ possible for safety.
|
||||||
A few other methods are available for more complex usages, please refer to the
|
A few other methods are available for more complex usages, please refer to the
|
||||||
source/docblocks of [the class itself](https://github.com/composer/composer/blob/master/src/Composer/InstalledVersions.php).
|
source/docblocks of [the class itself](https://github.com/composer/composer/blob/master/src/Composer/InstalledVersions.php).
|
||||||
|
|
||||||
|
### Knowing the path in which a package is installed
|
||||||
|
|
||||||
|
The `getInstallPath` method to retrieve a package's absolute install path.
|
||||||
|
|
||||||
|
```php
|
||||||
|
// returns an absolute path to the package installation location if vendor/package is installed,
|
||||||
|
// or null if it is provided/replaced, or the package is a metapackage
|
||||||
|
// or throws OutOfBoundsException if the package is not installed at all
|
||||||
|
\Composer\InstalledVersions::getInstallPath('vendor/package');
|
||||||
|
```
|
||||||
|
|
||||||
|
> Available as of Composer 2.1 (i.e. `composer-runtime-api ^2.1`)
|
||||||
|
|
||||||
|
### Knowing which packages of a given type are installed
|
||||||
|
|
||||||
|
The `getInstalledPackagesByType` method accepts a package type (e.g. foo-plugin) and lists
|
||||||
|
the packages of that type which are installed. You can then use the methods above to retrieve
|
||||||
|
more information about each package if needed.
|
||||||
|
|
||||||
|
This method should alleviate the need for custom installers placing plugins in a specific path
|
||||||
|
instead of leaving them in the vendor dir. You can then find plugins to initialize at runtime
|
||||||
|
via InstalledVersions, including their paths via getInstallPath if needed.
|
||||||
|
|
||||||
|
```php
|
||||||
|
\Composer\InstalledVersions::getInstalledPackagesByType('foo-plugin');
|
||||||
|
```
|
||||||
|
|
||||||
|
> Available as of Composer 2.1 (i.e. `composer-runtime-api ^2.1`)
|
||||||
|
|
||||||
## Platform check
|
## Platform check
|
||||||
|
|
||||||
composer-runtime-api 2.0 introduced a new `vendor/composer/platform_check.php` file, which
|
composer-runtime-api 2.0 introduced a new `vendor/composer/platform_check.php` file, which
|
||||||
|
|
|
@ -65,7 +65,7 @@ class Composer
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const RUNTIME_API_VERSION = '2.0.0';
|
const RUNTIME_API_VERSION = '2.1.0';
|
||||||
|
|
||||||
public static function getVersion()
|
public static function getVersion()
|
||||||
{
|
{
|
||||||
|
|
|
@ -48,6 +48,28 @@ class InstalledVersions
|
||||||
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all package names with a specific type e.g. 'library'
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @return string[]
|
||||||
|
* @psalm-return list<string>
|
||||||
|
*/
|
||||||
|
public static function getInstalledPackagesByType($type)
|
||||||
|
{
|
||||||
|
$packagesByType = array();
|
||||||
|
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
foreach ($installed['versions'] as $name => $package) {
|
||||||
|
if (isset($package['type']) && $package['type'] === $type) {
|
||||||
|
$packagesByType[] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $packagesByType;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the given package is installed
|
* Checks whether the given package is installed
|
||||||
*
|
*
|
||||||
|
@ -61,7 +83,7 @@ class InstalledVersions
|
||||||
{
|
{
|
||||||
foreach (self::getInstalled() as $installed) {
|
foreach (self::getInstalled() as $installed) {
|
||||||
if (isset($installed['versions'][$packageName])) {
|
if (isset($installed['versions'][$packageName])) {
|
||||||
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev-requirement']);
|
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,9 +209,26 @@ class InstalledVersions
|
||||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
|
||||||
|
*/
|
||||||
|
public static function getInstallPath($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array
|
* @return array
|
||||||
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool}
|
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}
|
||||||
*/
|
*/
|
||||||
public static function getRootPackage()
|
public static function getRootPackage()
|
||||||
{
|
{
|
||||||
|
@ -203,12 +242,16 @@ class InstalledVersions
|
||||||
*
|
*
|
||||||
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
||||||
* @return array[]
|
* @return array[]
|
||||||
* @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool}, versions: array<string, array{dev-requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[]}>}
|
* @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}
|
||||||
*/
|
*/
|
||||||
public static function getRawData()
|
public static function getRawData()
|
||||||
{
|
{
|
||||||
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
||||||
|
|
||||||
|
if (null === self::$installed) {
|
||||||
|
self::$installed = include __DIR__ . '/installed.php';
|
||||||
|
}
|
||||||
|
|
||||||
return self::$installed;
|
return self::$installed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,7 +259,7 @@ class InstalledVersions
|
||||||
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
||||||
*
|
*
|
||||||
* @return array[]
|
* @return array[]
|
||||||
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}, versions: array<string, array{pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[]}>}>
|
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}>
|
||||||
*/
|
*/
|
||||||
public static function getAllRawData()
|
public static function getAllRawData()
|
||||||
{
|
{
|
||||||
|
@ -239,7 +282,7 @@ class InstalledVersions
|
||||||
* @param array[] $data A vendor/composer/installed.php data set
|
* @param array[] $data A vendor/composer/installed.php data set
|
||||||
* @return void
|
* @return void
|
||||||
*
|
*
|
||||||
* @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool}, versions: array<string, array{dev-requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[]}>} $data
|
* @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>} $data
|
||||||
*/
|
*/
|
||||||
public static function reload($data)
|
public static function reload($data)
|
||||||
{
|
{
|
||||||
|
@ -249,7 +292,7 @@ class InstalledVersions
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array[]
|
* @return array[]
|
||||||
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool}, versions: array<string, array{dev-requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[]}>}>
|
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}>
|
||||||
*/
|
*/
|
||||||
private static function getInstalled()
|
private static function getInstalled()
|
||||||
{
|
{
|
||||||
|
@ -265,10 +308,16 @@ class InstalledVersions
|
||||||
$installed[] = self::$installedByVendor[$vendorDir];
|
$installed[] = self::$installedByVendor[$vendorDir];
|
||||||
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
||||||
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
|
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
|
||||||
|
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
|
||||||
|
self::$installed = $installed[count($installed) - 1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (null === self::$installed) {
|
||||||
|
self::$installed = require __DIR__ . '/installed.php';
|
||||||
|
}
|
||||||
$installed[] = self::$installed;
|
$installed[] = self::$installed;
|
||||||
|
|
||||||
return $installed;
|
return $installed;
|
||||||
|
|
|
@ -14,6 +14,7 @@ namespace Composer\Repository;
|
||||||
|
|
||||||
use Composer\Json\JsonFile;
|
use Composer\Json\JsonFile;
|
||||||
use Composer\Package\Loader\ArrayLoader;
|
use Composer\Package\Loader\ArrayLoader;
|
||||||
|
use Composer\Package\PackageInterface;
|
||||||
use Composer\Package\RootPackageInterface;
|
use Composer\Package\RootPackageInterface;
|
||||||
use Composer\Package\AliasPackage;
|
use Composer\Package\AliasPackage;
|
||||||
use Composer\Package\Dumper\ArrayDumper;
|
use Composer\Package\Dumper\ArrayDumper;
|
||||||
|
@ -102,11 +103,15 @@ class FilesystemRepository extends WritableArrayRepository
|
||||||
$dumper = new ArrayDumper();
|
$dumper = new ArrayDumper();
|
||||||
$fs = new Filesystem();
|
$fs = new Filesystem();
|
||||||
$repoDir = dirname($fs->normalizePath($this->file->getPath()));
|
$repoDir = dirname($fs->normalizePath($this->file->getPath()));
|
||||||
|
$installPaths = array();
|
||||||
|
|
||||||
foreach ($this->getCanonicalPackages() as $package) {
|
foreach ($this->getCanonicalPackages() as $package) {
|
||||||
$pkgArray = $dumper->dump($package);
|
$pkgArray = $dumper->dump($package);
|
||||||
$path = $installationManager->getInstallPath($package);
|
$path = $installationManager->getInstallPath($package);
|
||||||
$pkgArray['install-path'] = ('' !== $path && null !== $path) ? $fs->findShortestPath($repoDir, $fs->isAbsolutePath($path) ? $path : getcwd() . '/' . $path, true) : null;
|
$installPath = ('' !== $path && null !== $path) ? $fs->findShortestPath($repoDir, $fs->isAbsolutePath($path) ? $path : getcwd() . '/' . $path, true) : null;
|
||||||
|
$installPaths[$package->getName()] = $installPath;
|
||||||
|
|
||||||
|
$pkgArray['install-path'] = $installPath;
|
||||||
$data['packages'][] = $pkgArray;
|
$data['packages'][] = $pkgArray;
|
||||||
|
|
||||||
// only write to the files the names which are really installed, as we receive the full list
|
// only write to the files the names which are really installed, as we receive the full list
|
||||||
|
@ -124,24 +129,52 @@ class FilesystemRepository extends WritableArrayRepository
|
||||||
$this->file->write($data);
|
$this->file->write($data);
|
||||||
|
|
||||||
if ($this->dumpVersions) {
|
if ($this->dumpVersions) {
|
||||||
$versions = $this->generateInstalledVersions($installationManager, $devMode);
|
$versions = $this->generateInstalledVersions($installationManager, $installPaths, $devMode, $repoDir);
|
||||||
|
|
||||||
$fs->filePutContentsIfModified($repoDir.'/installed.php', '<?php return '.var_export($versions, true).';'."\n");
|
$fs->filePutContentsIfModified($repoDir.'/installed.php', '<?php return ' . $this->dumpToPhpCode($versions) . ';'."\n");
|
||||||
$installedVersionsClass = file_get_contents(__DIR__.'/../InstalledVersions.php');
|
$installedVersionsClass = file_get_contents(__DIR__.'/../InstalledVersions.php');
|
||||||
// while not strictly needed since https://github.com/composer/composer/pull/9635 - we keep this for BC
|
|
||||||
// and overall broader compatibility with people that may not use Composer's ClassLoader. They can
|
|
||||||
// simply include InstalledVersions.php manually and have it working in a basic way.
|
|
||||||
$installedVersionsClass = str_replace('private static $installed;', 'private static $installed = '.var_export($versions, true).';', $installedVersionsClass);
|
|
||||||
$fs->filePutContentsIfModified($repoDir.'/InstalledVersions.php', $installedVersionsClass);
|
$fs->filePutContentsIfModified($repoDir.'/InstalledVersions.php', $installedVersionsClass);
|
||||||
|
|
||||||
\Composer\InstalledVersions::reload($versions);
|
\Composer\InstalledVersions::reload($versions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function dumpToPhpCode(array $array = array(), $level = 0)
|
||||||
|
{
|
||||||
|
$lines = "array(\n";
|
||||||
|
$level++;
|
||||||
|
|
||||||
|
foreach ($array as $key => $value) {
|
||||||
|
$lines .= str_repeat(' ', $level);
|
||||||
|
$lines .= is_int($key) ? $key . ' => ' : '\'' . $key . '\' => ';
|
||||||
|
|
||||||
|
if (is_array($value)) {
|
||||||
|
if (!empty($value)) {
|
||||||
|
$lines .= $this->dumpToPhpCode($value, $level);
|
||||||
|
} else {
|
||||||
|
$lines .= "array(),\n";
|
||||||
|
}
|
||||||
|
} elseif ($key === 'install_path' && is_string($value)) {
|
||||||
|
$fs = new Filesystem();
|
||||||
|
if ($fs->isAbsolutePath($value)) {
|
||||||
|
$lines .= var_export($value, true) . ",\n";
|
||||||
|
} else {
|
||||||
|
$lines .= "__DIR__ . " . var_export('/' . $value, true) . ",\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$lines .= var_export($value, true) . ",\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$lines .= str_repeat(' ', $level - 1) . ')' . ($level - 1 == 0 ? '' : ",\n");
|
||||||
|
|
||||||
|
return $lines;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return ?array
|
* @return ?array
|
||||||
*/
|
*/
|
||||||
private function generateInstalledVersions(InstallationManager $installationManager, $devMode)
|
private function generateInstalledVersions(InstallationManager $installationManager, array $installPaths, $devMode, $repoDir)
|
||||||
{
|
{
|
||||||
if (!$this->dumpVersions) {
|
if (!$this->dumpVersions) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -170,16 +203,26 @@ class FilesystemRepository extends WritableArrayRepository
|
||||||
$reference = ($package->getSourceReference() ?: $package->getDistReference()) ?: null;
|
$reference = ($package->getSourceReference() ?: $package->getDistReference()) ?: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($package instanceof RootPackageInterface) {
|
||||||
|
$fs = new Filesystem();
|
||||||
|
$to = getcwd();
|
||||||
|
$installPath = $fs->findShortestPath($repoDir, $to, true);
|
||||||
|
} else {
|
||||||
|
$installPath = $installPaths[$package->getName()];
|
||||||
|
}
|
||||||
|
|
||||||
$versions['versions'][$package->getName()] = array(
|
$versions['versions'][$package->getName()] = array(
|
||||||
'pretty_version' => $package->getPrettyVersion(),
|
'pretty_version' => $package->getPrettyVersion(),
|
||||||
'version' => $package->getVersion(),
|
'version' => $package->getVersion(),
|
||||||
|
'type' => $package->getType(),
|
||||||
|
'install_path' => $installPath,
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'reference' => $reference,
|
'reference' => $reference,
|
||||||
'dev-requirement' => isset($devPackages[$package->getName()]),
|
'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()];
|
||||||
unset($versions['root']['dev-requirement']);
|
unset($versions['root']['dev_requirement']);
|
||||||
$versions['root']['name'] = $package->getName();
|
$versions['root']['name'] = $package->getName();
|
||||||
$versions['root']['dev'] = $devMode;
|
$versions['root']['dev'] = $devMode;
|
||||||
}
|
}
|
||||||
|
@ -193,10 +236,10 @@ class FilesystemRepository extends WritableArrayRepository
|
||||||
if (PlatformRepository::isPlatformPackage($replace->getTarget())) {
|
if (PlatformRepository::isPlatformPackage($replace->getTarget())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!isset($versions['versions'][$replace->getTarget()]['dev-requirement'])) {
|
if (!isset($versions['versions'][$replace->getTarget()]['dev_requirement'])) {
|
||||||
$versions['versions'][$replace->getTarget()]['dev-requirement'] = $isDevPackage;
|
$versions['versions'][$replace->getTarget()]['dev_requirement'] = $isDevPackage;
|
||||||
} elseif (!$isDevPackage) {
|
} elseif (!$isDevPackage) {
|
||||||
$versions['versions'][$replace->getTarget()]['dev-requirement'] = false;
|
$versions['versions'][$replace->getTarget()]['dev_requirement'] = false;
|
||||||
}
|
}
|
||||||
$replaced = $replace->getPrettyConstraint();
|
$replaced = $replace->getPrettyConstraint();
|
||||||
if ($replaced === 'self.version') {
|
if ($replaced === 'self.version') {
|
||||||
|
@ -211,10 +254,10 @@ class FilesystemRepository extends WritableArrayRepository
|
||||||
if (PlatformRepository::isPlatformPackage($provide->getTarget())) {
|
if (PlatformRepository::isPlatformPackage($provide->getTarget())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!isset($versions['versions'][$provide->getTarget()]['dev-requirement'])) {
|
if (!isset($versions['versions'][$provide->getTarget()]['dev_requirement'])) {
|
||||||
$versions['versions'][$provide->getTarget()]['dev-requirement'] = $isDevPackage;
|
$versions['versions'][$provide->getTarget()]['dev_requirement'] = $isDevPackage;
|
||||||
} elseif (!$isDevPackage) {
|
} elseif (!$isDevPackage) {
|
||||||
$versions['versions'][$provide->getTarget()]['dev-requirement'] = false;
|
$versions['versions'][$provide->getTarget()]['dev_requirement'] = false;
|
||||||
}
|
}
|
||||||
$provided = $provide->getPrettyConstraint();
|
$provided = $provide->getPrettyConstraint();
|
||||||
if ($provided === 'self.version') {
|
if ($provided === 'self.version') {
|
||||||
|
|
|
@ -17,6 +17,8 @@ use Composer\Semver\VersionParser;
|
||||||
|
|
||||||
class InstalledVersionsTest extends TestCase
|
class InstalledVersionsTest extends TestCase
|
||||||
{
|
{
|
||||||
|
private $root;
|
||||||
|
|
||||||
public static function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
// disable multiple-ClassLoader-based checks of InstalledVersions by making it seem like no
|
// disable multiple-ClassLoader-based checks of InstalledVersions by making it seem like no
|
||||||
|
@ -33,6 +35,9 @@ class InstalledVersionsTest extends TestCase
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
{
|
{
|
||||||
|
$this->root = $this->getUniqueTmpDirectory();
|
||||||
|
|
||||||
|
$dir = $this->root;
|
||||||
InstalledVersions::reload(require __DIR__.'/Repository/Fixtures/installed.php');
|
InstalledVersions::reload(require __DIR__.'/Repository/Fixtures/installed.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +52,7 @@ class InstalledVersionsTest extends TestCase
|
||||||
'foo/impl',
|
'foo/impl',
|
||||||
'foo/impl2',
|
'foo/impl2',
|
||||||
'foo/replaced',
|
'foo/replaced',
|
||||||
|
'meta/package',
|
||||||
);
|
);
|
||||||
$this->assertSame($names, InstalledVersions::getInstalledPackages());
|
$this->assertSame($names, InstalledVersions::getInstalledPackages());
|
||||||
}
|
}
|
||||||
|
@ -69,6 +75,7 @@ class InstalledVersionsTest extends TestCase
|
||||||
array(true, '__root__'),
|
array(true, '__root__'),
|
||||||
array(true, 'b/replacer'),
|
array(true, 'b/replacer'),
|
||||||
array(false, 'not/there'),
|
array(false, 'not/there'),
|
||||||
|
array(true, 'meta/package'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,6 +194,8 @@ class InstalledVersionsTest extends TestCase
|
||||||
$this->assertSame(array(
|
$this->assertSame(array(
|
||||||
'pretty_version' => 'dev-master',
|
'pretty_version' => 'dev-master',
|
||||||
'version' => 'dev-master',
|
'version' => 'dev-master',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => $this->root . '/./',
|
||||||
'aliases' => array(
|
'aliases' => array(
|
||||||
'1.10.x-dev',
|
'1.10.x-dev',
|
||||||
),
|
),
|
||||||
|
@ -198,6 +207,7 @@ class InstalledVersionsTest extends TestCase
|
||||||
|
|
||||||
public function testGetRawData()
|
public function testGetRawData()
|
||||||
{
|
{
|
||||||
|
$dir = $this->root;
|
||||||
$this->assertSame(require __DIR__.'/Repository/Fixtures/installed.php', InstalledVersions::getRawData());
|
$this->assertSame(require __DIR__.'/Repository/Fixtures/installed.php', InstalledVersions::getRawData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,4 +232,24 @@ class InstalledVersionsTest extends TestCase
|
||||||
array(null, 'c/c'),
|
array(null, 'c/c'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetInstalledPackagesByType()
|
||||||
|
{
|
||||||
|
$names = array(
|
||||||
|
'__root__',
|
||||||
|
'a/provider',
|
||||||
|
'a/provider2',
|
||||||
|
'b/replacer',
|
||||||
|
'c/c',
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertSame($names, \Composer\InstalledVersions::getInstalledPackagesByType('library'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetInstallPath()
|
||||||
|
{
|
||||||
|
$this->assertSame(realpath($this->root), realpath(\Composer\InstalledVersions::getInstallPath('__root__')));
|
||||||
|
$this->assertSame('/foo/bar/vendor/c/c', \Composer\InstalledVersions::getInstallPath('c/c'));
|
||||||
|
$this->assertNull(\Composer\InstalledVersions::getInstallPath('foo/impl'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,4 +119,9 @@ class InstallationManagerMock extends InstallationManager
|
||||||
{
|
{
|
||||||
// noop
|
// noop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getInstalledPackagesByType()
|
||||||
|
{
|
||||||
|
return $this->installed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,12 +12,15 @@
|
||||||
|
|
||||||
namespace Composer\Test\Repository;
|
namespace Composer\Test\Repository;
|
||||||
|
|
||||||
|
use Composer\Package\RootPackageInterface;
|
||||||
use Composer\Repository\FilesystemRepository;
|
use Composer\Repository\FilesystemRepository;
|
||||||
use Composer\Test\TestCase;
|
use Composer\Test\TestCase;
|
||||||
use Composer\Json\JsonFile;
|
use Composer\Json\JsonFile;
|
||||||
|
|
||||||
class FilesystemRepositoryTest extends TestCase
|
class FilesystemRepositoryTest extends TestCase
|
||||||
{
|
{
|
||||||
|
private $root;
|
||||||
|
|
||||||
public function testRepositoryRead()
|
public function testRepositoryRead()
|
||||||
{
|
{
|
||||||
$json = $this->createJsonFileMock();
|
$json = $this->createJsonFileMock();
|
||||||
|
@ -121,6 +124,9 @@ class FilesystemRepositoryTest extends TestCase
|
||||||
public function testRepositoryWritesInstalledPhp()
|
public function testRepositoryWritesInstalledPhp()
|
||||||
{
|
{
|
||||||
$dir = $this->getUniqueTmpDirectory();
|
$dir = $this->getUniqueTmpDirectory();
|
||||||
|
$this->root = $dir;
|
||||||
|
chdir($dir);
|
||||||
|
|
||||||
$json = new JsonFile($dir.'/installed.json');
|
$json = new JsonFile($dir.'/installed.json');
|
||||||
|
|
||||||
$rootPackage = $this->getPackage('__root__', 'dev-master', 'Composer\Package\RootPackage');
|
$rootPackage = $this->getPackage('__root__', 'dev-master', 'Composer\Package\RootPackage');
|
||||||
|
@ -152,12 +158,34 @@ class FilesystemRepositoryTest extends TestCase
|
||||||
$pkg = $this->getPackage('c/c', '3.0');
|
$pkg = $this->getPackage('c/c', '3.0');
|
||||||
$repository->addPackage($pkg);
|
$repository->addPackage($pkg);
|
||||||
|
|
||||||
|
$pkg = $this->getPackage('meta/package', '3.0');
|
||||||
|
$pkg->setType('metapackage');
|
||||||
|
$repository->addPackage($pkg);
|
||||||
|
|
||||||
$im = $this->getMockBuilder('Composer\Installer\InstallationManager')
|
$im = $this->getMockBuilder('Composer\Installer\InstallationManager')
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$im->expects($this->any())
|
$im->expects($this->any())
|
||||||
->method('getInstallPath')
|
->method('getInstallPath')
|
||||||
->will($this->returnValue('/foo/bar/vendor/woop/woop'));
|
->will($this->returnCallback(function ($package) use ($dir) {
|
||||||
|
// check for empty paths handling
|
||||||
|
if ($package->getType() === 'metapackage') {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($package->getName() === 'c/c') {
|
||||||
|
// check for absolute paths
|
||||||
|
return '/foo/bar/vendor/c/c';
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for cwd
|
||||||
|
if ($package instanceof RootPackageInterface) {
|
||||||
|
return $dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for relative paths
|
||||||
|
return 'vendor/'.$package->getName();
|
||||||
|
}));
|
||||||
|
|
||||||
$repository->write(true, $im);
|
$repository->write(true, $im);
|
||||||
$this->assertSame(require __DIR__.'/Fixtures/installed.php', require $dir.'/installed.php');
|
$this->assertSame(require __DIR__.'/Fixtures/installed.php', require $dir.'/installed.php');
|
||||||
|
|
|
@ -14,6 +14,9 @@ return array(
|
||||||
'root' => array(
|
'root' => array(
|
||||||
'pretty_version' => 'dev-master',
|
'pretty_version' => 'dev-master',
|
||||||
'version' => 'dev-master',
|
'version' => 'dev-master',
|
||||||
|
'type' => 'library',
|
||||||
|
// @phpstan-ignore-next-line
|
||||||
|
'install_path' => $dir . '/./',
|
||||||
'aliases' => array(
|
'aliases' => array(
|
||||||
'1.10.x-dev',
|
'1.10.x-dev',
|
||||||
),
|
),
|
||||||
|
@ -25,44 +28,58 @@ return array(
|
||||||
'__root__' => array(
|
'__root__' => array(
|
||||||
'pretty_version' => 'dev-master',
|
'pretty_version' => 'dev-master',
|
||||||
'version' => 'dev-master',
|
'version' => 'dev-master',
|
||||||
|
'type' => 'library',
|
||||||
|
// @phpstan-ignore-next-line
|
||||||
|
'install_path' => $dir . '/./',
|
||||||
'aliases' => array(
|
'aliases' => array(
|
||||||
'1.10.x-dev',
|
'1.10.x-dev',
|
||||||
),
|
),
|
||||||
'reference' => 'sourceref-by-default',
|
'reference' => 'sourceref-by-default',
|
||||||
'dev-requirement' => false,
|
'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',
|
||||||
|
'type' => 'library',
|
||||||
|
// @phpstan-ignore-next-line
|
||||||
|
'install_path' => $dir . '/vendor/a/provider',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'reference' => 'distref-as-no-source',
|
'reference' => 'distref-as-no-source',
|
||||||
'dev-requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'a/provider2' => array(
|
'a/provider2' => array(
|
||||||
'pretty_version' => '1.2',
|
'pretty_version' => '1.2',
|
||||||
'version' => '1.2.0.0',
|
'version' => '1.2.0.0',
|
||||||
|
'type' => 'library',
|
||||||
|
// @phpstan-ignore-next-line
|
||||||
|
'install_path' => $dir . '/vendor/a/provider2',
|
||||||
'aliases' => array(
|
'aliases' => array(
|
||||||
'1.4',
|
'1.4',
|
||||||
),
|
),
|
||||||
'reference' => 'distref-as-installed-from-dist',
|
'reference' => 'distref-as-installed-from-dist',
|
||||||
'dev-requirement' => false,
|
'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',
|
||||||
|
'type' => 'library',
|
||||||
|
// @phpstan-ignore-next-line
|
||||||
|
'install_path' => $dir . '/vendor/b/replacer',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'reference' => null,
|
'reference' => null,
|
||||||
'dev-requirement' => false,
|
'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',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => '/foo/bar/vendor/c/c',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'reference' => null,
|
'reference' => null,
|
||||||
'dev-requirement' => true,
|
'dev_requirement' => true,
|
||||||
),
|
),
|
||||||
'foo/impl' => array(
|
'foo/impl' => array(
|
||||||
'dev-requirement' => false,
|
'dev_requirement' => false,
|
||||||
'provided' => array(
|
'provided' => array(
|
||||||
'^1.1',
|
'^1.1',
|
||||||
'1.2',
|
'1.2',
|
||||||
|
@ -71,7 +88,7 @@ return array(
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
'foo/impl2' => array(
|
'foo/impl2' => array(
|
||||||
'dev-requirement' => false,
|
'dev_requirement' => false,
|
||||||
'provided' => array(
|
'provided' => array(
|
||||||
'2.0',
|
'2.0',
|
||||||
),
|
),
|
||||||
|
@ -80,10 +97,19 @@ return array(
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
'foo/replaced' => array(
|
'foo/replaced' => array(
|
||||||
'dev-requirement' => false,
|
'dev_requirement' => false,
|
||||||
'replaced' => array(
|
'replaced' => array(
|
||||||
'^3.0',
|
'^3.0',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
'meta/package' => array(
|
||||||
|
'pretty_version' => '3.0',
|
||||||
|
'version' => '3.0.0.0',
|
||||||
|
'type' => 'metapackage',
|
||||||
|
'install_path' => null,
|
||||||
|
'aliases' => array(),
|
||||||
|
'reference' => null,
|
||||||
|
'dev_requirement' => false,
|
||||||
|
)
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue