summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2015-08-17 23:33:36 +0000
committerDouwe Maan <douwe@gitlab.com>2015-08-17 23:33:36 +0000
commitc9920c422d55680310cffcf34432d708de4bf207 (patch)
tree1e37ea6e18772ea8de89f0b8ba8032c2873c76ab
parentf4cb6e438ab3cb03589c5ba36dc2b23c78b66c5a (diff)
parentc36adb98aa62a0f22f6ed290589cd2faf108abc4 (diff)
downloadgitlab-ce-c9920c422d55680310cffcf34432d708de4bf207.tar.gz
Merge branch 'fix-backslashes-inline-diff' into 'master'
Fix bug where backslashes in inline diffs could be dropped This MR fixes a bug in inline diff generation causing backslashes to be dropped. For example, the input: ``` input.to_s.sub(/[\r\n].+/,'').sub(/\\[rn].+/, '').strip ``` The second backslash is dropped in the second `sub` statement: ![image](https://gitlab.com/gitlab-org/gitlab-ce/uploads/16e513894f7ecda1b111fe7d43e7f388/image.png) With this fix, it looks like: ![image](https://gitlab.com/gitlab-org/gitlab-ce/uploads/90fd635a937a68f1b2403740ebc75e3a/image.png) Closes #2253 See merge request !1143
-rw-r--r--CHANGELOG1
-rw-r--r--lib/gitlab/inline_diff.rb7
-rw-r--r--spec/lib/gitlab/diff/inline_diff_spec.rb39
3 files changed, 45 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 7c7f448b9be..9a6e25ae50a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@ Please view this file on the master branch, on stable branches it's out of date.
v 7.14.0 (unreleased)
- Provide more feedback what went wrong if HipChat service failed test (Stan Hu)
+ - Fix bug where backslashes in inline diffs could be dropped (Stan Hu)
- Disable turbolinks when linking to Bitbucket import status (Stan Hu)
- Fix broken code import and display error messages if something went wrong with creating project (Stan Hu)
- Fix corrupted binary files when using API files endpoint (Stan Hu)
diff --git a/lib/gitlab/inline_diff.rb b/lib/gitlab/inline_diff.rb
index 3517ecdf5cf..99e7b529ba9 100644
--- a/lib/gitlab/inline_diff.rb
+++ b/lib/gitlab/inline_diff.rb
@@ -46,8 +46,11 @@ module Gitlab
end
last_the_same_symbols += 1
last_token = first_line[last_the_same_symbols..-1]
- diff_arr[index+1].sub!(/#{Regexp.escape(last_token)}$/, FINISH + last_token)
- diff_arr[index+2].sub!(/#{Regexp.escape(last_token)}$/, FINISH + last_token)
+ # This is tricky: escape backslashes so that `sub` doesn't interpret them
+ # as backreferences. Regexp.escape does NOT do the right thing.
+ replace_token = FINISH + last_token.gsub(/\\/, '\&\&')
+ diff_arr[index+1].sub!(/#{Regexp.escape(last_token)}$/, replace_token)
+ diff_arr[index+2].sub!(/#{Regexp.escape(last_token)}$/, replace_token)
end
diff_arr
end
diff --git a/spec/lib/gitlab/diff/inline_diff_spec.rb b/spec/lib/gitlab/diff/inline_diff_spec.rb
new file mode 100644
index 00000000000..2e0a05088cc
--- /dev/null
+++ b/spec/lib/gitlab/diff/inline_diff_spec.rb
@@ -0,0 +1,39 @@
+require 'spec_helper'
+
+describe Gitlab::InlineDiff do
+ describe '#processing' do
+ let(:diff) do
+ <<eos
+--- a/test.rb
++++ b/test.rb
+@@ -1,6 +1,6 @@
+ class Test
+ def cleanup_string(input)
+ return nil if input.nil?
+- input.sub(/[\\r\\n].+/,'').sub(/\\\\[rn].+/, '').strip
++ input.to_s.sub(/[\\r\\n].+/,'').sub(/\\\\[rn].+/, '').strip
+ end
+ end
+eos
+ end
+
+ let(:expected) do
+ ["--- a/test.rb\n",
+ "+++ b/test.rb\n",
+ "@@ -1,6 +1,6 @@\n",
+ " class Test\n",
+ " def cleanup_string(input)\n",
+ " return nil if input.nil?\n",
+ "- input.#!idiff-start!##!idiff-finish!#sub(/[\\r\\n].+/,'').sub(/\\\\[rn].+/, '').strip\n",
+ "+ input.#!idiff-start!#to_s.#!idiff-finish!#sub(/[\\r\\n].+/,'').sub(/\\\\[rn].+/, '').strip\n",
+ " end\n",
+ " end\n"]
+ end
+
+ let(:subject) { Gitlab::InlineDiff.processing(diff.lines) }
+
+ it 'should retain backslashes' do
+ expect(subject).to eq(expected)
+ end
+ end
+end