diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index 4053d9e6a5e86..d690ee4adecbb 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -479,10 +479,11 @@ public function makePathRelative($endPath, $startPath) $startPathArr = $splitPath($startPath); $endPathArr = $splitPath($endPath); + $pathEnd = '/' === substr($endPath, -1) ? '/' : ''; if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) { // End path is on another drive, so no relative path exists - return $endDriveLetter.':/'.($endPathArr ? implode('/', $endPathArr).'/' : ''); + return $endDriveLetter.':/'.($endPathArr ? implode('/', $endPathArr).$pathEnd : ''); } // Find for which directory the common path stops @@ -504,7 +505,7 @@ public function makePathRelative($endPath, $startPath) $endPathRemainder = implode('/', \array_slice($endPathArr, $index)); // Construct $endPath from traversing to the common path, then to the remaining $endPath - $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : ''); + $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.$pathEnd : ''); return '' === $relativePath ? './' : $relativePath; } diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index c5f1674c4e37e..7250c6ac7ee27 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -1114,32 +1114,32 @@ public function providePathsForMakePathRelative() ['/aa/bb/cc', '/aa/bb/cc/dd/', '../'], ['/aa/bb/cc/', '/aa/bb/cc/dd', '../'], ['/aa/bb/cc/', '/aa/bb/cc/dd/', '../'], - ['/aa/bb/cc', '/aa', 'bb/cc/'], - ['/aa/bb/cc', '/aa/', 'bb/cc/'], + ['/aa/bb/cc', '/aa', 'bb/cc'], + ['/aa/bb/cc', '/aa/', 'bb/cc'], ['/aa/bb/cc/', '/aa', 'bb/cc/'], ['/aa/bb/cc/', '/aa/', 'bb/cc/'], - ['/a/aab/bb', '/a/aa', '../aab/bb/'], - ['/a/aab/bb', '/a/aa/', '../aab/bb/'], + ['/a/aab/bb', '/a/aa', '../aab/bb'], + ['/a/aab/bb', '/a/aa/', '../aab/bb'], ['/a/aab/bb/', '/a/aa', '../aab/bb/'], ['/a/aab/bb/', '/a/aa/', '../aab/bb/'], ['/a/aab/bb/', '/', 'a/aab/bb/'], ['/a/aab/bb/', '/b/aab', '../../a/aab/bb/'], - ['/aab/bb', '/aa', '../aab/bb/'], - ['/aab', '/aa', '../aab/'], - ['/aa/bb/cc', '/aa/dd/..', 'bb/cc/'], - ['/aa/../bb/cc', '/aa/dd/..', '../bb/cc/'], - ['/aa/bb/../../cc', '/aa/../dd/..', 'cc/'], - ['/../aa/bb/cc', '/aa/dd/..', 'bb/cc/'], - ['/../../aa/../bb/cc', '/aa/dd/..', '../bb/cc/'], - ['C:/aa/bb/cc', 'C:/aa/dd/..', 'bb/cc/'], - ['C:/aa/bb/cc', 'c:/aa/dd/..', 'bb/cc/'], - ['c:/aa/../bb/cc', 'c:/aa/dd/..', '../bb/cc/'], - ['C:/aa/bb/../../cc', 'C:/aa/../dd/..', 'cc/'], - ['C:/../aa/bb/cc', 'C:/aa/dd/..', 'bb/cc/'], - ['C:/../../aa/../bb/cc', 'C:/aa/dd/..', '../bb/cc/'], + ['/aab/bb', '/aa', '../aab/bb'], + ['/aab', '/aa', '../aab'], + ['/aa/bb/cc', '/aa/dd/..', 'bb/cc'], + ['/aa/../bb/cc', '/aa/dd/..', '../bb/cc'], + ['/aa/bb/../../cc', '/aa/../dd/..', 'cc'], + ['/../aa/bb/cc', '/aa/dd/..', 'bb/cc'], + ['/../../aa/../bb/cc', '/aa/dd/..', '../bb/cc'], + ['C:/aa/bb/cc', 'C:/aa/dd/..', 'bb/cc'], + ['C:/aa/bb/cc', 'c:/aa/dd/..', 'bb/cc'], + ['c:/aa/../bb/cc', 'c:/aa/dd/..', '../bb/cc'], + ['C:/aa/bb/../../cc', 'C:/aa/../dd/..', 'cc'], + ['C:/../aa/bb/cc', 'C:/aa/dd/..', 'bb/cc'], + ['C:/../../aa/../bb/cc', 'C:/aa/dd/..', '../bb/cc'], ['D:/', 'C:/aa/../bb/cc', 'D:/'], - ['D:/aa/bb', 'C:/aa', 'D:/aa/bb/'], - ['D:/../../aa/../bb/cc', 'C:/aa/dd/..', 'D:/bb/cc/'], + ['D:/aa/bb', 'C:/aa', 'D:/aa/bb'], + ['D:/../../aa/../bb/cc', 'C:/aa/dd/..', 'D:/bb/cc'], ]; if ('\\' === \DIRECTORY_SEPARATOR) {