diff options
author | bst-marge-bot <marge-bot@buildstream.build> | 2019-10-16 17:30:06 +0000 |
---|---|---|
committer | bst-marge-bot <marge-bot@buildstream.build> | 2019-10-16 17:30:06 +0000 |
commit | 9147994107c27e7760a575b9a8b2f2cc3ce46b98 (patch) | |
tree | f4623530d314a9e20143256f6281b665b32fa6d5 /src/buildstream/_stream.py | |
parent | f6e24e258e07403bf635710e17632beec2709b10 (diff) | |
parent | 84c1fbbd71a96f6641c006734b190ba6d5193fc3 (diff) | |
download | buildstream-9147994107c27e7760a575b9a8b2f2cc3ce46b98.tar.gz |
Merge branch 'traveltissues/1140-softreset' into 'master'
Workspaces via sourcecache MR 2
Closes #1140
See merge request BuildStream/buildstream!1640
Diffstat (limited to 'src/buildstream/_stream.py')
-rw-r--r-- | src/buildstream/_stream.py | 60 |
1 files changed, 25 insertions, 35 deletions
diff --git a/src/buildstream/_stream.py b/src/buildstream/_stream.py index 6e4e5caec..c7ada6eb6 100644 --- a/src/buildstream/_stream.py +++ b/src/buildstream/_stream.py @@ -798,7 +798,8 @@ class Stream(): elements, track_elements = self._load(targets, track_targets, selection=PipelineSelection.REDIRECT, - track_selection=PipelineSelection.REDIRECT) + track_selection=PipelineSelection.REDIRECT, + ignore_workspaces=True) workspaces = self._context.get_workspaces() @@ -825,9 +826,14 @@ class Stream(): # Check for workspace config workspace = workspaces.get_workspace(target._get_full_name()) - if workspace and not force: - raise StreamError("Element '{}' already has workspace defined at: {}" - .format(target.name, workspace.get_absolute_path())) + if workspace: + if not force: + raise StreamError("Element '{}' already has workspace defined at: {}" + .format(target.name, workspace.get_absolute_path())) + if not no_checkout: + target.warn("Replacing existing workspace for element '{}' defined at: {}" + .format(target.name, workspace.get_absolute_path())) + self.workspace_close(target._get_full_name(), remove_dir=not no_checkout) target_consistency = target._get_consistency() if not no_checkout and target_consistency < Consistency.CACHED and \ @@ -863,6 +869,9 @@ class Stream(): if not (no_checkout or force) and os.listdir(directory): raise StreamError("For element '{}', Directory path is not empty: {}" .format(target.name, directory), reason='bad-directory') + if os.listdir(directory): + if force and not no_checkout: + utils._force_rmtree(directory) # So far this function has tried to catch as many issues as possible with out making any changes # Now it does the bits that can not be made atomic. @@ -928,14 +937,9 @@ class Stream(): # def workspace_reset(self, targets, *, soft, track_first): - if track_first: - track_targets = targets - else: - track_targets = () - - elements, track_elements = self._load(targets, track_targets, - selection=PipelineSelection.REDIRECT, - track_selection=PipelineSelection.REDIRECT) + elements, _ = self._load(targets, [], + selection=PipelineSelection.REDIRECT, + track_selection=PipelineSelection.REDIRECT) nonexisting = [] for element in elements: @@ -944,37 +948,21 @@ class Stream(): if nonexisting: raise StreamError("Workspace does not exist", detail="\n".join(nonexisting)) - # Do the tracking first - if track_first: - self._fetch(elements, track_elements=track_elements, fetch_original=True) - workspaces = self._context.get_workspaces() - for element in elements: workspace = workspaces.get_workspace(element._get_full_name()) workspace_path = workspace.get_absolute_path() + if soft: workspace.prepared = False self._message(MessageType.INFO, "Reset workspace state for {} at: {}" .format(element.name, workspace_path)) continue - with element.timed_activity("Removing workspace directory {}" - .format(workspace_path)): - try: - shutil.rmtree(workspace_path) - except OSError as e: - raise StreamError("Could not remove '{}': {}" - .format(workspace_path, e)) from e - - workspaces.delete_workspace(element._get_full_name()) - workspaces.create_workspace(element, workspace_path, checkout=True) - - self._message(MessageType.INFO, - "Reset workspace for {} at: {}".format(element.name, - workspace_path)) - - workspaces.save_config() + self.workspace_close(element._get_full_name(), remove_dir=True) + workspaces.save_config() + self.workspace_open([element._get_full_name()], + no_checkout=False, track_first=track_first, force=True, custom_dir=workspace_path) # workspace_exists # @@ -1182,6 +1170,7 @@ class Stream(): # use_source_config (bool): Whether to initialize remote source caches with the config # artifact_remote_url (str): A remote url for initializing the artifacts # source_remote_url (str): A remote url for initializing source caches + # ignore_workspaces (bool): Whether to load workspace sources for open workspaces # # Returns: # (list of Element): The primary element selection @@ -1199,7 +1188,8 @@ class Stream(): artifact_remote_url=None, source_remote_url=None, dynamic_plan=False, - load_refs=False): + load_refs=False, + ignore_workspaces=False): # Classify element and artifact strings target_elements, target_artifacts = self._classify_artifacts(targets) @@ -1220,7 +1210,7 @@ class Stream(): loadable = [target_elements, except_targets, track_targets, track_except_targets] if any(loadable): elements, except_elements, track_elements, track_except_elements = \ - self._pipeline.load(loadable, rewritable=rewritable) + self._pipeline.load(loadable, rewritable=rewritable, ignore_workspaces=ignore_workspaces) else: elements, except_elements, track_elements, track_except_elements = [], [], [], [] |