summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Mathiesen <marius@shortcut.no>2009-12-14 15:15:22 +0100
committerMarius Mathiesen <marius@shortcut.no>2009-12-14 15:15:35 +0100
commit6539ee7d741b435848e103bae9711c0ed22e03e1 (patch)
treecd42cbceac5d6e1a6d5284dfd0de07098c65c963
parent8eef9e3d5dea455e41a702909d8c54b21d7cd37a (diff)
downloadgitorious-mainline-outdated-6539ee7d741b435848e103bae9711c0ed22e03e1.zip
gitorious-mainline-outdated-6539ee7d741b435848e103bae9711c0ed22e03e1.tar.gz
gitorious-mainline-outdated-6539ee7d741b435848e103bae9711c0ed22e03e1.tar.bz2
Project#search_repositories now uses the same logic as Repository#search_clones
-rw-r--r--app/controllers/repositories_controller.rb2
-rw-r--r--app/models/project.rb4
-rw-r--r--app/models/repository.rb27
-rw-r--r--test/unit/project_test.rb12
4 files changed, 31 insertions, 14 deletions
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index b46dc3c..c599c42 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -34,7 +34,7 @@ class RepositoriesController < ApplicationController
def index
if term = params[:filter]
- @repositories = @project.search_repositories(Regexp.new(term))
+ @repositories = @project.search_repositories(term)
else
@repositories = @owner.repositories.find(:all, :include => [:user, :events, :project])
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 9854d73..c4ade8a 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -341,9 +341,7 @@ class Project < ActiveRecord::Base
end
def search_repositories(term)
- repositories.regular.find_all {|r|
- r.matches_regexp?(term)
- }
+ Repository.title_search(term, "project_id", id)
end
def wiki_permissions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 7d68449..8d85fa5 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -670,10 +670,27 @@ class Repository < ActiveRecord::Base
end
def search_clones(term)
+ self.class.title_search(term, "parent_id", id)
+ end
+
+ # Searches for term in
+ # - title
+ # - description
+ # - owner name/login
+ #
+ # Scoped to column +key+ having +value+
+ #
+ # Example:
+ # title_search("foo", "parent_id", 1) # will find clones of Repo with id 1
+ # matching 'foo'
+ #
+ # title_search("foo", "project_id", 1) # will find repositories in Project#1
+ # matching 'foo'
+ def self.title_search(term, key, value)
sql = "SELECT repositories.* FROM repositories
INNER JOIN users on repositories.user_id=users.id
INNER JOIN groups on repositories.owner_id=groups.id
- WHERE repositories.parent_id=:id
+ WHERE repositories.#{key}=#{value}
AND (repositories.name LIKE :q OR repositories.description LIKE :q OR groups.name LIKE :q)
AND repositories.owner_type='Group'
AND kind in (:kinds)
@@ -681,12 +698,14 @@ class Repository < ActiveRecord::Base
SELECT repositories.* from repositories
INNER JOIN users on repositories.user_id=users.id
INNER JOIN users owners on repositories.owner_id=owners.id
- WHERE repositories.parent_id=:id
+ WHERE repositories.#{key}=#{value}
AND (repositories.name LIKE :q OR repositories.description LIKE :q OR owners.login LIKE :q)
AND repositories.owner_type='User'
AND kind in (:kinds)"
- clones.find_by_sql([sql, {:q => "%#{term}%", :id => id, :kinds =>
- [KIND_TEAM_REPO, KIND_USER_REPO, KIND_PROJECT_REPO]}])
+ self.find_by_sql([sql, {:q => "%#{term}%",
+ :id => value,
+ :kinds =>
+ [KIND_TEAM_REPO, KIND_USER_REPO, KIND_PROJECT_REPO]}])
end
protected
diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb
index 7ec1840..9114a06 100644
--- a/test/unit/project_test.rb
+++ b/test/unit/project_test.rb
@@ -403,7 +403,7 @@ class ProjectTest < ActiveSupport::TestCase
@owner = Factory.create(:user, :login => "thejoker")
@project = Factory.create(:project, :user => @owner,
:owner => @owner)
- @repo = Factory.create(:repository, :project => @project, :owner => @project,
+ @repo = Factory.create(:repository, :project => @project, :owner => @owner,
:user => @owner, :name => "thework", :description => "halloween")
@group = Factory.create(:group, :creator => @owner,
:name => "foo-hackers", :user_id => @owner.to_param)
@@ -413,23 +413,23 @@ class ProjectTest < ActiveSupport::TestCase
end
should "find repositories matching the repo name" do
- assert @project.search_repositories(/work/).include?(@repo)
+ assert @project.search_repositories("work").include?(@repo)
end
should "find repositories with a matching description" do
- assert @project.search_repositories(/ween/).include?(@repo)
+ assert @project.search_repositories("ween").include?(@repo)
end
should "find repositories matching the owning user's name" do
- assert @project.search_repositories(/joker/).include?(@repo)
+ assert @project.search_repositories("joker").include?(@repo)
end
should "find repositories matching the owning group's name" do
- assert @project.search_repositories(/hackers/).include?(@group_repo)
+ assert @project.search_repositories("hackers").include?(@group_repo)
end
should "only include regular repositories" do
- assert !@project.search_repositories(/track/).include?(@tracking_repo)
+ assert !@project.search_repositories("track").include?(@tracking_repo)
end
end