@@ -32,6 +32,11 @@ class InstalledVersions
3232 */
3333 private static $ installed ;
3434
35+ /**
36+ * @var bool
37+ */
38+ private static $ installedIsLocalDir ;
39+
3540 /**
3641 * @var bool|null
3742 */
@@ -309,6 +314,12 @@ public static function reload($data)
309314 {
310315 self ::$ installed = $ data ;
311316 self ::$ installedByVendor = array ();
317+
318+ // when using reload, we disable the duplicate protection to ensure that self::$installed data is
319+ // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
320+ // so we have to assume it does not, and that may result in duplicate data being returned when listing
321+ // all installed packages for example
322+ self ::$ installedIsLocalDir = false ;
312323 }
313324
314325 /**
@@ -325,19 +336,24 @@ private static function getInstalled()
325336 $ copiedLocalDir = false ;
326337
327338 if (self ::$ canGetVendors ) {
339+ $ selfDir = strtr (__DIR__ , '\\' , '/ ' );
328340 foreach (ClassLoader::getRegisteredLoaders () as $ vendorDir => $ loader ) {
341+ $ vendorDir = strtr ($ vendorDir , '\\' , '/ ' );
329342 if (isset (self ::$ installedByVendor [$ vendorDir ])) {
330343 $ installed [] = self ::$ installedByVendor [$ vendorDir ];
331344 } elseif (is_file ($ vendorDir .'/composer/installed.php ' )) {
332345 /** @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 */
333346 $ required = require $ vendorDir .'/composer/installed.php ' ;
334347 self ::$ installedByVendor [$ vendorDir ] = $ required ;
335348 $ installed [] = $ required ;
336- if (strtr ( $ vendorDir .'/composer ' , '\\' , ' / ' ) === strtr ( __DIR__ , '\\' , ' / ' ) ) {
349+ if (self :: $ installed === null && $ vendorDir .'/composer ' === $ selfDir ) {
337350 self ::$ installed = $ required ;
338- $ copiedLocalDir = true ;
351+ self :: $ installedIsLocalDir = true ;
339352 }
340353 }
354+ if (self ::$ installedIsLocalDir && $ vendorDir .'/composer ' === $ selfDir ) {
355+ $ copiedLocalDir = true ;
356+ }
341357 }
342358 }
343359
0 commit comments