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 16 matching lines...) Expand all Loading... |
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 | 29 |
30 import codecs | 30 import codecs |
31 import os | 31 import os |
32 import sys | 32 import sys |
33 | 33 |
34 | 34 |
35 # Simple class to split output between multiple destinations | 35 # Simple class to split output between multiple destinations |
36 class Tee: | 36 class Tee: |
| 37 |
37 def __init__(self, *files): | 38 def __init__(self, *files): |
38 self.files = files | 39 self.files = files |
39 | 40 |
40 # Callers should pass an already encoded string for writing. | 41 # Callers should pass an already encoded string for writing. |
41 def write(self, bytes): | 42 def write(self, bytes): |
42 for file in self.files: | 43 for file in self.files: |
43 file.write(bytes) | 44 file.write(bytes) |
44 | 45 |
45 | 46 |
46 class OutputTee: | 47 class OutputTee: |
| 48 |
47 def __init__(self): | 49 def __init__(self): |
48 self._original_stdout = None | 50 self._original_stdout = None |
49 self._original_stderr = None | 51 self._original_stderr = None |
50 self._files_for_output = [] | 52 self._files_for_output = [] |
51 | 53 |
52 def add_log(self, path): | 54 def add_log(self, path): |
53 log_file = self._open_log_file(path) | 55 log_file = self._open_log_file(path) |
54 self._files_for_output.append(log_file) | 56 self._files_for_output.append(log_file) |
55 self._tee_outputs_to_files(self._files_for_output) | 57 self._tee_outputs_to_files(self._files_for_output) |
56 return log_file | 58 return log_file |
(...skipping 13 matching lines...) Expand all Loading... |
70 def _tee_outputs_to_files(self, files): | 72 def _tee_outputs_to_files(self, files): |
71 if not self._original_stdout: | 73 if not self._original_stdout: |
72 self._original_stdout = sys.stdout | 74 self._original_stdout = sys.stdout |
73 self._original_stderr = sys.stderr | 75 self._original_stderr = sys.stderr |
74 if files and len(files): | 76 if files and len(files): |
75 sys.stdout = Tee(self._original_stdout, *files) | 77 sys.stdout = Tee(self._original_stdout, *files) |
76 sys.stderr = Tee(self._original_stderr, *files) | 78 sys.stderr = Tee(self._original_stderr, *files) |
77 else: | 79 else: |
78 sys.stdout = self._original_stdout | 80 sys.stdout = self._original_stdout |
79 sys.stderr = self._original_stderr | 81 sys.stderr = self._original_stderr |
OLD | NEW |