diff options
author | Tristan Van Berkom <tristan.vanberkom@codethink.co.uk> | 2018-04-17 17:08:39 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2018-04-17 08:31:48 +0000 |
commit | 4fc2da9ad0ac077db7b675db272d901d2249f66f (patch) | |
tree | fc7bd7cb15dc9522615b6bb36dd69a4e786f4804 /buildstream | |
parent | 548c03f58b878fe685933e6e4d8209e80d37b8f5 (diff) | |
download | buildstream-4fc2da9ad0ac077db7b675db272d901d2249f66f.tar.gz |
element.py: Fix force opening of workspaces.
This was broken because we let the Source objects initialize workspaces
directly in the target workspace directory, where files might already
exist.
Instead, initialize the workspace in a tempdir and hardlink the files
from there.
This fixes issue #364
Diffstat (limited to 'buildstream')
-rw-r--r-- | buildstream/element.py | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/buildstream/element.py b/buildstream/element.py index 324efa86c..398df6655 100644 --- a/buildstream/element.py +++ b/buildstream/element.py @@ -1676,11 +1676,26 @@ class Element(Plugin): # the workspaces metadata first. # def _open_workspace(self): + context = self._get_context() workspace = self._get_workspace() assert workspace is not None - for source in self.sources(): - source._init_workspace(workspace.path) + # First lets get a temp dir in our build directory + # and stage there, then link the files over to the desired + # path. + # + # We do this so that force opening workspaces which overwrites + # files in the target directory actually works without any + # additional support from Source implementations. + # + os.makedirs(context.builddir, exist_ok=True) + with utils._tempdir(dir=context.builddir, prefix='workspace-{}' + .format(self.normal_name)) as temp: + for source in self.sources(): + source._init_workspace(temp) + + # Now hardlink the files into the workspace target. + utils.link_files(temp, workspace.path) # _get_workspace(): # |