]> source.dussan.org Git - gitea.git/commitdiff
Fix template error when comment review doesn't exist (#29888) (#29889)
authorwxiaoguang <wxiaoguang@gmail.com>
Tue, 19 Mar 2024 07:00:01 +0000 (15:00 +0800)
committerGitHub <noreply@github.com>
Tue, 19 Mar 2024 07:00:01 +0000 (15:00 +0800)
Backport #29888

models/fixtures/comment.yml
models/fixtures/review.yml
routers/web/repo/pull_review_test.go
templates/repo/diff/comments.tmpl
templates/repo/diff/conversation.tmpl
templates/repo/issue/view_content/comments.tmpl
templates/repo/issue/view_content/conversation.tmpl
tests/integration/pull_review_test.go

index 17586caa2191f96473785d668ff59708f99c92bb..74fc716180d1de83e35cdd8bc77f9d735761e031 100644 (file)
   content: "comment in private pository"
   created_unix: 946684811
   updated_unix: 946684811
+
+-
+  id: 9
+  type: 22 # review
+  poster_id: 2
+  issue_id: 2 # in repo_id 1
+  review_id: 20
+  created_unix: 946684810
index 7a8808006849c903b839d972c17f041f8e2b9180..ac97e24c2be0c3025018b2be973a2363e8ec0538 100644 (file)
   content: "review request for user15"
   updated_unix: 946684835
   created_unix: 946684835
+
+-
+  id: 20
+  type: 22
+  reviewer_id: 1
+  issue_id: 2
+  content: "Review Comment"
+  updated_unix: 946684810
+  created_unix: 946684810
index 7e6594774a8488be9538cb4d74cc7cb828c15be0..af6e0ece184a21b43df2708e1dd4607903fdd308 100644 (file)
@@ -4,6 +4,7 @@
 package repo
 
 import (
+       "net/http"
        "net/http/httptest"
        "testing"
 
@@ -73,4 +74,20 @@ func TestRenderConversation(t *testing.T) {
                renderConversation(ctx, preparedComment, "timeline")
                assert.Contains(t, resp.Body.String(), `<div id="code-comments-`)
        })
+       run("diff non-existing review", func(t *testing.T, ctx *context.Context, resp *httptest.ResponseRecorder) {
+               err := db.TruncateBeans(db.DefaultContext, &issues_model.Review{})
+               assert.NoError(t, err)
+               ctx.Data["ShowOutdatedComments"] = true
+               renderConversation(ctx, preparedComment, "diff")
+               assert.Equal(t, http.StatusOK, resp.Code)
+               assert.NotContains(t, resp.Body.String(), `status-page-500`)
+       })
+       run("timeline non-existing review", func(t *testing.T, ctx *context.Context, resp *httptest.ResponseRecorder) {
+               err := db.TruncateBeans(db.DefaultContext, &issues_model.Review{})
+               assert.NoError(t, err)
+               ctx.Data["ShowOutdatedComments"] = true
+               renderConversation(ctx, preparedComment, "timeline")
+               assert.Equal(t, http.StatusOK, resp.Code)
+               assert.NotContains(t, resp.Body.String(), `status-page-500`)
+       })
 }
index 47a4502efdad75c1f99ebd6f9900121608ee30c4..f47dad807e739697218ac3bd481b82309a0a0289 100644 (file)
@@ -37,7 +37,7 @@
                                                {{ctx.Locale.Tr "repo.issues.review.outdated"}}
                                        </a>
                                {{end}}
-                               {{if and .Review}}
+                               {{if .Review}}
                                        {{if eq .Review.Type 0}}
                                                <div class="ui label basic small yellow pending-label" data-tooltip-content="{{ctx.Locale.Tr "repo.issues.review.pending.tooltip" (ctx.Locale.Tr "repo.diff.review") (ctx.Locale.Tr "repo.diff.review.approve") (ctx.Locale.Tr "repo.diff.review.comment") (ctx.Locale.Tr "repo.diff.review.reject")}}">
                                                {{ctx.Locale.Tr "repo.issues.review.pending"}}
index aaeac3c550dbdd70a93243ae240620ccc1b178a2..507f17fd94b70dbad15668896fe8372f1fc77458 100644 (file)
@@ -1,66 +1,72 @@
-{{$resolved := (index .comments 0).IsResolved}}
-{{$invalid := (index .comments 0).Invalidated}}
-{{$resolveDoer := (index .comments 0).ResolveDoer}}
-{{$isNotPending := (not (eq (index .comments 0).Review.Type 0))}}
-{{$referenceUrl := printf "%s#%s" $.Issue.Link (index .comments 0).HashTag}}
-<div class="conversation-holder" data-path="{{(index .comments 0).TreePath}}" data-side="{{if lt (index .comments 0).Line 0}}left{{else}}right{{end}}" data-idx="{{(index .comments 0).UnsignedLine}}">
-       {{if $resolved}}
-               <div class="ui attached header resolved-placeholder gt-df gt-ac gt-sb">
-                       <div class="ui grey text gt-df gt-ac gt-fw gt-gap-2">
-                               {{svg "octicon-check" 16 "icon gt-mr-2"}}
-                               <b>{{$resolveDoer.Name}}</b> {{ctx.Locale.Tr "repo.issues.review.resolved_by"}}
-                               {{if $invalid}}
-                                       <!--
-                                       We only handle the case $resolved=true and $invalid=true in this template because if the comment is not resolved it has the outdated label in the comments area (not the header above).
-                                       The case $resolved=false and $invalid=true is handled in repo/diff/comments.tmpl
-                                       -->
-                                       <a href="{{$referenceUrl}}" class="ui label basic small gt-ml-3" data-tooltip-content="{{ctx.Locale.Tr "repo.issues.review.outdated_description"}}">
-                                               {{ctx.Locale.Tr "repo.issues.review.outdated"}}
-                                       </a>
-                               {{end}}
+{{if len .comments}}
+       {{$comment := index .comments 0}}
+       {{$resolved := $comment.IsResolved}}
+       {{$invalid := $comment.Invalidated}}
+       {{$resolveDoer := $comment.ResolveDoer}}
+       {{$hasReview := and $comment.Review}}
+       {{$isReviewPending := and $hasReview (eq $comment.Review.Type 0)}}
+       {{$referenceUrl := printf "%s#%s" $.Issue.Link $comment.HashTag}}
+       <div class="conversation-holder" data-path="{{$comment.TreePath}}" data-side="{{if lt $comment.Line 0}}left{{else}}right{{end}}" data-idx="{{$comment.UnsignedLine}}">
+               {{if $resolved}}
+                       <div class="ui attached header resolved-placeholder gt-df gt-ac gt-sb">
+                               <div class="ui grey text gt-df gt-ac gt-fw gt-gap-2">
+                                       {{svg "octicon-check" 16 "icon gt-mr-2"}}
+                                       <b>{{$resolveDoer.Name}}</b> {{ctx.Locale.Tr "repo.issues.review.resolved_by"}}
+                                       {{if $invalid}}
+                                               <!--
+                                               We only handle the case $resolved=true and $invalid=true in this template because if the comment is not resolved it has the outdated label in the comments area (not the header above).
+                                               The case $resolved=false and $invalid=true is handled in repo/diff/comments.tmpl
+                                               -->
+                                               <a href="{{$referenceUrl}}" class="ui label basic small gt-ml-3" data-tooltip-content="{{ctx.Locale.Tr "repo.issues.review.outdated_description"}}">
+                                                       {{ctx.Locale.Tr "repo.issues.review.outdated"}}
+                                               </a>
+                                       {{end}}
+                               </div>
+                               <div class="gt-df gt-ac gt-gap-3">
+                                       <button id="show-outdated-{{$comment.ID}}" data-comment="{{$comment.ID}}" class="ui tiny labeled button show-outdated gt-df gt-ac">
+                                               {{svg "octicon-unfold" 16 "gt-mr-3"}}
+                                               {{ctx.Locale.Tr "repo.issues.review.show_resolved"}}
+                                       </button>
+                                       <button id="hide-outdated-{{$comment.ID}}" data-comment="{{$comment.ID}}" class="ui tiny labeled button hide-outdated gt-df gt-ac gt-hidden">
+                                               {{svg "octicon-fold" 16 "gt-mr-3"}}
+                                               {{ctx.Locale.Tr "repo.issues.review.hide_resolved"}}
+                                       </button>
+                               </div>
                        </div>
-                       <div class="gt-df gt-ac gt-gap-3">
-                               <button id="show-outdated-{{(index .comments 0).ID}}" data-comment="{{(index .comments 0).ID}}" class="ui tiny labeled button show-outdated gt-df gt-ac">
-                                       {{svg "octicon-unfold" 16 "gt-mr-3"}}
-                                       {{ctx.Locale.Tr "repo.issues.review.show_resolved"}}
-                               </button>
-                               <button id="hide-outdated-{{(index .comments 0).ID}}" data-comment="{{(index .comments 0).ID}}" class="ui tiny labeled button hide-outdated gt-df gt-ac gt-hidden">
-                                       {{svg "octicon-fold" 16 "gt-mr-3"}}
-                                       {{ctx.Locale.Tr "repo.issues.review.hide_resolved"}}
-                               </button>
+               {{end}}
+               <div id="code-comments-{{$comment.ID}}" class="field comment-code-cloud {{if $resolved}}gt-hidden{{end}}">
+                       <div class="comment-list">
+                               <ui class="ui comments">
+                                       {{template "repo/diff/comments" dict "root" $ "comments" .comments}}
+                               </ui>
                        </div>
-               </div>
-       {{end}}
-       <div id="code-comments-{{(index  .comments 0).ID}}" class="field comment-code-cloud {{if $resolved}}gt-hidden{{end}}">
-               <div class="comment-list">
-                       <ui class="ui comments">
-                               {{template "repo/diff/comments" dict "root" $ "comments" .comments}}
-                       </ui>
-               </div>
-               <div class="gt-df gt-je gt-ac gt-fw gt-mt-3">
-                       <div class="ui buttons gt-mr-2">
-                               <button class="ui icon tiny basic button previous-conversation">
-                                       {{svg "octicon-arrow-up" 12 "icon"}} {{ctx.Locale.Tr "repo.issues.previous"}}
-                               </button>
-                               <button class="ui icon tiny basic button next-conversation">
-                                       {{svg "octicon-arrow-down" 12 "icon"}} {{ctx.Locale.Tr "repo.issues.next"}}
-                               </button>
+                       <div class="gt-df gt-je gt-ac gt-fw gt-mt-3">
+                               <div class="ui buttons gt-mr-2">
+                                       <button class="ui icon tiny basic button previous-conversation">
+                                               {{svg "octicon-arrow-up" 12 "icon"}} {{ctx.Locale.Tr "repo.issues.previous"}}
+                                       </button>
+                                       <button class="ui icon tiny basic button next-conversation">
+                                               {{svg "octicon-arrow-down" 12 "icon"}} {{ctx.Locale.Tr "repo.issues.next"}}
+                                       </button>
+                               </div>
+                               {{if and $.CanMarkConversation $hasReview (not $isReviewPending)}}
+                                       <button class="ui icon tiny basic button resolve-conversation" data-origin="diff" data-action="{{if not $resolved}}Resolve{{else}}UnResolve{{end}}" data-comment-id="{{$comment.ID}}" data-update-url="{{$.RepoLink}}/issues/resolve_conversation">
+                                               {{if $resolved}}
+                                                       {{ctx.Locale.Tr "repo.issues.review.un_resolve_conversation"}}
+                                               {{else}}
+                                                       {{ctx.Locale.Tr "repo.issues.review.resolve_conversation"}}
+                                               {{end}}
+                                       </button>
+                               {{end}}
+                               {{if and $.SignedUserID (not $.Repository.IsArchived)}}
+                                       <button class="comment-form-reply ui primary tiny labeled icon button gt-ml-2 gt-mr-0">
+                                               {{svg "octicon-reply" 16 "reply icon gt-mr-2"}}{{ctx.Locale.Tr "repo.diff.comment.reply"}}
+                                       </button>
+                               {{end}}
                        </div>
-                       {{if and $.CanMarkConversation $isNotPending}}
-                               <button class="ui icon tiny basic button resolve-conversation" data-origin="diff" data-action="{{if not $resolved}}Resolve{{else}}UnResolve{{end}}" data-comment-id="{{(index .comments 0).ID}}" data-update-url="{{$.RepoLink}}/issues/resolve_conversation">
-                                       {{if $resolved}}
-                                               {{ctx.Locale.Tr "repo.issues.review.un_resolve_conversation"}}
-                                       {{else}}
-                                               {{ctx.Locale.Tr "repo.issues.review.resolve_conversation"}}
-                                       {{end}}
-                               </button>
-                       {{end}}
-                       {{if and $.SignedUserID (not $.Repository.IsArchived)}}
-                               <button class="comment-form-reply ui primary tiny labeled icon button gt-ml-2 gt-mr-0">
-                                       {{svg "octicon-reply" 16 "reply icon gt-mr-2"}}{{ctx.Locale.Tr "repo.diff.comment.reply"}}
-                               </button>
-                       {{end}}
+                       {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" $comment.ReviewID "root" $ "comment" $comment}}
                </div>
-               {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" (index .comments 0).ReviewID "root" $ "comment" (index .comments 0)}}
        </div>
-</div>
+{{else}}
+       {{template "repo/diff/conversation_outdated"}}
+{{end}}
index 4433d86fcc52dbdce307d8582bf5319304c073bb..218efe50e54068e46a123cec46a81109cebcb9d0 100644 (file)
                {{else if eq .Type 22}}
                        <div class="timeline-item-group">
                                <div class="timeline-item event">
+                                       {{$reviewType := -1}}
+                                       {{if .Review}}{{$reviewType = .Review.Type}}{{end}}
                                        {{if .OriginalAuthor}}
                                        {{else}}
                                        {{/* Some timeline avatars need a offset to correctly align with their speech
                                                        bubble. The condition depends on review type and for positive reviews whether
                                                        there is a comment element or not */}}
-                                       <a class="timeline-avatar{{if or (and (eq .Review.Type 1) (or .Content .Attachments)) (and (eq .Review.Type 2) (or .Content .Attachments)) (eq .Review.Type 3)}} timeline-avatar-offset{{end}}"{{if gt .Poster.ID 0}} href="{{.Poster.HomeLink}}"{{end}}>
+                                       <a class="timeline-avatar{{if or (and (eq $reviewType 1) (or .Content .Attachments)) (and (eq $reviewType 2) (or .Content .Attachments)) (eq $reviewType 3)}} timeline-avatar-offset{{end}}"{{if gt .Poster.ID 0}} href="{{.Poster.HomeLink}}"{{end}}>
                                                {{ctx.AvatarUtils.Avatar .Poster 40}}
                                        </a>
                                        {{end}}
-                                       <span class="badge{{if eq .Review.Type 1}} gt-bg-green gt-text-white{{else if eq .Review.Type 3}} gt-bg-red gt-text-white{{end}}">{{svg (printf "octicon-%s" .Review.Type.Icon)}}</span>
+                                       <span class="badge{{if eq $reviewType 1}} gt-bg-green gt-text-white{{else if eq $reviewType 3}} gt-bg-red gt-text-white{{end}}">
+                                               {{if .Review}}{{svg (printf "octicon-%s" .Review.Type.Icon)}}{{end}}
+                                       </span>
                                        <span class="text grey muted-links">
                                                {{if .OriginalAuthor}}
                                                        <span class="text black">
                                                        {{template "shared/user/authorlink" .Poster}}
                                                {{end}}
 
-                                               {{if eq .Review.Type 1}}
+                                               {{if eq $reviewType 1}}
                                                        {{ctx.Locale.Tr "repo.issues.review.approve" $createdStr | Safe}}
-                                               {{else if eq .Review.Type 2}}
+                                               {{else if eq $reviewType 2}}
                                                        {{ctx.Locale.Tr "repo.issues.review.comment" $createdStr | Safe}}
-                                               {{else if eq .Review.Type 3}}
+                                               {{else if eq $reviewType 3}}
                                                        {{ctx.Locale.Tr "repo.issues.review.reject" $createdStr | Safe}}
                                                {{else}}
                                                        {{ctx.Locale.Tr "repo.issues.review.comment" $createdStr | Safe}}
                                                {{end}}
-                                               {{if .Review.Dismissed}}
+                                               {{if and .Review .Review.Dismissed}}
                                                        <div class="ui small label">{{ctx.Locale.Tr "repo.issues.review.dismissed_label"}}</div>
                                                {{end}}
                                        </span>
                                </div>
                                {{end}}
 
-                               {{if .Review.CodeComments}}
+                               {{if and .Review .Review.CodeComments}}
                                <div class="timeline-item event">
                                        {{range $filename, $lines := .Review.CodeComments}}
                                                {{range $line, $comms := $lines}}
                                        <span class="text grey muted-links">
                                                {{template "shared/user/authorlink" .Poster}}
                                                {{$reviewerName := ""}}
-                                               {{if eq .Review.OriginalAuthor ""}}
-                                                       {{$reviewerName = .Review.Reviewer.Name}}
-                                               {{else}}
-                                                       {{$reviewerName = .Review.OriginalAuthor}}
+                                               {{if .Review}}
+                                                       {{if eq .Review.OriginalAuthor ""}}
+                                                               {{$reviewerName = .Review.Reviewer.Name}}
+                                                       {{else}}
+                                                               {{$reviewerName = .Review.OriginalAuthor}}
+                                                       {{end}}
                                                {{end}}
                                                <span class="dismissed-message">{{ctx.Locale.Tr "repo.issues.review.dismissed" ($reviewerName | Escape) $createdStr | Safe}}</span>
                                        </span>
index f12fb0c965f4a113f44c629eeb6f07b266da746f..206709f014b1982394707c59dd182063b6cbee84 100644 (file)
-{{$invalid := (index .comments 0).Invalidated}}
-{{$resolved := (index .comments 0).IsResolved}}
-{{$resolveDoer := (index .comments 0).ResolveDoer}}
-{{$isNotPending := (not (eq (index .comments 0).Review.Type 0))}}
-<div class="ui segments conversation-holder">
-       <div class="ui segment collapsible-comment-box gt-py-3 gt-df gt-ac gt-sb">
-               <div class="gt-df gt-ac">
-                       <a href="{{(index .comments 0).CodeCommentLink ctx}}" class="file-comment gt-ml-3 gt-word-break">{{(index .comments 0).TreePath}}</a>
-                       {{if $invalid}}
-                               <span class="ui label basic small gt-ml-3" data-tooltip-content="{{ctx.Locale.Tr "repo.issues.review.outdated_description"}}">
-                                       {{ctx.Locale.Tr "repo.issues.review.outdated"}}
-                               </span>
-                       {{end}}
-               </div>
-               <div>
-                       {{if or $invalid $resolved}}
-                               <button id="show-outdated-{{(index .comments 0).ID}}" data-comment="{{(index .comments 0).ID}}" class="{{if not $resolved}}gt-hidden {{end}}ui compact labeled button show-outdated gt-df gt-ac">
-                                       {{svg "octicon-unfold" 16 "gt-mr-3"}}
-                                       {{if $resolved}}
-                                               {{ctx.Locale.Tr "repo.issues.review.show_resolved"}}
-                                       {{else}}
-                                               {{ctx.Locale.Tr "repo.issues.review.show_outdated"}}
-                                       {{end}}
-                               </button>
-                               <button id="hide-outdated-{{(index .comments 0).ID}}" data-comment="{{(index .comments 0).ID}}" class="{{if $resolved}}gt-hidden {{end}}ui compact labeled button hide-outdated gt-df gt-ac">
-                                       {{svg "octicon-fold" 16 "gt-mr-3"}}
-                                       {{if $resolved}}
-                                               {{ctx.Locale.Tr "repo.issues.review.hide_resolved"}}
-                                       {{else}}
-                                               {{ctx.Locale.Tr "repo.issues.review.hide_outdated"}}
-                                       {{end}}
-                               </button>
-                       {{end}}
+{{if len .comments}}
+       {{$comment := index .comments 0}}
+       {{$invalid := $comment.Invalidated}}
+       {{$resolved := $comment.IsResolved}}
+       {{$resolveDoer := $comment.ResolveDoer}}
+       {{$hasReview := and $comment.Review}}
+       {{$isReviewPending := and $hasReview (eq $comment.Review.Type 0)}}
+       <div class="ui segments conversation-holder">
+               <div class="ui segment collapsible-comment-box gt-py-3 gt-df gt-ac gt-sb">
+                       <div class="gt-df gt-ac">
+                               <a href="{{$comment.CodeCommentLink ctx}}" class="file-comment gt-ml-3 gt-word-break">{{$comment.TreePath}}</a>
+                               {{if $invalid}}
+                                       <span class="ui label basic small gt-ml-3" data-tooltip-content="{{ctx.Locale.Tr "repo.issues.review.outdated_description"}}">
+                                               {{ctx.Locale.Tr "repo.issues.review.outdated"}}
+                                       </span>
+                               {{end}}
+                       </div>
+                       <div>
+                               {{if or $invalid $resolved}}
+                                       <button id="show-outdated-{{$comment.ID}}" data-comment="{{$comment.ID}}" class="{{if not $resolved}}gt-hidden {{end}}ui compact labeled button show-outdated gt-df gt-ac">
+                                               {{svg "octicon-unfold" 16 "gt-mr-3"}}
+                                               {{if $resolved}}
+                                                       {{ctx.Locale.Tr "repo.issues.review.show_resolved"}}
+                                               {{else}}
+                                                       {{ctx.Locale.Tr "repo.issues.review.show_outdated"}}
+                                               {{end}}
+                                       </button>
+                                       <button id="hide-outdated-{{$comment.ID}}" data-comment="{{$comment.ID}}" class="{{if $resolved}}gt-hidden {{end}}ui compact labeled button hide-outdated gt-df gt-ac">
+                                               {{svg "octicon-fold" 16 "gt-mr-3"}}
+                                               {{if $resolved}}
+                                                       {{ctx.Locale.Tr "repo.issues.review.hide_resolved"}}
+                                               {{else}}
+                                                       {{ctx.Locale.Tr "repo.issues.review.hide_outdated"}}
+                                               {{end}}
+                                       </button>
+                               {{end}}
+                       </div>
                </div>
-       </div>
-       {{$diff := (CommentMustAsDiff (index .comments 0))}}
-       {{if $diff}}
-               {{$file := (index $diff.Files 0)}}
-               <div id="code-preview-{{(index .comments 0).ID}}" class="ui table segment{{if $resolved}} gt-hidden{{end}}">
-                       <div class="diff-file-box diff-box file-content {{TabSizeClass $.Editorconfig $file.Name}}">
-                               <div class="file-body file-code code-view code-diff code-diff-unified unicode-escaped">
-                                       <table>
-                                               <tbody>
-                                                       {{template "repo/diff/section_unified" dict "file" $file "root" $}}
-                                               </tbody>
-                                       </table>
+               {{$diff := (CommentMustAsDiff $comment)}}
+               {{if $diff}}
+                       {{$file := (index $diff.Files 0)}}
+                       <div id="code-preview-{{$comment.ID}}" class="ui table segment{{if $resolved}} gt-hidden{{end}}">
+                               <div class="diff-file-box diff-box file-content {{TabSizeClass $.Editorconfig $file.Name}}">
+                                       <div class="file-body file-code code-view code-diff code-diff-unified unicode-escaped">
+                                               <table>
+                                                       <tbody>
+                                                               {{template "repo/diff/section_unified" dict "file" $file "root" $}}
+                                                       </tbody>
+                                               </table>
+                                       </div>
                                </div>
                        </div>
-               </div>
-       {{end}}
-       <div id="code-comments-{{(index .comments 0).ID}}" class="comment-code-cloud ui segment{{if $resolved}} gt-hidden{{end}}">
-               <div class="ui comments gt-mb-0">
-                       {{range .comments}}
-                               {{$createdSubStr:= TimeSinceUnix .CreatedUnix ctx.Locale}}
-                               <div class="comment code-comment gt-pb-4" id="{{.HashTag}}">
-                                       <div class="content">
-                                               <div class="header comment-header">
-                                                       <div class="comment-header-left gt-df gt-ac">
-                                                               {{if not .OriginalAuthor}}
-                                                                       <a class="avatar">
-                                                                               {{ctx.AvatarUtils.Avatar .Poster 20}}
-                                                                       </a>
-                                                               {{end}}
-                                                               <span class="text grey muted-links">
-                                                                       {{if .OriginalAuthor}}
-                                                                               <span class="text black gt-font-semibold">
-                                                                                       {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}}
-                                                                                       {{.OriginalAuthor}}
-                                                                               </span>
-                                                                               <span class="text grey muted-links"> {{if $.Repository.OriginalURL}}</span>
-                                                                               <span class="text migrate">({{ctx.Locale.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe}}){{end}}</span>
-                                                                       {{else}}
-                                                                               {{template "shared/user/authorlink" .Poster}}
+               {{end}}
+               <div id="code-comments-{{$comment.ID}}" class="comment-code-cloud ui segment{{if $resolved}} gt-hidden{{end}}">
+                       <div class="ui comments gt-mb-0">
+                               {{range .comments}}
+                                       {{$createdSubStr:= TimeSinceUnix .CreatedUnix ctx.Locale}}
+                                       <div class="comment code-comment gt-pb-4" id="{{.HashTag}}">
+                                               <div class="content">
+                                                       <div class="header comment-header">
+                                                               <div class="comment-header-left gt-df gt-ac">
+                                                                       {{if not .OriginalAuthor}}
+                                                                               <a class="avatar">
+                                                                                       {{ctx.AvatarUtils.Avatar .Poster 20}}
+                                                                               </a>
                                                                        {{end}}
-                                                                       {{ctx.Locale.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdSubStr | Safe}}
-                                                               </span>
+                                                                       <span class="text grey muted-links">
+                                                                               {{if .OriginalAuthor}}
+                                                                                       <span class="text black gt-font-semibold">
+                                                                                               {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}}
+                                                                                               {{.OriginalAuthor}}
+                                                                                       </span>
+                                                                                       <span class="text grey muted-links"> {{if $.Repository.OriginalURL}}</span>
+                                                                                       <span class="text migrate">({{ctx.Locale.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe}}){{end}}</span>
+                                                                               {{else}}
+                                                                                       {{template "shared/user/authorlink" .Poster}}
+                                                                               {{end}}
+                                                                               {{ctx.Locale.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdSubStr | Safe}}
+                                                                       </span>
+                                                               </div>
+                                                               <div class="comment-header-right actions gt-df gt-ac">
+                                                                       {{template "repo/issue/view_content/show_role" dict "ShowRole" .ShowRole}}
+                                                                       {{if not $.Repository.IsArchived}}
+                                                                               {{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
+                                                                               {{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
+                                                                       {{end}}
+                                                               </div>
                                                        </div>
-                                                       <div class="comment-header-right actions gt-df gt-ac">
-                                                               {{template "repo/issue/view_content/show_role" dict "ShowRole" .ShowRole}}
-                                                               {{if not $.Repository.IsArchived}}
-                                                                       {{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
-                                                                       {{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
+                                                       <div class="text comment-content">
+                                                               <div class="render-content markup" {{if or $.Permission.IsAdmin $.HasIssuesOrPullsWritePermission (and $.IsSigned (eq $.SignedUserID .PosterID))}}data-can-edit="true"{{end}}>
+                                                               {{if .RenderedContent}}
+                                                                       {{.RenderedContent|Str2html}}
+                                                               {{else}}
+                                                                       <span class="no-content">{{ctx.Locale.Tr "repo.issues.no_content"}}</span>
                                                                {{end}}
+                                                               </div>
+                                                               <div id="issuecomment-{{.ID}}-raw" class="raw-content gt-hidden">{{.Content}}</div>
+                                                               <div class="edit-content-zone gt-hidden" data-update-url="{{$.RepoLink}}/comments/{{.ID}}" data-context="{{$.RepoLink}}" data-attachment-url="{{$.RepoLink}}/comments/{{.ID}}/attachments"></div>
                                                        </div>
-                                               </div>
-                                               <div class="text comment-content">
-                                                       <div class="render-content markup" {{if or $.Permission.IsAdmin $.HasIssuesOrPullsWritePermission (and $.IsSigned (eq $.SignedUserID .PosterID))}}data-can-edit="true"{{end}}>
-                                                       {{if .RenderedContent}}
-                                                               {{.RenderedContent|Str2html}}
-                                                       {{else}}
-                                                               <span class="no-content">{{ctx.Locale.Tr "repo.issues.no_content"}}</span>
+                                                       {{$reactions := .Reactions.GroupByType}}
+                                                       {{if $reactions}}
+                                                               {{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
                                                        {{end}}
-                                                       </div>
-                                                       <div id="issuecomment-{{.ID}}-raw" class="raw-content gt-hidden">{{.Content}}</div>
-                                                       <div class="edit-content-zone gt-hidden" data-update-url="{{$.RepoLink}}/comments/{{.ID}}" data-context="{{$.RepoLink}}" data-attachment-url="{{$.RepoLink}}/comments/{{.ID}}/attachments"></div>
                                                </div>
-                                               {{$reactions := .Reactions.GroupByType}}
-                                               {{if $reactions}}
-                                                       {{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
-                                               {{end}}
-                                       </div>
-                               </div>
-                       {{end}}
-               </div>
-               <div class="code-comment-buttons gt-df gt-ac gt-fw gt-mt-3 gt-mb-2 gt-mx-3">
-                       <div class="gt-f1">
-                               {{if $resolved}}
-                                       <div class="ui grey text">
-                                               {{svg "octicon-check" 16 "gt-mr-2"}}
-                                               <b>{{$resolveDoer.Name}}</b> {{ctx.Locale.Tr "repo.issues.review.resolved_by"}}
                                        </div>
                                {{end}}
                        </div>
-                       <div class="code-comment-buttons-buttons">
-                               {{if and $.CanMarkConversation $isNotPending}}
-                                       <button class="ui tiny basic button resolve-conversation" data-origin="timeline" data-action="{{if not $resolved}}Resolve{{else}}UnResolve{{end}}" data-comment-id="{{(index .comments 0).ID}}" data-update-url="{{$.RepoLink}}/issues/resolve_conversation">
-                                               {{if $resolved}}
-                                                       {{ctx.Locale.Tr "repo.issues.review.un_resolve_conversation"}}
-                                               {{else}}
-                                                       {{ctx.Locale.Tr "repo.issues.review.resolve_conversation"}}
-                                               {{end}}
-                                       </button>
-                               {{end}}
-                               {{if and $.SignedUserID (not $.Repository.IsArchived)}}
-                                       <button class="comment-form-reply ui primary tiny labeled icon button gt-ml-2 gt-mr-0">
-                                               {{svg "octicon-reply" 16 "reply icon gt-mr-2"}}{{ctx.Locale.Tr "repo.diff.comment.reply"}}
-                                       </button>
-                               {{end}}
+                       <div class="code-comment-buttons gt-df gt-ac gt-fw gt-mt-3 gt-mb-2 gt-mx-3">
+                               <div class="gt-f1">
+                                       {{if $resolved}}
+                                               <div class="ui grey text">
+                                                       {{svg "octicon-check" 16 "gt-mr-2"}}
+                                                       <b>{{$resolveDoer.Name}}</b> {{ctx.Locale.Tr "repo.issues.review.resolved_by"}}
+                                               </div>
+                                       {{end}}
+                               </div>
+                               <div class="code-comment-buttons-buttons">
+                                       {{if and $.CanMarkConversation $hasReview (not $isReviewPending)}}
+                                               <button class="ui tiny basic button resolve-conversation" data-origin="timeline" data-action="{{if not $resolved}}Resolve{{else}}UnResolve{{end}}" data-comment-id="{{$comment.ID}}" data-update-url="{{$.RepoLink}}/issues/resolve_conversation">
+                                                       {{if $resolved}}
+                                                               {{ctx.Locale.Tr "repo.issues.review.un_resolve_conversation"}}
+                                                       {{else}}
+                                                               {{ctx.Locale.Tr "repo.issues.review.resolve_conversation"}}
+                                                       {{end}}
+                                               </button>
+                                       {{end}}
+                                       {{if and $.SignedUserID (not $.Repository.IsArchived)}}
+                                               <button class="comment-form-reply ui primary tiny labeled icon button gt-ml-2 gt-mr-0">
+                                                       {{svg "octicon-reply" 16 "reply icon gt-mr-2"}}{{ctx.Locale.Tr "repo.diff.comment.reply"}}
+                                               </button>
+                                       {{end}}
+                               </div>
                        </div>
+                       {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" $comment.ReviewID "root" $ "comment" $comment}}
                </div>
-               {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" (index .comments 0).ReviewID "root" $ "comment" (index .comments 0)}}
        </div>
-</div>
+{{else}}
+       {{template "repo/diff/conversation_outdated"}}
+{{end}}
index 8987ad304b28cd5bdb3f495088b1e6dcb0af2ff8..c52fce353e75f00a0f39ed7861fdafb43963cccd 100644 (file)
@@ -13,6 +13,7 @@ import (
        issues_model "code.gitea.io/gitea/models/issues"
        "code.gitea.io/gitea/models/unittest"
        user_model "code.gitea.io/gitea/models/user"
+       "code.gitea.io/gitea/modules/test"
        repo_service "code.gitea.io/gitea/services/repository"
        files_service "code.gitea.io/gitea/services/repository/files"
        "code.gitea.io/gitea/tests"
@@ -25,10 +26,19 @@ func TestPullView_ReviewerMissed(t *testing.T) {
        session := loginUser(t, "user1")
 
        req := NewRequest(t, "GET", "/pulls")
-       session.MakeRequest(t, req, http.StatusOK)
+       resp := session.MakeRequest(t, req, http.StatusOK)
+       assert.True(t, test.IsNormalPageCompleted(resp.Body.String()))
 
        req = NewRequest(t, "GET", "/user2/repo1/pulls/3")
-       session.MakeRequest(t, req, http.StatusOK)
+       resp = session.MakeRequest(t, req, http.StatusOK)
+       assert.True(t, test.IsNormalPageCompleted(resp.Body.String()))
+
+       // if some reviews are missing, the page shouldn't fail
+       err := db.TruncateBeans(db.DefaultContext, &issues_model.Review{})
+       assert.NoError(t, err)
+       req = NewRequest(t, "GET", "/user2/repo1/pulls/2")
+       resp = session.MakeRequest(t, req, http.StatusOK)
+       assert.True(t, test.IsNormalPageCompleted(resp.Body.String()))
 }
 
 func TestPullView_CodeOwner(t *testing.T) {