Merge branch 'faster_project_search' into 'master'

Faster search inside Project

See merge request !7353
This commit is contained in:
Sean McGivern 2016-11-08 15:29:56 +00:00
commit 0108387053
4 changed files with 33 additions and 18 deletions

View file

@ -1064,6 +1064,10 @@ class Repository
end end
def search_files(query, ref) def search_files(query, ref)
unless exists? && has_visible_content? && query.present?
return []
end
offset = 2 offset = 2
args = %W(#{Gitlab.config.git.bin_path} grep -i -I -n --before-context #{offset} --after-context #{offset} -E -e #{Regexp.escape(query)} #{ref || root_ref}) args = %W(#{Gitlab.config.git.bin_path} grep -i -I -n --before-context #{offset} --after-context #{offset} -E -e #{Regexp.escape(query)} #{ref || root_ref})
Gitlab::Popen.popen(args, path_to_repo).first.scrub.split(/^--$/) Gitlab::Popen.popen(args, path_to_repo).first.scrub.split(/^--$/)

View file

@ -0,0 +1,4 @@
---
title: Faster search inside Project
merge_request:
author:

View file

@ -5,11 +5,7 @@ module Gitlab
def initialize(current_user, project, query, repository_ref = nil) def initialize(current_user, project, query, repository_ref = nil)
@current_user = current_user @current_user = current_user
@project = project @project = project
@repository_ref = if repository_ref.present? @repository_ref = repository_ref.presence
repository_ref
else
nil
end
@query = query @query = query
end end
@ -47,33 +43,31 @@ module Gitlab
private private
def blobs def blobs
if project.empty_repo? || query.blank? @blobs ||= project.repository.search_files(query, repository_ref)
[]
else
project.repository.search_files(query, repository_ref)
end
end end
def wiki_blobs def wiki_blobs
if project.wiki_enabled? && query.present? @wiki_blobs ||= begin
project_wiki = ProjectWiki.new(project) if project.wiki_enabled? && query.present?
project_wiki = ProjectWiki.new(project)
unless project_wiki.empty? unless project_wiki.empty?
project_wiki.search_files(query) project_wiki.search_files(query)
else
[]
end
else else
[] []
end end
else
[]
end end
end end
def notes def notes
project.notes.user.search(query, as_user: @current_user).order('updated_at DESC') @notes ||= project.notes.user.search(query, as_user: @current_user).order('updated_at DESC')
end end
def commits def commits
project.repository.find_commits_by_message(query) @commits ||= project.repository.find_commits_by_message(query)
end end
def project_ids_relation def project_ids_relation

View file

@ -362,6 +362,19 @@ describe Repository, models: true do
expect(results.first).not_to start_with('fatal:') expect(results.first).not_to start_with('fatal:')
end end
it 'properly handles when query is not present' do
results = repository.search_files('', 'master')
expect(results).to match_array([])
end
it 'properly handles query when repo is empty' do
repository = create(:empty_project).repository
results = repository.search_files('test', 'master')
expect(results).to match_array([])
end
describe 'result' do describe 'result' do
subject { results.first } subject { results.first }