bpo-9949: Call normpath() in realpath() and avoid unnecessary prefixes (GH-15376)
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index ef4999e..1d22d5f 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -458,7 +458,8 @@
# in the case of paths with these prefixes:
# \\.\ -> device names
# \\?\ -> literal paths
- # do not do any normalization, but return the path unchanged
+ # do not do any normalization, but return the path
+ # unchanged apart from the call to os.fspath()
return path
path = path.replace(altsep, sep)
prefix, path = splitdrive(path)
@@ -575,7 +576,7 @@
return abspath(tail)
def realpath(path):
- path = os.fspath(path)
+ path = normpath(path)
if isinstance(path, bytes):
prefix = b'\\\\?\\'
unc_prefix = b'\\\\?\\UNC\\'
@@ -586,6 +587,7 @@
unc_prefix = '\\\\?\\UNC\\'
new_unc_prefix = '\\\\'
cwd = os.getcwd()
+ did_not_exist = not exists(path)
had_prefix = path.startswith(prefix)
path = _getfinalpathname_nonstrict(path)
# The path returned by _getfinalpathname will always start with \\?\ -
@@ -603,7 +605,10 @@
if _getfinalpathname(spath) == path:
path = spath
except OSError as ex:
- pass
+ # If the path does not exist and originally did not exist, then
+ # strip the prefix anyway.
+ if ex.winerror in {2, 3} and did_not_exist:
+ path = spath
return path