windows: wrap `os.getcwd()` in `os.path.realpath()` on py3
authorMatt Harbison <matt_harbison@yahoo.com>
Wed, 09 Dec 2020 00:51:35 -0500
changeset 46319 3dfebba99ef6
parent 46318 e74274fc1b35
child 46320 ef771d329961
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
mercurial/encoding.py
--- a/mercurial/encoding.py	Tue Dec 01 21:51:41 2020 -0500
+++ b/mercurial/encoding.py	Wed Dec 09 00:51:35 2020 -0500
@@ -298,7 +298,12 @@
     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: