diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2016-06-23 22:59:05 +1200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-07-08 09:57:26 +0100 |
commit | ac5e720575dd3c8f86514a7a646de82c8cc28e17 (patch) | |
tree | 9c0cec5d764f1b9fb8f33d5f094d87a8fbc89ab5 /bitbake/lib/bb/build.py | |
parent | 1cf6e14a6c5ddb4daec1c1e0cce113eea8570545 (diff) | |
download | poky-ac5e720575dd3c8f86514a7a646de82c8cc28e17.tar.gz |
bitbake: lib: implement basic task progress support
For long-running tasks where we have some output from the task that
gives us some idea of the progress of the task (such as a percentage
complete), provide the means to scrape the output for that progress
information and show it to the user in the default knotty terminal
output in the form of a progress bar. This is implemented using a new
TaskProgress event as well as some code we can insert to do output
scanning/filtering.
Any task can fire TaskProgress events; however, if you have a shell task
whose output you wish to scan for progress information, you just need to
set the "progress" varflag on the task. This can be set to:
* "percent" to just look for a number followed by a % sign
* "percent:<regex>" to specify your own regex matching a percentage
value (must have a single group which matches the percentage number)
* "outof:<regex>" to look for the specified regex matching x out of y
items completed (must have two groups - first group needs to be x,
second y).
We can potentially extend this in future but this should be a good
start.
Part of the implementation for [YOCTO #5383].
(Bitbake rev: 0d275fc5b6531957a6189069b04074065bb718a0)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/build.py')
-rw-r--r-- | bitbake/lib/bb/build.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py index 2ebe67306f..4fb2a77cfd 100644 --- a/bitbake/lib/bb/build.py +++ b/bitbake/lib/bb/build.py | |||
@@ -35,6 +35,7 @@ import stat | |||
35 | import bb | 35 | import bb |
36 | import bb.msg | 36 | import bb.msg |
37 | import bb.process | 37 | import bb.process |
38 | import bb.progress | ||
38 | from bb import data, event, utils | 39 | from bb import data, event, utils |
39 | 40 | ||
40 | bblogger = logging.getLogger('BitBake') | 41 | bblogger = logging.getLogger('BitBake') |
@@ -137,6 +138,25 @@ class TaskInvalid(TaskBase): | |||
137 | super(TaskInvalid, self).__init__(task, None, metadata) | 138 | super(TaskInvalid, self).__init__(task, None, metadata) |
138 | self._message = "No such task '%s'" % task | 139 | self._message = "No such task '%s'" % task |
139 | 140 | ||
141 | class TaskProgress(event.Event): | ||
142 | """ | ||
143 | Task made some progress that could be reported to the user, usually in | ||
144 | the form of a progress bar or similar. | ||
145 | NOTE: this class does not inherit from TaskBase since it doesn't need | ||
146 | to - it's fired within the task context itself, so we don't have any of | ||
147 | the context information that you do in the case of the other events. | ||
148 | The event PID can be used to determine which task it came from. | ||
149 | The progress value is normally 0-100, but can also be negative | ||
150 | indicating that progress has been made but we aren't able to determine | ||
151 | how much. | ||
152 | The rate is optional, this is simply an extra string to display to the | ||
153 | user if specified. | ||
154 | """ | ||
155 | def __init__(self, progress, rate=None): | ||
156 | self.progress = progress | ||
157 | self.rate = rate | ||
158 | event.Event.__init__(self) | ||
159 | |||
140 | 160 | ||
141 | class LogTee(object): | 161 | class LogTee(object): |
142 | def __init__(self, logger, outfile): | 162 | def __init__(self, logger, outfile): |
@@ -340,6 +360,20 @@ exit $ret | |||
340 | else: | 360 | else: |
341 | logfile = sys.stdout | 361 | logfile = sys.stdout |
342 | 362 | ||
363 | progress = d.getVarFlag(func, 'progress', True) | ||
364 | if progress: | ||
365 | if progress == 'percent': | ||
366 | # Use default regex | ||
367 | logfile = bb.progress.BasicProgressHandler(d, outfile=logfile) | ||
368 | elif progress.startswith('percent:'): | ||
369 | # Use specified regex | ||
370 | logfile = bb.progress.BasicProgressHandler(d, regex=progress.split(':', 1)[1], outfile=logfile) | ||
371 | elif progress.startswith('outof:'): | ||
372 | # Use specified regex | ||
373 | logfile = bb.progress.OutOfProgressHandler(d, regex=progress.split(':', 1)[1], outfile=logfile) | ||
374 | else: | ||
375 | bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress)) | ||
376 | |||
343 | def readfifo(data): | 377 | def readfifo(data): |
344 | lines = data.split(b'\0') | 378 | lines = data.split(b'\0') |
345 | for line in lines: | 379 | for line in lines: |