# HG changeset patch # User Jesse Long # Date 2008-11-25 22:40:54 # Node ID 196b05a548d0dd9b42c0dca898048a8fd4bd1c18 # Parent 6163ef936a0082be7867074687ad52dc89db27c3 hooks: restore io correctly on exception diff --git a/mercurial/hook.py b/mercurial/hook.py --- a/mercurial/hook.py +++ b/mercurial/hook.py @@ -96,19 +96,20 @@ def hook(ui, repo, name, throw=False, ** oldstdout = os.dup(sys.__stdout__.fileno()) os.dup2(sys.__stderr__.fileno(), sys.__stdout__.fileno()) - for hname, cmd in util.sort(ui.configitems('hooks')): - if hname.split('.')[0] != name or not cmd: - continue - if callable(cmd): - r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r - elif cmd.startswith('python:'): - r = _pythonhook(ui, repo, name, hname, cmd[7:].strip(), - args, throw) or r - else: - r = _exthook(ui, repo, hname, cmd, args, throw) or r - - if _redirect: - os.dup2(oldstdout, sys.__stdout__.fileno()) - os.close(oldstdout) + try: + for hname, cmd in util.sort(ui.configitems('hooks')): + if hname.split('.')[0] != name or not cmd: + continue + if callable(cmd): + r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r + elif cmd.startswith('python:'): + r = _pythonhook(ui, repo, name, hname, cmd[7:].strip(), + args, throw) or r + else: + r = _exthook(ui, repo, hname, cmd, args, throw) or r + finally: + if _redirect: + os.dup2(oldstdout, sys.__stdout__.fileno()) + os.close(oldstdout) return r