From efa9a8a6e308489cf5b5e0174007d78390c5f0e6 Mon Sep 17 00:00:00 2001
From: Cirno the Strongest <1447794+CirnoT@users.noreply.github.com>
Date: Fri, 18 Dec 2020 13:37:55 +0100
Subject: [PATCH] Show status check for merged PRs (#13975)

* Show status check for merged PRs

* Handle PRs with no commits

* Styling

Co-authored-by: Lauris BH <lauris@nix.lv>
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Co-authored-by: 6543 <6543@obermui.de>
---
 routers/repo/pull.go             | 14 ++++++++++++++
 services/pull/pull.go            | 21 +++++++++------------
 templates/repo/pulls/status.tmpl | 34 ++++++++++++++++++----------------
 3 files changed, 41 insertions(+), 28 deletions(-)

diff --git a/routers/repo/pull.go b/routers/repo/pull.go
index bee3bbc1df..901a668632 100644
--- a/routers/repo/pull.go
+++ b/routers/repo/pull.go
@@ -325,6 +325,20 @@ func PrepareMergedViewPullInfo(ctx *context.Context, issue *models.Issue) *git.C
 	}
 	ctx.Data["NumCommits"] = compareInfo.Commits.Len()
 	ctx.Data["NumFiles"] = compareInfo.NumFiles
+
+	if compareInfo.Commits.Len() != 0 {
+		sha := compareInfo.Commits.Front().Value.(*git.Commit).ID.String()
+		commitStatuses, err := models.GetLatestCommitStatus(ctx.Repo.Repository.ID, sha, models.ListOptions{})
+		if err != nil {
+			ctx.ServerError("GetLatestCommitStatus", err)
+			return nil
+		}
+		if len(commitStatuses) != 0 {
+			ctx.Data["LatestCommitStatuses"] = commitStatuses
+			ctx.Data["LatestCommitStatus"] = models.CalcCommitStatus(commitStatuses)
+		}
+	}
+
 	return compareInfo
 }
 
diff --git a/services/pull/pull.go b/services/pull/pull.go
index f3fb762303..23a4bf9776 100644
--- a/services/pull/pull.go
+++ b/services/pull/pull.go
@@ -9,6 +9,7 @@ import (
 	"bytes"
 	"context"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"strings"
 	"time"
@@ -641,31 +642,27 @@ func GetCommitMessages(pr *models.PullRequest) string {
 
 // GetLastCommitStatus returns the last commit status for this pull request.
 func GetLastCommitStatus(pr *models.PullRequest) (status *models.CommitStatus, err error) {
-	if err = pr.LoadHeadRepo(); err != nil {
+	if err = pr.LoadBaseRepo(); err != nil {
 		return nil, err
 	}
 
-	if pr.HeadRepo == nil {
-		return nil, models.ErrPullRequestHeadRepoMissing{ID: pr.ID, HeadRepoID: pr.HeadRepoID}
-	}
-
-	headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath())
+	gitRepo, err := git.OpenRepository(pr.BaseRepo.RepoPath())
 	if err != nil {
 		return nil, err
 	}
-	defer headGitRepo.Close()
+	defer gitRepo.Close()
 
-	lastCommitID, err := headGitRepo.GetBranchCommitID(pr.HeadBranch)
+	compareInfo, err := gitRepo.GetCompareInfo(pr.BaseRepo.RepoPath(), pr.MergeBase, pr.GetGitRefName())
 	if err != nil {
 		return nil, err
 	}
 
-	err = pr.LoadBaseRepo()
-	if err != nil {
-		return nil, err
+	if compareInfo.Commits.Len() == 0 {
+		return nil, errors.New("pull request has no commits")
 	}
 
-	statusList, err := models.GetLatestCommitStatus(pr.BaseRepo.ID, lastCommitID, models.ListOptions{})
+	sha := compareInfo.Commits.Front().Value.(*git.Commit).ID.String()
+	statusList, err := models.GetLatestCommitStatus(pr.BaseRepo.ID, sha, models.ListOptions{})
 	if err != nil {
 		return nil, err
 	}
diff --git a/templates/repo/pulls/status.tmpl b/templates/repo/pulls/status.tmpl
index 2847903a52..e48f5f3fe3 100644
--- a/templates/repo/pulls/status.tmpl
+++ b/templates/repo/pulls/status.tmpl
@@ -1,19 +1,21 @@
 {{if $.LatestCommitStatus}}
-    <div class="ui top attached header">
-         {{if eq .LatestCommitStatus.State "pending"}}
-            {{$.i18n.Tr "repo.pulls.status_checking"}}
-        {{else if eq .LatestCommitStatus.State "success"}}
-            {{$.i18n.Tr "repo.pulls.status_checks_success"}}
-        {{else if eq .LatestCommitStatus.State "warning"}}
-            {{$.i18n.Tr "repo.pulls.status_checks_warning"}}
-        {{else if eq .LatestCommitStatus.State "failure"}}
-            {{$.i18n.Tr "repo.pulls.status_checks_failure"}}
-        {{else if eq .LatestCommitStatus.State "error"}}
-            {{$.i18n.Tr "repo.pulls.status_checks_error"}}
-        {{else}}
-            {{$.i18n.Tr "repo.pulls.status_checking"}}
-        {{end}}
-    </div>
+    {{if not $.Issue.PullRequest.HasMerged}}
+        <div class="ui top attached header">
+            {{if eq .LatestCommitStatus.State "pending"}}
+                {{$.i18n.Tr "repo.pulls.status_checking"}}
+            {{else if eq .LatestCommitStatus.State "success"}}
+                {{$.i18n.Tr "repo.pulls.status_checks_success"}}
+            {{else if eq .LatestCommitStatus.State "warning"}}
+                {{$.i18n.Tr "repo.pulls.status_checks_warning"}}
+            {{else if eq .LatestCommitStatus.State "failure"}}
+                {{$.i18n.Tr "repo.pulls.status_checks_failure"}}
+            {{else if eq .LatestCommitStatus.State "error"}}
+                {{$.i18n.Tr "repo.pulls.status_checks_error"}}
+            {{else}}
+                {{$.i18n.Tr "repo.pulls.status_checking"}}
+            {{end}}
+    	    </div>
+    {{end}}
 
     {{range $.LatestCommitStatuses}}
         <div class="ui attached segment">
@@ -21,7 +23,7 @@
             <span class="ui">{{.Context}} <span class="text grey">{{.Description}}</span></span>
             <div class="ui right">
                 {{if $.is_context_required}}
-                    {{if (call $.is_context_required .Context)}}<div class="ui label">{{$.i18n.Tr "repo.pulls.status_checks_requested"}}</div>{{end}} 
+                    {{if (call $.is_context_required .Context)}}<div class="ui label">{{$.i18n.Tr "repo.pulls.status_checks_requested"}}</div>{{end}}
                 {{end}}
                 <span class="ui">{{if .TargetURL}}<a href="{{.TargetURL}}">{{$.i18n.Tr "repo.pulls.status_checks_details"}}</a>{{end}}</span>
             </div>