diff options
| author | Axel Wagner <[email protected]> | 2013-05-21 21:37:08 +0200 |
|---|---|---|
| committer | Axel Wagner <[email protected]> | 2013-05-21 21:37:08 +0200 |
| commit | 3a0abcc2e47588b6e4ab042924c10c9ed21063bf (patch) | |
| tree | aa1be3532a597668ec92fd6a383eaaa473c720bb | |
| parent | 4e0a28b064047513194a842e9c16d9beab545f41 (diff) | |
Implement git_odb_foreach
| -rw-r--r-- | odb.go | 29 | ||||
| -rw-r--r-- | wrapper.c | 4 |
2 files changed, 32 insertions, 1 deletions
@@ -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 } - @@ -20,4 +20,8 @@ int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload) return git_packbuilder_foreach(pb, (git_packbuilder_foreach_cb)&packbuilderForEachCb, payload); } +int _go_git_odb_foreach(git_odb *db, void *payload) +{ + return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload); +} /* EOF */ |
