2
0
Эх сурвалжийг харах

mount: create unique directory names, fixes #8461

Thomas Waldmann 8 сар өмнө
parent
commit
84245ef2bf

+ 3 - 2
src/borg/fuse.py

@@ -39,7 +39,7 @@ from .crypto.low_level import blake2b_128
 from .archiver._common import build_matcher, build_filter
 from .archive import Archive, get_item_uid_gid
 from .hashindex import FuseVersionsIndex
-from .helpers import daemonize, daemonizing, signal_handler, format_file_size
+from .helpers import daemonize, daemonizing, signal_handler, format_file_size, bin_to_hex
 from .helpers import HardLinkManager
 from .helpers import msgpack
 from .helpers.lrucache import LRUCache
@@ -284,7 +284,8 @@ class FuseBackend:
             else:
                 # lazily load archives, create archive placeholder inode
                 archive_inode = self._create_dir(parent=1, mtime=int(archive.ts.timestamp() * 1e9))
-                self.contents[1][os.fsencode(archive.name)] = archive_inode
+                name = f"{archive.name}-{bin_to_hex(archive.id):.8}"  # archive names may be duplicate!
+                self.contents[1][os.fsencode(name)] = archive_inode
                 self.pending_archives[archive_inode] = archive
 
     def get_item(self, inode):

+ 14 - 0
src/borg/testsuite/archiver/mount_cmds_test.py

@@ -200,6 +200,20 @@ def test_fuse_versions_view(archivers, request):
             assert open(hl3, "rb").read() == b"123456"
 
 
+@pytest.mark.skipif(not llfuse, reason="llfuse not installed")
+def test_fuse_duplicate_name(archivers, request):
+    archiver = request.getfixturevalue(archivers)
+    cmd(archiver, "repo-create", RK_ENCRYPTION)
+    cmd(archiver, "create", "archive", "input")
+    cmd(archiver, "create", "archive", "input")
+    mountpoint = os.path.join(archiver.tmpdir, "mountpoint")
+    # mount the whole repository, archives show up as toplevel directories:
+    with fuse_mount(archiver, mountpoint):
+        path = os.path.join(mountpoint)
+        dirs = os.listdir(path)
+        assert len(set(dirs)) == 2  # there must be 2 unique dir names for 2 archives
+
+
 @pytest.mark.skipif(not llfuse, reason="llfuse not installed")
 def test_fuse_allow_damaged_files(archivers, request):
     archiver = request.getfixturevalue(archivers)