| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved."""This module keeps commonly used components."""from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionfrom __future__ import unicode_literalstry:    from builtins import objectexcept ImportError:    from __builtin__ import objectimport subprocessimport sysimport osimport timeclass ColorString(object):    """ 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):        # In Python2, default encoding for unicode string is ASCII        if sys.version_info.major <= 2:            return "".join(                [color, text.encode('utf-8'), ColorString.ENDC])        # From Python3, default encoding for unicode string is UTF-8        return "".join(            [color, text, 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 = Falsedef 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, stderrdef 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
 |