Commit 01083870 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'faster_project_search' into 'master'

Faster search inside Project

See merge request !7353
parents 358e8141 869696bc
......@@ -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(/^--$/)
......
---
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,14 +43,11 @@ 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
@wiki_blobs ||= begin
if project.wiki_enabled? && query.present?
project_wiki = ProjectWiki.new(project)
......@@ -67,13 +60,14 @@ module Gitlab
[]
end
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 }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment