diff options
author | Jürg Billeter <j@bitron.ch> | 2018-02-07 19:00:54 +0100 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2018-02-08 14:04:03 +0100 |
commit | a83c94b74e0f65aa3cee328bc37be57b9ae7a5c3 (patch) | |
tree | 4a9791ecb191e932b625f05ffe23ad54abd34d8e /buildstream | |
parent | c178e80d7e51cd7a2e55c810fe23c8f7effbcf1f (diff) | |
download | buildstream-a83c94b74e0f65aa3cee328bc37be57b9ae7a5c3.tar.gz |
element.py: Split errors and warnings for overlaps
This ensures that overlap warnings from projects without
fail-on-overlaps are not reported in fatal error messages.
Diffstat (limited to 'buildstream')
-rw-r--r-- | buildstream/element.py | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/buildstream/element.py b/buildstream/element.py index 3431af39d..5a2d491d7 100644 --- a/buildstream/element.py +++ b/buildstream/element.py @@ -474,34 +474,32 @@ class Element(Plugin): ignored[dep.name] = result.ignored if overlaps: - detail = "Staged files overwrite existing files in staging area:\n" - forbidden_overlap = False - overlap_error = False + overlap_error = overlap_warning = False + error_detail = warning_detail = "Staged files overwrite existing files in staging area:\n" for f, elements in overlaps.items(): - forbidden_overlap_elements = [] + overlap_error_elements = [] + overlap_warning_elements = [] # The bottom item overlaps nothing overlapping_elements = elements[1:] for elm in overlapping_elements: element = self.search(scope, elm) element_project = element._get_project() if not element.__file_is_whitelisted(f): - forbidden_overlap = True - forbidden_overlap_elements.append(elm) if element_project._fail_on_overlap: + overlap_error_elements.append(elm) overlap_error = True + else: + overlap_warning_elements.append(elm) + overlap_warning = True - if forbidden_overlap_elements: - detail += ("/{}: {} {} not permitted to overlap other elements, order {} \n" - .format(f, " and ".join(forbidden_overlap_elements), - "is" if len(forbidden_overlap_elements) == 1 else "are", - " above ".join(reversed(elements)))) + warning_detail += _overlap_error_detail(f, overlap_warning_elements, elements) + error_detail += _overlap_error_detail(f, overlap_error_elements, elements) - if forbidden_overlap: - if overlap_error: - raise ElementError("Non-whitelisted overlaps detected and fail-on-overlaps is set", - detail=detail, reason="overlap-error") - else: - self.warn("Non-whitelisted overlaps detected", detail=detail) + if overlap_warning: + self.warn("Non-whitelisted overlaps detected", detail=warning_detail) + if overlap_error: + raise ElementError("Non-whitelisted overlaps detected and fail-on-overlaps is set", + detail=error_detail, reason="overlap-error") if ignored: detail = "Not staging files which would replace non-empty directories:\n" @@ -1818,3 +1816,13 @@ class Element(Plugin): # Load the public data from the artifact metadir = os.path.join(self.__artifacts.extract(self), 'meta') self.__dynamic_public = _yaml.load(os.path.join(metadir, 'public.yaml')) + + +def _overlap_error_detail(f, forbidden_overlap_elements, elements): + if forbidden_overlap_elements: + return ("/{}: {} {} not permitted to overlap other elements, order {} \n" + .format(f, " and ".join(forbidden_overlap_elements), + "is" if len(forbidden_overlap_elements) == 1 else "are", + " above ".join(reversed(elements)))) + else: + return "" |