| OLD | NEW |
| 1 # Copyright (c) 2009, Google Inc. All rights reserved. | 1 # Copyright (c) 2009, Google Inc. All rights reserved. |
| 2 # Copyright (c) 2009 Apple Inc. All rights reserved. | 2 # Copyright (c) 2009 Apple Inc. All rights reserved. |
| 3 # | 3 # |
| 4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
| 5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
| 6 # met: | 6 # met: |
| 7 # | 7 # |
| 8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
| 9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
| 10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 while True: | 108 while True: |
| 109 output_line = child_process.stdout.readline() | 109 output_line = child_process.stdout.readline() |
| 110 if output_line == "" and child_process.poll() != None: | 110 if output_line == "" and child_process.poll() != None: |
| 111 # poll() is not threadsafe and can throw OSError due to: | 111 # poll() is not threadsafe and can throw OSError due to: |
| 112 # http://bugs.python.org/issue1731717 | 112 # http://bugs.python.org/issue1731717 |
| 113 return child_process.poll() | 113 return child_process.poll() |
| 114 # We assume that the child process wrote to us in utf-8, | 114 # We assume that the child process wrote to us in utf-8, |
| 115 # so no re-encoding is necessary before writing here. | 115 # so no re-encoding is necessary before writing here. |
| 116 teed_output.write(output_line) | 116 teed_output.write(output_line) |
| 117 | 117 |
| 118 # FIXME: Remove this deprecated method and move callers to run_command. | |
| 119 # FIXME: This method is a hack to allow running command which both | |
| 120 # capture their output and print out to stdin. Useful for things | |
| 121 # like "build-webkit" where we want to display to the user that we're buildi
ng | |
| 122 # but still have the output to stuff into a log file. | |
| 123 def run_and_throw_if_fail(self, args, quiet=False, decode_output=True, **kwa
rgs): | |
| 124 # Cache the child's output locally so it can be used for error reports. | |
| 125 child_out_file = StringIO.StringIO() | |
| 126 tee_stdout = sys.stdout | |
| 127 if quiet: | |
| 128 dev_null = open(os.devnull, "w") # FIXME: Does this need an encodin
g? | |
| 129 tee_stdout = dev_null | |
| 130 child_stdout = Tee(child_out_file, tee_stdout) | |
| 131 exit_code = self._run_command_with_teed_output(args, child_stdout, **kwa
rgs) | |
| 132 if quiet: | |
| 133 dev_null.close() | |
| 134 | |
| 135 child_output = child_out_file.getvalue() | |
| 136 child_out_file.close() | |
| 137 | |
| 138 if decode_output: | |
| 139 child_output = child_output.decode(self._child_process_encoding()) | |
| 140 | |
| 141 if exit_code: | |
| 142 raise ScriptError(script_args=args, | |
| 143 exit_code=exit_code, | |
| 144 output=child_output) | |
| 145 return child_output | |
| 146 | |
| 147 def cpu_count(self): | 118 def cpu_count(self): |
| 148 return multiprocessing.cpu_count() | 119 return multiprocessing.cpu_count() |
| 149 | 120 |
| 150 @staticmethod | 121 @staticmethod |
| 151 def interpreter_for_script(script_path, fs=None): | 122 def interpreter_for_script(script_path, fs=None): |
| 152 fs = fs or FileSystem() | 123 fs = fs or FileSystem() |
| 153 lines = fs.read_text_file(script_path).splitlines() | 124 lines = fs.read_text_file(script_path).splitlines() |
| 154 if not len(lines): | 125 if not len(lines): |
| 155 return None | 126 return None |
| 156 first_line = lines[0] | 127 first_line = lines[0] |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 args = self._stringify_args(args) | 332 args = self._stringify_args(args) |
| 362 escaped_args = [] | 333 escaped_args = [] |
| 363 for arg in args: | 334 for arg in args: |
| 364 if isinstance(arg, unicode): | 335 if isinstance(arg, unicode): |
| 365 # Escape any non-ascii characters for easy copy/paste | 336 # Escape any non-ascii characters for easy copy/paste |
| 366 arg = arg.encode("unicode_escape") | 337 arg = arg.encode("unicode_escape") |
| 367 # FIXME: Do we need to fix quotes here? | 338 # FIXME: Do we need to fix quotes here? |
| 368 escaped_args.append(arg) | 339 escaped_args.append(arg) |
| 369 return " ".join(escaped_args) | 340 return " ".join(escaped_args) |
| 370 | 341 |
| 371 # FIXME: run_and_throw_if_fail should be merged into this method. | |
| 372 def run_command(self, | 342 def run_command(self, |
| 373 args, | 343 args, |
| 374 cwd=None, | 344 cwd=None, |
| 375 env=None, | 345 env=None, |
| 376 input=None, | 346 input=None, |
| 377 error_handler=None, | 347 error_handler=None, |
| 378 return_exit_code=False, | 348 return_exit_code=False, |
| 379 return_stderr=True, | 349 return_stderr=True, |
| 380 decode_output=True, debug_logging=True): | 350 decode_output=True, debug_logging=True): |
| 381 """Popen wrapper for convenience and to work around python bugs.""" | 351 """Popen wrapper for convenience and to work around python bugs.""" |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 pool.close() | 453 pool.close() |
| 484 pool.join() | 454 pool.join() |
| 485 | 455 |
| 486 | 456 |
| 487 def _run_command_thunk(cmd_line_and_cwd): | 457 def _run_command_thunk(cmd_line_and_cwd): |
| 488 # Note that this needs to be a bare module (and hence Picklable) method to w
ork with multiprocessing.Pool. | 458 # Note that this needs to be a bare module (and hence Picklable) method to w
ork with multiprocessing.Pool. |
| 489 (cmd_line, cwd) = cmd_line_and_cwd | 459 (cmd_line, cwd) = cmd_line_and_cwd |
| 490 proc = subprocess.Popen(cmd_line, cwd=cwd, stdout=subprocess.PIPE, stderr=su
bprocess.PIPE) | 460 proc = subprocess.Popen(cmd_line, cwd=cwd, stdout=subprocess.PIPE, stderr=su
bprocess.PIPE) |
| 491 stdout, stderr = proc.communicate() | 461 stdout, stderr = proc.communicate() |
| 492 return (proc.returncode, stdout, stderr) | 462 return (proc.returncode, stdout, stderr) |
| OLD | NEW |