{{if or .PullReviewers .OriginalReviews }} <div class="comment box"> <div class="content"> <div class="ui segment"> <h4>{{$.i18n.Tr "repo.issues.review.reviewers"}}</h4> {{range .PullReviewers}} {{ $createdStr:= TimeSinceUnix .Review.UpdatedUnix $.Lang }} <div class="ui divider"></div> <div class="review-item"> <div class="review-item-left"> {{if .User}} <a href="{{.User.HomeLink}}"> {{avatar .User}} </a> {{end}} <span class="text grey"> {{if .User}} <a href="{{.User.HomeLink}}">{{.User.GetDisplayName}}</a> {{else if .Team}} <span class="ui text">{{$.Issue.Repo.OwnerName}}/{{.Team.Name}}</span> {{end}} {{if eq .Review.Type 1}} {{$.i18n.Tr "repo.issues.review.approve" $createdStr | Safe}} {{else if eq .Review.Type 2}} {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} {{else if eq .Review.Type 3}} {{$.i18n.Tr "repo.issues.review.reject" $createdStr | Safe}} {{else if eq .Review.Type 4}} {{$.i18n.Tr "repo.issues.review.wait" $createdStr | Safe}} {{else}} {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} {{end}} </span> </div> <div class="review-item-right"> {{if .Review.Stale}} <span class="ui poping up type-icon text grey" data-content="{{$.i18n.Tr "repo.issues.is_stale"}}"> <i class="octicon icon fa-hourglass-end"></i> </span> {{end}} <span class="type-icon text {{if eq .Review.Type 1}}green {{- else if eq .Review.Type 2}}grey {{- else if eq .Review.Type 3}}red {{- else if eq .Review.Type 4}}yellow {{else}}grey{{end}}"> {{if .CanChange }} <a href="#" class="ui poping up icon re-request-review {{if .Checked}}checked{{end}}" data-issue-id="{{$.Issue.ID}}" data-content="{{if .Checked}} {{$.i18n.Tr "repo.issues.remove_request_review"}} {{else}} {{$.i18n.Tr "repo.issues.re_request_review"}} {{end}}" data-id="{{.ItemID}}" data-update-url="{{$.RepoLink}}/issues/request_review"> {{if .Checked}} {{svg "octicon-trashcan"}} {{else}} {{svg "octicon-sync"}} {{end}} </a> {{end}} {{svg (printf "octicon-%s" .Review.Type.Icon)}} </span> </div> </div> {{end}} {{range .OriginalReviews}} {{ $createdStr:= TimeSinceUnix .UpdatedUnix $.Lang }} <div class="ui divider"></div> <div class="review-item"> <div class="review-item-left"> <a href="{{$.Repository.OriginalURL}}" class="ui poping up" data-content="{{$.i18n.Tr "repo.migrated_from_fake" $.Repository.GetOriginalURLHostname | Safe }}"><span class="text black "><i class="fa {{MigrationIcon $.Repository.GetOriginalURLHostname}}" aria-hidden="true"></i> {{ .OriginalAuthor }}</span></a> </div> <div class="review-item-right"> <span class="type-icon text {{if eq .Type 1}}green {{- else if eq .Type 2}}grey {{- else if eq .Type 3}}red {{- else if eq .Type 4}}yellow {{else}}grey{{end}}"> {{svg (printf "octicon-%s" .Type.Icon)}} </span> </div> </div> {{end}} </div> </div> </div> {{end}} <div class="timeline-item comment merge box"> <a class="timeline-avatar text {{if .Issue.PullRequest.HasMerged}}purple {{- else if .Issue.IsClosed}}grey {{- else if .IsPullWorkInProgress}}grey {{- else if .IsFilesConflicted}}grey {{- else if .IsPullRequestBroken}}red {{- else if .IsBlockedByApprovals}}red {{- else if .IsBlockedByRejection}}red {{- else if .IsBlockedByOfficialReviewRequests}}red {{- else if .IsBlockedByOutdatedBranch}}red {{- else if .IsBlockedByChangedProtectedFiles}}red {{- else if and .EnableStatusCheck (or .RequiredStatusCheckState.IsFailure .RequiredStatusCheckState.IsError)}}red {{- else if and .EnableStatusCheck (or (not $.LatestCommitStatus) .RequiredStatusCheckState.IsPending .RequiredStatusCheckState.IsWarning)}}yellow {{- else if and .AllowMerge .RequireSigned (not .WillSign)}}red {{- else if .Issue.PullRequest.IsChecking}}yellow {{- else if .Issue.PullRequest.CanAutoMerge}}green {{- else}}red{{end}}">{{svg "octicon-git-merge" 32}}</a> <div class="content"> {{template "repo/pulls/status" .}} {{$canAutoMerge := false}} <div class="ui attached merge-section segment {{if not $.LatestCommitStatus}}no-header{{end}}"> {{if .Issue.PullRequest.HasMerged}} <div class="item text"> {{if .Issue.PullRequest.MergedCommitID}} {{$link := printf "%s/commit/%s" $.Repository.HTMLURL .Issue.PullRequest.MergedCommitID}} {{$.i18n.Tr "repo.pulls.merged_as" $link (ShortSha .Issue.PullRequest.MergedCommitID) | Safe}} {{else}} {{$.i18n.Tr "repo.pulls.has_merged"}} {{end}} </div> {{if .IsPullBranchDeletable}} <div class="ui divider"></div> <div> <a class="delete-button ui red button" href="" data-url="{{.DeleteBranchLink}}">{{$.i18n.Tr "repo.branch.delete" .HeadTarget}}</a> </div> {{end}} {{else if .Issue.IsClosed}} <div class="item text"> {{if .IsPullRequestBroken}} {{$.i18n.Tr "repo.pulls.cant_reopen_deleted_branch"}} {{else}} {{$.i18n.Tr "repo.pulls.reopen_to_merge"}} {{end}} </div> {{if and .IsPullBranchDeletable ( not .IsPullRequestBroken )}} <div class="ui divider"></div> <div> <a class="delete-button ui red button" href="" data-url="{{.DeleteBranchLink}}">{{$.i18n.Tr "repo.branch.delete" .HeadTarget}}</a> </div> {{end}} {{else if .IsPullFilesConflicted}} <div class="item text"> {{svg "octicon-x"}} {{$.i18n.Tr "repo.pulls.files_conflicted"}} {{range .ConflictedFiles}} <div>{{.}}</div> {{end}} </div> {{else if .IsPullRequestBroken}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.data_broken"}} </div> {{else if .IsPullWorkInProgress}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.cannot_merge_work_in_progress" (.WorkInProgressPrefix|Escape) | Str2html}} </div> {{else if .Issue.PullRequest.IsChecking}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-sync"}}</i> {{$.i18n.Tr "repo.pulls.is_checking"}} </div> {{else if .Issue.PullRequest.CanAutoMerge}} {{if .IsBlockedByApprovals}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.blocked_by_approvals" .GrantedApprovals .Issue.PullRequest.ProtectedBranch.RequiredApprovals}} </div> {{else if .IsBlockedByRejection}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.blocked_by_rejection"}} </div> {{else if .IsBlockedByOfficialReviewRequests}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.blocked_by_official_review_requests"}} </div> {{else if .IsBlockedByOutdatedBranch}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.blocked_by_outdated_branch"}} </div> {{else if .IsBlockedByChangedProtectedFiles}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x" 16}}</i> {{$.i18n.Tr (TrN $.i18n.Lang $.ChangedProtectedFilesNum "repo.pulls.blocked_by_changed_protected_files_1" "repo.pulls.blocked_by_changed_protected_files_n") | Safe }} <div class="ui ordered list"> {{range .ChangedProtectedFiles}} <div data-value="-" class="item">{{.}}</div> {{end}} </div> </div> {{else if and .EnableStatusCheck (or .RequiredStatusCheckState.IsError .RequiredStatusCheckState.IsFailure)}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.required_status_check_failed"}} </div> {{else if and .EnableStatusCheck (not .RequiredStatusCheckState.IsSuccess)}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.required_status_check_missing"}} </div> {{else if and .AllowMerge .RequireSigned (not .WillSign)}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.require_signed_wont_sign"}} </div> <div class="item"> <i class="icon unlock"></i> {{$.i18n.Tr (printf "repo.signing.wont_sign.%s" .WontSignReason) }} </div> {{end}} {{$notAllOverridableChecksOk := or .IsBlockedByApprovals .IsBlockedByRejection .IsBlockedByOfficialReviewRequests .IsBlockedByOutdatedBranch .IsBlockedByChangedProtectedFiles (and .EnableStatusCheck (not .RequiredStatusCheckState.IsSuccess))}} {{if and (or $.IsRepoAdmin (not $notAllOverridableChecksOk)) (or (not .AllowMerge) (not .RequireSigned) .WillSign)}} {{if $notAllOverridableChecksOk}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-dot-fill"}}</i> {{$.i18n.Tr "repo.pulls.required_status_check_administrator"}} </div> {{else}} <div class="item"> <i class="icon icon-octicon">{{svg "octicon-check"}}</i> {{$.i18n.Tr "repo.pulls.can_auto_merge_desc"}} </div> {{end}} {{if .WillSign}} <div class="item"> <i class="icon lock green"></i> {{$.i18n.Tr "repo.signing.will_sign" .SigningKey}} </div> {{else if .IsSigned}} <div class="item"> <i class="icon unlock"></i> {{$.i18n.Tr (printf "repo.signing.wont_sign.%s" .WontSignReason) }} </div> {{end}} {{end}} {{$canAutoMerge = true}} {{if (gt .Issue.PullRequest.CommitsBehind 0)}} <div class="ui divider"></div> <div class="item item-section"> <div class="item-section-left"> <i class="icon icon-octicon">{{svg "octicon-alert"}}</i> {{$.i18n.Tr "repo.pulls.outdated_with_base_branch"}} </div> <div class="item-section-right"> {{if .UpdateAllowed}} <form action="{{.Link}}/update" method="post" class="ui update-branch-form"> {{.CsrfTokenHtml}} <button class="ui compact button" data-do="update"> <span class="ui text">{{$.i18n.Tr "repo.pulls.update_branch"}}</span> </button> </form> {{end}} </div> </div> {{end}} {{if and (or $.IsRepoAdmin (not $notAllOverridableChecksOk)) (or (not .AllowMerge) (not .RequireSigned) .WillSign)}} {{if .AllowMerge}} {{$prUnit := .Repository.MustGetUnit $.UnitTypePullRequests}} {{$approvers := .Issue.PullRequest.GetApprovers}} {{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash}} <div class="ui divider"></div> {{if $prUnit.PullRequestsConfig.AllowMerge}} <div class="ui form merge-fields" style="display: none"> <form action="{{.Link}}/merge" method="post"> {{.CsrfTokenHtml}} <div class="field"> <input type="text" name="merge_title_field" value="{{.Issue.PullRequest.GetDefaultMergeMessage}}"> </div> <div class="field"> <textarea name="merge_message_field" rows="5" placeholder="{{$.i18n.Tr "repo.editor.commit_message_desc"}}">Reviewed-on: {{$.Issue.HTMLURL}} {{$approvers}}</textarea> </div> <button class="ui green button" type="submit" name="do" value="merge"> {{$.i18n.Tr "repo.pulls.merge_pull_request"}} </button> <button class="ui button merge-cancel"> {{$.i18n.Tr "cancel"}} </button> </form> </div> {{end}} {{if $prUnit.PullRequestsConfig.AllowRebase}} <div class="ui form rebase-fields" style="display: none"> <form action="{{.Link}}/merge" method="post"> {{.CsrfTokenHtml}} <button class="ui green button" type="submit" name="do" value="rebase"> {{$.i18n.Tr "repo.pulls.rebase_merge_pull_request"}} </button> <button class="ui button merge-cancel"> {{$.i18n.Tr "cancel"}} </button> </form> </div> {{end}} {{if $prUnit.PullRequestsConfig.AllowRebaseMerge}} <div class="ui form rebase-merge-fields" style="display: none"> <form action="{{.Link}}/merge" method="post"> {{.CsrfTokenHtml}} <div class="field"> <input type="text" name="merge_title_field" value="{{.Issue.PullRequest.GetDefaultMergeMessage}}"> </div> <div class="field"> <textarea name="merge_message_field" rows="5" placeholder="{{$.i18n.Tr "repo.editor.commit_message_desc"}}">Reviewed-on: {{$.Issue.HTMLURL}} {{$approvers}}</textarea> </div> <button class="ui green button" type="submit" name="do" value="rebase-merge"> {{$.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}} </button> <button class="ui button merge-cancel"> {{$.i18n.Tr "cancel"}} </button> </form> </div> {{end}} {{if $prUnit.PullRequestsConfig.AllowSquash}} <div class="ui form squash-fields" style="display: none"> <form action="{{.Link}}/merge" method="post"> {{.CsrfTokenHtml}} <div class="field"> <input type="text" name="merge_title_field" value="{{.Issue.PullRequest.GetDefaultSquashMessage}}"> </div> <div class="field"> <textarea name="merge_message_field" rows="5" placeholder="{{$.i18n.Tr "repo.editor.commit_message_desc"}}">{{.GetCommitMessages}}Reviewed-on: {{$.Issue.HTMLURL}} {{$approvers}}</textarea> </div> <button class="ui green button" type="submit" name="do" value="squash"> {{$.i18n.Tr "repo.pulls.squash_merge_pull_request"}} </button> <button class="ui button merge-cancel"> {{$.i18n.Tr "cancel"}} </button> </form> </div> {{end}} <div class="dib"> <div class="ui {{if $notAllOverridableChecksOk}}red{{else}}green{{end}} buttons merge-button"> <button class="ui button" data-do="{{.MergeStyle}}"> {{svg "octicon-git-merge"}} <span class="button-text"> {{if eq .MergeStyle "merge"}} {{$.i18n.Tr "repo.pulls.merge_pull_request"}} {{end}} {{if eq .MergeStyle "rebase"}} {{$.i18n.Tr "repo.pulls.rebase_merge_pull_request"}} {{end}} {{if eq .MergeStyle "rebase-merge"}} {{$.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}} {{end}} {{if eq .MergeStyle "squash"}} {{$.i18n.Tr "repo.pulls.squash_merge_pull_request"}} {{end}} </span> </button> {{if gt $prUnit.PullRequestsConfig.AllowedMergeStyleCount 1}} <div class="ui dropdown icon button no-text"> {{svg "octicon-triangle-down" 14 "dropdown icon"}} <div class="menu"> {{if $prUnit.PullRequestsConfig.AllowMerge}} <div class="item{{if eq .MergeStyle "merge"}} active selected{{end}}" data-do="merge">{{$.i18n.Tr "repo.pulls.merge_pull_request"}}</div> {{end}} {{if $prUnit.PullRequestsConfig.AllowRebase}} <div class="item{{if eq .MergeStyle "rebase"}} active selected{{end}}" data-do="rebase">{{$.i18n.Tr "repo.pulls.rebase_merge_pull_request"}}</div> {{end}} {{if $prUnit.PullRequestsConfig.AllowRebaseMerge}} <div class="item{{if eq .MergeStyle "rebase-merge"}} active selected{{end}}" data-do="rebase-merge">{{$.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}}</div> {{end}} {{if $prUnit.PullRequestsConfig.AllowSquash}} <div class="item{{if eq .MergeStyle "squash"}} active selected{{end}}" data-do="squash">{{$.i18n.Tr "repo.pulls.squash_merge_pull_request"}}</div> {{end}} </div> </div> {{end}} </div> </div> <div class="instruct-toggle ml-3">{{$.i18n.Tr "repo.pulls.merge_instruction_hint" | Safe}}</div> <div class="instruct-content" style="display:none"> <div class="ui divider"></div> <div><h3 class="di">{{$.i18n.Tr "step1"}} </h3>{{$.i18n.Tr "repo.pulls.merge_instruction_step1_desc"}}</div> <div class="ui secondary segment"> <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> <div>git pull {{if ne .Issue.PullRequest.HeadRepo.ID .Issue.PullRequest.BaseRepo.ID}}{{.Issue.PullRequest.HeadRepo.HTMLURL}}{{else}}origin{{end}} {{.Issue.PullRequest.HeadBranch}}</div> </div> <div><h3 class="di">{{$.i18n.Tr "step2"}} </h3>{{$.i18n.Tr "repo.pulls.merge_instruction_step2_desc"}}</div> <div class="ui secondary segment"> <div>git checkout {{.Issue.PullRequest.BaseBranch}}</div> <div>git merge --no-ff {{if ne .Issue.PullRequest.HeadRepo.ID .Issue.PullRequest.BaseRepo.ID}}{{.Issue.PullRequest.HeadRepo.OwnerName}}-{{end}}{{.Issue.PullRequest.HeadBranch}}</div> <div>git push origin {{.Issue.PullRequest.BaseBranch}}</div> </div> </div> {{else}} <div class="ui divider"></div> <div class="item text red"> {{svg "octicon-x"}} {{$.i18n.Tr "repo.pulls.no_merge_desc"}} </div> <div class="item text grey"> {{svg "octicon-info"}} {{$.i18n.Tr "repo.pulls.no_merge_helper"}} </div> {{end}} {{else}} <div class="ui divider"></div> <div class="item text grey"> {{svg "octicon-info"}} {{$.i18n.Tr "repo.pulls.no_merge_access"}} </div> {{end}} {{end}} {{else}} {{/* Merge conflict without specific file. Suggest manual merge, only if all reviews and status checks OK. */}} {{if .IsBlockedByApprovals}} <div class="item text red"> {{svg "octicon-x"}} {{$.i18n.Tr "repo.pulls.blocked_by_approvals" .GrantedApprovals .Issue.PullRequest.ProtectedBranch.RequiredApprovals}} </div> {{else if .IsBlockedByRejection}} <div class="item text red"> {{svg "octicon-x"}} {{$.i18n.Tr "repo.pulls.blocked_by_rejection"}} </div> {{else if .IsBlockedByOfficialReviewRequests}} <div class="item text red"> {{svg "octicon-x"}} {{$.i18n.Tr "repo.pulls.blocked_by_official_review_requests"}} </div> {{else if .IsBlockedByOutdatedBranch}} <div class="item text red"> <i class="icon icon-octicon">{{svg "octicon-x"}}</i> {{$.i18n.Tr "repo.pulls.blocked_by_outdated_branch"}} </div> {{else if .IsBlockedByChangedProtectedFiles}} <div class="item text red"> <i class="icon icon-octicon">{{svg "octicon-x" 16}}</i> {{$.i18n.Tr (TrN $.i18n.Lang $.ChangedProtectedFilesNum "repo.pulls.blocked_by_changed_protected_files_1" "repo.pulls.blocked_by_changed_protected_files_n") | Safe }} <div class="ui ordered list"> {{range .ChangedProtectedFiles}} <div data-value="-" class="item">{{.}}</div> {{end}} </div> </div> {{else if and .EnableStatusCheck (not .RequiredStatusCheckState.IsSuccess)}} <div class="item text red"> {{svg "octicon-x"}} {{$.i18n.Tr "repo.pulls.required_status_check_failed"}} </div> {{else if and .RequireSigned (not .WillSign)}} <div class="item text red"> {{svg "octicon-x"}} {{$.i18n.Tr "repo.pulls.require_signed_wont_sign"}} </div> {{else}} <div class="item text red"> {{svg "octicon-x"}} {{$.i18n.Tr "repo.pulls.cannot_auto_merge_desc"}} </div> <div class="item text grey"> {{svg "octicon-info"}} {{$.i18n.Tr "repo.pulls.cannot_auto_merge_helper"}} </div> {{end}} {{end}} {{if and (gt .Issue.PullRequest.CommitsBehind 0) (not .Issue.IsClosed) (not .Issue.PullRequest.IsChecking) (not .IsPullFilesConflicted) (not .IsPullRequestBroken) (not $canAutoMerge)}} <div class="item text grey"> <i class="icon icon-octicon">{{svg "octicon-alert"}}</i> {{$.i18n.Tr "repo.pulls.outdated_with_base_branch"}} {{if .UpdateAllowed}} <form action="{{.Link}}/update" method="post" class="ui floating right"> {{.CsrfTokenHtml}} <button class="ui compact button" data-do="update"> <span class="ui text">{{$.i18n.Tr "repo.pulls.update_branch"}}</span> </button> </form> {{end}} </div> {{end}} </div> </div> </div>