Index: test/unit/lib/redmine/unified_diff_test.rb =================================================================== --- test/unit/lib/redmine/unified_diff_test.rb (revision 12041) +++ test/unit/lib/redmine/unified_diff_test.rb (working copy) @@ -308,6 +308,54 @@ end end + def test_offset_range_japanese_3 + # UTF-8 The 1st byte differs. + ja1 = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xa8\x98" + ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding) + ja2 = "\xe6\x97\xa5\xe6\x9c\xac\xe5\xa8\x98" + 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\xe8\xa8\x98" + ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding) + ja2 = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x98" + 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\xe8\xa8\x98ok" + ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding) + ja2 = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x98ok" + 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 def read_diff_fixture(filename) Index: test/fixtures/diffs/issue-13644-4.diff =================================================================== --- test/fixtures/diffs/issue-13644-4.diff (revision 0) +++ test/fixtures/diffs/issue-13644-4.diff (revision 0) @@ -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 Index: test/fixtures/diffs/issue-13644-5.diff =================================================================== --- test/fixtures/diffs/issue-13644-5.diff (revision 0) +++ test/fixtures/diffs/issue-13644-5.diff (revision 0) @@ -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 Index: test/fixtures/diffs/issue-13644-3.diff =================================================================== --- test/fixtures/diffs/issue-13644-3.diff (revision 0) +++ test/fixtures/diffs/issue-13644-3.diff (revision 0) @@ -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 Index: lib/redmine/unified_diff.rb =================================================================== --- lib/redmine/unified_diff.rb (revision 12041) +++ lib/redmine/unified_diff.rb (working copy) @@ -205,12 +205,20 @@ end end ending = -1 - while ending >= -(max - starting) && line_left[ending] == line_right[ending] + while ending >= -(max - starting) && (line_left[ending] == line_right[ending]) ending -= 1 end if (! "".respond_to?(:force_encoding)) && ending > (-1 * line_left.size) - while line_left[ending].ord.between?(128, 191) && ending > -1 - ending -= 1 + while line_left[ending].ord.between?(128, 255) && 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 unless starting == 0 && ending == -1