in src/buildstream/_overlapcollector.py [0:0]
def warnings(self, sessions: List["OverlapCollectorSession"]):
# Collect a table of filenames which overlapped something from outside of this session.
#
external_overlaps = {} # type: Dict[str, int]
#
# First issue the warnings for this session
#
if self._overlaps:
overlap_warning = False
detail = "Staged files overwrite existing files in staging area: {}\n".format(self._location)
for filename, element_ids in self._overlaps.items():
# If there is only one element in the overlap list, it means it has
# overlapped a file from a previous session.
#
# Ignore it and handle the warning below
#
if len(element_ids) == 1:
external_overlaps[filename] = element_ids[0]
continue
# Filter whitelisted elements out of the list of overlapping elements
#
# Ignore the bottom-most element as it does not overlap anything.
#
overlapping_element_ids = element_ids[1:]
warning_elements = self._filter_whitelisted(filename, overlapping_element_ids)
if warning_elements:
overlap_warning = True
detail += self._overlap_detail(filename, warning_elements, element_ids)
if overlap_warning:
self._element.warn(
"Non-whitelisted overlaps detected", detail=detail, warning_token=CoreWarnings.OVERLAPS
)
if self._ignored:
detail = "Not staging files which would replace non-empty directories in staging area: {}\n".format(
self._location
)
for element_id, ignored_filenames in self._ignored.items():
element = Plugin._lookup(element_id)
detail += "\nFrom {}:\n".format(element._get_full_name())
detail += " " + " ".join(
["{}\n".format(os.path.join(self._location, filename)) for filename in ignored_filenames]
)
self._element.warn(
"Not staging files which would have replaced non-empty directories",
detail=detail,
warning_token=CoreWarnings.UNSTAGED_FILES,
)
if external_overlaps and self._action != OverlapAction.IGNORE:
detail = "Detected file overlaps while staging elements into: {}\n".format(self._location)
# Find the session responsible for the overlap
#
for filename, element_id in external_overlaps.items():
absolute_filename = os.path.join(self._location, filename)
overlapped_id, location = self._search_stage_element(absolute_filename, sessions)
element = Plugin._lookup(element_id)
overlapped = Plugin._lookup(overlapped_id)
detail += "{}: {} overlaps files previously staged by {} in: {}\n".format(
absolute_filename, element._get_full_name(), overlapped._get_full_name(), location
)
if self._action == OverlapAction.WARNING:
self._element.warn("Overlaps detected", detail=detail, warning_token=CoreWarnings.OVERLAPS)
else:
from .element import ElementError
raise ElementError("Overlaps detected", detail=detail, reason="overlaps")