Skip to content

Commit 9b16eda

Browse files
committed
Fix bugs
1 parent 5ff6888 commit 9b16eda

File tree

3 files changed

+62
-34
lines changed

3 files changed

+62
-34
lines changed

services/automerge/automerge.go

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func handler(items ...string) []string {
5050
log.Error("could not parse data from pr_auto_merge queue (%v): %v", s, err)
5151
continue
5252
}
53-
handlePull(id, sha)
53+
handlePullRequestAutoMerge(id, sha)
5454
}
5555
return nil
5656
}
@@ -98,8 +98,8 @@ func RemoveScheduledAutoMerge(ctx context.Context, doer *user_model.User, pull *
9898
})
9999
}
100100

101-
// MergeScheduledPullRequestsBySha merges a previously scheduled pull request(s) when all checks succeeded
102-
func MergeScheduledPullRequestsBySha(ctx context.Context, sha string, repo *repo_model.Repository) error {
101+
// StartPullRequestAutoMergeCheckBySHA start an automerge check task for repository and SHA
102+
func StartPullRequestAutoMergeCheckBySHA(ctx context.Context, sha string, repo *repo_model.Repository) error {
103103
pulls, err := getPullRequestsByHeadSHA(ctx, sha, repo, func(pr *issues_model.PullRequest) bool {
104104
return !pr.HasMerged && pr.CanAutoMerge()
105105
})
@@ -114,13 +114,31 @@ func MergeScheduledPullRequestsBySha(ctx context.Context, sha string, repo *repo
114114
return nil
115115
}
116116

117-
// MergeScheduledPullRequest merges a previously scheduled pull request when all checks succeeded
118-
func MergeScheduledPullRequest(pull *issues_model.PullRequest) {
117+
// StartPullRequestAutoMergeCheck start an automerge check task for a pull request
118+
func StartPullRequestAutoMergeCheck(ctx context.Context, pull *issues_model.PullRequest) {
119119
if pull == nil || pull.HasMerged || !pull.CanAutoMerge() {
120120
return
121121
}
122122

123-
addToQueue(pull, pull.HeadCommitID)
123+
if err := pull.LoadBaseRepo(ctx); err != nil {
124+
log.Error("LoadBaseRepo: %v", err)
125+
return
126+
}
127+
128+
gitRepo, err := gitrepo.OpenRepository(ctx, pull.BaseRepo)
129+
if err != nil {
130+
log.Error("OpenRepository: %v", err)
131+
return
132+
}
133+
defer gitRepo.Close()
134+
135+
commitID, err := gitRepo.GetRefCommitID(pull.GetGitRefName())
136+
if err != nil {
137+
log.Error("GetRefCommitID: %v", err)
138+
return
139+
}
140+
141+
addToQueue(pull, commitID)
124142
}
125143

126144
func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.Repository, filter func(*issues_model.PullRequest) bool) (map[int64]*issues_model.PullRequest, error) {
@@ -173,7 +191,8 @@ func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.
173191
return pulls, nil
174192
}
175193

176-
func handlePull(pullID int64, sha string) {
194+
// handlePullRequestAutoMerge merge the pull request if all checks are successful
195+
func handlePullRequestAutoMerge(pullID int64, sha string) {
177196
ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().HammerContext(),
178197
fmt.Sprintf("Handle AutoMerge of PR[%d] with sha[%s]", pullID, sha))
179198
defer finished()
@@ -194,24 +213,50 @@ func handlePull(pullID int64, sha string) {
194213
return
195214
}
196215

216+
if err = pr.LoadBaseRepo(ctx); err != nil {
217+
log.Error("%-v LoadBaseRepo: %v", pr, err)
218+
return
219+
}
220+
221+
// check the sha is the same as pull request head commit id
222+
baseGitRepo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo)
223+
if err != nil {
224+
log.Error("OpenRepository: %v", err)
225+
return
226+
}
227+
defer baseGitRepo.Close()
228+
229+
headCommitID, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName())
230+
if err != nil {
231+
log.Error("GetRefCommitID: %v", err)
232+
return
233+
}
234+
if headCommitID != sha {
235+
log.Warn("Head commit id of auto merge %-v does not match sha [%s]", pr, sha)
236+
return
237+
}
238+
197239
// Get all checks for this pr
198240
// We get the latest sha commit hash again to handle the case where the check of a previous push
199241
// did not succeed or was not finished yet.
200-
201242
if err = pr.LoadHeadRepo(ctx); err != nil {
202243
log.Error("%-v LoadHeadRepo: %v", pr, err)
203244
return
204245
}
205246

206-
headGitRepo, err := gitrepo.OpenRepository(ctx, pr.HeadRepo)
207-
if err != nil {
208-
log.Error("OpenRepository %-v: %v", pr.HeadRepo, err)
209-
return
247+
var headGitRepo *git.Repository
248+
if pr.BaseRepoID == pr.HeadRepoID {
249+
headGitRepo = baseGitRepo
250+
} else {
251+
headGitRepo, err = gitrepo.OpenRepository(ctx, pr.HeadRepo)
252+
if err != nil {
253+
log.Error("OpenRepository %-v: %v", pr.HeadRepo, err)
254+
return
255+
}
256+
defer headGitRepo.Close()
210257
}
211-
defer headGitRepo.Close()
212258

213259
headBranchExist := headGitRepo.IsBranchExist(pr.HeadBranch)
214-
215260
if pr.HeadRepo == nil || !headBranchExist {
216261
log.Warn("Head branch of auto merge %-v does not exist [HeadRepoID: %d, Branch: %s]", pr, pr.HeadRepoID, pr.HeadBranch)
217262
return
@@ -250,23 +295,6 @@ func handlePull(pullID int64, sha string) {
250295
return
251296
}
252297

253-
var baseGitRepo *git.Repository
254-
if pr.BaseRepoID == pr.HeadRepoID {
255-
baseGitRepo = headGitRepo
256-
} else {
257-
if err = pr.LoadBaseRepo(ctx); err != nil {
258-
log.Error("%-v LoadBaseRepo: %v", pr, err)
259-
return
260-
}
261-
262-
baseGitRepo, err = gitrepo.OpenRepository(ctx, pr.BaseRepo)
263-
if err != nil {
264-
log.Error("OpenRepository %-v: %v", pr.BaseRepo, err)
265-
return
266-
}
267-
defer baseGitRepo.Close()
268-
}
269-
270298
if err := pull_service.Merge(ctx, pr, doer, baseGitRepo, scheduledPRM.MergeStyle, "", scheduledPRM.Message, true); err != nil {
271299
log.Error("pull_service.Merge: %v", err)
272300
return

services/automerge/notify.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func NewNotifier() notify_service.Notifier {
2626
func (n *automergeNotifier) PullRequestReview(ctx context.Context, pr *issues_model.PullRequest, review *issues_model.Review, comment *issues_model.Comment, mentions []*user_model.User) {
2727
// as a missing / blocking reviews could have blocked a pending automerge let's recheck
2828
if review.Type == issues_model.ReviewTypeApprove {
29-
MergeScheduledPullRequest(pr)
29+
StartPullRequestAutoMergeCheckBySHA(ctx, review.CommitID, pr.BaseRepo)
3030
}
3131
}
3232

@@ -40,5 +40,5 @@ func (n *automergeNotifier) PullReviewDismiss(ctx context.Context, doer *user_mo
4040
return
4141
}
4242
// as reviews could have blocked a pending automerge let's recheck
43-
MergeScheduledPullRequest(review.Issue.PullRequest)
43+
StartPullRequestAutoMergeCheck(ctx, review.Issue.PullRequest)
4444
}

services/repository/commitstatus/commitstatus.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato
117117
}
118118

119119
if status.State.IsSuccess() {
120-
if err := automerge.MergeScheduledPullRequestsBySha(ctx, sha, repo); err != nil {
120+
if err := automerge.StartPullRequestAutoMergeCheckBySHA(ctx, sha, repo); err != nil {
121121
return fmt.Errorf("MergeScheduledPullRequest[repo_id: %d, user_id: %d, sha: %s]: %w", repo.ID, creator.ID, sha, err)
122122
}
123123
}

0 commit comments

Comments
 (0)