diff options
| author | Vicent Martà <[email protected]> | 2013-09-17 08:03:50 -0700 |
|---|---|---|
| committer | Vicent Martà <[email protected]> | 2013-09-17 08:03:50 -0700 |
| commit | 6c97b9ac9dd951d71eb7422fe9d5a458eacef708 (patch) | |
| tree | bd58bcf2a363e4b8c1c2f496100028174a7e3961 /reference.go | |
| parent | da5033fb986cb4527a2115da18db9dd19583d330 (diff) | |
| parent | 4abda3a60b31101d95d9c82a82691016b77a7ade (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.go | 34 |
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) |
