From 30b1dfb8a99cb5c3cda57f6b749c748e7b7246d7 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 25 Feb 2020 16:09:36 +0100 Subject: [PATCH 1/5] report ambiguous classes across all classmaps --- src/Composer/Autoload/AutoloadGenerator.php | 25 +++++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 2bb0c98b1..8ee8d91c2 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -236,6 +236,7 @@ EOF; // flatten array $classMap = array(); + $ambigiousClasses = array(); if ($scanPsr0Packages) { $namespacesToScan = array(); @@ -256,14 +257,24 @@ EOF; continue; } - $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, $namespace, $group['type'], $classMap); + $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, $namespace, $group['type'], $classMap, $ambigiousClasses); } } } } foreach ($autoloads['classmap'] as $dir) { - $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, null, null, $classMap); + $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, null, null, $classMap, $ambigiousClasses); + } + + foreach($ambigiousClasses as $className => $ambigiousPaths) + { + $cleanPath = str_replace(array('$vendorDir . \'', "',\n"), array($vendorPath, ''), $classMap[$className]); + + $this->io->writeError( + 'Warning: Ambiguous class resolution, "'.$className.'"'. + ' was found '. (count($ambigiousPaths)+1) .'x: in "'.$cleanPath.'" and "'. implode('", "', $ambigiousPaths) .'", the first will be used.' + ); } ksort($classMap); @@ -326,17 +337,17 @@ EOF; return 0; } - private function addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist = null, $namespaceFilter = null, $autoloadType = null, array $classMap = array()) + private function addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist = null, $namespaceFilter = null, $autoloadType = null, array $classMap, array &$ambigiousClasses) { foreach ($this->generateClassMap($dir, $blacklist, $namespaceFilter, $autoloadType) as $class => $path) { $pathCode = $this->getPathCode($filesystem, $basePath, $vendorPath, $path).",\n"; if (!isset($classMap[$class])) { $classMap[$class] = $pathCode; } elseif ($this->io && $classMap[$class] !== $pathCode && !preg_match('{/(test|fixture|example|stub)s?/}i', strtr($classMap[$class].' '.$path, '\\', '/'))) { - $this->io->writeError( - 'Warning: Ambiguous class resolution, "'.$class.'"'. - ' was found in both "'.str_replace(array('$vendorDir . \'', "',\n"), array($vendorPath, ''), $classMap[$class]).'" and "'.$path.'", the first will be used.' - ); + if (!isset($ambigiousClasses[$class])) { + $ambigiousClasses[$class] = array(); + } + $ambigiousClasses[$class][] = $path; } } From 61e0bf1cb5ec57584eaaa645338bd4fcb00d22ed Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 2 Mar 2020 13:23:33 +0100 Subject: [PATCH 2/5] fix typo --- src/Composer/Autoload/AutoloadGenerator.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 8ee8d91c2..6f564cc8b 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -236,7 +236,7 @@ EOF; // flatten array $classMap = array(); - $ambigiousClasses = array(); + $ambiguousClasses = array(); if ($scanPsr0Packages) { $namespacesToScan = array(); @@ -257,17 +257,17 @@ EOF; continue; } - $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, $namespace, $group['type'], $classMap, $ambigiousClasses); + $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, $namespace, $group['type'], $classMap, $ambiguousClasses); } } } } foreach ($autoloads['classmap'] as $dir) { - $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, null, null, $classMap, $ambigiousClasses); + $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, null, null, $classMap, $ambiguousClasses); } - foreach($ambigiousClasses as $className => $ambigiousPaths) + foreach($ambiguousClasses as $className => $ambigiousPaths) { $cleanPath = str_replace(array('$vendorDir . \'', "',\n"), array($vendorPath, ''), $classMap[$className]); @@ -337,17 +337,17 @@ EOF; return 0; } - private function addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist = null, $namespaceFilter = null, $autoloadType = null, array $classMap, array &$ambigiousClasses) + private function addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist = null, $namespaceFilter = null, $autoloadType = null, array $classMap, array &$ambiguousClasses) { foreach ($this->generateClassMap($dir, $blacklist, $namespaceFilter, $autoloadType) as $class => $path) { $pathCode = $this->getPathCode($filesystem, $basePath, $vendorPath, $path).",\n"; if (!isset($classMap[$class])) { $classMap[$class] = $pathCode; } elseif ($this->io && $classMap[$class] !== $pathCode && !preg_match('{/(test|fixture|example|stub)s?/}i', strtr($classMap[$class].' '.$path, '\\', '/'))) { - if (!isset($ambigiousClasses[$class])) { - $ambigiousClasses[$class] = array(); + if (!isset($ambiguousClasses[$class])) { + $ambiguousClasses[$class] = array(); } - $ambigiousClasses[$class][] = $path; + $ambiguousClasses[$class][] = $path; } } From 883a179dec1493b3cb0de6e29451c9408055a318 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 2 Mar 2020 13:24:06 +0100 Subject: [PATCH 3/5] removed superflous code --- src/Composer/Autoload/AutoloadGenerator.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 6f564cc8b..bf22d3daf 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -344,9 +344,6 @@ EOF; if (!isset($classMap[$class])) { $classMap[$class] = $pathCode; } elseif ($this->io && $classMap[$class] !== $pathCode && !preg_match('{/(test|fixture|example|stub)s?/}i', strtr($classMap[$class].' '.$path, '\\', '/'))) { - if (!isset($ambiguousClasses[$class])) { - $ambiguousClasses[$class] = array(); - } $ambiguousClasses[$class][] = $path; } } From 04a18c72ba4f4f7120ba9617741d335d1cacbfc6 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 2 Mar 2020 13:25:54 +0100 Subject: [PATCH 4/5] fix CS --- src/Composer/Autoload/AutoloadGenerator.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index bf22d3daf..46a57a542 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -267,13 +267,12 @@ EOF; $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, null, null, $classMap, $ambiguousClasses); } - foreach($ambiguousClasses as $className => $ambigiousPaths) - { + foreach ($ambiguousClasses as $className => $ambigiousPaths) { $cleanPath = str_replace(array('$vendorDir . \'', "',\n"), array($vendorPath, ''), $classMap[$className]); $this->io->writeError( 'Warning: Ambiguous class resolution, "'.$className.'"'. - ' was found '. (count($ambigiousPaths)+1) .'x: in "'.$cleanPath.'" and "'. implode('", "', $ambigiousPaths) .'", the first will be used.' + ' was found '. (count($ambigiousPaths) + 1) .'x: in "'.$cleanPath.'" and "'. implode('", "', $ambigiousPaths) .'", the first will be used.' ); } @@ -401,8 +400,8 @@ EOF; /** * Compiles an ordered list of namespace => path mappings * - * @param array $packageMap array of array(package, installDir-relative-to-composer.json) - * @param PackageInterface $mainPackage root package instance + * @param array $packageMap array of array(package, installDir-relative-to-composer.json) + * @param PackageInterface $mainPackage root package instance * @param bool $filterOutRequireDevPackages whether to filter out require-dev packages * @return array array('psr-0' => array('Ns\\Foo' => array('installDir'))) */ From cc5c5dbee16f1c3bf1c6a19c4ae3b8266bdd713a Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 2 Mar 2020 13:28:10 +0100 Subject: [PATCH 5/5] merge fix from https://github.com/composer/composer/pull/8651 --- src/Composer/Autoload/AutoloadGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 46a57a542..c5b0714c1 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -268,7 +268,7 @@ EOF; } foreach ($ambiguousClasses as $className => $ambigiousPaths) { - $cleanPath = str_replace(array('$vendorDir . \'', "',\n"), array($vendorPath, ''), $classMap[$className]); + $cleanPath = str_replace(array('$vendorDir . \'', '$baseDir . \'', "',\n"), array($vendorPath, $basePath, ''), $classMap[$className]); $this->io->writeError( 'Warning: Ambiguous class resolution, "'.$className.'"'.