equal
deleted
inserted
replaced
76 start = time.time() |
76 start = time.time() |
77 while time.time() - start < timeout and p.returncode is None: |
77 while time.time() - start < timeout and p.returncode is None: |
78 time.sleep(1) |
78 time.sleep(1) |
79 p.timeout = True |
79 p.timeout = True |
80 if p.returncode is None: |
80 if p.returncode is None: |
81 try: |
81 terminate(p) |
82 p.terminate() |
|
83 except OSError: |
|
84 pass |
|
85 threading.Thread(target=t).start() |
82 threading.Thread(target=t).start() |
86 |
83 |
87 return p |
84 return p |
88 |
85 |
89 # reserved exit code to skip test (used by hghave) |
86 # reserved exit code to skip test (used by hghave) |
260 if options.debug: |
257 if options.debug: |
261 if options.timeout != defaults['timeout']: |
258 if options.timeout != defaults['timeout']: |
262 sys.stderr.write( |
259 sys.stderr.write( |
263 'warning: --timeout option ignored with --debug\n') |
260 'warning: --timeout option ignored with --debug\n') |
264 options.timeout = 0 |
261 options.timeout = 0 |
265 if options.timeout and not hasattr(subprocess.Popen, 'terminate'): |
|
266 sys.stderr.write('warning: timeout is not supported on this ' |
|
267 'platform and will be ignored\n') |
|
268 options.timeout = 0 |
|
269 if options.py3k_warnings: |
262 if options.py3k_warnings: |
270 if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0): |
263 if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0): |
271 parser.error('--py3k-warnings can only be used on Python 2.6+') |
264 parser.error('--py3k-warnings can only be used on Python 2.6+') |
272 if options.blacklist: |
265 if options.blacklist: |
273 options.blacklist = parselistfiles(options.blacklist, 'blacklist') |
266 options.blacklist = parselistfiles(options.blacklist, 'blacklist') |
340 found = findprogram(p) |
333 found = findprogram(p) |
341 if found: |
334 if found: |
342 vlog("# Found prerequisite", p, "at", found) |
335 vlog("# Found prerequisite", p, "at", found) |
343 else: |
336 else: |
344 print "WARNING: Did not find prerequisite tool: "+p |
337 print "WARNING: Did not find prerequisite tool: "+p |
|
338 |
|
339 def terminate(proc): |
|
340 """Terminate subprocess (with fallback for Python versions < 2.6)""" |
|
341 vlog('# Terminating process %d' % proc.pid) |
|
342 try: |
|
343 if hasattr(proc, 'terminate'): |
|
344 proc.terminate() |
|
345 else: |
|
346 os.kill(proc.pid, signal.SIGTERM) |
|
347 except OSError: |
|
348 pass |
345 |
349 |
346 def killdaemons(): |
350 def killdaemons(): |
347 # Kill off any leftover daemon processes |
351 # Kill off any leftover daemon processes |
348 try: |
352 try: |
349 fp = open(DAEMON_PIDS) |
353 fp = open(DAEMON_PIDS) |
649 ret = proc.wait() |
653 ret = proc.wait() |
650 return (ret, None) |
654 return (ret, None) |
651 |
655 |
652 proc = Popen4(cmd, wd, options.timeout) |
656 proc = Popen4(cmd, wd, options.timeout) |
653 def cleanup(): |
657 def cleanup(): |
654 try: |
658 terminate(proc) |
655 proc.terminate() |
|
656 except OSError: |
|
657 pass |
|
658 ret = proc.wait() |
659 ret = proc.wait() |
659 if ret == 0: |
660 if ret == 0: |
660 ret = signal.SIGTERM << 8 |
661 ret = signal.SIGTERM << 8 |
661 killdaemons() |
662 killdaemons() |
662 return ret |
663 return ret |