diff --git a/Sources/ContainerizationEXT4/EXT4+FileTree.swift b/Sources/ContainerizationEXT4/EXT4+FileTree.swift index d8fa8cbc1..427e599c7 100644 --- a/Sources/ContainerizationEXT4/EXT4+FileTree.swift +++ b/Sources/ContainerizationEXT4/EXT4+FileTree.swift @@ -61,21 +61,8 @@ extension EXT4 { components.append(ptr.pointee.name) _ptr = ptr.pointee.parent } - guard let last = components.last else { - return nil - } - guard components.count > 1 else { - return FilePath(last) - } - components = components.dropLast() let path = components.reversed().joined(separator: "/") - guard let data = path.data(using: .utf8) else { - return nil - } - guard let dataPath = String(data: data, encoding: .utf8) else { - return nil - } - return FilePath(dataPath).pushing(FilePath(last)).lexicallyNormalized() + return FilePath(path).lexicallyNormalized() } } diff --git a/Tests/ContainerizationEXT4Tests/TestEXT4Reader+IO.swift b/Tests/ContainerizationEXT4Tests/TestEXT4Reader+IO.swift index 5a7739523..d987d9a00 100644 --- a/Tests/ContainerizationEXT4Tests/TestEXT4Reader+IO.swift +++ b/Tests/ContainerizationEXT4Tests/TestEXT4Reader+IO.swift @@ -584,4 +584,47 @@ struct EXT4PathIOTests { let all = try r.readFile(at: FilePath("/big/file.bin")) #expect(all.count == bigSize) } + + @Test + func fileTreeNodePathWithAbsoluteRoot() { + let tree = EXT4.FileTree(EXT4.RootInode, "/") + + let dirPtr = EXT4.Ptr.allocate(capacity: 1) + dirPtr.initialize(to: EXT4.FileTree.FileTreeNode(inode: 3, name: "dir", parent: tree.root)) + tree.root.pointee.children.append(dirPtr) + + let filePtr = EXT4.Ptr.allocate(capacity: 1) + filePtr.initialize(to: EXT4.FileTree.FileTreeNode(inode: 4, name: "file", parent: dirPtr)) + dirPtr.pointee.children.append(filePtr) + + #expect(dirPtr.pointee.path == FilePath("/dir")) + #expect(filePtr.pointee.path == FilePath("/dir/file")) + } + + @Test + func fileTreeNodePathWithRelativeRoot() { + let tree = EXT4.FileTree(EXT4.RootInode, ".") + + let dirPtr = EXT4.Ptr.allocate(capacity: 1) + dirPtr.initialize(to: EXT4.FileTree.FileTreeNode(inode: 3, name: "dir", parent: tree.root)) + tree.root.pointee.children.append(dirPtr) + + let filePtr = EXT4.Ptr.allocate(capacity: 1) + filePtr.initialize(to: EXT4.FileTree.FileTreeNode(inode: 4, name: "file", parent: dirPtr)) + dirPtr.pointee.children.append(filePtr) + + #expect(dirPtr.pointee.path == FilePath("dir")) + #expect(filePtr.pointee.path == FilePath("dir/file")) + } + + @Test + func fileTreeNodePathWithNamedRoot() { + let tree = EXT4.FileTree(EXT4.RootInode, "dir") + + let filePtr = EXT4.Ptr.allocate(capacity: 1) + filePtr.initialize(to: EXT4.FileTree.FileTreeNode(inode: 3, name: "file", parent: tree.root)) + tree.root.pointee.children.append(filePtr) + + #expect(filePtr.pointee.path == FilePath("dir/file")) + } }