summaryrefslogtreecommitdiff
path: root/walk.go
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2013-03-05 21:47:55 +0100
committerCarlos Martín Nieto <[email protected]>2013-03-05 21:47:55 +0100
commit93ab5a1c3e81a988523b716befce2555353396e2 (patch)
treeeee499cc976a20ab0aa9f064a42f24c3085b26c8 /walk.go
parent439f7acf2865af07f970b8bfe2691b70eca7c973 (diff)
Bring back the RevWalk
Diffstat (limited to 'walk.go')
-rw-r--r--walk.go90
1 files changed, 90 insertions, 0 deletions
diff --git a/walk.go b/walk.go
new file mode 100644
index 0000000..216eb65
--- /dev/null
+++ b/walk.go
@@ -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)
+}