take nonewline context into account in diff parser
This commit is contained in:
		
							parent
							
								
									9ed3db9150
								
							
						
					
					
						commit
						985af1a670
					
				|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  | @ -52,7 +52,7 @@ module Gitlab | |||
|       end | ||||
| 
 | ||||
|       def meta? | ||||
|         type == 'match' || type == 'nonewline' | ||||
|         type == 'match' | ||||
|       end | ||||
| 
 | ||||
|       def as_json(opts = nil) | ||||
|  |  | |||
|  | @ -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. | ||||
|  | @ -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 | ||||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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…
	
		Reference in New Issue