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 |