Wizard: fix invalid repository when downloading jars for JPS

#KT-37956 fixed
This commit is contained in:
Ilya Kirillov
2020-04-06 16:26:17 +03:00
parent 5f917827b5
commit 82a40e3394
10 changed files with 69 additions and 26 deletions
@@ -9,10 +9,12 @@ import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix
import com.intellij.ide.impl.NewProjectUtil import com.intellij.ide.impl.NewProjectUtil
import com.intellij.ide.util.projectWizard.ModuleBuilder import com.intellij.ide.util.projectWizard.ModuleBuilder
import com.intellij.jarRepository.JarRepositoryManager import com.intellij.jarRepository.JarRepositoryManager
import com.intellij.jarRepository.RemoteRepositoryDescription
import com.intellij.openapi.module.ModifiableModuleModel import com.intellij.openapi.module.ModifiableModuleModel
import com.intellij.openapi.module.ModuleTypeId import com.intellij.openapi.module.ModuleTypeId
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.* import com.intellij.openapi.roots.*
import com.intellij.openapi.roots.libraries.ui.OrderRoot
import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtil
import com.intellij.util.PathUtil import com.intellij.util.PathUtil
import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties
@@ -30,6 +32,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetTy
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard
import org.jetbrains.kotlin.tools.projectWizard.wizard.NewProjectWizardModuleBuilder import org.jetbrains.kotlin.tools.projectWizard.wizard.NewProjectWizardModuleBuilder
import org.jetbrains.kotlin.idea.framework.KotlinSdkType import org.jetbrains.kotlin.idea.framework.KotlinSdkType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import java.nio.file.Path import java.nio.file.Path
import java.util.* import java.util.*
import com.intellij.openapi.module.Module as IdeaModule import com.intellij.openapi.module.Module as IdeaModule
@@ -147,18 +150,13 @@ private class ProjectImporter(
module: IdeaModule module: IdeaModule
) { ) {
val artifact = libraryDependency.artifact as? MavenArtifact ?: return val artifact = libraryDependency.artifact as? MavenArtifact ?: return
val libraryProperties = RepositoryLibraryProperties( val (classesRoots, sourcesRoots) = downloadLibraryAndGetItsClasses(libraryDependency, artifact)
artifact.groupId,
artifact.artifactId,
libraryDependency.version.toString()
)
val classesRoots = downloadLibraryAndGetItsClasses(libraryProperties)
ModuleRootModificationUtil.addModuleLibrary( ModuleRootModificationUtil.addModuleLibrary(
module, module,
if (classesRoots.size > 1) libraryProperties.artifactId else null, if (classesRoots.size > 1) artifact.artifactId else null,
OrderEntryFix.refreshAndConvertToUrls(classesRoots), classesRoots,
emptyList(), sourcesRoots,
when (libraryDependency.dependencyType) { when (libraryDependency.dependencyType) {
DependencyType.MAIN -> DependencyScope.COMPILE DependencyType.MAIN -> DependencyScope.COMPILE
DependencyType.TEST -> DependencyScope.TEST DependencyType.TEST -> DependencyScope.TEST
@@ -166,18 +164,50 @@ private class ProjectImporter(
) )
} }
private fun downloadLibraryAndGetItsClasses(libraryProperties: RepositoryLibraryProperties) = private fun downloadLibraryAndGetItsClasses(
JarRepositoryManager.loadDependenciesModal( libraryDependency: LibraryDependencyIR,
artifact: MavenArtifact
): LibraryClassesAndSources {
val libraryProperties = RepositoryLibraryProperties(
artifact.groupId,
artifact.artifactId,
libraryDependency.version.toString()
)
val orderRoots = JarRepositoryManager.loadDependenciesModal(
project, project,
libraryProperties, libraryProperties,
false, true,
false, true,
librariesPath.toString(), librariesPath.toString(),
null listOf(artifact.repository.asJPSRepository())
).asSequence() )
.filter { it.type == OrderRootType.CLASSES }
.map { PathUtil.getLocalPath(it.file) } return LibraryClassesAndSources.fromOrderRoots(orderRoots)
.toList() }
private fun Repository.asJPSRepository() = RemoteRepositoryDescription(
idForMaven,
idForMaven,
url
)
private data class LibraryClassesAndSources(
val classes: List<String>,
val sources: List<String>
) {
companion object {
fun fromOrderRoots(orderRoots: Collection<OrderRoot>) = LibraryClassesAndSources(
orderRoots.filterRootTypes(OrderRootType.CLASSES),
orderRoots.filterRootTypes(OrderRootType.SOURCES)
)
private fun Collection<OrderRoot>.filterRootTypes(rootType: OrderRootType) =
filter { it.type == rootType }
.mapNotNull { PathUtil.getLocalPath(it.file) }
.let(OrderEntryFix::refreshAndConvertToUrls)
}
}
} }
private val Path.url private val Path.url
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal() gradlePluginPortal()
google() google()
jcenter() jcenter()
mavenCentral()
} }
resolutionStrategy { resolutionStrategy {
eachPlugin { eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal() gradlePluginPortal()
google() google()
jcenter() jcenter()
mavenCentral()
} }
resolutionStrategy { resolutionStrategy {
eachPlugin { eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal() gradlePluginPortal()
google() google()
jcenter() jcenter()
mavenCentral()
} }
resolutionStrategy { resolutionStrategy {
eachPlugin { eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal() gradlePluginPortal()
google() google()
jcenter() jcenter()
mavenCentral()
} }
resolutionStrategy { resolutionStrategy {
eachPlugin { eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal() gradlePluginPortal()
google() google()
jcenter() jcenter()
mavenCentral()
} }
resolutionStrategy { resolutionStrategy {
eachPlugin { eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal() gradlePluginPortal()
google() google()
jcenter() jcenter()
mavenCentral()
} }
resolutionStrategy { resolutionStrategy {
eachPlugin { eachPlugin {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.service package org.jetbrains.kotlin.tools.projectWizard.core.service
import org.jetbrains.kotlin.tools.projectWizard.Versions import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
@@ -27,9 +28,12 @@ val Version.kotlinVersionKind
else -> KotlinVersionKind.STABLE else -> KotlinVersionKind.STABLE
} }
enum class KotlinVersionKind(val repository: Repository?) { enum class KotlinVersionKind(val repository: Repository) {
STABLE(repository = null), STABLE(repository = DefaultRepository.MAVEN_CENTRAL),
EAP(repository = Repositories.KOTLIN_EAP_BINTRAY), EAP(repository = Repositories.KOTLIN_EAP_BINTRAY),
DEV(repository = Repositories.KOTLIN_DEV_BINTRAY), DEV(repository = Repositories.KOTLIN_DEV_BINTRAY),
M(repository = Repositories.KOTLIN_EAP_BINTRAY) M(repository = Repositories.KOTLIN_EAP_BINTRAY)
} }
val KotlinVersionKind.isStable
get() = this == KotlinVersionKind.STABLE
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
import org.jetbrains.kotlin.tools.projectWizard.library.LibraryArtifact import org.jetbrains.kotlin.tools.projectWizard.library.LibraryArtifact
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
@@ -9,6 +10,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository.Companion.MAVEN_CENTRAL import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository.Companion.MAVEN_CENTRAL
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModulePath import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModulePath
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
@@ -117,7 +119,7 @@ abstract class KotlinLibraryDependencyIR(
override val artifact: LibraryArtifact override val artifact: LibraryArtifact
get() = MavenArtifact( get() = MavenArtifact(
MAVEN_CENTRAL, version.kotlinVersionKind.repository,
"org.jetbrains.kotlin", "org.jetbrains.kotlin",
"kotlin-$artifactName" "kotlin-$artifactName"
) )
@@ -6,9 +6,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.fold import org.jetbrains.kotlin.tools.projectWizard.core.entity.fold
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.*
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderService
import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
@@ -94,7 +92,10 @@ class KotlinPlugin(context: Context) : Plugin(context) {
val createPluginRepositories by pipelineTask(GenerationPhase.PROJECT_GENERATION) { val createPluginRepositories by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runBefore(BuildSystemPlugin::createModules) runBefore(BuildSystemPlugin::createModules)
withAction { withAction {
val pluginRepository = KotlinPlugin::version.propertyValue.kotlinVersionKind.repository ?: return@withAction UNIT_SUCCESS val pluginRepository = KotlinPlugin::version.propertyValue.kotlinVersionKind
.takeUnless(KotlinVersionKind::isStable)
?.repository
?: return@withAction UNIT_SUCCESS
BuildSystemPlugin::pluginRepositoreis.addValues(pluginRepository) andThen BuildSystemPlugin::pluginRepositoreis.addValues(pluginRepository) andThen
updateBuildFiles { buildFile -> updateBuildFiles { buildFile ->
buildFile.withIrs(RepositoryIR(pluginRepository)).asSuccess() buildFile.withIrs(RepositoryIR(pluginRepository)).asSuccess()