diff --git a/app/models/ci/project.rb b/app/models/ci/project.rb index 89bbbea5c5a..ba6e320426c 100644 --- a/app/models/ci/project.rb +++ b/app/models/ci/project.rb @@ -48,7 +48,7 @@ module Ci accepts_nested_attributes_for :variables, allow_destroy: true - delegate :commits, :builds, :last_commit, to: :gl_project + delegate :commits, :builds, to: :gl_project # # Validations @@ -103,8 +103,8 @@ module Ci end def ordered_by_last_commit_date - last_commit_subquery = "(SELECT project_id, MAX(committed_at) committed_at FROM #{Ci::Commit.table_name} GROUP BY project_id)" - joins("LEFT JOIN #{last_commit_subquery} AS last_commit ON #{Ci::Project.table_name}.id = last_commit.project_id"). + last_commit_subquery = "(SELECT gl_project_id, MAX(committed_at) committed_at FROM #{Ci::Commit.table_name} GROUP BY gl_project_id)" + joins("LEFT JOIN #{last_commit_subquery} AS last_commit ON #{Ci::Project.table_name}.gitlab_id = last_commit.gl_project_id"). order("CASE WHEN last_commit.committed_at IS NULL THEN 1 ELSE 0 END, last_commit.committed_at DESC") end diff --git a/app/models/project.rb b/app/models/project.rb index ddf8526d6c2..a5393d396f8 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -120,7 +120,6 @@ class Project < ActiveRecord::Base has_many :starrers, through: :users_star_projects, source: :user has_many :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 :builds, through: :commits, dependent: :destroy, class_name: 'Ci::Build' - has_one :last_commit, -> { order 'ci_commits.created_at DESC' }, class_name: 'Ci::Commit', foreign_key: :gl_project_id has_one :import_data, dependent: :destroy, class_name: "ProjectImportData" has_one :gitlab_ci_project, dependent: :destroy, class_name: "Ci::Project", foreign_key: :gitlab_id diff --git a/app/views/ci/admin/projects/_project.html.haml b/app/views/ci/admin/projects/_project.html.haml index c461206c72a..a342d6e1cf0 100644 --- a/app/views/ci/admin/projects/_project.html.haml +++ b/app/views/ci/admin/projects/_project.html.haml @@ -1,4 +1,4 @@ -- last_commit = project.last_commit +- last_commit = project.commits.last %tr %td = project.id diff --git a/spec/models/ci/project_spec.rb b/spec/models/ci/project_spec.rb index b83eccb94e2..fe12160659c 100644 --- a/spec/models/ci/project_spec.rb +++ b/spec/models/ci/project_spec.rb @@ -28,9 +28,8 @@ require 'spec_helper' describe Ci::Project do - let(:gl_project) { FactoryGirl.create :empty_project, gitlab_ci_project: project } - let (:gl_project) { } - subject { FactoryGirl.build :ci_project } + let(:gl_project) { FactoryGirl.create :empty_project } + subject { FactoryGirl.create :ci_project, gl_project: gl_project } it { is_expected.to have_many(:runner_projects) } it { is_expected.to have_many(:runners) } @@ -40,9 +39,7 @@ describe Ci::Project do it { is_expected.to have_many(:triggers) } it { is_expected.to have_many(:services) } - it { is_expected.to validate_presence_of :name } it { is_expected.to validate_presence_of :timeout } - it { is_expected.to validate_presence_of :default_ref } describe 'before_validation' do it 'should set an random token if none provided' do @@ -78,7 +75,7 @@ describe Ci::Project do 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.commits).to eq([commit2.project, commit1.project]) + expect(project.commits).to eq([commit2, commit1]) end it 'returns commits ordered by committed_at and id, with nulls last' do @@ -86,7 +83,7 @@ describe Ci::Project do 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.commits).to eq([commit2.project, commit4.project, commit3.project, commit1.project]) + expect(project.commits).to eq([commit2, commit4, commit3, commit1]) end end diff --git a/spec/requests/ci/builds_spec.rb b/spec/requests/ci/builds_spec.rb index 32ca52686a9..f68116c52aa 100644 --- a/spec/requests/ci/builds_spec.rb +++ b/spec/requests/ci/builds_spec.rb @@ -8,7 +8,7 @@ describe "Builds" do describe "GET /:project/builds/:id/status.json" do before do - get status_ci_project_build_path(@project, @build), format: :json + get status_ci_project_build_path(@commit.project, @build), format: :json end it { expect(response.status).to eq(200) } diff --git a/spec/requests/ci/commits_spec.rb b/spec/requests/ci/commits_spec.rb index 4d7f132023b..3ab8c915dfd 100644 --- a/spec/requests/ci/commits_spec.rb +++ b/spec/requests/ci/commits_spec.rb @@ -7,7 +7,7 @@ describe "Commits" do describe "GET /:project/refs/:ref_name/commits/:id/status.json" do before do - get status_ci_project_ref_commits_path(@project, @commit.ref, @commit.sha), format: :json + get status_ci_project_ref_commits_path(@commit.project, @commit.ref, @commit.sha), format: :json end it { expect(response.status).to eq(200) }