diff mbox series

progressbar/knotty: Allow mixing log messages and progress bars

Message ID 20260324220051.3701826-1-richard.purdie@linuxfoundation.org
State New
Headers show
Series progressbar/knotty: Allow mixing log messages and progress bars | expand

Commit Message

Richard Purdie March 24, 2026, 10 p.m. UTC
If we try and print a log message in the middle of progress bar, the display
can be corrupted. Add a clear() method to progress bars allowing them to be
removed for the log message, then reprinted using update().

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 lib/bb/ui/knotty.py            | 5 +++++
 lib/progressbar/progressbar.py | 3 +++
 2 files changed, 8 insertions(+)
diff mbox series

Patch

diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py
index e4b7b83061e..06b654c4422 100644
--- a/lib/bb/ui/knotty.py
+++ b/lib/bb/ui/knotty.py
@@ -791,7 +791,12 @@  def main(server, eventHandler, params, tf = TerminalFilter):
                         event.msg = taskinfo['title'] + ': ' + event.msg
                 if hasattr(event, 'fn') and event.levelno not in [bb.msg.BBLogFormatter.WARNONCE, bb.msg.BBLogFormatter.ERRORONCE]:
                     event.msg = event.fn + ': ' + event.msg
+                # Need to remove any progress bar, then add it back after we print this message
+                if parseprogress:
+                    parseprogress.clear()
                 logging.getLogger(event.name).handle(event)
+                if parseprogress:
+                    parseprogress.update(parseprogress.currval)
                 continue
 
             if isinstance(event, bb.build.TaskFailedSilent):
diff --git a/lib/progressbar/progressbar.py b/lib/progressbar/progressbar.py
index a8e2dc09c91..1562774ba1a 100644
--- a/lib/progressbar/progressbar.py
+++ b/lib/progressbar/progressbar.py
@@ -278,6 +278,9 @@  class ProgressBar(object):
         self.last_update_time = now
         return output
 
+    def clear(self):
+        self.fd.write(" " * self.term_width + '\r')
+        self.fd.flush()
 
     def start(self, update=True):
         """Starts measuring time, and prints the bar at 0%.