reference: get references out of the iterator #36

Merged
carlosmn merged 1 commits from ref-iter into master 2013-09-17 10:03:51 -05:00
2 changed files with 51 additions and 1 deletions

View File

@ -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)

View File

@ -112,6 +112,24 @@ func TestIterator(t *testing.T) {
sort.Strings(list)
compareStringList(t, expected, list)
// test the iterator for full refs, rather than just names
iter, err = repo.NewReferenceIterator()
checkFatal(t, err)
count := 0
_, err = iter.Next()
for err == nil {
count++
_, err = iter.Next()
}
if err != ErrIterOver {
t.Fatal("Iteration not over")
}
if count != 4 {
t.Fatalf("Wrong number of references returned %v", count)
}
// test the channel iteration
list = []string{}
iter, err = repo.NewReferenceIterator()