diff options
author | Valery Sizov <vsv2711@gmail.com> | 2015-03-19 20:21:48 +0200 |
---|---|---|
committer | Valery Sizov <vsv2711@gmail.com> | 2015-03-19 20:29:02 +0200 |
commit | d2f5cd5435cfd8cc41f25b39a1a7c3308ec4111b (patch) | |
tree | c9a1e0ff1a3ce7413330f7d088a6d9e26f9b2c71 | |
parent | 267436c97cf566c04855896eb95479e962a085d5 (diff) | |
download | gitlab-ci-d2f5cd5435cfd8cc41f25b39a1a7c3308ec4111b.tar.gz |
projects sorting by last_commit_date
-rw-r--r-- | CHANGELOG | 3 | ||||
-rw-r--r-- | app/controllers/admin/projects_controller.rb | 2 | ||||
-rw-r--r-- | app/controllers/projects_controller.rb | 4 | ||||
-rw-r--r-- | app/models/project.rb | 6 | ||||
-rw-r--r-- | spec/factories/projects.rb | 16 | ||||
-rw-r--r-- | spec/features/projects_spec.rb | 4 | ||||
-rw-r--r-- | spec/models/project_spec.rb | 13 |
7 files changed, 40 insertions, 8 deletions
@@ -1,3 +1,6 @@ +v7.10.0 + - Projects sorting by last commit date + v7.9.0 - Reset user session if token is invalid - Runner delete api endpoint diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb index 232df6b..3b4e9ba 100644 --- a/app/controllers/admin/projects_controller.rb +++ b/app/controllers/admin/projects_controller.rb @@ -1,6 +1,6 @@ class Admin::ProjectsController < Admin::ApplicationController def index - @projects = Project.page(params[:page]).per(30) + @projects = Project.ordered_by_last_commit_date.page(params[:page]).per(30) end def show diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 38762e7..9e7e44c 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -10,7 +10,7 @@ class ProjectsController < ApplicationController layout 'project', except: [:index, :gitlab] def index - @projects = Project.public_only.page(params[:page]) unless current_user + @projects = Project.ordered_by_last_commit_date.public_only.page(params[:page]) unless current_user end def gitlab @@ -18,7 +18,7 @@ class ProjectsController < ApplicationController @page = (params[:page] || 1).to_i @per_page = 100 @gl_projects = current_user.gitlab_projects(@page, @per_page) - @projects = Project.where(gitlab_id: @gl_projects.map(&:id)).order('name ASC') + @projects = Project.where(gitlab_id: @gl_projects.map(&:id)).ordered_by_last_commit_date @total_count = @gl_projects.size @gl_projects.reject! { |gl_project| @projects.map(&:gitlab_id).include?(gl_project.id) } rescue Network::UnauthorizedError diff --git a/app/models/project.rb b/app/models/project.rb index d615f7e..629c4fe 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -113,6 +113,12 @@ ls -la "AND runner_projects.runner_id = #{runner.id}"). where('runner_projects.project_id' => nil) end + + def ordered_by_last_commit_date + last_commit_subquery = "(SELECT project_id, MAX(created_at) created_at FROM commits GROUP BY project_id)" + joins("LEFT JOIN #{last_commit_subquery} AS last_commit ON projects.id = last_commit.project_id"). + order("CASE WHEN last_commit.created_at IS NULL THEN 1 ELSE 0 END, last_commit.created_at DESC") + end end def set_default_values diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 55e2cdd..a123f8f 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -27,10 +27,20 @@ FactoryGirl.define do factory :project_without_token, class: Project do - name 'GitLab / gitlab-shell' + sequence :name do |n| + "GitLab / gitlab-shell#{n}" + end + default_ref 'master' - gitlab_url 'http://demo.gitlabhq.com/gitlab/gitlab-shell' - ssh_url_to_repo 'git@demo.gitlab.com:gitlab/gitlab-shell.git' + + sequence :gitlab_url do |n| + "http://demo.gitlabhq.com/gitlab/gitlab-shell#{n}" + end + + sequence :ssh_url_to_repo do |n| + "git@demo.gitlab.com:gitlab/gitlab-shell#{n}.git" + end + gitlab_id 8 factory :project do diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb index 7d92a19..034dfc1 100644 --- a/spec/features/projects_spec.rb +++ b/spec/features/projects_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe "Projects" do before do login_as :user - @project = FactoryGirl.create :project + @project = FactoryGirl.create :project, name: "GitLab / gitlab-shell" end describe "GET /projects", js: true do @@ -12,7 +12,7 @@ describe "Projects" do visit projects_path end - it { page.should have_content @project.name } + it { page.should have_content "GitLab / gitlab-shell" } end describe "GET /projects/:id" do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index af7d162..8ad2c69 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -46,6 +46,19 @@ describe Project do end end + describe "ordered_by_last_commit_date" do + it "returns ordered projects" do + newest_project = FactoryGirl.create :project + oldest_project = FactoryGirl.create :project + project_without_commits = FactoryGirl.create :project + + FactoryGirl.create :commit, created_at: 1.hour.ago, project: newest_project + FactoryGirl.create :commit, created_at: 2.hour.ago, project: oldest_project + + Project.ordered_by_last_commit_date.should == [newest_project, oldest_project, project_without_commits] + end + end + context :valid_project do let(:project) { FactoryGirl.create :project } |