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)

Reply via email to