Phillip Smyth pushed to branch mandatory_suffix at BuildStream / buildstream
Commits:
8 changed files:
- NEWS
- tests/completions/completions.py
- tests/frontend/buildcheckout.py
- + tests/frontend/project/elements/target.foo
- + tests/frontend/project/elements/target2.bst
- tests/frontend/project/project.conf
- tests/integration/source-determinism.py
- tests/loader/__init__.py
Changes:
| ... | ... | @@ -2,6 +2,10 @@ |
| 2 | 2 |
buildstream 1.3.1
|
| 3 | 3 |
=================
|
| 4 | 4 |
|
| 5 |
+ o All elements must now be suffixed with `.bst`
|
|
| 6 |
+ Attempting to use an element that does not have the `.bst` extension,
|
|
| 7 |
+ will result in a warning.
|
|
| 8 |
+ |
|
| 5 | 9 |
o BREAKING CHANGE: The 'manual' element lost its default 'MAKEFLAGS' and 'V'
|
| 6 | 10 |
environment variables. There is already a 'make' element with the same
|
| 7 | 11 |
variables. Note that this is a breaking change, it will require users to
|
| ... | ... | @@ -66,6 +66,13 @@ PROJECT_ELEMENTS = [ |
| 66 | 66 |
"target.bst"
|
| 67 | 67 |
]
|
| 68 | 68 |
|
| 69 |
+INVALID_ELEMENTS = [
|
|
| 70 |
+ "target.foo"
|
|
| 71 |
+ "target.bst.bar"
|
|
| 72 |
+]
|
|
| 73 |
+ |
|
| 74 |
+MIXED_ELEMENTS = PROJECT_ELEMENTS + INVALID_ELEMENTS
|
|
| 75 |
+ |
|
| 69 | 76 |
|
| 70 | 77 |
def assert_completion(cli, cmd, word_idx, expected, cwd=None):
|
| 71 | 78 |
result = cli.run(cwd=cwd, env={
|
| ... | ... | @@ -85,6 +92,24 @@ def assert_completion(cli, cmd, word_idx, expected, cwd=None): |
| 85 | 92 |
assert words == expected
|
| 86 | 93 |
|
| 87 | 94 |
|
| 95 |
+def assert_completion_failed(cli, cmd, word_idx, expected, cwd=None):
|
|
| 96 |
+ result = cli.run(cwd=cwd, env={
|
|
| 97 |
+ '_BST_COMPLETION': 'complete',
|
|
| 98 |
+ 'COMP_WORDS': cmd,
|
|
| 99 |
+ 'COMP_CWORD': str(word_idx)
|
|
| 100 |
+ })
|
|
| 101 |
+ words = []
|
|
| 102 |
+ if result.output:
|
|
| 103 |
+ words = result.output.splitlines()
|
|
| 104 |
+ |
|
| 105 |
+ # The order is meaningless, bash will
|
|
| 106 |
+ # take the results and order it by its
|
|
| 107 |
+ # own little heuristics
|
|
| 108 |
+ words = sorted(words)
|
|
| 109 |
+ expected = sorted(expected)
|
|
| 110 |
+ assert words != expected
|
|
| 111 |
+ |
|
| 112 |
+ |
|
| 88 | 113 |
@pytest.mark.parametrize("cmd,word_idx,expected", [
|
| 89 | 114 |
('bst', 0, []),
|
| 90 | 115 |
('bst ', 1, MAIN_COMMANDS),
|
| ... | ... | @@ -193,19 +218,19 @@ def test_option_directory(datafiles, cli, cmd, word_idx, expected, subdir): |
| 193 | 218 |
|
| 194 | 219 |
# When running in the project directory
|
| 195 | 220 |
('no-element-path', 'bst show ', 2,
|
| 196 |
- [e + ' ' for e in (PROJECT_ELEMENTS + ['project.conf'])] + ['files/'], None),
|
|
| 221 |
+ [e + ' ' for e in PROJECT_ELEMENTS] + ['files/'], None),
|
|
| 197 | 222 |
('no-element-path', 'bst build com', 2,
|
| 198 | 223 |
['compose-all.bst ', 'compose-include-bin.bst ', 'compose-exclude-dev.bst '], None),
|
| 199 | 224 |
|
| 200 | 225 |
# When running from the files subdir
|
| 201 | 226 |
('no-element-path', 'bst show ', 2,
|
| 202 |
- [e + ' ' for e in (PROJECT_ELEMENTS + ['project.conf'])] + ['files/'], 'files'),
|
|
| 227 |
+ [e + ' ' for e in PROJECT_ELEMENTS] + ['files/'], 'files'),
|
|
| 203 | 228 |
('no-element-path', 'bst build com', 2,
|
| 204 | 229 |
['compose-all.bst ', 'compose-include-bin.bst ', 'compose-exclude-dev.bst '], 'files'),
|
| 205 | 230 |
|
| 206 | 231 |
# When passing the project directory
|
| 207 | 232 |
('no-element-path', 'bst --directory ../ show ', 4,
|
| 208 |
- [e + ' ' for e in (PROJECT_ELEMENTS + ['project.conf'])] + ['files/'], 'files'),
|
|
| 233 |
+ [e + ' ' for e in PROJECT_ELEMENTS] + ['files/'], 'files'),
|
|
| 209 | 234 |
('no-element-path', 'bst --directory ../ show f', 4, ['files/'], 'files'),
|
| 210 | 235 |
('no-element-path', 'bst --directory ../ show files/', 4, ['files/bin-files/', 'files/dev-files/'], 'files'),
|
| 211 | 236 |
('no-element-path', 'bst --directory ../ build com', 4,
|
| ... | ... | @@ -226,6 +251,19 @@ def test_argument_element(datafiles, cli, project, cmd, word_idx, expected, subd |
| 226 | 251 |
assert_completion(cli, cmd, word_idx, expected, cwd=cwd)
|
| 227 | 252 |
|
| 228 | 253 |
|
| 254 |
+@pytest.mark.datafiles(DATA_DIR)
|
|
| 255 |
+@pytest.mark.parametrize("project,cmd,word_idx,expected,subdir", [
|
|
| 256 |
+ |
|
| 257 |
+ # When element has invalid suffix
|
|
| 258 |
+ ('project', 'bst --directory ../ show ', 4, [e + ' ' for e in MIXED_ELEMENTS], 'files')
|
|
| 259 |
+])
|
|
| 260 |
+def test_argument_element_invalid(datafiles, cli, project, cmd, word_idx, expected, subdir):
|
|
| 261 |
+ cwd = os.path.join(str(datafiles), project)
|
|
| 262 |
+ if subdir:
|
|
| 263 |
+ cwd = os.path.join(cwd, subdir)
|
|
| 264 |
+ assert_completion_failed(cli, cmd, word_idx, expected, cwd=cwd)
|
|
| 265 |
+ |
|
| 266 |
+ |
|
| 229 | 267 |
@pytest.mark.parametrize("cmd,word_idx,expected", [
|
| 230 | 268 |
('bst he', 1, ['help ']),
|
| 231 | 269 |
('bst help ', 2, MAIN_COMMANDS),
|
| ... | ... | @@ -60,6 +60,31 @@ def test_build_checkout(datafiles, cli, strict, hardlinks): |
| 60 | 60 |
assert os.path.exists(filename)
|
| 61 | 61 |
|
| 62 | 62 |
|
| 63 |
+@pytest.mark.datafiles(DATA_DIR)
|
|
| 64 |
+@pytest.mark.parametrize("strict,hardlinks", [
|
|
| 65 |
+ ("non-strict", "hardlinks"),
|
|
| 66 |
+])
|
|
| 67 |
+def test_build_invalid_suffix(datafiles, cli, strict, hardlinks):
|
|
| 68 |
+ project = os.path.join(datafiles.dirname, datafiles.basename)
|
|
| 69 |
+ checkout = os.path.join(cli.directory, 'checkout')
|
|
| 70 |
+ |
|
| 71 |
+ result = cli.run(project=project, args=strict_args(['build', 'target.foo'], strict))
|
|
| 72 |
+ result.assert_main_error(ErrorDomain.LOAD, "bad-element-suffix")
|
|
| 73 |
+ |
|
| 74 |
+ |
|
| 75 |
+@pytest.mark.datafiles(DATA_DIR)
|
|
| 76 |
+@pytest.mark.parametrize("strict,hardlinks", [
|
|
| 77 |
+ ("non-strict", "hardlinks"),
|
|
| 78 |
+])
|
|
| 79 |
+def test_build_invalid_suffix_dep(datafiles, cli, strict, hardlinks):
|
|
| 80 |
+ project = os.path.join(datafiles.dirname, datafiles.basename)
|
|
| 81 |
+ checkout = os.path.join(cli.directory, 'checkout')
|
|
| 82 |
+ |
|
| 83 |
+ # target2.bst depends on an element called target.foo
|
|
| 84 |
+ result = cli.run(project=project, args=strict_args(['build', 'target2.bst'], strict))
|
|
| 85 |
+ result.assert_main_error(ErrorDomain.LOAD, "bad-element-suffix")
|
|
| 86 |
+ |
|
| 87 |
+ |
|
| 63 | 88 |
@pytest.mark.datafiles(DATA_DIR)
|
| 64 | 89 |
@pytest.mark.parametrize("deps", [("run"), ("none")])
|
| 65 | 90 |
def test_build_checkout_deps(datafiles, cli, deps):
|
| 1 |
+kind: stack
|
|
| 2 |
+description: |
|
|
| 3 |
+ |
|
| 4 |
+ Main stack target for the bst build test
|
| 1 |
+kind: stack
|
|
| 2 |
+description: |
|
|
| 3 |
+ |
|
| 4 |
+ Main stack target for the bst build test
|
|
| 5 |
+ |
|
| 6 |
+depends:
|
|
| 7 |
+- target.foo
|
| ... | ... | @@ -2,3 +2,6 @@ |
| 2 | 2 |
name: test
|
| 3 | 3 |
|
| 4 | 4 |
element-path: elements
|
| 5 |
+ |
|
| 6 |
+fatal-warnings:
|
|
| 7 |
+- bad-element-suffix
|
| ... | ... | @@ -33,7 +33,7 @@ def create_test_directory(*path, mode=0o644): |
| 33 | 33 |
@pytest.mark.skipif(IS_LINUX and not HAVE_BWRAP, reason='Only available with bubblewrap on Linux')
|
| 34 | 34 |
def test_deterministic_source_umask(cli, tmpdir, datafiles, kind, integration_cache):
|
| 35 | 35 |
project = str(datafiles)
|
| 36 |
- element_name = 'list'
|
|
| 36 |
+ element_name = 'list.bst'
|
|
| 37 | 37 |
element_path = os.path.join(project, 'elements', element_name)
|
| 38 | 38 |
repodir = os.path.join(str(tmpdir), 'repo')
|
| 39 | 39 |
sourcedir = os.path.join(project, 'source')
|
| ... | ... | @@ -108,7 +108,7 @@ def test_deterministic_source_local(cli, tmpdir, datafiles, integration_cache): |
| 108 | 108 |
"""Only user rights should be considered for local source.
|
| 109 | 109 |
"""
|
| 110 | 110 |
project = str(datafiles)
|
| 111 |
- element_name = 'test'
|
|
| 111 |
+ element_name = 'test.bst'
|
|
| 112 | 112 |
element_path = os.path.join(project, 'elements', element_name)
|
| 113 | 113 |
sourcedir = os.path.join(project, 'source')
|
| 114 | 114 |
|
| 1 |
+import os
|
|
| 1 | 2 |
from buildstream._context import Context
|
| 2 | 3 |
from buildstream._project import Project
|
| 3 | 4 |
from buildstream._loader import Loader
|
| 4 | 5 |
|
| 5 |
- |
|
| 6 | 6 |
#
|
| 7 | 7 |
# This is used by the loader test modules, these should
|
| 8 | 8 |
# be removed in favor of testing the functionality via
|
| 9 | 9 |
# the CLI like in the frontend tests anyway.
|
| 10 | 10 |
#
|
| 11 |
+ |
|
| 12 |
+ |
|
| 13 |
+def dummy_handler(message, context):
|
|
| 14 |
+ pass
|
|
| 15 |
+ |
|
| 16 |
+ |
|
| 11 | 17 |
def make_loader(basedir):
|
| 12 | 18 |
context = Context()
|
| 19 |
+ context.load(config=os.devnull)
|
|
| 20 |
+ context.set_message_handler(dummy_handler)
|
|
| 13 | 21 |
project = Project(basedir, context)
|
| 14 | 22 |
return project.loader
|
