Skip to content

Commit

Permalink
[Filesystem] Several issues with Filesystem::makePathRelative
Browse files Browse the repository at this point in the history
  • Loading branch information
Amrouche Hamza committed Nov 27, 2017
1 parent 22192b1 commit 58ad30b
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 33 deletions.
32 changes: 21 additions & 11 deletions src/Symfony/Component/Filesystem/Filesystem.php
Original file line number Diff line number Diff line change
Expand Up @@ -463,19 +463,27 @@ public function makePathRelative($endPath, $startPath)
if ('\\' === DIRECTORY_SEPARATOR) {
$endPath = str_replace('\\', '/', $endPath);
$startPath = str_replace('\\', '/', $startPath);
}

$stripDriveLetter = function ($path) {
if (strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && ctype_alpha($path[0])) {
return substr($path, 2);
}

return $path;
};
$stripDriveLetter = function ($path) {
if (strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && ctype_alpha($path[0])) {

$endPath = $stripDriveLetter($endPath);
$startPath = $stripDriveLetter($startPath);
return [substr($path, 2), $path[0].$path[1]];
}

return $path;
};

$endPath = $stripDriveLetter($endPath);
$startPath = $stripDriveLetter($startPath);

if ($endPath[1] !== $startPath[1]) {
return '';
}

$endPath = $endPath[0];
$startPath = $startPath[0];
}
// Split the paths into arrays
$startPathArr = explode('/', trim($startPath, '/'));
$endPathArr = explode('/', trim($endPath, '/'));
Expand Down Expand Up @@ -512,12 +520,14 @@ public function makePathRelative($endPath, $startPath)

// Repeated "../" for each level need to reach the common path
$traverser = str_repeat('../', $depth);

$endPathRemainder = implode('/', array_slice($endPathArr, $index));


// Construct $endPath from traversing to the common path, then to the remaining $endPath
$relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : '');

if ('/' !== substr($endPath, -1)) {
$relativePath = substr($relativePath, 0, -1);
}
return '' === $relativePath ? './' : $relativePath;
}

Expand Down
47 changes: 25 additions & 22 deletions src/Symfony/Component/Filesystem/Tests/FilesystemTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1094,44 +1094,47 @@ public function providePathsForMakePathRelative()
$paths = array(
array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component', '../'),
array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component/', '../'),
array('/var/lib/symfony/src/Symfony', '/var/lib/symfony/src/Symfony/Component', '../'),
array('/var/lib/symfony/src/Symfony', '/var/lib/symfony/src/Symfony/Component/', '../'),
array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component', '../'),
array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component/', '../'),
array('/usr/lib/symfony/', '/var/lib/symfony/src/Symfony/Component', '../../../../../../usr/lib/symfony/'),
array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/', 'src/Symfony/'),
array('/aa/bb', '/aa/bb', './'),
array('/aa/bb', '/aa/bb/', './'),
array('/aa/bb/', '/aa/bb', './'),
array('/aa/bb/', '/aa/bb/', './'),
array('/aa/bb/cc', '/aa/bb/cc/dd', '../'),
array('/aa/bb/cc', '/aa/bb/cc/dd/', '../'),
array('/aa/bb/', '/aa/bb', './'),
array('/aa/bb/', '/aa/bb/', './'),
array('/aa/bb/cc/', '/aa/bb/cc/dd', '../'),
array('/aa/bb/cc/', '/aa/bb/cc/dd/', '../'),
array('/aa/bb/cc/', '/aa/bb/cc/dd', '../'),
array('/aa/bb/cc/', '/aa/bb/cc/dd/', '../'),
array('/aa/bb/cc', '/aa', 'bb/cc/'),
array('/aa/bb/cc', '/aa/', 'bb/cc/'),
array('/aa/bb/cc/', '/aa', 'bb/cc/'),
array('/aa/bb/cc/', '/aa/', 'bb/cc/'),
array('/a/aab/bb', '/a/aa', '../aab/bb/'),
array('/a/aab/bb', '/a/aa/', '../aab/bb/'),
array('/aa/bb/cc/', '/aa', 'bb/cc/'),
array('/aa/bb/cc/', '/aa/', 'bb/cc/'),
array('/a/aab/bb/', '/a/aa', '../aab/bb/'),
array('/a/aab/bb/', '/a/aa/', '../aab/bb/'),
array('/a/aab/bb/', '/a/aa', '../aab/bb/'),
array('/a/aab/bb/', '/a/aa/', '../aab/bb/'),
array('/a/aab/bb/', '/', 'a/aab/bb/'),
array('/a/aab/bb/', '/b/aab', '../../a/aab/bb/'),
array('/aab/bb', '/aa', '../aab/bb/'),
array('/aab', '/aa', '../aab/'),
array('/aa/bb/cc', '/aa/dd/..', 'bb/cc/'),
array('/aa/../bb/cc', '/aa/dd/..', '../bb/cc/'),
array('/aa/bb/../../cc', '/aa/../dd/..', 'cc/'),
array('/../aa/bb/cc', '/aa/dd/..', 'bb/cc/'),
array('/../../aa/../bb/cc', '/aa/dd/..', '../bb/cc/'),
array('C:/aa/bb/cc', 'C:/aa/dd/..', 'bb/cc/'),
array('c:/aa/../bb/cc', 'c:/aa/dd/..', '../bb/cc/'),
array('C:/aa/bb/../../cc', 'C:/aa/../dd/..', 'cc/'),
array('C:/../aa/bb/cc', 'C:/aa/dd/..', 'bb/cc/'),
array('C:/../../aa/../bb/cc', 'C:/aa/dd/..', '../bb/cc/'),
array('/aab/bb/', '/aa', '../aab/bb/'),
array('/aab/', '/aa', '../aab/'),
array('/aa/bb/cc/', '/aa/dd/..', 'bb/cc/'),
array('/aa/../bb/cc/', '/aa/dd/..', '../bb/cc/'),
array('/aa/bb/../../cc/', '/aa/../dd/..', 'cc/'),
array('/../aa/bb/cc/', '/aa/dd/..', 'bb/cc/'),
array('/../../aa/../bb/cc/', '/aa/dd/..', '../bb/cc/'),
array('C:/aa/bb/cc/', 'C:/aa/dd/..', 'bb/cc/'),
array('c:/aa/../bb/cc/', 'c:/aa/dd/..', '../bb/cc/'),
array('C:/aa/bb/../../cc/', 'C:/aa/../dd/..', 'cc/'),
array('C:/../aa/bb/cc/', 'C:/aa/dd/..', '../../aa/bb/cc/'),
array('C:/../../aa/../bb/cc/', 'C:/aa/dd/..', '../../bb/cc/'),
array('/aa/bb/cc', '/aa', 'bb/cc'),
);

if ('\\' === DIRECTORY_SEPARATOR) {
$paths[] = array('c:\var\lib/symfony/src/Symfony/', 'c:/var/lib/symfony/', 'src/Symfony/');
$paths[] = array('C:\aa\bb\cc', 'D:\aa\dd\\', '');

}

return $paths;
Expand Down

0 comments on commit 58ad30b

Please sign in to comment.