| # |
| # Copyright (C) 2015 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| import contextlib |
| import os |
| import subprocess |
| |
| |
| def color_string(string, color): |
| colors = { |
| 'green': '\033[92m', |
| 'red': '\033[91m', |
| 'yellow': '\033[93m', |
| } |
| end_color = '\033[0m' |
| return colors[color] + string + end_color |
| |
| |
| @contextlib.contextmanager |
| def cd(path): |
| curdir = os.getcwd() |
| os.chdir(path) |
| try: |
| yield |
| finally: |
| os.chdir(curdir) |
| |
| |
| def call_output(cmd, *args, **kwargs): |
| """Invoke the specified command and return exit code and output. |
| |
| This is the missing subprocess.call_output, which is the combination of |
| subprocess.call and subprocess.check_output. Like call, it returns an exit |
| code rather than raising an exception. Like check_output, it returns the |
| output of the program. Unlike check_output, it returns the output even on |
| failure. |
| |
| Returns: Tuple of (exit_code, output). |
| """ |
| proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
| stderr=subprocess.STDOUT, *args, **kwargs) |
| out, _ = proc.communicate() |
| return proc.returncode, out |