diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2024-11-09 17:48:44 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2024-11-09 17:48:44 +0100 |
| commit | f5aa9ba724fa8bfc2aba3532f5427398329b386a (patch) | |
| tree | 7f25f5f87f23869dc8a9cf2a13a0355f4d9a479a /libs/io/src/main/java | |
| parent | 3f6024d20ccca7afcd4b0612fad6271c38540bf0 (diff) | |
single merge: Improve inside root check for symlinks with targets
Diffstat (limited to 'libs/io/src/main/java')
| -rw-r--r-- | libs/io/src/main/java/org/the_jk/cleversync/io/SingleMerge.kt | 42 |
1 files changed, 36 insertions, 6 deletions
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<Directory>, ) { 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( |
