equal
deleted
inserted
replaced
16 encoding, |
16 encoding, |
17 error, |
17 error, |
18 extensions, |
18 extensions, |
19 pycompat, |
19 pycompat, |
20 util, |
20 util, |
|
21 ) |
|
22 from .utils import ( |
|
23 procutil, |
21 ) |
24 ) |
22 |
25 |
23 def _pythonhook(ui, repo, htype, hname, funcname, args, throw): |
26 def _pythonhook(ui, repo, htype, hname, funcname, args, throw): |
24 '''call python hook. hook is callable object, looked up as |
27 '''call python hook. hook is callable object, looked up as |
25 name in python module. if callable returns "true", hook |
28 name in python module. if callable returns "true", hook |
220 |
223 |
221 try: |
224 try: |
222 for hname, cmd in hooks: |
225 for hname, cmd in hooks: |
223 if oldstdout == -1 and _redirect: |
226 if oldstdout == -1 and _redirect: |
224 try: |
227 try: |
225 stdoutno = util.stdout.fileno() |
228 stdoutno = procutil.stdout.fileno() |
226 stderrno = util.stderr.fileno() |
229 stderrno = procutil.stderr.fileno() |
227 # temporarily redirect stdout to stderr, if possible |
230 # temporarily redirect stdout to stderr, if possible |
228 if stdoutno >= 0 and stderrno >= 0: |
231 if stdoutno >= 0 and stderrno >= 0: |
229 util.stdout.flush() |
232 procutil.stdout.flush() |
230 oldstdout = os.dup(stdoutno) |
233 oldstdout = os.dup(stdoutno) |
231 os.dup2(stderrno, stdoutno) |
234 os.dup2(stderrno, stdoutno) |
232 except (OSError, AttributeError): |
235 except (OSError, AttributeError): |
233 # files seem to be bogus, give up on redirecting (WSGI, etc) |
236 # files seem to be bogus, give up on redirecting (WSGI, etc) |
234 pass |
237 pass |
267 res[hname] = r, raised |
270 res[hname] = r, raised |
268 finally: |
271 finally: |
269 # The stderr is fully buffered on Windows when connected to a pipe. |
272 # The stderr is fully buffered on Windows when connected to a pipe. |
270 # A forcible flush is required to make small stderr data in the |
273 # A forcible flush is required to make small stderr data in the |
271 # remote side available to the client immediately. |
274 # remote side available to the client immediately. |
272 util.stderr.flush() |
275 procutil.stderr.flush() |
273 |
276 |
274 if _redirect and oldstdout >= 0: |
277 if _redirect and oldstdout >= 0: |
275 util.stdout.flush() # write hook output to stderr fd |
278 procutil.stdout.flush() # write hook output to stderr fd |
276 os.dup2(oldstdout, stdoutno) |
279 os.dup2(oldstdout, stdoutno) |
277 os.close(oldstdout) |
280 os.close(oldstdout) |
278 |
281 |
279 return res |
282 return res |