Commit dd5a46c6 authored by Serhiy Storchaka's avatar Serhiy Storchaka

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().
parent d1a61dcc
......@@ -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
......
......@@ -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'))
......
......@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment