diff -r 4c2c30bc38b4 -r c13ff31818b0 mercurial/dispatch.py --- a/mercurial/dispatch.py Fri Apr 14 08:55:18 2017 +0200 +++ b/mercurial/dispatch.py Tue Apr 11 14:54:12 2017 -0700 @@ -59,6 +59,23 @@ self.fout = fout self.ferr = ferr + def _runexithandlers(self): + exc = None + handlers = self.ui._exithandlers + try: + while handlers: + func, args, kwargs = handlers.pop() + try: + func(*args, **kwargs) + except: # re-raises below + if exc is None: + exc = sys.exc_info()[1] + self.ui.warn(('error in exit handlers:\n')) + self.ui.traceback(force=True) + finally: + if exc is not None: + raise exc + def run(): "run the command in sys.argv" sys.exit((dispatch(request(pycompat.sysargv[1:])) or 0) & 255) @@ -146,6 +163,10 @@ req.ui.log('uiblocked', 'ui blocked ms', **req.ui._blockedtimes) req.ui.log("commandfinish", "%s exited %s after %0.2f seconds\n", msg, ret or 0, duration) + try: + req._runexithandlers() + except: # exiting, so no re-raises + ret = ret or -1 return ret def _runcatch(req):