From cf3bf5a9b9eb9088e16c558838e0245ad132369c Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 16 Oct 2019 18:10:07 +0300 Subject: [PATCH] [minor] Fix files and jars pattern matching on windows --- .../jvm/util/jvmClassLoaderUtil.kt | 4 ++-- .../script/experimental/jvm/test/utilsTest.kt | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt index 3f82c3c4778..f4fcd85c589 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt @@ -59,10 +59,10 @@ private fun Char.escape(): String = (if (this == '\\' || patternCharsToEscape.co internal val pathSeparatorChars = "/".let { if (File.separatorChar == '/') it else it + File.separator }.toCharArray() internal val pathElementPattern = if (File.separatorChar == '/') "[^/]*" else "[^/${File.separatorChar.escape()}]*" -internal val pathSeparatorPattern = if (File.separatorChar == '/') "/" else "[/${File.separatorChar.escape()}]." +internal val pathSeparatorPattern = if (File.separatorChar == '/') "/" else "[/${File.separatorChar.escape()}]" internal val specialPatternChars = patternCharsToEscape + pathSeparatorChars -private fun String.toUniversalSeparator(): String = if (File.separatorChar == '/') this else replace(File.separatorChar, '/') +internal fun String.toUniversalSeparator(): String = if (File.separatorChar == '/') this else replace(File.separatorChar, '/') internal fun forAllMatchingFilesInDirectory(baseDir: File, namePattern: String, body: (String, InputStream) -> Unit) { val patternStart = namePattern.indexOfAny(wildcardChars) diff --git a/libraries/scripting/jvm/test/kotlin/script/experimental/jvm/test/utilsTest.kt b/libraries/scripting/jvm/test/kotlin/script/experimental/jvm/test/utilsTest.kt index c158ff9d538..32614a36e78 100644 --- a/libraries/scripting/jvm/test/kotlin/script/experimental/jvm/test/utilsTest.kt +++ b/libraries/scripting/jvm/test/kotlin/script/experimental/jvm/test/utilsTest.kt @@ -20,7 +20,7 @@ class UtilsTest : TestCase() { assertPattern("a$pathSeparatorPattern$pathElementPattern\\.txt", "a/*.txt") assertPattern("a$pathSeparatorPattern.*${pathSeparatorPattern}b", "a/**/b") assertPattern("a${pathSeparatorPattern}b.\\.txt", "a/b?.txt") - assertPattern("$pathElementPattern/b\\.txt", "*/b.txt") + assertPattern("$pathElementPattern${pathSeparatorPattern}b\\.txt", "*/b.txt") assertPattern(".*${pathSeparatorPattern}b\\.txt", "**/b.txt") } @@ -35,13 +35,21 @@ class UtilsTest : TestCase() { val rootDir = File(".") - fun assertProjectFilesBy(pattern: String, vararg paths: String) { + fun assertProjectFilesBy(pattern: String, vararg paths: String, trace: Boolean = false) { val res = ArrayList>() forAllMatchingFilesInDirectory(rootDir, pattern) { path, stream -> res.add(path to stream.reader().readText()) } - assertEquals(paths.toSet(), res.mapTo(HashSet()) { it.first }) + if (trace && paths.toSet() != res.mapTo(HashSet()) { it.first }) { + val re = namePatternToRegex(pattern) + val files = rootDir.walkTopDown().map { + it.relativeToOrSelf(rootDir).path + } + fail("Unable to match '${re.pattern}' with files:\n ${files.joinToString("\n ")}") + } else { + assertEquals(paths.toSet(), res.mapTo(HashSet()) { it.first }) + } res.forEach { (path, bytes) -> val data = File(path).readText() @@ -63,7 +71,7 @@ class UtilsTest : TestCase() { "src/kotlin/script/experimental/jvm/util/jvm*LoaderUtil.kt", "src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt" ) - assertProjectFilesBy("**/jvmClassLoaderUtil.kt", "src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt") + assertProjectFilesBy("**/jvmClassLoaderUtil.kt", "src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt", trace = true) assertProjectFilesBy("**/script/**/jvmClassLoaderUtil.kt", "src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt") assertProjectFilesBy("src/**/jvmClassLoaderUtil.kt", "src/kotlin/script/experimental/jvm/util/jvmClassLoaderUtil.kt") assertProjectFilesBy("test/**/?????Test.*", "test/kotlin/script/experimental/jvm/test/utilsTest.kt") @@ -76,7 +84,7 @@ class UtilsTest : TestCase() { rootDir.walkTopDown().filter { it.relativeToOrSelf(rootDir).path.startsWith("src") && it.extension == "kt" }.mapTo(HashSet()) { - it.relativeToOrSelf(rootDir).path + it.relativeToOrSelf(rootDir).path.toUniversalSeparator() } assertEquals(allExpectedSrcKtFiles, allSrcKtFiles) }