[bitbake-devel,v3,3/4] progress: filter ANSI escape codes before looking for progress text

Submitted by Chris Laplante via lists.openembedded.org on July 31, 2020, 3:42 p.m. | Patch ID: 174961

Details

Message ID 20200731154249.89999-4-chris.laplante@agilent.com
State New
Headers show

Commit Message

This is in prepartion for introducing the log-colorizer bbclass into poky.

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 lib/bb/progress.py | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/lib/bb/progress.py b/lib/bb/progress.py
index 8cddefae..d051ba01 100644
--- a/lib/bb/progress.py
+++ b/lib/bb/progress.py
@@ -15,6 +15,25 @@  import bb.build
 from bb.build import StdoutNoopContextManager
 
 
+# from https://stackoverflow.com/a/14693789/221061
+ANSI_ESCAPE_REGEX = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
+
+
+def filter_color(string):
+    """
+    Filter ANSI escape codes out of |string|, return new string
+    """
+    return ANSI_ESCAPE_REGEX.sub('', string)
+
+
+def filter_color_n(string):
+    """
+    Filter ANSI escape codes out of |string|, returns tuple of
+    (new string, # of ANSI codes removed)
+    """
+    return ANSI_ESCAPE_REGEX.subn('', string)
+
+
 class ProgressHandler:
     """
     Base class that can pretend to be a file object well enough to be
@@ -82,7 +101,7 @@  class LineFilterProgressHandler(ProgressHandler):
             lbreakpos = line.rfind('\r') + 1
             if lbreakpos:
                 line = line[lbreakpos:]
-            if self.writeline(line):
+            if self.writeline(filter_color(line)):
                 super().write(line)
 
     def writeline(self, line):
@@ -97,7 +116,7 @@  class BasicProgressHandler(ProgressHandler):
         self._fire_progress(0)
 
     def write(self, string):
-        percs = self._regex.findall(string)
+        percs = self._regex.findall(filter_color(string))
         if percs:
             progress = int(percs[-1])
             self.update(progress)
@@ -112,7 +131,7 @@  class OutOfProgressHandler(ProgressHandler):
         self._fire_progress(0)
 
     def write(self, string):
-        nums = self._regex.findall(string)
+        nums = self._regex.findall(filter_color(string))
         if nums:
             progress = (float(nums[-1][0]) / float(nums[-1][1])) * 100
             self.update(progress)