summaryrefslogtreecommitdiff
path: root/app/services/merge_requests/outdated_discussion_diff_lines_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/merge_requests/outdated_discussion_diff_lines_service.rb')
-rw-r--r--app/services/merge_requests/outdated_discussion_diff_lines_service.rb61
1 files changed, 61 insertions, 0 deletions
diff --git a/app/services/merge_requests/outdated_discussion_diff_lines_service.rb b/app/services/merge_requests/outdated_discussion_diff_lines_service.rb
new file mode 100644
index 00000000000..a2de5a32963
--- /dev/null
+++ b/app/services/merge_requests/outdated_discussion_diff_lines_service.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module MergeRequests
+ class OutdatedDiscussionDiffLinesService
+ include Gitlab::Utils::StrongMemoize
+
+ attr_reader :project, :note
+
+ OVERFLOW_LINES_COUNT = 2
+
+ def initialize(project:, note:)
+ @project = project
+ @note = note
+ end
+
+ def execute
+ end_position = position.line_range["end"]
+ diff_line_index = diff_lines.find_index do |l|
+ if end_position["new_line"]
+ l.new_line == end_position["new_line"]
+ elsif end_position["old_line"]
+ l.old_line == end_position["old_line"]
+ end
+ end
+ initial_line_index = [diff_line_index - OVERFLOW_LINES_COUNT, 0].max
+ last_line_index = [diff_line_index + OVERFLOW_LINES_COUNT, diff_lines.length].min
+
+ prev_lines = []
+
+ diff_lines[initial_line_index..last_line_index].each do |line|
+ if line.meta?
+ prev_lines.clear
+ else
+ prev_lines << line
+ end
+ end
+
+ prev_lines
+ end
+
+ private
+
+ def position
+ note.change_position
+ end
+
+ def repository
+ project.repository
+ end
+
+ def diff_file
+ position.diff_file(repository)
+ end
+
+ def diff_lines
+ strong_memoize(:diff_lines) do
+ diff_file.highlighted_diff_lines
+ end
+ end
+ end
+end