diff --git a/hgext/win32mbcs.py b/hgext/win32mbcs.py --- a/hgext/win32mbcs.py +++ b/hgext/win32mbcs.py @@ -128,8 +128,6 @@ def wrapname(name, wrapper): # they use result of os.path.split() funcs = '''os.path.join os.path.split os.path.splitext os.path.splitunc os.path.normpath os.makedirs - mercurial.windows.normcase - mercurial.util.normcase mercurial.util.endswithsep mercurial.util.splitpath mercurial.util.checkcase mercurial.util.fspath mercurial.util.pconvert mercurial.util.normpath mercurial.util.checkwinfilename mercurial.util.checkosfilename''' diff --git a/mercurial/encoding.py b/mercurial/encoding.py --- a/mercurial/encoding.py +++ b/mercurial/encoding.py @@ -171,3 +171,22 @@ def lower(s): return lu.encode(encoding) except UnicodeError: return s.lower() # we don't know how to fold this except in ASCII + except LookupError, k: + raise error.Abort(k, hint="please check your locale settings") + +def upper(s): + "best-effort encoding-aware case-folding of local string s" + try: + if isinstance(s, localstr): + u = s._utf8.decode("utf-8") + else: + u = s.decode(encoding, encodingmode) + + uu = u.upper() + if u == uu: + return s # preserve localstring + return uu.encode(encoding) + except UnicodeError: + return s.upper() # we don't know how to fold this except in ASCII + except LookupError, k: + raise error.Abort(k, hint="please check your locale settings") diff --git a/mercurial/posix.py b/mercurial/posix.py --- a/mercurial/posix.py +++ b/mercurial/posix.py @@ -164,6 +164,9 @@ def samedevice(fpath1, fpath2): st2 = os.lstat(fpath2) return st1.st_dev == st2.st_dev +encodinglower = None +encodingupper = None + # os.path.normcase is a no-op, which doesn't help us on non-native filesystems def normcase(path): return path.lower() diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -24,6 +24,9 @@ if os.name == 'nt': else: import posix as platform +platform.encodinglower = encoding.lower +platform.encodingupper = encoding.upper + cachestat = platform.cachestat checkexec = platform.checkexec checklink = platform.checklink diff --git a/mercurial/windows.py b/mercurial/windows.py --- a/mercurial/windows.py +++ b/mercurial/windows.py @@ -131,8 +131,11 @@ def localpath(path): def normpath(path): return pconvert(os.path.normpath(path)) +encodinglower = None +encodingupper = None + def normcase(path): - return path.upper() + return encodingupper(path) def realpath(path): '''