mercurial/hook.py
changeset 21797 b009dd135aa0
parent 20548 5bd6a9fec103
child 23268 0fd3862ef425
child 23415 cdbb85489c41
equal deleted inserted replaced
21796:8225bb1f0ad3 21797:b009dd135aa0
    17 
    17 
    18     reason for "true" meaning "hook failed" is so that
    18     reason for "true" meaning "hook failed" is so that
    19     unmodified commands (e.g. mercurial.commands.update) can
    19     unmodified commands (e.g. mercurial.commands.update) can
    20     be run as hooks without wrappers to convert return values.'''
    20     be run as hooks without wrappers to convert return values.'''
    21 
    21 
    22     if util.safehasattr(funcname, '__call__'):
    22     if callable(funcname):
    23         obj = funcname
    23         obj = funcname
    24         funcname = obj.__module__ + "." + obj.__name__
    24         funcname = obj.__module__ + "." + obj.__name__
    25     else:
    25     else:
    26         d = funcname.rfind('.')
    26         d = funcname.rfind('.')
    27         if d == -1:
    27         if d == -1:
    68                 obj = getattr(obj, p)
    68                 obj = getattr(obj, p)
    69         except AttributeError:
    69         except AttributeError:
    70             raise util.Abort(_('%s hook is invalid '
    70             raise util.Abort(_('%s hook is invalid '
    71                                '("%s" is not defined)') %
    71                                '("%s" is not defined)') %
    72                              (hname, funcname))
    72                              (hname, funcname))
    73         if not util.safehasattr(obj, '__call__'):
    73         if not callable(obj):
    74             raise util.Abort(_('%s hook is invalid '
    74             raise util.Abort(_('%s hook is invalid '
    75                                '("%s" is not callable)') %
    75                                '("%s" is not callable)') %
    76                              (hname, funcname))
    76                              (hname, funcname))
    77 
    77 
    78     ui.note(_("calling hook %s: %s\n") % (hname, funcname))
    78     ui.note(_("calling hook %s: %s\n") % (hname, funcname))
   115     ui.note(_("running hook %s: %s\n") % (name, cmd))
   115     ui.note(_("running hook %s: %s\n") % (name, cmd))
   116 
   116 
   117     starttime = time.time()
   117     starttime = time.time()
   118     env = {}
   118     env = {}
   119     for k, v in args.iteritems():
   119     for k, v in args.iteritems():
   120         if util.safehasattr(v, '__call__'):
   120         if callable(v):
   121             v = v()
   121             v = v()
   122         if isinstance(v, dict):
   122         if isinstance(v, dict):
   123             # make the dictionary element order stable across Python
   123             # make the dictionary element order stable across Python
   124             # implementations
   124             # implementations
   125             v = ('{' +
   125             v = ('{' +
   182                         os.dup2(stderrno, stdoutno)
   182                         os.dup2(stderrno, stdoutno)
   183                 except (OSError, AttributeError):
   183                 except (OSError, AttributeError):
   184                     # files seem to be bogus, give up on redirecting (WSGI, etc)
   184                     # files seem to be bogus, give up on redirecting (WSGI, etc)
   185                     pass
   185                     pass
   186 
   186 
   187             if util.safehasattr(cmd, '__call__'):
   187             if callable(cmd):
   188                 r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r
   188                 r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r
   189             elif cmd.startswith('python:'):
   189             elif cmd.startswith('python:'):
   190                 if cmd.count(':') >= 2:
   190                 if cmd.count(':') >= 2:
   191                     path, cmd = cmd[7:].rsplit(':', 1)
   191                     path, cmd = cmd[7:].rsplit(':', 1)
   192                     path = util.expandpath(path)
   192                     path = util.expandpath(path)