fix diff of CJK(Chinese/Japanese/Korean) is broken on Ruby 1.8 (#14562)

Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12046 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Toshi MARUYAMA 2013-07-28 11:00:02 +00:00
parent 0ac3afebc6
commit 670d2b6e2b
5 changed files with 80 additions and 3 deletions

View File

@ -205,12 +205,20 @@ module Redmine
end end
end end
ending = -1 ending = -1
while ending >= -(max - starting) && line_left[ending] == line_right[ending] while ending >= -(max - starting) && (line_left[ending] == line_right[ending])
ending -= 1 ending -= 1
end end
if (! "".respond_to?(:force_encoding)) && ending > (-1 * line_left.size) if (! "".respond_to?(:force_encoding)) && ending > (-1 * line_left.size)
while line_left[ending].ord.between?(128, 191) && ending > -1 while line_left[ending].ord.between?(128, 255) && ending < -1
ending -= 1 if line_left[ending].ord.between?(128, 191)
if line_left[ending + 1].ord.between?(128, 191)
ending += 1
else
break
end
else
ending += 1
end
end end
end end
unless starting == 0 && ending == -1 unless starting == 0 && ending == -1

View File

@ -0,0 +1,7 @@
--- a.txt 2013-07-27 06:03:49.133257759 +0900
+++ b.txt 2013-07-27 06:03:58.791221118 +0900
@@ -1,3 +1,3 @@
aaaa
-日本記
+日本娘
bbbb

View File

@ -0,0 +1,7 @@
--- a.txt 2013-07-27 04:20:45.973229414 +0900
+++ b.txt 2013-07-27 04:20:52.366228105 +0900
@@ -1,3 +1,3 @@
aaaa
-日本記
+日本誘
bbbb

View File

@ -0,0 +1,7 @@
--- a.txt 2013-07-27 05:52:11.415223830 +0900
+++ b.txt 2013-07-27 05:52:18.249190358 +0900
@@ -1,3 +1,3 @@
aaaa
-日本記ok
+日本誘ok
bbbb

View File

@ -308,6 +308,54 @@ DIFF
end end
end end
def test_offset_range_japanese_3
# UTF-8 The 1st byte differs.
ja1 = "\xe6\x97\xa5\xe6\x9c\xac<span>\xe8\xa8\x98</span>"
ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding)
ja2 = "\xe6\x97\xa5\xe6\x9c\xac<span>\xe5\xa8\x98</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-3.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_4
# UTF-8 The 2nd byte differs.
ja1 = "\xe6\x97\xa5\xe6\x9c\xac<span>\xe8\xa8\x98</span>"
ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding)
ja2 = "\xe6\x97\xa5\xe6\x9c\xac<span>\xe8\xaa\x98</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-4.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_5
# UTF-8 The 2nd byte differs.
ja1 = "\xe6\x97\xa5\xe6\x9c\xac<span>\xe8\xa8\x98</span>ok"
ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding)
ja2 = "\xe6\x97\xa5\xe6\x9c\xac<span>\xe8\xaa\x98</span>ok"
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-5.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 private
def read_diff_fixture(filename) def read_diff_fixture(filename)