mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-08 05:57:03 +09:00
44 lines
890 B
Go
44 lines
890 B
Go
package objecttree
|
|
|
|
import "errors"
|
|
|
|
var ErrLoadBeforeRoot = errors.New("can't load before root")
|
|
|
|
type HistoryTree interface {
|
|
RWLocker
|
|
|
|
Id() string
|
|
Root() *Change
|
|
Heads() []string
|
|
IterateFrom(id string, convert ChangeConvertFunc, iterate ChangeIterateFunc) error
|
|
GetChange(string) (*Change, error)
|
|
}
|
|
|
|
type historyTree struct {
|
|
*objectTree
|
|
}
|
|
|
|
func (h *historyTree) rebuildFromStorage(beforeId string, include bool) (err error) {
|
|
ot := h.objectTree
|
|
ot.treeBuilder.Reset()
|
|
if beforeId == ot.Id() && !include {
|
|
return ErrLoadBeforeRoot
|
|
}
|
|
|
|
heads := []string{beforeId}
|
|
if beforeId == "" {
|
|
heads, err = ot.treeStorage.Heads()
|
|
if err != nil {
|
|
return
|
|
}
|
|
} else if !include {
|
|
beforeChange, err := ot.treeBuilder.loadChange(beforeId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
heads = beforeChange.PreviousIds
|
|
}
|
|
|
|
ot.tree, err = ot.treeBuilder.build(heads, nil, nil)
|
|
return
|
|
}
|