From b683aeb5860f6c4e9155f555b5397284ddfecca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Wed, 17 Oct 2012 01:00:11 +0200 Subject: [PATCH 1/6] Fix expected values in tests for autoloader generator --- .../Test/Autoload/AutoloadGeneratorTest.php | 15 ++++++++------- .../Test/Autoload/Fixtures/autoload_classmap4.php | 2 +- .../autoload_real_files_by_dependency.php | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index b6cb99a6b..c93f2f378 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -322,15 +322,15 @@ class AutoloadGeneratorTest extends TestCase { $package = new Package('a', '1.0', '1.0'); $package->setAutoload(array('files' => array('root.php'))); - $package->setRequires(array(new Link('a', 'a/foo'))); + $package->setRequires(array(new Link('a', 'z/foo'))); $packages = array(); - $packages[] = $a = new Package('a/foo', '1.0', '1.0'); + $packages[] = $z = new Package('z/foo', '1.0', '1.0'); $packages[] = $b = new Package('b/bar', '1.0', '1.0'); $packages[] = $c = new Package('c/lorem', '1.0', '1.0'); - $a->setAutoload(array('files' => array('testA.php'))); - $a->setRequires(array(new Link('a/foo', 'c/lorem'))); + $z->setAutoload(array('files' => array('testA.php'))); + $z->setRequires(array(new Link('z/foo', 'c/lorem'))); $b->setAutoload(array('files' => array('testB.php'))); $b->setRequires(array(new Link('b/bar', 'c/lorem'))); @@ -341,10 +341,10 @@ class AutoloadGeneratorTest extends TestCase ->method('getPackages') ->will($this->returnValue($packages)); - $this->fs->ensureDirectoryExists($this->vendorDir . '/a/foo'); + $this->fs->ensureDirectoryExists($this->vendorDir . '/z/foo'); $this->fs->ensureDirectoryExists($this->vendorDir . '/b/bar'); $this->fs->ensureDirectoryExists($this->vendorDir . '/c/lorem'); - file_put_contents($this->vendorDir . '/a/foo/testA.php', 'vendorDir . '/z/foo/testA.php', 'vendorDir . '/b/bar/testB.php', 'vendorDir . '/c/lorem/testC.php', 'workingDir . '/root.php', 'setAutoload(array('psr-0' => array('A\\B' => $this->workingDir.'/lib'))); + $package->setRequires(array(new Link('z', 'a/a'))); $packages = array(); $packages[] = $a = new Package('a/a', '1.0', '1.0'); diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_classmap4.php b/tests/Composer/Test/Autoload/Fixtures/autoload_classmap4.php index 944a80bed..558c5e048 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_classmap4.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_classmap4.php @@ -6,7 +6,7 @@ $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( - 'ClassMapBaz' => $baseDir . '/composer-test-autoload/b/b/lib/c.php', 'ClassMapFoo' => $baseDir . '/composer-test-autoload/a/a/src/a.php', 'ClassMapBar' => $baseDir . '/composer-test-autoload/b/b/src/b.php', + 'ClassMapBaz' => $baseDir . '/composer-test-autoload/b/b/lib/c.php', ); diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_real_files_by_dependency.php b/tests/Composer/Test/Autoload/Fixtures/autoload_real_files_by_dependency.php index 07c8db3b4..b09592404 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_real_files_by_dependency.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_real_files_by_dependency.php @@ -31,7 +31,7 @@ class ComposerAutoloaderInitFilesAutoloadOrder $loader->register(); require $vendorDir . '/c/lorem/testC.php'; - require $vendorDir . '/a/foo/testA.php'; + require $vendorDir . '/z/foo/testA.php'; require $baseDir . '/root.php'; require $vendorDir . '/b/bar/testB.php'; From b7f96d5dc33b9174ad071e36cfbae46c1e377b1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Wed, 17 Oct 2012 01:02:06 +0200 Subject: [PATCH 2/6] Fixed autoloader generator --- src/Composer/Autoload/AutoloadGenerator.php | 117 ++++++++++++-------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index e46ba1463..c6f5325d3 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -117,8 +117,6 @@ EOF; // flatten array $classMap = array(); - $autoloads['classmap'] = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($autoloads['classmap'])); - if ($scanPsr0Packages) { foreach ($autoloads['psr-0'] as $namespace => $paths) { foreach ($paths as $dir) { @@ -139,6 +137,8 @@ EOF; } } } + + $autoloads['classmap'] = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($autoloads['classmap'])); foreach ($autoloads['classmap'] as $dir) { foreach (ClassMapGenerator::createMap($dir) as $class => $path) { $path = '/'.$filesystem->findShortestPath(getcwd(), $path, true); @@ -170,28 +170,13 @@ EOF; { // build package => install path map $packageMap = array(); - $packages[] = $mainPackage; - - // sort packages by dependencies - usort($packages, function (PackageInterface $a, PackageInterface $b) { - foreach (array_merge($a->getRequires(), $a->getDevRequires()) as $link) { - if (in_array($link->getTarget(), $b->getNames())) { - return 1; - } - } - foreach (array_merge($b->getRequires(), $b->getDevRequires()) as $link) { - if (in_array($link->getTarget(), $a->getNames())) { - return -1; - } - } - - return strcmp($a->getName(), $b->getName()); - }); + array_unshift($packages, $mainPackage); foreach ($packages as $package) { if ($package instanceof AliasPackage) { continue; } + if ($package === $mainPackage) { $packageMap[] = array($mainPackage, ''); continue; @@ -213,32 +198,12 @@ EOF; */ public function parseAutoloads(array $packageMap) { - $autoloads = array('classmap' => array(), 'psr-0' => array(), 'files' => array()); - foreach ($packageMap as $item) { - list($package, $installPath) = $item; + $psr0 = $this->parseAutoloadsType($packageMap, 'psr-0'); + krsort($psr0); + $classmap = $this->parseAutoloadsType($packageMap, 'classmap'); + $files = $this->parseAutoloadsType($this->sortPackageMap($packageMap), 'files'); - if (null !== $package->getTargetDir()) { - $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir())); - } - - foreach ($package->getAutoload() as $type => $mapping) { - // skip misconfigured packages - if (!is_array($mapping)) { - continue; - } - - foreach ($mapping as $namespace => $paths) { - foreach ((array) $paths as $path) { - $autoloads[$type][$namespace][] = empty($installPath) ? $path : $installPath.'/'.$path; - } - } - } - } - - krsort($autoloads['classmap']); - krsort($autoloads['psr-0']); - - return $autoloads; + return array('psr-0' => $psr0, 'classmap' => $classmap, 'files' => $files); } /** @@ -445,4 +410,68 @@ FOOTER; } + protected function parseAutoloadsType(array $packageMap, $type) + { + $autoloads = array(); + foreach ($packageMap as $item) { + list($package, $installPath) = $item; + + $autoload = $package->getAutoload(); + // skip misconfigured packages + if (!isset($autoload[$type]) || !is_array($autoload[$type])) { + continue; + } + + if (null !== $package->getTargetDir()) { + $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir())); + } + + foreach ($autoload[$type] as $namespace => $paths) { + foreach ((array) $paths as $path) { + $autoloads[$namespace][] = empty($installPath) ? $path : $installPath.'/'.$path; + } + } + } + + return $autoloads; + } + + protected function sortPackageMap(array $packageMap) + { + $groups = array(); + $names = array(); + foreach ($packageMap as $key => $item) { + $groups[$key] = array($item); + $mainName = $item[0]->getName(); + foreach ($item[0]->getNames() as $name) { + $names[$name] = $name == $mainName ? $key : $mainName; + } + } + + foreach ($packageMap as $item) { + foreach (array_merge($item[0]->getRequires(), $item[0]->getDevRequires()) as $link) { + if (!isset($names[$link->getTarget()])) { + continue; + } + + $packageKey = $names[$item[0]->getName()]; + $target = $link->getTarget(); + $targetKey = is_int($names[$target]) ? $names[$target] : $names[$names[$target]]; + $groups[$targetKey] = array_merge($groups[$targetKey], $groups[$packageKey]); + + foreach ($groups[$packageKey] as $originalItem) { + $names[$originalItem[0]->getName()] = $targetKey; + } + + unset($groups[$packageKey]); + } + } + + $sortedPackageMap = array(); + foreach ($groups as $group) { + $sortedPackageMap = array_merge($sortedPackageMap, $group); + } + + return $sortedPackageMap; + } } From e75abcbb414eed51848945315a51beb9c8b2a528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Wed, 17 Oct 2012 01:40:15 +0200 Subject: [PATCH 3/6] Fixed order of packages in the classmap autoloader --- src/Composer/Autoload/AutoloadGenerator.php | 6 ++++-- tests/Composer/Test/Autoload/AutoloadGeneratorTest.php | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index c6f5325d3..4d1517f74 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -200,8 +200,10 @@ EOF; { $psr0 = $this->parseAutoloadsType($packageMap, 'psr-0'); krsort($psr0); - $classmap = $this->parseAutoloadsType($packageMap, 'classmap'); - $files = $this->parseAutoloadsType($this->sortPackageMap($packageMap), 'files'); + + $sortedPackageMap = $this->sortPackageMap($packageMap); + $classmap = $this->parseAutoloadsType($sortedPackageMap, 'classmap'); + $files = $this->parseAutoloadsType($sortedPackageMap, 'files'); return array('psr-0' => $psr0, 'classmap' => $classmap, 'files' => $files); } diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index c93f2f378..af318f4c7 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -367,13 +367,13 @@ class AutoloadGeneratorTest extends TestCase public function testOverrideVendorsAutoloading() { $package = new Package('z', '1.0', '1.0'); - $package->setAutoload(array('psr-0' => array('A\\B' => $this->workingDir.'/lib'))); + $package->setAutoload(array('psr-0' => array('A\\B' => $this->workingDir.'/lib'), 'classmap' => array($this->workingDir.'/src'))); $package->setRequires(array(new Link('z', 'a/a'))); $packages = array(); $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); - $a->setAutoload(array('psr-0' => array('A' => 'src/', 'A\\B' => 'lib/'))); + $a->setAutoload(array('psr-0' => array('A' => 'src/', 'A\\B' => 'lib/'), 'classmap' => array('classmap'))); $b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/'))); $this->repository->expects($this->once()) @@ -381,12 +381,16 @@ class AutoloadGeneratorTest extends TestCase ->will($this->returnValue($packages)); $this->fs->ensureDirectoryExists($this->workingDir.'/lib/A/B'); + $this->fs->ensureDirectoryExists($this->workingDir.'/src/'); $this->fs->ensureDirectoryExists($this->vendorDir.'/composer'); + $this->fs->ensureDirectoryExists($this->vendorDir.'/a/a/classmap'); $this->fs->ensureDirectoryExists($this->vendorDir.'/a/a/src'); $this->fs->ensureDirectoryExists($this->vendorDir.'/a/a/lib/A/B'); $this->fs->ensureDirectoryExists($this->vendorDir.'/b/b/src'); file_put_contents($this->workingDir.'/lib/A/B/C.php', 'workingDir.'/src/classes.php', 'vendorDir.'/a/a/lib/A/B/C.php', 'vendorDir.'/a/a/classmap/classes.php', 'workingDir, '\\', '/'); $expectedNamespace = << \$baseDir . '/lib/A/B/C.php', + 'Foo\\\\Bar' => \$baseDir . '/src/classes.php', ); EOF; From c63f0d964287eb94714644c65c5c8f41374bbe28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Wed, 17 Oct 2012 10:50:53 +0200 Subject: [PATCH 4/6] Preserved original position of package if required packages are before this --- src/Composer/Autoload/AutoloadGenerator.php | 5 +++++ .../Test/Autoload/AutoloadGeneratorTest.php | 13 +++++++++++++ .../Fixtures/autoload_real_files_by_dependency.php | 2 ++ 3 files changed, 20 insertions(+) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 4d1517f74..8f8aa87d8 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -459,6 +459,11 @@ FOOTER; $packageKey = $names[$item[0]->getName()]; $target = $link->getTarget(); $targetKey = is_int($names[$target]) ? $names[$target] : $names[$names[$target]]; + + if ($targetKey <= $packageKey) { + continue; + } + $groups[$targetKey] = array_merge($groups[$targetKey], $groups[$packageKey]); foreach ($groups[$packageKey] as $originalItem) { diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index af318f4c7..51c360dae 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -328,6 +328,8 @@ class AutoloadGeneratorTest extends TestCase $packages[] = $z = new Package('z/foo', '1.0', '1.0'); $packages[] = $b = new Package('b/bar', '1.0', '1.0'); $packages[] = $c = new Package('c/lorem', '1.0', '1.0'); + $packages[] = $d = new Package('d/d', '1.0', '1.0'); + $packages[] = $e = new Package('e/e', '1.0', '1.0'); $z->setAutoload(array('files' => array('testA.php'))); $z->setRequires(array(new Link('z/foo', 'c/lorem'))); @@ -337,6 +339,11 @@ class AutoloadGeneratorTest extends TestCase $c->setAutoload(array('files' => array('testC.php'))); + $d->setAutoload(array('files' => array('testD.php'))); + + $e->setAutoload(array('files' => array('testE.php'))); + $e->setRequires(array(new Link('e/e', 'c/lorem'))); + $this->repository->expects($this->once()) ->method('getPackages') ->will($this->returnValue($packages)); @@ -344,9 +351,13 @@ class AutoloadGeneratorTest extends TestCase $this->fs->ensureDirectoryExists($this->vendorDir . '/z/foo'); $this->fs->ensureDirectoryExists($this->vendorDir . '/b/bar'); $this->fs->ensureDirectoryExists($this->vendorDir . '/c/lorem'); + $this->fs->ensureDirectoryExists($this->vendorDir . '/d/d'); + $this->fs->ensureDirectoryExists($this->vendorDir . '/e/e'); file_put_contents($this->vendorDir . '/z/foo/testA.php', 'vendorDir . '/b/bar/testB.php', 'vendorDir . '/c/lorem/testC.php', 'vendorDir . '/d/d/testD.php', 'vendorDir . '/e/e/testE.php', 'workingDir . '/root.php', 'generator->dump($this->config, $this->repository, $package, $this->im, 'composer', false, 'FilesAutoloadOrder'); @@ -361,6 +372,8 @@ class AutoloadGeneratorTest extends TestCase $this->assertTrue(function_exists('testFilesAutoloadOrderByDependency1')); $this->assertTrue(function_exists('testFilesAutoloadOrderByDependency2')); $this->assertTrue(function_exists('testFilesAutoloadOrderByDependency3')); + $this->assertTrue(function_exists('testFilesAutoloadOrderByDependency4')); + $this->assertTrue(function_exists('testFilesAutoloadOrderByDependency5')); $this->assertTrue(function_exists('testFilesAutoloadOrderByDependencyRoot')); } diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_real_files_by_dependency.php b/tests/Composer/Test/Autoload/Fixtures/autoload_real_files_by_dependency.php index b09592404..ac610bade 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_real_files_by_dependency.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_real_files_by_dependency.php @@ -34,6 +34,8 @@ class ComposerAutoloaderInitFilesAutoloadOrder require $vendorDir . '/z/foo/testA.php'; require $baseDir . '/root.php'; require $vendorDir . '/b/bar/testB.php'; + require $vendorDir . '/d/d/testD.php'; + require $vendorDir . '/e/e/testE.php'; return $loader; } From 1ff1b8ac1f77019daa79db0f18c77bd38851f2b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Wed, 17 Oct 2012 12:00:45 +0200 Subject: [PATCH 5/6] Sorted generated classmap --- src/Composer/Autoload/AutoloadGenerator.php | 9 ++++++--- tests/Composer/Test/Autoload/AutoloadGeneratorTest.php | 4 ++-- .../Test/Autoload/Fixtures/autoload_classmap3.php | 2 +- .../Test/Autoload/Fixtures/autoload_classmap4.php | 2 +- .../Test/Autoload/Fixtures/autoload_classmap5.php | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 8f8aa87d8..636f3f448 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -145,6 +145,8 @@ EOF; $classMap[$class] = '$baseDir . '.var_export($path, true).",\n"; } } + + ksort($classMap); foreach ($classMap as $class => $code) { $classmapFile .= ' '.var_export($class, true).' => '.$code; } @@ -198,13 +200,14 @@ EOF; */ public function parseAutoloads(array $packageMap) { - $psr0 = $this->parseAutoloadsType($packageMap, 'psr-0'); - krsort($psr0); - $sortedPackageMap = $this->sortPackageMap($packageMap); + + $psr0 = $this->parseAutoloadsType($packageMap, 'psr-0'); $classmap = $this->parseAutoloadsType($sortedPackageMap, 'classmap'); $files = $this->parseAutoloadsType($sortedPackageMap, 'files'); + krsort($psr0); + return array('psr-0' => $psr0, 'classmap' => $classmap, 'files' => $files); } diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index 51c360dae..626c2db07 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -238,9 +238,9 @@ class AutoloadGeneratorTest extends TestCase $this->assertTrue(file_exists($this->vendorDir.'/composer/autoload_classmap.php'), "ClassMap file needs to be generated."); $this->assertEquals( array( - 'ClassMapFoo' => $this->workingDir.'/composer-test-autoload/a/a/src/a.php', 'ClassMapBar' => $this->workingDir.'/composer-test-autoload/b/b/src/b.php', 'ClassMapBaz' => $this->workingDir.'/composer-test-autoload/b/b/lib/c.php', + 'ClassMapFoo' => $this->workingDir.'/composer-test-autoload/a/a/src/a.php', ), include ($this->vendorDir.'/composer/autoload_classmap.php') ); @@ -275,9 +275,9 @@ class AutoloadGeneratorTest extends TestCase $this->assertTrue(file_exists($this->vendorDir.'/composer/autoload_classmap.php'), "ClassMap file needs to be generated."); $this->assertEquals( array( - 'ClassMapFoo' => $this->workingDir.'/composer-test-autoload/a/a/src/a.php', 'ClassMapBar' => $this->workingDir.'/composer-test-autoload/b/b/test.php', 'ClassMapBaz' => $this->workingDir.'/composer-test-autoload/c/c/foo/test.php', + 'ClassMapFoo' => $this->workingDir.'/composer-test-autoload/a/a/src/a.php', ), include ($this->vendorDir.'/composer/autoload_classmap.php') ); diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_classmap3.php b/tests/Composer/Test/Autoload/Fixtures/autoload_classmap3.php index 75c7cd741..9c5136d7f 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_classmap3.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_classmap3.php @@ -6,6 +6,6 @@ $vendorDir = dirname(__DIR__); $baseDir = $vendorDir; return array( - 'Main\\Foo' => $baseDir . '/src/Main/Foo.php', 'ClassMapFoo' => $baseDir . '/composersrc/foo.php', + 'Main\\Foo' => $baseDir . '/src/Main/Foo.php', ); diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_classmap4.php b/tests/Composer/Test/Autoload/Fixtures/autoload_classmap4.php index 558c5e048..7ea7c42c7 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_classmap4.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_classmap4.php @@ -6,7 +6,7 @@ $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( - 'ClassMapFoo' => $baseDir . '/composer-test-autoload/a/a/src/a.php', 'ClassMapBar' => $baseDir . '/composer-test-autoload/b/b/src/b.php', 'ClassMapBaz' => $baseDir . '/composer-test-autoload/b/b/lib/c.php', + 'ClassMapFoo' => $baseDir . '/composer-test-autoload/a/a/src/a.php', ); diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_classmap5.php b/tests/Composer/Test/Autoload/Fixtures/autoload_classmap5.php index e3230f953..41c1738bc 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_classmap5.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_classmap5.php @@ -6,7 +6,7 @@ $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( - 'ClassMapFoo' => $baseDir . '/composer-test-autoload/a/a/src/a.php', 'ClassMapBar' => $baseDir . '/composer-test-autoload/b/b/test.php', 'ClassMapBaz' => $baseDir . '/composer-test-autoload/c/c/foo/test.php', + 'ClassMapFoo' => $baseDir . '/composer-test-autoload/a/a/src/a.php', ); From 9582a8abfa447506de12477d020d06826df86515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Wed, 17 Oct 2012 12:03:52 +0200 Subject: [PATCH 6/6] Added tests for consistency of data in AutoloadGenerator::sortPackageMap --- src/Composer/Autoload/AutoloadGenerator.php | 24 +++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 636f3f448..489a90d23 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -449,30 +449,36 @@ FOOTER; $groups[$key] = array($item); $mainName = $item[0]->getName(); foreach ($item[0]->getNames() as $name) { - $names[$name] = $name == $mainName ? $key : $mainName; + if (!isset($names[$name])) { + $names[$name] = $name == $mainName ? $key : $mainName; + } } } foreach ($packageMap as $item) { foreach (array_merge($item[0]->getRequires(), $item[0]->getDevRequires()) as $link) { - if (!isset($names[$link->getTarget()])) { + $target = $link->getTarget(); + if (!isset($names[$target])) { continue; } - $packageKey = $names[$item[0]->getName()]; - $target = $link->getTarget(); - $targetKey = is_int($names[$target]) ? $names[$target] : $names[$names[$target]]; + $targetKey = $names[$target]; + if (is_string($targetKey)) { + if (!isset($names[$targetKey])) { + continue; + } + $targetKey = $names[$targetKey]; + } - if ($targetKey <= $packageKey) { + $packageKey = $names[$item[0]->getName()]; + if ($targetKey <= $packageKey || !isset($groups[$packageKey])) { continue; } - $groups[$targetKey] = array_merge($groups[$targetKey], $groups[$packageKey]); - foreach ($groups[$packageKey] as $originalItem) { + $groups[$targetKey][] = $originalItem; $names[$originalItem[0]->getName()] = $targetKey; } - unset($groups[$packageKey]); } }