]> source.dussan.org Git - redmine.git/commitdiff
fix diff of CJK(Chinese/Japanese/Korean) is broken on Ruby 1.8 (#14562)
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Sun, 28 Jul 2013 11:00:02 +0000 (11:00 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Sun, 28 Jul 2013 11:00:02 +0000 (11:00 +0000)
Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12046 e93f8b46-1217-0410-a6f0-8f06a7374b81

lib/redmine/unified_diff.rb
test/fixtures/diffs/issue-13644-3.diff [new file with mode: 0644]
test/fixtures/diffs/issue-13644-4.diff [new file with mode: 0644]
test/fixtures/diffs/issue-13644-5.diff [new file with mode: 0644]
test/unit/lib/redmine/unified_diff_test.rb

index 548003220d7025899a21ec4325793abaf10c2517..170ae1db85b821ce698b7c814bf4606e92a6d5eb 100644 (file)
@@ -205,12 +205,20 @@ module Redmine
           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
diff --git a/test/fixtures/diffs/issue-13644-3.diff b/test/fixtures/diffs/issue-13644-3.diff
new file mode 100644 (file)
index 0000000..782b160
--- /dev/null
@@ -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
diff --git a/test/fixtures/diffs/issue-13644-4.diff b/test/fixtures/diffs/issue-13644-4.diff
new file mode 100644 (file)
index 0000000..6309a5b
--- /dev/null
@@ -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
diff --git a/test/fixtures/diffs/issue-13644-5.diff b/test/fixtures/diffs/issue-13644-5.diff
new file mode 100644 (file)
index 0000000..033d6ed
--- /dev/null
@@ -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 7e1ccbdd9c78835427b9ca1e5181a7c7cf8947f1..4dd5357db9c3e936dd108d796b6f75a41f61e8df 100644 (file)
@@ -308,6 +308,54 @@ DIFF
     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
 
   def read_diff_fixture(filename)