This is an automated email from the ASF dual-hosted git repository. juergbi pushed a commit to branch jbilleter/checkout in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit d0b124d0ea6d60f4eba057b31a30f24a79cb4447 Author: Jürg Billeter <[email protected]> AuthorDate: Fri Oct 2 14:35:12 2026 +0200 _casbaseddirectory.py: Detect duplicate `Directory` node names The REAPI spec requires that each child in the directory must have a unique path segment (file name). --- src/buildstream/storage/_casbaseddirectory.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/buildstream/storage/_casbaseddirectory.py b/src/buildstream/storage/_casbaseddirectory.py index 5898b80db..afa079612 100644 --- a/src/buildstream/storage/_casbaseddirectory.py +++ b/src/buildstream/storage/_casbaseddirectory.py @@ -653,13 +653,15 @@ class CasBasedDirectory(Directory): if prop.name == "SubtreeReadOnly": self.__subtree_read_only = prop.value == "true" + names = set[str]() + for dentry in pb2_directory.directories: - _validate_cas_node_name(dentry.name) + _validate_cas_node_name(dentry.name, names) self.__index[dentry.name] = _IndexEntry( self.__cas_cache, dentry.name, FileType.DIRECTORY, digest=dentry.digest ) for entry in pb2_directory.files: - _validate_cas_node_name(entry.name) + _validate_cas_node_name(entry.name, names) mtime: Optional[timestamp_pb2.Timestamp] if entry.node_properties.HasField("mtime"): mtime = entry.node_properties.mtime @@ -675,7 +677,7 @@ class CasBasedDirectory(Directory): mtime=mtime, ) for lentry in pb2_directory.symlinks: - _validate_cas_node_name(lentry.name) + _validate_cas_node_name(lentry.name, names) self.__index[lentry.name] = _IndexEntry( self.__cas_cache, lentry.name, FileType.SYMLINK, target=lentry.target ) @@ -919,9 +921,14 @@ class CasBasedDirectory(Directory): # # Args: # name (str): The name of a CAS Directory entry +# names (set): The set of names in the directory # -def _validate_cas_node_name(name: str): +def _validate_cas_node_name(name: str, names: set[str]): if os.path.basename(name) != name or name in (".", ".."): raise DirectoryError( f"Invalid name in a CAS Directory node: '{name}' (every child in the directory must have a path of exactly one segment)" ) + + if name in names: + raise DirectoryError(f"Duplicate name in a CAS Directory node: '{name}'") + names.add(name)
