mercurial/hook.py
changeset 5833 323b9c55b328
parent 4622 fff50306e6dd
child 5869 2c565b9598b8
equal deleted inserted replaced
5832:2192ed187319 5833:323b9c55b328
     4 #
     4 #
     5 # This software may be used and distributed according to the terms
     5 # This software may be used and distributed according to the terms
     6 # of the GNU General Public License, incorporated herein by reference.
     6 # of the GNU General Public License, incorporated herein by reference.
     7 
     7 
     8 from i18n import _
     8 from i18n import _
     9 import util
     9 import util, os, sys
    10 
    10 
    11 def _pythonhook(ui, repo, name, hname, funcname, args, throw):
    11 def _pythonhook(ui, repo, name, hname, funcname, args, throw):
    12     '''call python hook. hook is callable object, looked up as
    12     '''call python hook. hook is callable object, looked up as
    13     name in python module. if callable returns "true", hook
    13     name in python module. if callable returns "true", hook
    14     fails, else passes. if hook raises exception, treated as
    14     fails, else passes. if hook raises exception, treated as
    77         if throw:
    77         if throw:
    78             raise util.Abort(_('%s hook %s') % (name, desc))
    78             raise util.Abort(_('%s hook %s') % (name, desc))
    79         ui.warn(_('warning: %s hook %s\n') % (name, desc))
    79         ui.warn(_('warning: %s hook %s\n') % (name, desc))
    80     return r
    80     return r
    81 
    81 
       
    82 _redirect = False
       
    83 def redirect(state):
       
    84     _redirect = state
       
    85 
    82 def hook(ui, repo, name, throw=False, **args):
    86 def hook(ui, repo, name, throw=False, **args):
    83     r = False
    87     r = False
       
    88 
       
    89     if _redirect:
       
    90         # temporarily redirect stdout to stderr
       
    91         oldstdout = os.dup(sys.stdout.fileno())
       
    92         os.dup2(sys.stderr.fileno(), sys.stdout.fileno())
       
    93 
    84     hooks = [(hname, cmd) for hname, cmd in ui.configitems("hooks")
    94     hooks = [(hname, cmd) for hname, cmd in ui.configitems("hooks")
    85              if hname.split(".", 1)[0] == name and cmd]
    95              if hname.split(".", 1)[0] == name and cmd]
    86     hooks.sort()
    96     hooks.sort()
    87     for hname, cmd in hooks:
    97     for hname, cmd in hooks:
    88         if callable(cmd):
    98         if callable(cmd):
    92                             args, throw) or r
   102                             args, throw) or r
    93         else:
   103         else:
    94             r = _exthook(ui, repo, hname, cmd, args, throw) or r
   104             r = _exthook(ui, repo, hname, cmd, args, throw) or r
    95     return r
   105     return r
    96 
   106 
       
   107     if _redirect:
       
   108         os.dup2(oldstdout, sys.stdout.fileno())
       
   109         os.close(oldstdout)