summaryrefslogtreecommitdiff
path: root/lib/gitlab/file_finder.rb
diff options
context:
space:
mode:
authorValery Sizov <valery@gitlab.com>2017-05-12 10:16:33 +0300
committerValery Sizov <valery@gitlab.com>2017-05-12 13:21:30 +0300
commitf6c4ccd1f234e1b5bab8f7ffbd98b3d1092b4873 (patch)
treecf4c5e58d875d78724ab84daa7328b6bc54ab68d /lib/gitlab/file_finder.rb
parent180ec7113e358a7f8388e1436dc0670a11ba68df (diff)
downloadgitlab-ce-f6c4ccd1f234e1b5bab8f7ffbd98b3d1092b4873.tar.gz
Backport FileFinder from EEbackport_file_filder_from_ee
Diffstat (limited to 'lib/gitlab/file_finder.rb')
-rw-r--r--lib/gitlab/file_finder.rb32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/gitlab/file_finder.rb b/lib/gitlab/file_finder.rb
new file mode 100644
index 00000000000..093d9ed8092
--- /dev/null
+++ b/lib/gitlab/file_finder.rb
@@ -0,0 +1,32 @@
+# This class finds files in a repository by name and content
+# the result is joined and sorted by file name
+module Gitlab
+ class FileFinder
+ BATCH_SIZE = 100
+
+ attr_reader :project, :ref
+
+ def initialize(project, ref)
+ @project = project
+ @ref = ref
+ end
+
+ def find(query)
+ blobs = project.repository.search_files_by_content(query, ref).first(BATCH_SIZE)
+ found_file_names = Set.new
+
+ results = blobs.map do |blob|
+ blob = Gitlab::ProjectSearchResults.parse_search_result(blob)
+ found_file_names << blob.filename
+
+ [blob.filename, blob]
+ end
+
+ project.repository.search_files_by_name(query, ref).first(BATCH_SIZE).each do |filename|
+ results << [filename, OpenStruct.new(ref: ref)] unless found_file_names.include?(filename)
+ end
+
+ results.sort_by(&:first)
+ end
+ end
+end