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

akitouni pushed a commit to branch abderrahim/toplevel-mirror
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 94bd730da75858f49d45e28d59af8102c2a47342
Author: Abderrahim Kitouni <[email protected]>
AuthorDate: Thu Mar 7 15:54:07 2024 +0100

    Allow toplevel project to override mirrors for subprojects
    
    Previously, only the user configuration could override mirrors
---
 src/buildstream/_project.py | 24 +++++++++++++++++++-----
 src/buildstream/types.py    |  4 ++++
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/buildstream/_project.py b/src/buildstream/_project.py
index 1a1054898..f7149f8c5 100644
--- a/src/buildstream/_project.py
+++ b/src/buildstream/_project.py
@@ -400,8 +400,8 @@ class Project:
         policy = self._context.track_source if tracking else 
self._context.fetch_source
 
         if policy in (_SourceUriPolicy.ALL, _SourceUriPolicy.MIRRORS) or (
-            policy == _SourceUriPolicy.USER and self._mirror_override
-        ):
+            policy == _SourceUriPolicy.USER and self._user_mirror_override
+        ) or (policy == _SourceUriPolicy.TOPLEVEL and 
self._toplevel_mirror_override):
             for mirror_name, mirror in config.mirrors.items():
                 if alias in mirror.aliases:
                     if mirror_name == config.default_mirror:
@@ -641,6 +641,7 @@ class Project:
                 "sources",
                 "source-caches",
                 "junctions",
+                "projects",
                 "(@)",
                 "(?)",
             ]
@@ -1011,15 +1012,28 @@ class Project:
         # Override default_mirror if not set by command-line
         output.default_mirror = self._default_mirror or 
overrides.get_str("default-mirror", default=None)
 
+        if self == toplevel_project:
+            self.project_overrides = config.get_mapping("projects", default={})
+        
         # First try mirrors specified in user configuration, user configuration
         # is allowed to completely disable mirrors by specifying an empty list,
         # so we check for a None value here too.
         #
         mirrors_node = overrides.get_sequence("mirrors", default=None)
-        if mirrors_node is None:
-            mirrors_node = config.get_sequence("mirrors", default=[])
+
+        toplevel_override_node = 
toplevel_project.project_overrides.get_mapping(self.name, default={})
+
+        user_mirror_overrides = overrides.get_sequence("mirrors", default=None)
+        toplevel_mirror_overrides = 
toplevel_override_node.get_sequence("mirrors", default=None)
+
+        if user_mirror_overrides is not None:
+            mirrors_node = user_mirror_overrides
+            self._user_mirror_override = True
+        elif toplevel_mirror_overrides is not None:
+            mirrors_node = toplevel_mirror_overrides
+            self._toplevel_mirror_override = True
         else:
-            self._mirror_override = True
+            mirrors_node = config.get_sequence("mirrors", default=[])
 
         # Perform variable substitutions in source mirror definitions,
         # even if the mirrors are specified in user configuration.
diff --git a/src/buildstream/types.py b/src/buildstream/types.py
index 778941768..eef5885ee 100644
--- a/src/buildstream/types.py
+++ b/src/buildstream/types.py
@@ -274,6 +274,10 @@ class _SourceUriPolicy(FastEnum):
     # configuration has not provided a mirror
     USER = "user"
 
+    # Use only URIs defined in the toplevel project (the project on  which
+    # BuildStream was invoked with as opposed to a junctioned subproject.
+    TOPLEVEL = "toplevel"
+
 
 # _PipelineSelection()
 #

Reply via email to