mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Use for a repo action one database transaction (#19576)
... more context (part of #9307)
This commit is contained in:
		@@ -726,7 +726,8 @@ func MergePullRequest(ctx *context.APIContext) {
 | 
			
		||||
	//     "$ref": "#/responses/error"
 | 
			
		||||
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.MergePullRequestForm)
 | 
			
		||||
	pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
 | 
			
		||||
 | 
			
		||||
	pr, err := models.GetPullRequestByIndexCtx(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if models.IsErrPullRequestNotExist(err) {
 | 
			
		||||
			ctx.NotFound("GetPullRequestByIndex", err)
 | 
			
		||||
@@ -741,7 +742,7 @@ func MergePullRequest(ctx *context.APIContext) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := pr.LoadIssue(); err != nil {
 | 
			
		||||
	if err := pr.LoadIssueCtx(ctx); err != nil {
 | 
			
		||||
		ctx.Error(http.StatusInternalServerError, "LoadIssue", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
@@ -749,7 +750,7 @@ func MergePullRequest(ctx *context.APIContext) {
 | 
			
		||||
 | 
			
		||||
	if ctx.IsSigned {
 | 
			
		||||
		// Update issue-user.
 | 
			
		||||
		if err = pr.Issue.ReadBy(ctx.Doer.ID); err != nil {
 | 
			
		||||
		if err = pr.Issue.ReadBy(ctx, ctx.Doer.ID); err != nil {
 | 
			
		||||
			ctx.Error(http.StatusInternalServerError, "ReadBy", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
@@ -758,6 +759,7 @@ func MergePullRequest(ctx *context.APIContext) {
 | 
			
		||||
	manuallMerge := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged
 | 
			
		||||
	force := form.ForceMerge != nil && *form.ForceMerge
 | 
			
		||||
 | 
			
		||||
	// start with merging by checking
 | 
			
		||||
	if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, manuallMerge, force); err != nil {
 | 
			
		||||
		if errors.Is(err, pull_service.ErrIsClosed) {
 | 
			
		||||
			ctx.NotFound()
 | 
			
		||||
@@ -798,15 +800,14 @@ func MergePullRequest(ctx *context.APIContext) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// set defaults to propagate needed fields
 | 
			
		||||
	if err := form.SetDefaults(pr); err != nil {
 | 
			
		||||
	if err := form.SetDefaults(ctx, pr); err != nil {
 | 
			
		||||
		ctx.ServerError("SetDefaults", fmt.Errorf("SetDefaults: %v", err))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := pull_service.Merge(ctx, pr, ctx.Doer, ctx.Repo.GitRepo, repo_model.MergeStyle(form.Do), form.HeadCommitID, form.MergeTitleField); err != nil {
 | 
			
		||||
	if err := pull_service.Merge(pr, ctx.Doer, ctx.Repo.GitRepo, repo_model.MergeStyle(form.Do), form.HeadCommitID, form.MergeTitleField); err != nil {
 | 
			
		||||
		if models.IsErrInvalidMergeStyle(err) {
 | 
			
		||||
			ctx.Error(http.StatusMethodNotAllowed, "Invalid merge style", fmt.Errorf("%s is not allowed an allowed merge style for this repository", repo_model.MergeStyle(form.Do)))
 | 
			
		||||
			return
 | 
			
		||||
		} else if models.IsErrMergeConflicts(err) {
 | 
			
		||||
			conflictError := err.(models.ErrMergeConflicts)
 | 
			
		||||
			ctx.JSON(http.StatusConflict, conflictError)
 | 
			
		||||
@@ -818,28 +819,25 @@ func MergePullRequest(ctx *context.APIContext) {
 | 
			
		||||
			ctx.JSON(http.StatusConflict, conflictError)
 | 
			
		||||
		} else if git.IsErrPushOutOfDate(err) {
 | 
			
		||||
			ctx.Error(http.StatusConflict, "Merge", "merge push out of date")
 | 
			
		||||
			return
 | 
			
		||||
		} else if models.IsErrSHADoesNotMatch(err) {
 | 
			
		||||
			ctx.Error(http.StatusConflict, "Merge", "head out of date")
 | 
			
		||||
			return
 | 
			
		||||
		} else if git.IsErrPushRejected(err) {
 | 
			
		||||
			errPushRej := err.(*git.ErrPushRejected)
 | 
			
		||||
			if len(errPushRej.Message) == 0 {
 | 
			
		||||
				ctx.Error(http.StatusConflict, "Merge", "PushRejected without remote error message")
 | 
			
		||||
				return
 | 
			
		||||
			} else {
 | 
			
		||||
				ctx.Error(http.StatusConflict, "Merge", "PushRejected with remote message: "+errPushRej.Message)
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Error(http.StatusConflict, "Merge", "PushRejected with remote message: "+errPushRej.Message)
 | 
			
		||||
			return
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.Error(http.StatusInternalServerError, "Merge", err)
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Error(http.StatusInternalServerError, "Merge", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Trace("Pull request merged: %d", pr.ID)
 | 
			
		||||
 | 
			
		||||
	if form.DeleteBranchAfterMerge {
 | 
			
		||||
		// Don't cleanup when there are other PR's that use this branch as head branch.
 | 
			
		||||
		exist, err := models.HasUnmergedPullRequestsByHeadInfo(pr.HeadRepoID, pr.HeadBranch)
 | 
			
		||||
		exist, err := models.HasUnmergedPullRequestsByHeadInfo(ctx, pr.HeadRepoID, pr.HeadBranch)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err)
 | 
			
		||||
			return
 | 
			
		||||
@@ -873,7 +871,7 @@ func MergePullRequest(ctx *context.APIContext) {
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if err := models.AddDeletePRBranchComment(ctx.Doer, pr.BaseRepo, pr.Issue.ID, pr.HeadBranch); err != nil {
 | 
			
		||||
		if err := models.AddDeletePRBranchComment(ctx, ctx.Doer, pr.BaseRepo, pr.Issue.ID, pr.HeadBranch); err != nil {
 | 
			
		||||
			// Do not fail here as branch has already been deleted
 | 
			
		||||
			log.Error("DeleteBranch: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user