From patchwork Wed Nov 14 14:43:19 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: Wed, 14 Nov 2012 14:43:19 -0000 From: Seth Bollinger X-Patchwork-Id: 39043 Message-Id: To: Richard Purdie Cc: "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. Used Jason Wessel's recommendation for transparency on verbose, note and plain. 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 + BASECOLOR, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(29,38) + + COLORS = { + DEBUG3 : CYAN, + DEBUG2 : CYAN, + DEBUG : CYAN, + VERBOSE : BASECOLOR, + NOTE : BASECOLOR, + PLAIN : BASECOLOR, + 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)