debian-mirror-gitlab/lib/gitlab/project_search_results.rb

160 lines
4.2 KiB
Ruby
Raw Normal View History

2015-04-26 12:48:37 +05:30
module Gitlab
class ProjectSearchResults < SearchResults
attr_reader :project, :repository_ref
2018-03-17 18:26:18 +05:30
def initialize(current_user, project, query, repository_ref = nil, per_page: 20)
2016-06-02 11:05:42 +05:30
@current_user = current_user
@project = project
2018-11-18 11:00:15 +05:30
@repository_ref = repository_ref.presence
2015-11-26 14:37:03 +05:30
@query = query
2018-03-17 18:26:18 +05:30
@per_page = per_page
2015-04-26 12:48:37 +05:30
end
def objects(scope, page = nil)
case scope
when 'notes'
notes.page(page).per(per_page)
when 'blobs'
Kaminari.paginate_array(blobs).page(page).per(per_page)
when 'wiki_blobs'
Kaminari.paginate_array(wiki_blobs).page(page).per(per_page)
2015-11-26 14:37:03 +05:30
when 'commits'
Kaminari.paginate_array(commits).page(page).per(per_page)
2015-04-26 12:48:37 +05:30
else
2018-03-17 18:26:18 +05:30
super(scope, page, false)
2015-04-26 12:48:37 +05:30
end
end
def blobs_count
@blobs_count ||= blobs.count
end
2018-03-27 19:54:05 +05:30
def limited_notes_count
return @limited_notes_count if defined?(@limited_notes_count)
types = %w(issue merge_request commit snippet)
@limited_notes_count = 0
types.each do |type|
@limited_notes_count += notes_finder(type).limit(count_limit).count
break if @limited_notes_count >= count_limit
end
@limited_notes_count
2015-04-26 12:48:37 +05:30
end
def wiki_blobs_count
@wiki_blobs_count ||= wiki_blobs.count
end
2015-11-26 14:37:03 +05:30
def commits_count
@commits_count ||= commits.count
end
2018-03-17 18:26:18 +05:30
def self.parse_search_result(result, project = nil)
2017-08-17 22:00:37 +05:30
ref = nil
filename = nil
basename = nil
2018-03-17 18:26:18 +05:30
data = ""
2017-08-17 22:00:37 +05:30
startline = 0
2018-05-09 12:01:36 +05:30
result.each_line.each_with_index do |line, index|
2018-11-08 19:23:39 +05:30
prefix ||= line.match(/^(?<ref>[^:]*):(?<filename>[^\x00]*)\x00(?<startline>\d+)\x00/)&.tap do |matches|
2018-03-17 18:26:18 +05:30
ref = matches[:ref]
filename = matches[:filename]
startline = matches[:startline]
2017-08-17 22:00:37 +05:30
startline = startline.to_i - index
extname = Regexp.escape(File.extname(filename))
basename = filename.sub(/#{extname}$/, '')
end
2018-03-17 18:26:18 +05:30
data << line.sub(prefix.to_s, '')
2017-08-17 22:00:37 +05:30
end
FoundBlob.new(
filename: filename,
basename: basename,
ref: ref,
startline: startline,
2018-03-17 18:26:18 +05:30
data: data,
project_id: project ? project.id : nil
2017-08-17 22:00:37 +05:30
)
end
def single_commit_result?
2018-03-27 19:54:05 +05:30
return false if commits_count != 1
2017-08-17 22:00:37 +05:30
2018-03-27 19:54:05 +05:30
counts = %i(limited_milestones_count limited_notes_count
limited_merge_requests_count limited_issues_count
blobs_count wiki_blobs_count)
counts.all? { |count_method| public_send(count_method).zero? } # rubocop:disable GitlabSecurity/PublicSend
2017-08-17 22:00:37 +05:30
end
2015-04-26 12:48:37 +05:30
private
def blobs
2017-08-17 22:00:37 +05:30
return [] unless Ability.allowed?(@current_user, :download_code, @project)
2018-11-18 11:00:15 +05:30
@blobs ||= Gitlab::FileFinder.new(project, repository_project_ref).find(query)
2015-04-26 12:48:37 +05:30
end
def wiki_blobs
2017-08-17 22:00:37 +05:30
return [] unless Ability.allowed?(@current_user, :read_wiki, @project)
@wiki_blobs ||= begin
if project.wiki_enabled? && query.present?
2018-11-18 11:00:15 +05:30
unless project.wiki.empty?
Gitlab::WikiFileFinder.new(project, repository_wiki_ref).find(query)
2017-08-17 22:00:37 +05:30
else
[]
end
2015-04-26 12:48:37 +05:30
else
[]
end
end
end
def notes
2018-03-27 19:54:05 +05:30
@notes ||= notes_finder(nil)
end
def notes_finder(type)
NotesFinder.new(project, @current_user, search: query, target_type: type).execute.user.order('updated_at DESC')
2015-04-26 12:48:37 +05:30
end
2015-11-26 14:37:03 +05:30
def commits
2017-08-17 22:00:37 +05:30
@commits ||= find_commits(query)
end
def find_commits(query)
return [] unless Ability.allowed?(@current_user, :download_code, @project)
commits = find_commits_by_message(query)
commit_by_sha = find_commit_by_sha(query)
commits |= [commit_by_sha] if commit_by_sha
commits
end
def find_commits_by_message(query)
project.repository.find_commits_by_message(query)
end
def find_commit_by_sha(query)
key = query.strip
project.repository.commit(key) if Commit.valid_hash?(key)
2015-11-26 14:37:03 +05:30
end
2016-06-02 11:05:42 +05:30
def project_ids_relation
project
2015-04-26 12:48:37 +05:30
end
2018-11-18 11:00:15 +05:30
def repository_project_ref
@repository_project_ref ||= repository_ref || project.default_branch
end
def repository_wiki_ref
@repository_wiki_ref ||= repository_ref || project.wiki.default_branch
end
2015-04-26 12:48:37 +05:30
end
end