Skip to content

Commit a9cc9c0

Browse files
6543wxiaoguangdelvh
authored
Auto merge pull requests when all checks succeeded via WebUI (#19648)
Add WebUI part of Auto merge feature close #19621 Co-authored-by: wxiaoguang <[email protected]> Co-authored-by: delvh <[email protected]>
1 parent ce3dd04 commit a9cc9c0

File tree

10 files changed

+300
-137
lines changed

10 files changed

+300
-137
lines changed

options/locale/locale_en-US.ini

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,14 +1568,7 @@ pulls.squash_merge_pull_request = Create squash commit
15681568
pulls.merge_manually = Manually merged
15691569
pulls.merge_commit_id = The merge commit ID
15701570
pulls.require_signed_wont_sign = The branch requires signed commits but this merge will not be signed
1571-
pulls.merge_pull_request_now = Merge Pull Request Now
1572-
pulls.rebase_merge_pull_request_now = Rebase and Merge Now
1573-
pulls.rebase_merge_commit_pull_request_now = Rebase and Merge Now (--no-ff)
1574-
pulls.squash_merge_pull_request_now = Squash and Merge Now
1575-
pulls.merge_pull_request_on_status_success = Merge Pull Request When All Checks Succeed
1576-
pulls.rebase_merge_pull_request_on_status_success = Rebase and Merge When All Checks Succeed
1577-
pulls.rebase_merge_commit_pull_request_on_status_success = Rebase and Merge (--no-ff) When All Checks Succeed
1578-
pulls.squash_merge_pull_request_on_status_success = Squash and Merge When All Checks Succeed
1571+
15791572
pulls.invalid_merge_option = You cannot use this merge option for this pull request.
15801573
pulls.merge_conflict = Merge Failed: There was a conflict whilst merging. Hint: Try a different strategy
15811574
pulls.merge_conflict_summary = Error Message
@@ -1606,14 +1599,18 @@ pulls.reopened_at = `reopened this pull request <a id="%[1]s" href="#%[1]s">%[2]
16061599
pulls.merge_instruction_hint = `You can also view <a class="show-instruction">command line instructions</a>.`
16071600
pulls.merge_instruction_step1_desc = From your project repository, check out a new branch and test the changes.
16081601
pulls.merge_instruction_step2_desc = Merge the changes and update on Gitea.
1609-
pulls.merge_on_status_success = The pull request was scheduled to merge when all checks succeed.
1610-
pulls.merge_on_status_success_already_scheduled = This pull request is already scheduled to merge when all checks succeed.
1611-
pulls.pr_has_pending_merge_on_success = %[1]s scheduled this pull request to auto merge when all checks succeed %[2]s.
1612-
pulls.merge_pull_on_success_cancel = Cancel auto merge
1613-
pulls.pull_request_not_scheduled = This pull request is not scheduled to auto merge.
1614-
pulls.pull_request_schedule_canceled = The auto merge was canceled for this pull request.
1615-
pulls.pull_request_scheduled_auto_merge = `scheduled this pull request to auto merge when all checks succeed %[1]s`
1616-
pulls.pull_request_canceled_scheduled_auto_merge = `canceled auto merging this pull request when all checks succeed %[1]s`
1602+
1603+
pulls.auto_merge_button_when_succeed = (When checks succeed)
1604+
pulls.auto_merge_when_succeed = Auto merge when all checks succeed
1605+
pulls.auto_merge_newly_scheduled = The pull request was scheduled to merge when all checks succeed.
1606+
pulls.auto_merge_has_pending_schedule = %[1]s scheduled this pull request to auto merge when all checks succeed %[2]s.
1607+
1608+
pulls.auto_merge_cancel_schedule = Cancel auto merge
1609+
pulls.auto_merge_not_scheduled = This pull request is not scheduled to auto merge.
1610+
pulls.auto_merge_canceled_schedule = The auto merge was canceled for this pull request.
1611+
1612+
pulls.auto_merge_newly_scheduled_comment = `scheduled this pull request to auto merge when all checks succeed %[1]s`
1613+
pulls.auto_merge_canceled_schedule_comment = `canceled auto merging this pull request when all checks succeed %[1]s`
16171614

16181615
milestones.new = New Milestone
16191616
milestones.open_tab = %d Open

routers/web/repo/pull.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"code.gitea.io/gitea/models/db"
2121
"code.gitea.io/gitea/models/organization"
2222
access_model "code.gitea.io/gitea/models/perm/access"
23+
pull_model "code.gitea.io/gitea/models/pull"
2324
repo_model "code.gitea.io/gitea/models/repo"
2425
"code.gitea.io/gitea/models/unit"
2526
user_model "code.gitea.io/gitea/models/user"
@@ -36,6 +37,7 @@ import (
3637
"code.gitea.io/gitea/modules/web/middleware"
3738
"code.gitea.io/gitea/routers/utils"
3839
asymkey_service "code.gitea.io/gitea/services/asymkey"
40+
"code.gitea.io/gitea/services/automerge"
3941
"code.gitea.io/gitea/services/forms"
4042
"code.gitea.io/gitea/services/gitdiff"
4143
pull_service "code.gitea.io/gitea/services/pull"
@@ -966,6 +968,22 @@ func MergePullRequest(ctx *context.Context) {
966968
message += "\n\n" + form.MergeMessageField
967969
}
968970

971+
if form.MergeWhenChecksSucceed {
972+
// delete all scheduled auto merges
973+
_ = pull_model.DeleteScheduledAutoMerge(ctx, pr.ID)
974+
// schedule auto merge
975+
scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message)
976+
if err != nil {
977+
ctx.ServerError("ScheduleAutoMerge", err)
978+
return
979+
} else if scheduled {
980+
// nothing more to do ...
981+
ctx.Flash.Success(ctx.Tr("repo.pulls.auto_merge_newly_scheduled"))
982+
ctx.Redirect(fmt.Sprintf("%s/pulls/%d", ctx.Repo.RepoLink, pr.Index))
983+
return
984+
}
985+
}
986+
969987
if err := pull_service.Merge(ctx, pr, ctx.Doer, ctx.Repo.GitRepo, repo_model.MergeStyle(form.Do), form.HeadCommitID, message); err != nil {
970988
if models.IsErrInvalidMergeStyle(err) {
971989
ctx.Flash.Error(ctx.Tr("repo.pulls.invalid_merge_option"))
@@ -1070,6 +1088,26 @@ func MergePullRequest(ctx *context.Context) {
10701088
ctx.Redirect(issue.Link())
10711089
}
10721090

1091+
// CancelAutoMergePullRequest cancels a scheduled pr
1092+
func CancelAutoMergePullRequest(ctx *context.Context) {
1093+
issue := checkPullInfo(ctx)
1094+
if ctx.Written() {
1095+
return
1096+
}
1097+
1098+
if err := automerge.RemoveScheduledAutoMerge(ctx, ctx.Doer, issue.PullRequest); err != nil {
1099+
if db.IsErrNotExist(err) {
1100+
ctx.Flash.Error(ctx.Tr("repo.pulls.auto_merge_not_scheduled"))
1101+
ctx.Redirect(fmt.Sprintf("%s/pulls/%d", ctx.Repo.RepoLink, issue.Index))
1102+
return
1103+
}
1104+
ctx.ServerError("RemoveScheduledAutoMerge", err)
1105+
return
1106+
}
1107+
ctx.Flash.Success(ctx.Tr("repo.pulls.auto_merge_canceled_schedule"))
1108+
ctx.Redirect(fmt.Sprintf("%s/pulls/%d", ctx.Repo.RepoLink, issue.Index))
1109+
}
1110+
10731111
func stopTimerIfAvailable(user *user_model.User, issue *models.Issue) error {
10741112
if models.StopwatchExists(user.ID, issue.ID) {
10751113
if err := models.CreateOrStopIssueStopwatch(user, issue); err != nil {

routers/web/web.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,7 @@ func RegisterRoutes(m *web.Route) {
11271127
m.Get(".patch", repo.DownloadPullPatch)
11281128
m.Get("/commits", context.RepoRef(), repo.ViewPullCommits)
11291129
m.Post("/merge", context.RepoMustNotBeArchived(), bindIgnErr(forms.MergePullRequestForm{}), repo.MergePullRequest)
1130+
m.Post("/cancel_auto_merge", context.RepoMustNotBeArchived(), repo.CancelAutoMergePullRequest)
11301131
m.Post("/update", repo.UpdatePullRequest)
11311132
m.Post("/set_allow_maintainer_edit", bindIgnErr(forms.UpdateAllowEditsForm{}), repo.SetAllowEdits)
11321133
m.Post("/cleanup", context.RepoMustNotBeArchived(), context.RepoRef(), repo.CleanUpPullRequest)

templates/repo/issue/view_content/comments.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -843,8 +843,8 @@
843843
<span class="badge">{{svg "octicon-git-merge" 16}}</span>
844844
<span class="text grey">
845845
<a class="author" href="{{.Poster.HomeLink}}">{{.Poster.GetDisplayName}}</a>
846-
{{if eq .Type 34}}{{$.i18n.Tr "repo.pulls.pull_request_scheduled_auto_merge" $createdStr | Safe}}
847-
{{else}}{{$.i18n.Tr "repo.pulls.pull_request_canceled_scheduled_auto_merge" $createdStr | Safe}}{{end}}
846+
{{if eq .Type 34}}{{$.i18n.Tr "repo.pulls.auto_merge_newly_scheduled_comment" $createdStr | Safe}}
847+
{{else}}{{$.i18n.Tr "repo.pulls.auto_merge_canceled_schedule_comment" $createdStr | Safe}}{{end}}
848848
</span>
849849
</div>
850850
{{end}}

templates/repo/issue/view_content/pull.tmpl

Lines changed: 101 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,14 @@
251251
{{$.i18n.Tr (printf "repo.signing.wont_sign.%s" .WontSignReason) }}
252252
</div>
253253
{{end}}
254+
254255
{{$notAllOverridableChecksOk := or .IsBlockedByApprovals .IsBlockedByRejection .IsBlockedByOfficialReviewRequests .IsBlockedByOutdatedBranch .IsBlockedByChangedProtectedFiles (and .EnableStatusCheck (not .RequiredStatusCheckState.IsSuccess))}}
255-
{{if and (or $.IsRepoAdmin (not $notAllOverridableChecksOk)) (or (not .AllowMerge) (not .RequireSigned) .WillSign)}}
256+
257+
{{/* admin can merge without checks, writer can merge when checkes succeed */}}
258+
{{$canMergeNow := and (or $.IsRepoAdmin (not $notAllOverridableChecksOk)) (or (not .AllowMerge) (not .RequireSigned) .WillSign)}}
259+
{{/* admin and writer both can make an auto merge schedule */}}
260+
261+
{{if $canMergeNow}}
256262
{{if $notAllOverridableChecksOk}}
257263
<div class="item">
258264
<i class="icon icon-octicon">{{svg "octicon-dot-fill"}}</i>
@@ -277,7 +283,6 @@
277283
{{end}}
278284
{{end}}
279285

280-
{{$canAutoMerge = true}}
281286
{{if (gt .Issue.PullRequest.CommitsBehind 0)}}
282287
<div class="ui divider"></div>
283288
<div class="item item-section">
@@ -317,112 +322,111 @@
317322
</div>
318323
{{end}}
319324

320-
{{if and (or $.IsRepoAdmin (not $notAllOverridableChecksOk)) (or (not .AllowMerge) (not .RequireSigned) .WillSign)}}
321-
{{if .AllowMerge}}
322-
{{$prUnit := .Repository.MustGetUnit $.UnitTypePullRequests}}
323-
{{$approvers := .Issue.PullRequest.GetApprovers}}
324-
{{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash}}
325+
{{if .AllowMerge}} {{/* user is allowed to merge */}}
326+
{{$prUnit := .Repository.MustGetUnit $.UnitTypePullRequests}}
327+
{{$approvers := .Issue.PullRequest.GetApprovers}}
328+
{{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash}}
329+
{{$hasPendingPullRequestMergeTip := ""}}
330+
{{if .HasPendingPullRequestMerge}}
331+
{{$createdPRMergeStr := TimeSinceUnix .PendingPullRequestMerge.CreatedUnix $.i18n.Lang}}
332+
{{$hasPendingPullRequestMergeTip = $.i18n.Tr "repo.pulls.auto_merge_has_pending_schedule" .PendingPullRequestMerge.Doer.Name $createdPRMergeStr}}
333+
{{end}}
334+
<div class="ui divider"></div>
335+
<script>
336+
<!-- /* eslint-disable */ -->
337+
(() => {
338+
const defaultMergeTitle = {{.DefaultMergeMessage}};
339+
const defaultSquashMergeTitle = {{.DefaultSquashMergeMessage}};
340+
const defaultMergeMessage = 'Reviewed-on: ' + {{$.Issue.HTMLURL}} + '\n' + {{$approvers}};
341+
const mergeForm = {
342+
'baseLink': {{.Link}},
343+
'textCancel': {{$.i18n.Tr "cancel"}},
344+
'textDeleteBranch': {{$.i18n.Tr "repo.branch.delete" .HeadTarget}},
345+
'textAutoMergeButtonWhenSucceed': {{$.i18n.Tr "repo.pulls.auto_merge_button_when_succeed"}},
346+
'textAutoMergeWhenSucceed': {{$.i18n.Tr "repo.pulls.auto_merge_when_succeed"}},
347+
'textAutoMergeCancelSchedule': {{$.i18n.Tr "repo.pulls.auto_merge_cancel_schedule"}},
325348

326-
<div class="ui divider"></div>
349+
'canMergeNow': {{$canMergeNow}},
350+
'allOverridableChecksOk': {{not $notAllOverridableChecksOk}},
351+
'pullHeadCommitID': {{.PullHeadCommitID}},
352+
'isPullBranchDeletable': {{.IsPullBranchDeletable}},
353+
'defaultDeleteBranchAfterMerge': {{$prUnit.PullRequestsConfig.DefaultDeleteBranchAfterMerge}},
354+
'mergeMessageFieldPlaceHolder': {{$.i18n.Tr "repo.editor.commit_message_desc"}},
327355

328-
<script>
329-
<!-- /* eslint-disable */ -->
330-
(() => {
331-
const defaultMergeTitle = {{.DefaultMergeMessage}};
332-
const defaultSquashMergeTitle = {{.DefaultSquashMergeMessage}};
333-
const defaultMergeMessage = 'Reviewed-on: ' + {{$.Issue.HTMLURL}} + '\n' + {{$approvers}};
334-
const mergeForm = {
335-
'baseLink': {{.Link}},
336-
'textCancel': {{$.i18n.Tr "cancel"}},
337-
'textDeleteBranch': {{$.i18n.Tr "repo.branch.delete" .HeadTarget}},
356+
'hasPendingPullRequestMerge': {{.HasPendingPullRequestMerge}},
357+
'hasPendingPullRequestMergeTip': {{$hasPendingPullRequestMergeTip}},
358+
};
338359

339-
'allOverridableChecksOk': {{not $notAllOverridableChecksOk}},
340-
'pullHeadCommitID': {{.PullHeadCommitID}},
341-
'isPullBranchDeletable': {{.IsPullBranchDeletable}},
342-
'defaultDeleteBranchAfterMerge': {{$prUnit.PullRequestsConfig.DefaultDeleteBranchAfterMerge}},
343-
'mergeMessageFieldPlaceHolder': {{$.i18n.Tr "repo.editor.commit_message_desc"}},
344-
};
345-
mergeForm['mergeStyles'] = [
346-
{
347-
'name': 'merge',
348-
'allowed': {{$prUnit.PullRequestsConfig.AllowMerge}},
349-
'textDoMerge': {{$.i18n.Tr "repo.pulls.merge_pull_request"}},
350-
'mergeTitleFieldText': defaultMergeTitle,
351-
'mergeMessageFieldText': defaultMergeMessage,
352-
},
353-
{
354-
'name': 'rebase',
355-
'allowed': {{$prUnit.PullRequestsConfig.AllowRebase}},
356-
'textDoMerge': {{$.i18n.Tr "repo.pulls.rebase_merge_pull_request"}},
357-
'hideMergeMessageTexts': true,
358-
},
359-
{
360-
'name': 'rebase-merge',
361-
'allowed': {{$prUnit.PullRequestsConfig.AllowRebaseMerge}},
362-
'textDoMerge': {{$.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}},
363-
'mergeTitleFieldText': defaultMergeTitle,
364-
'mergeMessageFieldText': defaultMergeMessage,
365-
},
366-
{
367-
'name': 'squash',
368-
'allowed': {{$prUnit.PullRequestsConfig.AllowSquash}},
369-
'textDoMerge': {{$.i18n.Tr "repo.pulls.squash_merge_pull_request"}},
370-
'mergeTitleFieldText': defaultSquashMergeTitle,
371-
'mergeMessageFieldText': defaultMergeMessage,
372-
},
373-
{
374-
'name': 'manually-merged',
375-
'allowed': {{and $prUnit.PullRequestsConfig.AllowManualMerge $.IsRepoAdmin}},
376-
'textDoMerge': {{$.i18n.Tr "repo.pulls.merge_manually"}},
377-
'hideMergeMessageTexts': true,
378-
}
379-
];
380-
window.config.pageData.pullRequestMergeForm = mergeForm;
381-
})();
382-
</script>
360+
const generalHideAutoMerge = mergeForm.canMergeNow && mergeForm.allOverridableChecksOk; // if this PR can be merged now, then hide the auto merge
361+
mergeForm['mergeStyles'] = [
362+
{
363+
'name': 'merge',
364+
'allowed': {{$prUnit.PullRequestsConfig.AllowMerge}},
365+
'textDoMerge': {{$.i18n.Tr "repo.pulls.merge_pull_request"}},
366+
'mergeTitleFieldText': defaultMergeTitle,
367+
'mergeMessageFieldText': defaultMergeMessage,
368+
'hideAutoMerge': generalHideAutoMerge,
369+
},
370+
{
371+
'name': 'rebase',
372+
'allowed': {{$prUnit.PullRequestsConfig.AllowRebase}},
373+
'textDoMerge': {{$.i18n.Tr "repo.pulls.rebase_merge_pull_request"}},
374+
'hideMergeMessageTexts': true,
375+
'hideAutoMerge': generalHideAutoMerge,
376+
},
377+
{
378+
'name': 'rebase-merge',
379+
'allowed': {{$prUnit.PullRequestsConfig.AllowRebaseMerge}},
380+
'textDoMerge': {{$.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}},
381+
'mergeTitleFieldText': defaultMergeTitle,
382+
'mergeMessageFieldText': defaultMergeMessage,
383+
'hideAutoMerge': generalHideAutoMerge,
384+
},
385+
{
386+
'name': 'squash',
387+
'allowed': {{$prUnit.PullRequestsConfig.AllowSquash}},
388+
'textDoMerge': {{$.i18n.Tr "repo.pulls.squash_merge_pull_request"}},
389+
'mergeTitleFieldText': defaultSquashMergeTitle,
390+
'mergeMessageFieldText': defaultMergeMessage,
391+
'hideAutoMerge': generalHideAutoMerge,
392+
},
393+
{
394+
'name': 'manually-merged',
395+
'allowed': {{and $prUnit.PullRequestsConfig.AllowManualMerge $.IsRepoAdmin}},
396+
'textDoMerge': {{$.i18n.Tr "repo.pulls.merge_manually"}},
397+
'hideMergeMessageTexts': true,
398+
'hideAutoMerge': true,
399+
}
400+
];
401+
window.config.pageData.pullRequestMergeForm = mergeForm;
402+
})();
403+
</script>
383404

384-
<div id="pull-request-merge-form"></div>
405+
<div id="pull-request-merge-form"></div>
385406

386-
{{if .ShowMergeInstructions}}
387-
<div class="instruct-toggle mt-3"> {{$.i18n.Tr "repo.pulls.merge_instruction_hint" | Safe}} </div>
388-
<div class="instruct-content" style="display:none">
389-
<div class="ui divider"></div>
390-
<div><h3 class="di">{{$.i18n.Tr "step1"}} </h3>{{$.i18n.Tr "repo.pulls.merge_instruction_step1_desc"}}</div>
391-
<div class="ui secondary segment">
392-
{{if eq .Issue.PullRequest.Flow 0}}
393-
<div>git checkout -b {{if ne .Issue.PullRequest.HeadRepo.ID .Issue.PullRequest.BaseRepo.ID}}{{.Issue.PullRequest.HeadRepo.OwnerName}}-{{end}}{{.Issue.PullRequest.HeadBranch}} {{.Issue.PullRequest.BaseBranch}}</div>
394-
<div>git pull {{if ne .Issue.PullRequest.HeadRepo.ID .Issue.PullRequest.BaseRepo.ID}}{{.Issue.PullRequest.HeadRepo.HTMLURL}}{{else}}origin{{end}} {{.Issue.PullRequest.HeadBranch}}</div>
395-
{{else}}
396-
<div>git fetch origin {{.Issue.PullRequest.GetGitRefName}}:{{.Issue.PullRequest.HeadBranch}}</div>
397-
{{end}}
398-
</div>
399-
<div><h3 class="di">{{$.i18n.Tr "step2"}} </h3>{{$.i18n.Tr "repo.pulls.merge_instruction_step2_desc"}}</div>
400-
<div class="ui secondary segment">
401-
<div>git checkout {{.Issue.PullRequest.BaseBranch}}</div>
402-
<div>git merge --no-ff {{if ne .Issue.PullRequest.HeadRepo.ID .Issue.PullRequest.BaseRepo.ID}}{{.Issue.PullRequest.HeadRepo.OwnerName}}-{{end}}{{.Issue.PullRequest.HeadBranch}}</div>
403-
<div>git push origin {{.Issue.PullRequest.BaseBranch}}</div>
404-
</div>
405-
</div>
406-
{{end}}
407-
{{else}}
408-
<div class="ui divider"></div>
409-
<div class="item text red">
410-
{{svg "octicon-x"}}
411-
{{$.i18n.Tr "repo.pulls.no_merge_desc"}}
412-
</div>
413-
<div class="item">
414-
{{svg "octicon-info"}}
415-
{{$.i18n.Tr "repo.pulls.no_merge_helper"}}
416-
</div>
407+
{{if .ShowMergeInstructions}}
408+
{{template "repo/issue/view_content/pull_merge_instruction" (dict "i18n" .i18n "Issue" .Issue)}}
417409
{{end}}
418410
{{else}}
411+
{{/* no merge style was set in repo setting: not or ($prUnit.PullRequestsConfig.AllowMerge ...) */}}
419412
<div class="ui divider"></div>
413+
<div class="item text red">
414+
{{svg "octicon-x"}}
415+
{{$.i18n.Tr "repo.pulls.no_merge_desc"}}
416+
</div>
420417
<div class="item">
421418
{{svg "octicon-info"}}
422-
{{$.i18n.Tr "repo.pulls.no_merge_access"}}
419+
{{$.i18n.Tr "repo.pulls.no_merge_helper"}}
423420
</div>
424-
{{end}}
425-
{{end}}
421+
{{end}} {{/* end if the repo was set to use any merge style */}}
422+
{{else}}
423+
{{/* user is not allowed to merge */}}
424+
<div class="ui divider"></div>
425+
<div class="item">
426+
{{svg "octicon-info"}}
427+
{{$.i18n.Tr "repo.pulls.no_merge_access"}}
428+
</div>
429+
{{end}} {{/* end if user is allowed to merge or not */}}
426430
{{else}}
427431
{{/* Merge conflict without specific file. Suggest manual merge, only if all reviews and status checks OK. */}}
428432
{{if .IsBlockedByApprovals}}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<div class="instruct-toggle mt-3"> {{$.i18n.Tr "repo.pulls.merge_instruction_hint" | Safe}} </div>
2+
<div class="instruct-content" style="display:none">
3+
<div class="ui divider"></div>
4+
<div><h3 class="di">{{$.i18n.Tr "step1"}} </h3>{{$.i18n.Tr "repo.pulls.merge_instruction_step1_desc"}}</div>
5+
<div class="ui secondary segment">
6+
{{if eq $.Issue.PullRequest.Flow 0}}
7+
<div>git checkout -b {{if ne $.Issue.PullRequest.HeadRepo.ID $.Issue.PullRequest.BaseRepo.ID}}{{$.Issue.PullRequest.HeadRepo.OwnerName}}-{{end}}{{$.Issue.PullRequest.HeadBranch}} {{$.Issue.PullRequest.BaseBranch}}</div>
8+
<div>git pull {{if ne $.Issue.PullRequest.HeadRepo.ID $.Issue.PullRequest.BaseRepo.ID}}{{$.Issue.PullRequest.HeadRepo.HTMLURL}}{{else}}origin{{end}} {{$.Issue.PullRequest.HeadBranch}}</div>
9+
{{else}}
10+
<div>git fetch origin {{$.Issue.PullRequest.GetGitRefName}}:{{$.Issue.PullRequest.HeadBranch}}</div>
11+
{{end}}
12+
</div>
13+
<div><h3 class="di">{{$.i18n.Tr "step2"}} </h3>{{$.i18n.Tr "repo.pulls.merge_instruction_step2_desc"}}</div>
14+
<div class="ui secondary segment">
15+
<div>git checkout {{$.Issue.PullRequest.BaseBranch}}</div>
16+
<div>git merge --no-ff {{if ne $.Issue.PullRequest.HeadRepo.ID $.Issue.PullRequest.BaseRepo.ID}}{{$.Issue.PullRequest.HeadRepo.OwnerName}}-{{end}}{{$.Issue.PullRequest.HeadBranch}}</div>
17+
<div>git push origin {{$.Issue.PullRequest.BaseBranch}}</div>
18+
</div>
19+
</div>

0 commit comments

Comments
 (0)