diff --git a/models/git/commit_status.go b/models/git/commit_status.go
index 2d1d1bcb06..d204d11c28 100644
--- a/models/git/commit_status.go
+++ b/models/git/commit_status.go
@@ -199,22 +199,17 @@ func (status *CommitStatus) LocaleString(lang translation.Locale) string {
 
 // CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc
 func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
-	var lastStatus *CommitStatus
-	state := api.CommitStatusSuccess
-	for _, status := range statuses {
-		if status.State.NoBetterThan(state) {
-			state = status.State
-			lastStatus = status
+	if len(statuses) == 0 {
+		return nil
+	}
+
+	latestWorstStatus := statuses[0]
+	for _, status := range statuses[1:] {
+		if status.State.NoBetterThan(latestWorstStatus.State) {
+			latestWorstStatus = status
 		}
 	}
-	if lastStatus == nil {
-		if len(statuses) > 0 {
-			lastStatus = statuses[0]
-		} else {
-			lastStatus = &CommitStatus{}
-		}
-	}
-	return lastStatus
+	return latestWorstStatus
 }
 
 // CommitStatusOptions holds the options for query commit statuses
diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go
index 74ba4a1006..94c8d3776c 100644
--- a/models/git/commit_status_test.go
+++ b/models/git/commit_status_test.go
@@ -141,16 +141,20 @@ func Test_CalcCommitStatus(t *testing.T) {
 			statuses: []*git_model.CommitStatus{
 				{
 					State: structs.CommitStatusSuccess,
+					ID:    1,
 				},
 				{
 					State: structs.CommitStatusSuccess,
+					ID:    2,
 				},
 				{
 					State: structs.CommitStatusSuccess,
+					ID:    3,
 				},
 			},
 			expected: &git_model.CommitStatus{
 				State: structs.CommitStatusSuccess,
+				ID:    3,
 			},
 		},
 		{
@@ -169,6 +173,10 @@ func Test_CalcCommitStatus(t *testing.T) {
 				State: structs.CommitStatusError,
 			},
 		},
+		{
+			statuses: []*git_model.CommitStatus{},
+			expected: nil,
+		},
 	}
 
 	for _, kase := range kases {
diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go
index 514bcee8f1..cb63123463 100644
--- a/services/pull/commit_status.go
+++ b/services/pull/commit_status.go
@@ -65,7 +65,7 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus,
 		if status != nil {
 			return status.State
 		}
-		return structs.CommitStatusSuccess
+		return ""
 	}
 
 	return returnedStatus
diff --git a/services/repository/commitstatus/commitstatus.go b/services/repository/commitstatus/commitstatus.go
index 145fc7d53c..0bb738e2ad 100644
--- a/services/repository/commitstatus/commitstatus.go
+++ b/services/repository/commitstatus/commitstatus.go
@@ -123,7 +123,7 @@ func FindReposLastestCommitStatuses(ctx context.Context, repos []*repo_model.Rep
 	for i, repo := range repos {
 		if results[i] == nil {
 			results[i] = git_model.CalcCommitStatus(repoToItsLatestCommitStatuses[repo.ID])
-			if results[i].State != "" {
+			if results[i] != nil {
 				if err := updateCommitStatusCache(ctx, repo.ID, repo.DefaultBranch, results[i].State); err != nil {
 					log.Error("updateCommitStatusCache[%d:%s] failed: %v", repo.ID, repo.DefaultBranch, err)
 				}
diff --git a/web_src/js/components/DashboardRepoList.vue b/web_src/js/components/DashboardRepoList.vue
index d6b7d6c96f..825803d939 100644
--- a/web_src/js/components/DashboardRepoList.vue
+++ b/web_src/js/components/DashboardRepoList.vue
@@ -251,9 +251,8 @@ const sfc = {
         this.repos = json.data.map((webSearchRepo) => {
           return {
             ...webSearchRepo.repository,
-            latest_commit_status_state: webSearchRepo.latest_commit_status.State,
-            locale_latest_commit_status_state: webSearchRepo.locale_latest_commit_status,
-            latest_commit_status_state_link: webSearchRepo.latest_commit_status.TargetURL
+            latest_commit_status: webSearchRepo.latest_commit_status,
+            locale_latest_commit_status_state: webSearchRepo.locale_latest_commit_status
           };
         });
         const count = response.headers.get('X-Total-Count');
@@ -416,9 +415,9 @@ export default sfc; // activate the IDE's Vue plugin
                 <svg-icon name="octicon-archive" :size="16"/>
               </div>
             </a>
-            <a class="gt-df gt-ac" v-if="repo.latest_commit_status_state" :href="repo.latest_commit_status_state_link" :data-tooltip-content="repo.locale_latest_commit_status_state">
+            <a class="gt-df gt-ac" v-if="repo.latest_commit_status" :href="repo.latest_commit_status.TargetLink" :data-tooltip-content="repo.locale_latest_commit_status.State">
               <!-- the commit status icon logic is taken from templates/repo/commit_status.tmpl -->
-              <svg-icon :name="statusIcon(repo.latest_commit_status_state)" :class-name="'gt-ml-3 commit-status icon text ' + statusColor(repo.latest_commit_status_state)" :size="16"/>
+              <svg-icon :name="statusIcon(repo.latest_commit_status.State)" :class-name="'gt-ml-3 commit-status icon text ' + statusColor(repo.latest_commit_status.State)" :size="16"/>
             </a>
           </li>
         </ul>