comparison mercurial/util.py @ 3843:abaa2cd00d2b

make transcoding more robust default to ASCII abort if unknown encoding wrap abort strings with _ add test
author Matt Mackall <mpm@selenic.com>
date Sat, 09 Dec 2006 12:46:01 -0600
parents d1ce5461beed
children 4f6db0233606
comparison
equal deleted inserted replaced
3842:47c634bf1e92 3843:abaa2cd00d2b
15 from i18n import gettext as _ 15 from i18n import gettext as _
16 from demandload import * 16 from demandload import *
17 demandload(globals(), "cStringIO errno getpass popen2 re shutil sys tempfile") 17 demandload(globals(), "cStringIO errno getpass popen2 re shutil sys tempfile")
18 demandload(globals(), "os threading time calendar ConfigParser locale") 18 demandload(globals(), "os threading time calendar ConfigParser locale")
19 19
20 _encoding = os.environ.get("HGENCODING") or locale.getpreferredencoding() 20 _encoding = os.environ.get("HGENCODING") or locale.getpreferredencoding() \
21 or "ascii"
21 _encodingmode = os.environ.get("HGENCODINGMODE", "strict") 22 _encodingmode = os.environ.get("HGENCODINGMODE", "strict")
22 _fallbackencoding = 'ISO-8859-1' 23 _fallbackencoding = 'ISO-8859-1'
23 24
24 def tolocal(s): 25 def tolocal(s):
25 """ 26 """
33 """ 34 """
34 for e in ('UTF-8', _fallbackencoding): 35 for e in ('UTF-8', _fallbackencoding):
35 try: 36 try:
36 u = s.decode(e) # attempt strict decoding 37 u = s.decode(e) # attempt strict decoding
37 return u.encode(_encoding, "replace") 38 return u.encode(_encoding, "replace")
39 except LookupError, k:
40 raise Abort(_("%s, please check your locale settings") % k)
38 except UnicodeDecodeError: 41 except UnicodeDecodeError:
39 pass 42 pass
40 u = s.decode("utf-8", "replace") # last ditch 43 u = s.decode("utf-8", "replace") # last ditch
41 return u.encode(_encoding, "replace") 44 return u.encode(_encoding, "replace")
42 45
52 """ 55 """
53 try: 56 try:
54 return s.decode(_encoding, _encodingmode).encode("utf-8") 57 return s.decode(_encoding, _encodingmode).encode("utf-8")
55 except UnicodeDecodeError, inst: 58 except UnicodeDecodeError, inst:
56 sub = s[max(0, inst.start-10):inst.start+10] 59 sub = s[max(0, inst.start-10):inst.start+10]
57 raise Abort("decoding near '%s': %s!\n" % (sub, inst)) 60 raise Abort("decoding near '%s': %s!" % (sub, inst))
61 except LookupError, k:
62 raise Abort(_("%s, please check your locale settings") % k)
58 63
59 def locallen(s): 64 def locallen(s):
60 """Find the length in characters of a local string""" 65 """Find the length in characters of a local string"""
61 return len(s.decode(_encoding, "replace")) 66 return len(s.decode(_encoding, "replace"))
62 67
68 else: 73 else:
69 u = u[:a] 74 u = u[:a]
70 return u.encode(_encoding, _encodingmode) 75 return u.encode(_encoding, _encodingmode)
71 except UnicodeDecodeError, inst: 76 except UnicodeDecodeError, inst:
72 sub = s[max(0, inst.start-10), inst.start+10] 77 sub = s[max(0, inst.start-10), inst.start+10]
73 raise Abort("decoding near '%s': %s!\n" % (sub, inst)) 78 raise Abort(_("decoding near '%s': %s!\n") % (sub, inst))
74 79
75 # used by parsedate 80 # used by parsedate
76 defaultdateformats = ( 81 defaultdateformats = (
77 '%Y-%m-%d %H:%M:%S', 82 '%Y-%m-%d %H:%M:%S',
78 '%Y-%m-%d %I:%M:%S%p', 83 '%Y-%m-%d %I:%M:%S%p',