This is an automated email from the ASF dual-hosted git repository.

juergbi pushed a commit to branch juerg/junction-aliases
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 1cb4c9fb99e5491d68d6ae3e2c57b30d82109931
Author: Jürg Billeter <[email protected]>
AuthorDate: Fri Mar 22 15:17:06 2024 +0100

    Support mapping subproject aliases to aliases of the parent project
---
 src/buildstream/_project.py                  | 38 +++++++++++++++++++++++++++-
 src/buildstream/plugins/elements/junction.py |  8 +++++-
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/src/buildstream/_project.py b/src/buildstream/_project.py
index 1a1054898..6ae488731 100644
--- a/src/buildstream/_project.py
+++ b/src/buildstream/_project.py
@@ -102,6 +102,7 @@ class Project:
         self.ref_storage: Optional[ProjectRefStorage] = None  # Where to store 
source refs
         self.refs: Optional[ProjectRefs] = None
         self.junction_refs: Optional[ProjectRefs] = None
+        self.allow_subproject_uris: bool = True
 
         self.config: ProjectConfig = ProjectConfig()
         self.first_pass_config: ProjectConfig = ProjectConfig()
@@ -220,6 +221,17 @@ class Project:
             url_alias, url_body = url.split(utils._ALIAS_SEPARATOR, 1)
             alias_url = config._aliases.get_str(url_alias, default=None)
             if alias_url:
+                if self.junction:
+                    parent_project = self.junction._get_project()
+                    parent_alias = self.junction.aliases.get_str(url_alias, 
default=None)
+                    if parent_alias:
+                        # Delegate translation to parent project
+                        return parent_project.translate_url(
+                            parent_alias + utils._ALIAS_SEPARATOR + url_body, 
first_pass=first_pass
+                        )
+                    elif not parent_project.allow_subproject_uris:
+                        return url
+
                 url = alias_url + url_body
 
         return url
@@ -377,6 +389,14 @@ class Project:
         else:
             config = self.config
 
+        if self.junction:
+            parent_project = self.junction._get_project()
+            parent_alias = self.junction.aliases.get_str(alias, default=None)
+            if parent_alias:
+                return parent_project.alias_exists(parent_alias, 
first_pass=first_pass)
+            elif not parent_project.allow_subproject_uris:
+                return False
+
         return config._aliases.get_str(alias, default=None) is not None
 
     # get_alias_uris()
@@ -396,6 +416,15 @@ class Project:
         if not alias or alias not in config._aliases:  # pylint: 
disable=unsupported-membership-test
             return [None]
 
+        if self.junction:
+            parent_project = self.junction._get_project()
+            parent_alias = self.junction.aliases.get_str(alias, default=None)
+            if parent_alias:
+                # Delegate translation to parent project
+                return parent_project.get_alias_uris(parent_alias, 
first_pass=first_pass, tracking=tracking)
+            elif not parent_project.allow_subproject_uris:
+                return [None]
+
         uri_list = []
         policy = self._context.track_source if tracking else 
self._context.fetch_source
 
@@ -786,7 +815,14 @@ class Project:
 
         # Junction configuration
         junctions_node = pre_config_node.get_mapping("junctions", default={})
-        junctions_node.validate_keys(["duplicates", "internal"])
+        junctions_node.validate_keys(["duplicates", "internal", 
"allow-subproject-uris"])
+
+        if self.junction and not 
self.junction._get_project().allow_subproject_uris:
+            # If the parent project doesn't allow subproject URIs, this must
+            # be enforced for nested subprojects as well.
+            self.allow_subproject_uris = False
+        else:
+            self.allow_subproject_uris = 
junctions_node.get_bool("allow-subproject-uris", default=True)
 
         # Parse duplicates
         junction_duplicates = junctions_node.get_mapping("duplicates", 
default={})
diff --git a/src/buildstream/plugins/elements/junction.py 
b/src/buildstream/plugins/elements/junction.py
index d35ed6317..7ce3a07f6 100644
--- a/src/buildstream/plugins/elements/junction.py
+++ b/src/buildstream/plugins/elements/junction.py
@@ -50,6 +50,9 @@ Overview
      overrides:
        subproject-junction.bst: local-junction.bst
 
+     aliases:
+       subproject-alias: local-alias
+
 With a junction element in place, local elements can depend on elements in
 the other BuildStream project using :ref:`element paths 
<format_element_names>`.
 For example, if you have a ``toolchain.bst`` junction element referring to
@@ -338,7 +341,7 @@ class JunctionElement(Element):
 
     def configure(self, node):
 
-        node.validate_keys(["path", "options", "overrides"])
+        node.validate_keys(["path", "options", "overrides", "aliases"])
 
         self.path = node.get_str("path", default="")
         self.options = node.get_mapping("options", default={})
@@ -361,6 +364,9 @@ class JunctionElement(Element):
                 )
             self.overrides[key] = junction_name
 
+        # Map from subproject alias to local alias
+        self.aliases = node.get_mapping("aliases", default={})
+
     def preflight(self):
         pass
 

Reply via email to