summaryrefslogtreecommitdiff
path: root/libs/io/src/main/java/org/the_jk
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2024-11-09 17:48:44 +0100
committerJoel Klinghed <the_jk@spawned.biz>2024-11-09 17:48:44 +0100
commitf5aa9ba724fa8bfc2aba3532f5427398329b386a (patch)
tree7f25f5f87f23869dc8a9cf2a13a0355f4d9a479a /libs/io/src/main/java/org/the_jk
parent3f6024d20ccca7afcd4b0612fad6271c38540bf0 (diff)
single merge: Improve inside root check for symlinks with targets
Diffstat (limited to 'libs/io/src/main/java/org/the_jk')
-rw-r--r--libs/io/src/main/java/org/the_jk/cleversync/io/SingleMerge.kt42
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(