[maven][IDEA-353631] do not reimport project if all maven projects gathered during static sync stage already present

GitOrigin-RevId: 4bc4b2b9a8c83aff77914835ff2dfa9bc108a29e
This commit is contained in:
Alexander Bubenchikov
2024-06-25 10:21:35 +00:00
committed by intellij-monorepo-bot
parent 9445102cb6
commit 0076d7e78f
3 changed files with 107 additions and 32 deletions
@@ -44,14 +44,16 @@ import java.util.concurrent.ConcurrentHashMap
class MavenProjectStaticImporter(val project: Project, val coroutineScope: CoroutineScope) {
private val localRepo = MavenProjectsManager.getInstance(project).localRepository
suspend fun syncStatic(rootProjectFiles: List<VirtualFile>,
optionalModelsProvider: IdeModifiableModelsProvider?,
importingSettings: MavenImportingSettings,
generalSettings: MavenGeneralSettings,
reimportExistingFiles: Boolean,
visitor: MavenStructureProjectVisitor,
parentActivity: StructuredIdeActivity,
commit: Boolean): PreimportResult {
suspend fun syncStatic(
rootProjectFiles: List<VirtualFile>,
optionalModelsProvider: IdeModifiableModelsProvider?,
importingSettings: MavenImportingSettings,
generalSettings: MavenGeneralSettings,
reimportExistingFiles: Boolean,
visitor: MavenStructureProjectVisitor,
parentActivity: StructuredIdeActivity,
commit: Boolean,
): PreimportResult {
val activity = PREIMPORT_ACTIVITY.startedWithParent(project, parentActivity)
val statisticsData = StatisticsData(project, rootProjectFiles.size)
try {
@@ -66,13 +68,13 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou
val projectTree = MavenProjectsTree(project)
val roots = ArrayList<MavenProject>()
val mavenProjectMappings = HashMap<MavenProject, List<MavenProject>>()
val allProjects = ArrayList<MavenProject>()
val allProjects = forest.flatMap { it.projects() }.toList()
visitor.map(allProjects)
val projectChanges = HashMap<MavenProject, MavenProjectChanges>()
val existingTree = if (!commit) null else MavenProjectsManager.getInstance(project).let { if (it.isMavenizedProject) it.projectsTree else null }
forest.forEach { tree ->
mavenProjectMappings.putAll(tree.mavenProjectMappings())
allProjects.addAll(tree.projects())
tree.root?.let(roots::add)
if (existingTree == null || reimportExistingFiles) {
@@ -83,9 +85,14 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou
tree.projects().filter { existingTree.findProject(it.file) == null }.associateWith { MavenProjectChanges.ALL })
}
}
visitor.map(allProjects);
if (!commit) return PreimportResult.empty(project);
statisticsData.add(forest, allProjects)
if (!commit) return PreimportResult.empty(project)
if (existingTree != null && allProjects.all { existingTree.findProject(it.mavenId) != null }) {
return PreimportResult.empty(project)
}
projectTree.updater()
@@ -106,7 +113,6 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou
parentActivity)
importer.importProject()
statisticsData.add(forest, allProjects)
return@blockingContext importer.createdModules()
}
@@ -252,9 +258,11 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou
})
}
private fun CoroutineScope.interpolate(project: MavenProjectData,
tree: ProjectTree,
interpolatedCache: ConcurrentHashMap<VirtualFile, Deferred<MavenProjectData>>): Deferred<MavenProjectData> = async {
private fun CoroutineScope.interpolate(
project: MavenProjectData,
tree: ProjectTree,
interpolatedCache: ConcurrentHashMap<VirtualFile, Deferred<MavenProjectData>>,
): Deferred<MavenProjectData> = async {
val myDeferred = CompletableDeferred<MavenProjectData>()
try {
@@ -326,8 +334,10 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou
}
private fun applyParentProperties(parentInterpolated: MavenProjectData,
project: MavenProjectData) {
private fun applyParentProperties(
parentInterpolated: MavenProjectData,
project: MavenProjectData,
) {
parentInterpolated.properties.forEach {
project.properties.putIfAbsent(it.key, it.value)
@@ -406,10 +416,12 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou
}
private fun CoroutineScope.readRecursively(parentModel: Element,
aggregatorProjectFile: VirtualFile,
aggregatorProject: MavenProjectData,
tree: ProjectTree): Job = this.launch Read@{
private fun CoroutineScope.readRecursively(
parentModel: Element,
aggregatorProjectFile: VirtualFile,
aggregatorProject: MavenProjectData,
tree: ProjectTree,
): Job = this.launch Read@{
val modulesList = parentModel.getChildrenText("modules", "module")
modulesList.forEach {
this.launch {
@@ -549,9 +561,11 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou
.map(Path::toString)
}
private fun resolveKotlinPlugin(mavenProjectData: MavenProjectData,
sources: ArrayList<String>,
testSources: ArrayList<String>) {
private fun resolveKotlinPlugin(
mavenProjectData: MavenProjectData,
sources: ArrayList<String>,
testSources: ArrayList<String>,
) {
val kotlinPlugin = findPlugin(mavenProjectData, "org.jetbrains.kotlin", "kotlin-maven-plugin")
if (kotlinPlugin != null) {
sources.add("src/main/kotlin")
@@ -559,9 +573,11 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou
}
}
private fun resolveBuildHelperPlugin(mavenProjectData: MavenProjectData,
sources: ArrayList<String>,
testSources: ArrayList<String>) {
private fun resolveBuildHelperPlugin(
mavenProjectData: MavenProjectData,
sources: ArrayList<String>,
testSources: ArrayList<String>,
) {
val executions = findPlugin(mavenProjectData, "org.codehaus.mojo", "build-helper-maven-plugin")?.executions
if (executions.isNullOrEmpty()) return
@@ -620,7 +636,7 @@ private class StatisticsData(val project: Project, val rootProjects: Int) {
val modulesBefore = (WorkspaceModel.getInstance(project).currentSnapshot as ImmutableEntityStorageInstrumentation)
.entityCount(ModuleEntity::class.java)
fun add(forest: List<ProjectTree>, allProjects: ArrayList<MavenProject>) {
fun add(forest: List<ProjectTree>, allProjects: List<MavenProject>) {
val time = System.currentTimeMillis()
try {
linkedProject = forest.size
@@ -49,8 +49,10 @@ abstract class AbstractMavenStaticSyncTest : MavenMultiVersionImportingTestCase(
override suspend fun importProjectsAsync(files: List<VirtualFile>) {
val activity = ProjectImportCollector.IMPORT_ACTIVITY.started(project)
try {
MavenProjectStaticImporter.getInstance(project)
val result = MavenProjectStaticImporter.getInstance(project)
.syncStatic(files, null, mavenImporterSettings, mavenGeneralSettings, true, SimpleStructureProjectVisitor(), activity, true)
projectsManager.initForTests()
projectsManager.projectsTree.updater().copyFrom(result.projectTree)
}
finally {
activity.finished()
@@ -5,6 +5,7 @@ import com.intellij.openapi.application.readAction
import com.intellij.openapi.module.LanguageLevelUtil
import com.intellij.openapi.roots.DependencyScope
import com.intellij.pom.java.LanguageLevel
import com.intellij.testFramework.UsefulTestCase
import kotlinx.coroutines.runBlocking
import org.junit.Test
@@ -595,8 +596,8 @@ class MavenStaticSyncTest : AbstractMavenStaticSyncTest() {
</parent>
""".trimIndent())
val projects = projectsManager.projects
assertEmpty(projects)
val projects = projectsManager.projects.map { it.mavenId.displayString }
UsefulTestCase.assertSameElements(projects, "group:parent:1")
}
@Test
@@ -773,4 +774,60 @@ class MavenStaticSyncTest : AbstractMavenStaticSyncTest() {
"jar://" + repositoryPath + "/somedep/somedep/4.0/somedep-4.0-sources.jar!/",
"jar://" + repositoryPath + "/somedep/somedep/4.0/somedep-4.0-javadoc.jar!/")
}
@Test
fun testReimportProjectsIfModulesDeclaredInDefaultProfile() = runBlocking {
createModulePom("m1", """
<parent>
<groupId>test</groupId>
<artifactId>project</artifactId>
<version>1</version>
</parent>
<artifactId>m1</artifactId>
""")
createModulePom("m2", """
<parent>
<groupId>test</groupId>
<artifactId>project</artifactId>
<version>1</version>
</parent>
<artifactId>m2</artifactId>
""")
importProjectAsync("""
<groupId>test</groupId>
<artifactId>project</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>m1</module>
<module>m2</module>
</modules>
""".trimIndent())
assertModules("project", "m1", "m2")
importProjectAsync("""
<groupId>test</groupId>
<artifactId>project</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>m1</module>
</modules>
<profiles>
<profile>
<id>myprofile</id>
<activation>
<property>
<name>!someVarName</name>
</property>
</activation>
<modules>
<module>m2</module>
</modules>
</profile>
</profiles>
""".trimIndent())
assertModules("project", "m1", "m2")
}
}