add branch iterator / remove useless repo from reference iterator

This commit is contained in:
Jesse Ezell 2014-03-12 15:49:11 -07:00
parent 1cf8117814
commit 5f01bd7abd
3 changed files with 86 additions and 4 deletions

View File

@ -23,6 +23,61 @@ type Branch struct {
Reference
}
type BranchIterator struct {
ptr *C.git_branch_iterator
}
func newBranchIteratorFromC(ptr *C.git_branch_iterator) *BranchIterator {
i := &BranchIterator{ptr: ptr}
runtime.SetFinalizer(i, (*BranchIterator).Free)
return i
}
func (i *BranchIterator) Next() (*Reference, error) {
ref, _, err := i.NextWithType()
return ref, err
}
func (i *BranchIterator) NextWithType() (*Reference, BranchType, error) {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
var refPtr *C.git_reference
var refType C.git_branch_t
ecode := C.git_branch_next(&refPtr, &refType, i.ptr)
if ecode == C.GIT_ITEROVER {
return nil, BranchLocal, ErrIterOver
} else if ecode < 0 {
return nil, BranchLocal, MakeGitError(ecode)
}
return newReferenceFromC(refPtr), BranchType(refType), nil
}
func (i *BranchIterator) Free() {
runtime.SetFinalizer(i, nil)
C.git_branch_iterator_free(i.ptr)
}
func (repo *Repository) NewBranchIterator(flags BranchType) (*BranchIterator, error) {
refType := C.git_branch_t(flags)
var ptr *C.git_branch_iterator
runtime.LockOSThread()
defer runtime.UnlockOSThread()
ecode := C.git_branch_iterator_new(&ptr, repo.ptr, refType)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
return newBranchIteratorFromC(ptr), nil
}
func (repo *Repository) CreateBranch(branchName string, target *Commit, force bool, signature *Signature, msg string) (*Reference, error) {
ref := new(Reference)

28
branch_test.go Normal file
View File

@ -0,0 +1,28 @@
package git
import (
"testing"
)
func Test_List_Branches(t *testing.T) {
repo := createTestRepo(t)
seedTestRepo(t, repo)
i, err := repo.NewBranchIterator(BranchLocal)
checkFatal(t, err)
ref, err := i.Next()
checkFatal(t, err)
if ref.Name() != "refs/heads/master" {
t.Fatalf("expected refs/heads/master, not %v", ref.Name())
}
ref, err = i.Next()
if ref != nil {
t.Fatal("expected nil")
}
if err != ErrIterOver {
t.Fatal("expected iterover")
}
}

View File

@ -186,8 +186,7 @@ func (v *Reference) Free() {
}
type ReferenceIterator struct {
ptr *C.git_reference_iterator
repo *Repository
ptr *C.git_reference_iterator
}
// NewReferenceIterator creates a new iterator over reference names
@ -202,7 +201,7 @@ func (repo *Repository) NewReferenceIterator() (*ReferenceIterator, error) {
return nil, MakeGitError(ret)
}
iter := &ReferenceIterator{repo: repo, ptr: ptr}
iter := &ReferenceIterator{ptr: ptr}
runtime.SetFinalizer(iter, (*ReferenceIterator).Free)
return iter, nil
}
@ -223,7 +222,7 @@ func (repo *Repository) NewReferenceIteratorGlob(glob string) (*ReferenceIterato
return nil, MakeGitError(ret)
}
iter := &ReferenceIterator{repo: repo, ptr: ptr}
iter := &ReferenceIterator{ptr: ptr}
runtime.SetFinalizer(iter, (*ReferenceIterator).Free)
return iter, nil
}