summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGökçen Nurlu <gnurlu1@bloomberg.net>2018-10-29 17:40:31 +0000
committerGökçen Nurlu <gnurlu1@bloomberg.net>2018-10-29 17:40:31 +0000
commit0ad43c10ab467fef6e04813b9da0ca42c2d86eea (patch)
tree25c8aaccbb67f081ea26eb41e8f7fc4bc6a6a4fb
parent139f4ea77619a8ff016846194a092dcb2be7929a (diff)
downloadbuildstream-0ad43c10ab467fef6e04813b9da0ca42c2d86eea.tar.gz
Add explicit fetch flag for 'bst workspace-open'
-rw-r--r--buildstream/_frontend/cli.py7
-rw-r--r--buildstream/_stream.py28
2 files changed, 21 insertions, 14 deletions
diff --git a/buildstream/_frontend/cli.py b/buildstream/_frontend/cli.py
index 79f001690..b73771165 100644
--- a/buildstream/_frontend/cli.py
+++ b/buildstream/_frontend/cli.py
@@ -694,8 +694,10 @@ def workspace():
@click.argument('element',
type=click.Path(readable=False))
@click.argument('directory', type=click.Path(file_okay=False))
+@click.option('--fetch', 'fetch_', default=False, is_flag=True,
+ help="Enable auto-fetching of element and related junction(s)")
@click.pass_obj
-def workspace_open(app, no_checkout, force, track_, element, directory):
+def workspace_open(app, no_checkout, force, track_, element, directory, fetch_):
"""Open a workspace for manual source modification"""
if os.path.exists(directory):
@@ -712,7 +714,8 @@ def workspace_open(app, no_checkout, force, track_, element, directory):
app.stream.workspace_open(element, directory,
no_checkout=no_checkout,
track_first=track_,
- force=force)
+ force=force,
+ fetch=fetch_)
##################################################################
diff --git a/buildstream/_stream.py b/buildstream/_stream.py
index 019ce66f1..14398b90d 100644
--- a/buildstream/_stream.py
+++ b/buildstream/_stream.py
@@ -454,11 +454,13 @@ class Stream():
# no_checkout (bool): Whether to skip checking out the source
# track_first (bool): Whether to track and fetch first
# force (bool): Whether to ignore contents in an existing directory
+ # fetch (bool): Enable auto-fetching of target and related junction(s)
#
def workspace_open(self, target, directory, *,
no_checkout,
track_first,
- force):
+ force,
+ fetch):
if track_first:
track_targets = (target,)
@@ -467,7 +469,8 @@ class Stream():
elements, track_elements = self._load((target,), track_targets,
selection=PipelineSelection.REDIRECT,
- track_selection=PipelineSelection.REDIRECT)
+ track_selection=PipelineSelection.REDIRECT,
+ fetch_subprojects=fetch)
target = elements[0]
directory = os.path.abspath(directory)
@@ -487,20 +490,21 @@ class Stream():
raise StreamError("Workspace '{}' is already defined at: {}"
.format(target.name, workspace.get_absolute_path()))
- # If we're going to checkout, we need at least a fetch,
- # if we were asked to track first, we're going to fetch anyway.
- #
- if not no_checkout or track_first:
+ # If we're going to checkout, we need to handle fetchs and tracks
+ if not no_checkout:
track_elements = []
if track_first:
track_elements = elements
- self._fetch(elements, track_elements=track_elements)
- if not no_checkout and target._get_consistency() != Consistency.CACHED:
- raise StreamError("Could not stage uncached source. " +
- "Use `--track` to track and " +
- "fetch the latest version of the " +
- "source.")
+ fetch_elements = []
+ if fetch:
+ fetch_elements = elements
+
+ self._fetch(fetch_elements, track_elements=track_elements)
+ # _fetch above might have done only fetch, only track, both or
+ # none. We still need to ensure that element's refrenced sources
+ # are available.
+ self._pipeline.assert_sources_cached(elements)
if workspace:
workspaces.delete_workspace(target._get_full_name())