##// END OF EJS Templates
contrib: add showstack extension...
contrib: add showstack extension This allows getting a Python stack trace at any time on Unix by hitting Ctrl-\ (or Ctrl-T on BSDs). Useful for debugging mysterious hangs on the fly. Sample output: $ hg log -k nosuchmessage ^\ File "/home/mpm/hg/mercurial/revset.py", line 3089, in _iterfilter if cond(x): File "/home/mpm/hg/mercurial/util.py", line 415, in f cache[arg] = func(arg) File "/home/mpm/hg/mercurial/revset.py", line 1215, in matches for t in c.files() + [c.user(), c.description()]) File "/home/mpm/hg/mercurial/context.py", line 525, in files return self._changeset[3] File "/home/mpm/hg/mercurial/util.py", line 531, in __get__ result = self.func(obj) File "/home/mpm/hg/mercurial/context.py", line 498, in _changeset return self._repo.changelog.read(self.rev()) File "/home/mpm/hg/mercurial/changelog.py", line 338, in read text = self.revision(node) File "/home/mpm/hg/mercurial/revlog.py", line 1092, in revision bins = self._chunks(chain) File "/home/mpm/hg/mercurial/revlog.py", line 1013, in _chunks ladd(decompress(buffer(data, chunkstart - offset, chunklength))) File "/home/mpm/hg/mercurial/revlog.py", line 91, in decompress return _decompress(bin) ----

File last commit:

r21292:a7a9d84f default
r26123:bdac264e default
Show More
py3kcompat.py
65 lines | 2.1 KiB | text/x-python | PythonLexer
# py3kcompat.py - compatibility definitions for running hg in py3k
#
# Copyright 2010 Renato Cunha <renatoc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
import builtins
from numbers import Number
def bytesformatter(format, args):
'''Custom implementation of a formatter for bytestrings.
This function currently relies on the string formatter to do the
formatting and always returns bytes objects.
>>> bytesformatter(20, 10)
0
>>> bytesformatter('unicode %s, %s!', ('string', 'foo'))
b'unicode string, foo!'
>>> bytesformatter(b'test %s', 'me')
b'test me'
>>> bytesformatter('test %s', 'me')
b'test me'
>>> bytesformatter(b'test %s', b'me')
b'test me'
>>> bytesformatter('test %s', b'me')
b'test me'
>>> bytesformatter('test %d: %s', (1, b'result'))
b'test 1: result'
'''
# The current implementation just converts from bytes to unicode, do
# what's needed and then convert the results back to bytes.
# Another alternative is to use the Python C API implementation.
if isinstance(format, Number):
# If the fixer erroneously passes a number remainder operation to
# bytesformatter, we just return the correct operation
return format % args
if isinstance(format, bytes):
format = format.decode('utf-8', 'surrogateescape')
if isinstance(args, bytes):
args = args.decode('utf-8', 'surrogateescape')
if isinstance(args, tuple):
newargs = []
for arg in args:
if isinstance(arg, bytes):
arg = arg.decode('utf-8', 'surrogateescape')
newargs.append(arg)
args = tuple(newargs)
ret = format % args
return ret.encode('utf-8', 'surrogateescape')
builtins.bytesformatter = bytesformatter
origord = builtins.ord
def fakeord(char):
if isinstance(char, int):
return char
return origord(char)
builtins.ord = fakeord
if __name__ == '__main__':
import doctest
doctest.testmod()