This is an automated email from the ASF dual-hosted git repository. juergbi pushed a commit to branch jbilleter/loader in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 7134c7ce5db865fced601c20df9f5b09ca74c3d1 Author: Jürg Billeter <[email protected]> AuthorDate: Sat Apr 25 10:52:20 2026 +0200 _loader: Don't trigger second pass loading for junction overrides Shallow override loading is needed only to discover link elements for correct link resolution. Defer loading of elements that require the project to be fully loaded, as second pass loading during shallow override loading can trigger a circular reference error. Fixes #2037. --- src/buildstream/_loader/loader.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py index c1777f39b..76b1b7649 100644 --- a/src/buildstream/_loader/loader.py +++ b/src/buildstream/_loader/loader.py @@ -261,11 +261,12 @@ class Loader: # Args: # filename (str): The element-path relative bst file # provenance_node (Node): The location from where the file was referred to, or None + # only_first_pass (bool): Only handle junctions and links, which don't require the project to be fully loaded # # Returns: # (LoadElement): A partially-loaded LoadElement # - def _load_file_no_deps(self, filename, provenance_node=None): + def _load_file_no_deps(self, filename, provenance_node=None, only_first_pass=False): self._assert_element_name(filename, provenance_node) @@ -305,6 +306,8 @@ class Loader: kind = node.get_str(Symbol.KIND) if kind in ("junction", "link"): self._first_pass_options.process_node(node) + elif only_first_pass: + return None else: self.project.ensure_fully_loaded() @@ -979,9 +982,9 @@ class Loader: element = target_loader._elements[element_name] except KeyError: # Shallow load the the element. - element = target_loader._load_file_no_deps(element_name, provenance_node) + element = target_loader._load_file_no_deps(element_name, provenance_node, only_first_pass=True) - if element.link_target: + if element and element.link_target: link_target = element.link_target.as_str() if junction: return "{}:{}".format(junction, link_target), element.link_target
