1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 14:07:02 +09:00
any-sync/commonspace/object/tree/objecttree/historytree.go
2023-01-18 08:24:33 +01:00

49 lines
1 KiB
Go

package objecttree
import (
"errors"
"github.com/anytypeio/any-sync/commonspace/object/tree/treechangeproto"
)
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)
Header() *treechangeproto.RawTreeChangeWithId
UnmarshalledHeader() *Change
}
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
}