@@ -22,23 +22,21 @@ import (
2222 "code.gitea.io/gitea/modules/log"
2323 "code.gitea.io/gitea/modules/process"
2424 "code.gitea.io/gitea/modules/queue"
25+ "code.gitea.io/gitea/services/automergequeue"
2526 notify_service "code.gitea.io/gitea/services/notify"
2627 pull_service "code.gitea.io/gitea/services/pull"
2728 repo_service "code.gitea.io/gitea/services/repository"
2829)
2930
30- // prAutoMergeQueue represents a queue to handle update pull request tests
31- var prAutoMergeQueue * queue.WorkerPoolQueue [string ]
32-
3331// Init runs the task queue to that handles auto merges
3432func Init () error {
3533 notify_service .RegisterNotifier (NewNotifier ())
3634
37- prAutoMergeQueue = queue .CreateUniqueQueue (graceful .GetManager ().ShutdownContext (), "pr_auto_merge" , handler )
38- if prAutoMergeQueue == nil {
35+ automergequeue . AutoMergeQueue = queue .CreateUniqueQueue (graceful .GetManager ().ShutdownContext (), "pr_auto_merge" , handler )
36+ if automergequeue . AutoMergeQueue == nil {
3937 return errors .New ("unable to create pr_auto_merge queue" )
4038 }
41- go graceful .GetManager ().RunWithCancel (prAutoMergeQueue )
39+ go graceful .GetManager ().RunWithCancel (automergequeue . AutoMergeQueue )
4240 return nil
4341}
4442
@@ -56,24 +54,23 @@ func handler(items ...string) []string {
5654 return nil
5755}
5856
59- func addToQueue (pr * issues_model.PullRequest , sha string ) {
60- log .Trace ("Adding pullID: %d to the pull requests patch checking queue with sha %s" , pr .ID , sha )
61- if err := prAutoMergeQueue .Push (fmt .Sprintf ("%d_%s" , pr .ID , sha )); err != nil {
62- log .Error ("Error adding pullID: %d to the pull requests patch checking queue %v" , pr .ID , err )
63- }
64- }
65-
6657// ScheduleAutoMerge if schedule is false and no error, pull can be merged directly
6758func ScheduleAutoMerge (ctx context.Context , doer * user_model.User , pull * issues_model.PullRequest , style repo_model.MergeStyle , message string , deleteBranchAfterMerge bool ) (scheduled bool , err error ) {
6859 err = db .WithTx (ctx , func (ctx context.Context ) error {
6960 if err := pull_model .ScheduleAutoMerge (ctx , doer , pull .ID , style , message , deleteBranchAfterMerge ); err != nil {
7061 return err
7162 }
72- scheduled = true
73-
7463 _ , err = issues_model .CreateAutoMergeComment (ctx , issues_model .CommentTypePRScheduledToAutoMerge , pull , doer )
7564 return err
7665 })
66+ // Old code made "scheduled" to be true after "ScheduleAutoMerge", but it's not right:
67+ // If the transaction rolls back, then the pull request is not scheduled to auto merge.
68+ // So we should only set "scheduled" to true if there is no error.
69+ scheduled = err == nil
70+ if scheduled {
71+ log .Trace ("Pull request [%d] scheduled for auto merge with style [%s] and message [%s]" , pull .ID , style , message )
72+ automergequeue .StartPRCheckAndAutoMerge (ctx , pull )
73+ }
7774 return scheduled , err
7875}
7976
@@ -99,38 +96,12 @@ func StartPRCheckAndAutoMergeBySHA(ctx context.Context, sha string, repo *repo_m
9996 }
10097
10198 for _ , pr := range pulls {
102- addToQueue (pr , sha )
99+ automergequeue . AddToQueue (pr , sha )
103100 }
104101
105102 return nil
106103}
107104
108- // StartPRCheckAndAutoMerge start an automerge check and auto merge task for a pull request
109- func StartPRCheckAndAutoMerge (ctx context.Context , pull * issues_model.PullRequest ) {
110- if pull == nil || pull .HasMerged || ! pull .CanAutoMerge () {
111- return
112- }
113-
114- if err := pull .LoadBaseRepo (ctx ); err != nil {
115- log .Error ("LoadBaseRepo: %v" , err )
116- return
117- }
118-
119- gitRepo , err := gitrepo .OpenRepository (ctx , pull .BaseRepo )
120- if err != nil {
121- log .Error ("OpenRepository: %v" , err )
122- return
123- }
124- defer gitRepo .Close ()
125- commitID , err := gitRepo .GetRefCommitID (pull .GetGitRefName ())
126- if err != nil {
127- log .Error ("GetRefCommitID: %v" , err )
128- return
129- }
130-
131- addToQueue (pull , commitID )
132- }
133-
134105func getPullRequestsByHeadSHA (ctx context.Context , sha string , repo * repo_model.Repository , filter func (* issues_model.PullRequest ) bool ) (map [int64 ]* issues_model.PullRequest , error ) {
135106 gitRepo , err := gitrepo .OpenRepository (ctx , repo )
136107 if err != nil {
0 commit comments