diff options
author | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> | 2010-10-18 12:13:18 (GMT) |
---|---|---|
committer | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> | 2010-10-18 12:13:18 (GMT) |
commit | b08820ad406b9fd291a8707e4bad41cc8486ab08 (patch) | |
tree | 4d9ef9284fb34d3e4b0e7bf7a29b60e7d952c433 | |
parent | 08654e18eed3c8b0224100fe270da618d60d6eb5 (diff) | |
download | cpython-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)
-rw-r--r-- | Lib/ntpath.py | 4 | ||||
-rw-r--r-- | Lib/posixpath.py | 4 | ||||
-rw-r--r-- | Lib/test/test_ntpath.py | 1 | ||||
-rw-r--r-- | Lib/test/test_posixpath.py | 18 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
5 files changed, 27 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") @@ -34,6 +34,10 @@ Core and Builtins Library ------- +- Issue #5117: Case normalization was needed on ntpath.relpath(). And + fixed root directory issue on posixpath.relpath(). (Ported working fixes + from ntpath) + - Issue #1343: xml.sax.saxutils.XMLGenerator now has an option short_empty_elements to direct it to use self-closing tags when appropriate. |