summaryrefslogtreecommitdiff
path: root/libs/sftp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/sftp')
-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
2 files changed, 16 insertions, 13 deletions
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])