From 9477e96da2d3dd2f3ee69931897fe93c610048fa Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 12 May 2014 16:13:41 +0200 Subject: [PATCH] [HttpKernel] removed absolute paths from the generated container --- src/Symfony/Component/HttpKernel/Kernel.php | 35 +++++++++++++++++++ .../app/cache/dev/withAbsolutePaths.php | 7 ++++ .../app/cache/dev/withoutAbsolutePaths.php | 7 ++++ .../Fixtures/DumpedContainers/composer.json | 1 + .../Tests/Fixtures/KernelForTest.php | 5 +++ .../Component/HttpKernel/Tests/KernelTest.php | 28 +++++++++++++++ .../Component/HttpKernel/composer.json | 4 ++- 7 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/app/cache/dev/withAbsolutePaths.php create mode 100644 src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/app/cache/dev/withoutAbsolutePaths.php create mode 100644 src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/composer.json diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index b5e3744de6f0..fae1eb39376d 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -32,6 +32,7 @@ use Symfony\Component\Config\Loader\DelegatingLoader; use Symfony\Component\Config\ConfigCache; use Symfony\Component\ClassLoader\ClassCollectionLoader; +use Symfony\Component\Filesystem\Filesystem; /** * The Kernel is the heart of the Symfony system. @@ -714,9 +715,43 @@ protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container $content = static::stripComments($content); } + $content = $this->removeAbsolutePathsFromContainer($content); + $cache->write($content, $container->getResources()); } + /** + * Converts absolute paths to relative ones in the dumped container. + */ + private function removeAbsolutePathsFromContainer($content) + { + if (!class_exists('Symfony\Component\Filesystem\Filesystem')) { + return $content; + } + + // find the "real" root dir (by finding the composer.json file) + $rootDir = $this->getRootDir(); + $previous = $rootDir; + while (!file_exists($rootDir.'/composer.json')) { + if ($previous === $rootDir = realpath($rootDir.'/..')) { + // unable to detect the project root, give up + return $content; + } + + $previous = $rootDir; + } + + $rootDir = rtrim($rootDir, '/'); + $cacheDir = $this->getCacheDir(); + $filesystem = new Filesystem(); + + return preg_replace_callback("{'([^']*)(".preg_quote($rootDir)."[^']*)'}", function ($match) use ($filesystem, $cacheDir) { + $prefix = isset($match[1]) && $match[1] ? "'$match[1]'.__DIR__.'/" : "__DIR__.'/"; + + return $prefix.rtrim($filesystem->makePathRelative($match[2], $cacheDir), '/')."'"; + }, $content); + } + /** * Returns a loader for the container. * diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/app/cache/dev/withAbsolutePaths.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/app/cache/dev/withAbsolutePaths.php new file mode 100644 index 000000000000..54e0dedc4bfd --- /dev/null +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/app/cache/dev/withAbsolutePaths.php @@ -0,0 +1,7 @@ +'ROOT_DIR/app/cache/dev/foo' +'ROOT_DIR/app/cache/foo' +'ROOT_DIR/foo/bar.php' + +'/some/where/else/foo' + +'file:ROOT_DIR/app/cache/dev/profiler' diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/app/cache/dev/withoutAbsolutePaths.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/app/cache/dev/withoutAbsolutePaths.php new file mode 100644 index 000000000000..09ce8b568392 --- /dev/null +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/app/cache/dev/withoutAbsolutePaths.php @@ -0,0 +1,7 @@ +__DIR__.'/foo' +__DIR__.'/../foo' +__DIR__.'/../../../foo/bar.php' + +'/some/where/else/foo' + +'file:'.__DIR__.'/profiler' diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/composer.json b/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/composer.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/DumpedContainers/composer.json @@ -0,0 +1 @@ +{} diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php index 5fd61bbc7e7c..c7396dd8a74b 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php @@ -16,6 +16,11 @@ class KernelForTest extends Kernel { + public function setRootDir($dir) + { + $this->rootDir = $dir; + } + public function getBundleMap() { return $this->bundleMap; diff --git a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php index bc9876df3b12..30e201fee590 100644 --- a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php @@ -722,6 +722,34 @@ public function testTerminateDelegatesTerminationOnlyForTerminableInterface() $kernel->terminate(Request::create('/'), new Response()); } + public function testRemoveAbsolutePathsFromContainer() + { + $kernel = new KernelForTest('dev', true); + $kernel->setRootDir($symfonyRootDir = __DIR__.'/Fixtures/DumpedContainers/app'); + + $content = file_get_contents($symfonyRootDir.'/cache/dev/withAbsolutePaths.php'); + $content = str_replace('ROOT_DIR', __DIR__.'/Fixtures/DumpedContainers', $content); + + $m = new \ReflectionMethod($kernel, 'removeAbsolutePathsFromContainer'); + $m->setAccessible(true); + $content = $m->invoke($kernel, $content); + $this->assertEquals(file_get_contents($symfonyRootDir.'/cache/dev/withoutAbsolutePaths.php'), $content); + } + + public function testRemoveAbsolutePathsFromContainerGiveUpWhenComposerJsonPathNotGuessable() + { + $kernel = new KernelForTest('dev', true); + $kernel->setRootDir($symfonyRootDir = sys_get_temp_dir()); + + $content = file_get_contents(__DIR__.'/Fixtures/DumpedContainers/app/cache/dev/withAbsolutePaths.php'); + $content = str_replace('ROOT_DIR', __DIR__.'/Fixtures/DumpedContainers', $content); + + $m = new \ReflectionMethod($kernel, 'removeAbsolutePathsFromContainer'); + $m->setAccessible(true); + $newContent = $m->invoke($kernel, $content); + $this->assertEquals($newContent, $content); + } + /** * Returns a mock for the BundleInterface * diff --git a/src/Symfony/Component/HttpKernel/composer.json b/src/Symfony/Component/HttpKernel/composer.json index 24bed4a2d1df..7105b5cb1281 100644 --- a/src/Symfony/Component/HttpKernel/composer.json +++ b/src/Symfony/Component/HttpKernel/composer.json @@ -29,6 +29,7 @@ "symfony/console": "~2.2", "symfony/dependency-injection": "~2.0", "symfony/finder": "~2.0", + "symfony/filesystem": "~2.4", "symfony/process": "~2.0", "symfony/routing": "~2.2", "symfony/stopwatch": "~2.2", @@ -40,7 +41,8 @@ "symfony/config": "", "symfony/console": "", "symfony/dependency-injection": "", - "symfony/finder": "" + "symfony/finder": "", + "symfony/filesystem": "" }, "autoload": { "psr-0": { "Symfony\\Component\\HttpKernel\\": "" }