diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2024-10-14 23:09:08 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2024-10-14 23:09:08 +0200 |
| commit | 4af8bed1fe533f6a0371da32c8e2c0ec5c81ebbf (patch) | |
| tree | 8cb6e7a2a83b6b661db879ac6b0750b266b919f3 /libs/sftp/src/main | |
| parent | ea9621389bfa62cb4e63688249c52ac0e41ff282 (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.
Diffstat (limited to 'libs/sftp/src/main')
| -rw-r--r-- | libs/sftp/src/main/java/org/the_jk/cleversync/io/sftp/SftpLink.kt | 27 |
1 files changed, 15 insertions, 12 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) } } |
