diff options
author | Toshi MARUYAMA <marutosijp2@yahoo.co.jp> | 2013-04-05 07:30:51 +0000 |
---|---|---|
committer | Toshi MARUYAMA <marutosijp2@yahoo.co.jp> | 2013-04-05 07:30:51 +0000 |
commit | 6469e9a5a338305c407b24fd8f072b1902671f92 (patch) | |
tree | 8566c29242d01778941e7ee2bdc8dd7e909bb363 | |
parent | 0d029317594a87aeabd652ea6f0867680222ba3f (diff) | |
download | redmine-6469e9a5a338305c407b24fd8f072b1902671f92.tar.gz redmine-6469e9a5a338305c407b24fd8f072b1902671f92.zip |
fix diff error in case of line_left out of range (#13644)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11707 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | lib/redmine/unified_diff.rb | 4 | ||||
-rw-r--r-- | test/fixtures/diffs/issue-13644-1.diff | 7 | ||||
-rw-r--r-- | test/fixtures/diffs/issue-13644-2.diff | 7 | ||||
-rw-r--r-- | test/unit/lib/redmine/unified_diff_test.rb | 64 |
4 files changed, 80 insertions, 2 deletions
diff --git a/lib/redmine/unified_diff.rb b/lib/redmine/unified_diff.rb index 968922a50..548003220 100644 --- a/lib/redmine/unified_diff.rb +++ b/lib/redmine/unified_diff.rb @@ -199,7 +199,7 @@ module Redmine while starting < max && line_left[starting] == line_right[starting] starting += 1 end - unless "".respond_to?(:force_encoding) + if (! "".respond_to?(:force_encoding)) && starting < line_left.size while line_left[starting].ord.between?(128, 191) && starting > 0 starting -= 1 end @@ -208,7 +208,7 @@ module Redmine while ending >= -(max - starting) && line_left[ending] == line_right[ending] ending -= 1 end - unless "".respond_to?(:force_encoding) + if (! "".respond_to?(:force_encoding)) && ending > (-1 * line_left.size) while line_left[ending].ord.between?(128, 191) && ending > -1 ending -= 1 end diff --git a/test/fixtures/diffs/issue-13644-1.diff b/test/fixtures/diffs/issue-13644-1.diff new file mode 100644 index 000000000..3c25c97fa --- /dev/null +++ b/test/fixtures/diffs/issue-13644-1.diff @@ -0,0 +1,7 @@ +--- a.txt 2013-04-05 14:19:39.000000000 +0900 ++++ b.txt 2013-04-05 14:19:51.000000000 +0900 +@@ -1,3 +1,3 @@ + aaaa +-日本 ++日本語 + bbbb diff --git a/test/fixtures/diffs/issue-13644-2.diff b/test/fixtures/diffs/issue-13644-2.diff new file mode 100644 index 000000000..3bf142502 --- /dev/null +++ b/test/fixtures/diffs/issue-13644-2.diff @@ -0,0 +1,7 @@ +--- a.txt 2013-04-05 14:19:39.000000000 +0900 ++++ b.txt 2013-04-05 14:19:51.000000000 +0900 +@@ -1,3 +1,3 @@ + aaaa +-日本 ++にっぽん日本 + bbbb diff --git a/test/unit/lib/redmine/unified_diff_test.rb b/test/unit/lib/redmine/unified_diff_test.rb index cbc5cec45..7e1ccbdd9 100644 --- a/test/unit/lib/redmine/unified_diff_test.rb +++ b/test/unit/lib/redmine/unified_diff_test.rb @@ -244,6 +244,70 @@ DIFF end end + def test_offset_range_ascii_1 + raw = <<-DIFF +--- a.txt 2013-04-05 14:19:39.000000000 +0900 ++++ b.txt 2013-04-05 14:19:51.000000000 +0900 +@@ -1,3 +1,3 @@ + aaaa +-abc ++abcd + bbbb +DIFF + diff = Redmine::UnifiedDiff.new(raw, :type => 'sbs') + assert_equal 1, diff.size + assert_equal 3, diff.first.size + assert_equal "abc<span></span>", diff.first[1].html_line_left + assert_equal "abc<span>d</span>", diff.first[1].html_line_right + end + + def test_offset_range_ascii_2 + raw = <<-DIFF +--- a.txt 2013-04-05 14:19:39.000000000 +0900 ++++ b.txt 2013-04-05 14:19:51.000000000 +0900 +@@ -1,3 +1,3 @@ + aaaa +-abc ++zabc + bbbb +DIFF + diff = Redmine::UnifiedDiff.new(raw, :type => 'sbs') + assert_equal 1, diff.size + assert_equal 3, diff.first.size + assert_equal "<span></span>abc", diff.first[1].html_line_left + assert_equal "<span>z</span>abc", diff.first[1].html_line_right + end + + def test_offset_range_japanese_1 + ja1 = "\xe6\x97\xa5\xe6\x9c\xac<span></span>" + ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding) + ja2 = "\xe6\x97\xa5\xe6\x9c\xac<span>\xe8\xaa\x9e</span>" + ja2.force_encoding('UTF-8') if ja2.respond_to?(:force_encoding) + with_settings :repositories_encodings => '' do + diff = Redmine::UnifiedDiff.new( + read_diff_fixture('issue-13644-1.diff'), :type => 'sbs') + assert_equal 1, diff.size + assert_equal 3, diff.first.size + assert_equal ja1, diff.first[1].html_line_left + assert_equal ja2, diff.first[1].html_line_right + end + end + + def test_offset_range_japanese_2 + ja1 = "<span></span>\xe6\x97\xa5\xe6\x9c\xac" + ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding) + ja2 = "<span>\xe3\x81\xab\xe3\x81\xa3\xe3\x81\xbd\xe3\x82\x93</span>\xe6\x97\xa5\xe6\x9c\xac" + ja2.force_encoding('UTF-8') if ja2.respond_to?(:force_encoding) + with_settings :repositories_encodings => '' do + diff = Redmine::UnifiedDiff.new( + read_diff_fixture('issue-13644-2.diff'), :type => 'sbs') + assert_equal 1, diff.size + assert_equal 3, diff.first.size + assert_equal ja1, diff.first[1].html_line_left + assert_equal ja2, diff.first[1].html_line_right + end + end + private def read_diff_fixture(filename) |