D9806: windows: wrap `os.getcwd()` in `os.path.realpath()` on py3
mharbison72 (Matt Harbison)
phabricator at mercurial-scm.org
Sun Jan 17 07:18:58 UTC 2021
mharbison72 created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REVISION SUMMARY
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.
.
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D9806
AFFECTED FILES
mercurial/encoding.py
CHANGE DETAILS
diff --git a/mercurial/encoding.py b/mercurial/encoding.py
--- a/mercurial/encoding.py
+++ b/mercurial/encoding.py
@@ -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:
To: mharbison72, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
More information about the Mercurial-devel
mailing list