Preserve child identity in inheritance history
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package engine
|
||||
|
||||
import (
|
||||
"slices"
|
||||
"sort"
|
||||
|
||||
"gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
@@ -114,7 +115,7 @@ func projectedInheritanceChanges(query Path, operation inheritanceOperation) []C
|
||||
return []Change{{Path: operation.control.path.clone(), Origin: origin,
|
||||
Dependencies: []Path{operation.control.path.clone()}}}
|
||||
}
|
||||
if operation.transfer == nil || !pathsIntersect(operation.transfer.to, query) {
|
||||
if operation.transfer == nil || !pathsIntersect(operation.transfer.to, query) || inheritanceOperationIdentity(operation, query) {
|
||||
return nil
|
||||
}
|
||||
path := query
|
||||
@@ -155,6 +156,9 @@ func projectedInheritanceChanges(query Path, operation inheritanceOperation) []C
|
||||
}
|
||||
|
||||
func transferredOperationOrigin(operation inheritanceOperation, destination Path) (Origin, bool) {
|
||||
if inheritanceOperationIdentity(operation, destination) {
|
||||
return Origin{}, false
|
||||
}
|
||||
relative, ok := relativeHistoryPath(operation.transfer.to, destination)
|
||||
if !ok {
|
||||
return Origin{}, false
|
||||
@@ -168,3 +172,12 @@ func transferredOperationOrigin(operation inheritanceOperation, destination Path
|
||||
operation.transfer.from, operation.transfer.to, *operation.transfer)
|
||||
return transferred[destination.String()], true
|
||||
}
|
||||
|
||||
func inheritanceOperationIdentity(operation inheritanceOperation, path Path) bool {
|
||||
if operation.transfer == nil || len(operation.identityFields) == 0 {
|
||||
return false
|
||||
}
|
||||
relative, within := relativeHistoryPath(operation.transfer.to, path)
|
||||
return within && len(relative.segments) != 0 && relative.segments[0].kind != pathSegmentIndex &&
|
||||
slices.Contains(operation.identityFields, relative.segments[0].key)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user