You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
5.4 KiB
227 lines
5.4 KiB
# License: Apache 2.0. See LICENSE file in root directory.
|
|
# Copyright(c) 2021 Intel Corporation. All Rights Reserved.
|
|
|
|
import sys, os
|
|
|
|
# Set this string to show a "nesting" idetifier that can be used to distinguish output
|
|
# from this process from others...
|
|
nested = None
|
|
|
|
|
|
# We're usually the first to be imported, and so the first see the original arguments as passed
|
|
# into sys.argv... remember them before we change:
|
|
# (NOTE: sys.orig_argv is available as of 3.10)
|
|
original_args = sys.argv[1:]
|
|
|
|
|
|
def _write( s ):
|
|
"""
|
|
When s is long, write() doesn't seem to work right and only part of the string gets written!
|
|
"""
|
|
x = 0
|
|
chunk = 8192
|
|
while( x < len(s) ):
|
|
sys.stdout.write( s[x:x+chunk] )
|
|
x += chunk
|
|
|
|
|
|
# Set up the default output system; if not a terminal, disable colors!
|
|
def _stream_has_color( stream ):
|
|
if not hasattr(stream, "isatty"):
|
|
return False
|
|
if not stream.isatty():
|
|
return False # auto color only on TTYs
|
|
try:
|
|
import curses
|
|
curses.setupterm()
|
|
return curses.tigetnum( "colors" ) > 2
|
|
except:
|
|
# guess false in case of error
|
|
return False
|
|
|
|
|
|
def find_flag( arg ):
|
|
for x in range( 1, len(sys.argv) ):
|
|
a = sys.argv[x]
|
|
if a == arg:
|
|
return x
|
|
if a == '--':
|
|
break
|
|
return None
|
|
|
|
|
|
_have_no_color = False
|
|
if find_flag( '--color' ):
|
|
sys.argv.remove( '--color' )
|
|
_have_color = True
|
|
elif find_flag( '--no-color' ):
|
|
sys.argv.remove( '--no-color' )
|
|
_have_color = False
|
|
_have_no_color = True
|
|
else:
|
|
_have_color = _stream_has_color( sys.stdout )
|
|
if _have_color:
|
|
red = '\033[91m'
|
|
yellow = '\033[93m'
|
|
gray = '\033[90m'
|
|
reset = '\033[0m'
|
|
cr = '\033[G'
|
|
clear_eos = '\033[J'
|
|
clear_eol = '\033[K'
|
|
_progress = ''
|
|
def out( *args, sep = ' ', end = '\n', line_prefix = None, color = None ):
|
|
global _progress, reset
|
|
s = indent( sep.join( [str(s) for s in args] ), line_prefix )
|
|
if color:
|
|
s = color + s + reset
|
|
if end:
|
|
clear_to_eol = len(_progress) > 0 and end[-1] == '\n'
|
|
if clear_to_eol:
|
|
_write( s + clear_eol + end )
|
|
progress( *_progress )
|
|
else:
|
|
_write( s + end )
|
|
else:
|
|
_write( s )
|
|
def progress(*args):
|
|
global _progress
|
|
sys.stdout.flush()
|
|
sys.stdout.write( '\0337' ) # save cursor
|
|
print( *args, end = clear_eol )
|
|
sys.stdout.write( '\0338' ) # restore cursor
|
|
sys.stdout.flush()
|
|
_progress = args
|
|
else:
|
|
red = yellow = gray = reset = cr = clear_eos = ''
|
|
def out( *args, sep = ' ', end = '\n', line_prefix = None, color = None ):
|
|
s = indent( sep.join( [str(s) for s in args] ), line_prefix )
|
|
if end:
|
|
_write( s + end )
|
|
else:
|
|
_write( s )
|
|
def progress(*args):
|
|
if args:
|
|
print( *args )
|
|
sys.stdout.flush()
|
|
|
|
def is_color_on():
|
|
global _have_color
|
|
return _have_color
|
|
|
|
def is_color_disabled():
|
|
global _have_no_color
|
|
return _have_no_color
|
|
|
|
|
|
def quiet_on():
|
|
global out
|
|
def out(*args):
|
|
pass
|
|
|
|
|
|
def indent( str, line_prefix = ' ' ):
|
|
global nested
|
|
if nested:
|
|
line_prefix = '[' + nested + '] ' + ( line_prefix or '' )
|
|
if line_prefix:
|
|
str = line_prefix + str.replace( '\n', '\n' + line_prefix )
|
|
return str
|
|
|
|
|
|
_verbose_on = False
|
|
def v(*args):
|
|
pass
|
|
def verbose_on():
|
|
global v, _verbose_on
|
|
def v(*args):
|
|
global gray, reset
|
|
out( gray + '-V-', *args, reset )
|
|
_verbose_on = True
|
|
def is_verbose_on():
|
|
global _verbose_on
|
|
return _verbose_on
|
|
|
|
|
|
_debug_on = False
|
|
_debug_indent = ''
|
|
def d(*args):
|
|
# Return whether info was output
|
|
return False
|
|
def debug_on():
|
|
global d, _debug_on, _debug_indent
|
|
def d( *args ):
|
|
global gray
|
|
out( *args, line_prefix = "-D- " + _debug_indent, color = gray )
|
|
return True
|
|
_debug_on = True
|
|
def is_debug_on():
|
|
global _debug_on
|
|
return _debug_on
|
|
if find_flag( '--debug' ):
|
|
sys.argv.remove( '--debug' )
|
|
debug_on()
|
|
def debug_indent( n = 1, indentation = ' ' ):
|
|
global _debug_indent
|
|
_debug_indent += n * indentation
|
|
def debug_unindent( n = 1, indentation = ' ' ):
|
|
global _debug_indent
|
|
_debug_indent = _debug_indent[:-n * len(indentation)]
|
|
|
|
|
|
def i( *args ):
|
|
out( '-I-', *args)
|
|
|
|
|
|
def f( *args ):
|
|
out( *args, line_prefix = red + '-F-' + reset + ' ' )
|
|
sys.exit(1)
|
|
|
|
|
|
# We track the number of errors
|
|
_n_errors = 0
|
|
def e( *args ):
|
|
global red, reset
|
|
out( *args, line_prefix = red + '-E-' + reset + ' ' )
|
|
global _n_errors
|
|
_n_errors = _n_errors + 1
|
|
|
|
def n_errors():
|
|
global _n_errors
|
|
return _n_errors
|
|
|
|
def reset_errors():
|
|
global _n_errors
|
|
_n_errors = 0
|
|
|
|
|
|
# We track the number of warnings
|
|
_n_warnings = 0
|
|
def w(*args):
|
|
global red, reset
|
|
out( *args, line_prefix = yellow + '-W-' + reset + ' ' )
|
|
global _n_warnings
|
|
_n_warnings = _n_warnings + 1
|
|
|
|
def n_warnings():
|
|
global _n_warnings
|
|
return _n_warnings
|
|
|
|
def reset_warnings():
|
|
global _n_warnings
|
|
_n_warnings = 0
|
|
|
|
|
|
def split():
|
|
"""
|
|
Output an easy-to-distinguish line separating text above from below.
|
|
Currently a line of "_____"
|
|
"""
|
|
try:
|
|
screen_width = os.get_terminal_size().columns
|
|
except:
|
|
# this happens under github actions, for example, or when a terminal does not exist
|
|
screen_width = 60
|
|
out()
|
|
out( '_' * screen_width )
|
|
|