summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarius Makovsky <traveltissues@protonmail.com>2019-10-18 10:11:10 +0100
committerDarius Makovsky <traveltissues@protonmail.com>2019-10-18 11:18:29 +0100
commita9f49066c190280e868d0b69f8e0c331a4dcbcb3 (patch)
tree758c25f65316e892fd2727f80d2b19ab389bfbab
parent588d7b789d7a52f5824333991d91147504e448a4 (diff)
downloadbuildstream-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.py25
-rw-r--r--src/buildstream/storage/__init__.py1
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