]>
Commit | Line | Data |
---|---|---|
f67539c2 | 1 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. |
7c673cae FG |
2 | """ |
3 | This module keeps commonly used components. | |
4 | """ | |
5 | from __future__ import absolute_import | |
6 | from __future__ import division | |
7 | from __future__ import print_function | |
8 | from __future__ import unicode_literals | |
f67539c2 TL |
9 | try: |
10 | from builtins import object | |
11 | except ImportError: | |
12 | from __builtin__ import object | |
7c673cae | 13 | import subprocess |
f67539c2 | 14 | import sys |
7c673cae FG |
15 | import os |
16 | import time | |
17 | ||
f67539c2 | 18 | class ColorString(object): |
7c673cae FG |
19 | """ Generate colorful strings on terminal """ |
20 | HEADER = '\033[95m' | |
21 | BLUE = '\033[94m' | |
22 | GREEN = '\033[92m' | |
23 | WARNING = '\033[93m' | |
24 | FAIL = '\033[91m' | |
25 | ENDC = '\033[0m' | |
26 | ||
27 | @staticmethod | |
28 | def _make_color_str(text, color): | |
f67539c2 TL |
29 | # In Python2, default encoding for unicode string is ASCII |
30 | if sys.version_info.major <= 2: | |
31 | return "".join( | |
32 | [color, text.encode('utf-8'), ColorString.ENDC]) | |
33 | # From Python3, default encoding for unicode string is UTF-8 | |
34 | return "".join( | |
35 | [color, text, ColorString.ENDC]) | |
7c673cae FG |
36 | |
37 | @staticmethod | |
38 | def ok(text): | |
39 | if ColorString.is_disabled: | |
40 | return text | |
41 | return ColorString._make_color_str(text, ColorString.GREEN) | |
42 | ||
43 | @staticmethod | |
44 | def info(text): | |
45 | if ColorString.is_disabled: | |
46 | return text | |
47 | return ColorString._make_color_str(text, ColorString.BLUE) | |
48 | ||
49 | @staticmethod | |
50 | def header(text): | |
51 | if ColorString.is_disabled: | |
52 | return text | |
53 | return ColorString._make_color_str(text, ColorString.HEADER) | |
54 | ||
55 | @staticmethod | |
56 | def error(text): | |
57 | if ColorString.is_disabled: | |
58 | return text | |
59 | return ColorString._make_color_str(text, ColorString.FAIL) | |
60 | ||
61 | @staticmethod | |
62 | def warning(text): | |
63 | if ColorString.is_disabled: | |
64 | return text | |
65 | return ColorString._make_color_str(text, ColorString.WARNING) | |
66 | ||
67 | is_disabled = False | |
68 | ||
69 | ||
70 | def run_shell_command(shell_cmd, cmd_dir=None): | |
71 | """ Run a single shell command. | |
72 | @returns a tuple of shell command return code, stdout, stderr """ | |
73 | ||
74 | if cmd_dir is not None and not os.path.exists(cmd_dir): | |
75 | run_shell_command("mkdir -p %s" % cmd_dir) | |
76 | ||
77 | start = time.time() | |
78 | print("\t>>> Running: " + shell_cmd) | |
79 | p = subprocess.Popen(shell_cmd, | |
80 | shell=True, | |
81 | stdout=subprocess.PIPE, | |
82 | stderr=subprocess.PIPE, | |
83 | cwd=cmd_dir) | |
84 | stdout, stderr = p.communicate() | |
85 | end = time.time() | |
86 | ||
87 | # Report time if we spent more than 5 minutes executing a command | |
88 | execution_time = end - start | |
89 | if execution_time > (60 * 5): | |
90 | mins = (execution_time / 60) | |
91 | secs = (execution_time % 60) | |
92 | print("\t>time spent: %d minutes %d seconds" % (mins, secs)) | |
93 | ||
94 | ||
95 | return p.returncode, stdout, stderr | |
96 | ||
97 | ||
98 | def run_shell_commands(shell_cmds, cmd_dir=None, verbose=False): | |
99 | """ Execute a sequence of shell commands, which is equivalent to | |
100 | running `cmd1 && cmd2 && cmd3` | |
101 | @returns boolean indication if all commands succeeds. | |
102 | """ | |
103 | ||
104 | if cmd_dir: | |
105 | print("\t=== Set current working directory => %s" % cmd_dir) | |
106 | ||
107 | for shell_cmd in shell_cmds: | |
108 | ret_code, stdout, stderr = run_shell_command(shell_cmd, cmd_dir) | |
109 | if stdout: | |
110 | if verbose or ret_code != 0: | |
111 | print(ColorString.info("stdout: \n"), stdout) | |
112 | if stderr: | |
113 | # contents in stderr is not necessarily to be error messages. | |
114 | if verbose or ret_code != 0: | |
115 | print(ColorString.error("stderr: \n"), stderr) | |
116 | if ret_code != 0: | |
117 | return False | |
118 | ||
119 | return True |