##// END OF EJS Templates
update: don't translate the abort message twice...
update: don't translate the abort message twice The string representation of util.Abort() is translated when merge.update() raises the exception. For languages with characters out of the valid ascii range, if we feed them again to i18n.gettext() mercurial dies with: [...] File "/home/javi/src/mercurial/mercurial/hg-mpm/mercurial/commands.py", line 4287, in postincoming ui.warn(_("not updating: %s\n" % str(inst))) File "/home/javi/src/mercurial/mercurial/hg-mpm/mercurial/i18n.py", line 42, in gettext u = u'\n\n'.join([p and t.ugettext(p) or '' for p in paragraphs]) File "/usr/lib/python2.7/gettext.py", line 404, in ugettext return unicode(message) UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 14: ordinal not in range(128) To reproduce this error, just try to pull a changeset that crosses branches with LANG=ru_RU.UTF-8

File last commit:

r14959:b1dcc5ab default
r16230:d4d35fd0 stable
Show More
lsprof.py
109 lines | 3.6 KiB | text/x-python | PythonLexer
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 import sys
Joel Rosdahl
Remove unused imports
r6212 from _lsprof import Profiler, profiler_entry
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
__all__ = ['profile', 'Stats']
def profile(f, *args, **kwds):
"""XXX docstring"""
p = Profiler()
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 p.enable(subcalls=True, builtins=True)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 try:
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 f(*args, **kwds)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 finally:
p.disable()
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 return Stats(p.getstats())
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
class Stats(object):
"""XXX docstring"""
def __init__(self, data):
self.data = data
def sort(self, crit="inlinetime"):
"""XXX docstring"""
if crit not in profiler_entry.__dict__:
Peter Ruibal
use Exception(args)-style raising consistently (py3k compatibility)
r7008 raise ValueError("Can't sort by %s" % crit)
Alejandro Santos
compat: use 'key' argument instead of 'cmp' when sorting a list
r9032 self.data.sort(key=lambda x: getattr(x, crit), reverse=True)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 for e in self.data:
if e.calls:
Alejandro Santos
compat: use 'key' argument instead of 'cmp' when sorting a list
r9032 e.calls.sort(key=lambda x: getattr(x, crit), reverse=True)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
def pprint(self, top=None, file=None, limit=None, climit=None):
"""XXX docstring"""
if file is None:
file = sys.stdout
d = self.data
if top is not None:
d = d[:top]
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 cols = "% 12s %12s %11.4f %11.4f %s\n"
hcols = "% 12s %12s %12s %12s %s\n"
file.write(hcols % ("CallCount", "Recursive", "Total(ms)",
"Inline(ms)", "module:lineno(function)"))
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 count = 0
for e in d:
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 file.write(cols % (e.callcount, e.reccallcount, e.totaltime,
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 e.inlinetime, label(e.code)))
count += 1
if limit is not None and count == limit:
return
ccount = 0
if e.calls:
for se in e.calls:
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 file.write(cols % ("+%s" % se.callcount, se.reccallcount,
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 se.totaltime, se.inlinetime,
"+%s" % label(se.code)))
count += 1
ccount += 1
if limit is not None and count == limit:
return
if climit is not None and ccount == climit:
break
def freeze(self):
"""Replace all references to code objects with string
descriptions; this makes it possible to pickle the instance."""
# this code is probably rather ickier than it needs to be!
for i in range(len(self.data)):
e = self.data[i]
if not isinstance(e.code, str):
self.data[i] = type(e)((label(e.code),) + e[1:])
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 if e.calls:
for j in range(len(e.calls)):
se = e.calls[j]
if not isinstance(se.code, str):
e.calls[j] = type(se)((label(se.code),) + se[1:])
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
_fn2mod = {}
def label(code):
if isinstance(code, str):
return code
try:
mname = _fn2mod[code.co_filename]
except KeyError:
Dirkjan Ochtman
lsprof: make profile not die when imported modules changes (issue1774)
r9314 for k, v in list(sys.modules.iteritems()):
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 if v is None:
continue
Augie Fackler
lsprof: use getattr instead of hasattr
r14959 if not isinstance(getattr(v, '__file__', None), str):
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 continue
if v.__file__.startswith(code.co_filename):
mname = _fn2mod[code.co_filename] = k
break
else:
Benoit Boissinot
fix spaces/identation issues
r10339 mname = _fn2mod[code.co_filename] = '<%s>' % code.co_filename
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
return '%s:%d(%s)' % (mname, code.co_firstlineno, code.co_name)
if __name__ == '__main__':
import os
sys.argv = sys.argv[1:]
if not sys.argv:
print >> sys.stderr, "usage: lsprof.py <script> <arguments...>"
sys.exit(2)
sys.path.insert(0, os.path.abspath(os.path.dirname(sys.argv[0])))
stats = profile(execfile, sys.argv[0], globals(), locals())
stats.sort()
stats.pprint()