From 9f5a972816ccf5abac93ad1e49f542cd3d0db6e4 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Wed, 2 Dec 2015 21:49:14 +0300 Subject: [PATCH] Improve resolve and resolveSibling for relative paths. --- libraries/stdlib/src/kotlin/io/files/Utils.kt | 10 +++++----- libraries/stdlib/test/io/Files.kt | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/libraries/stdlib/src/kotlin/io/files/Utils.kt b/libraries/stdlib/src/kotlin/io/files/Utils.kt index 3c1ac8bcd7d..9db45580fb4 100644 --- a/libraries/stdlib/src/kotlin/io/files/Utils.kt +++ b/libraries/stdlib/src/kotlin/io/files/Utils.kt @@ -366,8 +366,7 @@ public fun File.normalize(): File { for (file in components.fileList) { val name = file.toString() when (name) { - "." -> { - } + "." -> {} ".." -> if (!list.isEmpty() && list.get(list.size - 1) != "..") list.removeAt(list.size - 1) else list.add(name) else -> list.add(name) } @@ -387,8 +386,8 @@ public fun File.normalize(): File { public fun File.resolve(relative: File): File { if (relative.root != null) return relative - val ourName = toString() - return if (ourName.endsWith(File.separatorChar)) File(ourName + relative) else File(ourName + File.separatorChar + relative) + val baseName = this.toString() + return if (baseName.isEmpty() || baseName.endsWith(File.separatorChar)) File(baseName + relative) else File(baseName + File.separatorChar + relative) } /** @@ -409,8 +408,9 @@ public fun File.resolve(relative: String): File = resolve(File(relative)) */ public fun File.resolveSibling(relative: File): File { val components = filePathComponents() + val parentSubPath = if (components.size() == 0) File("..") else components.subPath(0, components.size() - 1) val rootName = components.rootName - return if (components.size() == 0) relative else File(rootName).resolve(components.subPath(0, components.size() - 1)).resolve(relative) + return File(rootName).resolve(parentSubPath).resolve(relative) } /** diff --git a/libraries/stdlib/test/io/Files.kt b/libraries/stdlib/test/io/Files.kt index 8301da9a0b4..344c087fd08 100644 --- a/libraries/stdlib/test/io/Files.kt +++ b/libraries/stdlib/test/io/Files.kt @@ -235,6 +235,7 @@ class FilesTest { File("C:\\home\\..\\documents\\..\\windows").normalize().separatorsToSystem()) assertEquals(File("C:/windows"), File("C:/home/../documents/../windows").normalize()) assertEquals(File("foo"), File("gav/bar/../../foo").normalize()) + assertEquals(File("/../foo"), File("/bar/../../foo").normalize()) } @test fun resolve() { @@ -246,6 +247,14 @@ class FilesTest { File("C:\\Users\\Me").resolve("Documents\\important.doc").separatorsToSystem()) assertEquals(File("C:/Users/Me/Documents/important.doc"), File("C:/Users/Me").resolve("Documents/important.doc")) + + assertEquals(File(""), File("").resolve("")) + assertEquals(File("bar"), File("").resolve("bar")) + assertEquals(File("foo/bar"), File("foo").resolve("bar")) + // should it normalize such paths? +// assertEquals(File("bar"), File("foo").resolve("../bar")) +// assertEquals(File("../bar"), File("foo").resolve("../../bar")) +// assertEquals(File("foo/bar"), File("foo").resolve("./bar")) } @test fun resolveSibling() { @@ -257,6 +266,8 @@ class FilesTest { File("C:\\Users\\Me\\profile.ini").resolveSibling("Documents\\important.doc").separatorsToSystem()) assertEquals(File("C:/Users/Me/Documents/important.doc"), File("C:/Users/Me/profile.ini").resolveSibling("Documents/important.doc")) + assertEquals(File("gav"), File("foo").resolveSibling("gav")) + assertEquals(File("../gav"), File("").resolveSibling("gav")) } @test fun extension() {