From c8ce59d4eb3fc736fa380e7a2747c96659552e5d Mon Sep 17 00:00:00 2001 From: lhchavez Date: Sun, 5 Sep 2021 20:06:56 -0700 Subject: Add support for Repository.ReachableFromAny() (#826) This change exposes the binding for `git_graph_reachable_from_any()`. --- graph.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'graph.go') diff --git a/graph.go b/graph.go index 688818c..05da423 100644 --- a/graph.go +++ b/graph.go @@ -40,3 +40,30 @@ func (repo *Repository) AheadBehind(local, upstream *Oid) (ahead, behind int, er return int(aheadT), int(behindT), nil } + +// ReachableFromAny returns whether a commit is reachable from any of a list of +// commits by following parent edges. +func (repo *Repository) ReachableFromAny(commit *Oid, descendants []*Oid) (bool, error) { + if len(descendants) == 0 { + return false, nil + } + + coids := make([]C.git_oid, len(descendants)) + for i := 0; i < len(descendants); i++ { + coids[i] = *descendants[i].toC() + } + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ret := C.git_graph_reachable_from_any(repo.ptr, commit.toC(), &coids[0], C.size_t(len(descendants))) + runtime.KeepAlive(repo) + runtime.KeepAlive(commit) + runtime.KeepAlive(coids) + runtime.KeepAlive(descendants) + if ret < 0 { + return false, MakeGitError(ret) + } + + return (ret > 0), nil +} -- cgit v1.2.3