comparison mercurial/util.py @ 20244:47d0843647d1

util: introduce util.debugstacktrace for showing a stack trace without crashing This is often very handy when hacking/debugging. Calling util.debugstacktrace('hey') from a place in hg will give something like: hey at: ./hg:38 in <module> /home/user/hgsrc/mercurial/dispatch.py:28 in run /home/user/hgsrc/mercurial/dispatch.py:65 in dispatch /home/user/hgsrc/mercurial/dispatch.py:88 in _runcatch /home/user/hgsrc/mercurial/dispatch.py:740 in _dispatch /home/user/hgsrc/mercurial/dispatch.py:514 in runcommand /home/user/hgsrc/mercurial/dispatch.py:830 in _runcommand /home/user/hgsrc/mercurial/dispatch.py:801 in checkargs /home/user/hgsrc/mercurial/dispatch.py:737 in <lambda> /home/user/hgsrc/mercurial/util.py:472 in check ...
author Mads Kiilerich <madski@unity3d.com>
date Sun, 12 Jan 2014 23:28:21 +0100
parents a6014018ec28
children 0889585b44f1
comparison
equal deleted inserted replaced
20243:cc09cfea3dd4 20244:47d0843647d1
1981 1981
1982 def __call__(self, *args): 1982 def __call__(self, *args):
1983 self._hooks.sort(key=lambda x: x[0]) 1983 self._hooks.sort(key=lambda x: x[0])
1984 for source, hook in self._hooks: 1984 for source, hook in self._hooks:
1985 hook(*args) 1985 hook(*args)
1986
1987 def debugstacktrace(msg='stacktrace', skip=0, f=sys.stderr):
1988 '''Writes a message to f (stderr) with a nicely formatted stacktrace.
1989 Skips the 'skip' last entries.
1990 It can be used everywhere and do intentionally not require an ui object.
1991 Not be used in production code but very convenient while developing.
1992 '''
1993 f.write('%s at:\n' % msg)
1994 entries = [('%s:%s' % (fn, ln), func)
1995 for fn, ln, func, _text in traceback.extract_stack()[:-skip - 1]]
1996 if entries:
1997 fnmax = max(len(entry[0]) for entry in entries)
1998 for fnln, func in entries:
1999 f.write(' %-*s in %s\n' % (fnmax, fnln, func))
2000
2001 # convenient shortcut
2002 dst = debugstacktrace