diff --git a/libraries/scripting/dependencies-maven/src/kotlin/script/experimental/dependencies/maven/MavenDependenciesResolver.kt b/libraries/scripting/dependencies-maven/src/kotlin/script/experimental/dependencies/maven/MavenDependenciesResolver.kt index ba02b5477f1..416fcae06ce 100644 --- a/libraries/scripting/dependencies-maven/src/kotlin/script/experimental/dependencies/maven/MavenDependenciesResolver.kt +++ b/libraries/scripting/dependencies-maven/src/kotlin/script/experimental/dependencies/maven/MavenDependenciesResolver.kt @@ -88,11 +88,8 @@ class MavenDependenciesResolver : ExternalDependenciesResolver { ): ResultWithDiagnostics { val url = repositoryCoordinates.toRepositoryUrlOrNull() ?: return false.asSuccess() - val repo = RemoteRepository.Builder( - repositoryCoordinates.string, - "default", - url.toString() - ) + val repoId = repositoryCoordinates.string.replace(FORBIDDEN_CHARS, "_") + val repo = RemoteRepository.Builder(repoId, "default", url.toString()) if (repositoryCoordinates is MavenRepositoryCoordinates) { val username = repositoryCoordinates.username?.let(::tryResolveEnvironmentVariable) val password = repositoryCoordinates.password?.let(::tryResolveEnvironmentVariable) @@ -109,4 +106,14 @@ class MavenDependenciesResolver : ExternalDependenciesResolver { repos.add(repo.build()) return true.asSuccess() } + + companion object { + /** + * These characters are forbidden in Windows, Linux or Mac file names. + * As the repository ID is used in metadata filename generation + * (see [org.eclipse.aether.internal.impl.SimpleLocalRepositoryManager.getRepositoryKey]), + * they should be replaced with an allowed character. + */ + private val FORBIDDEN_CHARS = Regex("[/\\\\:<>\"|?*]") + } } \ No newline at end of file diff --git a/libraries/scripting/dependencies-maven/test/kotlin/script/experimental/test/MavenResolverTest.kt b/libraries/scripting/dependencies-maven/test/kotlin/script/experimental/test/MavenResolverTest.kt index b9222561f6f..9b66fac03a0 100644 --- a/libraries/scripting/dependencies-maven/test/kotlin/script/experimental/test/MavenResolverTest.kt +++ b/libraries/scripting/dependencies-maven/test/kotlin/script/experimental/test/MavenResolverTest.kt @@ -81,6 +81,18 @@ class MavenResolverTest : ResolversTestBase() { } } + // Ignored - tests with custom repos often break the CI due to the caching issues + // TODO: find a way to enable it back + @Ignore + fun ignore_testCustomRepositoryId() { + val resolver = MavenDependenciesResolver() + resolver.addRepository("https://repo.osgeo.org/repository/release/") + val files = runBlocking { + resolver.resolve("org.geotools:gt-shapefile:[23,)") + }.valueOrThrow() + assertTrue(files.any { it.name.startsWith("gt-shapefile") }) + } + // Ignored - tests with custom repos often break the CI due to the caching issues // TODO: find a way to enable it back @Ignore