mercurial/hook.py
changeset 26738 9abc2c921bbd
parent 26737 a930d66a04af
child 26739 8429369eeb85
equal deleted inserted replaced
26737:a930d66a04af 26738:9abc2c921bbd
   165     hooks = []
   165     hooks = []
   166     for hname, cmd in _allhooks(ui):
   166     for hname, cmd in _allhooks(ui):
   167         if hname.split('.')[0] == name and cmd:
   167         if hname.split('.')[0] == name and cmd:
   168             hooks.append((hname, cmd))
   168             hooks.append((hname, cmd))
   169 
   169 
   170     return runhooks(ui, repo, name, hooks, throw=throw, **args)
   170     res = runhooks(ui, repo, name, hooks, throw=throw, **args)
       
   171     r = False
       
   172     for hname, cmd in hooks:
       
   173         r = res[hname] or r
       
   174     return r
   171 
   175 
   172 def runhooks(ui, repo, name, hooks, throw=False, **args):
   176 def runhooks(ui, repo, name, hooks, throw=False, **args):
   173     r = False
   177     res = {}
   174     oldstdout = -1
   178     oldstdout = -1
   175 
   179 
   176     try:
   180     try:
   177         for hname, cmd in hooks:
   181         for hname, cmd in hooks:
   178             if oldstdout == -1 and _redirect:
   182             if oldstdout == -1 and _redirect:
   187                 except (OSError, AttributeError):
   191                 except (OSError, AttributeError):
   188                     # files seem to be bogus, give up on redirecting (WSGI, etc)
   192                     # files seem to be bogus, give up on redirecting (WSGI, etc)
   189                     pass
   193                     pass
   190 
   194 
   191             if callable(cmd):
   195             if callable(cmd):
   192                 r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r
   196                 r = _pythonhook(ui, repo, name, hname, cmd, args, throw)
   193             elif cmd.startswith('python:'):
   197             elif cmd.startswith('python:'):
   194                 if cmd.count(':') >= 2:
   198                 if cmd.count(':') >= 2:
   195                     path, cmd = cmd[7:].rsplit(':', 1)
   199                     path, cmd = cmd[7:].rsplit(':', 1)
   196                     path = util.expandpath(path)
   200                     path = util.expandpath(path)
   197                     if repo:
   201                     if repo:
   202                         ui.write(_("loading %s hook failed:\n") % hname)
   206                         ui.write(_("loading %s hook failed:\n") % hname)
   203                         raise
   207                         raise
   204                     hookfn = getattr(mod, cmd)
   208                     hookfn = getattr(mod, cmd)
   205                 else:
   209                 else:
   206                     hookfn = cmd[7:].strip()
   210                     hookfn = cmd[7:].strip()
   207                 r = _pythonhook(ui, repo, name, hname, hookfn, args, throw) or r
   211                 r = _pythonhook(ui, repo, name, hname, hookfn, args, throw)
   208             else:
   212             else:
   209                 r = _exthook(ui, repo, hname, cmd, args, throw) or r
   213                 r = _exthook(ui, repo, hname, cmd, args, throw)
       
   214 
       
   215             res[hname] = r
   210 
   216 
   211             # The stderr is fully buffered on Windows when connected to a pipe.
   217             # The stderr is fully buffered on Windows when connected to a pipe.
   212             # A forcible flush is required to make small stderr data in the
   218             # A forcible flush is required to make small stderr data in the
   213             # remote side available to the client immediately.
   219             # remote side available to the client immediately.
   214             sys.stderr.flush()
   220             sys.stderr.flush()
   215     finally:
   221     finally:
   216         if _redirect and oldstdout >= 0:
   222         if _redirect and oldstdout >= 0:
   217             os.dup2(oldstdout, stdoutno)
   223             os.dup2(oldstdout, stdoutno)
   218             os.close(oldstdout)
   224             os.close(oldstdout)
   219 
   225 
   220     return r
   226     return res