Mercurial > public > mercurial-scm > hg-stable
diff mercurial/windows.py @ 47622:bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
This will let us mitigate the drive letter capitalization hell.
See inline comment for details.
Differential Revision: https://phab.mercurial-scm.org/D11059
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sat, 10 Jul 2021 13:46:24 +0200 |
parents | f77404040776 |
children | 064cd182555f |
line wrap: on
line diff
--- a/mercurial/windows.py Sat Jul 10 13:10:18 2021 +0200 +++ b/mercurial/windows.py Sat Jul 10 13:46:24 2021 +0200 @@ -333,6 +333,25 @@ return encoding.upper(path) # NTFS compares via upper() +DRIVE_RE_B = re.compile(b'^[a-z]:') +DRIVE_RE_S = re.compile('^[a-z]:') + + +def abspath(path): + abs_path = os.path.abspath(path) # re-exports + # Python on Windows is inconsistent regarding the capitalization of drive + # letter and this cause issue with various path comparison along the way. + # So we normalize the drive later to upper case here. + # + # See https://bugs.python.org/issue40368 for and example of this hell. + if isinstance(abs_path, bytes): + if DRIVE_RE_B.match(abs_path): + abs_path = abs_path[0:1].upper() + abs_path[1:] + elif DRIVE_RE_S.match(abs_path): + abs_path = abs_path[0:1].upper() + abs_path[1:] + return abs_path + + # see posix.py for definitions normcasespec = encoding.normcasespecs.upper normcasefallback = encoding.upperfallback