53 lines
2 KiB
Go
53 lines
2 KiB
Go
|
// Copyright Earl Warren <contact@earl-warren.org>
|
||
|
// Copyright Loïc Dachary <loic@dachary.org>
|
||
|
// SPDX-License-Identifier: MIT
|
||
|
|
||
|
package generic
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"code.forgejo.org/f3/gof3/v3/path"
|
||
|
)
|
||
|
|
||
|
type MirrorOptions struct {
|
||
|
noremap bool
|
||
|
}
|
||
|
|
||
|
func NewMirrorOptions() *MirrorOptions {
|
||
|
return &MirrorOptions{}
|
||
|
}
|
||
|
|
||
|
func (o *MirrorOptions) SetNoRemap(noremap bool) *MirrorOptions {
|
||
|
o.noremap = noremap
|
||
|
return o
|
||
|
}
|
||
|
|
||
|
func NodeMirror(ctx context.Context, origin, destination NodeInterface, options *MirrorOptions) {
|
||
|
origin.Trace("origin '%s' | destination '%s'", origin.GetCurrentPath().ReadableString(), destination.GetCurrentPath().ReadableString())
|
||
|
origin.Trace("start unify references")
|
||
|
for _, reference := range NodeCollectReferences(ctx, origin) {
|
||
|
origin.Trace("unify reference %s", reference)
|
||
|
TreeUnifyPath(ctx, origin.GetTree(), reference, destination.GetTree(), NewUnifyOptions(destination.GetTree()))
|
||
|
}
|
||
|
origin.Trace("end unify references")
|
||
|
originParents := origin.GetParent().GetCurrentPath()
|
||
|
destinationParents := destination.GetParent().GetCurrentPath()
|
||
|
NodeUnify(ctx, origin, originParents, destination, destinationParents, NewUnifyOptions(destination.GetTree()))
|
||
|
}
|
||
|
|
||
|
func TreeMirror(ctx context.Context, originTree, destinationTree TreeInterface, path path.Path, options *MirrorOptions) {
|
||
|
originTree.Trace("'%s'", path.ReadableString())
|
||
|
TreeUnifyPath(ctx, originTree, path, destinationTree, NewUnifyOptions(destinationTree))
|
||
|
TreeParallelApply(ctx, originTree, path, destinationTree, NewParallelApplyOptions(func(ctx context.Context, origin, destination NodeInterface) {
|
||
|
NodeMirror(ctx, origin, destination, NewMirrorOptions())
|
||
|
}))
|
||
|
}
|
||
|
|
||
|
func TreePartialMirror(ctx context.Context, originTree TreeInterface, originPath path.Path, destinationTree TreeInterface, destinationPath path.Path, options *MirrorOptions) {
|
||
|
originTree.Trace("'%s => %s'", originPath, destinationPath)
|
||
|
originNode := originTree.MustFind(originPath)
|
||
|
destinationNode := destinationTree.MustFind(destinationPath)
|
||
|
NodeMirror(ctx, originNode, destinationNode, NewMirrorOptions())
|
||
|
}
|