1
1
package org.modelix.model.server.handlers
2
2
3
- import com.badoo.reaktive.observable.map
4
3
import kotlinx.coroutines.flow.Flow
5
- import kotlinx.coroutines.flow.map
6
4
import kotlinx.coroutines.flow.onEach
7
5
import kotlinx.datetime.Clock
8
6
import org.modelix.model.ModelMigrations
@@ -19,7 +17,6 @@ import org.modelix.model.lazy.RepositoryId
19
17
import org.modelix.model.lazy.fullDiff
20
18
import org.modelix.model.persistent.HashUtil
21
19
import org.modelix.model.persistent.SerializationUtil
22
- import org.modelix.model.server.api.v2.toMap
23
20
import org.modelix.model.server.store.IRepositoryAwareStore
24
21
import org.modelix.model.server.store.ITransactionManager
25
22
import org.modelix.model.server.store.ObjectInRepository
@@ -240,25 +237,34 @@ class RepositoriesManager(val stores: StoreManager) : IRepositoriesManager {
240
237
@RequiresTransaction
241
238
override fun mergeChanges (branch : BranchReference , newVersionHash : String ): String {
242
239
val headHash = getVersionHash(branch)
240
+ if (headHash == newVersionHash) return headHash
241
+ val legacyObjectStore = getLegacyObjectStore(branch.repositoryId)
242
+ val newVersion = CLVersion (newVersionHash, legacyObjectStore)
243
243
val mergedHash = if (headHash == null ) {
244
+ validateVersion(newVersion, null )
244
245
newVersionHash
245
246
} else {
246
247
val legacyObjectStore = getLegacyObjectStore(branch.repositoryId)
247
248
val headVersion = CLVersion (headHash, legacyObjectStore)
248
- val newVersion = CLVersion (newVersionHash, legacyObjectStore)
249
249
require(headVersion.getTree().getId() == newVersion.getTree().getId()) {
250
250
" Attempt to merge a model with ID '${newVersion.getTree().getId()} '" +
251
251
" into one with ID '${headVersion.getTree().getId()} '"
252
252
}
253
253
val mergedVersion = VersionMerger (legacyObjectStore, stores.idGenerator)
254
254
.mergeChange(headVersion, newVersion)
255
+ validateVersion(newVersion, headVersion)
255
256
mergedVersion.getContentHash()
256
257
}
257
258
ensureBranchInList(branch)
258
259
putVersionHash(branch, mergedHash)
259
260
return mergedHash
260
261
}
261
262
263
+ private fun validateVersion (newVersion : CLVersion , oldVersion : CLVersion ? ) {
264
+ // ensure there are no missing objects
265
+ newVersion.fullDiff(oldVersion).iterateSynchronous { }
266
+ }
267
+
262
268
@RequiresTransaction
263
269
override fun getVersion (branch : BranchReference ): CLVersion ? {
264
270
return getVersionHash(branch)?.let { getVersion(branch.repositoryId, it) }
0 commit comments