# HG changeset patch # User Matt Harbison # Date 2020-12-09 05:51:35 # Node ID 3dfebba99ef6fbb67a4c3bbf5ccf65bedcaee977 # Parent e74274fc1b351a6390c151a930a96b35084b9928 windows: wrap `os.getcwd()` in `os.path.realpath()` on py3 I noticed various `test-check-*` failures that were printing absolute paths when repo relative paths were expected. This was due to the drive letter in `repo.root` being uppercased as it is run through `os.path.realpath()`, and then the simple string comparison against the (lowercased) `_cwd` member of dirstate in `dirstate.getcwd()` causing an absolute path to be returned, instead of the expected `b''`. That in turn causes `scmutil.getuipathfn()` to wrongly use `repo.pathto()` with an absolute cwd path. . Differential Revision: https://phab.mercurial-scm.org/D9806 diff --git a/mercurial/encoding.py b/mercurial/encoding.py --- a/mercurial/encoding.py +++ b/mercurial/encoding.py @@ -298,7 +298,12 @@ if pycompat.ispy3: if pycompat.iswindows: # Python 3 on Windows issues a DeprecationWarning about using the bytes # API when os.getcwdb() is called. - getcwd = lambda: strtolocal(os.getcwd()) # re-exports + # + # Additionally, py3.8+ uppercases the drive letter when calling + # os.path.realpath(), which is used on ``repo.root``. Since those + # strings are compared in various places as simple strings, also call + # realpath here. See https://bugs.python.org/issue40368 + getcwd = lambda: strtolocal(os.path.realpath(os.getcwd())) # re-exports else: getcwd = os.getcwdb # re-exports else: