From 09255eecd0812d35b09613a1cf2402d3108fcc49 Mon Sep 17 00:00:00 2001
From: Kamil Trzcinski <ayufan@ayufan.eu>
Date: Wed, 14 Oct 2015 14:07:41 +0200
Subject: [PATCH] Remove ordering from :ci_commits relation

---
 app/models/ci/commit.rb        |  2 ++
 app/models/ci/project.rb       |  2 +-
 app/models/project.rb          |  2 +-
 spec/models/ci/commit_spec.rb  | 18 ++++++++++++++++++
 spec/models/ci/project_spec.rb | 18 ------------------
 5 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/app/models/ci/commit.rb b/app/models/ci/commit.rb
index 68864edfbbf..cd45366b34e 100644
--- a/app/models/ci/commit.rb
+++ b/app/models/ci/commit.rb
@@ -24,6 +24,8 @@ module Ci
     has_many :builds, class_name: 'Ci::Build'
     has_many :trigger_requests, dependent: :destroy, class_name: 'Ci::TriggerRequest'
 
+    scope :ordered, -> { order('CASE WHEN ci_commits.committed_at IS NULL THEN 0 ELSE 1 END', :committed_at, :id) }
+
     validates_presence_of :sha
     validate :valid_commit_sha
 
diff --git a/app/models/ci/project.rb b/app/models/ci/project.rb
index 88ba933a434..afd697f03f1 100644
--- a/app/models/ci/project.rb
+++ b/app/models/ci/project.rb
@@ -205,7 +205,7 @@ module Ci
     end
 
     def commits
-      gl_project.ci_commits
+      gl_project.ci_commits.ordered
     end
 
     def builds
diff --git a/app/models/project.rb b/app/models/project.rb
index 021920008ad..b99f3408271 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -119,7 +119,7 @@ class Project < ActiveRecord::Base
   has_many :deploy_keys, through: :deploy_keys_projects
   has_many :users_star_projects, dependent: :destroy
   has_many :starrers, through: :users_star_projects, source: :user
-  has_many :ci_commits, ->() { order('CASE WHEN ci_commits.committed_at IS NULL THEN 0 ELSE 1 END', :committed_at, :id) }, dependent: :destroy, class_name: 'Ci::Commit', foreign_key: :gl_project_id
+  has_many :ci_commits, dependent: :destroy, class_name: 'Ci::Commit', foreign_key: :gl_project_id
   has_many :ci_builds, through: :ci_commits, source: :builds, dependent: :destroy, class_name: 'Ci::Build'
 
   has_one :import_data, dependent: :destroy, class_name: "ProjectImportData"
diff --git a/spec/models/ci/commit_spec.rb b/spec/models/ci/commit_spec.rb
index 330971174fb..d1cecce5a6d 100644
--- a/spec/models/ci/commit_spec.rb
+++ b/spec/models/ci/commit_spec.rb
@@ -32,6 +32,24 @@ describe Ci::Commit do
   it { is_expected.to respond_to :git_author_email }
   it { is_expected.to respond_to :short_sha }
 
+  describe :ordered do
+    let(:project) { FactoryGirl.create :empty_project }
+
+    it 'returns ordered list of commits' do
+      commit1 = FactoryGirl.create :ci_commit, committed_at: 1.hour.ago, gl_project: project
+      commit2 = FactoryGirl.create :ci_commit, committed_at: 2.hour.ago, gl_project: project
+      expect(project.ci_commits.ordered).to eq([commit2, commit1])
+    end
+
+    it 'returns commits ordered by committed_at and id, with nulls last' do
+      commit1 = FactoryGirl.create :ci_commit, committed_at: 1.hour.ago, gl_project: project
+      commit2 = FactoryGirl.create :ci_commit, committed_at: nil, gl_project: project
+      commit3 = FactoryGirl.create :ci_commit, committed_at: 2.hour.ago, gl_project: project
+      commit4 = FactoryGirl.create :ci_commit, committed_at: nil, gl_project: project
+      expect(project.ci_commits.ordered).to eq([commit2, commit4, commit3, commit1])
+    end
+  end
+
   describe :last_build do
     subject { commit.last_build }
     before do
diff --git a/spec/models/ci/project_spec.rb b/spec/models/ci/project_spec.rb
index dec4720a711..81bb2a07cb0 100644
--- a/spec/models/ci/project_spec.rb
+++ b/spec/models/ci/project_spec.rb
@@ -131,24 +131,6 @@ describe Ci::Project do
     end
   end
 
-  describe 'ordered commits' do
-    let(:project) { FactoryGirl.create :empty_project }
-
-    it 'returns ordered list of commits' do
-      commit1 = FactoryGirl.create :ci_commit, committed_at: 1.hour.ago, gl_project: project
-      commit2 = FactoryGirl.create :ci_commit, committed_at: 2.hour.ago, gl_project: project
-      expect(project.ci_commits).to eq([commit2, commit1])
-    end
-
-    it 'returns commits ordered by committed_at and id, with nulls last' do
-      commit1 = FactoryGirl.create :ci_commit, committed_at: 1.hour.ago, gl_project: project
-      commit2 = FactoryGirl.create :ci_commit, committed_at: nil, gl_project: project
-      commit3 = FactoryGirl.create :ci_commit, committed_at: 2.hour.ago, gl_project: project
-      commit4 = FactoryGirl.create :ci_commit, committed_at: nil, gl_project: project
-      expect(project.ci_commits).to eq([commit2, commit4, commit3, commit1])
-    end
-  end
-
   context :valid_project do
     let(:commit) { FactoryGirl.create(:ci_commit) }
 
-- 
GitLab