Skip to content

Commit 92f139d

Browse files
authored
Use for a repo action one database transaction (#19576)
... more context (part of #9307)
1 parent 730420b commit 92f139d

File tree

29 files changed

+270
-260
lines changed

29 files changed

+270
-260
lines changed

integrations/pull_merge_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,11 +243,11 @@ func TestCantMergeConflict(t *testing.T) {
243243
gitRepo, err := git.OpenRepository(git.DefaultContext, repo_model.RepoPath(user1.Name, repo1.Name))
244244
assert.NoError(t, err)
245245

246-
err = pull.Merge(git.DefaultContext, pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "CONFLICT")
246+
err = pull.Merge(pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "CONFLICT")
247247
assert.Error(t, err, "Merge should return an error due to conflict")
248248
assert.True(t, models.IsErrMergeConflicts(err), "Merge error is not a conflict error")
249249

250-
err = pull.Merge(git.DefaultContext, pr, user1, gitRepo, repo_model.MergeStyleRebase, "", "CONFLICT")
250+
err = pull.Merge(pr, user1, gitRepo, repo_model.MergeStyleRebase, "", "CONFLICT")
251251
assert.Error(t, err, "Merge should return an error due to conflict")
252252
assert.True(t, models.IsErrRebaseConflicts(err), "Merge error is not a conflict error")
253253
gitRepo.Close()
@@ -342,7 +342,7 @@ func TestCantMergeUnrelated(t *testing.T) {
342342
BaseBranch: "base",
343343
}).(*models.PullRequest)
344344

345-
err = pull.Merge(git.DefaultContext, pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "UNRELATED")
345+
err = pull.Merge(pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "UNRELATED")
346346
assert.Error(t, err, "Merge should return an error due to unrelated")
347347
assert.True(t, models.IsErrMergeUnrelatedHistories(err), "Merge error is not a unrelated histories error")
348348
gitRepo.Close()

models/branches.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (protectBranch *ProtectedBranch) CanUserPush(userID int64) bool {
104104
}
105105

106106
// IsUserMergeWhitelisted checks if some user is whitelisted to merge to this branch
107-
func IsUserMergeWhitelisted(protectBranch *ProtectedBranch, userID int64, permissionInRepo Permission) bool {
107+
func IsUserMergeWhitelisted(ctx context.Context, protectBranch *ProtectedBranch, userID int64, permissionInRepo Permission) bool {
108108
if !protectBranch.EnableMergeWhitelist {
109109
// Then we need to fall back on whether the user has write permission
110110
return permissionInRepo.CanWrite(unit.TypeCode)
@@ -118,7 +118,7 @@ func IsUserMergeWhitelisted(protectBranch *ProtectedBranch, userID int64, permis
118118
return false
119119
}
120120

121-
in, err := organization.IsUserInTeams(db.DefaultContext, userID, protectBranch.MergeWhitelistTeamIDs)
121+
in, err := organization.IsUserInTeams(ctx, userID, protectBranch.MergeWhitelistTeamIDs)
122122
if err != nil {
123123
log.Error("IsUserInTeams: %v", err)
124124
return false
@@ -159,16 +159,16 @@ func isUserOfficialReviewer(ctx context.Context, protectBranch *ProtectedBranch,
159159
}
160160

161161
// HasEnoughApprovals returns true if pr has enough granted approvals.
162-
func (protectBranch *ProtectedBranch) HasEnoughApprovals(pr *PullRequest) bool {
162+
func (protectBranch *ProtectedBranch) HasEnoughApprovals(ctx context.Context, pr *PullRequest) bool {
163163
if protectBranch.RequiredApprovals == 0 {
164164
return true
165165
}
166-
return protectBranch.GetGrantedApprovalsCount(pr) >= protectBranch.RequiredApprovals
166+
return protectBranch.GetGrantedApprovalsCount(ctx, pr) >= protectBranch.RequiredApprovals
167167
}
168168

169169
// GetGrantedApprovalsCount returns the number of granted approvals for pr. A granted approval must be authored by a user in an approval whitelist.
170-
func (protectBranch *ProtectedBranch) GetGrantedApprovalsCount(pr *PullRequest) int64 {
171-
sess := db.GetEngine(db.DefaultContext).Where("issue_id = ?", pr.IssueID).
170+
func (protectBranch *ProtectedBranch) GetGrantedApprovalsCount(ctx context.Context, pr *PullRequest) int64 {
171+
sess := db.GetEngine(ctx).Where("issue_id = ?", pr.IssueID).
172172
And("type = ?", ReviewTypeApprove).
173173
And("official = ?", true).
174174
And("dismissed = ?", false)
@@ -185,11 +185,11 @@ func (protectBranch *ProtectedBranch) GetGrantedApprovalsCount(pr *PullRequest)
185185
}
186186

187187
// MergeBlockedByRejectedReview returns true if merge is blocked by rejected reviews
188-
func (protectBranch *ProtectedBranch) MergeBlockedByRejectedReview(pr *PullRequest) bool {
188+
func (protectBranch *ProtectedBranch) MergeBlockedByRejectedReview(ctx context.Context, pr *PullRequest) bool {
189189
if !protectBranch.BlockOnRejectedReviews {
190190
return false
191191
}
192-
rejectExist, err := db.GetEngine(db.DefaultContext).Where("issue_id = ?", pr.IssueID).
192+
rejectExist, err := db.GetEngine(ctx).Where("issue_id = ?", pr.IssueID).
193193
And("type = ?", ReviewTypeReject).
194194
And("official = ?", true).
195195
And("dismissed = ?", false).
@@ -204,11 +204,11 @@ func (protectBranch *ProtectedBranch) MergeBlockedByRejectedReview(pr *PullReque
204204

205205
// MergeBlockedByOfficialReviewRequests block merge because of some review request to official reviewer
206206
// of from official review
207-
func (protectBranch *ProtectedBranch) MergeBlockedByOfficialReviewRequests(pr *PullRequest) bool {
207+
func (protectBranch *ProtectedBranch) MergeBlockedByOfficialReviewRequests(ctx context.Context, pr *PullRequest) bool {
208208
if !protectBranch.BlockOnOfficialReviewRequests {
209209
return false
210210
}
211-
has, err := db.GetEngine(db.DefaultContext).Where("issue_id = ?", pr.IssueID).
211+
has, err := db.GetEngine(ctx).Where("issue_id = ?", pr.IssueID).
212212
And("type = ?", ReviewTypeRequest).
213213
And("official = ?", true).
214214
Exist(new(Review))

models/db/context.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,22 @@ func WithContext(f func(ctx *Context) error) error {
103103
}
104104

105105
// WithTx represents executing database operations on a transaction
106-
func WithTx(f func(ctx context.Context) error) error {
106+
// you can optionally change the context to a parrent one
107+
func WithTx(f func(ctx context.Context) error, stdCtx ...context.Context) error {
108+
parentCtx := DefaultContext
109+
if len(stdCtx) != 0 && stdCtx[0] != nil {
110+
// TODO: make sure parent context has no open session
111+
parentCtx = stdCtx[0]
112+
}
113+
107114
sess := x.NewSession()
108115
defer sess.Close()
109116
if err := sess.Begin(); err != nil {
110117
return err
111118
}
112119

113120
if err := f(&Context{
114-
Context: DefaultContext,
121+
Context: parentCtx,
115122
e: sess,
116123
}); err != nil {
117124
return err

models/issue.go

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ func ReplaceIssueLabels(issue *Issue, labels []*Label, doer *user_model.User) (e
591591
}
592592

593593
// ReadBy sets issue to be read by given user.
594-
func (issue *Issue) ReadBy(userID int64) error {
594+
func (issue *Issue) ReadBy(ctx context.Context, userID int64) error {
595595
if err := UpdateIssueUserByRead(userID, issue.ID); err != nil {
596596
return err
597597
}
@@ -635,7 +635,7 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use
635635
// Check for open dependencies
636636
if issue.IsClosed && issue.Repo.IsDependenciesEnabledCtx(ctx) {
637637
// only check if dependencies are enabled and we're about to close an issue, otherwise reopening an issue would fail when there are unsatisfied dependencies
638-
noDeps, err := issueNoDependenciesLeft(e, issue)
638+
noDeps, err := IssueNoDependenciesLeft(ctx, issue)
639639
if err != nil {
640640
return nil, err
641641
}
@@ -693,30 +693,15 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use
693693
}
694694

695695
// ChangeIssueStatus changes issue status to open or closed.
696-
func ChangeIssueStatus(issue *Issue, doer *user_model.User, isClosed bool) (*Comment, error) {
697-
ctx, committer, err := db.TxContext()
698-
if err != nil {
699-
return nil, err
700-
}
701-
defer committer.Close()
702-
696+
func ChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.User, isClosed bool) (*Comment, error) {
703697
if err := issue.LoadRepo(ctx); err != nil {
704698
return nil, err
705699
}
706700
if err := issue.loadPoster(db.GetEngine(ctx)); err != nil {
707701
return nil, err
708702
}
709703

710-
comment, err := changeIssueStatus(ctx, issue, doer, isClosed, false)
711-
if err != nil {
712-
return nil, err
713-
}
714-
715-
if err = committer.Commit(); err != nil {
716-
return nil, fmt.Errorf("Commit: %v", err)
717-
}
718-
719-
return comment, nil
704+
return changeIssueStatus(ctx, issue, doer, isClosed, false)
720705
}
721706

722707
// ChangeIssueTitle changes the title of this issue, as the given user.
@@ -787,28 +772,20 @@ func ChangeIssueRef(issue *Issue, doer *user_model.User, oldRef string) (err err
787772
}
788773

789774
// AddDeletePRBranchComment adds delete branch comment for pull request issue
790-
func AddDeletePRBranchComment(doer *user_model.User, repo *repo_model.Repository, issueID int64, branchName string) error {
791-
issue, err := getIssueByID(db.GetEngine(db.DefaultContext), issueID)
792-
if err != nil {
793-
return err
794-
}
795-
ctx, committer, err := db.TxContext()
775+
func AddDeletePRBranchComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issueID int64, branchName string) error {
776+
issue, err := getIssueByID(db.GetEngine(ctx), issueID)
796777
if err != nil {
797778
return err
798779
}
799-
defer committer.Close()
800780
opts := &CreateCommentOptions{
801781
Type: CommentTypeDeleteBranch,
802782
Doer: doer,
803783
Repo: repo,
804784
Issue: issue,
805785
OldRef: branchName,
806786
}
807-
if _, err = CreateCommentCtx(ctx, opts); err != nil {
808-
return err
809-
}
810-
811-
return committer.Commit()
787+
_, err = CreateCommentCtx(ctx, opts)
788+
return err
812789
}
813790

814791
// UpdateIssueAttachments update attachments by UUIDs for the issue

models/issue_comment.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,14 +284,15 @@ type PushActionContent struct {
284284

285285
// LoadIssue loads issue from database
286286
func (c *Comment) LoadIssue() (err error) {
287-
return c.loadIssue(db.GetEngine(db.DefaultContext))
287+
return c.LoadIssueCtx(db.DefaultContext)
288288
}
289289

290-
func (c *Comment) loadIssue(e db.Engine) (err error) {
290+
// LoadIssueCtx loads issue from database
291+
func (c *Comment) LoadIssueCtx(ctx context.Context) (err error) {
291292
if c.Issue != nil {
292293
return nil
293294
}
294-
c.Issue, err = getIssueByID(e, c.IssueID)
295+
c.Issue, err = getIssueByID(db.GetEngine(ctx), c.IssueID)
295296
return
296297
}
297298

@@ -1126,7 +1127,7 @@ func UpdateComment(c *Comment, doer *user_model.User) error {
11261127
if _, err := sess.ID(c.ID).AllCols().Update(c); err != nil {
11271128
return err
11281129
}
1129-
if err := c.loadIssue(sess); err != nil {
1130+
if err := c.LoadIssueCtx(ctx); err != nil {
11301131
return err
11311132
}
11321133
if err := c.addCrossReferences(ctx, doer, true); err != nil {

models/issue_dependency.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package models
66

77
import (
8+
"context"
9+
810
"code.gitea.io/gitea/models/db"
911
user_model "code.gitea.io/gitea/models/user"
1012
"code.gitea.io/gitea/modules/timeutil"
@@ -117,12 +119,8 @@ func issueDepExists(e db.Engine, issueID, depID int64) (bool, error) {
117119
}
118120

119121
// IssueNoDependenciesLeft checks if issue can be closed
120-
func IssueNoDependenciesLeft(issue *Issue) (bool, error) {
121-
return issueNoDependenciesLeft(db.GetEngine(db.DefaultContext), issue)
122-
}
123-
124-
func issueNoDependenciesLeft(e db.Engine, issue *Issue) (bool, error) {
125-
exists, err := e.
122+
func IssueNoDependenciesLeft(ctx context.Context, issue *Issue) (bool, error) {
123+
exists, err := db.GetEngine(ctx).
126124
Table("issue_dependency").
127125
Select("issue.*").
128126
Join("INNER", "issue", "issue.id = issue_dependency.dependency_id").

models/issue_dependency_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package models
77
import (
88
"testing"
99

10+
"code.gitea.io/gitea/models/db"
1011
"code.gitea.io/gitea/models/unittest"
1112
user_model "code.gitea.io/gitea/models/user"
1213

@@ -43,15 +44,15 @@ func TestCreateIssueDependency(t *testing.T) {
4344
_ = unittest.AssertExistsAndLoadBean(t, &Comment{Type: CommentTypeAddDependency, PosterID: user1.ID, IssueID: issue1.ID})
4445

4546
// Check if dependencies left is correct
46-
left, err := IssueNoDependenciesLeft(issue1)
47+
left, err := IssueNoDependenciesLeft(db.DefaultContext, issue1)
4748
assert.NoError(t, err)
4849
assert.False(t, left)
4950

5051
// Close #2 and check again
51-
_, err = ChangeIssueStatus(issue2, user1, true)
52+
_, err = ChangeIssueStatus(db.DefaultContext, issue2, user1, true)
5253
assert.NoError(t, err)
5354

54-
left, err = IssueNoDependenciesLeft(issue1)
55+
left, err = IssueNoDependenciesLeft(db.DefaultContext, issue1)
5556
assert.NoError(t, err)
5657
assert.True(t, left)
5758

models/issue_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,12 +443,12 @@ func TestIssue_DeleteIssue(t *testing.T) {
443443
assert.NoError(t, err)
444444
err = CreateIssueDependency(user, issue1, issue2)
445445
assert.NoError(t, err)
446-
left, err := IssueNoDependenciesLeft(issue1)
446+
left, err := IssueNoDependenciesLeft(db.DefaultContext, issue1)
447447
assert.NoError(t, err)
448448
assert.False(t, left)
449449
err = DeleteIssue(&Issue{ID: 2})
450450
assert.NoError(t, err)
451-
left, err = IssueNoDependenciesLeft(issue1)
451+
left, err = IssueNoDependenciesLeft(db.DefaultContext, issue1)
452452
assert.NoError(t, err)
453453
assert.True(t, left)
454454
}

models/issue_xref.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ func (comment *Comment) addCrossReferences(stdCtx context.Context, doer *user_mo
249249
if comment.Type != CommentTypeCode && comment.Type != CommentTypeComment {
250250
return nil
251251
}
252-
if err := comment.loadIssue(db.GetEngine(stdCtx)); err != nil {
252+
if err := comment.LoadIssueCtx(stdCtx); err != nil {
253253
return err
254254
}
255255
ctx := &crossReferencesContext{
@@ -340,9 +340,9 @@ func (comment *Comment) RefIssueIdent() string {
340340
// \/ \/ |__| \/ \/
341341

342342
// ResolveCrossReferences will return the list of references to close/reopen by this PR
343-
func (pr *PullRequest) ResolveCrossReferences() ([]*Comment, error) {
343+
func (pr *PullRequest) ResolveCrossReferences(ctx context.Context) ([]*Comment, error) {
344344
unfiltered := make([]*Comment, 0, 5)
345-
if err := db.GetEngine(db.DefaultContext).
345+
if err := db.GetEngine(ctx).
346346
Where("ref_repo_id = ? AND ref_issue_id = ?", pr.Issue.RepoID, pr.Issue.ID).
347347
In("ref_action", []references.XRefAction{references.XRefActionCloses, references.XRefActionReopens}).
348348
OrderBy("id").

models/issue_xref_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func TestXRef_ResolveCrossReferences(t *testing.T) {
9898
i1 := testCreateIssue(t, 1, 2, "title1", "content1", false)
9999
i2 := testCreateIssue(t, 1, 2, "title2", "content2", false)
100100
i3 := testCreateIssue(t, 1, 2, "title3", "content3", false)
101-
_, err := ChangeIssueStatus(i3, d, true)
101+
_, err := ChangeIssueStatus(db.DefaultContext, i3, d, true)
102102
assert.NoError(t, err)
103103

104104
pr := testCreatePR(t, 1, 2, "titlepr", fmt.Sprintf("closes #%d", i1.Index))
@@ -118,7 +118,7 @@ func TestXRef_ResolveCrossReferences(t *testing.T) {
118118
c4 := testCreateComment(t, 1, 2, pr.Issue.ID, fmt.Sprintf("closes #%d", i3.Index))
119119
r4 := unittest.AssertExistsAndLoadBean(t, &Comment{IssueID: i3.ID, RefIssueID: pr.Issue.ID, RefCommentID: c4.ID}).(*Comment)
120120

121-
refs, err := pr.ResolveCrossReferences()
121+
refs, err := pr.ResolveCrossReferences(db.DefaultContext)
122122
assert.NoError(t, err)
123123
assert.Len(t, refs, 3)
124124
assert.Equal(t, rp.ID, refs[0].ID, "bad ref rp: %+v", refs[0])

0 commit comments

Comments
 (0)