Add BranchIterator#ForEach.
This abstracts the branch iteration from the user.
diff --git a/branch.go b/branch.go
index bb231c3..54b01fb 100644
--- a/branch.go
+++ b/branch.go
@@ -30,10 +30,7 @@
repo *Repository
}
-type BranchInfo struct {
- Branch *Branch
- Type BranchType
-}
+type BranchIteratorFunc func(*Branch, BranchType) error
func newBranchIteratorFromC(repo *Repository, ptr *C.git_branch_iterator) *BranchIterator {
i := &BranchIterator{repo: repo, ptr: ptr}
@@ -65,8 +62,20 @@
C.git_branch_iterator_free(i.ptr)
}
-func (repo *Repository) NewBranchIterator(flags BranchType) (*BranchIterator, error) {
+func (i *BranchIterator) ForEach(f BranchIteratorFunc) error {
+ b, t, err := i.Next()
+ for err == nil {
+ err = f(b, t)
+ if err == nil {
+ b, t, err = i.Next()
+ }
+ }
+
+ return err
+}
+
+func (repo *Repository) NewBranchIterator(flags BranchType) (*BranchIterator, error) {
refType := C.git_branch_t(flags)
var ptr *C.git_branch_iterator
diff --git a/branch_test.go b/branch_test.go
index 44f6338..09ebeba 100644
--- a/branch_test.go
+++ b/branch_test.go
@@ -1,11 +1,8 @@
package git
-import (
- "testing"
-)
+import "testing"
func TestBranchIterator(t *testing.T) {
-
repo := createTestRepo(t)
seedTestRepo(t, repo)
@@ -24,3 +21,35 @@
t.Fatal("expected iterover")
}
}
+
+func TestBranchIteratorEach(t *testing.T) {
+ repo := createTestRepo(t)
+ seedTestRepo(t, repo)
+
+ i, err := repo.NewBranchIterator(BranchLocal)
+ checkFatal(t, err)
+
+ var names []string
+ f := func(b *Branch, t BranchType) error {
+ name, err := b.Name()
+ if err != nil {
+ return err
+ }
+
+ names = append(names, name)
+ return nil
+ }
+
+ err = i.ForEach(f)
+ if err != nil && !IsErrorCode(err, ErrIterOver) {
+ t.Fatal(err)
+ }
+
+ if len(names) != 1 {
+ t.Fatalf("expect 1 branch, but it was %d\n", len(names))
+ }
+
+ if names[0] != "master" {
+ t.Fatalf("expect branch master, but it was %s\n", names[0])
+ }
+}