From eb7480fc4d7ee1894465277425e13c8d1697a5e5 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Wed, 14 Jan 2015 12:18:27 +0000 Subject: bitbake: cooker: Fix pyinotify handling of ENOENT issues We try and add watches for files that don't exist but if they did, would influence the parser. The parent directory of these files may not exist, in which case we need to watch any parent that does exist for changes. This change implements that fallback handling. (Bitbake rev: 979ddbe4b7340d7cf2f432f6b1eba1c58d55ff42) Signed-off-by: Richard Purdie --- bitbake/lib/bb/cooker.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'bitbake/lib/bb') diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index f14eb64c83..d065b4dc4e 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -176,9 +176,23 @@ class BBCooker: bb.parse.update_cache(event.path) self.parsecache_valid = False - def add_filewatch(self, deps): + def add_filewatch(self, deps, watcher=None): + if not watcher: + watcher = self.watcher for i in deps: - self.watcher.add_watch(i[0], self.watchmask, rec=True) + f = i[0] + while True: + # We try and add watches for files that don't exist but if they did, would influence + # the parser. The parent directory of these files may not exist, in which case we need + # to watch any parent that does exist for changes. + try: + watcher.add_watch(f, self.watchmask, quiet=False) + break + except pyinotify.WatchManagerError as e: + if 'ENOENT' in str(e): + f = os.path.dirname(f) + continue + raise def sigterm_exception(self, signum, stackframe): if signum == signal.SIGTERM: @@ -1411,8 +1425,7 @@ class BBCooker: (filelist, masked) = self.collection.collect_bbfiles(self.data, self.event_data) self.data.renameVar("__depends", "__base_depends") - for i in self.data.getVar("__base_depends"): - self.wdd = self.configwatcher.add_watch(i[0], self.watchmask, rec=True) + self.add_filewatch(self.data.getVar("__base_depends"), self.configwatcher) self.parser = CookerParser(self, filelist, masked) self.parsecache_valid = True -- cgit v1.2.3-54-g00ecf