Merge branch 'faster_project_search' into 'master'
Faster search inside Project See merge request !7353
This commit is contained in:
commit
0108387053
4 changed files with 33 additions and 18 deletions
|
@ -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(/^--$/)
|
||||
|
|
4
changelogs/unreleased/faster_project_search.yml
Normal file
4
changelogs/unreleased/faster_project_search.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Faster search inside Project
|
||||
merge_request:
|
||||
author:
|
|
@ -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
|
||||
|
|
|
@ -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 }
|
||||
|
||||
|
|
Loading…
Reference in a new issue