Skip to content
Snippets Groups Projects
Commit 985af1a6 authored by mhasbini's avatar mhasbini
Browse files

take nonewline context into account in diff parser

parent 9ed3db91
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -9,7 +9,7 @@
- case type
- when 'match'
= 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.new_line.diff-line-num
%td.line_content.match= line.text
Loading
Loading
Loading
Loading
@@ -12,7 +12,7 @@
- case left.type
- when 'match'
= 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.line_content.match= left.text
- else
Loading
Loading
@@ -31,7 +31,7 @@
- case right.type
- when 'match'
= 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.line_content.match= right.text
- else
Loading
Loading
Loading
Loading
@@ -38,11 +38,11 @@ module Gitlab
end
 
def added?
type == 'new'
type == 'new' || type == 'new-nonewline'
end
 
def removed?
type == 'old'
type == 'old' || type == 'old-nonewline'
end
 
def rich_text
Loading
Loading
@@ -52,7 +52,7 @@ module Gitlab
end
 
def meta?
type == 'match' || type == 'nonewline'
type == 'match'
end
 
def as_json(opts = nil)
Loading
Loading
Loading
Loading
@@ -11,6 +11,7 @@ module Gitlab
line_old = 1
line_new = 1
type = nil
context = nil
 
# 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.
Loading
Loading
@@ -31,7 +32,8 @@ module Gitlab
line_obj_index += 1
next
elsif line[0] == '\\'
type = 'nonewline'
type = "#{context}-nonewline"
yielder << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new)
line_obj_index += 1
else
Loading
Loading
@@ -43,8 +45,10 @@ module Gitlab
case line[0]
when "+"
line_new += 1
context = :new
when "-"
line_old += 1
context = :old
when "\\" # rubocop:disable Lint/EmptyWhen
# No increment
else
Loading
Loading
Loading
Loading
@@ -91,6 +91,54 @@ eos
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
it { expect(parser.parse([])).to eq([]) }
it { expect(parser.parse(nil)).to eq([]) }
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment