Skip to content

Commit a699af2

Browse files
committed
Add pager to the branches page
1 parent 632800e commit a699af2

File tree

3 files changed

+131
-80
lines changed

3 files changed

+131
-80
lines changed

modules/git/repo_commit.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ func (repo *Repository) GetCommitByPath(relpath string) (*Commit, error) {
110110
// CommitsRangeSize the default commits range size
111111
var CommitsRangeSize = 50
112112

113+
// BranchesRangeSize the default branches range size
114+
var BranchesRangeSize = 20
115+
113116
func (repo *Repository) commitsByRange(id SHA1, page, pageSize int) (*list.List, error) {
114117
stdout, err := NewCommand("log", id.String(), "--skip="+strconv.Itoa((page-1)*pageSize),
115118
"--max-count="+strconv.Itoa(pageSize), prettyLogFormat).RunInDirBytes(repo.Path)

routers/repo/branch.go

Lines changed: 125 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,22 @@ func Branches(ctx *context.Context) {
5252
ctx.Data["PageIsViewCode"] = true
5353
ctx.Data["PageIsBranches"] = true
5454

55-
ctx.Data["Branches"] = loadBranches(ctx)
55+
page := ctx.QueryInt("page")
56+
if page <= 1 {
57+
page = 1
58+
}
59+
60+
pageSize := ctx.QueryInt("limit")
61+
if pageSize <= 0 {
62+
pageSize = git.BranchesRangeSize
63+
}
64+
65+
branches, branchesCount := loadBranches(ctx, page, pageSize)
66+
ctx.Data["Branches"] = branches
67+
pager := context.NewPagination(int(branchesCount), git.BranchesRangeSize, page, 5)
68+
pager.SetDefaultParams(ctx)
69+
ctx.Data["Page"] = pager
70+
5671
ctx.HTML(200, tplBranch)
5772
}
5873

@@ -176,17 +191,18 @@ func deleteBranch(ctx *context.Context, branchName string) error {
176191
return nil
177192
}
178193

179-
func loadBranches(ctx *context.Context) []*Branch {
194+
func loadBranches(ctx *context.Context, page, pageSize int) ([]*Branch, int) {
195+
defaultBranch, err := repo_module.GetBranch(ctx.Repo.Repository, ctx.Repo.Repository.DefaultBranch)
180196
rawBranches, err := repo_module.GetBranches(ctx.Repo.Repository)
181197
if err != nil {
182198
ctx.ServerError("GetBranches", err)
183-
return nil
199+
return nil, 0
184200
}
185201

186202
protectedBranches, err := ctx.Repo.Repository.GetProtectedBranches()
187203
if err != nil {
188204
ctx.ServerError("GetProtectedBranches", err)
189-
return nil
205+
return nil, 0
190206
}
191207

192208
repoIDToRepo := map[int64]*models.Repository{}
@@ -195,100 +211,129 @@ func loadBranches(ctx *context.Context) []*Branch {
195211
repoIDToGitRepo := map[int64]*git.Repository{}
196212
repoIDToGitRepo[ctx.Repo.Repository.ID] = ctx.Repo.GitRepo
197213

198-
branches := make([]*Branch, len(rawBranches))
199-
for i := range rawBranches {
200-
commit, err := rawBranches[i].GetCommit()
214+
var totalNumOfBranches = len(rawBranches)
215+
var startIndex = (page - 1) * pageSize
216+
if startIndex > totalNumOfBranches {
217+
startIndex = totalNumOfBranches - 1
218+
}
219+
var endIndex = startIndex + pageSize
220+
if endIndex > totalNumOfBranches {
221+
endIndex = totalNumOfBranches - 1
222+
}
223+
224+
var branches []*Branch
225+
for i := startIndex; i < endIndex; i++ {
226+
var branch = loadOneBranch(ctx, rawBranches[i], protectedBranches, repoIDToRepo, repoIDToGitRepo)
227+
if branch == nil {
228+
return nil, 0
229+
}
230+
231+
if branch.Name == ctx.Repo.Repository.DefaultBranch {
232+
// Skip defult branch
233+
continue
234+
}
235+
236+
branches = append(branches, branch)
237+
}
238+
239+
// Always add the default branch
240+
branches = append(branches, loadOneBranch(ctx, defaultBranch, protectedBranches, repoIDToRepo, repoIDToGitRepo))
241+
242+
if ctx.Repo.CanWrite(models.UnitTypeCode) {
243+
deletedBranches, err := getDeletedBranches(ctx)
201244
if err != nil {
202-
ctx.ServerError("GetCommit", err)
203-
return nil
245+
ctx.ServerError("getDeletedBranches", err)
246+
return nil, 0
204247
}
248+
branches = append(branches, deletedBranches...)
249+
}
205250

206-
var isProtected bool
207-
branchName := rawBranches[i].Name
208-
for _, b := range protectedBranches {
209-
if b.BranchName == branchName {
210-
isProtected = true
211-
break
212-
}
251+
return branches, len(rawBranches) - 1
252+
}
253+
254+
func loadOneBranch(ctx *context.Context, rawBranch *git.Branch, protectedBranches []*models.ProtectedBranch,
255+
repoIDToRepo map[int64]*models.Repository,
256+
repoIDToGitRepo map[int64]*git.Repository) *Branch {
257+
258+
commit, err := rawBranch.GetCommit()
259+
if err != nil {
260+
ctx.ServerError("GetCommit", err)
261+
return nil
262+
}
263+
264+
branchName := rawBranch.Name
265+
var isProtected bool
266+
for _, b := range protectedBranches {
267+
if b.BranchName == branchName {
268+
isProtected = true
269+
break
213270
}
271+
}
272+
273+
divergence, divergenceError := repofiles.CountDivergingCommits(ctx.Repo.Repository, git.BranchPrefix+branchName)
274+
if divergenceError != nil {
275+
ctx.ServerError("CountDivergingCommits", divergenceError)
276+
return nil
277+
}
214278

215-
divergence, divergenceError := repofiles.CountDivergingCommits(ctx.Repo.Repository, git.BranchPrefix+branchName)
216-
if divergenceError != nil {
217-
ctx.ServerError("CountDivergingCommits", divergenceError)
279+
pr, err := models.GetLatestPullRequestByHeadInfo(ctx.Repo.Repository.ID, branchName)
280+
if err != nil {
281+
ctx.ServerError("GetLatestPullRequestByHeadInfo", err)
282+
return nil
283+
}
284+
headCommit := commit.ID.String()
285+
286+
mergeMovedOn := false
287+
if pr != nil {
288+
pr.HeadRepo = ctx.Repo.Repository
289+
if err := pr.LoadIssue(); err != nil {
290+
ctx.ServerError("pr.LoadIssue", err)
218291
return nil
219292
}
220-
221-
pr, err := models.GetLatestPullRequestByHeadInfo(ctx.Repo.Repository.ID, branchName)
222-
if err != nil {
223-
ctx.ServerError("GetLatestPullRequestByHeadInfo", err)
293+
if repo, ok := repoIDToRepo[pr.BaseRepoID]; ok {
294+
pr.BaseRepo = repo
295+
} else if err := pr.LoadBaseRepo(); err != nil {
296+
ctx.ServerError("pr.LoadBaseRepo", err)
224297
return nil
298+
} else {
299+
repoIDToRepo[pr.BaseRepoID] = pr.BaseRepo
225300
}
226-
headCommit := commit.ID.String()
301+
pr.Issue.Repo = pr.BaseRepo
227302

228-
mergeMovedOn := false
229-
if pr != nil {
230-
pr.HeadRepo = ctx.Repo.Repository
231-
if err := pr.LoadIssue(); err != nil {
232-
ctx.ServerError("pr.LoadIssue", err)
233-
return nil
303+
if pr.HasMerged {
304+
baseGitRepo, ok := repoIDToGitRepo[pr.BaseRepoID]
305+
if !ok {
306+
baseGitRepo, err = git.OpenRepository(pr.BaseRepo.RepoPath())
307+
if err != nil {
308+
ctx.ServerError("OpenRepository", err)
309+
return nil
310+
}
311+
defer baseGitRepo.Close()
312+
repoIDToGitRepo[pr.BaseRepoID] = baseGitRepo
234313
}
235-
if repo, ok := repoIDToRepo[pr.BaseRepoID]; ok {
236-
pr.BaseRepo = repo
237-
} else if err := pr.LoadBaseRepo(); err != nil {
238-
ctx.ServerError("pr.LoadBaseRepo", err)
314+
pullCommit, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName())
315+
if err != nil && !git.IsErrNotExist(err) {
316+
ctx.ServerError("GetBranchCommitID", err)
239317
return nil
240-
} else {
241-
repoIDToRepo[pr.BaseRepoID] = pr.BaseRepo
242318
}
243-
pr.Issue.Repo = pr.BaseRepo
244-
245-
if pr.HasMerged {
246-
baseGitRepo, ok := repoIDToGitRepo[pr.BaseRepoID]
247-
if !ok {
248-
baseGitRepo, err = git.OpenRepository(pr.BaseRepo.RepoPath())
249-
if err != nil {
250-
ctx.ServerError("OpenRepository", err)
251-
return nil
252-
}
253-
defer baseGitRepo.Close()
254-
repoIDToGitRepo[pr.BaseRepoID] = baseGitRepo
255-
}
256-
pullCommit, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName())
257-
if err != nil && !git.IsErrNotExist(err) {
258-
ctx.ServerError("GetBranchCommitID", err)
259-
return nil
260-
}
261-
if err == nil && headCommit != pullCommit {
262-
// the head has moved on from the merge - we shouldn't delete
263-
mergeMovedOn = true
264-
}
319+
if err == nil && headCommit != pullCommit {
320+
// the head has moved on from the merge - we shouldn't delete
321+
mergeMovedOn = true
265322
}
266323
}
267-
268-
isIncluded := divergence.Ahead == 0 && ctx.Repo.Repository.DefaultBranch != branchName
269-
270-
branches[i] = &Branch{
271-
Name: branchName,
272-
Commit: commit,
273-
IsProtected: isProtected,
274-
IsIncluded: isIncluded,
275-
CommitsAhead: divergence.Ahead,
276-
CommitsBehind: divergence.Behind,
277-
LatestPullRequest: pr,
278-
MergeMovedOn: mergeMovedOn,
279-
}
280324
}
281325

282-
if ctx.Repo.CanWrite(models.UnitTypeCode) {
283-
deletedBranches, err := getDeletedBranches(ctx)
284-
if err != nil {
285-
ctx.ServerError("getDeletedBranches", err)
286-
return nil
287-
}
288-
branches = append(branches, deletedBranches...)
326+
isIncluded := divergence.Ahead == 0 && ctx.Repo.Repository.DefaultBranch != branchName
327+
return &Branch{
328+
Name: branchName,
329+
Commit: commit,
330+
IsProtected: isProtected,
331+
IsIncluded: isIncluded,
332+
CommitsAhead: divergence.Ahead,
333+
CommitsBehind: divergence.Behind,
334+
LatestPullRequest: pr,
335+
MergeMovedOn: mergeMovedOn,
289336
}
290-
291-
return branches
292337
}
293338

294339
func getDeletedBranches(ctx *context.Context) ([]*Branch, error) {

templates/repo/branch/list.tmpl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@
127127
</tbody>
128128
</table>
129129
</div>
130+
131+
{{template "base/paginate" .}}
132+
130133
{{end}}
131134
</div>
132135
</div>

0 commit comments

Comments
 (0)