Skip to content

Commit 22090f2

Browse files
committed
fix transaction pr status check
1 parent d7bda6b commit 22090f2

File tree

3 files changed

+13
-10
lines changed

3 files changed

+13
-10
lines changed

models/issues/pull.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -642,9 +642,8 @@ func (pr *PullRequest) UpdateCols(ctx context.Context, cols ...string) error {
642642
}
643643

644644
// UpdateColsIfNotMerged updates specific fields of a pull request if it has not been merged
645-
func (pr *PullRequest) UpdateColsIfNotMerged(ctx context.Context, cols ...string) error {
646-
_, err := db.GetEngine(ctx).Where("id = ? AND has_merged = ?", pr.ID, false).Cols(cols...).Update(pr)
647-
return err
645+
func (pr *PullRequest) UpdateColsIfNotMerged(ctx context.Context, cols ...string) (int64, error) {
646+
return db.GetEngine(ctx).Where("id = ? AND has_merged = ?", pr.ID, false).Cols(cols...).Update(pr)
648647
}
649648

650649
// IsWorkInProgress determine if the Pull Request is a Work In Progress by its title

services/pull/check.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ var (
5050

5151
func markPullRequestStatusAsChecking(ctx context.Context, pr *issues_model.PullRequest) bool {
5252
pr.Status = issues_model.PullRequestStatusChecking
53-
err := pr.UpdateColsIfNotMerged(ctx, "status")
53+
_, err := pr.UpdateColsIfNotMerged(ctx, "status")
5454
if err != nil {
5555
log.Error("UpdateColsIfNotMerged failed, pr: %-v, err: %v", pr, err)
5656
return false
@@ -256,7 +256,7 @@ func markPullRequestAsMergeable(ctx context.Context, pr *issues_model.PullReques
256256
return
257257
}
258258

259-
if err := pr.UpdateColsIfNotMerged(ctx, "merge_base", "status", "conflicted_files", "changed_protected_files"); err != nil {
259+
if _, err := pr.UpdateColsIfNotMerged(ctx, "merge_base", "status", "conflicted_files", "changed_protected_files"); err != nil {
260260
log.Error("Update[%-v]: %v", pr, err)
261261
}
262262

services/pull/pull.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,14 +288,18 @@ func ChangeTargetBranch(ctx context.Context, pr *issues_model.PullRequest, doer
288288

289289
// add first push codes comment
290290
return db.WithTx(ctx, func(ctx context.Context) error {
291-
if err := pr.UpdateColsIfNotMerged(ctx, "merge_base", "status", "conflicted_files", "changed_protected_files", "base_branch"); err != nil {
291+
// The UPDATE acquires the transaction lock, if the UPDATE succeeds, it should have updated one row (the "base_branch" is changed)
292+
// If no row is updated, it means the PR has been merged or closed in the meantime
293+
updated, err := pr.UpdateColsIfNotMerged(ctx, "merge_base", "status", "conflicted_files", "changed_protected_files", "base_branch")
294+
if err != nil {
292295
return err
293296
}
297+
if updated == 0 {
298+
return util.ErrorWrap(util.ErrInvalidArgument, "pull request status has changed")
299+
}
294300

295-
if !pr.HasMerged {
296-
if err = syncCommitDivergence(ctx, pr); err != nil {
297-
return fmt.Errorf("syncCommitDivergence: %w", err)
298-
}
301+
if err := syncCommitDivergence(ctx, pr); err != nil {
302+
return fmt.Errorf("syncCommitDivergence: %w", err)
299303
}
300304

301305
// Create comment

0 commit comments

Comments
 (0)