bpo-30177: pathlib: include the full path in resolve(strict=False) (#1893) (#1985)
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index 70f5cba..48b566d 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -187,19 +187,18 @@
if strict:
return self._ext_to_normal(_getfinalpathname(s))
else:
+ tail_parts = [] # End of the path after the first one not found
while True:
try:
s = self._ext_to_normal(_getfinalpathname(s))
except FileNotFoundError:
previous_s = s
- s = os.path.dirname(s)
+ s, tail = os.path.split(s)
+ tail_parts.append(tail)
if previous_s == s:
return path
else:
- if previous_s is None:
- return s
- else:
- return s + os.path.sep + os.path.basename(previous_s)
+ return os.path.join(s, *reversed(tail_parts))
# Means fallback on absolute
return None
@@ -330,12 +329,10 @@
try:
target = accessor.readlink(newpath)
except OSError as e:
- if e.errno != EINVAL:
- if strict:
- raise
- else:
- return newpath
- # Not a symlink
+ if e.errno != EINVAL and strict:
+ raise
+ # Not a symlink, or non-strict mode. We just leave the path
+ # untouched.
path = newpath
else:
seen[newpath] = None # not resolved symlink