ref: 85f1212724e037e6934203f04a3f6231ac609503
dir: /ancestor/ancestor.go/
// Package ancestor answers commit ancestry queries.
package ancestor
import (
commitgraphread "codeberg.org/lindenii/furgit/commitgraph/read"
"codeberg.org/lindenii/furgit/internal/commitquery"
"codeberg.org/lindenii/furgit/internal/peel"
"codeberg.org/lindenii/furgit/objectid"
"codeberg.org/lindenii/furgit/objectstore"
)
// Is reports whether ancestor is reachable from descendant through commit
// parent edges.
//
// Both inputs are peeled through annotated tags before commit traversal.
func Is(
store objectstore.Store,
graph *commitgraphread.Reader,
ancestor objectid.ObjectID,
descendant objectid.ObjectID,
) (bool, error) {
ancestorCommit, err := peel.ToCommit(store, ancestor)
if err != nil {
return false, err
}
descendantCommit, err := peel.ToCommit(store, descendant)
if err != nil {
return false, err
}
ctx := commitquery.NewContext(store, graph)
ancestorIdx, err := ctx.ResolveOID(ancestorCommit)
if err != nil {
return false, err
}
descendantIdx, err := ctx.ResolveOID(descendantCommit)
if err != nil {
return false, err
}
return commitquery.IsAncestor(ctx, ancestorIdx, descendantIdx)
}