mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	API: don't allow merged PRs to be reopened (#17192)
* api: dont open merged PRs * don't change base branch when already merged * don't allow any state change * also validate opening merged PRs in EditIssue Co-authored-by: John Olheiser <john.olheiser@gmail.com> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		@@ -790,6 +790,15 @@ func EditIssue(ctx *context.APIContext) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if form.State != nil {
 | 
						if form.State != nil {
 | 
				
			||||||
 | 
							if issue.IsPull {
 | 
				
			||||||
 | 
								if pr, err := issue.GetPullRequest(); err != nil {
 | 
				
			||||||
 | 
									ctx.Error(http.StatusInternalServerError, "GetPullRequest", err)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								} else if pr.HasMerged {
 | 
				
			||||||
 | 
									ctx.Error(http.StatusPreconditionFailed, "MergedPRState", "cannot change state of this pull request, it was already merged")
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		issue.IsClosed = api.StateClosed == api.StateType(*form.State)
 | 
							issue.IsClosed = api.StateClosed == api.StateType(*form.State)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	statusChangeComment, titleChanged, err := models.UpdateIssueByAPI(issue, ctx.User)
 | 
						statusChangeComment, titleChanged, err := models.UpdateIssueByAPI(issue, ctx.User)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -564,6 +564,10 @@ func EditPullRequest(ctx *context.APIContext) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if form.State != nil {
 | 
						if form.State != nil {
 | 
				
			||||||
 | 
							if pr.HasMerged {
 | 
				
			||||||
 | 
								ctx.Error(http.StatusPreconditionFailed, "MergedPRState", "cannot change state of this pull request, it was already merged")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		issue.IsClosed = api.StateClosed == api.StateType(*form.State)
 | 
							issue.IsClosed = api.StateClosed == api.StateType(*form.State)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	statusChangeComment, titleChanged, err := models.UpdateIssueByAPI(issue, ctx.User)
 | 
						statusChangeComment, titleChanged, err := models.UpdateIssueByAPI(issue, ctx.User)
 | 
				
			||||||
@@ -585,7 +589,7 @@ func EditPullRequest(ctx *context.APIContext) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// change pull target branch
 | 
						// change pull target branch
 | 
				
			||||||
	if len(form.Base) != 0 && form.Base != pr.BaseBranch {
 | 
						if !pr.HasMerged && len(form.Base) != 0 && form.Base != pr.BaseBranch {
 | 
				
			||||||
		if !ctx.Repo.GitRepo.IsBranchExist(form.Base) {
 | 
							if !ctx.Repo.GitRepo.IsBranchExist(form.Base) {
 | 
				
			||||||
			ctx.Error(http.StatusNotFound, "NewBaseBranchNotExist", fmt.Errorf("new base '%s' not exist", form.Base))
 | 
								ctx.Error(http.StatusNotFound, "NewBaseBranchNotExist", fmt.Errorf("new base '%s' not exist", form.Base))
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user