summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>2010-10-18 12:13:18 (GMT)
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>2010-10-18 12:13:18 (GMT)
commitb08820ad406b9fd291a8707e4bad41cc8486ab08 (patch)
tree4d9ef9284fb34d3e4b0e7bf7a29b60e7d952c433 /Lib
parent08654e18eed3c8b0224100fe270da618d60d6eb5 (diff)
downloadcpython-b08820ad406b9fd291a8707e4bad41cc8486ab08.zip
cpython-b08820ad406b9fd291a8707e4bad41cc8486ab08.tar.gz
cpython-b08820ad406b9fd291a8707e4bad41cc8486ab08.tar.bz2
Issue #5117: Case normalization was needed on ntpath.relpath(). And
fixed root directory issue on posixpath.relpath(). (Ported working fixes from ntpath)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/ntpath.py4
-rw-r--r--Lib/posixpath.py4
-rw-r--r--Lib/test/test_ntpath.py1
-rw-r--r--Lib/test/test_posixpath.py18
4 files changed, 23 insertions, 4 deletions
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index d2410f6..579673d 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -616,7 +616,7 @@ def relpath(path, start=curdir):
path_abs = abspath(normpath(path))
start_drive, start_rest = splitdrive(start_abs)
path_drive, path_rest = splitdrive(path_abs)
- if start_drive != path_drive:
+ if normcase(start_drive) != normcase(path_drive):
error = "path is on mount '{0}', start on mount '{1}'".format(
path_drive, start_drive)
raise ValueError(error)
@@ -626,7 +626,7 @@ def relpath(path, start=curdir):
# Work out how much of the filepath is shared by start and path.
i = 0
for e1, e2 in zip(start_list, path_list):
- if e1 != e2:
+ if normcase(e1) != normcase(e2):
break
i += 1
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 2d68b73..c9829e1 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -447,8 +447,8 @@ def relpath(path, start=None):
if start is None:
start = curdir
- start_list = abspath(start).split(sep)
- path_list = abspath(path).split(sep)
+ start_list = [x for x in abspath(start).split(sep) if x]
+ path_list = [x for x in abspath(path).split(sep) if x]
# Work out how much of the filepath is shared by start and path.
i = len(commonprefix([start_list, path_list]))
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index 5609aee..237aec0 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -238,6 +238,7 @@ class TestNtpath(unittest.TestCase):
tester('ntpath.relpath("/", "/")', '.')
tester('ntpath.relpath("/a", "/a")', '.')
tester('ntpath.relpath("/a/b", "/a/b")', '.')
+ tester('ntpath.relpath("c:/foo", "C:/FOO")', '.')
def test_sameopenfile(self):
with TemporaryFile() as tf1, TemporaryFile() as tf2:
diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py
index fd71ac9..8cac0df 100644
--- a/Lib/test/test_posixpath.py
+++ b/Lib/test/test_posixpath.py
@@ -394,6 +394,15 @@ class PosixPathTest(unittest.TestCase):
"../"+curdir+"/a/b")
self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
self.assertEqual(posixpath.relpath("a", "a"), ".")
+ self.assertEqual(posixpath.relpath("/foo/bar/bat", "/x/y/z"), '../../../foo/bar/bat')
+ self.assertEqual(posixpath.relpath("/foo/bar/bat", "/foo/bar"), 'bat')
+ self.assertEqual(posixpath.relpath("/foo/bar/bat", "/"), 'foo/bar/bat')
+ self.assertEqual(posixpath.relpath("/", "/foo/bar/bat"), '../../..')
+ self.assertEqual(posixpath.relpath("/foo/bar/bat", "/x"), '../foo/bar/bat')
+ self.assertEqual(posixpath.relpath("/x", "/foo/bar/bat"), '../../../x')
+ self.assertEqual(posixpath.relpath("/", "/"), '.')
+ self.assertEqual(posixpath.relpath("/a", "/a"), '.')
+ self.assertEqual(posixpath.relpath("/a/b", "/a/b"), '.')
finally:
os.getcwd = real_getcwd
@@ -412,6 +421,15 @@ class PosixPathTest(unittest.TestCase):
b"../"+curdir+b"/a/b")
self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
+ self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/x/y/z"), b'../../../foo/bar/bat')
+ self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/foo/bar"), b'bat')
+ self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/"), b'foo/bar/bat')
+ self.assertEqual(posixpath.relpath(b"/", b"/foo/bar/bat"), b'../../..')
+ self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/x"), b'../foo/bar/bat')
+ self.assertEqual(posixpath.relpath(b"/x", b"/foo/bar/bat"), b'../../../x')
+ self.assertEqual(posixpath.relpath(b"/", b"/"), b'.')
+ self.assertEqual(posixpath.relpath(b"/a", b"/a"), b'.')
+ self.assertEqual(posixpath.relpath(b"/a/b", b"/a/b"), b'.')
self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")