One more crack at join(): stop trying to pretend this isn't a mass of

special cases.  test_pkg works again on Windows.
This commit is contained in:
Tim Peters 2001-07-27 08:09:54 +00:00
parent 4223f89edd
commit 33dc0a1705
2 changed files with 44 additions and 13 deletions

View File

@ -42,22 +42,46 @@ def join(a, *p):
"""Join two or more pathname components, inserting "\\" as needed"""
path = a
for b in p:
# If path starts with a raw drive letter (e.g. "C:"), and b doesn't
# start with a drive letter, path+b is correct, and regardless of\
# whether b is absolute on its own.
if len(path) >= 2 and path[1] == ":" and splitdrive(b)[0] == "":
if path[-1] in "/\\" and b[:1] in "/\\":
b = b[1:]
b_wins = 0 # set to 1 iff b makes path irrelevant
if path == "":
b_wins = 1
# In any other case, if b is absolute it wipes out the path so far.
elif isabs(b) or path == "":
path = ""
elif isabs(b):
# This probably wipes out path so far. However, it's more
# complicated if path begins with a drive letter:
# 1. join('c:', '/a') == 'c:/a'
# 2. join('c:/', '/a') == 'c:/a'
# But
# 3. join('c:/a', '/b') == '/b'
# 4. join('c:', 'd:/') = 'd:/'
# 5. join('c:/', 'd:/') = 'd:/'
if path[1:2] != ":" or b[1:2] == ":":
# Path doesn't start with a drive letter, or cases 4 and 5.
b_wins = 1
# Else make sure a separator appears between the pieces.
elif path[-1:] not in "/\\":
b = "\\" + b
# Else path has a drive letter, and b doesn't but is absolute.
elif len(path) > 3 or (len(path) == 3 and
path[-1] not in "/\\"):
# case 3
b_wins = 1
path += b
if b_wins:
path = b
else:
# Join, and ensure there's a separator.
assert len(path) > 0
if path[-1] in "/\\":
if b and b[0] in "/\\":
path += b[1:]
else:
path += b
elif path[-1] == ":":
path += b
elif b:
if b[0] in "/\\":
path += b
else:
path += "\\" + b
return path

View File

@ -66,6 +66,13 @@ tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c')
tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c')
tester('ntpath.join("a", "b", "\\c")', '\\c')
tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep')
tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b')
tester("ntpath.join('c:', '/a')", 'c:/a')
tester("ntpath.join('c:/', '/a')", 'c:/a')
tester("ntpath.join('c:/a', '/b')", '/b')
tester("ntpath.join('c:', 'd:/')", 'd:/')
tester("ntpath.join('c:/', 'd:/')", 'd:/')
tester("ntpath.join('c:/', 'd:/a/b')", 'd:/a/b')
if errors:
raise TestFailed(str(errors) + " errors.")