Skip to content

Commit 1c9e0d4

Browse files
committed
fix(bulk-model-sync-gradle): fix up-to-date check of ExportFromModelServer
The new task GetRevisionInfo determines the revision during the execution phase. Now the task will only be marked as out-of-date, if the revision changed.
1 parent d3c2f20 commit 1c9e0d4

File tree

4 files changed

+119
-27
lines changed

4 files changed

+119
-27
lines changed

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

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.modelix.model.sync.bulk.gradle.config.ServerSource
2929
import org.modelix.model.sync.bulk.gradle.config.ServerTarget
3030
import org.modelix.model.sync.bulk.gradle.config.SyncDirection
3131
import org.modelix.model.sync.bulk.gradle.tasks.ExportFromModelServer
32+
import org.modelix.model.sync.bulk.gradle.tasks.GetRevisionInfo
3233
import org.modelix.model.sync.bulk.gradle.tasks.ImportIntoModelServer
3334
import org.modelix.model.sync.bulk.gradle.tasks.ValidateSyncSettings
3435
import java.io.File
@@ -95,15 +96,32 @@ class ModelSyncGradlePlugin : Plugin<Project> {
9596
jsonDir: File,
9697
): TaskProvider<*> {
9798
val serverSource = syncDirection.source as ServerSource
99+
val revisionFile = jsonDir.resolve(".modelix_revision").also { it.createNewFile() }
98100

99-
val name = "${syncDirection.name}ExportFromModelServer"
100-
val exportFromModelServer = project.tasks.register(name, ExportFromModelServer::class.java) {
101+
val getRevisionInfo = project.tasks.register(
102+
"${syncDirection.name}GetRevisionInfo",
103+
GetRevisionInfo::class.java,
104+
) {
101105
it.dependsOn(previousTask)
102-
it.outputDir.set(jsonDir)
103-
it.url.set(serverSource.url)
106+
107+
it.serverUrl.set(serverSource.url)
108+
it.revision.set(serverSource.revision)
104109
it.repositoryId.set(serverSource.repositoryId)
105110
it.branchName.set(serverSource.branchName)
106-
it.revision.set(serverSource.revision)
111+
it.revisionFile.set(revisionFile)
112+
113+
it.outputs.upToDateWhen { serverSource.revision != null }
114+
}
115+
116+
val exportFromModelServer = project.tasks.register(
117+
"${syncDirection.name}ExportFromModelServer",
118+
ExportFromModelServer::class.java,
119+
) {
120+
it.dependsOn(getRevisionInfo)
121+
it.url.set(serverSource.url)
122+
it.repositoryId.set(serverSource.repositoryId)
123+
it.revisionFile.set(revisionFile)
124+
it.outputDir.set(jsonDir)
107125
it.includedModules.set(syncDirection.includedModules)
108126
it.includedModulePrefixes.set(syncDirection.includedModulePrefixes)
109127
it.requestTimeoutSeconds.set(serverSource.requestTimeoutSeconds)

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

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,20 @@ package org.modelix.model.sync.bulk.gradle.tasks
1919
import kotlinx.coroutines.runBlocking
2020
import org.gradle.api.DefaultTask
2121
import org.gradle.api.file.DirectoryProperty
22+
import org.gradle.api.file.RegularFileProperty
2223
import org.gradle.api.model.ObjectFactory
2324
import org.gradle.api.provider.Property
2425
import org.gradle.api.provider.SetProperty
2526
import org.gradle.api.tasks.Input
27+
import org.gradle.api.tasks.InputFile
2628
import org.gradle.api.tasks.Optional
2729
import org.gradle.api.tasks.OutputDirectory
2830
import org.gradle.api.tasks.TaskAction
2931
import org.modelix.model.api.BuiltinLanguages
3032
import org.modelix.model.api.INode
3133
import org.modelix.model.api.PBranch
3234
import org.modelix.model.api.getRootNode
33-
import org.modelix.model.client2.ModelClientV2
3435
import org.modelix.model.client2.ModelClientV2PlatformSpecificBuilder
35-
import org.modelix.model.lazy.BranchReference
3636
import org.modelix.model.lazy.RepositoryId
3737
import org.modelix.model.sync.bulk.ModelExporter
3838
import org.modelix.model.sync.bulk.isModuleIncluded
@@ -48,13 +48,8 @@ abstract class ExportFromModelServer @Inject constructor(of: ObjectFactory) : De
4848
@Optional
4949
val repositoryId: Property<String> = of.property(String::class.java)
5050

51-
@Input
52-
@Optional
53-
val branchName: Property<String> = of.property(String::class.java)
54-
55-
@Input
56-
@Optional
57-
val revision: Property<String> = of.property(String::class.java)
51+
@get:InputFile
52+
val revisionFile: RegularFileProperty = of.fileProperty()
5853

5954
@OutputDirectory
6055
val outputDir: DirectoryProperty = of.directoryProperty()
@@ -68,17 +63,26 @@ abstract class ExportFromModelServer @Inject constructor(of: ObjectFactory) : De
6863
@Input
6964
val requestTimeoutSeconds: Property<Int> = of.property(Int::class.java)
7065

71-
private fun getBranchReference(): BranchReference = RepositoryId(repositoryId.get()).getBranchReference(branchName.get())
72-
7366
@TaskAction
7467
fun export() = runBlocking {
7568
val modelClient = ModelClientV2PlatformSpecificBuilder()
7669
.url(url.get())
7770
.requestTimeout(requestTimeoutSeconds.get().seconds)
7871
.build()
72+
73+
val revision = revisionFile.get().asFile.readText()
74+
7975
modelClient.use { client ->
8076
client.init()
81-
val branch = loadDataAsBranch(client)
77+
val version = if (repositoryId.isPresent) {
78+
client.loadVersion(RepositoryId(repositoryId.get()), revision, null)
79+
} else {
80+
logger.warn("Specifying a repositoryId will be mandatory in the future.")
81+
client.loadVersion(revision, null)
82+
}
83+
84+
val branch = PBranch(version.getTree(), client.getIdGenerator())
85+
8286
branch.runRead {
8387
val root = branch.getRootNode()
8488
logger.info("Got root node: {}", root)
@@ -93,16 +97,6 @@ abstract class ExportFromModelServer @Inject constructor(of: ObjectFactory) : De
9397
}
9498
}
9599

96-
private suspend fun loadDataAsBranch(client: ModelClientV2): PBranch {
97-
val version = if (revision.isPresent) {
98-
client.loadVersion(revision.get(), null)
99-
} else {
100-
client.pull(getBranchReference(), null)
101-
}
102-
val branch = PBranch(version.getTree(), client.getIdGenerator())
103-
return branch
104-
}
105-
106100
private fun getIncludedModules(root: INode): Iterable<INode> {
107101
val nameRole = BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name
108102

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright (c) 2024.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.modelix.model.sync.bulk.gradle.tasks
18+
19+
import kotlinx.coroutines.runBlocking
20+
import org.gradle.api.DefaultTask
21+
import org.gradle.api.file.RegularFileProperty
22+
import org.gradle.api.provider.Property
23+
import org.gradle.api.tasks.Input
24+
import org.gradle.api.tasks.Optional
25+
import org.gradle.api.tasks.OutputFile
26+
import org.gradle.api.tasks.TaskAction
27+
import org.modelix.model.client2.ModelClientV2
28+
import org.modelix.model.lazy.RepositoryId
29+
30+
/**
31+
* Determines which revision needs to be pulled from the model server.
32+
* The determined revision is written to [revisionFile].
33+
*/
34+
abstract class GetRevisionInfo : DefaultTask() {
35+
36+
@get:Input
37+
abstract val serverUrl: Property<String>
38+
39+
@get:Input
40+
abstract val repositoryId: Property<String>
41+
42+
@get:Input
43+
abstract val branchName: Property<String>
44+
45+
@get:Input
46+
@get:Optional
47+
abstract val revision: Property<String>
48+
49+
@get:OutputFile
50+
abstract val revisionFile: RegularFileProperty
51+
52+
@TaskAction
53+
fun getRevisionInfo() {
54+
val revision = determineRevision()
55+
logger.info("Revision to be synced: $revision")
56+
revisionFile.get().asFile.writeText(revision)
57+
}
58+
59+
private fun determineRevision(): String {
60+
if (revision.isPresent) {
61+
return revision.get()
62+
}
63+
64+
logger.info("Pulling versionHash from server...")
65+
val modelClient = ModelClientV2.builder().url(serverUrl.get()).build()
66+
val branchRef = RepositoryId(repositoryId.get()).getBranchReference(branchName.get())
67+
68+
return runBlocking {
69+
modelClient.use {
70+
it.init()
71+
it.pullHash(branchRef)
72+
}
73+
}
74+
}
75+
}

docs/global/modules/core/pages/reference/component-bulk-model-sync-gradle.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ mpsBuild {
115115
|===
116116

117117
=== ServerSource/-Target configuration
118+
[WARNING]
119+
--
120+
In the future you will be required to specify a `repositoryId` along the`revision`.
121+
--
118122
[%header, cols="1,1,2"]
119123
|===
120124
|setting
@@ -153,6 +157,7 @@ Only available in ServerTarget.
153157

154158
|===
155159

160+
156161
== Example
157162

158163
[source,kotlin]

0 commit comments

Comments
 (0)