diff options
author | Darius Makovsky <traveltissues@protonmail.com> | 2019-10-09 18:20:58 +0100 |
---|---|---|
committer | Darius Makovsky <traveltissues@protonmail.com> | 2019-10-11 16:24:51 +0100 |
commit | bfeb833fb57f1130374b769125e4eb6dbdeaa96f (patch) | |
tree | c14b2c6c097d674dca435bbc41eeacba8067a6d0 | |
parent | 215575971f4d512a260b1676807945abbfb2f254 (diff) | |
download | buildstream-traveltissues/1140-2.tar.gz |
_stream.py: use close and open to reset workspacestraveltissues/1140-2
* tracking not needed in reset
* remove 'soft' reset
* support workspace opening for already open workspaces
remove existing files to preserve behaviour
-rw-r--r-- | src/buildstream/_stream.py | 74 |
1 files changed, 36 insertions, 38 deletions
diff --git a/src/buildstream/_stream.py b/src/buildstream/_stream.py index 6e4e5caec..92fda5868 100644 --- a/src/buildstream/_stream.py +++ b/src/buildstream/_stream.py @@ -813,6 +813,7 @@ class Stream(): expanded_directories = [] # To try to be more atomic, loop through the elements and raise any errors we can early + reload_targets = False for target in elements: if not list(target.sources()): @@ -825,9 +826,15 @@ 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("Removing 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) + reload_targets = True target_consistency = target._get_consistency() if not no_checkout and target_consistency < Consistency.CACHED and \ @@ -843,6 +850,22 @@ class Stream(): directory = directory[:-4] expanded_directories.append(directory) + if reload_targets: + elements, track_elements = self._load(targets, track_targets, + selection=PipelineSelection.REDIRECT, + track_selection=PipelineSelection.REDIRECT) + + workspaces = self._context.get_workspaces() + + # 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: + track_elements = [] + if track_first: + track_elements = elements + self._fetch(elements, track_elements=track_elements, fetch_original=True) + if custom_dir: if len(elements) != 1: raise StreamError("Exactly one element can be given if --directory is used", @@ -863,6 +886,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: + shutil.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 +954,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 +965,14 @@ 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 # |