From 006286edb75849a38a33cfbe341d8c92de0e119d Mon Sep 17 00:00:00 2001 From: Jesse Ezell Date: Wed, 19 Mar 2014 00:19:02 -0700 Subject: remove Branch struct, unify reference iterators --- reference.go | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) (limited to 'reference.go') diff --git a/reference.go b/reference.go index 5722db2..7d28115 100644 --- a/reference.go +++ b/reference.go @@ -185,12 +185,18 @@ func (v *Reference) Free() { C.git_reference_free(v.ptr) } -type ReferenceIterator struct { +type ReferenceIterator interface { + Next() (*Reference, error) + NextName() (string, error) + Free() +} + +type gitReferenceIterator struct { ptr *C.git_reference_iterator } // NewReferenceIterator creates a new iterator over reference names -func (repo *Repository) NewReferenceIterator() (*ReferenceIterator, error) { +func (repo *Repository) NewReferenceIterator() (ReferenceIterator, error) { var ptr *C.git_reference_iterator runtime.LockOSThread() @@ -201,15 +207,15 @@ func (repo *Repository) NewReferenceIterator() (*ReferenceIterator, error) { return nil, MakeGitError(ret) } - iter := &ReferenceIterator{ptr: ptr} - runtime.SetFinalizer(iter, (*ReferenceIterator).Free) + iter := &gitReferenceIterator{ptr: ptr} + runtime.SetFinalizer(iter, (*gitReferenceIterator).Free) return iter, nil } // NewReferenceIteratorGlob creates an iterator over reference names // that match the speicified glob. The glob is of the usual fnmatch // type. -func (repo *Repository) NewReferenceIteratorGlob(glob string) (*ReferenceIterator, error) { +func (repo *Repository) NewReferenceIteratorGlob(glob string) (ReferenceIterator, error) { cstr := C.CString(glob) defer C.free(unsafe.Pointer(cstr)) var ptr *C.git_reference_iterator @@ -222,14 +228,14 @@ func (repo *Repository) NewReferenceIteratorGlob(glob string) (*ReferenceIterato return nil, MakeGitError(ret) } - iter := &ReferenceIterator{ptr: ptr} - runtime.SetFinalizer(iter, (*ReferenceIterator).Free) + iter := &gitReferenceIterator{ptr: ptr} + runtime.SetFinalizer(iter, (*gitReferenceIterator).Free) return iter, nil } // NextName retrieves the next reference name. If the iteration is over, // the returned error is git.ErrIterOver -func (v *ReferenceIterator) NextName() (string, error) { +func (v *gitReferenceIterator) NextName() (string, error) { var ptr *C.char runtime.LockOSThread() @@ -249,7 +255,7 @@ func (v *ReferenceIterator) NextName() (string, error) { // 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) NameIter() <-chan string { +func ReferenceNameIteratorChannel(v ReferenceIterator) <-chan string { ch := make(chan string) go func() { defer close(ch) @@ -265,7 +271,7 @@ func (v *ReferenceIterator) NameIter() <-chan string { // Next retrieves the next reference. If the iterationis over, the // returned error is git.ErrIterOver -func (v *ReferenceIterator) Next() (*Reference, error) { +func (v *gitReferenceIterator) Next() (*Reference, error) { var ptr *C.git_reference ret := C.git_reference_next(&ptr, v.ptr) if ret == ITEROVER { @@ -278,10 +284,16 @@ func (v *ReferenceIterator) Next() (*Reference, error) { return newReferenceFromC(ptr), nil } +// Free the reference iterator +func (v *gitReferenceIterator) Free() { + runtime.SetFinalizer(v, nil) + C.git_reference_iterator_free(v.ptr) +} + // 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 { +func ReferenceIteratorChannel(v ReferenceIterator) <-chan *Reference { ch := make(chan *Reference) go func() { defer close(ch) @@ -294,9 +306,3 @@ func (v *ReferenceIterator) Iter() <-chan *Reference { return ch } - -// Free the reference iterator -func (v *ReferenceIterator) Free() { - runtime.SetFinalizer(v, nil) - C.git_reference_iterator_free(v.ptr) -} -- cgit v1.2.3