comparison 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
comparison
equal deleted inserted replaced
47621:d6ee6456bd5f 47622:bb917eea1605
329 return pconvert(os.path.normpath(path)) 329 return pconvert(os.path.normpath(path))
330 330
331 331
332 def normcase(path): 332 def normcase(path):
333 return encoding.upper(path) # NTFS compares via upper() 333 return encoding.upper(path) # NTFS compares via upper()
334
335
336 DRIVE_RE_B = re.compile(b'^[a-z]:')
337 DRIVE_RE_S = re.compile('^[a-z]:')
338
339
340 def abspath(path):
341 abs_path = os.path.abspath(path) # re-exports
342 # Python on Windows is inconsistent regarding the capitalization of drive
343 # letter and this cause issue with various path comparison along the way.
344 # So we normalize the drive later to upper case here.
345 #
346 # See https://bugs.python.org/issue40368 for and example of this hell.
347 if isinstance(abs_path, bytes):
348 if DRIVE_RE_B.match(abs_path):
349 abs_path = abs_path[0:1].upper() + abs_path[1:]
350 elif DRIVE_RE_S.match(abs_path):
351 abs_path = abs_path[0:1].upper() + abs_path[1:]
352 return abs_path
334 353
335 354
336 # see posix.py for definitions 355 # see posix.py for definitions
337 normcasespec = encoding.normcasespecs.upper 356 normcasespec = encoding.normcasespecs.upper
338 normcasefallback = encoding.upperfallback 357 normcasefallback = encoding.upperfallback