Improve resolve and resolveSibling for relative paths.
This commit is contained in:
@@ -366,8 +366,7 @@ public fun File.normalize(): File {
|
|||||||
for (file in components.fileList) {
|
for (file in components.fileList) {
|
||||||
val name = file.toString()
|
val name = file.toString()
|
||||||
when (name) {
|
when (name) {
|
||||||
"." -> {
|
"." -> {}
|
||||||
}
|
|
||||||
".." -> if (!list.isEmpty() && list.get(list.size - 1) != "..") list.removeAt(list.size - 1) else list.add(name)
|
".." -> if (!list.isEmpty() && list.get(list.size - 1) != "..") list.removeAt(list.size - 1) else list.add(name)
|
||||||
else -> list.add(name)
|
else -> list.add(name)
|
||||||
}
|
}
|
||||||
@@ -387,8 +386,8 @@ public fun File.normalize(): File {
|
|||||||
public fun File.resolve(relative: File): File {
|
public fun File.resolve(relative: File): File {
|
||||||
if (relative.root != null)
|
if (relative.root != null)
|
||||||
return relative
|
return relative
|
||||||
val ourName = toString()
|
val baseName = this.toString()
|
||||||
return if (ourName.endsWith(File.separatorChar)) File(ourName + relative) else File(ourName + File.separatorChar + relative)
|
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 {
|
public fun File.resolveSibling(relative: File): File {
|
||||||
val components = filePathComponents()
|
val components = filePathComponents()
|
||||||
|
val parentSubPath = if (components.size() == 0) File("..") else components.subPath(0, components.size() - 1)
|
||||||
val rootName = components.rootName
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -235,6 +235,7 @@ class FilesTest {
|
|||||||
File("C:\\home\\..\\documents\\..\\windows").normalize().separatorsToSystem())
|
File("C:\\home\\..\\documents\\..\\windows").normalize().separatorsToSystem())
|
||||||
assertEquals(File("C:/windows"), File("C:/home/../documents/../windows").normalize())
|
assertEquals(File("C:/windows"), File("C:/home/../documents/../windows").normalize())
|
||||||
assertEquals(File("foo"), File("gav/bar/../../foo").normalize())
|
assertEquals(File("foo"), File("gav/bar/../../foo").normalize())
|
||||||
|
assertEquals(File("/../foo"), File("/bar/../../foo").normalize())
|
||||||
}
|
}
|
||||||
|
|
||||||
@test fun resolve() {
|
@test fun resolve() {
|
||||||
@@ -246,6 +247,14 @@ class FilesTest {
|
|||||||
File("C:\\Users\\Me").resolve("Documents\\important.doc").separatorsToSystem())
|
File("C:\\Users\\Me").resolve("Documents\\important.doc").separatorsToSystem())
|
||||||
assertEquals(File("C:/Users/Me/Documents/important.doc"),
|
assertEquals(File("C:/Users/Me/Documents/important.doc"),
|
||||||
File("C:/Users/Me").resolve("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() {
|
@test fun resolveSibling() {
|
||||||
@@ -257,6 +266,8 @@ class FilesTest {
|
|||||||
File("C:\\Users\\Me\\profile.ini").resolveSibling("Documents\\important.doc").separatorsToSystem())
|
File("C:\\Users\\Me\\profile.ini").resolveSibling("Documents\\important.doc").separatorsToSystem())
|
||||||
assertEquals(File("C:/Users/Me/Documents/important.doc"),
|
assertEquals(File("C:/Users/Me/Documents/important.doc"),
|
||||||
File("C:/Users/Me/profile.ini").resolveSibling("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() {
|
@test fun extension() {
|
||||||
|
|||||||
Reference in New Issue
Block a user