From bdd7813d8eecf7b6b636322e748ca6bf69118513 Mon Sep 17 00:00:00 2001 From: Bob Foerster Date: Mon, 22 Nov 2010 10:13:56 -0500 Subject: Show the user progress when loading the cache Signed-off-by: Bob Foerster Signed-off-by: Chris Larson --- lib/bb/cache.py | 18 ++++++++++++++++++ lib/bb/cooker.py | 1 + lib/bb/event.py | 19 +++++++++++++++++++ lib/bb/ui/knotty.py | 32 ++++++++++++++++++++++++-------- 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/lib/bb/cache.py b/lib/bb/cache.py index 981d8bd91..d72622d74 100644 --- a/lib/bb/cache.py +++ b/lib/bb/cache.py @@ -189,14 +189,31 @@ class Cache(object): logger.info('Bitbake version mismatch, rebuilding...') return + cachesize = os.fstat(cachefile.fileno()).st_size + bb.event.fire(bb.event.CacheLoadStarted(cachesize), self.data) + + previous_percent = 0 while cachefile: try: key = pickled.load() value = pickled.load() except Exception: break + self.depends_cache[key] = value + # only fire events on even percentage boundaries + current_progress = cachefile.tell() + current_percent = 100 * current_progress / cachesize + if current_percent > previous_percent: + previous_percent = current_percent + bb.event.fire(bb.event.CacheLoadProgress(current_progress), + self.data) + + bb.event.fire(bb.event.CacheLoadCompleted(cachesize, + len(self.depends_cache)), + self.data) + @staticmethod def virtualfn2realfn(virtualfn): """ @@ -576,3 +593,4 @@ class CacheData(object): # calculations if not info.broken and not info.not_world: self.possible_world.append(fn) + diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py index 13f895e25..62c8d2803 100644 --- a/lib/bb/cooker.py +++ b/lib/bb/cooker.py @@ -985,6 +985,7 @@ class CookerParser(object): self.shutdown(clean=False) bb.fatal('Error parsing %s: %s' % (exc.recipe, exc)) + self.current += 1 self.virtuals += len(result) if parsed: diff --git a/lib/bb/event.py b/lib/bb/event.py index 044c5572f..3f291ec27 100644 --- a/lib/bb/event.py +++ b/lib/bb/event.py @@ -324,6 +324,25 @@ class ParseProgress(Event): def __init__(self, current): self.current = current +class CacheLoadStarted(Event): + """Loading of the dependency cache has begun""" + def __init__(self, total): + Event.__init__(self) + self.total = total + +class CacheLoadProgress(Event): + """Cache loading progress""" + def __init__(self, current): + Event.__init__(self) + self.current = current + +class CacheLoadCompleted(Event): + """Cache loading is complete""" + def __init__(self, total): + Event.__init__(self) + self.total = total + + class DepTreeGenerated(Event): """ Event when a dependency tree has been generated diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py index e5351fee7..f3abe8c99 100644 --- a/lib/bb/ui/knotty.py +++ b/lib/bb/ui/knotty.py @@ -29,12 +29,14 @@ import bb.msg from bb.ui import uihelper logger = logging.getLogger("BitBake") -widgets = [progressbar.Percentage(), ' ', progressbar.Bar(), ' ', - progressbar.ETA()] +interactive = sys.stdout.isatty() class BBProgress(progressbar.ProgressBar): def __init__(self, msg, maxval): self.msg = msg + widgets = [progressbar.Percentage(), ' ', progressbar.Bar(), ' ', + progressbar.ETA()] + progressbar.ProgressBar.__init__(self, maxval, [self.msg + ": "] + widgets) class NonInteractiveProgress(object): @@ -56,6 +58,12 @@ class NonInteractiveProgress(object): self.fobj.write("done.\n") self.fobj.flush() +def new_progress(msg, maxval): + if interactive: + return BBProgress(msg, maxval) + else: + return NonInteractiveProgress(msg, maxval) + def main(server, eventHandler): # Get values of variables which control our output @@ -91,8 +99,9 @@ def main(server, eventHandler): print("XMLRPC Fault getting commandline:\n %s" % x) return 1 + parseprogress = None - interactive = os.isatty(sys.stdout.fileno()) + cacheprogress = None shutdown = 0 return_value = 0 while True: @@ -144,11 +153,7 @@ def main(server, eventHandler): logger.info(event._message) continue if isinstance(event, bb.event.ParseStarted): - if interactive: - progress = BBProgress - else: - progress = NonInteractiveProgress - parseprogress = progress("Parsing recipes", event.total).start() + parseprogress = new_progress("Parsing recipes", event.total).start() continue if isinstance(event, bb.event.ParseProgress): parseprogress.update(event.current) @@ -159,6 +164,17 @@ def main(server, eventHandler): % ( event.total, event.cached, event.parsed, event.virtuals, event.skipped, event.masked, event.errors))) continue + if isinstance(event, bb.event.CacheLoadStarted): + cacheprogress = new_progress("Loading cache", event.total).start() + continue + if isinstance(event, bb.event.CacheLoadProgress): + cacheprogress.update(event.current) + continue + if isinstance(event, bb.event.CacheLoadCompleted): + cacheprogress.finish() + print("Loaded %d entries from dependency cache." % event.num_entries) + continue + if isinstance(event, bb.command.CommandCompleted): break if isinstance(event, bb.command.CommandFailed): -- cgit 1.2.3-korg