Commit 33dc0a17 authored by Tim Peters's avatar Tim Peters

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

special cases.  test_pkg works again on Windows.
parent 4223f89e
...@@ -42,22 +42,46 @@ def join(a, *p): ...@@ -42,22 +42,46 @@ def join(a, *p):
"""Join two or more pathname components, inserting "\\" as needed""" """Join two or more pathname components, inserting "\\" as needed"""
path = a path = a
for b in p: for b in p:
# If path starts with a raw drive letter (e.g. "C:"), and b doesn't b_wins = 0 # set to 1 iff b makes path irrelevant
# start with a drive letter, path+b is correct, and regardless of\ if path == "":
# whether b is absolute on its own. b_wins = 1
if len(path) >= 2 and path[1] == ":" and splitdrive(b)[0] == "":
if path[-1] in "/\\" and b[:1] in "/\\": elif isabs(b):
b = b[1:] # This probably wipes out path so far. However, it's more
# complicated if path begins with a drive letter:
# In any other case, if b is absolute it wipes out the path so far. # 1. join('c:', '/a') == 'c:/a'
elif isabs(b) or path == "": # 2. join('c:/', '/a') == 'c:/a'
path = "" # But
# 3. join('c:/a', '/b') == '/b'
# Else make sure a separator appears between the pieces. # 4. join('c:', 'd:/') = 'd:/'
elif path[-1:] not in "/\\": # 5. join('c:/', 'd:/') = 'd:/'
b = "\\" + b if path[1:2] != ":" or b[1:2] == ":":
# Path doesn't start with a drive letter, or cases 4 and 5.
path += b b_wins = 1
# 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
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 return path
......
...@@ -66,6 +66,13 @@ tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c') ...@@ -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")', 'a\\b\\c')
tester('ntpath.join("a", "b", "\\c")', '\\c') tester('ntpath.join("a", "b", "\\c")', '\\c')
tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep') 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: if errors:
raise TestFailed(str(errors) + " errors.") raise TestFailed(str(errors) + " errors.")
......
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