summaryrefslogtreecommitdiff
path: root/odb.go
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2014-05-07 15:12:00 +0200
committerCarlos Martín Nieto <[email protected]>2014-05-07 15:12:00 +0200
commitf5e1252d6e391c634b4bfd008124a58e9e0a5bf3 (patch)
tree579c09cbba1f47254e7bfa685222e3e39ce62bbb /odb.go
parent9a8b80fc13b923b46b44fbd969e01db6d9f4b7b9 (diff)
parent7e3c361ac4c97f48d80d7ca63358e92ea464a087 (diff)
Merge pull request #90 from libgit2/unchanify
Remove usage of channels for `ForEach`
Diffstat (limited to 'odb.go')
-rw-r--r--odb.go44
1 files changed, 27 insertions, 17 deletions
diff --git a/odb.go b/odb.go
index abfa1cd..7076e20 100644
--- a/odb.go
+++ b/odb.go
@@ -84,30 +84,40 @@ func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) {
return obj, nil
}
+type OdbForEachCallback func(id *Oid) error
+
+type foreachData struct {
+ callback OdbForEachCallback
+ err error
+}
+
//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
+ data := (*foreachData)(payload)
+
+ err := data.callback(newOidFromC(id))
+ if err != nil {
+ data.err = err
+ return C.GIT_EUSER
}
+
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(callback OdbForEachCallback) error {
+ data := foreachData {
+ callback: callback,
+ err: nil,
+ }
-func (v *Odb) ForEach() chan *Oid {
- ch := make(chan *Oid, 0)
- go v.forEachWrap(ch)
- return ch
+ ret := C._go_git_odb_foreach(v.ptr, unsafe.Pointer(&data))
+ if ret == C.GIT_EUSER {
+ return data.err
+ } else if ret < 0 {
+ return MakeGitError(ret)
+ }
+
+ return nil
}
// Hash determines the object-ID (sha1) of a data buffer.