Skip to content

Commit 4cbd113

Browse files
authored
Merge pull request #316 from modelix/fix/bulk-sync-included-modules
MODELIX-588 includedModules are not taken into account for the direction model-server -> MPS
2 parents a22bb44 + 4b60d35 commit 4cbd113

File tree

7 files changed

+353
-237
lines changed

7 files changed

+353
-237
lines changed

bulk-model-sync-gradle-test/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ modelSync {
107107
}
108108
}
109109
direction("testPull") {
110+
includeModule("GraphSolution")
110111
fromModelServer {
111112
url = "http://0.0.0.0:${Main.DEFAULT_PORT}/v2"
112113
repositoryId = "ci-test"

bulk-model-sync-gradle/src/main/kotlin/org/modelix/model/sync/bulk/gradle/ModelSyncGradlePlugin.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ class ModelSyncGradlePlugin : Plugin<Project> {
113113
it.repositoryId.set(serverSource.repositoryId)
114114
it.branchName.set(serverSource.branchName)
115115
it.revision.set(serverSource.revision)
116+
it.includedModules.set(syncDirection.includedModules)
117+
it.includedModulePrefixes.set(syncDirection.includedModulePrefixes)
116118
}
117119
return exportFromModelServer
118120
}
@@ -173,6 +175,8 @@ class ModelSyncGradlePlugin : Plugin<Project> {
173175
it.url.set(serverTarget.url)
174176
it.repositoryId.set(serverTarget.repositoryId)
175177
it.branchName.set(serverTarget.branchName)
178+
it.includedModules.set(syncDirection.includedModules)
179+
it.includedModulePrefixes.set(syncDirection.includedModulePrefixes)
176180
}
177181

178182
project.tasks.register("runSync${syncDirection.name.replaceFirstChar { it.uppercaseChar() }}") {

bulk-model-sync-gradle/src/main/kotlin/org/modelix/model/sync/bulk/gradle/tasks/ExportFromModelServer.kt

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@ import org.gradle.api.DefaultTask
2121
import org.gradle.api.file.DirectoryProperty
2222
import org.gradle.api.model.ObjectFactory
2323
import org.gradle.api.provider.Property
24+
import org.gradle.api.provider.SetProperty
2425
import org.gradle.api.tasks.Input
2526
import org.gradle.api.tasks.Optional
2627
import org.gradle.api.tasks.OutputDirectory
2728
import org.gradle.api.tasks.TaskAction
2829
import org.modelix.model.ModelFacade
2930
import org.modelix.model.api.BuiltinLanguages
3031
import org.modelix.model.api.IBranch
32+
import org.modelix.model.api.INode
3133
import org.modelix.model.api.PBranch
3234
import org.modelix.model.api.getRootNode
3335
import org.modelix.model.client2.IModelClientV2
@@ -36,6 +38,7 @@ import org.modelix.model.client2.ModelClientV2PlatformSpecificBuilder
3638
import org.modelix.model.client2.getReplicatedModel
3739
import org.modelix.model.lazy.RepositoryId
3840
import org.modelix.model.sync.bulk.ModelExporter
41+
import org.modelix.model.sync.bulk.isModuleIncluded
3942
import javax.inject.Inject
4043

4144
abstract class ExportFromModelServer @Inject constructor(of: ObjectFactory) : DefaultTask() {
@@ -58,33 +61,52 @@ abstract class ExportFromModelServer @Inject constructor(of: ObjectFactory) : De
5861
@OutputDirectory
5962
val outputDir: DirectoryProperty = of.directoryProperty()
6063

64+
@Input
65+
val includedModules: SetProperty<String> = of.setProperty(String::class.java)
66+
67+
@Input
68+
val includedModulePrefixes: SetProperty<String> = of.setProperty(String::class.java)
69+
6170
@TaskAction
6271
fun export() {
63-
val client = ModelClientV2PlatformSpecificBuilder()
72+
val modelClient = ModelClientV2PlatformSpecificBuilder()
6473
.url(url.get())
6574
.build()
75+
modelClient.use { client ->
76+
runBlocking { client.init() }
6677

67-
runBlocking { client.init() }
78+
val branch = if (revision.isPresent) {
79+
getBranchByRevision(client)
80+
} else {
81+
getBranchByRepoIdAndBranch(client)
82+
}
6883

69-
val branch = if (revision.isPresent) {
70-
getBranchByRevision(client)
71-
} else {
72-
getBranchByRepoIdAndBranch(client)
73-
}
84+
branch.runRead {
85+
val root = branch.getRootNode()
86+
logger.info("Got root node: {}", root)
87+
val outputDir = outputDir.get().asFile
7488

75-
branch.runRead {
76-
val root = branch.getRootNode()
77-
logger.info("Got root node: {}", root)
78-
val outputDir = outputDir.get().asFile
79-
root.allChildren.forEach {
80-
val nameRole = BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name
81-
val fileName = it.getPropertyValue(nameRole)
82-
val outputFile = outputDir.resolve("$fileName.json")
83-
ModelExporter(it).export(outputFile)
89+
getIncludedModules(root).forEach {
90+
val fileName = it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name)
91+
val outputFile = outputDir.resolve("$fileName.json")
92+
ModelExporter(it).export(outputFile)
93+
}
8494
}
8595
}
8696
}
8797

98+
private fun getIncludedModules(root: INode): Iterable<INode> {
99+
val nameRole = BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name
100+
101+
return root.allChildren.filter {
102+
val isModule = it.concept?.getUID() == BuiltinLanguages.MPSRepositoryConcepts.Module.getUID()
103+
val moduleName = it.getPropertyValue(nameRole) ?: return@filter false
104+
val isIncluded = isModuleIncluded(moduleName, includedModules.get(), includedModulePrefixes.get())
105+
106+
isModule && isIncluded
107+
}
108+
}
109+
88110
private fun getBranchByRepoIdAndBranch(client: ModelClientV2): IBranch {
89111
val repoId = RepositoryId(repositoryId.get())
90112
val branchRef = ModelFacade.createBranchReference(repoId, branchName.get())

bulk-model-sync-gradle/src/main/kotlin/org/modelix/model/sync/bulk/gradle/tasks/GenerateAntScriptForMps.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ package org.modelix.model.sync.bulk.gradle.tasks
1919
import org.gradle.api.DefaultTask
2020
import org.gradle.api.file.RegularFileProperty
2121
import org.gradle.api.model.ObjectFactory
22-
import org.gradle.api.provider.ListProperty
2322
import org.gradle.api.provider.Property
23+
import org.gradle.api.provider.SetProperty
2424
import org.gradle.api.tasks.CacheableTask
2525
import org.gradle.api.tasks.Input
2626
import org.gradle.api.tasks.Optional
@@ -55,10 +55,10 @@ abstract class GenerateAntScriptForMps @Inject constructor(of: ObjectFactory) :
5555
val antScriptFile: RegularFileProperty = of.fileProperty()
5656

5757
@Input
58-
val includedModules: ListProperty<String> = of.listProperty(String::class.java)
58+
val includedModules: SetProperty<String> = of.setProperty(String::class.java)
5959

6060
@Input
61-
val includedModulePrefixes: ListProperty<String> = of.listProperty(String::class.java)
61+
val includedModulePrefixes: SetProperty<String> = of.setProperty(String::class.java)
6262

6363
@Optional
6464
@Input

bulk-model-sync-gradle/src/main/kotlin/org/modelix/model/sync/bulk/gradle/tasks/ImportIntoModelServer.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import org.modelix.model.client2.runWrite
3535
import org.modelix.model.lazy.RepositoryId
3636
import org.modelix.model.sync.bulk.ModelImporter
3737
import org.modelix.model.sync.bulk.importFilesAsRootChildren
38+
import org.modelix.model.sync.bulk.isModuleIncluded
3839
import javax.inject.Inject
3940

4041
abstract class ImportIntoModelServer @Inject constructor(of: ObjectFactory) : DefaultTask() {
@@ -55,6 +56,12 @@ abstract class ImportIntoModelServer @Inject constructor(of: ObjectFactory) : De
5556
@Input
5657
val registeredLanguages: SetProperty<ILanguage> = of.setProperty(ILanguage::class.java)
5758

59+
@Input
60+
val includedModules: SetProperty<String> = of.setProperty(String::class.java)
61+
62+
@Input
63+
val includedModulePrefixes: SetProperty<String> = of.setProperty(String::class.java)
64+
5865
@TaskAction
5966
fun import() {
6067
registeredLanguages.get().forEach {
@@ -66,8 +73,10 @@ abstract class ImportIntoModelServer @Inject constructor(of: ObjectFactory) : De
6673

6774
val branchRef = ModelFacade.createBranchReference(repoId, branchName.get())
6875
val client = ModelClientV2PlatformSpecificBuilder().url(url.get()).build()
69-
val files = inputDir.listFiles()?.filter { it.extension == "json" }
70-
if (files.isNullOrEmpty()) error("no json files found")
76+
val files = inputDir.listFiles()?.filter {
77+
it.extension == "json" && isModuleIncluded(it.nameWithoutExtension, includedModules.get(), includedModulePrefixes.get())
78+
}
79+
if (files.isNullOrEmpty()) error("no json files found for included modules")
7180

7281
runBlocking {
7382
client.init()

bulk-model-sync-lib/src/commonMain/kotlin/org/modelix/model/sync/bulk/Util.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,20 @@ import org.modelix.model.api.BuiltinLanguages
2121
import org.modelix.model.data.ModelData
2222
import org.modelix.model.data.NodeData
2323

24+
/**
25+
* Checks if a module is included in the sync.
26+
*
27+
* @param moduleName name of the module to be checked
28+
* @param includedModules collection of included module names
29+
* @param includedPrefixes collection of included module name prefixes
30+
*/
31+
fun isModuleIncluded(moduleName: String, includedModules: Collection<String>, includedPrefixes: Collection<String>): Boolean {
32+
val includedDirectly = includedModules.contains(moduleName)
33+
val includedByPrefix = includedPrefixes.any { prefix -> moduleName.startsWith(prefix) }
34+
35+
return includedDirectly || includedByPrefix
36+
}
37+
2438
fun mergeModelData(models: Collection<ModelData>): ModelData {
2539
return ModelData(root = NodeData(children = models.map { it.root }))
2640
}

0 commit comments

Comments
 (0)