diff options
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) |
