2020-01-29 10:08:59 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class ContextCommitsFinder
|
|
|
|
def initialize(project, merge_request, params = {})
|
|
|
|
@project = project
|
|
|
|
@merge_request = merge_request
|
|
|
|
@search = params[:search]
|
|
|
|
@limit = (params[:limit] || 40).to_i
|
|
|
|
@offset = (params[:offset] || 0).to_i
|
|
|
|
end
|
|
|
|
|
|
|
|
def execute
|
|
|
|
commits = init_collection
|
|
|
|
commits = filter_existing_commits(commits)
|
|
|
|
|
|
|
|
commits
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
attr_reader :project, :merge_request, :search, :limit, :offset
|
|
|
|
|
|
|
|
def init_collection
|
|
|
|
commits =
|
|
|
|
if search.present?
|
|
|
|
search_commits
|
|
|
|
else
|
2020-08-04 14:09:49 -04:00
|
|
|
project.repository.commits(merge_request.target_branch, { limit: limit, offset: offset })
|
2020-01-29 10:08:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
commits
|
|
|
|
end
|
|
|
|
|
|
|
|
def filter_existing_commits(commits)
|
|
|
|
commits.select! { |commit| already_included_ids.exclude?(commit.id) }
|
|
|
|
|
|
|
|
commits
|
|
|
|
end
|
|
|
|
|
|
|
|
def search_commits
|
|
|
|
key = search.strip
|
|
|
|
commits = []
|
|
|
|
if Commit.valid_hash?(key)
|
|
|
|
mr_existing_commits_ids = merge_request.commits.map(&:id)
|
|
|
|
if mr_existing_commits_ids.exclude? key
|
|
|
|
commit_by_sha = project.repository.commit(key)
|
|
|
|
commits = [commit_by_sha] if commit_by_sha
|
|
|
|
end
|
|
|
|
else
|
2020-08-04 14:09:49 -04:00
|
|
|
commits = project.repository.find_commits_by_message(search, merge_request.target_branch, nil, 20)
|
2020-01-29 10:08:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
commits
|
|
|
|
end
|
|
|
|
|
|
|
|
def already_included_ids
|
|
|
|
mr_existing_commits_ids = merge_request.commits.map(&:id)
|
|
|
|
mr_context_commits_ids = merge_request.context_commits.map(&:id)
|
|
|
|
|
|
|
|
mr_existing_commits_ids + mr_context_commits_ids
|
|
|
|
end
|
|
|
|
end
|