repo: fix some go-git implementation

Michael Muré created

Change summary

identity/identity_actions.go |  3 ++-
repository/git.go            |  4 ++--
repository/gogit.go          | 24 +++++++++++++++++++-----
repository/mock_repo.go      |  4 ++--
repository/repo.go           |  2 +-
5 files changed, 26 insertions(+), 11 deletions(-)

Detailed changes

identity/identity_actions.go 🔗

@@ -4,9 +4,10 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/pkg/errors"
+
 	"github.com/MichaelMure/git-bug/entity"
 	"github.com/MichaelMure/git-bug/repository"
-	"github.com/pkg/errors"
 )
 
 // Fetch retrieve updates from a remote

repository/git.go 🔗

@@ -302,8 +302,8 @@ func (repo *GitRepo) RemoveRef(ref string) error {
 }
 
 // ListRefs will return a list of Git ref matching the given refspec
-func (repo *GitRepo) ListRefs(refspec string) ([]string, error) {
-	stdout, err := repo.runGitCommand("for-each-ref", "--format=%(refname)", refspec)
+func (repo *GitRepo) ListRefs(refPrefix string) ([]string, error) {
+	stdout, err := repo.runGitCommand("for-each-ref", "--format=%(refname)", refPrefix)
 
 	if err != nil {
 		return nil, err

repository/gogit.go 🔗

@@ -7,6 +7,7 @@ import (
 	"os"
 	stdpath "path"
 	"path/filepath"
+	"strings"
 	"sync"
 	"time"
 
@@ -420,7 +421,7 @@ func (repo *GoGitRepo) RemoveRef(ref string) error {
 	return repo.r.Storer.RemoveReference(plumbing.ReferenceName(ref))
 }
 
-func (repo *GoGitRepo) ListRefs(refspec string) ([]string, error) {
+func (repo *GoGitRepo) ListRefs(refPrefix string) ([]string, error) {
 	refIter, err := repo.r.References()
 	if err != nil {
 		return nil, err
@@ -428,9 +429,16 @@ func (repo *GoGitRepo) ListRefs(refspec string) ([]string, error) {
 
 	refs := make([]string, 0)
 
-	for ref, _ := refIter.Next(); ref != nil; {
-		refs = append(refs, ref.String()) // TODO: Use format to search
+	err = refIter.ForEach(func(ref *plumbing.Reference) error {
+		if strings.HasPrefix(ref.Name().String(), refPrefix) {
+			refs = append(refs, ref.Name().String())
+		}
+		return nil
+	})
+	if err != nil {
+		return nil, err
 	}
+
 	return refs, nil
 }
 
@@ -454,10 +462,16 @@ func (repo *GoGitRepo) ListCommits(ref string) ([]Hash, error) {
 		return nil, err
 	}
 
-	var commits []Hash // TODO: Implement refspec
-	for commit, _ := commitIter.Next(); commit != nil; {
+	var commits []Hash
+
+	err = commitIter.ForEach(func(commit *object.Commit) error {
 		commits = append(commits, Hash(commit.Hash.String()))
+		return nil
+	})
+	if err != nil {
+		return nil, err
 	}
+
 	return commits, nil
 }
 

repository/mock_repo.go 🔗

@@ -164,11 +164,11 @@ func (r *mockRepoForTest) CopyRef(source string, dest string) error {
 	return nil
 }
 
-func (r *mockRepoForTest) ListRefs(refspec string) ([]string, error) {
+func (r *mockRepoForTest) ListRefs(refPrefix string) ([]string, error) {
 	var keys []string
 
 	for k := range r.refs {
-		if strings.HasPrefix(k, refspec) {
+		if strings.HasPrefix(k, refPrefix) {
 			keys = append(keys, k)
 		}
 	}

repository/repo.go 🔗

@@ -91,7 +91,7 @@ type RepoData interface {
 	RemoveRef(ref string) error
 
 	// ListRefs will return a list of Git ref matching the given refspec
-	ListRefs(refspec string) ([]string, error)
+	ListRefs(refPrefix string) ([]string, error)
 
 	// RefExist will check if a reference exist in Git
 	RefExist(ref string) (bool, error)