From 18a71c47603d703de73c46fef4889887f685bebe Mon Sep 17 00:00:00 2001
From: Lin Jen-Shin <godfat@godfat.org>
Date: Mon, 7 Nov 2016 23:44:11 +0800
Subject: [PATCH] Show commit status from latest pipeline

Rather than compound status from all pipelines.

Closes #20560
---
 app/models/ci/pipeline.rb                     |  6 ++++-
 app/models/commit.rb                          | 16 ++++++-----
 ...how-commit-status-from-latest-pipeline.yml |  4 +++
 spec/models/commit_spec.rb                    | 27 ++++++++-----------
 4 files changed, 29 insertions(+), 24 deletions(-)
 create mode 100644 changelogs/unreleased/show-commit-status-from-latest-pipeline.yml

diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index d3432632899..3ab19938c0f 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -83,9 +83,13 @@ module Ci
       end
     end
 
+    scope :latest, -> { order(id: :desc) }
+
     # ref can't be HEAD or SHA, can only be branch/tag name
+    scope :latest_for, ->(ref) { where(ref: ref).latest }
+
     def self.latest_successful_for(ref)
-      where(ref: ref).order(id: :desc).success.first
+      latest_for(ref).success.first
     end
 
     def self.truncate_sha(sha)
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 9e7fde9503d..2134ba2d75f 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -232,13 +232,15 @@ class Commit
   def status(ref = nil)
     @statuses ||= {}
 
-    if @statuses.key?(ref)
-      @statuses[ref]
-    elsif ref
-      @statuses[ref] = pipelines.where(ref: ref).status
-    else
-      @statuses[ref] = pipelines.status
-    end
+    return @statuses[ref] if @statuses.key?(ref)
+
+    latest_pipeline = if ref
+                        pipelines.latest_for(ref)
+                      else
+                        pipelines.latest
+                      end.first
+
+    @statuses[ref] = latest_pipeline.try(:status)
   end
 
   def revert_branch_name
diff --git a/changelogs/unreleased/show-commit-status-from-latest-pipeline.yml b/changelogs/unreleased/show-commit-status-from-latest-pipeline.yml
new file mode 100644
index 00000000000..bbd7a217493
--- /dev/null
+++ b/changelogs/unreleased/show-commit-status-from-latest-pipeline.yml
@@ -0,0 +1,4 @@
+---
+title: Show commit status from latest pipeline
+merge_request: 7333
+author:
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index e3bb3482d67..ca277601970 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -206,23 +206,18 @@ eos
   end
 
   describe '#status' do
-    context 'without arguments for compound status' do
-      shared_examples 'giving the status from pipeline' do
-        it do
-          expect(commit.status).to eq(Ci::Pipeline.status)
-        end
-      end
-
-      context 'with pipelines' do
-        let!(:pipeline) do
-          create(:ci_empty_pipeline, project: project, sha: commit.sha)
+    context 'without arguments' do
+      before do
+        5.times do
+          create(:ci_empty_pipeline,
+                 project: project,
+                 sha: commit.sha,
+                 status: Ci::Pipeline.all_state_names.sample)
         end
-
-        it_behaves_like 'giving the status from pipeline'
       end
 
-      context 'without pipelines' do
-        it_behaves_like 'giving the status from pipeline'
+      it 'gives the status from latest pipeline' do
+        expect(commit.status).to eq(Ci::Pipeline.latest.first.status)
       end
     end
 
@@ -248,8 +243,8 @@ eos
         expect(commit.status('fix')).to eq(pipeline_from_fix.status)
       end
 
-      it 'gives compound status if ref is nil' do
-        expect(commit.status(nil)).to eq(commit.status)
+      it 'gives status from latest pipeline for whatever branch' do
+        expect(commit.status(nil)).to eq(Ci::Pipeline.latest.first.status)
       end
     end
   end
-- 
GitLab