summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin David <valentin.david@codethink.co.uk>2018-11-08 12:06:13 +0100
committerValentin David <valentin.david@codethink.co.uk>2018-11-08 13:41:36 +0100
commitcc2e6ae53cfaa1b476a17ee071bbf0ea2255079b (patch)
tree92108ddd93ebda1338b745b6003c3e3858d1fab8
parentf116b9b7e4c804c04816ca3078e5849d1f0bd856 (diff)
downloadbuildstream-cc2e6ae53cfaa1b476a17ee071bbf0ea2255079b.tar.gz
Fix bug with root mounted as non-artifact in script plugin.
The issue was introduced by 6ccfab0b1b25990e406446d5cbe5aee83a5e158a.
-rw-r--r--buildstream/scriptelement.py7
-rw-r--r--tests/integration/project/elements/script/corruption-2.bst11
-rw-r--r--tests/integration/project/elements/script/marked-tmpdir.bst12
-rw-r--r--tests/integration/project/elements/script/no-tmpdir.bst12
-rw-r--r--tests/integration/project/elements/script/tmpdir.bst10
-rw-r--r--tests/integration/script.py38
6 files changed, 88 insertions, 2 deletions
diff --git a/buildstream/scriptelement.py b/buildstream/scriptelement.py
index e9ad60c37..d2165ce32 100644
--- a/buildstream/scriptelement.py
+++ b/buildstream/scriptelement.py
@@ -202,7 +202,7 @@ class ScriptElement(Element):
sandbox.set_environment(self.get_environment())
# Tell the sandbox to mount the install root
- directories = {'/': False}
+ directories = {self.__install_root: False}
# Mark the artifact directories in the layout
for item in self.__layout:
@@ -211,7 +211,10 @@ class ScriptElement(Element):
directories[destination] = item['element'] or was_artifact
for directory, artifact in directories.items():
- sandbox.mark_directory(directory, artifact=artifact)
+ # Root does not need to be marked as it is always mounted
+ # with artifact (unless explicitly marked non-artifact)
+ if directory != '/':
+ sandbox.mark_directory(directory, artifact=artifact)
def stage(self, sandbox):
diff --git a/tests/integration/project/elements/script/corruption-2.bst b/tests/integration/project/elements/script/corruption-2.bst
new file mode 100644
index 000000000..39c4f2c23
--- /dev/null
+++ b/tests/integration/project/elements/script/corruption-2.bst
@@ -0,0 +1,11 @@
+kind: script
+
+depends:
+- filename: base.bst
+ type: build
+- filename: script/corruption-image.bst
+ type: build
+
+config:
+ commands:
+ - echo smashed >>/canary
diff --git a/tests/integration/project/elements/script/marked-tmpdir.bst b/tests/integration/project/elements/script/marked-tmpdir.bst
new file mode 100644
index 000000000..506cdd5f4
--- /dev/null
+++ b/tests/integration/project/elements/script/marked-tmpdir.bst
@@ -0,0 +1,12 @@
+kind: compose
+
+depends:
+- filename: base.bst
+ type: build
+
+public:
+ bst:
+ split-rules:
+ remove:
+ - "/tmp/**"
+ - "/tmp"
diff --git a/tests/integration/project/elements/script/no-tmpdir.bst b/tests/integration/project/elements/script/no-tmpdir.bst
new file mode 100644
index 000000000..5c24e3cff
--- /dev/null
+++ b/tests/integration/project/elements/script/no-tmpdir.bst
@@ -0,0 +1,12 @@
+kind: filter
+
+depends:
+- filename: script/marked-tmpdir.bst
+ type: build
+
+config:
+ exclude:
+ - remove
+ include-orphans: True
+
+
diff --git a/tests/integration/project/elements/script/tmpdir.bst b/tests/integration/project/elements/script/tmpdir.bst
new file mode 100644
index 000000000..685a694ea
--- /dev/null
+++ b/tests/integration/project/elements/script/tmpdir.bst
@@ -0,0 +1,10 @@
+kind: script
+
+depends:
+- filename: script/no-tmpdir.bst
+ type: build
+
+config:
+ commands:
+ - |
+ mkdir -p /tmp/blah
diff --git a/tests/integration/script.py b/tests/integration/script.py
index 67bdd9642..fb0c4c6b6 100644
--- a/tests/integration/script.py
+++ b/tests/integration/script.py
@@ -184,3 +184,41 @@ def test_regression_cache_corruption(cli, tmpdir, datafiles):
with open(os.path.join(checkout_after, 'canary')) as f:
assert f.read() == 'alive\n'
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_regression_tmpdir(cli, tmpdir, datafiles):
+ project = str(datafiles)
+ element_name = 'script/tmpdir.bst'
+
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code == 0
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_regression_cache_corruption_2(cli, tmpdir, datafiles):
+ project = str(datafiles)
+ checkout_original = os.path.join(cli.directory, 'checkout-original')
+ checkout_after = os.path.join(cli.directory, 'checkout-after')
+ element_name = 'script/corruption-2.bst'
+ canary_element_name = 'script/corruption-image.bst'
+
+ res = cli.run(project=project, args=['build', canary_element_name])
+ assert res.exit_code == 0
+
+ res = cli.run(project=project, args=['checkout', canary_element_name,
+ checkout_original])
+ assert res.exit_code == 0
+
+ with open(os.path.join(checkout_original, 'canary')) as f:
+ assert f.read() == 'alive\n'
+
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code == 0
+
+ res = cli.run(project=project, args=['checkout', canary_element_name,
+ checkout_after])
+ assert res.exit_code == 0
+
+ with open(os.path.join(checkout_after, 'canary')) as f:
+ assert f.read() == 'alive\n'