diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index a9aae80cd5..7bcbe599ce 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -164,49 +164,10 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { var pusher *user_model.User - // handle pull request merging, a pull request action should only push 1 commit - if opts.PullRequestAction == repo_module.PullRequestActionMerge && len(updates) >= 1 { - // Get the pull request - pr, err := issues_model.GetPullRequestByID(ctx, opts.PullRequestID) - if err != nil { - log.Error("GetPullRequestByID[%d]: %v", opts.PullRequestID, err) - ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ - Err: fmt.Sprintf("GetPullRequestByID[%d]: %v", opts.PullRequestID, err), - }) - return - } - - pusher, err = user_model.GetUserByID(ctx, opts.UserID) - if err != nil { - log.Error("Failed to Update: %s/%s Error: %v", ownerName, repoName, err) - ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ - Err: fmt.Sprintf("Failed to Update: %s/%s Error: %v", ownerName, repoName, err), - }) - return - } - - pr.MergedCommitID = updates[len(updates)-1].NewCommitID - pr.MergedUnix = timeutil.TimeStampNow() - pr.Merger = pusher - pr.MergerID = opts.UserID - - if err := db.WithTx(ctx, func(ctx context.Context) error { - // Removing an auto merge pull and ignore if not exist - if err := pull_model.DeleteScheduledAutoMerge(ctx, pr.ID); err != nil && !db.IsErrNotExist(err) { - return fmt.Errorf("DeleteScheduledAutoMerge[%d]: %v", opts.PullRequestID, err) - } - - if _, err := pr.SetMerged(ctx); err != nil { - return fmt.Errorf("Failed to SetMerged: %s/%s Error: %v", ownerName, repoName, err) - } - return nil - }); err != nil { - log.Error("%v", err) - ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ - Err: err.Error(), - }) - return - } + // handle pull request merging, a pull request action should push at least 1 commit + handlePullRequestMerging(ctx, opts, pusher, ownerName, repoName, updates) + if ctx.Written() { + return } isPrivate := opts.GitPushOptions.Bool(private.GitPushOptionRepoPrivate) @@ -362,3 +323,52 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { RepoWasEmpty: wasEmpty, }) } + +func handlePullRequestMerging(ctx *gitea_context.PrivateContext, opts *private.HookOptions, pusher *user_model.User, ownerName, repoName string, updates []*repo_module.PushUpdateOptions) { + // handle pull request merging, a pull request action should only push 1 commit + if opts.PullRequestAction == repo_module.PullRequestActionMerge && len(updates) >= 1 { + // Get the pull request + pr, err := issues_model.GetPullRequestByID(ctx, opts.PullRequestID) + if err != nil { + log.Error("GetPullRequestByID[%d]: %v", opts.PullRequestID, err) + ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ + Err: fmt.Sprintf("GetPullRequestByID[%d]: %v", opts.PullRequestID, err), + }) + return + } + + if pusher == nil { + pusher, err = user_model.GetUserByID(ctx, opts.UserID) + if err != nil { + log.Error("Failed to Update: %s/%s Error: %v", ownerName, repoName, err) + ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ + Err: fmt.Sprintf("Failed to Update: %s/%s Error: %v", ownerName, repoName, err), + }) + return + } + } + + pr.MergedCommitID = updates[len(updates)-1].NewCommitID + pr.MergedUnix = timeutil.TimeStampNow() + pr.Merger = pusher + pr.MergerID = opts.UserID + + if err := db.WithTx(ctx, func(ctx context.Context) error { + // Removing an auto merge pull and ignore if not exist + if err := pull_model.DeleteScheduledAutoMerge(ctx, pr.ID); err != nil && !db.IsErrNotExist(err) { + return fmt.Errorf("DeleteScheduledAutoMerge[%d]: %v", opts.PullRequestID, err) + } + + if _, err := pr.SetMerged(ctx); err != nil { + return fmt.Errorf("Failed to SetMerged: %s/%s Error: %v", ownerName, repoName, err) + } + return nil + }); err != nil { + log.Error("%v", err) + ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ + Err: err.Error(), + }) + return + } + } +}