aboutsummaryrefslogtreecommitdiffstats
path: root/services/automerge/automerge.go
diff options
context:
space:
mode:
Diffstat (limited to 'services/automerge/automerge.go')
-rw-r--r--services/automerge/automerge.go59
1 files changed, 15 insertions, 44 deletions
diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go
index 0520a097d3..a60883b4cc 100644
--- a/services/automerge/automerge.go
+++ b/services/automerge/automerge.go
@@ -22,23 +22,21 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/process"
"code.gitea.io/gitea/modules/queue"
+ "code.gitea.io/gitea/services/automergequeue"
notify_service "code.gitea.io/gitea/services/notify"
pull_service "code.gitea.io/gitea/services/pull"
repo_service "code.gitea.io/gitea/services/repository"
)
-// prAutoMergeQueue represents a queue to handle update pull request tests
-var prAutoMergeQueue *queue.WorkerPoolQueue[string]
-
// Init runs the task queue to that handles auto merges
func Init() error {
notify_service.RegisterNotifier(NewNotifier())
- prAutoMergeQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "pr_auto_merge", handler)
- if prAutoMergeQueue == nil {
+ automergequeue.AutoMergeQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "pr_auto_merge", handler)
+ if automergequeue.AutoMergeQueue == nil {
return errors.New("unable to create pr_auto_merge queue")
}
- go graceful.GetManager().RunWithCancel(prAutoMergeQueue)
+ go graceful.GetManager().RunWithCancel(automergequeue.AutoMergeQueue)
return nil
}
@@ -56,24 +54,23 @@ func handler(items ...string) []string {
return nil
}
-func addToQueue(pr *issues_model.PullRequest, sha string) {
- log.Trace("Adding pullID: %d to the pull requests patch checking queue with sha %s", pr.ID, sha)
- if err := prAutoMergeQueue.Push(fmt.Sprintf("%d_%s", pr.ID, sha)); err != nil {
- log.Error("Error adding pullID: %d to the pull requests patch checking queue %v", pr.ID, err)
- }
-}
-
// ScheduleAutoMerge if schedule is false and no error, pull can be merged directly
func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, style repo_model.MergeStyle, message string, deleteBranchAfterMerge bool) (scheduled bool, err error) {
err = db.WithTx(ctx, func(ctx context.Context) error {
if err := pull_model.ScheduleAutoMerge(ctx, doer, pull.ID, style, message, deleteBranchAfterMerge); err != nil {
return err
}
- scheduled = true
-
_, err = issues_model.CreateAutoMergeComment(ctx, issues_model.CommentTypePRScheduledToAutoMerge, pull, doer)
return err
})
+ // Old code made "scheduled" to be true after "ScheduleAutoMerge", but it's not right:
+ // If the transaction rolls back, then the pull request is not scheduled to auto merge.
+ // So we should only set "scheduled" to true if there is no error.
+ scheduled = err == nil
+ if scheduled {
+ log.Trace("Pull request [%d] scheduled for auto merge with style [%s] and message [%s]", pull.ID, style, message)
+ automergequeue.StartPRCheckAndAutoMerge(ctx, pull)
+ }
return scheduled, err
}
@@ -99,38 +96,12 @@ func StartPRCheckAndAutoMergeBySHA(ctx context.Context, sha string, repo *repo_m
}
for _, pr := range pulls {
- addToQueue(pr, sha)
+ automergequeue.AddToQueue(pr, sha)
}
return nil
}
-// StartPRCheckAndAutoMerge start an automerge check and auto merge task for a pull request
-func StartPRCheckAndAutoMerge(ctx context.Context, pull *issues_model.PullRequest) {
- if pull == nil || pull.HasMerged || !pull.CanAutoMerge() {
- return
- }
-
- if err := pull.LoadBaseRepo(ctx); err != nil {
- log.Error("LoadBaseRepo: %v", err)
- return
- }
-
- gitRepo, err := gitrepo.OpenRepository(ctx, pull.BaseRepo)
- if err != nil {
- log.Error("OpenRepository: %v", err)
- return
- }
- defer gitRepo.Close()
- commitID, err := gitRepo.GetRefCommitID(pull.GetGitRefName())
- if err != nil {
- log.Error("GetRefCommitID: %v", err)
- return
- }
-
- addToQueue(pull, commitID)
-}
-
func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.Repository, filter func(*issues_model.PullRequest) bool) (map[int64]*issues_model.PullRequest, error) {
gitRepo, err := gitrepo.OpenRepository(ctx, repo)
if err != nil {
@@ -216,7 +187,7 @@ func handlePullRequestAutoMerge(pullID int64, sha string) {
}
defer baseGitRepo.Close()
- headCommitID, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName())
+ headCommitID, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName())
if err != nil {
log.Error("GetRefCommitID: %v", err)
return
@@ -254,7 +225,7 @@ func handlePullRequestAutoMerge(pullID int64, sha string) {
return
}
case issues_model.PullRequestFlowAGit:
- headBranchExist := gitrepo.IsReferenceExist(ctx, pr.BaseRepo, pr.GetGitRefName())
+ headBranchExist := gitrepo.IsReferenceExist(ctx, pr.BaseRepo, pr.GetGitHeadRefName())
if !headBranchExist {
log.Warn("Head branch of auto merge %-v does not exist [HeadRepoID: %d, Branch(Agit): %s]", pr, pr.HeadRepoID, pr.HeadBranch)
return