summaryrefslogtreecommitdiff
path: root/odb.go
diff options
context:
space:
mode:
authorAxel Wagner <[email protected]>2013-05-21 21:37:08 +0200
committerAxel Wagner <[email protected]>2013-05-21 21:37:08 +0200
commit3a0abcc2e47588b6e4ab042924c10c9ed21063bf (patch)
treeaa1be3532a597668ec92fd6a383eaaa473c720bb /odb.go
parent4e0a28b064047513194a842e9c16d9beab545f41 (diff)
Implement git_odb_foreach
Diffstat (limited to 'odb.go')
-rw-r--r--odb.go29
1 files changed, 28 insertions, 1 deletions
diff --git a/odb.go b/odb.go
index bf17171..f6eb591 100644
--- a/odb.go
+++ b/odb.go
@@ -4,6 +4,8 @@ package git
#cgo pkg-config: libgit2
#include <git2.h>
#include <git2/errors.h>
+
+extern int _go_git_odb_foreach(git_odb *db, void *payload);
*/
import "C"
import (
@@ -53,6 +55,32 @@ func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) {
return
}
+//export odbForEachCb
+func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int {
+ ch := *(*chan *Oid)(payload)
+ oid := newOidFromC(id)
+ // Because the channel is unbuffered, we never read our own data. If ch is
+ // readable, the user has sent something on it, which means we should
+ // abort.
+ select {
+ case ch <- oid:
+ case <-ch:
+ return -1
+ }
+ return 0;
+}
+
+func (v *Odb) forEachWrap(ch chan *Oid) {
+ C._go_git_odb_foreach(v.ptr, unsafe.Pointer(&ch))
+ close(ch)
+}
+
+func (v *Odb) ForEach() chan *Oid {
+ ch := make(chan *Oid, 0)
+ go v.forEachWrap(ch)
+ return ch
+}
+
type OdbObject struct {
ptr *C.git_odb_object
}
@@ -83,4 +111,3 @@ func (object *OdbObject) Data() (data []byte) {
return blob
}
-