mercurial/util.py
changeset 28497 906fece80cfa
parent 28496 b592564a803c
child 28818 6041fb8f2da8
equal deleted inserted replaced
28496:b592564a803c 28497:906fece80cfa
  2548         results = []
  2548         results = []
  2549         for source, hook in self._hooks:
  2549         for source, hook in self._hooks:
  2550             results.append(hook(*args))
  2550             results.append(hook(*args))
  2551         return results
  2551         return results
  2552 
  2552 
       
  2553 def getstackframes(skip=0, line=' %-*s in %s\n', fileline='%s:%s'):
       
  2554     '''Yields lines for a nicely formatted stacktrace.
       
  2555     Skips the 'skip' last entries.
       
  2556     Each file+linenumber is formatted according to fileline.
       
  2557     Each line is formatted according to line.
       
  2558     If line is None, it yields:
       
  2559       length of longest filepath+line number,
       
  2560       filepath+linenumber,
       
  2561       function
       
  2562 
       
  2563     Not be used in production code but very convenient while developing.
       
  2564     '''
       
  2565     entries = [(fileline % (fn, ln), func)
       
  2566         for fn, ln, func, _text in traceback.extract_stack()[:-skip - 1]]
       
  2567     if entries:
       
  2568         fnmax = max(len(entry[0]) for entry in entries)
       
  2569         for fnln, func in entries:
       
  2570             if line is None:
       
  2571                 yield (fnmax, fnln, func)
       
  2572             else:
       
  2573                 yield line % (fnmax, fnln, func)
       
  2574 
  2553 def debugstacktrace(msg='stacktrace', skip=0, f=sys.stderr, otherf=sys.stdout):
  2575 def debugstacktrace(msg='stacktrace', skip=0, f=sys.stderr, otherf=sys.stdout):
  2554     '''Writes a message to f (stderr) with a nicely formatted stacktrace.
  2576     '''Writes a message to f (stderr) with a nicely formatted stacktrace.
  2555     Skips the 'skip' last entries. By default it will flush stdout first.
  2577     Skips the 'skip' last entries. By default it will flush stdout first.
  2556     It can be used everywhere and intentionally does not require an ui object.
  2578     It can be used everywhere and intentionally does not require an ui object.
  2557     Not be used in production code but very convenient while developing.
  2579     Not be used in production code but very convenient while developing.
  2558     '''
  2580     '''
  2559     if otherf:
  2581     if otherf:
  2560         otherf.flush()
  2582         otherf.flush()
  2561     f.write('%s at:\n' % msg)
  2583     f.write('%s at:\n' % msg)
  2562     entries = [('%s:%s' % (fn, ln), func)
  2584     for line in getstackframes(skip + 1):
  2563         for fn, ln, func, _text in traceback.extract_stack()[:-skip - 1]]
  2585         f.write(line)
  2564     if entries:
       
  2565         fnmax = max(len(entry[0]) for entry in entries)
       
  2566         for fnln, func in entries:
       
  2567             f.write(' %-*s in %s\n' % (fnmax, fnln, func))
       
  2568     f.flush()
  2586     f.flush()
  2569 
  2587 
  2570 class dirs(object):
  2588 class dirs(object):
  2571     '''a multiset of directory names from a dirstate or manifest'''
  2589     '''a multiset of directory names from a dirstate or manifest'''
  2572 
  2590