summaryrefslogtreecommitdiff
path: root/reference.go
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2013-08-09 18:22:26 +0200
committerCarlos Martín Nieto <[email protected]>2013-08-09 18:22:26 +0200
commit4abda3a60b31101d95d9c82a82691016b77a7ade (patch)
treec06c1ef0ea33870df9ab5889b270e625df3e1b72 /reference.go
parent22f43840aac638b43bc963a6515c9c814bac3b72 (diff)
reference: get references out of the iterator
Allow getting references out of the iterator instead of just names.
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 5aee276..cd8c42a 100644
--- a/reference.go
+++ b/reference.go
@@ -147,7 +147,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
@@ -179,6 +179,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)