diff options
author | Darius Makovsky <traveltissues@protonmail.com> | 2019-10-18 10:11:10 +0100 |
---|---|---|
committer | Darius Makovsky <traveltissues@protonmail.com> | 2019-10-18 11:18:29 +0100 |
commit | a9f49066c190280e868d0b69f8e0c331a4dcbcb3 (patch) | |
tree | 758c25f65316e892fd2727f80d2b19ab389bfbab | |
parent | 588d7b789d7a52f5824333991d91147504e448a4 (diff) | |
download | buildstream-a9f49066c190280e868d0b69f8e0c331a4dcbcb3.tar.gz |
Extend Source API
Add `stage_into_directory()` and `stage_into_cas()` public methods.
`stage_into_directory` reimplements `LocalSource.stage()` to import the
source path on the specified directory object. `stage_into_cas()` calls
this after obtaining a `CasBasedDirectory` for the import.
-rw-r--r-- | src/buildstream/source.py | 25 | ||||
-rw-r--r-- | src/buildstream/storage/__init__.py | 1 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/buildstream/source.py b/src/buildstream/source.py index 7fc2e9fc0..e9170987d 100644 --- a/src/buildstream/source.py +++ b/src/buildstream/source.py @@ -173,6 +173,7 @@ from ._exceptions import BstError, ImplError, ErrorDomain from ._loader.metasource import MetaSource from ._projectrefs import ProjectRefStorage from ._cachekey import generate_key +from .storage import CasBasedDirectory from .storage import FileBasedDirectory from .storage.directory import Directory, VirtualDirectoryError @@ -669,6 +670,24 @@ class Source(Plugin): project = self._get_project() return project.directory + def stage_into_cas(self, path: str) -> Tuple[Directory, str]: + cas_dir = self._get_cas_dir() + self.stage_into_directory(path, cas_dir) + return cas_dir, self._get_dir_hash(cas_dir) + + def stage_into_directory(self, path: str, directory: Directory) -> None: + assert isinstance(directory, Directory) + with self.timed_activity("Staging local files into CAS"): + if os.path.isdir(path) and not os.path.islink(path): + result = directory.import_files(path) + else: + result = directory.import_single_file(path) + + if result.overwritten or result.ignored: + raise SourceError( + "Failed to stage source: files clash with existing directory", + reason='ensure-stage-dir-fail') + @contextmanager def tempdir(self) -> Iterator[str]: """Context manager for working in a temporary directory @@ -705,6 +724,12 @@ class Source(Plugin): ############################################################# # Private Methods used in BuildStream # ############################################################# + def _get_cas_dir(self): + cas = self._get_context().get_cascache() + return CasBasedDirectory(cas) + + def _get_dir_hash(self, vdir): + return vdir._get_digest().hash # Wrapper around preflight() method # diff --git a/src/buildstream/storage/__init__.py b/src/buildstream/storage/__init__.py index 33424ac8d..5571cd807 100644 --- a/src/buildstream/storage/__init__.py +++ b/src/buildstream/storage/__init__.py @@ -19,4 +19,5 @@ # Jim MacArthur <jim.macarthur@codethink.co.uk> from ._filebaseddirectory import FileBasedDirectory +from ._casbaseddirectory import CasBasedDirectory from .directory import Directory |