From: Serhiy Storchaka Date: Mon, 16 Dec 2013 13:15:29 +0000 (+0200) Subject: Issue #19912: Fixed numerous bugs in ntpath.splitunc(). X-Git-Tag: v2.7.8~198 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd5a46c696a127a947e015741c4565878d72b3d4;p=python Issue #19912: Fixed numerous bugs in ntpath.splitunc(). * splitunc() no more returns illegal result for paths with redundant slashes. * splitunc() now correctly processes the u'İ' character (U+0130, LATIN CAPITAL LETTER I WITH DOT ABOVE). * Added new tests for splitunc(). --- diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 4f8f423c08..04f0b2d4b3 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -136,6 +136,25 @@ def splitunc(p): using backslashes). unc+rest is always the input path. Paths containing drive letters never have an UNC part. """ + #if p[1:2] == ':': + #return '', p # Drive letter present + #firstTwo = p[0:2] + #if firstTwo == '//' or firstTwo == '\\\\': + ## is a UNC path: + ## vvvvvvvvvvvvvvvvvvvv equivalent to drive letter + ## \\machine\mountpoint\directories... + ## directory ^^^^^^^^^^^^^^^ + #normp = normcase(p) + #index = normp.find('\\', 2) + #if index == -1: + ###raise RuntimeError, 'illegal UNC path: "' + p + '"' + #return ("", p) + #index = normp.find('\\', index + 1) + #if index == -1: + #index = len(p) + #return p[:index], p[index:] + #return '', p + if p[1:2] == ':': return '', p # Drive letter present firstTwo = p[0:2] @@ -144,15 +163,18 @@ def splitunc(p): # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter # \\machine\mountpoint\directories... # directory ^^^^^^^^^^^^^^^ - normp = normcase(p) - index = normp.find('\\', 2) - if index == -1: - ##raise RuntimeError, 'illegal UNC path: "' + p + '"' - return ("", p) - index = normp.find('\\', index + 1) - if index == -1: - index = len(p) - return p[:index], p[index:] + normp = p.replace('\\', '/') + index = normp.find('/', 2) + if index <= 2: + return '', p + index2 = normp.find('/', index + 1) + # a UNC path can't have two slashes in a row + # (after the initial two) + if index2 == index + 1: + return '', p + if index2 == -1: + index2 = len(p) + return p[:index2], p[index2:] return '', p diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index e1852c0eb7..749afbce87 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -33,10 +33,24 @@ class TestNtpath(unittest.TestCase): ('c:', '/foo/bar')) def test_splitunc(self): + tester('ntpath.splitunc("c:\\foo\\bar")', + ('', 'c:\\foo\\bar')) + tester('ntpath.splitunc("c:/foo/bar")', + ('', 'c:/foo/bar')) tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")', ('\\\\conky\\mountpoint', '\\foo\\bar')) tester('ntpath.splitunc("//conky/mountpoint/foo/bar")', ('//conky/mountpoint', '/foo/bar')) + tester('ntpath.splitunc("\\\\\\conky\\mountpoint\\foo\\bar")', + ('', '\\\\\\conky\\mountpoint\\foo\\bar')) + tester('ntpath.splitunc("///conky/mountpoint/foo/bar")', + ('', '///conky/mountpoint/foo/bar')) + tester('ntpath.splitunc("\\\\conky\\\\mountpoint\\foo\\bar")', + ('', '\\\\conky\\\\mountpoint\\foo\\bar')) + tester('ntpath.splitunc("//conky//mountpoint/foo/bar")', + ('', '//conky//mountpoint/foo/bar')) + self.assertEqual(ntpath.splitunc(u'//conky/MOUNTPO\u0130NT/foo/bar'), + (u'//conky/MOUNTPO\u0130NT', u'/foo/bar')) def test_split(self): tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar')) diff --git a/Misc/NEWS b/Misc/NEWS index 3c9481417e..44ec6f1611 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -23,6 +23,8 @@ Core and Builtins Library ------- +- Issue #19912: Fixed numerous bugs in ntpath.splitunc(). + - Issue #19623: Fixed writing to unseekable files in the aifc module. Fixed writing 'ulaw' (lower case) compressed AIFC files.