Implement git_odb_foreach

This commit is contained in:
Axel Wagner 2013-05-21 21:37:08 +02:00
parent 4e0a28b064
commit 3a0abcc2e4
2 changed files with 32 additions and 1 deletions

29
odb.go
View File

@ -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
}

View File

@ -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 */