From a57aac5a56d8f14612d1a03f923943f898c6ab70 Mon Sep 17 00:00:00 2001 From: Jim MacArthur Date: Fri, 25 May 2018 16:56:06 +0100 Subject: Basic FileListResult support --- buildstream/storage/_casbaseddirectory.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/buildstream/storage/_casbaseddirectory.py b/buildstream/storage/_casbaseddirectory.py index fd138caac..4db590f22 100644 --- a/buildstream/storage/_casbaseddirectory.py +++ b/buildstream/storage/_casbaseddirectory.py @@ -178,6 +178,7 @@ class CasBasedDirectory(Directory): self._hash_object(digest=dirnode.digest, buffer=directory.SerializeToString()) self.index[name] = IndexEntry(newdir) self.recalculate_hash() + self.recursive_save() return newdir def find_directory(self, name): @@ -262,25 +263,30 @@ class CasBasedDirectory(Directory): newdir = self._add_new_blank_directory(subdirectory_spec[0]) return newdir else: - error = "No entry called '{}' found in the directory" - raise VirtualDirectoryError(error.format(subdirectory_spec[0])) + error = "No entry called '{}' found in {}. There are directories called {}." + raise VirtualDirectoryError(error.format(subdirectory_spec[0], str(self), ",".join([entry.name for entry in self.directory.directories]))) return None - def _import_files_from_directory(self, source_directory): + def _import_files_from_directory(self, source_directory, path_prefix=""): + result = FileListResult() for name in sorted(os.listdir(source_directory)): pathname = os.path.join(source_directory, name) if os.path.islink(pathname): self._add_new_link(pathname, name) + result.files_written.append(os.path.join(path_prefix,name)) elif os.path.isdir(pathname): #print("Attempting to import DIRECTORY {} from {}".format(name, source_directory)) newdir = self._add_directory(name) - newdir._import_files_from_directory(pathname) + dir_result = newdir._import_files_from_directory(pathname, os.path.join(path_prefix, name)) + result.combine(dir_result) # TODO: Explain why we need two loops or merge them for name in sorted(os.listdir(source_directory)): pathname = os.path.join(source_directory, name) if os.path.isfile(pathname) and not os.path.islink(pathname): #print("Attempting to import FILE {} from {}".format(name, source_directory)) self._add_new_file(source_directory, name) + result.files_written.append(os.path.join(path_prefix,name)) + return result def save(self, name): """Saves this directory into the content cache.""" @@ -344,9 +350,10 @@ class CasBasedDirectory(Directory): source_directory = external_pathspec # TODO: No notice is taken of the `files` argument, report_written, update_utimes or can_link. - self._import_files_from_directory(source_directory) + result = self._import_files_from_directory(source_directory) self.recursive_save() - + return result + def set_deterministic_mtime(self) -> None: """ Sets a static modification time for all regular files in this directory. Since we don't store any modification time, we don't need to do anything. -- cgit v1.2.1