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
2 unresolved threads
Compare and Show latest version
2 files
+ 38
17
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -7,7 +7,7 @@ class ApplyService < ::BaseService
PLACEHOLDERS = {
'project_path' => ->(suggestions, user) { suggestions[0].project.path },
'project_name' => ->(suggestions, user) { suggestions[0].project.name },
'file_paths' => ->(suggestions, user) { suggestions.map(&:file_path).uniq.sort.join("\n") },
'file_paths' => ->(suggestions, user) { format_paths(suggestions.map(&:file_path))},
'branch_name' => ->(suggestions, user) { suggestions[0].branch },
'suggestions_count' => ->(suggestions, user) { suggestions.size },
'username' => ->(suggestions, user) { user.username },
@@ -37,6 +37,10 @@ def execute(*suggestions)
error(_('A file has been changed'))
end
def self.format_paths(paths)
paths.uniq.sort.join("\n")
end
private
def build_blobs_data(suggestions)
@@ -50,21 +54,21 @@ def build_blobs_data(suggestions)
break
end
add_suggestion_lines_info(suggestion, blob_data_by_path)
add_line_range_info(suggestion, blob_data_by_path)
end
[error_message, blob_data_by_path.values]
end
def add_suggestion_lines_info(suggestion, blob_data_by_path)
def add_line_range_info(suggestion, blob_data_by_path)
file_path = suggestion.diff_file.file_path
blob_data = blob_data_by_path[file_path] ||= {
blob: suggestion.diff_file.new_blob,
new_lines_info: []
line_ranges_info: []
}
blob_data[:new_lines_info] << {
blob_data[:line_ranges_info] << {
range: suggestion.from_line_index..suggestion.to_line_index,
content: suggestion.to_content
}
@@ -117,9 +121,9 @@ def new_file_content(blob_data)
blob_data[:blob].load_all_data!
content = blob_data[:blob].data.lines
blob_data[:new_lines_info].each do |line_info|
range = line_info[:range]
content[range] = line_info[:content]
blob_data[:line_ranges_info].each do |range_info|
range = range_info[:range]
content[range] = range_info[:content]
end
content.join
@@ -164,7 +168,7 @@ def has_range_conflict?(suggestion, blobs_data)
new_range = suggestion.from_line_index..suggestion.to_line_index
current_ranges = blob_data[:new_lines_info].map { |line_info| line_info[:range] }
current_ranges = blob_data[:line_ranges_info].map { |range_info| range_info[:range] }
current_ranges.any? do |current_range|
current_range.overlaps?(new_range)
Loading