mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Allow including Reviewed-on/Reviewed-by lines for custom merge messages (#31211)
				
					
				
			This PR introduces the `ReviewedOn` and `ReviewedBy` variables for the default merge message templates (e.g., `.gitea/default_merge_message/MERGE_TEMPLATE.md`). This allows customizing the default merge messages while retaining these trailers. This also moves the associated logic out of `pull.tmpl` into the relevant Go function. This is a first contribution towards #11077. --- For illustration, this allows to recreate the "default default" merge message with the following template: ``` .gitea/default_merge_message/MERGE_TEMPLATE.md Merge pull request '${PullRequestTitle}' (${PullRequestReference}) from ${HeadBranch} into ${BaseBranch} ${ReviewedOn} ${ReviewedBy} ```
This commit is contained in:
		| @@ -44,6 +44,8 @@ You can use the following variables enclosed in `${}` inside these templates whi | |||||||
| - PullRequestIndex: Pull request's index number | - PullRequestIndex: Pull request's index number | ||||||
| - PullRequestReference: Pull request's reference char with index number. i.e. #1, !2 | - PullRequestReference: Pull request's reference char with index number. i.e. #1, !2 | ||||||
| - ClosingIssues: return a string contains all issues which will be closed by this pull request i.e. `close #1, close #2` | - ClosingIssues: return a string contains all issues which will be closed by this pull request i.e. `close #1, close #2` | ||||||
|  | - ReviewedOn: Which pull request this commit belongs to. For example `Reviewed-on: https://gitea.com/foo/bar/pulls/1` | ||||||
|  | - ReviewedBy: Who approved the pull request before the merge. For example `Reviewed-by: Jane Doe <jane.doe@example.com>` | ||||||
|  |  | ||||||
| ## Rebase | ## Rebase | ||||||
|  |  | ||||||
|   | |||||||
| @@ -46,6 +46,9 @@ func getMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issue | |||||||
| 	if err := pr.Issue.LoadPoster(ctx); err != nil { | 	if err := pr.Issue.LoadPoster(ctx); err != nil { | ||||||
| 		return "", "", err | 		return "", "", err | ||||||
| 	} | 	} | ||||||
|  | 	if err := pr.Issue.LoadRepo(ctx); err != nil { | ||||||
|  | 		return "", "", err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	isExternalTracker := pr.BaseRepo.UnitEnabled(ctx, unit.TypeExternalTracker) | 	isExternalTracker := pr.BaseRepo.UnitEnabled(ctx, unit.TypeExternalTracker) | ||||||
| 	issueReference := "#" | 	issueReference := "#" | ||||||
| @@ -53,6 +56,9 @@ func getMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issue | |||||||
| 		issueReference = "!" | 		issueReference = "!" | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	reviewedOn := fmt.Sprintf("Reviewed-on: %s/%s", setting.AppURL, pr.Issue.Link()) | ||||||
|  | 	reviewedBy := pr.GetApprovers(ctx) | ||||||
|  |  | ||||||
| 	if mergeStyle != "" { | 	if mergeStyle != "" { | ||||||
| 		templateFilepath := fmt.Sprintf(".gitea/default_merge_message/%s_TEMPLATE.md", strings.ToUpper(string(mergeStyle))) | 		templateFilepath := fmt.Sprintf(".gitea/default_merge_message/%s_TEMPLATE.md", strings.ToUpper(string(mergeStyle))) | ||||||
| 		commit, err := baseGitRepo.GetBranchCommit(pr.BaseRepo.DefaultBranch) | 		commit, err := baseGitRepo.GetBranchCommit(pr.BaseRepo.DefaultBranch) | ||||||
| @@ -77,6 +83,8 @@ func getMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issue | |||||||
| 				"PullRequestPosterName":  pr.Issue.Poster.Name, | 				"PullRequestPosterName":  pr.Issue.Poster.Name, | ||||||
| 				"PullRequestIndex":       strconv.FormatInt(pr.Index, 10), | 				"PullRequestIndex":       strconv.FormatInt(pr.Index, 10), | ||||||
| 				"PullRequestReference":   fmt.Sprintf("%s%d", issueReference, pr.Index), | 				"PullRequestReference":   fmt.Sprintf("%s%d", issueReference, pr.Index), | ||||||
|  | 				"ReviewedOn":             reviewedOn, | ||||||
|  | 				"ReviewedBy":             reviewedBy, | ||||||
| 			} | 			} | ||||||
| 			if pr.HeadRepo != nil { | 			if pr.HeadRepo != nil { | ||||||
| 				vars["HeadRepoOwnerName"] = pr.HeadRepo.OwnerName | 				vars["HeadRepoOwnerName"] = pr.HeadRepo.OwnerName | ||||||
| @@ -116,20 +124,22 @@ func getMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issue | |||||||
| 		return "", "", nil | 		return "", "", nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	body = fmt.Sprintf("%s\n%s", reviewedOn, reviewedBy) | ||||||
|  |  | ||||||
| 	// Squash merge has a different from other styles. | 	// Squash merge has a different from other styles. | ||||||
| 	if mergeStyle == repo_model.MergeStyleSquash { | 	if mergeStyle == repo_model.MergeStyleSquash { | ||||||
| 		return fmt.Sprintf("%s (%s%d)", pr.Issue.Title, issueReference, pr.Issue.Index), "", nil | 		return fmt.Sprintf("%s (%s%d)", pr.Issue.Title, issueReference, pr.Issue.Index), body, nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if pr.BaseRepoID == pr.HeadRepoID { | 	if pr.BaseRepoID == pr.HeadRepoID { | ||||||
| 		return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), "", nil | 		return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), body, nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if pr.HeadRepo == nil { | 	if pr.HeadRepo == nil { | ||||||
| 		return fmt.Sprintf("Merge pull request '%s' (%s%d) from <deleted>:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), "", nil | 		return fmt.Sprintf("Merge pull request '%s' (%s%d) from <deleted>:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), body, nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseBranch), "", nil | 	return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseBranch), body, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func expandDefaultMergeMessage(template string, vars map[string]string) (message, body string) { | func expandDefaultMergeMessage(template string, vars map[string]string) (message, body string) { | ||||||
|   | |||||||
| @@ -199,7 +199,6 @@ | |||||||
|  |  | ||||||
| 				{{if .AllowMerge}} {{/* user is allowed to merge */}} | 				{{if .AllowMerge}} {{/* user is allowed to merge */}} | ||||||
| 					{{$prUnit := .Repository.MustGetUnit $.Context ctx.Consts.RepoUnitTypePullRequests}} | 					{{$prUnit := .Repository.MustGetUnit $.Context ctx.Consts.RepoUnitTypePullRequests}} | ||||||
| 					{{$approvers := (.Issue.PullRequest.GetApprovers ctx)}} |  | ||||||
| 					{{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash $prUnit.PullRequestsConfig.AllowFastForwardOnly}} | 					{{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash $prUnit.PullRequestsConfig.AllowFastForwardOnly}} | ||||||
| 						{{$hasPendingPullRequestMergeTip := ""}} | 						{{$hasPendingPullRequestMergeTip := ""}} | ||||||
| 						{{if .HasPendingPullRequestMerge}} | 						{{if .HasPendingPullRequestMerge}} | ||||||
| @@ -208,11 +207,10 @@ | |||||||
| 						{{end}} | 						{{end}} | ||||||
| 						<div class="divider"></div> | 						<div class="divider"></div> | ||||||
| 						<script type="module"> | 						<script type="module"> | ||||||
| 							const issueUrl = window.location.origin + {{$.Issue.Link}}; |  | ||||||
| 							const defaultMergeTitle = {{.DefaultMergeMessage}}; | 							const defaultMergeTitle = {{.DefaultMergeMessage}}; | ||||||
| 							const defaultSquashMergeTitle = {{.DefaultSquashMergeMessage}}; | 							const defaultSquashMergeTitle = {{.DefaultSquashMergeMessage}}; | ||||||
| 							const defaultMergeMessage = {{if .DefaultMergeBody}}{{.DefaultMergeBody}}{{else}}`Reviewed-on: ${issueUrl}\n` + {{$approvers}}{{end}}; | 							const defaultMergeMessage = {{.DefaultMergeBody}}; | ||||||
| 							const defaultSquashMergeMessage = {{if .DefaultSquashMergeBody}}{{.DefaultSquashMergeBody}}{{else}}`Reviewed-on: ${issueUrl}\n` + {{$approvers}}{{end}}; | 							const defaultSquashMergeMessage = {{.DefaultSquashMergeBody}}; | ||||||
| 							const mergeForm = { | 							const mergeForm = { | ||||||
| 								'baseLink': {{.Link}}, | 								'baseLink': {{.Link}}, | ||||||
| 								'textCancel': {{ctx.Locale.Tr "cancel"}}, | 								'textCancel': {{ctx.Locale.Tr "cancel"}}, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user