[Scripting] Take local repository path from settings if it exists
This commit is contained in:
+1
-4
@@ -40,9 +40,6 @@ class MavenDependenciesResolver : ExternalDependenciesResolver {
|
|||||||
return repositoryCoordinates.toRepositoryUrlOrNull() != null
|
return repositoryCoordinates.toRepositoryUrlOrNull() != null
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: make robust
|
|
||||||
val localRepo = File(File(System.getProperty("user.home")!!, ".m2"), "repository")
|
|
||||||
|
|
||||||
val repos: ArrayList<RemoteRepository> = arrayListOf()
|
val repos: ArrayList<RemoteRepository> = arrayListOf()
|
||||||
|
|
||||||
private fun remoteRepositories() = if (repos.isEmpty()) arrayListOf(mavenCentral) else repos
|
private fun remoteRepositories() = if (repos.isEmpty()) arrayListOf(mavenCentral) else repos
|
||||||
@@ -65,7 +62,7 @@ class MavenDependenciesResolver : ExternalDependenciesResolver {
|
|||||||
val classifier = options.classifier
|
val classifier = options.classifier
|
||||||
val extension = options.extension
|
val extension = options.extension
|
||||||
val deps = AetherResolveSession(
|
val deps = AetherResolveSession(
|
||||||
localRepo, remoteRepositories()
|
null, remoteRepositories()
|
||||||
).resolve(
|
).resolve(
|
||||||
artifactId, dependencyScopes.joinToString(","), transitive, null, classifier, extension
|
artifactId, dependencyScopes.joinToString(","), transitive, null, classifier, extension
|
||||||
)
|
)
|
||||||
|
|||||||
+7
-54
@@ -5,12 +5,8 @@
|
|||||||
|
|
||||||
package kotlin.script.experimental.dependencies.maven.impl
|
package kotlin.script.experimental.dependencies.maven.impl
|
||||||
|
|
||||||
import org.apache.commons.io.filefilter.NameFileFilter
|
|
||||||
import org.apache.maven.repository.internal.MavenRepositorySystemUtils
|
import org.apache.maven.repository.internal.MavenRepositorySystemUtils
|
||||||
import org.apache.maven.settings.Settings
|
import org.apache.maven.settings.Settings
|
||||||
import org.apache.maven.settings.SettingsUtils
|
|
||||||
import org.apache.maven.settings.TrackableBase
|
|
||||||
import org.apache.maven.settings.building.*
|
|
||||||
import org.apache.maven.wagon.Wagon
|
import org.apache.maven.wagon.Wagon
|
||||||
import org.codehaus.plexus.DefaultContainerConfiguration
|
import org.codehaus.plexus.DefaultContainerConfiguration
|
||||||
import org.codehaus.plexus.DefaultPlexusContainer
|
import org.codehaus.plexus.DefaultPlexusContainer
|
||||||
@@ -43,16 +39,19 @@ import org.eclipse.aether.util.repository.AuthenticationBuilder
|
|||||||
import org.eclipse.aether.util.repository.DefaultMirrorSelector
|
import org.eclipse.aether.util.repository.DefaultMirrorSelector
|
||||||
import org.eclipse.aether.util.repository.DefaultProxySelector
|
import org.eclipse.aether.util.repository.DefaultProxySelector
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileFilter
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
val mavenCentral: RemoteRepository = RemoteRepository.Builder("maven central", "default", "https://repo.maven.apache.org/maven2/").build()
|
val mavenCentral: RemoteRepository = RemoteRepository.Builder("maven central", "default", "https://repo.maven.apache.org/maven2/").build()
|
||||||
|
|
||||||
internal class AetherResolveSession(
|
internal class AetherResolveSession(
|
||||||
private val localRepo: File = File(File(System.getProperty("user.home")!!, ".m2"), "repository"),
|
localRepoDirectory: File? = null,
|
||||||
remoteRepos: List<RemoteRepository> = listOf(mavenCentral)
|
remoteRepos: List<RemoteRepository> = listOf(mavenCentral)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
private val localRepoPath by lazy {
|
||||||
|
localRepoDirectory?.absolutePath ?: settings.localRepository
|
||||||
|
}
|
||||||
|
|
||||||
private val remotes by lazy {
|
private val remotes by lazy {
|
||||||
val proxySelector = settings.activeProxy?.let { proxy ->
|
val proxySelector = settings.activeProxy?.let { proxy ->
|
||||||
val selector = DefaultProxySelector()
|
val selector = DefaultProxySelector()
|
||||||
@@ -125,7 +124,7 @@ internal class AetherResolveSession(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val repositorySystemSession: RepositorySystemSession by lazy {
|
private val repositorySystemSession: RepositorySystemSession by lazy {
|
||||||
val localRepo = LocalRepository(localRepo.absolutePath)
|
val localRepo = LocalRepository(localRepoPath)
|
||||||
MavenRepositorySystemUtils.newSession().also {
|
MavenRepositorySystemUtils.newSession().also {
|
||||||
it.localRepositoryManager = repositorySystem.newLocalRepositoryManager(it, localRepo)
|
it.localRepositoryManager = repositorySystem.newLocalRepositoryManager(it, localRepo)
|
||||||
}
|
}
|
||||||
@@ -236,52 +235,6 @@ internal class AetherResolveSession(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val settings: Settings by lazy {
|
private val settings: Settings by lazy {
|
||||||
val builder: SettingsBuilder = DefaultSettingsBuilderFactory().newInstance()
|
createMavenSettings()
|
||||||
val request: SettingsBuildingRequest = DefaultSettingsBuildingRequest()
|
|
||||||
val user = System.getProperty("org.apache.maven.user-settings")
|
|
||||||
if (user == null) {
|
|
||||||
request.userSettingsFile = File(
|
|
||||||
File(System.getProperty("user.home")).absoluteFile,
|
|
||||||
"/.m2/settings.xml"
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
request.userSettingsFile = File(user)
|
|
||||||
}
|
|
||||||
val global = System.getProperty("org.apache.maven.global-settings")
|
|
||||||
if (global != null) {
|
|
||||||
request.globalSettingsFile = File(global)
|
|
||||||
}
|
|
||||||
val result: SettingsBuildingResult = try {
|
|
||||||
builder.build(request)
|
|
||||||
} catch (ex: SettingsBuildingException) {
|
|
||||||
throw IllegalStateException(ex)
|
|
||||||
}
|
|
||||||
this.invokers(builder, result)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun invokers(
|
|
||||||
builder: SettingsBuilder,
|
|
||||||
result: SettingsBuildingResult
|
|
||||||
): Settings {
|
|
||||||
var main = result.effectiveSettings
|
|
||||||
val files = File(System.getProperty("user.dir"))
|
|
||||||
.parentFile?.listFiles(
|
|
||||||
NameFileFilter("interpolated-settings.xml") as FileFilter
|
|
||||||
)
|
|
||||||
val settingsFile = files?.singleOrNull()
|
|
||||||
if (settingsFile != null) {
|
|
||||||
val irequest =
|
|
||||||
DefaultSettingsBuildingRequest()
|
|
||||||
irequest.userSettingsFile = settingsFile
|
|
||||||
main = try {
|
|
||||||
val isettings = builder.build(irequest)
|
|
||||||
.effectiveSettings
|
|
||||||
SettingsUtils.merge(isettings, main, TrackableBase.USER_LEVEL)
|
|
||||||
isettings
|
|
||||||
} catch (ex: SettingsBuildingException) {
|
|
||||||
throw java.lang.IllegalStateException(ex)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return main
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+96
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kotlin.script.experimental.dependencies.maven.impl
|
||||||
|
|
||||||
|
import org.apache.commons.io.filefilter.NameFileFilter
|
||||||
|
import org.apache.maven.settings.DefaultMavenSettingsBuilder
|
||||||
|
import org.apache.maven.settings.Settings
|
||||||
|
import org.apache.maven.settings.SettingsUtils
|
||||||
|
import org.apache.maven.settings.TrackableBase
|
||||||
|
import org.apache.maven.settings.building.*
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileFilter
|
||||||
|
|
||||||
|
fun createMavenSettings(): Settings {
|
||||||
|
val builder: SettingsBuilder = DefaultSettingsBuilderFactory().newInstance()
|
||||||
|
val request: SettingsBuildingRequest = DefaultSettingsBuildingRequest()
|
||||||
|
val user = System.getProperty("org.apache.maven.user-settings")
|
||||||
|
if (user == null) {
|
||||||
|
request.userSettingsFile = File(
|
||||||
|
File(System.getProperty("user.home")).absoluteFile,
|
||||||
|
".m2/settings.xml"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
request.userSettingsFile = File(user)
|
||||||
|
}
|
||||||
|
val global = System.getProperty("org.apache.maven.global-settings")
|
||||||
|
if (global != null) {
|
||||||
|
request.globalSettingsFile = File(global)
|
||||||
|
}
|
||||||
|
val result: SettingsBuildingResult = try {
|
||||||
|
builder.build(request)
|
||||||
|
} catch (ex: SettingsBuildingException) {
|
||||||
|
throw IllegalStateException(ex)
|
||||||
|
}
|
||||||
|
return invokers(builder, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun invokers(
|
||||||
|
builder: SettingsBuilder,
|
||||||
|
result: SettingsBuildingResult
|
||||||
|
): Settings {
|
||||||
|
var main = result.effectiveSettings
|
||||||
|
val files = File(System.getProperty("user.dir"))
|
||||||
|
.parentFile?.listFiles(
|
||||||
|
NameFileFilter("interpolated-settings.xml") as FileFilter
|
||||||
|
)
|
||||||
|
val settingsFile = files?.singleOrNull()
|
||||||
|
if (settingsFile != null) {
|
||||||
|
val irequest =
|
||||||
|
DefaultSettingsBuildingRequest()
|
||||||
|
irequest.userSettingsFile = settingsFile
|
||||||
|
main = try {
|
||||||
|
val isettings = builder.build(irequest)
|
||||||
|
.effectiveSettings
|
||||||
|
SettingsUtils.merge(isettings, main, TrackableBase.USER_LEVEL)
|
||||||
|
isettings
|
||||||
|
} catch (ex: SettingsBuildingException) {
|
||||||
|
throw java.lang.IllegalStateException(ex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main.localRepository = getFilePath(main.localRepository ?: "\${user.home}/.m2/repository")
|
||||||
|
|
||||||
|
return main
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get file path from a string pattern
|
||||||
|
*
|
||||||
|
* Implementation is mostly copied from [DefaultMavenSettingsBuilder.getFile]
|
||||||
|
*/
|
||||||
|
private fun getFilePath(filePattern: String): String {
|
||||||
|
return substitutePropertiesValues(filePattern) { propertyValue ->
|
||||||
|
propertyValue
|
||||||
|
.replace('\\', '/')
|
||||||
|
.replace("$", "\\$")
|
||||||
|
}.replace('\\', '/')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This pattern is built in [DefaultMavenSettingsBuilder.getFile] only for
|
||||||
|
* one property (basedirSysProp). We allow any system variable name here.
|
||||||
|
*/
|
||||||
|
private val systemPropertyPattern = Regex("\\$\\{([^{}\$]+)}")
|
||||||
|
|
||||||
|
private fun substitutePropertiesValues(pattern: String, propValueMapper: (String) -> String = { it }): String {
|
||||||
|
return systemPropertyPattern
|
||||||
|
.replace(pattern) { match ->
|
||||||
|
val propName = match.groups[1]?.value.orEmpty().trim()
|
||||||
|
val propValue: String? = System.getProperty(propName)
|
||||||
|
propValueMapper(propValue.orEmpty())
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
@@ -21,6 +21,7 @@ import kotlin.script.experimental.dependencies.impl.SimpleExternalDependenciesRe
|
|||||||
import kotlin.script.experimental.dependencies.impl.makeExternalDependenciesResolverOptions
|
import kotlin.script.experimental.dependencies.impl.makeExternalDependenciesResolverOptions
|
||||||
import kotlin.script.experimental.dependencies.impl.set
|
import kotlin.script.experimental.dependencies.impl.set
|
||||||
import kotlin.script.experimental.dependencies.maven.MavenDependenciesResolver
|
import kotlin.script.experimental.dependencies.maven.MavenDependenciesResolver
|
||||||
|
import kotlin.script.experimental.dependencies.maven.impl.createMavenSettings
|
||||||
|
|
||||||
@ExperimentalContracts
|
@ExperimentalContracts
|
||||||
class MavenResolverTest : ResolversTestBase() {
|
class MavenResolverTest : ResolversTestBase() {
|
||||||
@@ -55,6 +56,11 @@ class MavenResolverTest : ResolversTestBase() {
|
|||||||
|
|
||||||
private val resolvedKotlinVersion = "1.5.31"
|
private val resolvedKotlinVersion = "1.5.31"
|
||||||
|
|
||||||
|
fun testDefaultSettings() {
|
||||||
|
val settings = createMavenSettings()
|
||||||
|
assertNotNull(settings.localRepository)
|
||||||
|
}
|
||||||
|
|
||||||
fun testResolveSimple() {
|
fun testResolveSimple() {
|
||||||
resolveAndCheck("org.jetbrains.kotlin:kotlin-annotations-jvm:$resolvedKotlinVersion") { files ->
|
resolveAndCheck("org.jetbrains.kotlin:kotlin-annotations-jvm:$resolvedKotlinVersion") { files ->
|
||||||
files.any { it.name.startsWith("kotlin-annotations-jvm") }
|
files.any { it.name.startsWith("kotlin-annotations-jvm") }
|
||||||
|
|||||||
Reference in New Issue
Block a user