""" This module keeps commonly used components. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import subprocess import os import time class ColorString: """ Generate colorful strings on terminal """ HEADER = '\033[95m' BLUE = '\033[94m' GREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' @staticmethod def _make_color_str(text, color): return "".join([color, text.encode('utf-8'), ColorString.ENDC]) @staticmethod def ok(text): if ColorString.is_disabled: return text return ColorString._make_color_str(text, ColorString.GREEN) @staticmethod def info(text): if ColorString.is_disabled: return text return ColorString._make_color_str(text, ColorString.BLUE) @staticmethod def header(text): if ColorString.is_disabled: return text return ColorString._make_color_str(text, ColorString.HEADER) @staticmethod def error(text): if ColorString.is_disabled: return text return ColorString._make_color_str(text, ColorString.FAIL) @staticmethod def warning(text): if ColorString.is_disabled: return text return ColorString._make_color_str(text, ColorString.WARNING) is_disabled = False def run_shell_command(shell_cmd, cmd_dir=None): """ Run a single shell command. @returns a tuple of shell command return code, stdout, stderr """ if cmd_dir is not None and not os.path.exists(cmd_dir): run_shell_command("mkdir -p %s" % cmd_dir) start = time.time() print("\t>>> Running: " + shell_cmd) p = subprocess.Popen(shell_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cmd_dir) stdout, stderr = p.communicate() end = time.time() # Report time if we spent more than 5 minutes executing a command execution_time = end - start if execution_time > (60 * 5): mins = (execution_time / 60) secs = (execution_time % 60) print("\t>time spent: %d minutes %d seconds" % (mins, secs)) return p.returncode, stdout, stderr def run_shell_commands(shell_cmds, cmd_dir=None, verbose=False): """ Execute a sequence of shell commands, which is equivalent to running `cmd1 && cmd2 && cmd3` @returns boolean indication if all commands succeeds. """ if cmd_dir: print("\t=== Set current working directory => %s" % cmd_dir) for shell_cmd in shell_cmds: ret_code, stdout, stderr = run_shell_command(shell_cmd, cmd_dir) if stdout: if verbose or ret_code != 0: print(ColorString.info("stdout: \n"), stdout) if stderr: # contents in stderr is not necessarily to be error messages. if verbose or ret_code != 0: print(ColorString.error("stderr: \n"), stderr) if ret_code != 0: return False return True