mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-08 14:07:02 +09:00
60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package objecttree
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
var ErrLoadBeforeRoot = errors.New("can't load before root")
|
|
|
|
type HistoryTree interface {
|
|
ReadableObjectTree
|
|
}
|
|
|
|
type historyTree struct {
|
|
*objectTree
|
|
}
|
|
|
|
func (h *historyTree) rebuildFromStorage(params HistoryTreeParams) (err error) {
|
|
err = h.rebuild(params)
|
|
if err != nil {
|
|
return
|
|
}
|
|
h.aclList.RLock()
|
|
defer h.aclList.RUnlock()
|
|
state := h.aclList.AclState()
|
|
|
|
return h.readKeysFromAclState(state)
|
|
}
|
|
|
|
func (h *historyTree) rebuild(params HistoryTreeParams) (err error) {
|
|
var (
|
|
beforeId = params.BeforeId
|
|
include = params.IncludeBeforeId
|
|
full = params.BuildFullTree
|
|
)
|
|
h.treeBuilder.Reset()
|
|
if full {
|
|
h.tree, err = h.treeBuilder.BuildFull()
|
|
return
|
|
}
|
|
if beforeId == h.Id() && !include {
|
|
return ErrLoadBeforeRoot
|
|
}
|
|
|
|
heads := []string{beforeId}
|
|
if beforeId == "" {
|
|
heads, err = h.treeStorage.Heads()
|
|
if err != nil {
|
|
return
|
|
}
|
|
} else if !include {
|
|
beforeChange, err := h.treeBuilder.loadChange(beforeId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
heads = beforeChange.PreviousIds
|
|
}
|
|
|
|
h.tree, err = h.treeBuilder.build(heads, nil, nil)
|
|
return
|
|
}
|