diff options
Diffstat (limited to 'vendor/github.com/libgit2/git2go/walk.go')
-rw-r--r-- | vendor/github.com/libgit2/git2go/walk.go | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/vendor/github.com/libgit2/git2go/walk.go b/vendor/github.com/libgit2/git2go/walk.go new file mode 100644 index 000000000..287edb631 --- /dev/null +++ b/vendor/github.com/libgit2/git2go/walk.go @@ -0,0 +1,219 @@ +package git + +/* +#include <git2.h> +*/ +import "C" + +import ( + "runtime" + "unsafe" +) + +// RevWalk + +type SortType uint + +const ( + SortNone SortType = C.GIT_SORT_NONE + SortTopological SortType = C.GIT_SORT_TOPOLOGICAL + SortTime SortType = C.GIT_SORT_TIME + SortReverse SortType = C.GIT_SORT_REVERSE +) + +type RevWalk struct { + ptr *C.git_revwalk + repo *Repository +} + +func revWalkFromC(repo *Repository, c *C.git_revwalk) *RevWalk { + v := &RevWalk{ptr: c, repo: repo} + runtime.SetFinalizer(v, (*RevWalk).Free) + return v +} + +func (v *RevWalk) Reset() { + C.git_revwalk_reset(v.ptr) + runtime.KeepAlive(v) +} + +func (v *RevWalk) Push(id *Oid) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ecode := C.git_revwalk_push(v.ptr, id.toC()) + runtime.KeepAlive(v) + runtime.KeepAlive(id) + if ecode < 0 { + return MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) PushGlob(glob string) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + cstr := C.CString(glob) + defer C.free(unsafe.Pointer(cstr)) + + ecode := C.git_revwalk_push_glob(v.ptr, cstr) + runtime.KeepAlive(v) + if ecode < 0 { + return MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) PushRange(r string) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + cstr := C.CString(r) + defer C.free(unsafe.Pointer(cstr)) + + ecode := C.git_revwalk_push_range(v.ptr, cstr) + runtime.KeepAlive(v) + if ecode < 0 { + return MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) PushRef(r string) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + cstr := C.CString(r) + defer C.free(unsafe.Pointer(cstr)) + + ecode := C.git_revwalk_push_ref(v.ptr, cstr) + runtime.KeepAlive(v) + if ecode < 0 { + return MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) PushHead() (err error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ecode := C.git_revwalk_push_head(v.ptr) + runtime.KeepAlive(v) + if ecode < 0 { + err = MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) Hide(id *Oid) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ecode := C.git_revwalk_hide(v.ptr, id.toC()) + runtime.KeepAlive(v) + runtime.KeepAlive(id) + if ecode < 0 { + return MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) HideGlob(glob string) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + cstr := C.CString(glob) + defer C.free(unsafe.Pointer(cstr)) + + ecode := C.git_revwalk_hide_glob(v.ptr, cstr) + runtime.KeepAlive(v) + if ecode < 0 { + return MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) HideRef(r string) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + cstr := C.CString(r) + defer C.free(unsafe.Pointer(cstr)) + + ecode := C.git_revwalk_hide_ref(v.ptr, cstr) + runtime.KeepAlive(v) + if ecode < 0 { + return MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) HideHead() (err error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ecode := C.git_revwalk_hide_head(v.ptr) + runtime.KeepAlive(v) + if ecode < 0 { + err = MakeGitError(ecode) + } + return nil +} + +func (v *RevWalk) Next(id *Oid) (err error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ret := C.git_revwalk_next(id.toC(), v.ptr) + runtime.KeepAlive(v) + switch { + case ret < 0: + err = MakeGitError(ret) + } + + return +} + +type RevWalkIterator func(commit *Commit) bool + +func (v *RevWalk) Iterate(fun RevWalkIterator) (err error) { + oid := new(Oid) + for { + err = v.Next(oid) + if IsErrorCode(err, ErrIterOver) { + return nil + } + if err != nil { + return err + } + + commit, err := v.repo.LookupCommit(oid) + if err != nil { + return err + } + + cont := fun(commit) + if !cont { + break + } + } + + return nil +} + +func (v *RevWalk) SimplifyFirstParent() { + C.git_revwalk_simplify_first_parent(v.ptr) + runtime.KeepAlive(v) +} + +func (v *RevWalk) Sorting(sm SortType) { + C.git_revwalk_sorting(v.ptr, C.uint(sm)) + runtime.KeepAlive(v) +} + +func (v *RevWalk) Free() { + runtime.SetFinalizer(v, nil) + C.git_revwalk_free(v.ptr) +} |