From afa475da357ee1f6bf93545e0e6e778a0559ea84 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 30 Jan 2021 02:40:51 +0100 Subject: [PATCH 01/11] make PaginateUserSlice generic -> PaginateSlice --- routers/api/v1/org/org.go | 4 +-- routers/api/v1/utils/utils.go | 31 +++++++++++++------- routers/api/v1/utils/utils_test.go | 47 ++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 routers/api/v1/utils/utils_test.go diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index 61e09e1126a04..37d6346f1f75b 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -28,9 +28,9 @@ func listUserOrgs(ctx *context.APIContext, u *models.User) { ctx.Error(http.StatusInternalServerError, "GetOrgsByUserID", err) return } - maxResults := len(orgs) - orgs = utils.PaginateUserSlice(orgs, listOptions.Page, listOptions.PageSize) + maxResults := len(orgs) + orgs, _ = utils.PaginateSlice(orgs, listOptions.Page, listOptions.PageSize).([]*models.User) apiOrgs := make([]*api.Organization, len(orgs)) for i := range orgs { diff --git a/routers/api/v1/utils/utils.go b/routers/api/v1/utils/utils.go index 5732ea7f7d500..679804426213c 100644 --- a/routers/api/v1/utils/utils.go +++ b/routers/api/v1/utils/utils.go @@ -6,6 +6,7 @@ package utils import ( "net/url" + "reflect" "strings" "time" @@ -67,21 +68,29 @@ func GetListOptions(ctx *context.APIContext) models.ListOptions { } } -// PaginateUserSlice cut a slice of Users as per pagination options -// TODO: make it generic -func PaginateUserSlice(items []*models.User, page, pageSize int) []*models.User { - if page != 0 { - page-- +// PaginateSlice cut a slice as per pagination options +// if page = 0 it do not paginate +func PaginateSlice(list interface{}, page, pageSize int) interface{} { + if page <= 0 || pageSize <= 0 { + return list } + listValue := reflect.ValueOf(list) - if page*pageSize >= len(items) { - return items[len(items):] + if reflect.TypeOf(list).Kind() != reflect.Slice { + return list } - items = items[page*pageSize:] + page-- - if len(items) > pageSize { - return items[:pageSize] + if page*pageSize >= listValue.Len() { + return listValue.Slice(listValue.Len(), listValue.Len()).Interface() } - return items + + listValue = listValue.Slice(page*pageSize, listValue.Len()) + + if listValue.Len() > pageSize { + return listValue.Slice(0, pageSize).Interface() + } + + return listValue.Interface() } diff --git a/routers/api/v1/utils/utils_test.go b/routers/api/v1/utils/utils_test.go new file mode 100644 index 0000000000000..cea7c30b92d58 --- /dev/null +++ b/routers/api/v1/utils/utils_test.go @@ -0,0 +1,47 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package utils + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPaginateSlice(t *testing.T) { + stringSlice := []string{"a", "b", "c", "d", "e"} + result, ok := PaginateSlice(stringSlice, 1, 2).([]string) + assert.True(t, ok) + assert.EqualValues(t, []string{"a", "b"}, result) + + result, ok = PaginateSlice(stringSlice, 100, 2).([]string) + assert.True(t, ok) + assert.EqualValues(t, []string{}, result) + + result, ok = PaginateSlice(stringSlice, 3, 2).([]string) + assert.True(t, ok) + assert.EqualValues(t, []string{"e"}, result) + + result, ok = PaginateSlice(stringSlice, 1, 0).([]string) + assert.True(t, ok) + assert.EqualValues(t, []string{"a", "b", "c", "d", "e"}, result) + + result, ok = PaginateSlice(stringSlice, 1, -1).([]string) + assert.True(t, ok) + assert.EqualValues(t, []string{"a", "b", "c", "d", "e"}, result) + + type Test struct { + Val int + } + + var testVar = []*Test{{Val: 2}, {Val: 3}, {Val: 4}} + testVar, ok = PaginateSlice(testVar, 1, 50).([]*Test) + assert.True(t, ok) + assert.EqualValues(t, []*Test{{Val: 2}, {Val: 3}, {Val: 4}}, testVar) + + testVar, ok = PaginateSlice(testVar, 2, 2).([]*Test) + assert.True(t, ok) + assert.EqualValues(t, []*Test{{Val: 4}}, testVar) +} From ae6c90e45e11effd7b09b22c51679fa14e663bd8 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 30 Jan 2021 02:41:59 +0100 Subject: [PATCH 02/11] Add pagination to ListBranches --- routers/api/v1/repo/branch.go | 17 +++++++++++++++++ templates/swagger/v1_json.tmpl | 12 ++++++++++++ 2 files changed, 29 insertions(+) diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 790464c8bc55a..925b1b484ddca 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -17,6 +17,7 @@ import ( repo_module "code.gitea.io/gitea/modules/repository" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" pull_service "code.gitea.io/gitea/services/pull" repo_service "code.gitea.io/gitea/services/repository" ) @@ -284,16 +285,29 @@ func ListBranches(ctx *context.APIContext) { // description: name of the repo // type: string // required: true + // - name: page + // in: query + // description: page number of results to return (1-based) + // type: integer + // - name: limit + // in: query + // description: page size of results + // type: integer // responses: // "200": // "$ref": "#/responses/BranchList" + listOptions := utils.GetListOptions(ctx) + branches, err := repo_module.GetBranches(ctx.Repo.Repository) if err != nil { ctx.Error(http.StatusInternalServerError, "GetBranches", err) return } + maxResults := len(branches) + branches, _ = utils.PaginateSlice(branches, listOptions.Page, listOptions.PageSize).([]*git.Branch) + apiBranches := make([]*api.Branch, len(branches)) for i := range branches { c, err := branches[i].GetCommit() @@ -313,6 +327,9 @@ func ListBranches(ctx *context.APIContext) { } } + ctx.SetLinkHeader(int(maxResults), listOptions.PageSize) + ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults)) + ctx.Header().Set("Access-Control-Expose-Headers", "X-Total-Count, Link") ctx.JSON(http.StatusOK, &apiBranches) } diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 36c1c43a00775..fd760a28e6c47 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -2500,6 +2500,18 @@ "name": "repo", "in": "path", "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" } ], "responses": { From b0c695867a8ac381be9548fef479b5a7627e0e44 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 30 Jan 2021 15:36:56 +0100 Subject: [PATCH 03/11] add skip, limit to Repository.GetBranches() --- modules/context/repo.go | 4 ++-- modules/git/repo_branch.go | 2 +- modules/git/repo_branch_gogit.go | 10 +++++++++- modules/git/repo_branch_nogogit.go | 25 +++++++++++++++++++++---- modules/git/repo_branch_test.go | 10 ++++++++-- modules/git/repo_tag_nogogit.go | 2 +- modules/repository/init.go | 2 +- routers/repo/compare.go | 4 ++-- routers/repo/issue.go | 2 +- 9 files changed, 46 insertions(+), 15 deletions(-) diff --git a/modules/context/repo.go b/modules/context/repo.go index 13037f4625d31..7b501ec082b98 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -554,7 +554,7 @@ func RepoAssignment() func(http.Handler) http.Handler { } ctx.Data["Tags"] = tags - brs, err := ctx.Repo.GitRepo.GetBranches() + brs, err := ctx.Repo.GitRepo.GetBranches(0, 0) if err != nil { ctx.ServerError("GetBranches", err) return @@ -747,7 +747,7 @@ func RepoRefByType(refType RepoRefType) func(http.Handler) http.Handler { refName = ctx.Repo.Repository.DefaultBranch ctx.Repo.BranchName = refName if !ctx.Repo.GitRepo.IsBranchExist(refName) { - brs, err := ctx.Repo.GitRepo.GetBranches() + brs, err := ctx.Repo.GitRepo.GetBranches(0, 0) if err != nil { ctx.ServerError("GetBranches", err) return diff --git a/modules/git/repo_branch.go b/modules/git/repo_branch.go index 25438530f5530..71952a62f5bc7 100644 --- a/modules/git/repo_branch.go +++ b/modules/git/repo_branch.go @@ -85,7 +85,7 @@ func GetBranchesByPath(path string) ([]*Branch, error) { } defer gitRepo.Close() - brs, err := gitRepo.GetBranches() + brs, err := gitRepo.GetBranches(0, 0) if err != nil { return nil, err } diff --git a/modules/git/repo_branch_gogit.go b/modules/git/repo_branch_gogit.go index 65cb77a8b55ff..e4621080f46e8 100644 --- a/modules/git/repo_branch_gogit.go +++ b/modules/git/repo_branch_gogit.go @@ -26,7 +26,8 @@ func (repo *Repository) IsBranchExist(name string) bool { } // GetBranches returns all branches of the repository. -func (repo *Repository) GetBranches() ([]string, error) { +// if limit = 0 it will not limit +func (repo *Repository) GetBranches(skip, limit int) ([]string, error) { var branchNames []string branches, err := repo.gogitRepo.Branches() @@ -34,7 +35,14 @@ func (repo *Repository) GetBranches() ([]string, error) { return nil, err } + i := 0 _ = branches.ForEach(func(branch *plumbing.Reference) error { + if i < skip { + i++ + return nil + } else if limit != 0 && i < skip+limit { + return nil + } branchNames = append(branchNames, strings.TrimPrefix(branch.Name().String(), BranchPrefix)) return nil }) diff --git a/modules/git/repo_branch_nogogit.go b/modules/git/repo_branch_nogogit.go index 5ec46d725e4b4..cb3005ea3a00e 100644 --- a/modules/git/repo_branch_nogogit.go +++ b/modules/git/repo_branch_nogogit.go @@ -22,11 +22,13 @@ func (repo *Repository) IsBranchExist(name string) bool { } // GetBranches returns all branches of the repository. -func (repo *Repository) GetBranches() ([]string, error) { - return callShowRef(repo.Path, BranchPrefix, "--heads") +// if limit = 0 it will not limit +func (repo *Repository) GetBranches(skip, limit int) ([]string, error) { + return callShowRef(repo.Path, BranchPrefix, "--heads", skip, limit) } -func callShowRef(repoPath, prefix, arg string) ([]string, error) { +// callShowRef return refs, if limit = 0 it will not limit +func callShowRef(repoPath, prefix, arg string, skip, limit int) ([]string, error) { var branchNames []string stdoutReader, stdoutWriter := io.Pipe() @@ -49,8 +51,21 @@ func callShowRef(repoPath, prefix, arg string) ([]string, error) { } }() + i := 0 bufReader := bufio.NewReader(stdoutReader) - for { + for i < skip { + _, isPrefix, err := bufReader.ReadLine() + if !isPrefix { + i++ + } + if err == io.EOF { + return branchNames, nil + } + if err != nil { + return nil, err + } + } + for limit == 0 || i < skip+limit { // The output of show-ref is simply a list: // SP LF _, err := bufReader.ReadSlice(' ') @@ -78,5 +93,7 @@ func callShowRef(repoPath, prefix, arg string) ([]string, error) { branchName = branchName[:len(branchName)-1] } branchNames = append(branchNames, branchName) + i++ } + return branchNames, nil } diff --git a/modules/git/repo_branch_test.go b/modules/git/repo_branch_test.go index 33d31aef686de..8f051067a8968 100644 --- a/modules/git/repo_branch_test.go +++ b/modules/git/repo_branch_test.go @@ -17,7 +17,13 @@ func TestRepository_GetBranches(t *testing.T) { assert.NoError(t, err) defer bareRepo1.Close() - branches, err := bareRepo1.GetBranches() + branches, err := bareRepo1.GetBranches(0, 2) + + assert.NoError(t, err) + assert.Len(t, branches, 2) + assert.ElementsMatch(t, []string{"branch1", "branch2"}, branches) + + branches, err = bareRepo1.GetBranches(0, 0) assert.NoError(t, err) assert.Len(t, branches, 3) @@ -33,7 +39,7 @@ func BenchmarkRepository_GetBranches(b *testing.B) { defer bareRepo1.Close() for i := 0; i < b.N; i++ { - _, err := bareRepo1.GetBranches() + _, err := bareRepo1.GetBranches(0, 0) if err != nil { b.Fatal(err) } diff --git a/modules/git/repo_tag_nogogit.go b/modules/git/repo_tag_nogogit.go index 83cbc58e342ee..37137357e7fc1 100644 --- a/modules/git/repo_tag_nogogit.go +++ b/modules/git/repo_tag_nogogit.go @@ -14,5 +14,5 @@ func (repo *Repository) IsTagExist(name string) bool { // GetTags returns all tags of the repository. func (repo *Repository) GetTags() ([]string, error) { - return callShowRef(repo.Path, TagPrefix, "--tags") + return callShowRef(repo.Path, TagPrefix, "--tags", 0, 0) } diff --git a/modules/repository/init.go b/modules/repository/init.go index a100456e778e9..600c504447b1c 100644 --- a/modules/repository/init.go +++ b/modules/repository/init.go @@ -239,7 +239,7 @@ func adoptRepository(ctx models.DBContext, repoPath string, u *models.User, repo repo.DefaultBranch = strings.TrimPrefix(repo.DefaultBranch, git.BranchPrefix) } - branches, _ := gitRepo.GetBranches() + branches, _ := gitRepo.GetBranches(0, 0) found := false hasDefault := false hasMaster := false diff --git a/routers/repo/compare.go b/routers/repo/compare.go index aa4b3191b2e63..a5ed7dddc42cc 100644 --- a/routers/repo/compare.go +++ b/routers/repo/compare.go @@ -520,7 +520,7 @@ func getBranchesForRepo(user *models.User, repo *models.Repository) (bool, []str } defer gitRepo.Close() - branches, err := gitRepo.GetBranches() + branches, err := gitRepo.GetBranches(0, 0) if err != nil { return false, nil, err } @@ -541,7 +541,7 @@ func CompareDiff(ctx *context.Context) { } if ctx.Data["PageIsComparePull"] == true { - headBranches, err := headGitRepo.GetBranches() + headBranches, err := headGitRepo.GetBranches(0, 0) if err != nil { ctx.ServerError("GetBranches", err) return diff --git a/routers/repo/issue.go b/routers/repo/issue.go index fb7107451fed7..a0d638239ab12 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -678,7 +678,7 @@ func RetrieveRepoMetas(ctx *context.Context, repo *models.Repository, isPull boo return nil } - brs, err := ctx.Repo.GitRepo.GetBranches() + brs, err := ctx.Repo.GitRepo.GetBranches(0, 0) if err != nil { ctx.ServerError("GetBranches", err) return nil From ab887a2c0962c87669dcb9e3af38a41ed5edae27 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 30 Jan 2021 15:41:07 +0100 Subject: [PATCH 04/11] Move routers/api/v1/utils/utils PaginateSlice -> modules/util/paginate.go --- modules/util/paginate.go | 34 +++++++++++++++++++ .../util/paginate_test.go | 2 +- routers/api/v1/org/org.go | 3 +- routers/api/v1/repo/branch.go | 3 +- routers/api/v1/utils/utils.go | 28 --------------- 5 files changed, 39 insertions(+), 31 deletions(-) create mode 100644 modules/util/paginate.go rename routers/api/v1/utils/utils_test.go => modules/util/paginate_test.go (98%) diff --git a/modules/util/paginate.go b/modules/util/paginate.go new file mode 100644 index 0000000000000..67eb0dcc97d3d --- /dev/null +++ b/modules/util/paginate.go @@ -0,0 +1,34 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package util + +import "reflect" + +// PaginateSlice cut a slice as per pagination options +// if page = 0 it do not paginate +func PaginateSlice(list interface{}, page, pageSize int) interface{} { + if page <= 0 || pageSize <= 0 { + return list + } + listValue := reflect.ValueOf(list) + + if reflect.TypeOf(list).Kind() != reflect.Slice { + return list + } + + page-- + + if page*pageSize >= listValue.Len() { + return listValue.Slice(listValue.Len(), listValue.Len()).Interface() + } + + listValue = listValue.Slice(page*pageSize, listValue.Len()) + + if listValue.Len() > pageSize { + return listValue.Slice(0, pageSize).Interface() + } + + return listValue.Interface() +} diff --git a/routers/api/v1/utils/utils_test.go b/modules/util/paginate_test.go similarity index 98% rename from routers/api/v1/utils/utils_test.go rename to modules/util/paginate_test.go index cea7c30b92d58..d962e04c1603b 100644 --- a/routers/api/v1/utils/utils_test.go +++ b/modules/util/paginate_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. -package utils +package util import ( "testing" diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index 37d6346f1f75b..e0f36aa1e657d 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -13,6 +13,7 @@ import ( "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/user" "code.gitea.io/gitea/routers/api/v1/utils" @@ -30,7 +31,7 @@ func listUserOrgs(ctx *context.APIContext, u *models.User) { } maxResults := len(orgs) - orgs, _ = utils.PaginateSlice(orgs, listOptions.Page, listOptions.PageSize).([]*models.User) + orgs, _ = util.PaginateSlice(orgs, listOptions.Page, listOptions.PageSize).([]*models.User) apiOrgs := make([]*api.Organization, len(orgs)) for i := range orgs { diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 925b1b484ddca..fd651eae67c4f 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -16,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/log" repo_module "code.gitea.io/gitea/modules/repository" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" pull_service "code.gitea.io/gitea/services/pull" @@ -306,7 +307,7 @@ func ListBranches(ctx *context.APIContext) { } maxResults := len(branches) - branches, _ = utils.PaginateSlice(branches, listOptions.Page, listOptions.PageSize).([]*git.Branch) + branches, _ = util.PaginateSlice(branches, listOptions.Page, listOptions.PageSize).([]*git.Branch) apiBranches := make([]*api.Branch, len(branches)) for i := range branches { diff --git a/routers/api/v1/utils/utils.go b/routers/api/v1/utils/utils.go index 679804426213c..ad1a136db463a 100644 --- a/routers/api/v1/utils/utils.go +++ b/routers/api/v1/utils/utils.go @@ -6,7 +6,6 @@ package utils import ( "net/url" - "reflect" "strings" "time" @@ -67,30 +66,3 @@ func GetListOptions(ctx *context.APIContext) models.ListOptions { PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")), } } - -// PaginateSlice cut a slice as per pagination options -// if page = 0 it do not paginate -func PaginateSlice(list interface{}, page, pageSize int) interface{} { - if page <= 0 || pageSize <= 0 { - return list - } - listValue := reflect.ValueOf(list) - - if reflect.TypeOf(list).Kind() != reflect.Slice { - return list - } - - page-- - - if page*pageSize >= listValue.Len() { - return listValue.Slice(listValue.Len(), listValue.Len()).Interface() - } - - listValue = listValue.Slice(page*pageSize, listValue.Len()) - - if listValue.Len() > pageSize { - return listValue.Slice(0, pageSize).Interface() - } - - return listValue.Interface() -} From 179efd834f5fa073d3a65ca785169412f6ccc087 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 30 Jan 2021 16:23:28 +0100 Subject: [PATCH 05/11] repo_module.GetBranches paginate --- modules/context/repo.go | 4 +-- modules/git/repo_branch.go | 11 +++++---- modules/git/repo_branch_gogit.go | 8 +++--- modules/git/repo_branch_nogogit.go | 39 +++++++++++++++++++----------- modules/git/repo_branch_test.go | 15 +++++++++--- modules/git/repo_tag_nogogit.go | 5 ++-- modules/repository/branch.go | 7 +++--- modules/repository/init.go | 2 +- routers/api/v1/repo/branch.go | 12 +++------ routers/repo/branch.go | 30 +++++++++-------------- routers/repo/compare.go | 4 +-- routers/repo/issue.go | 2 +- services/mirror/mirror.go | 2 +- services/pull/pull.go | 2 +- 14 files changed, 78 insertions(+), 65 deletions(-) diff --git a/modules/context/repo.go b/modules/context/repo.go index 7b501ec082b98..bf149b8158ac9 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -554,7 +554,7 @@ func RepoAssignment() func(http.Handler) http.Handler { } ctx.Data["Tags"] = tags - brs, err := ctx.Repo.GitRepo.GetBranches(0, 0) + brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) if err != nil { ctx.ServerError("GetBranches", err) return @@ -747,7 +747,7 @@ func RepoRefByType(refType RepoRefType) func(http.Handler) http.Handler { refName = ctx.Repo.Repository.DefaultBranch ctx.Repo.BranchName = refName if !ctx.Repo.GitRepo.IsBranchExist(refName) { - brs, err := ctx.Repo.GitRepo.GetBranches(0, 0) + brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) if err != nil { ctx.ServerError("GetBranches", err) return diff --git a/modules/git/repo_branch.go b/modules/git/repo_branch.go index 71952a62f5bc7..58781eb1c71a1 100644 --- a/modules/git/repo_branch.go +++ b/modules/git/repo_branch.go @@ -78,16 +78,17 @@ func (repo *Repository) GetBranch(branch string) (*Branch, error) { } // GetBranchesByPath returns a branch by it's path -func GetBranchesByPath(path string) ([]*Branch, error) { +// if limit = 0 it will not limit +func GetBranchesByPath(path string, skip, limit int) ([]*Branch, int, error) { gitRepo, err := OpenRepository(path) if err != nil { - return nil, err + return nil, 0, err } defer gitRepo.Close() - brs, err := gitRepo.GetBranches(0, 0) + brs, countAll, err := gitRepo.GetBranches(skip, limit) if err != nil { - return nil, err + return nil, 0, err } branches := make([]*Branch, len(brs)) @@ -99,7 +100,7 @@ func GetBranchesByPath(path string) ([]*Branch, error) { } } - return branches, nil + return branches, countAll, nil } // DeleteBranchOptions Option(s) for delete branch diff --git a/modules/git/repo_branch_gogit.go b/modules/git/repo_branch_gogit.go index e4621080f46e8..036ece415ad52 100644 --- a/modules/git/repo_branch_gogit.go +++ b/modules/git/repo_branch_gogit.go @@ -27,16 +27,18 @@ func (repo *Repository) IsBranchExist(name string) bool { // GetBranches returns all branches of the repository. // if limit = 0 it will not limit -func (repo *Repository) GetBranches(skip, limit int) ([]string, error) { +func (repo *Repository) GetBranches(skip, limit int) ([]string, int, error) { var branchNames []string branches, err := repo.gogitRepo.Branches() if err != nil { - return nil, err + return nil, 0, err } i := 0 + count := 0 _ = branches.ForEach(func(branch *plumbing.Reference) error { + count++ if i < skip { i++ return nil @@ -49,5 +51,5 @@ func (repo *Repository) GetBranches(skip, limit int) ([]string, error) { // TODO: Sort? - return branchNames, nil + return branchNames, count, nil } diff --git a/modules/git/repo_branch_nogogit.go b/modules/git/repo_branch_nogogit.go index cb3005ea3a00e..6fb9214bfd941 100644 --- a/modules/git/repo_branch_nogogit.go +++ b/modules/git/repo_branch_nogogit.go @@ -23,14 +23,12 @@ func (repo *Repository) IsBranchExist(name string) bool { // GetBranches returns all branches of the repository. // if limit = 0 it will not limit -func (repo *Repository) GetBranches(skip, limit int) ([]string, error) { +func (repo *Repository) GetBranches(skip, limit int) ([]string, int, error) { return callShowRef(repo.Path, BranchPrefix, "--heads", skip, limit) } // callShowRef return refs, if limit = 0 it will not limit -func callShowRef(repoPath, prefix, arg string, skip, limit int) ([]string, error) { - var branchNames []string - +func callShowRef(repoPath, prefix, arg string, skip, limit int) (branchNames []string, countAll int, err error) { stdoutReader, stdoutWriter := io.Pipe() defer func() { _ = stdoutReader.Close() @@ -55,14 +53,14 @@ func callShowRef(repoPath, prefix, arg string, skip, limit int) ([]string, error bufReader := bufio.NewReader(stdoutReader) for i < skip { _, isPrefix, err := bufReader.ReadLine() - if !isPrefix { - i++ - } if err == io.EOF { - return branchNames, nil + return branchNames, i, nil } if err != nil { - return nil, err + return nil, 0, err + } + if !isPrefix { + i++ } } for limit == 0 || i < skip+limit { @@ -74,19 +72,19 @@ func callShowRef(repoPath, prefix, arg string, skip, limit int) ([]string, error _, err = bufReader.ReadSlice(' ') } if err == io.EOF { - return branchNames, nil + return branchNames, i, nil } if err != nil { - return nil, err + return nil, 0, err } branchName, err := bufReader.ReadString('\n') if err == io.EOF { // This shouldn't happen... but we'll tolerate it for the sake of peace - return branchNames, nil + return branchNames, i, nil } if err != nil { - return nil, err + return nil, i, err } branchName = strings.TrimPrefix(branchName, prefix) if len(branchName) > 0 { @@ -95,5 +93,18 @@ func callShowRef(repoPath, prefix, arg string, skip, limit int) ([]string, error branchNames = append(branchNames, branchName) i++ } - return branchNames, nil + // count all refs + for limit != 0 { + _, isPrefix, err := bufReader.ReadLine() + if err == io.EOF { + return branchNames, i, nil + } + if err != nil { + return nil, 0, err + } + if !isPrefix { + i++ + } + } + return branchNames, i, nil } diff --git a/modules/git/repo_branch_test.go b/modules/git/repo_branch_test.go index 8f051067a8968..05d5237e6a65b 100644 --- a/modules/git/repo_branch_test.go +++ b/modules/git/repo_branch_test.go @@ -17,17 +17,26 @@ func TestRepository_GetBranches(t *testing.T) { assert.NoError(t, err) defer bareRepo1.Close() - branches, err := bareRepo1.GetBranches(0, 2) + branches, countAll, err := bareRepo1.GetBranches(0, 2) assert.NoError(t, err) assert.Len(t, branches, 2) + assert.EqualValues(t, 3, countAll) assert.ElementsMatch(t, []string{"branch1", "branch2"}, branches) - branches, err = bareRepo1.GetBranches(0, 0) + branches, countAll, err = bareRepo1.GetBranches(0, 0) assert.NoError(t, err) assert.Len(t, branches, 3) + assert.EqualValues(t, 3, countAll) assert.ElementsMatch(t, []string{"branch1", "branch2", "master"}, branches) + + branches, countAll, err = bareRepo1.GetBranches(5, 1) + + assert.NoError(t, err) + assert.Len(t, branches, 0) + assert.EqualValues(t, 3, countAll) + assert.ElementsMatch(t, []string{}, branches) } func BenchmarkRepository_GetBranches(b *testing.B) { @@ -39,7 +48,7 @@ func BenchmarkRepository_GetBranches(b *testing.B) { defer bareRepo1.Close() for i := 0; i < b.N; i++ { - _, err := bareRepo1.GetBranches(0, 0) + _, _, err := bareRepo1.GetBranches(0, 0) if err != nil { b.Fatal(err) } diff --git a/modules/git/repo_tag_nogogit.go b/modules/git/repo_tag_nogogit.go index 37137357e7fc1..b3fa5d6dc4077 100644 --- a/modules/git/repo_tag_nogogit.go +++ b/modules/git/repo_tag_nogogit.go @@ -13,6 +13,7 @@ func (repo *Repository) IsTagExist(name string) bool { } // GetTags returns all tags of the repository. -func (repo *Repository) GetTags() ([]string, error) { - return callShowRef(repo.Path, TagPrefix, "--tags", 0, 0) +func (repo *Repository) GetTags() (tags []string, err error) { + tags, _, err = callShowRef(repo.Path, TagPrefix, "--tags", 0, 0) + return } diff --git a/modules/repository/branch.go b/modules/repository/branch.go index d369a200b0539..94b82cf860066 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -23,8 +23,9 @@ func GetBranch(repo *models.Repository, branch string) (*git.Branch, error) { } // GetBranches returns all the branches of a repository -func GetBranches(repo *models.Repository) ([]*git.Branch, error) { - return git.GetBranchesByPath(repo.RepoPath()) +// if limit = 0 it will not limit +func GetBranches(repo *models.Repository, skip, limit int) ([]*git.Branch, int, error) { + return git.GetBranchesByPath(repo.RepoPath(), skip, limit) } // checkBranchName validates branch name with existing repository branches @@ -35,7 +36,7 @@ func checkBranchName(repo *models.Repository, name string) error { } defer gitRepo.Close() - branches, err := GetBranches(repo) + branches, _, err := GetBranches(repo, 0, 0) if err != nil { return err } diff --git a/modules/repository/init.go b/modules/repository/init.go index 600c504447b1c..50cde4c0b9d17 100644 --- a/modules/repository/init.go +++ b/modules/repository/init.go @@ -239,7 +239,7 @@ func adoptRepository(ctx models.DBContext, repoPath string, u *models.User, repo repo.DefaultBranch = strings.TrimPrefix(repo.DefaultBranch, git.BranchPrefix) } - branches, _ := gitRepo.GetBranches(0, 0) + branches, _, _ := gitRepo.GetBranches(0, 0) found := false hasDefault := false hasMaster := false diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index fd651eae67c4f..451fdcf516f04 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -16,7 +16,6 @@ import ( "code.gitea.io/gitea/modules/log" repo_module "code.gitea.io/gitea/modules/repository" api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" pull_service "code.gitea.io/gitea/services/pull" @@ -299,16 +298,13 @@ func ListBranches(ctx *context.APIContext) { // "$ref": "#/responses/BranchList" listOptions := utils.GetListOptions(ctx) - - branches, err := repo_module.GetBranches(ctx.Repo.Repository) + skip, _ := listOptions.GetStartEnd() + branches, totalNumOfBranches, err := repo_module.GetBranches(ctx.Repo.Repository, skip, listOptions.PageSize) if err != nil { ctx.Error(http.StatusInternalServerError, "GetBranches", err) return } - maxResults := len(branches) - branches, _ = util.PaginateSlice(branches, listOptions.Page, listOptions.PageSize).([]*git.Branch) - apiBranches := make([]*api.Branch, len(branches)) for i := range branches { c, err := branches[i].GetCommit() @@ -328,8 +324,8 @@ func ListBranches(ctx *context.APIContext) { } } - ctx.SetLinkHeader(int(maxResults), listOptions.PageSize) - ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults)) + ctx.SetLinkHeader(int(totalNumOfBranches), listOptions.PageSize) + ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", totalNumOfBranches)) ctx.Header().Set("Access-Control-Expose-Headers", "X-Total-Count, Link") ctx.JSON(http.StatusOK, &apiBranches) } diff --git a/routers/repo/branch.go b/routers/repo/branch.go index 7d844abe5a023..5e8b094bb4ed6 100644 --- a/routers/repo/branch.go +++ b/routers/repo/branch.go @@ -196,7 +196,7 @@ func deleteBranch(ctx *context.Context, branchName string) error { } // loadBranches loads branches from the repository limited by page & pageSize. -// NOTE: May write to context on error. page & pageSize must be > 0 +// NOTE: May write to context on error. func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) { defaultBranch, err := repo_module.GetBranch(ctx.Repo.Repository, ctx.Repo.Repository.DefaultBranch) if err != nil { @@ -204,7 +204,9 @@ func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) { return nil, 0 } - rawBranches, err := repo_module.GetBranches(ctx.Repo.Repository) + skip, _ := models.ListOptions{Page: page, PageSize: pageSize}.GetStartEnd() + + rawBranches, totalNumOfBranches, err := repo_module.GetBranches(ctx.Repo.Repository, skip, pageSize) if err != nil { ctx.ServerError("GetBranches", err) return nil, 0 @@ -222,28 +224,18 @@ func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) { repoIDToGitRepo := map[int64]*git.Repository{} repoIDToGitRepo[ctx.Repo.Repository.ID] = ctx.Repo.GitRepo - var totalNumOfBranches = len(rawBranches) - var startIndex = (page - 1) * pageSize - if startIndex > totalNumOfBranches { - startIndex = totalNumOfBranches - 1 - } - var endIndex = startIndex + pageSize - if endIndex > totalNumOfBranches { - endIndex = totalNumOfBranches - 1 - } - var branches []*Branch - for i := startIndex; i < endIndex; i++ { + for i := range rawBranches { + if strings.EqualFold(rawBranches[i].Name, ctx.Repo.Repository.DefaultBranch) { + // Skip default branch + continue + } + var branch = loadOneBranch(ctx, rawBranches[i], protectedBranches, repoIDToRepo, repoIDToGitRepo) if branch == nil { return nil, 0 } - if branch.Name == ctx.Repo.Repository.DefaultBranch { - // Skip default branch - continue - } - branches = append(branches, branch) } @@ -259,7 +251,7 @@ func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) { branches = append(branches, deletedBranches...) } - return branches, len(rawBranches) - 1 + return branches, totalNumOfBranches - 1 } func loadOneBranch(ctx *context.Context, rawBranch *git.Branch, protectedBranches []*models.ProtectedBranch, diff --git a/routers/repo/compare.go b/routers/repo/compare.go index a5ed7dddc42cc..218f712469530 100644 --- a/routers/repo/compare.go +++ b/routers/repo/compare.go @@ -520,7 +520,7 @@ func getBranchesForRepo(user *models.User, repo *models.Repository) (bool, []str } defer gitRepo.Close() - branches, err := gitRepo.GetBranches(0, 0) + branches, _, err := gitRepo.GetBranches(0, 0) if err != nil { return false, nil, err } @@ -541,7 +541,7 @@ func CompareDiff(ctx *context.Context) { } if ctx.Data["PageIsComparePull"] == true { - headBranches, err := headGitRepo.GetBranches(0, 0) + headBranches, _, err := headGitRepo.GetBranches(0, 0) if err != nil { ctx.ServerError("GetBranches", err) return diff --git a/routers/repo/issue.go b/routers/repo/issue.go index a0d638239ab12..3bc20839aa44c 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -678,7 +678,7 @@ func RetrieveRepoMetas(ctx *context.Context, repo *models.Repository, isPull boo return nil } - brs, err := ctx.Repo.GitRepo.GetBranches(0, 0) + brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) if err != nil { ctx.ServerError("GetBranches", err) return nil diff --git a/services/mirror/mirror.go b/services/mirror/mirror.go index 328e23ad2fc75..e4981b8c00e64 100644 --- a/services/mirror/mirror.go +++ b/services/mirror/mirror.go @@ -301,7 +301,7 @@ func runSync(m *models.Mirror) ([]*mirrorSyncResult, bool) { } log.Trace("SyncMirrors [repo: %-v]: invalidating mirror branch caches...", m.Repo) - branches, err := repo_module.GetBranches(m.Repo) + branches, _, err := repo_module.GetBranches(m.Repo, 0, 0) if err != nil { log.Error("GetBranches: %v", err) return nil, false diff --git a/services/pull/pull.go b/services/pull/pull.go index 92f1ff65fb2fd..4f742f5a1a6a8 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -482,7 +482,7 @@ func CloseBranchPulls(doer *models.User, repoID int64, branch string) error { // CloseRepoBranchesPulls close all pull requests which head branches are in the given repository func CloseRepoBranchesPulls(doer *models.User, repo *models.Repository) error { - branches, err := git.GetBranchesByPath(repo.RepoPath()) + branches, _, err := git.GetBranchesByPath(repo.RepoPath(), 0, 0) if err != nil { return err } From aa7e795ebb027e513007db37ed1b16616b4c1726 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 30 Jan 2021 19:15:35 +0100 Subject: [PATCH 06/11] fix & rename & more logging --- integrations/branches_test.go | 6 ++++-- modules/git/repo_branch_gogit.go | 3 ++- modules/repository/branch.go | 3 +++ routers/repo/branch.go | 33 ++++++++++++++++++++------------ 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/integrations/branches_test.go b/integrations/branches_test.go index 2b9fc8dda5d75..b2230e7031bf4 100644 --- a/integrations/branches_test.go +++ b/integrations/branches_test.go @@ -57,7 +57,9 @@ func branchAction(t *testing.T, button string) (*HTMLDoc, string) { htmlDoc := NewHTMLParser(t, resp.Body) link, exists := htmlDoc.doc.Find(button).Attr("data-url") - assert.True(t, exists, "The template has changed") + if !assert.True(t, exists, "The template has changed") { + t.Skip() + } req = NewRequestWithValues(t, "POST", link, map[string]string{ "_csrf": getCsrf(t, htmlDoc.doc), @@ -69,7 +71,7 @@ func branchAction(t *testing.T, button string) (*HTMLDoc, string) { req = NewRequest(t, "GET", "/user2/repo1/branches") resp = session.MakeRequest(t, req, http.StatusOK) - return NewHTMLParser(t, resp.Body), url.Query()["name"][0] + return NewHTMLParser(t, resp.Body), url.Query().Get("name") } func getCsrf(t *testing.T, doc *goquery.Document) string { diff --git a/modules/git/repo_branch_gogit.go b/modules/git/repo_branch_gogit.go index 036ece415ad52..36157acf76540 100644 --- a/modules/git/repo_branch_gogit.go +++ b/modules/git/repo_branch_gogit.go @@ -42,9 +42,10 @@ func (repo *Repository) GetBranches(skip, limit int) ([]string, int, error) { if i < skip { i++ return nil - } else if limit != 0 && i < skip+limit { + } else if limit != 0 && count > skip+limit { return nil } + branchNames = append(branchNames, strings.TrimPrefix(branch.Name().String(), BranchPrefix)) return nil }) diff --git a/modules/repository/branch.go b/modules/repository/branch.go index 94b82cf860066..631e09597edce 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -13,6 +13,9 @@ import ( // GetBranch returns a branch by its name func GetBranch(repo *models.Repository, branch string) (*git.Branch, error) { + if len(branch) == 0 { + return nil, fmt.Errorf("GetBranch: empty string for branch") + } gitRepo, err := git.OpenRepository(repo.RepoPath()) if err != nil { return nil, err diff --git a/routers/repo/branch.go b/routers/repo/branch.go index 5e8b094bb4ed6..41c0f843311f3 100644 --- a/routers/repo/branch.go +++ b/routers/repo/branch.go @@ -58,12 +58,14 @@ func Branches(ctx *context.Context) { page = 1 } - pageSize := ctx.QueryInt("limit") - if pageSize <= 0 || pageSize > git.BranchesRangeSize { - pageSize = git.BranchesRangeSize + limit := ctx.QueryInt("limit") + if limit <= 0 || limit > git.BranchesRangeSize { + limit = git.BranchesRangeSize } - branches, branchesCount := loadBranches(ctx, page, pageSize) + skip := (page - 1) * limit + log.Info("Branches: skip: %d limit: %d", skip, limit) + branches, branchesCount := loadBranches(ctx, skip, limit) if ctx.Written() { return } @@ -80,6 +82,7 @@ func DeleteBranchPost(ctx *context.Context) { defer redirect(ctx) branchName := ctx.Query("name") if branchName == ctx.Repo.Repository.DefaultBranch { + log.Warn("DeleteBranch: Can't delete default branch '%s'", branchName) ctx.Flash.Error(ctx.Tr("repo.branch.default_deletion_failed", branchName)) return } @@ -92,16 +95,19 @@ func DeleteBranchPost(ctx *context.Context) { } if isProtected { + log.Warn("DeleteBranch: Can't delete protected branch '%s'", branchName) ctx.Flash.Error(ctx.Tr("repo.branch.protected_deletion_failed", branchName)) return } - if !ctx.Repo.GitRepo.IsBranchExist(branchName) || branchName == ctx.Repo.Repository.DefaultBranch { + if !ctx.Repo.GitRepo.IsBranchExist(branchName) { + log.Warn("DeleteBranch: Can't delete non existing branch '%s'", branchName) ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", branchName)) return } if err := deleteBranch(ctx, branchName); err != nil { + log.Error("DeleteBranch: %v", err) ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", branchName)) return } @@ -129,10 +135,11 @@ func RestoreBranchPost(ctx *context.Context) { Env: models.PushingEnvironment(ctx.User, ctx.Repo.Repository), }); err != nil { if strings.Contains(err.Error(), "already exists") { + log.Warn("RestoreBranch: Can't restore branch '%s', since one with same name already exist", deletedBranch.Name) ctx.Flash.Error(ctx.Tr("repo.branch.already_exists", deletedBranch.Name)) return } - log.Error("CreateBranch: %v", err) + log.Error("RestoreBranch: CreateBranch: %v", err) ctx.Flash.Error(ctx.Tr("repo.branch.restore_failed", deletedBranch.Name)) return } @@ -148,7 +155,7 @@ func RestoreBranchPost(ctx *context.Context) { RepoUserName: ctx.Repo.Owner.Name, RepoName: ctx.Repo.Repository.Name, }); err != nil { - log.Error("Update: %v", err) + log.Error("RestoreBranch: Update: %v", err) } ctx.Flash.Success(ctx.Tr("repo.branch.restore_success", deletedBranch.Name)) @@ -197,17 +204,17 @@ func deleteBranch(ctx *context.Context, branchName string) error { // loadBranches loads branches from the repository limited by page & pageSize. // NOTE: May write to context on error. -func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) { +func loadBranches(ctx *context.Context, skip, limit int) ([]*Branch, int) { defaultBranch, err := repo_module.GetBranch(ctx.Repo.Repository, ctx.Repo.Repository.DefaultBranch) if err != nil { + log.Error("loadBranches: get default branch: %v", err) ctx.ServerError("GetDefaultBranch", err) return nil, 0 } - skip, _ := models.ListOptions{Page: page, PageSize: pageSize}.GetStartEnd() - - rawBranches, totalNumOfBranches, err := repo_module.GetBranches(ctx.Repo.Repository, skip, pageSize) + rawBranches, totalNumOfBranches, err := repo_module.GetBranches(ctx.Repo.Repository, skip, limit) if err != nil { + log.Error("GetBranches: %v", err) ctx.ServerError("GetBranches", err) return nil, 0 } @@ -226,7 +233,7 @@ func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) { var branches []*Branch for i := range rawBranches { - if strings.EqualFold(rawBranches[i].Name, ctx.Repo.Repository.DefaultBranch) { + if rawBranches[i].Name == defaultBranch.Name { // Skip default branch continue } @@ -240,6 +247,7 @@ func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) { } // Always add the default branch + log.Info("loadOneBranch: load default: '%s'", defaultBranch.Name) branches = append(branches, loadOneBranch(ctx, defaultBranch, protectedBranches, repoIDToRepo, repoIDToGitRepo)) if ctx.Repo.CanWrite(models.UnitTypeCode) { @@ -257,6 +265,7 @@ func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) { func loadOneBranch(ctx *context.Context, rawBranch *git.Branch, protectedBranches []*models.ProtectedBranch, repoIDToRepo map[int64]*models.Repository, repoIDToGitRepo map[int64]*git.Repository) *Branch { + log.Info("loadOneBranch: '%s'", rawBranch.Name) commit, err := rawBranch.GetCommit() if err != nil { From f0389240f2e1fabc8442aceb111ed87bfcb7ae2f Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 2 Feb 2021 20:17:15 +0100 Subject: [PATCH 07/11] better description --- modules/git/repo_branch_gogit.go | 4 ++-- modules/git/repo_branch_nogogit.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/git/repo_branch_gogit.go b/modules/git/repo_branch_gogit.go index 36157acf76540..b00253f6ffd66 100644 --- a/modules/git/repo_branch_gogit.go +++ b/modules/git/repo_branch_gogit.go @@ -25,8 +25,8 @@ func (repo *Repository) IsBranchExist(name string) bool { return reference.Type() != plumbing.InvalidReference } -// GetBranches returns all branches of the repository. -// if limit = 0 it will not limit +// GetBranches returns branches from the repository, skipping skip initial branches and +// returning at most limit branches, or all branches if limit is 0. func (repo *Repository) GetBranches(skip, limit int) ([]string, int, error) { var branchNames []string diff --git a/modules/git/repo_branch_nogogit.go b/modules/git/repo_branch_nogogit.go index 6fb9214bfd941..0628a572859c1 100644 --- a/modules/git/repo_branch_nogogit.go +++ b/modules/git/repo_branch_nogogit.go @@ -21,8 +21,8 @@ func (repo *Repository) IsBranchExist(name string) bool { return IsReferenceExist(repo.Path, BranchPrefix+name) } -// GetBranches returns all branches of the repository. -// if limit = 0 it will not limit +// GetBranches returns branches from the repository, skipping skip initial branches and +// returning at most limit branches, or all branches if limit is 0. func (repo *Repository) GetBranches(skip, limit int) ([]string, int, error) { return callShowRef(repo.Path, BranchPrefix, "--heads", skip, limit) } From 0637264479bfcd7671ba13eb4d54466ad479e163 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 2 Feb 2021 20:37:12 +0100 Subject: [PATCH 08/11] Update routers/repo/branch.go Co-authored-by: zeripath --- routers/repo/branch.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/routers/repo/branch.go b/routers/repo/branch.go index 41c0f843311f3..cf6abc08df525 100644 --- a/routers/repo/branch.go +++ b/routers/repo/branch.go @@ -64,7 +64,7 @@ func Branches(ctx *context.Context) { } skip := (page - 1) * limit - log.Info("Branches: skip: %d limit: %d", skip, limit) + log.Debug("Branches: skip: %d limit: %d", skip, limit) branches, branchesCount := loadBranches(ctx, skip, limit) if ctx.Written() { return @@ -82,7 +82,7 @@ func DeleteBranchPost(ctx *context.Context) { defer redirect(ctx) branchName := ctx.Query("name") if branchName == ctx.Repo.Repository.DefaultBranch { - log.Warn("DeleteBranch: Can't delete default branch '%s'", branchName) + log.Debug("DeleteBranch: Can't delete default branch '%s'", branchName) ctx.Flash.Error(ctx.Tr("repo.branch.default_deletion_failed", branchName)) return } @@ -95,13 +95,13 @@ func DeleteBranchPost(ctx *context.Context) { } if isProtected { - log.Warn("DeleteBranch: Can't delete protected branch '%s'", branchName) + log.Debug("DeleteBranch: Can't delete protected branch '%s'", branchName) ctx.Flash.Error(ctx.Tr("repo.branch.protected_deletion_failed", branchName)) return } if !ctx.Repo.GitRepo.IsBranchExist(branchName) { - log.Warn("DeleteBranch: Can't delete non existing branch '%s'", branchName) + log.Debug("DeleteBranch: Can't delete non existing branch '%s'", branchName) ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", branchName)) return } @@ -135,7 +135,7 @@ func RestoreBranchPost(ctx *context.Context) { Env: models.PushingEnvironment(ctx.User, ctx.Repo.Repository), }); err != nil { if strings.Contains(err.Error(), "already exists") { - log.Warn("RestoreBranch: Can't restore branch '%s', since one with same name already exist", deletedBranch.Name) + log.Debug("RestoreBranch: Can't restore branch '%s', since one with same name already exist", deletedBranch.Name) ctx.Flash.Error(ctx.Tr("repo.branch.already_exists", deletedBranch.Name)) return } @@ -247,7 +247,7 @@ func loadBranches(ctx *context.Context, skip, limit int) ([]*Branch, int) { } // Always add the default branch - log.Info("loadOneBranch: load default: '%s'", defaultBranch.Name) + log.Debug("loadOneBranch: load default: '%s'", defaultBranch.Name) branches = append(branches, loadOneBranch(ctx, defaultBranch, protectedBranches, repoIDToRepo, repoIDToGitRepo)) if ctx.Repo.CanWrite(models.UnitTypeCode) { @@ -265,7 +265,7 @@ func loadBranches(ctx *context.Context, skip, limit int) ([]*Branch, int) { func loadOneBranch(ctx *context.Context, rawBranch *git.Branch, protectedBranches []*models.ProtectedBranch, repoIDToRepo map[int64]*models.Repository, repoIDToGitRepo map[int64]*git.Repository) *Branch { - log.Info("loadOneBranch: '%s'", rawBranch.Name) + log.Trace("loadOneBranch: '%s'", rawBranch.Name) commit, err := rawBranch.GetCommit() if err != nil { From 8f70491240963f6cb211399594d472b1910f8da0 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 2 Feb 2021 20:40:24 +0100 Subject: [PATCH 09/11] update desc --- modules/repository/branch.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/repository/branch.go b/modules/repository/branch.go index 631e09597edce..275bae91e3f9b 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -25,8 +25,8 @@ func GetBranch(repo *models.Repository, branch string) (*git.Branch, error) { return gitRepo.GetBranch(branch) } -// GetBranches returns all the branches of a repository -// if limit = 0 it will not limit +// GetBranches returns branches from the repository, skipping skip initial branches and +// returning at most limit branches, or all branches if limit is 0. func GetBranches(repo *models.Repository, skip, limit int) ([]*git.Branch, int, error) { return git.GetBranchesByPath(repo.RepoPath(), skip, limit) } From c96071597781150f09c401b150ade076e65cf775 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 3 Feb 2021 17:07:45 +0100 Subject: [PATCH 10/11] impruve modules/util/paginate.go Co-authored-by: a1012112796 <1012112796@qq.com> --- modules/util/paginate.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/util/paginate.go b/modules/util/paginate.go index 67eb0dcc97d3d..2baa71664ed25 100644 --- a/modules/util/paginate.go +++ b/modules/util/paginate.go @@ -12,12 +12,12 @@ func PaginateSlice(list interface{}, page, pageSize int) interface{} { if page <= 0 || pageSize <= 0 { return list } - listValue := reflect.ValueOf(list) - if reflect.TypeOf(list).Kind() != reflect.Slice { return list } + listValue := reflect.ValueOf(list) + page-- if page*pageSize >= listValue.Len() { From 20f4546b664b307c34d5e28ae15644ebeebaec79 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 3 Feb 2021 17:17:10 +0100 Subject: [PATCH 11/11] CI.restart()