OLD | NEW |
1 # Copyright 2009 Google Inc. All Rights Reserved. | 1 # Copyright 2009 Google Inc. All Rights Reserved. |
2 # | 2 # |
3 # Licensed under the Apache License, Version 2.0 (the "License"); | 3 # Licensed under the Apache License, Version 2.0 (the "License"); |
4 # you may not use this file except in compliance with the License. | 4 # you may not use this file except in compliance with the License. |
5 # You may obtain a copy of the License at | 5 # You may obtain a copy of the License at |
6 # | 6 # |
7 # http://www.apache.org/licenses/LICENSE-2.0 | 7 # http://www.apache.org/licenses/LICENSE-2.0 |
8 # | 8 # |
9 # Unless required by applicable law or agreed to in writing, software | 9 # Unless required by applicable law or agreed to in writing, software |
10 # distributed under the License is distributed on an "AS IS" BASIS, | 10 # distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 print('\n________ running \'%s\' in \'%s\'' | 272 print('\n________ running \'%s\' in \'%s\'' |
273 % (' '.join(command), in_directory)) | 273 % (' '.join(command), in_directory)) |
274 | 274 |
275 # *Sigh*: Windows needs shell=True, or else it won't search %PATH% for the | 275 # *Sigh*: Windows needs shell=True, or else it won't search %PATH% for the |
276 # executable, but shell=True makes subprocess on Linux fail when it's called | 276 # executable, but shell=True makes subprocess on Linux fail when it's called |
277 # with a list because it only tries to execute the first item in the list. | 277 # with a list because it only tries to execute the first item in the list. |
278 kid = subprocess.Popen(command, bufsize=0, cwd=in_directory, | 278 kid = subprocess.Popen(command, bufsize=0, cwd=in_directory, |
279 shell=(sys.platform == 'win32'), stdout=subprocess.PIPE, | 279 shell=(sys.platform == 'win32'), stdout=subprocess.PIPE, |
280 stderr=subprocess.STDOUT) | 280 stderr=subprocess.STDOUT) |
281 | 281 |
| 282 # Do a flush of sys.stdout before we begin reading from the subprocess's |
| 283 # stdout. |
| 284 last_flushed_at = time.time() |
| 285 sys.stdout.flush() |
| 286 |
282 # Also, we need to forward stdout to prevent weird re-ordering of output. | 287 # Also, we need to forward stdout to prevent weird re-ordering of output. |
283 # This has to be done on a per byte basis to make sure it is not buffered: | 288 # This has to be done on a per byte basis to make sure it is not buffered: |
284 # normally buffering is done for each line, but if svn requests input, no | 289 # normally buffering is done for each line, but if svn requests input, no |
285 # end-of-line character is output after the prompt and it would not show up. | 290 # end-of-line character is output after the prompt and it would not show up. |
286 in_byte = kid.stdout.read(1) | 291 in_byte = kid.stdout.read(1) |
287 in_line = '' | 292 in_line = '' |
288 while in_byte: | 293 while in_byte: |
289 if in_byte != '\r': | 294 if in_byte != '\r': |
290 if print_stdout: | 295 if print_stdout: |
291 if not print_messages: | 296 if not print_messages: |
292 print('\n________ running \'%s\' in \'%s\'' | 297 print('\n________ running \'%s\' in \'%s\'' |
293 % (' '.join(command), in_directory)) | 298 % (' '.join(command), in_directory)) |
294 print_messages = True | 299 print_messages = True |
295 sys.stdout.write(in_byte) | 300 sys.stdout.write(in_byte) |
296 if in_byte != '\n': | 301 if in_byte != '\n': |
297 in_line += in_byte | 302 in_line += in_byte |
298 if in_byte == '\n' and filter_fn: | 303 if in_byte == '\n': |
299 filter_fn(in_line) | 304 if filter_fn: |
| 305 filter_fn(in_line) |
300 in_line = '' | 306 in_line = '' |
| 307 # Flush at least 10 seconds between line writes. We wait at least 10 |
| 308 # seconds to avoid overloading the reader that called us with output, |
| 309 # which can slow busy readers down. |
| 310 if (time.time() - last_flushed_at) > 10: |
| 311 last_flushed_at = time.time() |
| 312 sys.stdout.flush() |
301 in_byte = kid.stdout.read(1) | 313 in_byte = kid.stdout.read(1) |
302 rv = kid.wait() | 314 rv = kid.wait() |
303 | 315 |
304 if rv: | 316 if rv: |
305 msg = 'failed to run command: %s' % ' '.join(command) | 317 msg = 'failed to run command: %s' % ' '.join(command) |
306 | 318 |
307 if fail_status != None: | 319 if fail_status != None: |
308 print >>sys.stderr, msg | 320 print >>sys.stderr, msg |
309 sys.exit(fail_status) | 321 sys.exit(fail_status) |
310 | 322 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 self.lock.acquire() | 475 self.lock.acquire() |
464 assert not d.name in self.ran | 476 assert not d.name in self.ran |
465 if not d.name in self.ran: | 477 if not d.name in self.ran: |
466 self.ran.append(d.name) | 478 self.ran.append(d.name) |
467 self.running.remove(d) | 479 self.running.remove(d) |
468 if self.progress: | 480 if self.progress: |
469 self.progress.update(1) | 481 self.progress.update(1) |
470 finally: | 482 finally: |
471 self.lock.release() | 483 self.lock.release() |
472 return True | 484 return True |
OLD | NEW |