summaryrefslogtreecommitdiff
path: root/reference.go
diff options
context:
space:
mode:
Diffstat (limited to 'reference.go')
-rw-r--r--reference.go40
1 files changed, 23 insertions, 17 deletions
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)
-}