diff --git a/mercurial/encoding.py b/mercurial/encoding.py --- a/mercurial/encoding.py +++ b/mercurial/encoding.py @@ -290,6 +290,42 @@ for k, v in os.environ.items() # re-exports } +# Environment variables are normalized to uppercase on Windows. So wrap +# in a custom type to emulate what the standard library does. +if pycompat.ispy3 and pycompat.iswindows: + + class UppercaseDict(dict): + def __init__(self, values): + super(UppercaseDict, self).__init__() + for k, v in values.items(): + self[k] = v + + def __setitem__(self, key, value): + super(UppercaseDict, self).__setitem__(key.upper(), value) + + def __getitem__(self, key): + return super(UppercaseDict, self).__getitem__(key.upper()) + + def __delitem__(self, key): + super(UppercaseDict, self).__delitem__(key.upper()) + + def __contains__(self, key): + return super(UppercaseDict, self).__contains__(key.upper()) + + def get(self, key, *args): + return super(UppercaseDict, self).get(key.upper(), *args) + + def pop(self, key, *args): + return super(UppercaseDict, self).pop(key.upper(), *args) + + def update(self): + raise NotImplementedError + + def setdefault(self, key, *args): + return super(UppercaseDict, self).setdefault(key.upper(), *args) + + environ = UppercaseDict(environ) + if pycompat.ispy3: # os.getcwd() on Python 3 returns string, but it has os.getcwdb() which # returns bytes.