From patchwork Sun Nov 11 15:17:40 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel, v2] bitbake: Colorize knotty interactive console output Date: Sun, 11 Nov 2012 15:17:40 -0000 From: Seth Bollinger X-Patchwork-Id: 38847 Message-Id: To: bitbake-devel@lists.openembedded.org Add bold color output to log level name and standard color output to log msg when bitbake is run from an iteractive console. Color output is only enabled if the terminal supports color. Signed-off-by: Seth Bollinger --- bitbake/lib/bb/msg.py | 40 ++++++++++++++++++++++++++++++++++++++++ bitbake/lib/bb/ui/knotty.py | 6 +++++- 2 files changed, 45 insertions(+), 1 deletions(-) diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py index 9b39325..68b2ad7 100644 --- a/bitbake/lib/bb/msg.py +++ b/bitbake/lib/bb/msg.py @@ -55,6 +55,25 @@ class BBLogFormatter(logging.Formatter): CRITICAL: 'ERROR', } + color_enabled = False + BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(30,38) + + COLORS = { + DEBUG3 : CYAN, + DEBUG2 : CYAN, + DEBUG : CYAN, + VERBOSE : WHITE, + NOTE : WHITE, + PLAIN : WHITE, + WARNING : YELLOW, + ERROR : RED, + CRITICAL: RED, + } + + BLD = '\033[1;%dm' + STD = '\033[%dm' + RST = '\033[0m' + def getLevelName(self, levelno): try: return self.levelnames[levelno] @@ -67,6 +86,8 @@ class BBLogFormatter(logging.Formatter): if record.levelno == self.PLAIN: msg = record.getMessage() else: + if self.color_enabled: + self.colorize(record) msg = logging.Formatter.format(self, record) if hasattr(record, 'bb_exc_info'): @@ -75,6 +96,25 @@ class BBLogFormatter(logging.Formatter): msg += '\n' + ''.join(formatted) return msg + def colorize(self, record): + color = self.COLORS[record.levelno] + if self.color_enabled and color is not None: + record.levelname = "".join([self.BLD % color, record.levelname, self.RST]) + record.msg = "".join([self.STD % color, record.msg, self.RST]) + + def enable_color(self): + import curses + try: + win = None + win = curses.initscr() + if curses.has_colors(): + self.color_enabled = True + except: + pass + finally: + if win is not None: + curses.endwin() + class BBLogFilter(object): def __init__(self, handler, level, debug_domains): self.stdlevel = level diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py index b99a121..d9aa973 100644 --- a/bitbake/lib/bb/ui/knotty.py +++ b/bitbake/lib/bb/ui/knotty.py @@ -238,12 +238,16 @@ def main(server, eventHandler, tf = TerminalFilter): helper = uihelper.BBUIHelper() console = logging.StreamHandler(sys.stdout) - format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") + format_str = "%(levelname)s: %(message)s" + format = bb.msg.BBLogFormatter(format_str) + if interactive: + format.enable_color() bb.msg.addDefaultlogFilter(console) console.setFormatter(format) logger.addHandler(console) if consolelogfile: bb.utils.mkdirhier(os.path.dirname(consolelogfile)) + format = bb.msg.BBLogFormatter(format_str) consolelog = logging.FileHandler(consolelogfile) bb.msg.addDefaultlogFilter(consolelog) consolelog.setFormatter(format)