diff options
Diffstat (limited to 'bitbake/lib/bb/ui/knotty.py')
| -rw-r--r-- | bitbake/lib/bb/ui/knotty.py | 74 |
1 files changed, 65 insertions, 9 deletions
diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py index 6a6f6888e3..2513501500 100644 --- a/bitbake/lib/bb/ui/knotty.py +++ b/bitbake/lib/bb/ui/knotty.py | |||
| @@ -40,10 +40,13 @@ logger = logging.getLogger("BitBake") | |||
| 40 | interactive = sys.stdout.isatty() | 40 | interactive = sys.stdout.isatty() |
| 41 | 41 | ||
| 42 | class BBProgress(progressbar.ProgressBar): | 42 | class BBProgress(progressbar.ProgressBar): |
| 43 | def __init__(self, msg, maxval): | 43 | def __init__(self, msg, maxval, widgets=None): |
| 44 | self.msg = msg | 44 | self.msg = msg |
| 45 | widgets = [progressbar.Percentage(), ' ', progressbar.Bar(), ' ', | 45 | self.extrapos = -1 |
| 46 | progressbar.ETA()] | 46 | if not widgets: |
| 47 | widgets = [progressbar.Percentage(), ' ', progressbar.Bar(), ' ', | ||
| 48 | progressbar.ETA()] | ||
| 49 | self.extrapos = 4 | ||
| 47 | 50 | ||
| 48 | try: | 51 | try: |
| 49 | self._resize_default = signal.getsignal(signal.SIGWINCH) | 52 | self._resize_default = signal.getsignal(signal.SIGWINCH) |
| @@ -55,11 +58,31 @@ class BBProgress(progressbar.ProgressBar): | |||
| 55 | progressbar.ProgressBar._handle_resize(self, signum, frame) | 58 | progressbar.ProgressBar._handle_resize(self, signum, frame) |
| 56 | if self._resize_default: | 59 | if self._resize_default: |
| 57 | self._resize_default(signum, frame) | 60 | self._resize_default(signum, frame) |
| 61 | |||
| 58 | def finish(self): | 62 | def finish(self): |
| 59 | progressbar.ProgressBar.finish(self) | 63 | progressbar.ProgressBar.finish(self) |
| 60 | if self._resize_default: | 64 | if self._resize_default: |
| 61 | signal.signal(signal.SIGWINCH, self._resize_default) | 65 | signal.signal(signal.SIGWINCH, self._resize_default) |
| 62 | 66 | ||
| 67 | def setmessage(self, msg): | ||
| 68 | self.msg = msg | ||
| 69 | self.widgets[0] = msg | ||
| 70 | |||
| 71 | def setextra(self, extra): | ||
| 72 | if extra: | ||
| 73 | extrastr = str(extra) | ||
| 74 | if extrastr[0] != ' ': | ||
| 75 | extrastr = ' ' + extrastr | ||
| 76 | if extrastr[-1] != ' ': | ||
| 77 | extrastr += ' ' | ||
| 78 | else: | ||
| 79 | extrastr = ' ' | ||
| 80 | self.widgets[self.extrapos] = extrastr | ||
| 81 | |||
| 82 | def _need_update(self): | ||
| 83 | # We always want the bar to print when update() is called | ||
| 84 | return True | ||
| 85 | |||
| 63 | class NonInteractiveProgress(object): | 86 | class NonInteractiveProgress(object): |
| 64 | fobj = sys.stdout | 87 | fobj = sys.stdout |
| 65 | 88 | ||
| @@ -195,15 +218,31 @@ class TerminalFilter(object): | |||
| 195 | activetasks = self.helper.running_tasks | 218 | activetasks = self.helper.running_tasks |
| 196 | failedtasks = self.helper.failed_tasks | 219 | failedtasks = self.helper.failed_tasks |
| 197 | runningpids = self.helper.running_pids | 220 | runningpids = self.helper.running_pids |
| 198 | if self.footer_present and (self.lastcount == self.helper.tasknumber_current) and (self.lastpids == runningpids): | 221 | if self.footer_present and not self.helper.needUpdate: |
| 199 | return | 222 | return |
| 223 | self.helper.needUpdate = False | ||
| 200 | if self.footer_present: | 224 | if self.footer_present: |
| 201 | self.clearFooter() | 225 | self.clearFooter() |
| 202 | if (not self.helper.tasknumber_total or self.helper.tasknumber_current == self.helper.tasknumber_total) and not len(activetasks): | 226 | if (not self.helper.tasknumber_total or self.helper.tasknumber_current == self.helper.tasknumber_total) and not len(activetasks): |
| 203 | return | 227 | return |
| 204 | tasks = [] | 228 | tasks = [] |
| 205 | for t in runningpids: | 229 | for t in runningpids: |
| 206 | tasks.append("%s (pid %s)" % (activetasks[t]["title"], t)) | 230 | progress = activetasks[t].get("progress", None) |
| 231 | if progress is not None: | ||
| 232 | pbar = activetasks[t].get("progressbar", None) | ||
| 233 | rate = activetasks[t].get("rate", None) | ||
| 234 | start_time = activetasks[t].get("starttime", None) | ||
| 235 | if not pbar or pbar.bouncing != (progress < 0): | ||
| 236 | if progress < 0: | ||
| 237 | pbar = BBProgress("0: %s (pid %s) " % (activetasks[t]["title"], t), 100, widgets=[progressbar.BouncingSlider()]) | ||
| 238 | pbar.bouncing = True | ||
| 239 | else: | ||
| 240 | pbar = BBProgress("0: %s (pid %s) " % (activetasks[t]["title"], t), 100) | ||
| 241 | pbar.bouncing = False | ||
| 242 | activetasks[t]["progressbar"] = pbar | ||
| 243 | tasks.append((pbar, progress, rate, start_time)) | ||
| 244 | else: | ||
| 245 | tasks.append("%s (pid %s)" % (activetasks[t]["title"], t)) | ||
| 207 | 246 | ||
| 208 | if self.main.shutdown: | 247 | if self.main.shutdown: |
| 209 | content = "Waiting for %s running tasks to finish:" % len(activetasks) | 248 | content = "Waiting for %s running tasks to finish:" % len(activetasks) |
| @@ -214,8 +253,23 @@ class TerminalFilter(object): | |||
| 214 | print(content) | 253 | print(content) |
| 215 | lines = 1 + int(len(content) / (self.columns + 1)) | 254 | lines = 1 + int(len(content) / (self.columns + 1)) |
| 216 | for tasknum, task in enumerate(tasks[:(self.rows - 2)]): | 255 | for tasknum, task in enumerate(tasks[:(self.rows - 2)]): |
| 217 | content = "%s: %s" % (tasknum, task) | 256 | if isinstance(task, tuple): |
| 218 | print(content) | 257 | pbar, progress, rate, start_time = task |
| 258 | if not pbar.start_time: | ||
| 259 | pbar.start(False) | ||
| 260 | if start_time: | ||
| 261 | pbar.start_time = start_time | ||
| 262 | pbar.setmessage('%s:%s' % (tasknum, pbar.msg.split(':', 1)[1])) | ||
| 263 | if progress > -1: | ||
| 264 | pbar.setextra(rate) | ||
| 265 | output = pbar.update(progress) | ||
| 266 | else: | ||
| 267 | output = pbar.update(1) | ||
| 268 | if not output or (len(output) <= pbar.term_width): | ||
| 269 | print('') | ||
| 270 | else: | ||
| 271 | content = "%s: %s" % (tasknum, task) | ||
| 272 | print(content) | ||
| 219 | lines = lines + 1 + int(len(content) / (self.columns + 1)) | 273 | lines = lines + 1 + int(len(content) / (self.columns + 1)) |
| 220 | self.footer_present = lines | 274 | self.footer_present = lines |
| 221 | self.lastpids = runningpids[:] | 275 | self.lastpids = runningpids[:] |
| @@ -249,7 +303,8 @@ _evt_list = [ "bb.runqueue.runQueueExitWait", "bb.event.LogExecTTY", "logging.Lo | |||
| 249 | "bb.command.CommandExit", "bb.command.CommandCompleted", "bb.cooker.CookerExit", | 303 | "bb.command.CommandExit", "bb.command.CommandCompleted", "bb.cooker.CookerExit", |
| 250 | "bb.event.MultipleProviders", "bb.event.NoProvider", "bb.runqueue.sceneQueueTaskStarted", | 304 | "bb.event.MultipleProviders", "bb.event.NoProvider", "bb.runqueue.sceneQueueTaskStarted", |
| 251 | "bb.runqueue.runQueueTaskStarted", "bb.runqueue.runQueueTaskFailed", "bb.runqueue.sceneQueueTaskFailed", | 305 | "bb.runqueue.runQueueTaskStarted", "bb.runqueue.runQueueTaskFailed", "bb.runqueue.sceneQueueTaskFailed", |
| 252 | "bb.event.BuildBase", "bb.build.TaskStarted", "bb.build.TaskSucceeded", "bb.build.TaskFailedSilent"] | 306 | "bb.event.BuildBase", "bb.build.TaskStarted", "bb.build.TaskSucceeded", "bb.build.TaskFailedSilent", |
| 307 | "bb.build.TaskProgress"] | ||
| 253 | 308 | ||
| 254 | def main(server, eventHandler, params, tf = TerminalFilter): | 309 | def main(server, eventHandler, params, tf = TerminalFilter): |
| 255 | 310 | ||
| @@ -535,7 +590,8 @@ def main(server, eventHandler, params, tf = TerminalFilter): | |||
| 535 | bb.event.OperationStarted, | 590 | bb.event.OperationStarted, |
| 536 | bb.event.OperationCompleted, | 591 | bb.event.OperationCompleted, |
| 537 | bb.event.OperationProgress, | 592 | bb.event.OperationProgress, |
| 538 | bb.event.DiskFull)): | 593 | bb.event.DiskFull, |
| 594 | bb.build.TaskProgress)): | ||
| 539 | continue | 595 | continue |
| 540 | 596 | ||
| 541 | logger.error("Unknown event: %s", event) | 597 | logger.error("Unknown event: %s", event) |
