diff options
author | Gökçen Nurlu <gnurlu1@bloomberg.net> | 2018-10-29 17:40:31 +0000 |
---|---|---|
committer | Gökçen Nurlu <gnurlu1@bloomberg.net> | 2018-10-29 17:40:31 +0000 |
commit | 0ad43c10ab467fef6e04813b9da0ca42c2d86eea (patch) | |
tree | 25c8aaccbb67f081ea26eb41e8f7fc4bc6a6a4fb | |
parent | 139f4ea77619a8ff016846194a092dcb2be7929a (diff) | |
download | buildstream-0ad43c10ab467fef6e04813b9da0ca42c2d86eea.tar.gz |
Add explicit fetch flag for 'bst workspace-open'
-rw-r--r-- | buildstream/_frontend/cli.py | 7 | ||||
-rw-r--r-- | buildstream/_stream.py | 28 |
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()) |