summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildstream/_loader/loader.py13
-rw-r--r--buildstream/plugins/elements/junction.py1
-rw-r--r--tests/loader/junctions.py16
-rw-r--r--tests/loader/junctions/replacements-base/a.bst4
-rw-r--r--tests/loader/junctions/replacements-base/compose.bst3
-rw-r--r--tests/loader/junctions/replacements-base/original.txt1
-rw-r--r--tests/loader/junctions/replacements-base/project.conf1
-rw-r--r--tests/loader/junctions/replacements/base.bst7
-rw-r--r--tests/loader/junctions/replacements/injected.bst6
-rw-r--r--tests/loader/junctions/replacements/injected.txt1
-rw-r--r--tests/loader/junctions/replacements/project.conf5
-rw-r--r--tests/loader/junctions/replacements/stack.bst3
12 files changed, 61 insertions, 0 deletions
diff --git a/buildstream/_loader/loader.py b/buildstream/_loader/loader.py
index ec929eadb..dc15109c8 100644
--- a/buildstream/_loader/loader.py
+++ b/buildstream/_loader/loader.py
@@ -217,6 +217,13 @@ class Loader():
if ticker:
ticker(filename)
+ if self.project.junction and filename in self.project.junction.replacements:
+ replacement = _yaml.node_get(self.project.junction.replacements, str, filename)
+ elt = self._parent._load_file(replacement,
+ rewritable, ticker, fetch_subprojects, provenance=provenance)
+ self._elements[filename] = elt
+ return elt
+
# Load the data and process any conditional statements therein
fullpath = os.path.join(self._basedir, filename)
try:
@@ -311,6 +318,8 @@ class Loader():
validated = {}
element = self._elements[element_name]
+ if getattr(element, '_loader', self) != self:
+ return element._loader._check_circular_deps(element.name, check_elements, validated)
# element name must be unique across projects
# to be usable as key for the check_elements and validated dicts
@@ -353,6 +362,8 @@ class Loader():
visited = {}
element = self._elements[element_name]
+ if getattr(element, '_loader', self) != self:
+ return element._loader._sort_dependencies(element.name, visited)
# element name must be unique across projects
# to be usable as key for the visited dict
@@ -424,6 +435,8 @@ class Loader():
def _collect_element(self, element_name):
element = self._elements[element_name]
+ if element._loader != self:
+ return element._loader._collect_element(element.name)
# Return the already built one, if we already built it
meta_element = self._meta_elements.get(element_name)
diff --git a/buildstream/plugins/elements/junction.py b/buildstream/plugins/elements/junction.py
index d2c62fe48..f87ac2273 100644
--- a/buildstream/plugins/elements/junction.py
+++ b/buildstream/plugins/elements/junction.py
@@ -142,6 +142,7 @@ class JunctionElement(Element):
def configure(self, node):
self.path = self.node_get_member(node, str, 'path', default='')
self.options = self.node_get_member(node, Mapping, 'options', default={})
+ self.replacements = self.node_get_member(node, Mapping, 'replacements', default={})
def preflight(self):
pass
diff --git a/tests/loader/junctions.py b/tests/loader/junctions.py
index aee164396..0daa7e9f6 100644
--- a/tests/loader/junctions.py
+++ b/tests/loader/junctions.py
@@ -330,3 +330,19 @@ def test_build_git_cross_junction_names(cli, tmpdir, datafiles):
# Check that the checkout contains the expected files from both projects
assert(os.path.exists(os.path.join(checkoutdir, 'base.txt')))
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_replacements(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), "replacements")
+ copy_subprojects(project, datafiles, ["replacements-base"])
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Build, checkout
+ result = cli.run(project=project, args=["build", "stack.bst"])
+ result.assert_success()
+ result = cli.run(project=project, args=["checkout", "stack.bst", checkoutdir])
+ result.assert_success()
+
+ assert os.path.exists(os.path.join(checkoutdir, "destination/injected.txt"))
+ assert not os.path.exists(os.path.join(checkoutdir, "original.txt"))
diff --git a/tests/loader/junctions/replacements-base/a.bst b/tests/loader/junctions/replacements-base/a.bst
new file mode 100644
index 000000000..61edc6467
--- /dev/null
+++ b/tests/loader/junctions/replacements-base/a.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: original.txt
diff --git a/tests/loader/junctions/replacements-base/compose.bst b/tests/loader/junctions/replacements-base/compose.bst
new file mode 100644
index 000000000..1b4024228
--- /dev/null
+++ b/tests/loader/junctions/replacements-base/compose.bst
@@ -0,0 +1,3 @@
+kind: compose
+build-depends:
+- a.bst
diff --git a/tests/loader/junctions/replacements-base/original.txt b/tests/loader/junctions/replacements-base/original.txt
new file mode 100644
index 000000000..5762c898d
--- /dev/null
+++ b/tests/loader/junctions/replacements-base/original.txt
@@ -0,0 +1 @@
+Original
diff --git a/tests/loader/junctions/replacements-base/project.conf b/tests/loader/junctions/replacements-base/project.conf
new file mode 100644
index 000000000..9e10ecac4
--- /dev/null
+++ b/tests/loader/junctions/replacements-base/project.conf
@@ -0,0 +1 @@
+name: replacements-base
diff --git a/tests/loader/junctions/replacements/base.bst b/tests/loader/junctions/replacements/base.bst
new file mode 100644
index 000000000..d128ae54d
--- /dev/null
+++ b/tests/loader/junctions/replacements/base.bst
@@ -0,0 +1,7 @@
+kind: junction
+config:
+ replacements:
+ a.bst: injected.bst
+sources:
+- kind: local
+ path: replacements-base
diff --git a/tests/loader/junctions/replacements/injected.bst b/tests/loader/junctions/replacements/injected.bst
new file mode 100644
index 000000000..3f822c711
--- /dev/null
+++ b/tests/loader/junctions/replacements/injected.bst
@@ -0,0 +1,6 @@
+kind: import
+config:
+ target: "%{dest}"
+sources:
+- kind: local
+ path: injected.txt
diff --git a/tests/loader/junctions/replacements/injected.txt b/tests/loader/junctions/replacements/injected.txt
new file mode 100644
index 000000000..43a3eba08
--- /dev/null
+++ b/tests/loader/junctions/replacements/injected.txt
@@ -0,0 +1 @@
+Injected
diff --git a/tests/loader/junctions/replacements/project.conf b/tests/loader/junctions/replacements/project.conf
new file mode 100644
index 000000000..b55220934
--- /dev/null
+++ b/tests/loader/junctions/replacements/project.conf
@@ -0,0 +1,5 @@
+name: replacements
+
+variables:
+ # This variable is not defined in the junctioned project
+ dest: "/destination"
diff --git a/tests/loader/junctions/replacements/stack.bst b/tests/loader/junctions/replacements/stack.bst
new file mode 100644
index 000000000..0ab52e878
--- /dev/null
+++ b/tests/loader/junctions/replacements/stack.bst
@@ -0,0 +1,3 @@
+kind: stack
+runtime-depends:
+- base.bst:compose.bst