2013-03-05 14:47:55 -06:00
|
|
|
package git
|
|
|
|
|
|
|
|
/*
|
|
|
|
#include <git2.h>
|
|
|
|
#include <git2/errors.h>
|
|
|
|
*/
|
|
|
|
import "C"
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
2013-09-18 02:23:47 -05:00
|
|
|
"runtime"
|
2013-03-05 14:47:55 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
// RevWalk
|
|
|
|
|
2013-09-12 03:46:20 -05:00
|
|
|
type SortType uint
|
2014-03-07 18:43:20 -06:00
|
|
|
|
2013-03-05 14:47:55 -06:00
|
|
|
const (
|
2014-03-07 18:43:20 -06:00
|
|
|
SortNone SortType = C.GIT_SORT_NONE
|
|
|
|
SortTopological = C.GIT_SORT_TOPOLOGICAL
|
|
|
|
SortTime = C.GIT_SORT_TIME
|
|
|
|
SortReverse = C.GIT_SORT_REVERSE
|
2013-03-05 14:47:55 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
type RevWalk struct {
|
|
|
|
ptr *C.git_revwalk
|
|
|
|
repo *Repository
|
|
|
|
}
|
|
|
|
|
2014-03-07 18:43:20 -06:00
|
|
|
func revWalkFromC(repo *Repository, c *C.git_revwalk) *RevWalk {
|
|
|
|
v := &RevWalk{ptr: c, repo: repo}
|
|
|
|
runtime.SetFinalizer(v, (*RevWalk).Free)
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
|
2013-03-05 14:47:55 -06:00
|
|
|
func (v *RevWalk) Reset() {
|
|
|
|
C.git_revwalk_reset(v.ptr)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (v *RevWalk) Push(id *Oid) {
|
|
|
|
C.git_revwalk_push(v.ptr, id.toC())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (v *RevWalk) PushHead() (err error) {
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2013-03-05 14:47:55 -06:00
|
|
|
ecode := C.git_revwalk_push_head(v.ptr)
|
|
|
|
if ecode < 0 {
|
2013-07-07 09:43:44 -05:00
|
|
|
err = MakeGitError(ecode)
|
2013-03-05 14:47:55 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2014-02-26 08:30:16 -06:00
|
|
|
func (v *RevWalk) Next(id *Oid) (err error) {
|
2013-09-18 02:23:47 -05:00
|
|
|
runtime.LockOSThread()
|
|
|
|
defer runtime.UnlockOSThread()
|
|
|
|
|
2014-02-26 08:30:16 -06:00
|
|
|
ret := C.git_revwalk_next(id.toC(), v.ptr)
|
2013-03-05 14:47:55 -06:00
|
|
|
switch {
|
|
|
|
case ret == ITEROVER:
|
|
|
|
err = io.EOF
|
|
|
|
case ret < 0:
|
2013-07-07 09:43:44 -05:00
|
|
|
err = MakeGitError(ret)
|
2013-03-05 14:47:55 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
type RevWalkIterator func(commit *Commit) bool
|
|
|
|
|
|
|
|
func (v *RevWalk) Iterate(fun RevWalkIterator) (err error) {
|
|
|
|
oid := new(Oid)
|
|
|
|
for {
|
|
|
|
err = v.Next(oid)
|
|
|
|
if err == io.EOF {
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2013-09-12 03:46:20 -05:00
|
|
|
func (v *RevWalk) Sorting(sm SortType) {
|
2013-03-05 14:47:55 -06:00
|
|
|
C.git_revwalk_sorting(v.ptr, C.uint(sm))
|
|
|
|
}
|
|
|
|
|
2014-03-07 18:43:20 -06:00
|
|
|
func (v *RevWalk) Free() {
|
|
|
|
|
|
|
|
runtime.SetFinalizer(v, nil)
|
|
|
|
C.git_revwalk_free(v.ptr)
|
2013-03-05 14:47:55 -06:00
|
|
|
}
|