Files

64 lines
1.6 KiB
Go

package author
import (
"aego/scene/prefab"
"aego/schema"
)
type Conflict struct {
Node prefab.Key
Prop prefab.PropKey
Before schema.Value
After schema.Value
Mine schema.Value
}
func Rebase(lib prefab.Library, o prefab.Overrides, oldP, newP *prefab.Node) (prefab.Overrides, []Conflict, error) {
base, _, err := prefab.Expand(lib, newP, nil)
if err != nil {
return prefab.Overrides{}, nil, err
}
tree, orph, err := prefab.Expand(lib, newP, &o)
if err != nil {
return prefab.Overrides{}, nil, err
}
out := prefab.Diff(tree, base)
out.Merge(o.Orphans())
out.Merge(orph)
out.Sort()
if oldP == nil || oldP == newP {
return out, nil, nil
}
before, _, err := prefab.Expand(lib, oldP, nil)
if err != nil {
return out, nil, err
}
return out, conflicts(out, before, base), nil
}
func Normalize(lib prefab.Library, p *prefab.Node, o prefab.Overrides) (prefab.Overrides, error) {
out, _, err := Rebase(lib, o, p, p)
return out, err
}
func Same(a, b prefab.Overrides) bool {
return prefab.FormatOverrides(a) == prefab.FormatOverrides(b)
}
func conflicts(o prefab.Overrides, before, after *prefab.Node) []Conflict {
bn, _ := prefab.Index(before)
an, _ := prefab.Index(after)
var out []Conflict
for _, p := range o.Props {
if p.Orphan || (p.Node == after.Key && p.Prop.Owner == prefab.OwnerTransform) {
continue
}
bv, okb := bn[p.Node].Get(p.Prop)
av, oka := an[p.Node].Get(p.Prop)
if okb && oka && !prefab.Equal(bv, av) {
out = append(out, Conflict{Node: p.Node, Prop: p.Prop, Before: bv, After: av, Mine: p.Value})
}
}
return out
}