summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValery Sizov <vsv2711@gmail.com>2015-03-19 20:21:48 +0200
committerValery Sizov <vsv2711@gmail.com>2015-03-19 20:29:02 +0200
commitd2f5cd5435cfd8cc41f25b39a1a7c3308ec4111b (patch)
treec9a1e0ff1a3ce7413330f7d088a6d9e26f9b2c71
parent267436c97cf566c04855896eb95479e962a085d5 (diff)
downloadgitlab-ci-d2f5cd5435cfd8cc41f25b39a1a7c3308ec4111b.tar.gz
projects sorting by last_commit_date
-rw-r--r--CHANGELOG3
-rw-r--r--app/controllers/admin/projects_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb4
-rw-r--r--app/models/project.rb6
-rw-r--r--spec/factories/projects.rb16
-rw-r--r--spec/features/projects_spec.rb4
-rw-r--r--spec/models/project_spec.rb13
7 files changed, 40 insertions, 8 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 85f9873..cb8a676 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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 }