Patchwork D11057: compat: enforce upper case drive letter in mercurial too

login
register
mail settings
Submitter phabricator
Date July 10, 2021, 1 a.m.
Message ID <differential-rev-PHID-DREV-lho3pkzufnqenvjypatb-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/49371/
State New
Headers show

Comments

phabricator - July 10, 2021, 1 a.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  This is affecting code that checks if a pull/push destination is the same as a
  configured one. For example the bookmark divergence creation code.
  
  Doing this fixes `test-bookmarks.t` and `test-bookflow.t` on Windows.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D11057

AFFECTED FILES
  mercurial/encoding.py

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/mercurial/encoding.py b/mercurial/encoding.py
--- a/mercurial/encoding.py
+++ b/mercurial/encoding.py
@@ -9,6 +9,7 @@ 
 
 import locale
 import os
+import re
 import unicodedata
 
 from .pycompat import getattr
@@ -352,6 +353,8 @@ 
         environ[tolocal(k.encode('utf-8'))] = tolocal(v.encode('utf-8'))
 
 
+DRIVE_RE = re.compile(b'^[a-z]:')
+
 if pycompat.ispy3:
     # os.getcwd() on Python 3 returns string, but it has os.getcwdb() which
     # returns bytes.
@@ -363,7 +366,18 @@ 
         # 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
+        #
+        # However this is not reliable, so lets explicitly make this drive
+        # letter upper case.
+
+        def getcwd():
+            cwd = os.getcwd()  # re-exports
+            cwd = os.path.realpath(cwd)
+            cwd = strtolocal(cwd)
+            if DRIVE_RE.match(cwd):
+                cwd = cwd = cwd[0:1].upper() + cwd[1:]
+            return cwd
+
     else:
         getcwd = os.getcwdb  # re-exports
 else: