summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin David <valentin.david@gmail.com>2018-08-13 11:03:12 +0000
committerValentin David <valentin.david@gmail.com>2018-08-13 11:03:12 +0000
commit650c4d8d1fdb3ea168160a5c368aaaeed6cbb6d4 (patch)
treeac755217c5ad07db8b07aee2873409c0d8dafdc7
parente5dfbb54626323b11f78fb2cebbbc615e0221a2b (diff)
parent2b5c63d0d538ba416e8aefd59a5695c83a00661e (diff)
downloadbuildstream-650c4d8d1fdb3ea168160a5c368aaaeed6cbb6d4.tar.gz
Merge branch 'valentindavid/fix_included_junction_track-1.2' into 'bst-1.2'
Fix tracking of junctions used in project.conf. See merge request BuildStream/buildstream!645
-rw-r--r--buildstream/_stream.py17
-rw-r--r--tests/frontend/track.py22
2 files changed, 37 insertions, 2 deletions
diff --git a/buildstream/_stream.py b/buildstream/_stream.py
index 6f897c6d5..99748f8e0 100644
--- a/buildstream/_stream.py
+++ b/buildstream/_stream.py
@@ -267,8 +267,11 @@ class Stream():
except_targets=None,
cross_junctions=False):
+ # We pass no target to build. Only to track. Passing build targets
+ # would fully load project configuration which might not be
+ # possible before tracking is done.
_, elements = \
- self._load(targets, targets,
+ self._load([], targets,
selection=selection, track_selection=selection,
except_targets=except_targets,
track_except_targets=except_targets,
@@ -817,6 +820,12 @@ class Stream():
#
# A convenience method for loading element lists
#
+ # If `targets` is not empty used project configuration will be
+ # fully loaded. If `targets` is empty, tracking will still be
+ # resolved for elements in `track_targets`, but no build pipeline
+ # will be resolved. This is behavior is import for track() to
+ # not trigger full loading of project configuration.
+ #
# Args:
# targets (list of str): Main targets to load
# track_targets (list of str): Tracking targets
@@ -864,7 +873,7 @@ class Stream():
#
# This can happen with `bst build --track`
#
- if not self._pipeline.targets_include(elements, track_elements):
+ if targets and not self._pipeline.targets_include(elements, track_elements):
raise StreamError("Specified tracking targets that are not "
"within the scope of primary targets")
@@ -900,6 +909,10 @@ class Stream():
for element in track_selected:
element._schedule_tracking()
+ if not targets:
+ self._pipeline.resolve_elements(track_selected)
+ return [], track_selected
+
# ArtifactCache.setup_remotes expects all projects to be fully loaded
for project in self._context.get_projects():
project.ensure_fully_loaded()
diff --git a/tests/frontend/track.py b/tests/frontend/track.py
index 1cf962f88..73b63ec4c 100644
--- a/tests/frontend/track.py
+++ b/tests/frontend/track.py
@@ -612,3 +612,25 @@ def test_track_include_junction(cli, tmpdir, datafiles, ref_storage, kind):
# Assert that we are now buildable because the source is
# now cached.
assert cli.get_element_state(project, element_name) == 'buildable'
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')])
+@pytest.mark.parametrize("kind", [(kind) for kind in ALL_REPO_KINDS])
+def test_track_junction_included(cli, tmpdir, datafiles, ref_storage, kind):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ element_path = os.path.join(project, 'elements')
+ subproject_path = os.path.join(project, 'files', 'sub-project')
+ sub_element_path = os.path.join(subproject_path, 'elements')
+ junction_path = os.path.join(element_path, 'junction.bst')
+
+ configure_project(project, {
+ 'ref-storage': ref_storage,
+ '(@)': ['junction.bst:test.yml']
+ })
+
+ generate_junction(str(tmpdir.join('junction_repo')),
+ subproject_path, junction_path, store_ref=False)
+
+ result = cli.run(project=project, args=['track', 'junction.bst'])
+ result.assert_success()