summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean McGivern <sean@mcgivern.me.uk>2017-10-16 10:11:55 +0000
committerSean McGivern <sean@mcgivern.me.uk>2017-10-16 10:11:55 +0000
commit3a7623fc010832c337e0ba0eb8650d7f6fca3562 (patch)
tree9973e5a7171ed9eaae23bb964cab8119fdb440db
parent0f65e204f3ac6e7f5190bbca4712e04076ecd448 (diff)
parent9cf8b75df67ec29a7065f03dff94429165636ca9 (diff)
downloadgitlab-ce-3a7623fc010832c337e0ba0eb8650d7f6fca3562.tar.gz
Merge branch 'fix_diff_parsing' into 'master'
Fix diff parser so it tolerates to diff special markers in the content Closes #34431 See merge request gitlab-org/gitlab-ce!14848
-rw-r--r--changelogs/unreleased/fix_diff_parsing.yml5
-rw-r--r--lib/gitlab/diff/parser.rb4
-rw-r--r--spec/lib/gitlab/diff/parser_spec.rb17
3 files changed, 25 insertions, 1 deletions
diff --git a/changelogs/unreleased/fix_diff_parsing.yml b/changelogs/unreleased/fix_diff_parsing.yml
new file mode 100644
index 00000000000..7a26b4f9ff5
--- /dev/null
+++ b/changelogs/unreleased/fix_diff_parsing.yml
@@ -0,0 +1,5 @@
+---
+title: Fix diff parser so it tolerates to diff special markers in the content
+merge_request:
+author:
+type: fixed
diff --git a/lib/gitlab/diff/parser.rb b/lib/gitlab/diff/parser.rb
index 742f989c50b..7dc9cc7c281 100644
--- a/lib/gitlab/diff/parser.rb
+++ b/lib/gitlab/diff/parser.rb
@@ -17,7 +17,9 @@ module Gitlab
# without having to instantiate all the others that come after it.
Enumerator.new do |yielder|
@lines.each do |line|
- next if filename?(line)
+ # We're expecting a filename parameter only in a meta-part of the diff content
+ # when type is defined then we're already in a content-part
+ next if filename?(line) && type.nil?
full_line = line.delete("\n")
diff --git a/spec/lib/gitlab/diff/parser_spec.rb b/spec/lib/gitlab/diff/parser_spec.rb
index 8af49ed50ff..80c8c189665 100644
--- a/spec/lib/gitlab/diff/parser_spec.rb
+++ b/spec/lib/gitlab/diff/parser_spec.rb
@@ -143,4 +143,21 @@ eos
it { expect(parser.parse([])).to eq([]) }
it { expect(parser.parse(nil)).to eq([]) }
end
+
+ describe 'tolerates special diff markers in a content' do
+ it "counts lines correctly" do
+ diff = <<~END
+ --- a/test
+ +++ b/test
+ @@ -1,2 +1,2 @@
+ +ipsum
+ +++ b
+ -ipsum
+ END
+
+ lines = parser.parse(diff.lines).to_a
+
+ expect(lines.size).to eq(3)
+ end
+ end
end