Skip to content

Commit 25ce160

Browse files
committed
fix(bulk-model-sync-gradle): add missing includedModules checks for model-server tasks
1 parent 315cafa commit 25ce160

File tree

4 files changed

+55
-5
lines changed

4 files changed

+55
-5
lines changed

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: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import kotlinx.coroutines.runBlocking
2020
import org.gradle.api.DefaultTask
2121
import org.gradle.api.file.DirectoryProperty
2222
import org.gradle.api.model.ObjectFactory
23+
import org.gradle.api.provider.ListProperty
2324
import org.gradle.api.provider.Property
2425
import org.gradle.api.tasks.Input
2526
import org.gradle.api.tasks.Optional
@@ -28,6 +29,7 @@ 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,6 +61,12 @@ abstract class ExportFromModelServer @Inject constructor(of: ObjectFactory) : De
5861
@OutputDirectory
5962
val outputDir: DirectoryProperty = of.directoryProperty()
6063

64+
@Input
65+
val includedModules: ListProperty<String> = of.listProperty(String::class.java)
66+
67+
@Input
68+
val includedModulePrefixes: ListProperty<String> = of.listProperty(String::class.java)
69+
6170
@TaskAction
6271
fun export() {
6372
val client = ModelClientV2PlatformSpecificBuilder()
@@ -76,15 +85,27 @@ abstract class ExportFromModelServer @Inject constructor(of: ObjectFactory) : De
7685
val root = branch.getRootNode()
7786
logger.info("Got root node: {}", root)
7887
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)
88+
89+
getIncludedModules(root).forEach {
90+
val fileName = it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name)
8291
val outputFile = outputDir.resolve("$fileName.json")
8392
ModelExporter(it).export(outputFile)
8493
}
8594
}
8695
}
8796

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

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import kotlinx.coroutines.runBlocking
2020
import org.gradle.api.DefaultTask
2121
import org.gradle.api.file.DirectoryProperty
2222
import org.gradle.api.model.ObjectFactory
23+
import org.gradle.api.provider.ListProperty
2324
import org.gradle.api.provider.Property
2425
import org.gradle.api.provider.SetProperty
2526
import org.gradle.api.tasks.Input
@@ -35,6 +36,7 @@ import org.modelix.model.client2.runWrite
3536
import org.modelix.model.lazy.RepositoryId
3637
import org.modelix.model.sync.bulk.ModelImporter
3738
import org.modelix.model.sync.bulk.importFilesAsRootChildren
39+
import org.modelix.model.sync.bulk.isModuleIncluded
3840
import javax.inject.Inject
3941

4042
abstract class ImportIntoModelServer @Inject constructor(of: ObjectFactory) : DefaultTask() {
@@ -55,6 +57,12 @@ abstract class ImportIntoModelServer @Inject constructor(of: ObjectFactory) : De
5557
@Input
5658
val registeredLanguages: SetProperty<ILanguage> = of.setProperty(ILanguage::class.java)
5759

60+
@Input
61+
val includedModules: ListProperty<String> = of.listProperty(String::class.java)
62+
63+
@Input
64+
val includedModulePrefixes: ListProperty<String> = of.listProperty(String::class.java)
65+
5866
@TaskAction
5967
fun import() {
6068
registeredLanguages.get().forEach {
@@ -66,8 +74,10 @@ abstract class ImportIntoModelServer @Inject constructor(of: ObjectFactory) : De
6674

6775
val branchRef = ModelFacade.createBranchReference(repoId, branchName.get())
6876
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")
77+
val files = inputDir.listFiles()?.filter {
78+
it.extension == "json" && isModuleIncluded(it.nameWithoutExtension, includedModules.get(), includedModulePrefixes.get())
79+
}
80+
if (files.isNullOrEmpty()) error("no json files found for included modules")
7181

7282
runBlocking {
7383
client.init()

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

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

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

0 commit comments

Comments
 (0)