Commit ea6a78ef authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Split complex Gitlab::InlineDiff::processing method

Signed-off-by: default avatarDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
parent bcc82511
...@@ -16,15 +16,7 @@ module Gitlab ...@@ -16,15 +16,7 @@ module Gitlab
# Skip inline diff if empty line was replaced with content # Skip inline diff if empty line was replaced with content
next if first_line == "-\n" next if first_line == "-\n"
first_the_same_symbols = 0 first_token = find_first_token(first_line, second_line)
(0..max_length + 1).each do |i|
first_the_same_symbols = i - 1
if first_line[i] != second_line[i] && i > 0
break
end
end
first_token = first_line[0..first_the_same_symbols][1..-1]
start = first_token + START start = first_token + START
if first_token.empty? if first_token.empty?
...@@ -36,23 +28,48 @@ module Gitlab ...@@ -36,23 +28,48 @@ module Gitlab
diff_arr[index+2].sub!(first_token, first_token => start) diff_arr[index+2].sub!(first_token, first_token => start)
end end
last_token = find_last_token(first_line, second_line, first_token)
# This is tricky: escape backslashes so that `sub` doesn't interpret them
# as backreferences. Regexp.escape does NOT do the right thing.
replace_token = FINISH + last_token.gsub(/\\/, '\&\&')
diff_arr[index+1].sub!(/#{Regexp.escape(last_token)}$/, replace_token)
diff_arr[index+2].sub!(/#{Regexp.escape(last_token)}$/, replace_token)
end
diff_arr
end
def find_first_token(first_line, second_line)
max_length = [first_line.size, second_line.size].max
first_the_same_symbols = 0
(0..max_length + 1).each do |i|
first_the_same_symbols = i - 1
if first_line[i] != second_line[i] && i > 0
break
end
end
first_line[0..first_the_same_symbols][1..-1]
end
def find_last_token(first_line, second_line, first_token)
max_length = [first_line.size, second_line.size].max
last_the_same_symbols = 0 last_the_same_symbols = 0
(1..max_length + 1).each do |i| (1..max_length + 1).each do |i|
last_the_same_symbols = -i last_the_same_symbols = -i
shortest_line = second_line.size > first_line.size ? first_line : second_line shortest_line = second_line.size > first_line.size ? first_line : second_line
if ( first_line[-i] != second_line[-i] ) || "#{first_token}#{START}".size == shortest_line[1..-i].size
if (first_line[-i] != second_line[-i]) || "#{first_token}#{START}".size == shortest_line[1..-i].size
break break
end end
end end
last_the_same_symbols += 1 last_the_same_symbols += 1
last_token = first_line[last_the_same_symbols..-1] first_line[last_the_same_symbols..-1]
# This is tricky: escape backslashes so that `sub` doesn't interpret them
# as backreferences. Regexp.escape does NOT do the right thing.
replace_token = FINISH + last_token.gsub(/\\/, '\&\&')
diff_arr[index+1].sub!(/#{Regexp.escape(last_token)}$/, replace_token)
diff_arr[index+2].sub!(/#{Regexp.escape(last_token)}$/, replace_token)
end
diff_arr
end end
def _indexes_of_changed_lines(diff_arr) def _indexes_of_changed_lines(diff_arr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment