Skip to content
Snippets Groups Projects

Users can apply multiple suggestions at once.

Merged Jesse Hall requested to merge jessehall3/gitlab-ee:25486-batch-suggestions into master
3 files
+ 73
44
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -11,41 +11,32 @@ def initialize
def add_suggestion(new_suggestion)
if for_different_file?(new_suggestion)
raise SuggestionForDifferentFileError, 'Only add suggestions for the same file.'
raise SuggestionForDifferentFileError,
'Only add suggestions for the same file.'
end
suggestions << new_suggestion
end
def line_conflict?
ranges = []
return @line_conflict if defined?(@line_conflict)
suggestions.each do |suggestion|
range_in_test = line_range(suggestion)
has_conflict = ranges.any? do |range|
range.overlaps?(range_in_test)
end
if has_conflict
return true
else
ranges << range_in_test
end
end
false
@line_conflict = _line_conflict?
end
def new_content
@new_content ||= build_new_content
@new_content ||= _new_content
end
def last_commit_id
last_commit&.id
end
private
attr_accessor :suggestions
def build_new_content
def _new_content
current_content.tap do |content|
suggestions.each do |suggestion|
range = line_range(suggestion)
@@ -54,14 +45,17 @@ def build_new_content
end.join
end
def blob
@blob ||= first_suggestion.diff_file.new_blob
end
def current_content
blob = new_blob
blob.load_all_data!
blob.data.lines
@current_content ||= blob_data_lines
end
def new_blob
first_suggestion.diff_file.new_blob
def blob_data_lines
blob.load_all_data!
blob.data.lines
end
def line_range(suggestion)
@@ -87,6 +81,40 @@ def first_file_path
def first_suggestion
suggestions.first
end
def repository
first_suggestion.project.repository
end
def last_commit
@last_commit ||=
Gitlab::Git::Commit.last_for_path(repository,
blob.commit_id,
first_file_path)
end
def _line_conflict?
has_conflict = false
suggestions.each_with_object([]) do |suggestion, ranges|
range_in_test = line_range(suggestion)
if has_range_conflict?(range_in_test, ranges)
has_conflict = true
break
end
ranges << range_in_test
end
has_conflict
end
def has_range_conflict?(range_in_test, ranges)
ranges.any? do |range|
range.overlaps?(range_in_test)
end
end
end
end
end
Loading