Index: lib/cros_build_lib.py |
diff --git a/lib/cros_build_lib.py b/lib/cros_build_lib.py |
index 0b728efd38f96093fc6874cb612913d3a4ee4a46..b45733eedaa2349eb35d0985e436ff64fe9bd972 100644 |
--- a/lib/cros_build_lib.py |
+++ b/lib/cros_build_lib.py |
@@ -93,6 +93,51 @@ def RunCommand(cmd, print_cmd=True, error_ok=False, error_message=None, |
return output |
+def RunCommandCaptureOutput(cmd, print_cmd=True, cwd=None, input=None, |
+ enter_chroot=False, |
+ combine_stdout_stderr=True): |
+ """Runs a shell command. Differs from RunCommand, because it allows |
+ you to run a command and capture the exit code, output, and stderr |
+ all at the same time. |
+ |
+ Arguments: |
+ cmd: cmd to run. Should be input to subprocess.POpen. If a string, |
+ converted to an array using split(). |
+ print_cmd: prints the command before running it. |
+ cwd: the working directory to run this cmd. |
+ input: input to pipe into this command through stdin. |
+ enter_chroot: this command should be run from within the chroot. If set, |
+ cwd must point to the scripts directory. |
+ combine_stdout_stderr -- combine outputs together. |
+ |
+ Returns: |
+ Returns a tuple: (exit_code, stdout, stderr) (integer, string, string) |
+ stderr is None if combine_stdout_stderr is True |
+ """ |
+ # Set default for variables. |
+ stdout = subprocess.PIPE |
+ stderr = subprocess.PIPE |
+ stdin = None |
+ |
+ # Modify defaults based on parameters. |
+ if input: stdin = subprocess.PIPE |
+ if combine_stdout_stderr: stderr = subprocess.STDOUT |
+ |
+ if enter_chroot: cmd = ['./enter_chroot.sh', '--'] + cmd |
+ |
+ # Print out the command before running. |
+ if print_cmd: |
+ Info('PROGRAM(%s) -> RunCommand: %r in dir %s' % |
+ (GetCallerName(), cmd, cwd)) |
+ |
+ proc = subprocess.Popen(cmd, cwd=cwd, stdin=stdin, |
+ stdout=stdout, stderr=stderr) |
+ (output, error) = proc.communicate(input) |
+ |
+ # Error is None if stdout, stderr are combined. |
+ return proc.returncode, output, error |
+ |
+ |
class Color(object): |
"""Conditionally wraps text in ANSI color escape sequences.""" |
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8) |
@@ -191,4 +236,3 @@ def ReinterpretPathForChroot(path): |
new_path = os.path.join('/home', os.getenv('USER'), 'trunk', relative_path) |
return new_path |
- |