Skip to content

Commit 10e2f29

Browse files
authored
Cache PullRequest Divergence (#10914)
* Cache PullRequest Divergence * only re-calc divergence if AddTestPullRequestTask() is exec * migrate already open pulls * finalize * take care of closed&not-merged+deleted-branch pull requests * fix nil pointer exeption Signed-off-by: 6543 <[email protected]> * try this * no error its a warn * init gitea-repositories-meta * dont use gitDivergence type * CI.restart() * CI.restart() * CI.restart() * CI.restart() * check IsUserAllowedToUpdate independend from CommitsBehind
1 parent c571c5b commit 10e2f29

File tree

7 files changed

+122
-12
lines changed

7 files changed

+122
-12
lines changed

integrations/migration-test/migration_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"io/ioutil"
1313
"os"
1414
"path"
15+
"path/filepath"
1516
"regexp"
1617
"sort"
1718
"strings"
@@ -25,6 +26,7 @@ import (
2526
"code.gitea.io/gitea/modules/setting"
2627

2728
"github.com/stretchr/testify/assert"
29+
"github.com/unknwon/com"
2830
"xorm.io/xorm"
2931
)
3032

@@ -54,6 +56,11 @@ func initMigrationTest(t *testing.T) func() {
5456
}
5557

5658
setting.NewContext()
59+
60+
assert.True(t, len(setting.RepoRootPath) != 0)
61+
assert.NoError(t, os.RemoveAll(setting.RepoRootPath))
62+
assert.NoError(t, com.CopyDir(path.Join(filepath.Dir(setting.AppPath), "integrations/gitea-repositories-meta"), setting.RepoRootPath))
63+
5764
setting.CheckLFSVersion()
5865
setting.InitDBConfig()
5966
setting.NewLogServices(true)

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ var migrations = []Migration{
204204
NewMigration("Refix merge base for merged pull requests", refixMergeBase),
205205
// v135 -> 136
206206
NewMigration("Add OrgID column to Labels table", addOrgIDLabelColumn),
207+
// v136 -> 137
208+
NewMigration("Add CommitsAhead and CommitsBehind Column to PullRequest Table", addCommitDivergenceToPulls),
207209
}
208210

209211
// GetCurrentDBVersion returns the current db version

models/migrations/v136.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright 2020 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"fmt"
9+
10+
"code.gitea.io/gitea/models"
11+
"code.gitea.io/gitea/modules/log"
12+
"code.gitea.io/gitea/modules/setting"
13+
pull_service "code.gitea.io/gitea/services/pull"
14+
15+
"xorm.io/xorm"
16+
)
17+
18+
func addCommitDivergenceToPulls(x *xorm.Engine) error {
19+
20+
if err := x.Sync2(new(models.PullRequest)); err != nil {
21+
return fmt.Errorf("Sync2: %v", err)
22+
}
23+
24+
var last int
25+
batchSize := setting.Database.IterateBufferSize
26+
sess := x.NewSession()
27+
defer sess.Close()
28+
for {
29+
if err := sess.Begin(); err != nil {
30+
return err
31+
}
32+
var results = make([]*models.PullRequest, 0, batchSize)
33+
err := sess.Where("has_merged = ?", false).OrderBy("id").Limit(batchSize, last).Find(&results)
34+
if err != nil {
35+
return err
36+
}
37+
if len(results) == 0 {
38+
break
39+
}
40+
last += len(results)
41+
42+
for _, pr := range results {
43+
divergence, err := pull_service.GetDiverging(pr)
44+
if err != nil {
45+
if err = pr.LoadIssue(); err != nil {
46+
return fmt.Errorf("pr.LoadIssue()[%d]: %v", pr.ID, err)
47+
}
48+
if !pr.Issue.IsClosed {
49+
return fmt.Errorf("GetDiverging: %v", err)
50+
}
51+
log.Warn("Could not recalculate Divergence for pull: %d", pr.ID)
52+
pr.CommitsAhead = 0
53+
pr.CommitsBehind = 0
54+
}
55+
if divergence != nil {
56+
pr.CommitsAhead = divergence.Ahead
57+
pr.CommitsBehind = divergence.Behind
58+
}
59+
if _, err = sess.ID(pr.ID).Cols("commits_ahead", "commits_behind").Update(pr); err != nil {
60+
return fmt.Errorf("Update Cols: %v", err)
61+
}
62+
}
63+
64+
if err := sess.Commit(); err != nil {
65+
return err
66+
}
67+
}
68+
return nil
69+
}

models/pull.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ type PullRequest struct {
4242
Type PullRequestType
4343
Status PullRequestStatus
4444
ConflictedFiles []string `xorm:"TEXT JSON"`
45+
CommitsAhead int
46+
CommitsBehind int
4547

4648
IssueID int64 `xorm:"INDEX"`
4749
Issue *Issue `xorm:"-"`
@@ -615,6 +617,21 @@ func (pr *PullRequest) GetWorkInProgressPrefix() string {
615617
return ""
616618
}
617619

620+
// UpdateCommitDivergence update Divergence of a pull request
621+
func (pr *PullRequest) UpdateCommitDivergence(ahead, behind int) error {
622+
return pr.updateCommitDivergence(x, ahead, behind)
623+
}
624+
625+
func (pr *PullRequest) updateCommitDivergence(e Engine, ahead, behind int) error {
626+
if pr.ID == 0 {
627+
return fmt.Errorf("pull ID is 0")
628+
}
629+
pr.CommitsAhead = ahead
630+
pr.CommitsBehind = behind
631+
_, err := e.ID(pr.ID).Cols("commits_ahead", "commits_behind").Update(pr)
632+
return err
633+
}
634+
618635
// IsSameRepo returns true if base repo and head repo is the same
619636
func (pr *PullRequest) IsSameRepo() bool {
620637
return pr.BaseRepoID == pr.HeadRepoID

routers/repo/pull.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -399,8 +399,6 @@ func PrepareViewPullInfo(ctx *context.Context, issue *models.Issue) *git.Compare
399399
var headBranchSha string
400400
// HeadRepo may be missing
401401
if pull.HeadRepo != nil {
402-
var err error
403-
404402
headGitRepo, err := git.OpenRepository(pull.HeadRepo.RepoPath())
405403
if err != nil {
406404
ctx.ServerError("OpenRepository", err)
@@ -420,19 +418,11 @@ func PrepareViewPullInfo(ctx *context.Context, issue *models.Issue) *git.Compare
420418
}
421419

422420
if headBranchExist {
423-
allowUpdate, err := pull_service.IsUserAllowedToUpdate(pull, ctx.User)
421+
ctx.Data["UpdateAllowed"], err = pull_service.IsUserAllowedToUpdate(pull, ctx.User)
424422
if err != nil {
425423
ctx.ServerError("IsUserAllowedToUpdate", err)
426424
return nil
427425
}
428-
ctx.Data["UpdateAllowed"] = allowUpdate
429-
430-
divergence, err := pull_service.GetDiverging(pull)
431-
if err != nil {
432-
ctx.ServerError("GetDiverging", err)
433-
return nil
434-
}
435-
ctx.Data["Divergence"] = divergence
436426
ctx.Data["GetCommitMessages"] = pull_service.GetCommitMessages(pull)
437427
}
438428

services/pull/pull.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ func NewPullRequest(repo *models.Repository, pull *models.Issue, labelIDs []int6
3131
return err
3232
}
3333

34+
divergence, err := GetDiverging(pr)
35+
if err != nil {
36+
return err
37+
}
38+
pr.CommitsAhead = divergence.Ahead
39+
pr.CommitsBehind = divergence.Behind
40+
3441
if err := models.NewPullRequest(repo, pull, labelIDs, uuids, pr); err != nil {
3542
return err
3643
}
@@ -212,6 +219,15 @@ func AddTestPullRequestTask(doer *models.User, repoID int64, branch string, isSy
212219
if err := models.MarkReviewsAsNotStale(pr.IssueID, newCommitID); err != nil {
213220
log.Error("MarkReviewsAsNotStale: %v", err)
214221
}
222+
divergence, err := GetDiverging(pr)
223+
if err != nil {
224+
log.Error("GetDiverging: %v", err)
225+
} else {
226+
err = pr.UpdateCommitDivergence(divergence.Ahead, divergence.Behind)
227+
if err != nil {
228+
log.Error("UpdateCommitDivergence: %v", err)
229+
}
230+
}
215231
}
216232

217233
pr.Issue.PullRequest = pr
@@ -229,6 +245,15 @@ func AddTestPullRequestTask(doer *models.User, repoID int64, branch string, isSy
229245
return
230246
}
231247
for _, pr := range prs {
248+
divergence, err := GetDiverging(pr)
249+
if err != nil {
250+
log.Error("GetDiverging: %v", err)
251+
} else {
252+
err = pr.UpdateCommitDivergence(divergence.Ahead, divergence.Behind)
253+
if err != nil {
254+
log.Error("UpdateCommitDivergence: %v", err)
255+
}
256+
}
232257
AddToTaskQueue(pr)
233258
}
234259
})

templates/repo/issue/view_content/pull.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@
305305
</div>
306306
{{end}}
307307
{{end}}
308-
{{if and .Divergence (gt .Divergence.Behind 0)}}
308+
{{if gt .Issue.PullRequest.CommitsBehind 0}}
309309
<div class="ui very compact branch-update grid">
310310
<div class="row">
311311
<div class="item text gray eleven wide left floated column">

0 commit comments

Comments
 (0)