windows: replicate the normalizing behavior of os.environ
authorRaphaël Gomès <rgomes@octobus.net>
Thu, 08 Jul 2021 15:55:15 +0200
changeset 47560 af633293a5bd
parent 47559 53a864a60281
child 47561 8e9295912573
windows: replicate the normalizing behavior of os.environ On Windows, `os.environ` normalizes environment variables to uppercase. Our current bytes-based environ substitution object is a simple dict, so we add the normalization behavior. This fixes test-http-peer.t on Windows. Differential Revision: https://phab.mercurial-scm.org/D10998
mercurial/encoding.py
--- a/mercurial/encoding.py	Thu Jul 08 15:55:04 2021 +0200
+++ b/mercurial/encoding.py	Thu Jul 08 15:55:15 2021 +0200
@@ -338,10 +338,19 @@
 if not _nativeenviron:
     # now encoding and helper functions are available, recreate the environ
     # dict to be exported to other modules
-    environ = {
-        tolocal(k.encode('utf-8')): tolocal(v.encode('utf-8'))
-        for k, v in os.environ.items()  # re-exports
-    }
+    if pycompat.iswindows and pycompat.ispy3:
+
+        class WindowsEnviron(dict):
+            """`os.environ` normalizes environment variables to uppercase on windows"""
+
+            def get(self, key, default=None):
+                return super().get(upper(key), default)
+
+        environ = WindowsEnviron()
+
+    for k, v in os.environ.items():  # re-exports
+        environ[tolocal(k.encode('utf-8'))] = tolocal(v.encode('utf-8'))
+
 
 if pycompat.ispy3:
     # os.getcwd() on Python 3 returns string, but it has os.getcwdb() which