summaryrefslogtreecommitdiff
path: root/reference.go
diff options
context:
space:
mode:
authorVicent Martí <[email protected]>2013-09-17 08:03:50 -0700
committerVicent Martí <[email protected]>2013-09-17 08:03:50 -0700
commit6c97b9ac9dd951d71eb7422fe9d5a458eacef708 (patch)
treebd58bcf2a363e4b8c1c2f496100028174a7e3961 /reference.go
parentda5033fb986cb4527a2115da18db9dd19583d330 (diff)
parent4abda3a60b31101d95d9c82a82691016b77a7ade (diff)
Merge pull request #36 from libgit2/ref-iter
reference: get references out of the iterator
Diffstat (limited to 'reference.go')
-rw-r--r--reference.go34
1 files changed, 33 insertions, 1 deletions
diff --git a/reference.go b/reference.go
index 86e9ee0..6ebe00f 100644
--- a/reference.go
+++ b/reference.go
@@ -148,7 +148,7 @@ func (repo *Repository) NewReferenceIteratorGlob(glob string) (*ReferenceIterato
return iter, nil
}
-// Next retrieves the next reference name. If the iteration is over,
+// NextName retrieves the next reference name. If the iteration is over,
// the returned error is git.ErrIterOver
func (v *ReferenceIterator) NextName() (string, error) {
var ptr *C.char
@@ -180,6 +180,38 @@ func (v *ReferenceIterator) NameIter() <-chan string {
return ch
}
+// Next retrieves the next reference. If the iterationis over, the
+// returned error is git.ErrIterOver
+func (v *ReferenceIterator) Next() (*Reference, error) {
+ var ptr *C.git_reference
+ ret := C.git_reference_next(&ptr, v.ptr)
+ if ret == ITEROVER {
+ return nil, ErrIterOver
+ }
+ if ret < 0 {
+ return nil, LastError()
+ }
+
+ return newReferenceFromC(ptr), nil
+}
+
+// Create a channel from the iterator. You can use range on the
+// returned channel to iterate over all the references names. The channel
+// will be closed in case any error is found.
+func (v *ReferenceIterator) Iter() <-chan *Reference {
+ ch := make(chan *Reference)
+ go func() {
+ defer close(ch)
+ name, err := v.Next()
+ for err == nil {
+ ch <- name
+ name, err = v.Next()
+ }
+ }()
+
+ return ch
+}
+
// Free the reference iterator
func (v *ReferenceIterator) Free() {
runtime.SetFinalizer(v, nil)