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
def search_files(query, ref)
unless exists? && has_visible_content? && query.present?
return []
end
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})
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)
@current_user = current_user
@project = project
@repository_ref = if repository_ref.present?
repository_ref
else
nil
end
@repository_ref = repository_ref.presence
@query = query
end
@ -47,33 +43,31 @@ module Gitlab
private
def blobs
if project.empty_repo? || query.blank?
[]
else
project.repository.search_files(query, repository_ref)
end
@blobs ||= project.repository.search_files(query, repository_ref)
end
def wiki_blobs
if project.wiki_enabled? && query.present?
project_wiki = ProjectWiki.new(project)
@wiki_blobs ||= begin
if project.wiki_enabled? && query.present?
project_wiki = ProjectWiki.new(project)
unless project_wiki.empty?
project_wiki.search_files(query)
unless project_wiki.empty?
project_wiki.search_files(query)
else
[]
end
else
[]
end
else
[]
end
end
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
def commits
project.repository.find_commits_by_message(query)
@commits ||= project.repository.find_commits_by_message(query)
end
def project_ids_relation

View file

@ -362,6 +362,19 @@ describe Repository, models: true do
expect(results.first).not_to start_with('fatal:')
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
subject { results.first }