diff options
-rw-r--r-- | src/buildstream/_loader/loader.py | 7 | ||||
-rw-r--r-- | src/buildstream/plugins/elements/junction.py | 5 | ||||
-rw-r--r-- | tests/format/junctions.py | 32 | ||||
-rw-r--r-- | tests/format/junctions/replacements-base/a.bst | 4 | ||||
-rw-r--r-- | tests/format/junctions/replacements-base/compose.bst | 3 | ||||
-rw-r--r-- | tests/format/junctions/replacements-base/original.txt | 1 | ||||
-rw-r--r-- | tests/format/junctions/replacements-base/project.conf | 2 | ||||
-rw-r--r-- | tests/format/junctions/replacements/base.bst | 7 | ||||
-rw-r--r-- | tests/format/junctions/replacements/injected.bst | 6 | ||||
-rw-r--r-- | tests/format/junctions/replacements/injected.txt | 1 | ||||
-rw-r--r-- | tests/format/junctions/replacements/project.conf | 6 | ||||
-rw-r--r-- | tests/format/junctions/replacements/stack.bst | 3 |
12 files changed, 76 insertions, 1 deletions
diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py index 3032f9036..06e3fbfd5 100644 --- a/src/buildstream/_loader/loader.py +++ b/src/buildstream/_loader/loader.py @@ -311,6 +311,10 @@ class Loader: if filename in self._elements: return self._elements[filename] + if self.project.junction and filename in self.project.junction.replacements: + replacement = self.project.junction.replacements.get_str(filename) + return self._parent._load_file(replacement, rewritable, ticker, provenance) + # Call the ticker if ticker: ticker(filename) @@ -339,6 +343,9 @@ class Loader: dep.junction, rewritable=rewritable, ticker=ticker, provenance=dep.provenance ) dep_element = loader._load_file(dep.name, rewritable, ticker, dep.provenance) + elif self.project.junction and dep.name in self.project.junction.replacements: + replacement = self.project.junction.replacements.get_str(dep.name) + dep_element = self._parent._load_file(replacement, rewritable, ticker, dep.provenance) else: dep_element = self._elements.get(dep.name) diff --git a/src/buildstream/plugins/elements/junction.py b/src/buildstream/plugins/elements/junction.py index 86d1de8f8..f450d67f1 100644 --- a/src/buildstream/plugins/elements/junction.py +++ b/src/buildstream/plugins/elements/junction.py @@ -173,7 +173,9 @@ class JunctionElement(Element): def configure(self, node): - node.validate_keys(["path", "options", "target", "cache-junction-elements", "ignore-junction-remotes"]) + node.validate_keys( + ["path", "options", "target", "cache-junction-elements", "ignore-junction-remotes", "replacements"] + ) self.path = node.get_str("path", default="") self.options = node.get_mapping("options", default={}) @@ -182,6 +184,7 @@ class JunctionElement(Element): self.target_junction = None self.cache_junction_elements = node.get_bool("cache-junction-elements", default=False) self.ignore_junction_remotes = node.get_bool("ignore-junction-remotes", default=False) + self.replacements = node.get_mapping("replacements", default={}) def preflight(self): # "target" cannot be used in conjunction with: diff --git a/tests/format/junctions.py b/tests/format/junctions.py index 70572ee3e..500d3f628 100644 --- a/tests/format/junctions.py +++ b/tests/format/junctions.py @@ -471,3 +471,35 @@ def test_junction_show(cli, tmpdir, datafiles): # Show, assert that it says junction assert cli.get_element_state(project, "base.bst") == "junction" + + +@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=["artifact", "checkout", "stack.bst", "--directory", 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")) + + +@pytest.mark.datafiles(DATA_DIR) +def test_replacements_top_element(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", "base.bst:a.bst"]) + result.assert_success() + result = cli.run(project=project, args=["artifact", "checkout", "base.bst:a.bst", "--directory", 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/format/junctions/replacements-base/a.bst b/tests/format/junctions/replacements-base/a.bst new file mode 100644 index 000000000..61edc6467 --- /dev/null +++ b/tests/format/junctions/replacements-base/a.bst @@ -0,0 +1,4 @@ +kind: import +sources: +- kind: local + path: original.txt diff --git a/tests/format/junctions/replacements-base/compose.bst b/tests/format/junctions/replacements-base/compose.bst new file mode 100644 index 000000000..1b4024228 --- /dev/null +++ b/tests/format/junctions/replacements-base/compose.bst @@ -0,0 +1,3 @@ +kind: compose +build-depends: +- a.bst diff --git a/tests/format/junctions/replacements-base/original.txt b/tests/format/junctions/replacements-base/original.txt new file mode 100644 index 000000000..5762c898d --- /dev/null +++ b/tests/format/junctions/replacements-base/original.txt @@ -0,0 +1 @@ +Original diff --git a/tests/format/junctions/replacements-base/project.conf b/tests/format/junctions/replacements-base/project.conf new file mode 100644 index 000000000..9f5c000c9 --- /dev/null +++ b/tests/format/junctions/replacements-base/project.conf @@ -0,0 +1,2 @@ +name: replacements-base +min-version: 2.0 diff --git a/tests/format/junctions/replacements/base.bst b/tests/format/junctions/replacements/base.bst new file mode 100644 index 000000000..d128ae54d --- /dev/null +++ b/tests/format/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/format/junctions/replacements/injected.bst b/tests/format/junctions/replacements/injected.bst new file mode 100644 index 000000000..3f822c711 --- /dev/null +++ b/tests/format/junctions/replacements/injected.bst @@ -0,0 +1,6 @@ +kind: import +config: + target: "%{dest}" +sources: +- kind: local + path: injected.txt diff --git a/tests/format/junctions/replacements/injected.txt b/tests/format/junctions/replacements/injected.txt new file mode 100644 index 000000000..43a3eba08 --- /dev/null +++ b/tests/format/junctions/replacements/injected.txt @@ -0,0 +1 @@ +Injected diff --git a/tests/format/junctions/replacements/project.conf b/tests/format/junctions/replacements/project.conf new file mode 100644 index 000000000..625eae6f2 --- /dev/null +++ b/tests/format/junctions/replacements/project.conf @@ -0,0 +1,6 @@ +name: replacements +min-version: 2.0 + +variables: + # This variable is not defined in the junctioned project + dest: "/destination" diff --git a/tests/format/junctions/replacements/stack.bst b/tests/format/junctions/replacements/stack.bst new file mode 100644 index 000000000..0ab52e878 --- /dev/null +++ b/tests/format/junctions/replacements/stack.bst @@ -0,0 +1,3 @@ +kind: stack +runtime-depends: +- base.bst:compose.bst |