OLD | NEW |
---|---|
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """A wrapper for subprocess to make calling shell commands easier.""" | 5 """A wrapper for subprocess to make calling shell commands easier.""" |
6 | 6 |
7 import os | 7 import os |
8 import logging | 8 import logging |
9 import signal | 9 import signal |
10 import subprocess | 10 import subprocess |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
60 Args: | 60 Args: |
61 args: A string or a sequence of program arguments. The program to execute is | 61 args: A string or a sequence of program arguments. The program to execute is |
62 the string or the first item in the args sequence. | 62 the string or the first item in the args sequence. |
63 cwd: If not None, the subprocess's current directory will be changed to | 63 cwd: If not None, the subprocess's current directory will be changed to |
64 |cwd| before it's executed. | 64 |cwd| before it's executed. |
65 shell: Whether to execute args as a shell command. | 65 shell: Whether to execute args as a shell command. |
66 | 66 |
67 Returns: | 67 Returns: |
68 The tuple (exit code, output). | 68 The tuple (exit code, output). |
69 """ | 69 """ |
70 logging.info(str(args) + ' ' + (cwd or '')) | 70 if isinstance(args, basestring): |
71 args_repr = args | |
72 if not shell: | |
73 raise Exception('string args must be run with shell=True') | |
74 elif shell: | |
75 raise Exception('array args must be run with shell=False') | |
76 else: | |
77 args_repr = ' '.join(args) | |
Isaac (away)
2013/04/10 19:12:53
maybe use ' '.join(map(pipes.quote, args))
This w
frankf
2013/04/10 21:29:42
Done. Although the doc says it's deprecated.
| |
78 | |
79 s = '[host]' | |
80 if cwd: | |
81 s += ':' + cwd | |
82 s += '> ' + args_repr | |
83 logging.info(s) | |
Isaac (away)
2013/04/10 19:12:53
put this and the join behind a guard that checks l
craigdh
2013/04/10 20:39:49
I don't think the code complexity tradeoff is wort
frankf
2013/04/10 21:29:42
Agreed.
On 2013/04/10 20:39:49, craigdh wrote:
| |
71 tmpout = tempfile.TemporaryFile(bufsize=0) | 84 tmpout = tempfile.TemporaryFile(bufsize=0) |
72 tmperr = tempfile.TemporaryFile(bufsize=0) | 85 tmperr = tempfile.TemporaryFile(bufsize=0) |
73 exit_code = _Call(args, cwd=cwd, stdout=tmpout, stderr=tmperr, shell=shell) | 86 exit_code = _Call(args, cwd=cwd, stdout=tmpout, stderr=tmperr, shell=shell) |
74 tmperr.seek(0) | 87 tmperr.seek(0) |
75 stderr = tmperr.read() | 88 stderr = tmperr.read() |
76 tmperr.close() | 89 tmperr.close() |
77 if stderr: | 90 if stderr: |
78 logging.critical(stderr) | 91 logging.critical(stderr) |
79 tmpout.seek(0) | 92 tmpout.seek(0) |
80 stdout = tmpout.read() | 93 stdout = tmpout.read() |
81 tmpout.close() | 94 tmpout.close() |
82 logging.info(stdout[:4096]) # Truncate output longer than 4k. | 95 logging.debug(stdout[:4096]) # Truncate output longer than 4k. |
craigdh
2013/04/10 20:39:49
maybe append a note that the output was truncated
frankf
2013/04/10 21:29:42
Done.
| |
83 return (exit_code, stdout) | 96 return (exit_code, stdout) |
84 | 97 |
85 | 98 |
86 class OutDirectory(object): | 99 class OutDirectory(object): |
87 _out_directory = os.path.join(constants.CHROME_DIR, 'out') | 100 _out_directory = os.path.join(constants.CHROME_DIR, 'out') |
88 @staticmethod | 101 @staticmethod |
89 def set(out_directory): | 102 def set(out_directory): |
90 OutDirectory._out_directory = out_directory | 103 OutDirectory._out_directory = out_directory |
91 @staticmethod | 104 @staticmethod |
92 def get(): | 105 def get(): |
93 return OutDirectory._out_directory | 106 return OutDirectory._out_directory |
OLD | NEW |