aboutsummaryrefslogtreecommitdiffstats
path: root/modules/git/repo_branch_gogit.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/git/repo_branch_gogit.go')
-rw-r--r--modules/git/repo_branch_gogit.go42
1 files changed, 40 insertions, 2 deletions
diff --git a/modules/git/repo_branch_gogit.go b/modules/git/repo_branch_gogit.go
index d159aafd6f..13b42306a6 100644
--- a/modules/git/repo_branch_gogit.go
+++ b/modules/git/repo_branch_gogit.go
@@ -13,6 +13,7 @@ import (
"strings"
"github.com/go-git/go-git/v5/plumbing"
+ "github.com/go-git/go-git/v5/plumbing/storer"
)
// IsObjectExist returns true if given reference exists in the repository.
@@ -82,7 +83,8 @@ func (repo *Repository) GetBranchNames(skip, limit int) ([]string, int, error) {
}
// WalkReferences walks all the references from the repository
-func WalkReferences(ctx context.Context, repoPath string, walkfn func(string) error) (int, error) {
+// refType should be empty, ObjectTag or ObjectBranch. All other values are equivalent to empty.
+func WalkReferences(ctx context.Context, repoPath string, walkfn func(sha1, refname string) error) (int, error) {
repo, err := OpenRepositoryCtx(ctx, repoPath)
if err != nil {
return 0, err
@@ -97,9 +99,45 @@ func WalkReferences(ctx context.Context, repoPath string, walkfn func(string) er
defer iter.Close()
err = iter.ForEach(func(ref *plumbing.Reference) error {
- err := walkfn(string(ref.Name()))
+ err := walkfn(ref.Hash().String(), string(ref.Name()))
i++
return err
})
return i, err
}
+
+// WalkReferences walks all the references from the repository
+func (repo *Repository) WalkReferences(arg ObjectType, skip, limit int, walkfn func(sha1, refname string) error) (int, error) {
+ i := 0
+ var iter storer.ReferenceIter
+ var err error
+ switch arg {
+ case ObjectTag:
+ iter, err = repo.gogitRepo.Tags()
+ case ObjectBranch:
+ iter, err = repo.gogitRepo.Branches()
+ default:
+ iter, err = repo.gogitRepo.References()
+ }
+ if err != nil {
+ return i, err
+ }
+ defer iter.Close()
+
+ err = iter.ForEach(func(ref *plumbing.Reference) error {
+ if i < skip {
+ i++
+ return nil
+ }
+ err := walkfn(ref.Hash().String(), string(ref.Name()))
+ i++
+ if err != nil {
+ return err
+ }
+ if limit != 0 && i >= skip+limit {
+ return storer.ErrStop
+ }
+ return nil
+ })
+ return i, err
+}