mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	Add quick approve button on PR page (#35678)
This PR adds a quick approve button on PR page to allow reviewers to approve all pending checks. Only users with write permission to the Actions unit can approve. --------- Signed-off-by: Zettat123 <zettat123@gmail.com> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -38,6 +38,7 @@ import ( | ||||
| 	"code.gitea.io/gitea/modules/web" | ||||
| 	"code.gitea.io/gitea/routers/utils" | ||||
| 	shared_user "code.gitea.io/gitea/routers/web/shared/user" | ||||
| 	actions_service "code.gitea.io/gitea/services/actions" | ||||
| 	asymkey_service "code.gitea.io/gitea/services/asymkey" | ||||
| 	"code.gitea.io/gitea/services/automerge" | ||||
| 	"code.gitea.io/gitea/services/context" | ||||
| @@ -311,6 +312,14 @@ func prepareMergedViewPullInfo(ctx *context.Context, issue *issues_model.Issue) | ||||
| 	return compareInfo | ||||
| } | ||||
|  | ||||
| type pullCommitStatusCheckData struct { | ||||
| 	MissingRequiredChecks   []string          // list of missing required checks | ||||
| 	IsContextRequired       func(string) bool // function to check whether a context is required | ||||
| 	RequireApprovalRunCount int               // number of workflow runs that require approval | ||||
| 	CanApprove              bool              // whether the user can approve workflow runs | ||||
| 	ApproveLink             string            // link to approve all checks | ||||
| } | ||||
|  | ||||
| // prepareViewPullInfo show meta information for a pull request preview page | ||||
| func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *pull_service.CompareInfo { | ||||
| 	ctx.Data["PullRequestWorkInProgressPrefixes"] = setting.Repository.PullRequest.WorkInProgressPrefixes | ||||
| @@ -456,6 +465,11 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *pull_ | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	statusCheckData := &pullCommitStatusCheckData{ | ||||
| 		ApproveLink: fmt.Sprintf("%s/actions/approve-all-checks?commit_id=%s", repo.Link(), sha), | ||||
| 	} | ||||
| 	ctx.Data["StatusCheckData"] = statusCheckData | ||||
|  | ||||
| 	commitStatuses, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetLatestCommitStatus", err) | ||||
| @@ -465,6 +479,20 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *pull_ | ||||
| 		git_model.CommitStatusesHideActionsURL(ctx, commitStatuses) | ||||
| 	} | ||||
|  | ||||
| 	runs, err := actions_service.GetRunsFromCommitStatuses(ctx, commitStatuses) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetRunsFromCommitStatuses", err) | ||||
| 		return nil | ||||
| 	} | ||||
| 	for _, run := range runs { | ||||
| 		if run.NeedApproval { | ||||
| 			statusCheckData.RequireApprovalRunCount++ | ||||
| 		} | ||||
| 	} | ||||
| 	if statusCheckData.RequireApprovalRunCount > 0 { | ||||
| 		statusCheckData.CanApprove = ctx.Repo.CanWrite(unit.TypeActions) | ||||
| 	} | ||||
|  | ||||
| 	if len(commitStatuses) > 0 { | ||||
| 		ctx.Data["LatestCommitStatuses"] = commitStatuses | ||||
| 		ctx.Data["LatestCommitStatus"] = git_model.CalcCommitStatus(commitStatuses) | ||||
| @@ -486,9 +514,9 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *pull_ | ||||
| 				missingRequiredChecks = append(missingRequiredChecks, requiredContext) | ||||
| 			} | ||||
| 		} | ||||
| 		ctx.Data["MissingRequiredChecks"] = missingRequiredChecks | ||||
| 		statusCheckData.MissingRequiredChecks = missingRequiredChecks | ||||
|  | ||||
| 		ctx.Data["is_context_required"] = func(context string) bool { | ||||
| 		statusCheckData.IsContextRequired = func(context string) bool { | ||||
| 			for _, c := range pb.StatusCheckContexts { | ||||
| 				if c == context { | ||||
| 					return true | ||||
|   | ||||
		Reference in New Issue
	
	Block a user