From: Hirokazu Yamamoto Date: Mon, 18 Oct 2010 13:55:29 +0000 (+0000) Subject: Issue #5117: Fixed root directory related issue on posixpath.relpath() and X-Git-Tag: v2.7.1rc1~130 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=50f7d7e21346875886d0b86c50ff46adb7049b6b;p=python Issue #5117: Fixed root directory related issue on posixpath.relpath() and ntpath.relpath(). --- diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 11a0a3efcb..091a242485 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -488,8 +488,8 @@ def relpath(path, start=curdir): if not path: raise ValueError("no path specified") - 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] if start_list[0].lower() != path_list[0].lower(): unc_path, rest = splitunc(path) unc_start, rest = splitunc(start) diff --git a/Lib/posixpath.py b/Lib/posixpath.py index 81f25b86e0..aae38d5abf 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -403,8 +403,8 @@ def relpath(path, start=curdir): if not path: raise ValueError("no path specified") - 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 73645f19bf..e1852c0eb7 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -178,6 +178,16 @@ class TestNtpath(unittest.TestCase): tester('ntpath.relpath("a", "b/c")', '..\\..\\a') tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a') tester('ntpath.relpath("a", "a")', '.') + tester('ntpath.relpath("/foo/bar/bat", "/x/y/z")', '..\\..\\..\\foo\\bar\\bat') + tester('ntpath.relpath("/foo/bar/bat", "/foo/bar")', 'bat') + tester('ntpath.relpath("/foo/bar/bat", "/")', 'foo\\bar\\bat') + tester('ntpath.relpath("/", "/foo/bar/bat")', '..\\..\\..') + tester('ntpath.relpath("/foo/bar/bat", "/x")', '..\\foo\\bar\\bat') + tester('ntpath.relpath("/x", "/foo/bar/bat")', '..\\..\\..\\x') + tester('ntpath.relpath("/", "/")', '.') + tester('ntpath.relpath("/a", "/a")', '.') + tester('ntpath.relpath("/a/b", "/a/b")', '.') + tester('ntpath.relpath("c:/foo", "C:/FOO")', '.') class NtCommonTest(test_genericpath.CommonTest): diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index 2288c48f47..8bb78d66e2 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -322,6 +322,15 @@ class PosixPathTest(unittest.TestCase): self.assertEqual(posixpath.relpath("a/b", "../c"), "../"+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 diff --git a/Misc/NEWS b/Misc/NEWS index b597bd5783..3ff641c6c9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -60,6 +60,9 @@ Core and Builtins Library ------- +- Issue #5117: Fixed root directory related issue on posixpath.relpath() and + ntpath.relpath(). + - Issue 9409: Fix the regex to match all kind of filenames, for interactive debugging in doctests.