index : archinstall32 | |
Archlinux32 installer | gitolite user |
summaryrefslogtreecommitdiff |
-rw-r--r-- | archinstall/lib/general.py | 52 |
diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py index 89c7f188..88cfc047 100644 --- a/archinstall/lib/general.py +++ b/archinstall/lib/general.py @@ -1,10 +1,14 @@ -import os, json, hashlib, shlex +import os, json, hashlib, shlex, sys import time, pty from subprocess import Popen, STDOUT, PIPE, check_output from select import epoll, EPOLLIN, EPOLLHUP def log(*args, **kwargs): - print(' '.join([str(x) for x in args])) + string = ' '.join([str(x) for x in args]) + if supports_color(): + kwargs = {'bg' : 'black', 'fg': 'white', **kwargs} + string = stylize_output(string, **kwargs) + print(string) def gen_uid(entropy_length=256): return hashlib.sha512(os.urandom(entropy_length)).hexdigest() @@ -23,6 +27,43 @@ def multisplit(s, splitters): s = ns return s +# Heavily influenced by: https://github.com/django/django/blob/ae8338daf34fd746771e0678081999b656177bae/django/utils/termcolors.py#L13 +# Color options here: https://askubuntu.com/questions/528928/how-to-do-underline-bold-italic-strikethrough-color-background-and-size-i +def stylize_output(text :str, *opts, **kwargs): + opt_dict = {'bold': '1', 'italic' : '3', 'underscore': '4', 'blink': '5', 'reverse': '7', 'conceal': '8'} + color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white') + foreground = {color_names[x]: '3%s' % x for x in range(8)} + background = {color_names[x]: '4%s' % x for x in range(8)} + RESET = '0' + + code_list = [] + if text == '' and len(opts) == 1 and opts[0] == 'reset': + return '\x1b[%sm' % RESET + for k, v in kwargs.items(): + if k == 'fg': + code_list.append(foreground[v]) + elif k == 'bg': + code_list.append(background[v]) + for o in opts: + if o in opt_dict: + code_list.append(opt_dict[o]) + if 'noreset' not in opts: + text = '%s\x1b[%sm' % (text or '', RESET) + return '%s%s' % (('\x1b[%sm' % ';'.join(code_list)), text or '') + +# Found first reference here: https://stackoverflow.com/questions/7445658/how-to-detect-if-the-console-does-support-ansi-escape-codes-in-python +# And re-used this: https://github.com/django/django/blob/master/django/core/management/color.py#L12 +def supports_color(): + """ + Return True if the running system's terminal supports color, + and False otherwise. + """ + supported_platform = sys.platform != 'win32' or 'ANSICON' in os.environ + + # isatty is not always implemented, #6223. + is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty() + return supported_platform and is_a_tty + class sys_command():#Thread): """ Stolen from archinstall_gui @@ -165,14 +206,14 @@ class sys_command():#Thread): if bytes(f']$'.lower(), 'UTF-8') in self.trace_log[0-len(f']$')-5:].lower(): if 'debug' in self.kwargs and self.kwargs['debug']: - log(f"{self.cmd[0]} has finished.", origin='spawn', level=4) + log(f"{self.cmd[0]} has finished.") alive = False break self.status = 'done' if 'debug' in self.kwargs and self.kwargs['debug']: - log(f"{self.cmd[0]} waiting for exit code.", origin='spawn', level=5) + log(f"{self.cmd[0]} waiting for exit code.") if not self.kwargs['emulate']: try: @@ -185,6 +226,9 @@ class sys_command():#Thread): else: self.exit_code = 0 + if 'debug' in self.kwargs and self.kwargs['debug']: + log(f"{self.cmd[0]} got exit code: {self.exit_code}") + if 'ignore_errors' in self.kwargs: self.exit_code = 0 |