diff options
| author | Jesse Ezell <[email protected]> | 2014-03-12 15:49:11 -0700 |
|---|---|---|
| committer | Jesse Ezell <[email protected]> | 2014-03-12 15:49:11 -0700 |
| commit | 5f01bd7abdd39b4d8c701c8a73f3c3e49fcd70b9 (patch) | |
| tree | 3c30d127effd815d910371eb3a1fbac711d9f4aa | |
| parent | 1cf81178141c504c62bb3faaa406db665dc5471a (diff) | |
add branch iterator / remove useless repo from reference iterator
| -rw-r--r-- | branch.go | 55 | ||||
| -rw-r--r-- | branch_test.go | 28 | ||||
| -rw-r--r-- | reference.go | 7 |
3 files changed, 86 insertions, 4 deletions
@@ -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) diff --git a/branch_test.go b/branch_test.go new file mode 100644 index 0000000..e95c877 --- /dev/null +++ b/branch_test.go @@ -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") + } +} diff --git a/reference.go b/reference.go index d246c55..5722db2 100644 --- a/reference.go +++ b/reference.go @@ -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 } |
