Mercurial > hg > mercurial-crew
changeset 15672:2ebe3d0ce91d stable
i18n: use encoding.lower/upper for encoding aware case folding
this patch uses encoding.lower/upper for case folding, because ones of
str can not fold case of non ascii characters correctly.
to avoid cyclic dependency and to encapsulate logic of normcase in
each platforms, this patch introduces encodinglower/encodingupper in
both posix/windows specific files.
this patch does not change implementation of normcase() in posix.py,
because we do not know the encoding of filenames on POSIX.
some "normcase()" are excluded from function wrap list in
hgext/win32mbcs.py, because they become encoding aware by this patch.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Fri, 16 Dec 2011 21:09:41 +0900 (2011-12-16) |
parents | 3c5e818ac679 |
children | d550168f11ce |
files | hgext/win32mbcs.py mercurial/encoding.py mercurial/posix.py mercurial/util.py mercurial/windows.py |
diffstat | 5 files changed, 29 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/win32mbcs.py +++ b/hgext/win32mbcs.py @@ -128,8 +128,6 @@ # 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'''
--- a/mercurial/encoding.py +++ b/mercurial/encoding.py @@ -171,3 +171,22 @@ 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")
--- a/mercurial/posix.py +++ b/mercurial/posix.py @@ -164,6 +164,9 @@ 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()