From 19f13958f73092d01452ce006dbc7c490628a5ed Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Thu, 2 Feb 2017 18:05:18 +1100 Subject: [PATCH] Handle blank lines in element-deps When merging feature/v2 we have re-enabled the centos-minimal test which has a blank line in the element-deps. The modified get_elements functions added in If97bcd21e45de1b5ed91023fdc441a4617051a6b were not handling this. Fixing this, we can extract this into some common code for element-deps and element-provides. Also, I noticed while debugging that the element list is an iterator from reverse(), so printing it doesn't help. Fix up the debug output. Change-Id: I8e9b079f586e8a36dba3797a0fc03ca1b2041a04 --- diskimage_builder/element_dependencies.py | 54 +++++++++++++---------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/diskimage_builder/element_dependencies.py b/diskimage_builder/element_dependencies.py index bc6aedbee..0e0109fbf 100644 --- a/diskimage_builder/element_dependencies.py +++ b/diskimage_builder/element_dependencies.py @@ -44,6 +44,30 @@ class InvalidElementDir(Exception): class Element(object): """An element""" + + def _get_element_set(self, path): + """Get element set from element-[deps|provides] file + + Arguments: + :param path: path to element description + + :return: the set of elements in the file, or a blank set if + the file is not found. + """ + try: + with open(path) as f: + lines = (line.strip() for line in f) + # Strip blanks, but do we want to strip comment lines + # too? No use case at the moment, and comments might + # break other things that poke at the element-* files. + lines = (line for line in lines if line) + return set(lines) + except IOError as e: + if e.errno == errno.ENOENT: + return set([]) + else: + raise + def __init__(self, name, path): """A new element @@ -53,29 +77,13 @@ class Element(object): """ self.name = name self.path = path - self.provides = set() - self.depends = set() # read the provides & depends files for this element into a # set; if the element has them. - provides = os.path.join(path, 'element-provides') - depends = os.path.join(path, 'element-deps') - try: - with open(provides) as p: - self.provides = set([line.strip() for line in p]) - except IOError as e: - if e.errno == errno.ENOENT: - pass - else: - raise - try: - with open(depends) as d: - self.depends = set([line.strip() for line in d]) - except IOError as e: - if e.errno == errno.ENOENT: - pass - else: - raise + self.provides = self._get_element_set( + os.path.join(path, 'element-provides')) + self.depends = self._get_element_set( + os.path.join(path, 'element-deps')) logger.debug("New element : %s", str(self)) @@ -170,11 +178,11 @@ def _find_all_elements(paths=None): # ELEMENTS_PATH=path1:path2:path3 # we want the elements in "path1" to override "path3" if not paths: - paths = reversed(_get_elements_dir().split(':')) + paths = list(reversed(_get_elements_dir().split(':'))) else: - paths = reversed(paths.split(':')) + paths = list(reversed(paths.split(':'))) - logger.debug("ELEMENTS_PATH is: %s" % paths) + logger.debug("ELEMENTS_PATH is: %s" % ":".join(paths)) for path in paths: if not os.path.isdir(path):