diff options
| author | Vicent Martà <[email protected]> | 2013-03-05 13:14:58 -0800 |
|---|---|---|
| committer | Vicent Martà <[email protected]> | 2013-03-05 13:14:58 -0800 |
| commit | dd2ad2bf6b6fa87b480a96adbc67d44c63e0a39d (patch) | |
| tree | eee499cc976a20ab0aa9f064a42f24c3085b26c8 /walk.go | |
| parent | 439f7acf2865af07f970b8bfe2691b70eca7c973 (diff) | |
| parent | 93ab5a1c3e81a988523b716befce2555353396e2 (diff) | |
Merge pull request #1 from carlosmn/revwalk
Bring back the RevWalk
Diffstat (limited to 'walk.go')
| -rw-r--r-- | walk.go | 90 |
1 files changed, 90 insertions, 0 deletions
@@ -0,0 +1,90 @@ +package git + +/* +#cgo pkg-config: libgit2 +#include <git2.h> +#include <git2/errors.h> +*/ +import "C" + +import ( + "io" +) + +// RevWalk + +const ( + SORT_NONE = C.GIT_SORT_NONE + SORT_TOPOLOGICAL = C.GIT_SORT_TOPOLOGICAL + SORT_TIME = C.GIT_SORT_TIME + SORT_REVERSE = C.GIT_SORT_REVERSE +) + +type RevWalk struct { + ptr *C.git_revwalk + repo *Repository +} + +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) { + ecode := C.git_revwalk_push_head(v.ptr) + if ecode < 0 { + err = LastError() + } + + return +} + +func (v *RevWalk) Next(oid *Oid) (err error) { + ret := C.git_revwalk_next(oid.toC(), v.ptr) + switch { + case ret == ITEROVER: + err = io.EOF + case ret < 0: + err = LastError() + } + + 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 +} + +func (v *RevWalk) Sorting(sm uint) { + C.git_revwalk_sorting(v.ptr, C.uint(sm)) +} + +func freeRevWalk(walk *RevWalk) { + C.git_revwalk_free(walk.ptr) +} |
