reference: get references out of the iterator #36
34
reference.go
34
reference.go
|
@ -147,7 +147,7 @@ func (repo *Repository) NewReferenceIteratorGlob(glob string) (*ReferenceIterato
|
||||||
return iter, nil
|
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
|
// the returned error is git.ErrIterOver
|
||||||
func (v *ReferenceIterator) NextName() (string, error) {
|
func (v *ReferenceIterator) NextName() (string, error) {
|
||||||
var ptr *C.char
|
var ptr *C.char
|
||||||
|
@ -179,6 +179,38 @@ func (v *ReferenceIterator) NameIter() <-chan string {
|
||||||
return ch
|
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
|
// Free the reference iterator
|
||||||
func (v *ReferenceIterator) Free() {
|
func (v *ReferenceIterator) Free() {
|
||||||
runtime.SetFinalizer(v, nil)
|
runtime.SetFinalizer(v, nil)
|
||||||
|
|
|
@ -112,6 +112,24 @@ func TestIterator(t *testing.T) {
|
||||||
sort.Strings(list)
|
sort.Strings(list)
|
||||||
compareStringList(t, expected, 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
|
// test the channel iteration
|
||||||
list = []string{}
|
list = []string{}
|
||||||
iter, err = repo.NewReferenceIterator()
|
iter, err = repo.NewReferenceIterator()
|
||||||
|
|
Loading…
Reference in New Issue