diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index cbd2c969..fa87632d 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -36,8 +36,7 @@ module CommitsHelper
line_new = 1
type = nil
- lines_arr = inline_diff diff_arr
- #lines_arr = diff_arr
+ lines_arr = ::Gitlab::InlineDiff.processing diff_arr
lines_arr.each do |line|
next if line.match(/^\-\-\- \/dev\/null/)
next if line.match(/^\+\+\+ \/dev\/null/)
@@ -45,9 +44,7 @@ module CommitsHelper
next if line.match(/^\+\+\+ b/)
full_line = html_escape(line.gsub(/\n/, ''))
-
- full_line.gsub!("#!idiff-start!#", "")
- full_line.gsub!("#!idiff-finish!#", "")
+ full_line = ::Gitlab::InlineDiff.replace_markers full_line
if line.match(/^@@ -/)
type = "match"
@@ -86,50 +83,4 @@ module CommitsHelper
end
end
- def inline_diff diff_arr
- chain_of_first_symbols = ""
- diff_arr.each_with_index do |line, i|
- chain_of_first_symbols += line[0]
- end
- chain_of_first_symbols.gsub!(/[^\-\+]/, "#")
-
- offset = 0
- indexes = []
- while index = chain_of_first_symbols.index("#-+#", offset)
- indexes << index
- offset = index + 1
- end
-
- indexes.each do |index|
- first_line = diff_arr[index+1]
- second_line = diff_arr[index+2]
- 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_token = first_line[0..first_the_same_symbols][1..-1]
-
- diff_arr[index+1].sub!(first_token, first_token + "#!idiff-start!#")
- diff_arr[index+2].sub!(first_token, first_token + "#!idiff-start!#")
-
- last_the_same_symbols = 0
- (1..max_length + 1).each do |i|
- last_the_same_symbols = -i
- if first_line[-i] != second_line[-i]
- break
- end
- end
- last_the_same_symbols += 1
- last_token = first_line[last_the_same_symbols..-1]
-
- diff_arr[index+1].sub!(/#{last_token}$/, "#!idiff-finish!#" + last_token)
- diff_arr[index+2].sub!(/#{last_token}$/, "#!idiff-finish!#" + last_token)
- end
- diff_arr
- end
end
diff --git a/lib/gitlab/inline_diff.rb b/lib/gitlab/inline_diff.rb
new file mode 100644
index 00000000..b70abc22
--- /dev/null
+++ b/lib/gitlab/inline_diff.rb
@@ -0,0 +1,69 @@
+module Gitlab
+ class InlineDiff
+ class << self
+
+ START = "#!idiff-start!#"
+ FINISH = "#!idiff-finish!#"
+
+ def processing diff_arr
+ indexes = _indexes_of_changed_lines diff_arr
+
+ indexes.each do |index|
+ first_line = diff_arr[index+1]
+ second_line = diff_arr[index+2]
+ 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_token = first_line[0..first_the_same_symbols][1..-1]
+
+ diff_arr[index+1].sub!(first_token, first_token + START)
+ diff_arr[index+2].sub!(first_token, first_token + START)
+
+ last_the_same_symbols = 0
+ (1..max_length + 1).each do |i|
+ last_the_same_symbols = -i
+ if first_line[-i] != second_line[-i]
+ break
+ end
+ end
+ last_the_same_symbols += 1
+ last_token = first_line[last_the_same_symbols..-1]
+
+ diff_arr[index+1].sub!(/#{last_token}$/, FINISH + last_token)
+ diff_arr[index+2].sub!(/#{last_token}$/, FINISH + last_token)
+ end
+ diff_arr
+ end
+
+ def _indexes_of_changed_lines diff_arr
+ chain_of_first_symbols = ""
+ diff_arr.each_with_index do |line, i|
+ chain_of_first_symbols += line[0]
+ end
+ chain_of_first_symbols.gsub!(/[^\-\+]/, "#")
+
+ offset = 0
+ indexes = []
+ while index = chain_of_first_symbols.index("#-+#", offset)
+ indexes << index
+ offset = index + 1
+ end
+ indexes
+ end
+
+ def replace_markers line
+ line.gsub!(START, "")
+ line.gsub!(FINISH, "")
+ line
+ end
+
+ end
+
+ end
+end