Skip to content

Commit 3a0abcc

Browse files
author
Axel Wagner
committed
Implement git_odb_foreach
1 parent 4e0a28b commit 3a0abcc

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

odb.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ package git
44
#cgo pkg-config: libgit2
55
#include <git2.h>
66
#include <git2/errors.h>
7+
8+
extern int _go_git_odb_foreach(git_odb *db, void *payload);
79
*/
810
import "C"
911
import (
@@ -53,6 +55,32 @@ func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) {
5355
return
5456
}
5557

58+
//export odbForEachCb
59+
func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int {
60+
ch := *(*chan *Oid)(payload)
61+
oid := newOidFromC(id)
62+
// Because the channel is unbuffered, we never read our own data. If ch is
63+
// readable, the user has sent something on it, which means we should
64+
// abort.
65+
select {
66+
case ch <- oid:
67+
case <-ch:
68+
return -1
69+
}
70+
return 0;
71+
}
72+
73+
func (v *Odb) forEachWrap(ch chan *Oid) {
74+
C._go_git_odb_foreach(v.ptr, unsafe.Pointer(&ch))
75+
close(ch)
76+
}
77+
78+
func (v *Odb) ForEach() chan *Oid {
79+
ch := make(chan *Oid, 0)
80+
go v.forEachWrap(ch)
81+
return ch
82+
}
83+
5684
type OdbObject struct {
5785
ptr *C.git_odb_object
5886
}
@@ -83,4 +111,3 @@ func (object *OdbObject) Data() (data []byte) {
83111

84112
return blob
85113
}
86-

wrapper.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@ int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload)
2020
return git_packbuilder_foreach(pb, (git_packbuilder_foreach_cb)&packbuilderForEachCb, payload);
2121
}
2222

23+
int _go_git_odb_foreach(git_odb *db, void *payload)
24+
{
25+
return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload);
26+
}
2327
/* EOF */

0 commit comments

Comments
 (0)