180 # make sure string is actually stored in UTF-8 |
180 # make sure string is actually stored in UTF-8 |
181 u = s.decode('UTF-8') |
181 u = s.decode('UTF-8') |
182 if encoding == b'UTF-8': |
182 if encoding == b'UTF-8': |
183 # fast path |
183 # fast path |
184 return s |
184 return s |
185 r = u.encode(_sysstr(encoding), r"replace") |
185 r = u.encode(_sysstr(encoding), "replace") |
186 if u == r.decode(_sysstr(encoding)): |
186 if u == r.decode(_sysstr(encoding)): |
187 # r is a safe, non-lossy encoding of s |
187 # r is a safe, non-lossy encoding of s |
188 return safelocalstr(r) |
188 return safelocalstr(r) |
189 return localstr(s, r) |
189 return localstr(s, r) |
190 except UnicodeDecodeError: |
190 except UnicodeDecodeError: |
191 # we should only get here if we're looking at an ancient changeset |
191 # we should only get here if we're looking at an ancient changeset |
192 try: |
192 try: |
193 u = s.decode(_sysstr(fallbackencoding)) |
193 u = s.decode(_sysstr(fallbackencoding)) |
194 r = u.encode(_sysstr(encoding), r"replace") |
194 r = u.encode(_sysstr(encoding), "replace") |
195 if u == r.decode(_sysstr(encoding)): |
195 if u == r.decode(_sysstr(encoding)): |
196 # r is a safe, non-lossy encoding of s |
196 # r is a safe, non-lossy encoding of s |
197 return safelocalstr(r) |
197 return safelocalstr(r) |
198 return localstr(u.encode('UTF-8'), r) |
198 return localstr(u.encode('UTF-8'), r) |
199 except UnicodeDecodeError: |
199 except UnicodeDecodeError: |
200 u = s.decode("utf-8", "replace") # last ditch |
200 u = s.decode("utf-8", "replace") # last ditch |
201 # can't round-trip |
201 # can't round-trip |
202 return u.encode(_sysstr(encoding), r"replace") |
202 return u.encode(_sysstr(encoding), "replace") |
203 except LookupError as k: |
203 except LookupError as k: |
204 raise error.Abort(k, hint=b"please check your locale settings") |
204 raise error.Abort(k, hint=b"please check your locale settings") |
205 |
205 |
206 |
206 |
207 def fromlocal(s): |
207 def fromlocal(s): |