diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 59addd0b4..036b40b95 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -61,12 +61,16 @@ EOF; $relVendorPath = $filesystem->findShortestPath(getcwd(), $vendorPath); $vendorDirCode = $filesystem->findShortestPathCode(realpath($targetDir), $vendorPath, true); + $appBaseDir = $filesystem->findShortestPathCode($vendorPath, getcwd(), true); + $appBaseDir = str_replace('__DIR__', '$vendorDir', $appBaseDir); + $namespacesFile = <<buildPackageMap($installationManager, $mainPackage, $localRepo->getPackages()); $autoloads = $this->parseAutoloads($packageMap); - $appBaseDir = $filesystem->findShortestPathCode($vendorPath, getcwd(), true); - $appBaseDir = str_replace('__DIR__', '$vendorDir', $appBaseDir); - - if (isset($autoloads['psr-0'])) { - foreach ($autoloads['psr-0'] as $namespace => $paths) { - $exportedPaths = array(); - foreach ($paths as $path) { - $path = strtr($path, '\\', '/'); - $baseDir = ''; - if (!$filesystem->isAbsolutePath($path)) { - // vendor dir == working dir - if (preg_match('{^(\./?)?$}', $relVendorPath)) { - $path = '/'.$path; - $baseDir = '$vendorDir . '; - } elseif (strpos($path, $relVendorPath) === 0) { - // path starts with vendor dir - $path = substr($path, strlen($relVendorPath)); - $baseDir = '$vendorDir . '; - } else { - $path = '/'.$path; - $baseDir = $appBaseDir . ' . '; - } - } elseif (strpos($path, $vendorPath) === 0) { - $path = substr($path, strlen($vendorPath)); + foreach ($autoloads['psr-0'] as $namespace => $paths) { + $exportedPaths = array(); + foreach ($paths as $path) { + $path = strtr($path, '\\', '/'); + $baseDir = ''; + if (!$filesystem->isAbsolutePath($path)) { + // vendor dir == working dir + if (preg_match('{^(\./?)?$}', $relVendorPath)) { + $path = '/'.$path; $baseDir = '$vendorDir . '; + } elseif (strpos($path, $relVendorPath) === 0) { + // path starts with vendor dir + $path = substr($path, strlen($relVendorPath)); + $baseDir = '$vendorDir . '; + } else { + $path = '/'.$path; + $baseDir = '$baseDir . '; } - $exportedPaths[] = $baseDir.var_export($path, true); - } - $exportedPrefix = var_export($namespace, true); - $namespacesFile .= " $exportedPrefix => "; - if (count($exportedPaths) > 1) { - $namespacesFile .= "array(".implode(', ',$exportedPaths)."),\n"; - } else { - $namespacesFile .= $exportedPaths[0].",\n"; + } elseif (strpos($path, $vendorPath) === 0) { + $path = substr($path, strlen($vendorPath)); + $baseDir = '$vendorDir . '; } + $exportedPaths[] = $baseDir.var_export($path, true); + } + $exportedPrefix = var_export($namespace, true); + $namespacesFile .= " $exportedPrefix => "; + if (count($exportedPaths) > 1) { + $namespacesFile .= "array(".implode(', ', $exportedPaths)."),\n"; + } else { + $namespacesFile .= $exportedPaths[0].",\n"; } } $namespacesFile .= ");\n"; - if (isset($autoloads['classmap'])) { - // flatten array - $autoloads['classmap'] = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($autoloads['classmap'])); - } else { - $autoloads['classmap'] = array(); - } + $classmapFile = << $path) { + $path = '/'.$filesystem->findShortestPath(getcwd(), $path); + $classmapFile .= ' '.var_export($class, true).' => $baseDir . '.var_export($path, true).",\n"; + } + } + $classmapFile .= ");\n"; file_put_contents($targetDir.'/autoload.php', $autoloadFile); file_put_contents($targetDir.'/autoload_namespaces.php', $namespacesFile); + file_put_contents($targetDir.'/autoload_classmap.php', $classmapFile); copy(__DIR__.'/ClassLoader.php', $targetDir.'/ClassLoader.php'); } @@ -154,7 +167,7 @@ EOF; */ public function parseAutoloads(array $packageMap) { - $autoloads = array(); + $autoloads = array('classmap' => array(), 'psr-0' => array()); foreach ($packageMap as $item) { list($package, $installPath) = $item; diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index 123faa5c5..9d2d243a9 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -160,11 +160,12 @@ class AutoloadGeneratorTest extends TestCase file_put_contents($this->vendorDir.'/b/b/lib/c.php', 'generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/.composer'); - $this->assertTrue(file_exists($this->vendorDir.'/.composer/autoload_classmap.php'), "ClassMap file needs to be generated, even if empty."); - $this->assertEquals(array( - 'ClassMapFoo' => $this->vendorDir.'/a/a/src/a.php', - 'ClassMapBar' => $this->vendorDir.'/b/b/src/b.php', - 'ClassMapBaz' => $this->vendorDir.'/b/b/lib/c.php', + $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', ), include ($this->vendorDir.'/.composer/autoload_classmap.php') ); diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_main.php b/tests/Composer/Test/Autoload/Fixtures/autoload_main.php index 157d888f3..ec243e33e 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_main.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_main.php @@ -3,8 +3,9 @@ // autoload_namespace.php generated by Composer $vendorDir = dirname(__DIR__); +$baseDir = dirname($vendorDir); return array( - 'Main' => dirname($vendorDir) . '/src/', - 'Lala' => dirname($vendorDir) . '/src/', + 'Main' => $baseDir . '/src/', + 'Lala' => $baseDir . '/src/', ); diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_main2.php b/tests/Composer/Test/Autoload/Fixtures/autoload_main2.php index a0fa2c7db..da1c87d88 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_main2.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_main2.php @@ -3,8 +3,9 @@ // autoload_namespace.php generated by Composer $vendorDir = dirname(__DIR__); +$baseDir = dirname(dirname($vendorDir)); return array( - 'Main' => dirname(dirname($vendorDir)) . '/src/', - 'Lala' => dirname(dirname($vendorDir)) . '/src/', + 'Main' => $baseDir . '/src/', + 'Lala' => $baseDir . '/src/', ); diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_main3.php b/tests/Composer/Test/Autoload/Fixtures/autoload_main3.php index 6f12b3d75..3c6d910cc 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_main3.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_main3.php @@ -3,6 +3,7 @@ // autoload_namespace.php generated by Composer $vendorDir = dirname(__DIR__); +$baseDir = dirname($vendorDir); return array( 'Main' => $vendorDir . '/src/', diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_override_vendors.php b/tests/Composer/Test/Autoload/Fixtures/autoload_override_vendors.php index 4b4eacdca..0640aceda 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_override_vendors.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_override_vendors.php @@ -3,6 +3,7 @@ // autoload_namespace.php generated by Composer $vendorDir = dirname(__DIR__); +$baseDir = dirname($vendorDir); return array( 'B\\Sub\\Name' => $vendorDir . '/b/b/src/', diff --git a/tests/Composer/Test/Autoload/Fixtures/autoload_vendors.php b/tests/Composer/Test/Autoload/Fixtures/autoload_vendors.php index b149046df..dd076486d 100644 --- a/tests/Composer/Test/Autoload/Fixtures/autoload_vendors.php +++ b/tests/Composer/Test/Autoload/Fixtures/autoload_vendors.php @@ -3,6 +3,7 @@ // autoload_namespace.php generated by Composer $vendorDir = dirname(__DIR__); +$baseDir = dirname($vendorDir); return array( 'B\\Sub\\Name' => $vendorDir . '/b/b/src/',