Commit 181c2582 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'nonewline-parser' into 'master'

Take nonewline context into account in diff parser

Closes #28128 and #22636

See merge request !9705
parents 270e15f1 985af1a6
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
- case type - case type
- when 'match' - when 'match'
= diff_match_line line.old_pos, line.new_pos, text: line.text = diff_match_line line.old_pos, line.new_pos, text: line.text
- when 'nonewline' - when 'old-nonewline', 'new-nonewline'
%td.old_line.diff-line-num %td.old_line.diff-line-num
%td.new_line.diff-line-num %td.new_line.diff-line-num
%td.line_content.match= line.text %td.line_content.match= line.text
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
- case left.type - case left.type
- when 'match' - when 'match'
= diff_match_line left.old_pos, nil, text: left.text, view: :parallel = diff_match_line left.old_pos, nil, text: left.text, view: :parallel
- when 'nonewline' - when 'old-nonewline', 'new-nonewline'
%td.old_line.diff-line-num %td.old_line.diff-line-num
%td.line_content.match= left.text %td.line_content.match= left.text
- else - else
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
- case right.type - case right.type
- when 'match' - when 'match'
= diff_match_line nil, right.new_pos, text: left.text, view: :parallel = diff_match_line nil, right.new_pos, text: left.text, view: :parallel
- when 'nonewline' - when 'old-nonewline', 'new-nonewline'
%td.new_line.diff-line-num %td.new_line.diff-line-num
%td.line_content.match= right.text %td.line_content.match= right.text
- else - else
......
...@@ -38,11 +38,11 @@ module Gitlab ...@@ -38,11 +38,11 @@ module Gitlab
end end
def added? def added?
type == 'new' type == 'new' || type == 'new-nonewline'
end end
def removed? def removed?
type == 'old' type == 'old' || type == 'old-nonewline'
end end
def rich_text def rich_text
...@@ -52,7 +52,7 @@ module Gitlab ...@@ -52,7 +52,7 @@ module Gitlab
end end
def meta? def meta?
type == 'match' || type == 'nonewline' type == 'match'
end end
def as_json(opts = nil) def as_json(opts = nil)
......
...@@ -11,6 +11,7 @@ module Gitlab ...@@ -11,6 +11,7 @@ module Gitlab
line_old = 1 line_old = 1
line_new = 1 line_new = 1
type = nil type = nil
context = nil
# By returning an Enumerator we make it possible to search for a single line (with #find) # By returning an Enumerator we make it possible to search for a single line (with #find)
# without having to instantiate all the others that come after it. # without having to instantiate all the others that come after it.
...@@ -31,7 +32,8 @@ module Gitlab ...@@ -31,7 +32,8 @@ module Gitlab
line_obj_index += 1 line_obj_index += 1
next next
elsif line[0] == '\\' elsif line[0] == '\\'
type = 'nonewline' type = "#{context}-nonewline"
yielder << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new) yielder << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new)
line_obj_index += 1 line_obj_index += 1
else else
...@@ -43,8 +45,10 @@ module Gitlab ...@@ -43,8 +45,10 @@ module Gitlab
case line[0] case line[0]
when "+" when "+"
line_new += 1 line_new += 1
context = :new
when "-" when "-"
line_old += 1 line_old += 1
context = :old
when "\\" # rubocop:disable Lint/EmptyWhen when "\\" # rubocop:disable Lint/EmptyWhen
# No increment # No increment
else else
......
...@@ -91,6 +91,54 @@ eos ...@@ -91,6 +91,54 @@ eos
end end
end end
describe '\ No newline at end of file' do
it "parses nonewline in one file correctly" do
first_nonewline_diff = <<~END
--- a/test
+++ b/test
@@ -1,2 +1,2 @@
+ipsum
lorem
-ipsum
\\ No newline at end of file
END
lines = parser.parse(first_nonewline_diff.lines).to_a
expect(lines[0].type).to eq('new')
expect(lines[0].text).to eq('+ipsum')
expect(lines[2].type).to eq('old')
expect(lines[3].type).to eq('old-nonewline')
expect(lines[1].old_pos).to eq(1)
expect(lines[1].new_pos).to eq(2)
end
it "parses nonewline in two files correctly" do
both_nonewline_diff = <<~END
--- a/test
+++ b/test
@@ -1,2 +1,2 @@
-lorem
-ipsum
\\ No newline at end of file
+ipsum
+lorem
\\ No newline at end of file
END
lines = parser.parse(both_nonewline_diff.lines).to_a
expect(lines[0].type).to eq('old')
expect(lines[1].type).to eq('old')
expect(lines[2].type).to eq('old-nonewline')
expect(lines[5].type).to eq('new-nonewline')
expect(lines[3].text).to eq('+ipsum')
expect(lines[3].old_pos).to eq(3)
expect(lines[3].new_pos).to eq(1)
expect(lines[4].text).to eq('+lorem')
expect(lines[4].old_pos).to eq(3)
expect(lines[4].new_pos).to eq(2)
end
end
context 'when lines is empty' do context 'when lines is empty' do
it { expect(parser.parse([])).to eq([]) } it { expect(parser.parse([])).to eq([]) }
it { expect(parser.parse(nil)).to eq([]) } it { expect(parser.parse(nil)).to eq([]) }
......
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