summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2024-10-14 23:09:08 +0200
committerJoel Klinghed <the_jk@spawned.biz>2024-10-14 23:09:08 +0200
commit4af8bed1fe533f6a0371da32c8e2c0ec5c81ebbf (patch)
tree8cb6e7a2a83b6b661db879ac6b0750b266b919f3
parentea9621389bfa62cb4e63688249c52ac0e41ff282 (diff)
Add path to Link
It's implementation specific if path is relative or absolute but it contains the link target. Especially useful for NoTarget.
-rw-r--r--libs/io/src/main/java/org/the_jk/cleversync/io/Link.kt10
-rw-r--r--libs/io/src/main/java/org/the_jk/cleversync/io/ModifiableLink.kt13
-rw-r--r--libs/local/src/main/java/org/the_jk/cleversync/io/local/PathLink.kt12
-rw-r--r--libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpLink.kt27
-rw-r--r--libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SftpTreeTest.kt2
-rw-r--r--libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt32
6 files changed, 60 insertions, 36 deletions
diff --git a/libs/io/src/main/java/org/the_jk/cleversync/io/Link.kt b/libs/io/src/main/java/org/the_jk/cleversync/io/Link.kt
index a20669b..d8a5863 100644
--- a/libs/io/src/main/java/org/the_jk/cleversync/io/Link.kt
+++ b/libs/io/src/main/java/org/the_jk/cleversync/io/Link.kt
@@ -7,9 +7,11 @@ interface Link {
/** read and resolve what link points to */
fun resolve(): LinkTarget
- sealed class LinkTarget
+ sealed interface LinkTarget {
+ val path: String
+ }
- data class DirectoryTarget(val directory: Directory): LinkTarget()
- data class FileTarget(val file: File): LinkTarget()
- data object NoTarget: LinkTarget()
+ data class DirectoryTarget(override val path: String, val directory: Directory): LinkTarget
+ data class FileTarget(override val path: String, val file: File): LinkTarget
+ data class NoTarget(override val path: String): LinkTarget
}
diff --git a/libs/io/src/main/java/org/the_jk/cleversync/io/ModifiableLink.kt b/libs/io/src/main/java/org/the_jk/cleversync/io/ModifiableLink.kt
index 0510137..3d009aa 100644
--- a/libs/io/src/main/java/org/the_jk/cleversync/io/ModifiableLink.kt
+++ b/libs/io/src/main/java/org/the_jk/cleversync/io/ModifiableLink.kt
@@ -11,9 +11,14 @@ interface ModifiableLink : Link {
/** change link to point to target path (doesn't have to exist) */
fun target(name: String)
- sealed class ModifiableLinkTarget
+ sealed interface ModifiableLinkTarget {
+ val path: String
+ }
- data class ModifiableDirectoryTarget(val directory: ModifiableDirectory): ModifiableLinkTarget()
- data class ModifiableFileTarget(val file: ModifiableFile): ModifiableLinkTarget()
- data object NoTarget: ModifiableLinkTarget()
+ data class ModifiableDirectoryTarget(
+ override val path: String,
+ val directory: ModifiableDirectory,
+ ): ModifiableLinkTarget
+ data class ModifiableFileTarget(override val path: String, val file: ModifiableFile): ModifiableLinkTarget
+ data class NoTarget(override val path: String): ModifiableLinkTarget
}
diff --git a/libs/local/src/main/java/org/the_jk/cleversync/io/local/PathLink.kt b/libs/local/src/main/java/org/the_jk/cleversync/io/local/PathLink.kt
index 97cd117..87ab71a 100644
--- a/libs/local/src/main/java/org/the_jk/cleversync/io/local/PathLink.kt
+++ b/libs/local/src/main/java/org/the_jk/cleversync/io/local/PathLink.kt
@@ -19,11 +19,11 @@ internal class PathLink(
override fun modifiableResolve(): ModifiableLink.ModifiableLinkTarget {
val target = path.readSymbolicLink()
return if (target.isDirectory()) {
- ModifiableLink.ModifiableDirectoryTarget(PathDirectory(target.toRealPath(), pathWatcher))
+ ModifiableLink.ModifiableDirectoryTarget(target.toString(), PathDirectory(target.toRealPath(), pathWatcher))
} else if (target.isRegularFile()) {
- ModifiableLink.ModifiableFileTarget(PathFile(target.toRealPath()))
+ ModifiableLink.ModifiableFileTarget(target.toString(), PathFile(target.toRealPath()))
} else {
- ModifiableLink.NoTarget
+ ModifiableLink.NoTarget(target.toString())
}
}
@@ -52,11 +52,11 @@ internal class PathLink(
override fun resolve(): Link.LinkTarget {
val target = path.readSymbolicLink()
return if (target.isDirectory()) {
- Link.DirectoryTarget(PathDirectory(target.toRealPath(), pathWatcher))
+ Link.DirectoryTarget(target.toString(), PathDirectory(target.toRealPath(), pathWatcher))
} else if (target.isRegularFile()) {
- Link.FileTarget(PathFile(target.toRealPath()))
+ Link.FileTarget(target.toString(), PathFile(target.toRealPath()))
} else {
- Link.NoTarget
+ Link.NoTarget(target.toString())
}
}
}
diff --git a/libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpLink.kt b/libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpLink.kt
index 0766f1a..161b5c1 100644
--- a/libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpLink.kt
+++ b/libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpLink.kt
@@ -13,17 +13,18 @@ internal class SftpLink(
override val name: String,
) : ModifiableLink {
override fun modifiableResolve(): ModifiableLink.ModifiableLinkTarget {
- val (newPath, entry) = doResolve()
- if (entry == null) return ModifiableLink.NoTarget
+ val (newPath, firstTarget, entry) = doResolve()
+ if (entry == null) return ModifiableLink.NoTarget(newPath)
return when (entry.type) {
NativeSftp.DirEntryType.DIR ->
- ModifiableLink.ModifiableDirectoryTarget(SftpDirectory(conn, newPath, entry.name))
+ ModifiableLink.ModifiableDirectoryTarget(firstTarget, SftpDirectory(conn, newPath, entry.name))
NativeSftp.DirEntryType.FILE ->
ModifiableLink.ModifiableFileTarget(
+ firstTarget,
SftpFile(conn, newPath, entry.name, entry.size, entry.lastModified),
)
NativeSftp.DirEntryType.LINK ->
- ModifiableLink.NoTarget
+ ModifiableLink.NoTarget(firstTarget)
}
}
@@ -46,15 +47,15 @@ internal class SftpLink(
}
override fun resolve(): Link.LinkTarget {
- val (newPath, entry) = doResolve()
- if (entry == null) return Link.NoTarget
+ val (newPath, firstTarget, entry) = doResolve()
+ if (entry == null) return Link.NoTarget(newPath)
return when (entry.type) {
NativeSftp.DirEntryType.DIR ->
- Link.DirectoryTarget(SftpDirectory(conn, newPath, entry.name))
+ Link.DirectoryTarget(firstTarget, SftpDirectory(conn, newPath, entry.name))
NativeSftp.DirEntryType.FILE ->
- Link.FileTarget(SftpFile(conn, newPath, entry.name, entry.size, entry.lastModified))
+ Link.FileTarget(firstTarget, SftpFile(conn, newPath, entry.name, entry.size, entry.lastModified))
NativeSftp.DirEntryType.LINK ->
- Link.NoTarget
+ Link.NoTarget(firstTarget)
}
}
@@ -62,12 +63,14 @@ internal class SftpLink(
override fun hashCode() = path.hashCode()
override fun toString() = "$conn/$path"
- private fun doResolve(): Pair<String, NativeSftp.DirEntry?> {
+ private fun doResolve(): Triple<String, String, NativeSftp.DirEntry?> {
+ var firstTarget: String? = null
var linkPath = path
- var paths = mutableSetOf(linkPath)
+ val paths = mutableSetOf(linkPath)
var entry: NativeSftp.DirEntry? = null
while (true) {
val target = conn.readLink(linkPath) ?: break
+ if (firstTarget == null) firstTarget = target
linkPath = PathUtils.resolve(
PathUtils.join(PathUtils.dirname(linkPath), target),
)
@@ -75,6 +78,6 @@ internal class SftpLink(
entry = conn.entry(linkPath, followLink = false) ?: break
if (entry.type != NativeSftp.DirEntryType.LINK) break
}
- return linkPath to entry
+ return Triple(linkPath, firstTarget ?: linkPath, entry)
}
}
diff --git a/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SftpTreeTest.kt b/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SftpTreeTest.kt
index 60b25f2..b6b2236 100644
--- a/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SftpTreeTest.kt
+++ b/libs/sftp/src/test/java/org/the_jk/cleversync/sftp/SftpTreeTest.kt
@@ -70,7 +70,7 @@ class SftpTreeTest : TreeAbstractTest() {
assertThat(
when (target) {
is Link.DirectoryTarget -> null
- Link.NoTarget -> null
+ is Link.NoTarget -> null
is Link.FileTarget -> target.file
},
).isEqualTo(content.files[0])
diff --git a/libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt b/libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt
index 84f4ed6..0890199 100644
--- a/libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt
+++ b/libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt
@@ -173,9 +173,10 @@ abstract class TreeAbstractTest {
val link = tree.createLink("link", dir.name)
var target = link.resolve()
when (target) {
- is Link.DirectoryTarget -> assertThat(target.directory).isEqualTo(
- dir
- )
+ is Link.DirectoryTarget -> {
+ assertThat(target.directory).isEqualTo(dir)
+ assertThat(target.path).endsWith("dir")
+ }
is Link.FileTarget -> Assert.fail()
is Link.NoTarget -> Assert.fail()
}
@@ -186,13 +187,16 @@ abstract class TreeAbstractTest {
when (target) {
is Link.DirectoryTarget -> Assert.fail()
is Link.FileTarget -> Assert.fail()
- is Link.NoTarget -> Unit
+ is Link.NoTarget -> assertThat(target.path).endsWith("file")
}
file.write().use { it.write(1) }
target = link.resolve()
when (target) {
is Link.DirectoryTarget -> Assert.fail()
- is Link.FileTarget -> assertThat(target.file).isEqualTo(file)
+ is Link.FileTarget -> {
+ assertThat(target.file).isEqualTo(file)
+ assertThat(target.path).endsWith("file")
+ }
is Link.NoTarget -> Assert.fail()
}
@@ -226,11 +230,21 @@ abstract class TreeAbstractTest {
val link1 = tree.createLink("link1", "foo/bar")
val link2 = tree.createLink("link2", bar)
assertThat(link1.resolve()).isEqualTo(link2.resolve())
- assertThat((link1.resolve() as Link.DirectoryTarget).directory)
- .isEqualTo(bar)
+ when (val target = link1.resolve()) {
+ is Link.DirectoryTarget -> {
+ assertThat(target.directory).isEqualTo(bar)
+ assertThat(target.path).endsWith("foo/bar")
+ }
+ else -> Assert.fail()
+ }
val link3 = foo.createLink("link3", "../link1")
- assertThat((link3.resolve() as Link.DirectoryTarget).directory)
- .isEqualTo(bar)
+ when (val target = link3.resolve()) {
+ is Link.DirectoryTarget -> {
+ assertThat(target.directory).isEqualTo(bar)
+ assertThat(target.path).endsWith("../link1")
+ }
+ else -> Assert.fail()
+ }
}
@Test(timeout = 10000)