|
|
|
|
@ -32,6 +32,11 @@ class InstalledVersions |
|
|
|
|
*/ |
|
|
|
|
private static $installed; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @var bool |
|
|
|
|
*/ |
|
|
|
|
private static $installedIsLocalDir; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @var bool|null |
|
|
|
|
*/ |
|
|
|
|
@ -309,6 +314,12 @@ class InstalledVersions |
|
|
|
|
{ |
|
|
|
|
self::$installed = $data; |
|
|
|
|
self::$installedByVendor = array(); |
|
|
|
|
|
|
|
|
|
// when using reload, we disable the duplicate protection to ensure that self::$installed data is |
|
|
|
|
// always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, |
|
|
|
|
// so we have to assume it does not, and that may result in duplicate data being returned when listing |
|
|
|
|
// all installed packages for example |
|
|
|
|
self::$installedIsLocalDir = false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -322,19 +333,27 @@ class InstalledVersions |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$installed = array(); |
|
|
|
|
$copiedLocalDir = false; |
|
|
|
|
|
|
|
|
|
if (self::$canGetVendors) { |
|
|
|
|
$selfDir = strtr(__DIR__, '\\', '/'); |
|
|
|
|
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { |
|
|
|
|
$vendorDir = strtr($vendorDir, '\\', '/'); |
|
|
|
|
if (isset(self::$installedByVendor[$vendorDir])) { |
|
|
|
|
$installed[] = self::$installedByVendor[$vendorDir]; |
|
|
|
|
} elseif (is_file($vendorDir.'/composer/installed.php')) { |
|
|
|
|
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ |
|
|
|
|
$required = require $vendorDir.'/composer/installed.php'; |
|
|
|
|
$installed[] = self::$installedByVendor[$vendorDir] = $required; |
|
|
|
|
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { |
|
|
|
|
self::$installed = $installed[count($installed) - 1]; |
|
|
|
|
self::$installedByVendor[$vendorDir] = $required; |
|
|
|
|
$installed[] = $required; |
|
|
|
|
if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { |
|
|
|
|
self::$installed = $required; |
|
|
|
|
self::$installedIsLocalDir = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { |
|
|
|
|
$copiedLocalDir = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -350,7 +369,7 @@ class InstalledVersions |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (self::$installed !== array()) { |
|
|
|
|
if (self::$installed !== array() && !$copiedLocalDir) { |
|
|
|
|
$installed[] = self::$installed; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|