diff options
author | Douwe Maan <douwe@gitlab.com> | 2015-08-17 23:33:36 +0000 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2015-08-17 23:33:36 +0000 |
commit | c9920c422d55680310cffcf34432d708de4bf207 (patch) | |
tree | 1e37ea6e18772ea8de89f0b8ba8032c2873c76ab | |
parent | f4cb6e438ab3cb03589c5ba36dc2b23c78b66c5a (diff) | |
parent | c36adb98aa62a0f22f6ed290589cd2faf108abc4 (diff) | |
download | gitlab-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:

With this fix, it looks like:

Closes #2253
See merge request !1143
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | lib/gitlab/inline_diff.rb | 7 | ||||
-rw-r--r-- | spec/lib/gitlab/diff/inline_diff_spec.rb | 39 |
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 |