From f5aa9ba724fa8bfc2aba3532f5427398329b386a Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Sat, 9 Nov 2024 17:48:44 +0100 Subject: single merge: Improve inside root check for symlinks with targets --- .../java/org/the_jk/cleversync/io/SingleMerge.kt | 42 ++++++++++++++++++---- 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'libs/io') diff --git a/libs/io/src/main/java/org/the_jk/cleversync/io/SingleMerge.kt b/libs/io/src/main/java/org/the_jk/cleversync/io/SingleMerge.kt index 3fd73b4..1b868c0 100644 --- a/libs/io/src/main/java/org/the_jk/cleversync/io/SingleMerge.kt +++ b/libs/io/src/main/java/org/the_jk/cleversync/io/SingleMerge.kt @@ -138,7 +138,7 @@ object SingleMerge { visited: Set, ) { val linkTarget = sourceLink.resolve() - if (!context.options.resolveLinks && insideRoot(context.root, path, linkTarget.path)) { + if (!context.options.resolveLinks && insideRoot(context.root, path, linkTarget)) { if (targetContent == null) { actions.add(Action.Link(sourceLink.name, linkTarget.path)) } else { @@ -194,11 +194,41 @@ object SingleMerge { } } - @Suppress("UNUSED_PARAMETER") - private fun insideRoot(root: Directory, path: String, linkTarget: String): Boolean { - val fakeRoot = "/--root--" - val resolved = PathUtils.resolve(PathUtils.join(PathUtils.join(fakeRoot, path.substring(1)), linkTarget)) - return resolved.startsWith("$fakeRoot/") + private fun insideRoot(root: Directory, path: String, linkTarget: Link.LinkTarget): Boolean { + return when (linkTarget) { + is Link.NoTarget -> { + val fakeRoot = "/--root--" + val resolved = PathUtils.resolve( + PathUtils.join( + PathUtils.join( + fakeRoot, + path.substring(1) + ), linkTarget.path + ) + ) + resolved.startsWith("$fakeRoot/") + } + + is Link.DirectoryTarget -> { + root.openDir( + PathUtils.resolve( + PathUtils.join( + path.substring(1), + linkTarget.path + ), + ), + ) == linkTarget.directory + } + is Link.FileTarget -> + root.openFile( + PathUtils.resolve( + PathUtils.join( + path.substring(1), + linkTarget.path, + ), + ), + ) == linkTarget.file + } } data class Options( -- cgit v1.2.3-70-g09d2