Merged revisions 85689 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r85689 | hirokazu.yamamoto | 2010-10-18 21:13:18 +0900 | 3 lines

  Issue #5117: Case normalization was needed on ntpath.relpath(). And
  fixed root directory issue on posixpath.relpath(). (Ported working fixes
  from ntpath)
........
This commit is contained in:
Hirokazu Yamamoto 2010-10-18 13:49:09 +00:00
parent fd6a55ec41
commit 089144e511
5 changed files with 27 additions and 4 deletions

View File

@ -600,7 +600,7 @@ def relpath(path, start=curdir):
path_abs = abspath(normpath(path)) path_abs = abspath(normpath(path))
start_drive, start_rest = splitdrive(start_abs) start_drive, start_rest = splitdrive(start_abs)
path_drive, path_rest = splitdrive(path_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( error = "path is on mount '{0}', start on mount '{1}'".format(
path_drive, start_drive) path_drive, start_drive)
raise ValueError(error) raise ValueError(error)
@ -610,7 +610,7 @@ def relpath(path, start=curdir):
# Work out how much of the filepath is shared by start and path. # Work out how much of the filepath is shared by start and path.
i = 0 i = 0
for e1, e2 in zip(start_list, path_list): for e1, e2 in zip(start_list, path_list):
if e1 != e2: if normcase(e1) != normcase(e2):
break break
i += 1 i += 1

View File

@ -444,8 +444,8 @@ def relpath(path, start=None):
if start is None: if start is None:
start = curdir start = curdir
start_list = abspath(start).split(sep) start_list = [x for x in abspath(start).split(sep) if x]
path_list = abspath(path).split(sep) 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. # Work out how much of the filepath is shared by start and path.
i = len(commonprefix([start_list, path_list])) i = len(commonprefix([start_list, path_list]))

View File

@ -236,6 +236,7 @@ class TestNtpath(unittest.TestCase):
tester('ntpath.relpath("/", "/")', '.') tester('ntpath.relpath("/", "/")', '.')
tester('ntpath.relpath("/a", "/a")', '.') tester('ntpath.relpath("/a", "/a")', '.')
tester('ntpath.relpath("/a/b", "/a/b")', '.') tester('ntpath.relpath("/a/b", "/a/b")', '.')
tester('ntpath.relpath("c:/foo", "C:/FOO")', '.')
def test_main(): def test_main():

View File

@ -602,6 +602,15 @@ class PosixPathTest(unittest.TestCase):
"../"+curdir+"/a/b") "../"+curdir+"/a/b")
self.assertEqual(posixpath.relpath("a", "b/c"), "../../a") self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
self.assertEqual(posixpath.relpath("a", "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: finally:
os.getcwd = real_getcwd os.getcwd = real_getcwd
@ -620,6 +629,15 @@ class PosixPathTest(unittest.TestCase):
b"../"+curdir+b"/a/b") b"../"+curdir+b"/a/b")
self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a") 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"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, b"bytes", "str")
self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes") self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")

View File

@ -128,6 +128,10 @@ C-API
Library Library
------- -------
- Issue #5117: Case normalization was needed on ntpath.relpath(). And
fixed root directory issue on posixpath.relpath(). (Ported working fixes
from ntpath)
- Issue #10041: The signature of optional arguments in socket.makefile() - Issue #10041: The signature of optional arguments in socket.makefile()
didn't match that of io.open(), and they also didn't get forwarded didn't match that of io.open(), and they also didn't get forwarded
properly to TextIOWrapper in text mode. Patch by Kai Zhu. properly to TextIOWrapper in text mode. Patch by Kai Zhu.