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 152b9fce2b86bb2eb2943a1ec5e59f8234f5b62e
Author: Jürg Billeter <[email protected]>
AuthorDate: Fri Oct 2 14:31:34 2026 +0200

    cascache.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/_cas/cascache.py | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/buildstream/_cas/cascache.py b/src/buildstream/_cas/cascache.py
index 3384f0522..9fd5b4649 100644
--- a/src/buildstream/_cas/cascache.py
+++ b/src/buildstream/_cas/cascache.py
@@ -185,8 +185,10 @@ class CASCache:
         with open(self.objpath(tree), "rb") as f:
             directory.ParseFromString(f.read())
 
+        names = set()
+
         for filenode in directory.files:
-            _validate_cas_node_name(filenode.name)
+            _validate_cas_node_name(filenode.name, names)
 
             # regular file, create hardlink
             fullpath = os.path.join(dest, filenode.name)
@@ -216,13 +218,13 @@ class CASCache:
                 os.chmod(fullpath, mode)
 
         for dirnode in directory.directories:
-            _validate_cas_node_name(dirnode.name)
+            _validate_cas_node_name(dirnode.name, names)
             fullpath = os.path.join(dest, dirnode.name)
             self.checkout(fullpath, dirnode.digest, can_link=can_link, 
_fetch=False)
 
         for symlinknode in directory.symlinks:
             # symlink
-            _validate_cas_node_name(symlinknode.name)
+            _validate_cas_node_name(symlinknode.name, names)
             fullpath = os.path.join(dest, symlinknode.name)
             os.symlink(symlinknode.target, fullpath)
 
@@ -835,9 +837,14 @@ def _grouper(iterable, n):
 #
 # 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 CASCacheError(
             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 CASCacheError(f"Duplicate name in a CAS Directory node: 
'{name}'")
+    names.add(name)

Reply via email to