]> source.dussan.org Git - redmine.git/commitdiff
fix diff error in case of line_left out of range (#13644)
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Fri, 5 Apr 2013 07:30:51 +0000 (07:30 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Fri, 5 Apr 2013 07:30:51 +0000 (07:30 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11707 e93f8b46-1217-0410-a6f0-8f06a7374b81

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

index 968922a504c3ade22dc7cd6a6750b41ec6631560..548003220d7025899a21ec4325793abaf10c2517 100644 (file)
@@ -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 (file)
index 0000000..3c25c97
--- /dev/null
@@ -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 (file)
index 0000000..3bf1425
--- /dev/null
@@ -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
index cbc5cec45e6b253fbd3ae189d4fefa93e910e5f7..7e1ccbdd9c78835427b9ca1e5181a7c7cf8947f1 100644 (file)
@@ -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)