comparison mercurial/hook.py @ 9658:852b1f3032d2

hook: only redirect stdout if it and stderr are valid files When using hgwebdir with WSGI via the IIS ISAPI-WSGI extension, both stdout and stderr filenos are set to -2, which makes the os.dup call in hook.py fail.
author Sune Foldager <cryo@cyanite.org>
date Wed, 28 Oct 2009 21:35:57 +0100
parents 872d49dd577a
children 9e7b2c49d25d
comparison
equal deleted inserted replaced
9657:96c803e9018f 9658:852b1f3032d2
104 _redirect = state 104 _redirect = state
105 105
106 def hook(ui, repo, name, throw=False, **args): 106 def hook(ui, repo, name, throw=False, **args):
107 r = False 107 r = False
108 108
109 oldstdout = -1
109 if _redirect: 110 if _redirect:
110 # temporarily redirect stdout to stderr 111 stdoutno = sys.__stdout__.fileno()
111 oldstdout = os.dup(sys.__stdout__.fileno()) 112 stderrno = sys.__stderr__.fileno()
112 os.dup2(sys.__stderr__.fileno(), sys.__stdout__.fileno()) 113 # temporarily redirect stdout to stderr, if possible
114 if stdoutno >= 0 and stderrno >= 0:
115 oldstdout = os.dup(stdoutno)
116 os.dup2(stderrno, stdoutno)
113 117
114 try: 118 try:
115 for hname, cmd in ui.configitems('hooks'): 119 for hname, cmd in ui.configitems('hooks'):
116 if hname.split('.')[0] != name or not cmd: 120 if hname.split('.')[0] != name or not cmd:
117 continue 121 continue
126 hookfn = cmd[7:].strip() 130 hookfn = cmd[7:].strip()
127 r = _pythonhook(ui, repo, name, hname, hookfn, args, throw) or r 131 r = _pythonhook(ui, repo, name, hname, hookfn, args, throw) or r
128 else: 132 else:
129 r = _exthook(ui, repo, hname, cmd, args, throw) or r 133 r = _exthook(ui, repo, hname, cmd, args, throw) or r
130 finally: 134 finally:
131 if _redirect: 135 if _redirect and oldstdout >= 0:
132 os.dup2(oldstdout, sys.__stdout__.fileno()) 136 os.dup2(oldstdout, stdoutno)
133 os.close(oldstdout) 137 os.close(oldstdout)
134 138
135 return r 139 return r