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
--- 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: