@@ -26,6 +26,7 @@ import org.modelix.model.server.store.RequiresTransaction
26
26
import org.modelix.model.server.store.StoreManager
27
27
import org.modelix.model.server.store.assertWrite
28
28
import org.modelix.model.server.store.pollEntry
29
+ import org.modelix.model.server.store.runReadIO
29
30
import org.modelix.streams.IExecutableStream
30
31
import org.modelix.streams.IStream
31
32
import org.modelix.streams.SimpleStreamExecutor
@@ -158,7 +159,8 @@ class RepositoriesManager(val stores: StoreManager) : IRepositoriesManager {
158
159
id = stores.idGenerator.generate(),
159
160
time = Clock .System .now().epochSeconds.toString(),
160
161
author = userName,
161
- tree = CLTree (null , null , stores.getLegacyObjectStore(repositoryId.takeIf { isolated }), useRoleIds = useRoleIds),
162
+ tree = CLTree .builder(stores.getAsyncStore(repositoryId.takeIf { isolated }))
163
+ .useRoleIds(useRoleIds).build(),
162
164
baseVersion = null ,
163
165
operations = emptyArray(),
164
166
)
@@ -243,13 +245,33 @@ class RepositoriesManager(val stores: StoreManager) : IRepositoriesManager {
243
245
override fun mergeChanges (branch : BranchReference , newVersionHash : String ): String {
244
246
val headHash = getVersionHash(branch)
245
247
if (headHash == newVersionHash) return headHash
246
- val legacyObjectStore = getLegacyObjectStore(branch.repositoryId)
247
- val newVersion = CLVersion .loadFromHash(newVersionHash, legacyObjectStore)
248
+ val mergedHash = validateAndMerge(newVersionHash, headHash, branch.repositoryId)
249
+ ensureBranchInList(branch)
250
+ putVersionHash(branch, mergedHash)
251
+ return mergedHash
252
+ }
253
+
254
+ override suspend fun mergeChangesWithoutPush (branch : BranchReference , newVersionHash : String ): String {
255
+ @OptIn(RequiresTransaction ::class )
256
+ val headHash = getTransactionManager().runReadIO {
257
+ getVersionHash(branch)
258
+ }
259
+ return validateAndMerge(newVersionHash, headHash, branch.repositoryId)
260
+ }
261
+
262
+ private fun validateAndMerge (
263
+ newVersionHash : String ,
264
+ headHash : String? ,
265
+ repositoryId : RepositoryId ,
266
+ ): String {
267
+ if (headHash == newVersionHash) return headHash
268
+ val asyncStore = getAsyncStore(repositoryId)
269
+ val newVersion = CLVersion .loadFromHash(newVersionHash, asyncStore)
248
270
val mergedHash = if (headHash == null ) {
249
271
validateVersion(newVersion, null )
250
272
newVersionHash
251
273
} else {
252
- val legacyObjectStore = getLegacyObjectStore(branch. repositoryId)
274
+ val legacyObjectStore = getLegacyObjectStore(repositoryId)
253
275
val headVersion = CLVersion .loadFromHash(headHash, legacyObjectStore)
254
276
require(headVersion.getTree().getId() == newVersion.getTree().getId()) {
255
277
" Attempt to merge a model with ID '${newVersion.getTree().getId()} '" +
@@ -260,8 +282,6 @@ class RepositoriesManager(val stores: StoreManager) : IRepositoriesManager {
260
282
.mergeChange(headVersion, newVersion)
261
283
mergedVersion.getContentHash()
262
284
}
263
- ensureBranchInList(branch)
264
- putVersionHash(branch, mergedHash)
265
285
return mergedHash
266
286
}
267
287
0 commit comments