summaryrefslogtreecommitdiff
path: root/src/buildstream/storage
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildstream/storage')
-rw-r--r--src/buildstream/storage/_casbaseddirectory.py134
-rw-r--r--src/buildstream/storage/_filebaseddirectory.py59
2 files changed, 43 insertions, 150 deletions
diff --git a/src/buildstream/storage/_casbaseddirectory.py b/src/buildstream/storage/_casbaseddirectory.py
index 3b248f3ae..9c5c179b0 100644
--- a/src/buildstream/storage/_casbaseddirectory.py
+++ b/src/buildstream/storage/_casbaseddirectory.py
@@ -99,15 +99,7 @@ class CasBasedDirectory(Directory):
_pb2_path_sep = "/"
_pb2_absolute_path_prefix = "/"
- def __init__(
- self,
- cas_cache,
- *,
- digest=None,
- parent=None,
- common_name="untitled",
- filename=None
- ):
+ def __init__(self, cas_cache, *, digest=None, parent=None, common_name="untitled", filename=None):
self.filename = filename
self.common_name = common_name
self.cas_cache = cas_cache
@@ -123,25 +115,16 @@ class CasBasedDirectory(Directory):
with open(self.cas_cache.objpath(digest), "rb") as f:
pb2_directory.ParseFromString(f.read())
except FileNotFoundError as e:
- raise VirtualDirectoryError(
- "Directory not found in local cache: {}".format(e)
- ) from e
+ raise VirtualDirectoryError("Directory not found in local cache: {}".format(e)) from e
for entry in pb2_directory.directories:
- self.index[entry.name] = IndexEntry(
- entry.name, _FileType.DIRECTORY, digest=entry.digest
- )
+ self.index[entry.name] = IndexEntry(entry.name, _FileType.DIRECTORY, digest=entry.digest)
for entry in pb2_directory.files:
self.index[entry.name] = IndexEntry(
- entry.name,
- _FileType.REGULAR_FILE,
- digest=entry.digest,
- is_executable=entry.is_executable,
+ entry.name, _FileType.REGULAR_FILE, digest=entry.digest, is_executable=entry.is_executable,
)
for entry in pb2_directory.symlinks:
- self.index[entry.name] = IndexEntry(
- entry.name, _FileType.SYMLINK, target=entry.target
- )
+ self.index[entry.name] = IndexEntry(entry.name, _FileType.SYMLINK, target=entry.target)
def _find_self_in_parent(self):
assert self.parent is not None
@@ -156,20 +139,14 @@ class CasBasedDirectory(Directory):
newdir = CasBasedDirectory(self.cas_cache, parent=self, filename=name)
- self.index[name] = IndexEntry(
- name, _FileType.DIRECTORY, buildstream_object=newdir
- )
+ self.index[name] = IndexEntry(name, _FileType.DIRECTORY, buildstream_object=newdir)
self.__invalidate_digest()
return newdir
def _add_file(self, basename, filename, modified=False, can_link=False):
- entry = IndexEntry(
- filename,
- _FileType.REGULAR_FILE,
- modified=modified or filename in self.index,
- )
+ entry = IndexEntry(filename, _FileType.REGULAR_FILE, modified=modified or filename in self.index,)
path = os.path.join(basename, filename)
entry.digest = self.cas_cache.add_object(path=path, link_directly=can_link)
entry.is_executable = os.access(path, os.X_OK)
@@ -178,14 +155,10 @@ class CasBasedDirectory(Directory):
self.__invalidate_digest()
def _copy_link_from_filesystem(self, basename, filename):
- self._add_new_link_direct(
- filename, os.readlink(os.path.join(basename, filename))
- )
+ self._add_new_link_direct(filename, os.readlink(os.path.join(basename, filename)))
def _add_new_link_direct(self, name, target):
- self.index[name] = IndexEntry(
- name, _FileType.SYMLINK, target=target, modified=name in self.index
- )
+ self.index[name] = IndexEntry(name, _FileType.SYMLINK, target=target, modified=name in self.index)
self.__invalidate_digest()
@@ -237,20 +210,13 @@ class CasBasedDirectory(Directory):
linklocation = entry.target
newpaths = linklocation.split(os.path.sep)
if os.path.isabs(linklocation):
- current_dir = current_dir.find_root().descend(
- *newpaths, follow_symlinks=True
- )
+ current_dir = current_dir.find_root().descend(*newpaths, follow_symlinks=True)
else:
- current_dir = current_dir.descend(
- *newpaths, follow_symlinks=True
- )
+ current_dir = current_dir.descend(*newpaths, follow_symlinks=True)
else:
- error = (
- "Cannot descend into {}, which is a '{}' in the directory {}"
- )
+ error = "Cannot descend into {}, which is a '{}' in the directory {}"
raise VirtualDirectoryError(
- error.format(path, current_dir.index[path].type, current_dir),
- reason="not-a-directory",
+ error.format(path, current_dir.index[path].type, current_dir), reason="not-a-directory",
)
else:
if path == ".":
@@ -265,8 +231,7 @@ class CasBasedDirectory(Directory):
else:
error = "'{}' not found in {}"
raise VirtualDirectoryError(
- error.format(path, str(current_dir)),
- reason="directory-not-found",
+ error.format(path, str(current_dir)), reason="directory-not-found",
)
return current_dir
@@ -297,9 +262,7 @@ class CasBasedDirectory(Directory):
fileListResult.overwritten.append(relative_pathname)
return True
- def _partial_import_cas_into_cas(
- self, source_directory, filter_callback, *, path_prefix="", origin=None, result
- ):
+ def _partial_import_cas_into_cas(self, source_directory, filter_callback, *, path_prefix="", origin=None, result):
""" Import files from a CAS-based directory. """
if origin is None:
origin = self
@@ -318,9 +281,7 @@ class CasBasedDirectory(Directory):
# we can import the whole source directory by digest instead
# of importing each directory entry individually.
subdir_digest = entry.get_digest()
- dest_entry = IndexEntry(
- name, _FileType.DIRECTORY, digest=subdir_digest
- )
+ dest_entry = IndexEntry(name, _FileType.DIRECTORY, digest=subdir_digest)
self.index[name] = dest_entry
self.__invalidate_digest()
@@ -337,9 +298,7 @@ class CasBasedDirectory(Directory):
else:
subdir = dest_entry.get_directory(self)
- subdir.__add_files_to_result(
- path_prefix=relative_pathname, result=result
- )
+ subdir.__add_files_to_result(path_prefix=relative_pathname, result=result)
else:
src_subdir = source_directory.descend(name)
if src_subdir == origin:
@@ -350,17 +309,11 @@ class CasBasedDirectory(Directory):
except VirtualDirectoryError:
filetype = self.index[name].type
raise VirtualDirectoryError(
- "Destination is a {}, not a directory: /{}".format(
- filetype, relative_pathname
- )
+ "Destination is a {}, not a directory: /{}".format(filetype, relative_pathname)
)
dest_subdir._partial_import_cas_into_cas(
- src_subdir,
- filter_callback,
- path_prefix=relative_pathname,
- origin=origin,
- result=result,
+ src_subdir, filter_callback, path_prefix=relative_pathname, origin=origin, result=result,
)
if filter_callback and not filter_callback(relative_pathname):
@@ -388,13 +341,7 @@ class CasBasedDirectory(Directory):
result.files_written.append(relative_pathname)
def import_files(
- self,
- external_pathspec,
- *,
- filter_callback=None,
- report_written=True,
- update_mtime=False,
- can_link=False
+ self, external_pathspec, *, filter_callback=None, report_written=True, update_mtime=False, can_link=False
):
""" See superclass Directory for arguments """
@@ -413,9 +360,7 @@ class CasBasedDirectory(Directory):
external_pathspec = CasBasedDirectory(self.cas_cache, digest=digest)
assert isinstance(external_pathspec, CasBasedDirectory)
- self._partial_import_cas_into_cas(
- external_pathspec, filter_callback, result=result
- )
+ self._partial_import_cas_into_cas(external_pathspec, filter_callback, result=result)
# TODO: No notice is taken of report_written or update_mtime.
# Current behaviour is to fully populate the report, which is inefficient,
@@ -425,11 +370,7 @@ class CasBasedDirectory(Directory):
def import_single_file(self, external_pathspec):
result = FileListResult()
- if self._check_replacement(
- os.path.basename(external_pathspec),
- os.path.dirname(external_pathspec),
- result,
- ):
+ if self._check_replacement(os.path.basename(external_pathspec), os.path.dirname(external_pathspec), result,):
self._add_file(
os.path.dirname(external_pathspec),
os.path.basename(external_pathspec),
@@ -495,9 +436,7 @@ class CasBasedDirectory(Directory):
f = StringIO(entry.target)
tarfile.addfile(tarinfo, f)
else:
- raise VirtualDirectoryError(
- "can not export file type {} to tar".format(entry.type)
- )
+ raise VirtualDirectoryError("can not export file type {} to tar".format(entry.type))
def _mark_changed(self):
""" It should not be possible to externally modify a CAS-based
@@ -588,12 +527,8 @@ class CasBasedDirectory(Directory):
"""
- file_list = list(
- filter(lambda i: i[1].type != _FileType.DIRECTORY, self.index.items())
- )
- directory_list = filter(
- lambda i: i[1].type == _FileType.DIRECTORY, self.index.items()
- )
+ file_list = list(filter(lambda i: i[1].type != _FileType.DIRECTORY, self.index.items()))
+ directory_list = filter(lambda i: i[1].type == _FileType.DIRECTORY, self.index.items())
if prefix != "":
yield prefix
@@ -603,9 +538,7 @@ class CasBasedDirectory(Directory):
for (k, v) in sorted(directory_list):
subdir = v.get_directory(self)
- yield from subdir._list_prefixed_relative_paths(
- prefix=os.path.join(prefix, k)
- )
+ yield from subdir._list_prefixed_relative_paths(prefix=os.path.join(prefix, k))
def walk(self):
"""Provide a list of dictionaries containing information about the files.
@@ -673,8 +606,7 @@ class CasBasedDirectory(Directory):
""" There is no underlying directory for a CAS-backed directory, so
throw an exception. """
raise VirtualDirectoryError(
- "_get_underlying_directory was called on a CAS-backed directory,"
- + " which has no underlying directory."
+ "_get_underlying_directory was called on a CAS-backed directory," + " which has no underlying directory."
)
# _get_digest():
@@ -712,9 +644,7 @@ class CasBasedDirectory(Directory):
symlinknode.name = name
symlinknode.target = entry.target
- self.__digest = self.cas_cache.add_object(
- buffer=pb2_directory.SerializeToString()
- )
+ self.__digest = self.cas_cache.add_object(buffer=pb2_directory.SerializeToString())
return self.__digest
@@ -729,9 +659,7 @@ class CasBasedDirectory(Directory):
linklocation = target.target
newpath = linklocation.split(os.path.sep)
if os.path.isabs(linklocation):
- return subdir.find_root()._exists(
- *newpath, follow_symlinks=True
- )
+ return subdir.find_root()._exists(*newpath, follow_symlinks=True)
return subdir._exists(*newpath, follow_symlinks=True)
return False
except VirtualDirectoryError:
@@ -750,8 +678,6 @@ class CasBasedDirectory(Directory):
if entry.type == _FileType.DIRECTORY:
subdir = self.descend(name)
- subdir.__add_files_to_result(
- path_prefix=relative_pathname, result=result
- )
+ subdir.__add_files_to_result(path_prefix=relative_pathname, result=result)
else:
result.files_written.append(relative_pathname)
diff --git a/src/buildstream/storage/_filebaseddirectory.py b/src/buildstream/storage/_filebaseddirectory.py
index 21515649d..0926c1b3a 100644
--- a/src/buildstream/storage/_filebaseddirectory.py
+++ b/src/buildstream/storage/_filebaseddirectory.py
@@ -58,9 +58,7 @@ class FileBasedDirectory(Directory):
""" See superclass Directory for arguments """
if follow_symlinks:
- ImplError(
- "FileBasedDirectory.Decend dose not implement follow_symlinks=True"
- )
+ ImplError("FileBasedDirectory.Decend dose not implement follow_symlinks=True")
current_dir = self
@@ -74,38 +72,24 @@ class FileBasedDirectory(Directory):
st = os.lstat(new_path)
if not stat.S_ISDIR(st.st_mode):
raise VirtualDirectoryError(
- "Cannot descend into '{}': '{}' is not a directory".format(
- path, new_path
- )
+ "Cannot descend into '{}': '{}' is not a directory".format(path, new_path)
)
except FileNotFoundError:
if create:
os.mkdir(new_path)
else:
- raise VirtualDirectoryError(
- "Cannot descend into '{}': '{}' does not exist".format(
- path, new_path
- )
- )
+ raise VirtualDirectoryError("Cannot descend into '{}': '{}' does not exist".format(path, new_path))
current_dir = FileBasedDirectory(new_path)
return current_dir
def import_files(
- self,
- external_pathspec,
- *,
- filter_callback=None,
- report_written=True,
- update_mtime=False,
- can_link=False
+ self, external_pathspec, *, filter_callback=None, report_written=True, update_mtime=False, can_link=False
):
""" See superclass Directory for arguments """
- from ._casbaseddirectory import (
- CasBasedDirectory,
- ) # pylint: disable=cyclic-import
+ from ._casbaseddirectory import CasBasedDirectory # pylint: disable=cyclic-import
if isinstance(external_pathspec, CasBasedDirectory):
if can_link and not update_mtime:
@@ -114,9 +98,7 @@ class FileBasedDirectory(Directory):
actionfunc = utils.safe_copy
import_result = FileListResult()
- self._import_files_from_cas(
- external_pathspec, actionfunc, filter_callback, result=import_result
- )
+ self._import_files_from_cas(external_pathspec, actionfunc, filter_callback, result=import_result)
else:
if isinstance(external_pathspec, Directory):
source_directory = external_pathspec.external_directory
@@ -144,15 +126,11 @@ class FileBasedDirectory(Directory):
cur_time = time.time()
for f in import_result.files_written:
- os.utime(
- os.path.join(self.external_directory, f), times=(cur_time, cur_time)
- )
+ os.utime(os.path.join(self.external_directory, f), times=(cur_time, cur_time))
return import_result
def import_single_file(self, external_pathspec):
- dstpath = os.path.join(
- self.external_directory, os.path.basename(external_pathspec)
- )
+ dstpath = os.path.join(self.external_directory, os.path.basename(external_pathspec))
result = FileListResult()
if os.path.exists(dstpath):
result.ignored.append(dstpath)
@@ -206,9 +184,7 @@ class FileBasedDirectory(Directory):
tarfile.addfile(tarinfo, f)
elif tarinfo.isdir():
tarfile.addfile(tarinfo)
- self.descend(*filename.split(os.path.sep)).export_to_tar(
- tarfile, arcname, mtime
- )
+ self.descend(*filename.split(os.path.sep)).export_to_tar(tarfile, arcname, mtime)
else:
tarfile.addfile(tarinfo)
@@ -230,8 +206,7 @@ class FileBasedDirectory(Directory):
return [
f
for f in list_relative_paths(self.external_directory)
- if _get_link_mtime(os.path.join(self.external_directory, f))
- != BST_ARBITRARY_TIMESTAMP
+ if _get_link_mtime(os.path.join(self.external_directory, f)) != BST_ARBITRARY_TIMESTAMP
]
def list_relative_paths(self):
@@ -272,9 +247,7 @@ class FileBasedDirectory(Directory):
else:
return _FileType.SPECIAL_FILE
- def _import_files_from_cas(
- self, source_directory, actionfunc, filter_callback, *, path_prefix="", result
- ):
+ def _import_files_from_cas(self, source_directory, actionfunc, filter_callback, *, path_prefix="", result):
""" Import files from a CAS-based directory. """
for name, entry in source_directory.index.items():
@@ -295,17 +268,11 @@ class FileBasedDirectory(Directory):
except VirtualDirectoryError:
filetype = self._get_filetype(name)
raise VirtualDirectoryError(
- "Destination is a {}, not a directory: /{}".format(
- filetype, relative_pathname
- )
+ "Destination is a {}, not a directory: /{}".format(filetype, relative_pathname)
)
dest_subdir._import_files_from_cas(
- src_subdir,
- actionfunc,
- filter_callback,
- path_prefix=relative_pathname,
- result=result,
+ src_subdir, actionfunc, filter_callback, path_prefix=relative_pathname, result=result,
)
if filter_callback and not filter_callback(relative_pathname):