You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2020/09/17 17:46:57 UTC

[allura] branch master updated: [#8375] better py2/3 unified_diff fix with a test

This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git


The following commit(s) were added to refs/heads/master by this push:
     new 7457fb9  [#8375] better py2/3 unified_diff fix with a test
7457fb9 is described below

commit 7457fb926472e02a5602deb7cc688ab56722722f
Author: Dave Brondsema <da...@brondsema.net>
AuthorDate: Thu Sep 17 13:45:03 2020 -0400

    [#8375] better py2/3 unified_diff fix with a test
---
 Allura/allura/controllers/repository.py            |  7 ++--
 Allura/allura/model/stats.py                       |  5 +--
 .../forgegit/tests/functional/test_controllers.py  | 40 ++++++++++++++++++++++
 3 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index 5191413..77a4d0f 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -900,8 +900,9 @@ class FileBrowser(BaseController):
             return dict(a=a, b=b, diff=diff)
 
         # could consider making Blob.__iter__ do unicode conversion?
-        la = [h.really_unicode(line) for line in a]
-        lb = [h.really_unicode(line) for line in b]
+        # py2 unified_diff can handle some unicode but not consistently, so best to do ensure_str (can drop it on py3)
+        la = [six.ensure_str(h.really_unicode(line)) for line in a]
+        lb = [six.ensure_str(h.really_unicode(line)) for line in b]
         adesc = 'a' + h.really_unicode(apath)
         bdesc = 'b' + h.really_unicode(b.path())
 
@@ -919,6 +920,8 @@ class FileBrowser(BaseController):
                 hd = HtmlSideBySideDiff()
                 diff = hd.make_table(la, lb, adesc, bdesc)
         else:
+            # py2 unified_diff can handle some unicode but not consistently, so best to do str() and ensure_str()
+            # (can drop it on py3)
             diff = str('').join(difflib.unified_diff(la, lb, six.ensure_str(adesc), six.ensure_str(bdesc)))
         return dict(a=a, b=b, diff=diff)
 
diff --git a/Allura/allura/model/stats.py b/Allura/allura/model/stats.py
index 80966b8..6daddaa 100644
--- a/Allura/allura/model/stats.py
+++ b/Allura/allura/model/stats.py
@@ -371,9 +371,10 @@ class Stats(MappedClass):
             if oldblob is None:
                 lines = len(listnew)
             elif newblob and newblob.has_html_view:
+                # py2 unified_diff can handle some unicode but not consistently, so best to do ensure_str (can drop it on py3)
                 diff = difflib.unified_diff(
-                    [h.really_unicode(line) for line in listold],
-                    [h.really_unicode(line) for line in listnew],
+                    [six.ensure_str(h.really_unicode(line)) for line in listold],
+                    [six.ensure_str(h.really_unicode(line)) for line in listnew],
                     six.ensure_str('old' + oldblob.path()),
                     six.ensure_str('new' + newblob.path()))
                 lines = len(
diff --git a/ForgeGit/forgegit/tests/functional/test_controllers.py b/ForgeGit/forgegit/tests/functional/test_controllers.py
index c5c679a..b966fc6 100644
--- a/ForgeGit/forgegit/tests/functional/test_controllers.py
+++ b/ForgeGit/forgegit/tests/functional/test_controllers.py
@@ -25,6 +25,7 @@ import re
 import os
 import shutil
 import tempfile
+import textwrap
 
 from datadiff.tools import assert_equal as dd_assert_equal
 from nose.tools import assert_equal, assert_in, assert_not_in, assert_not_equal
@@ -321,6 +322,45 @@ class TestRootController(_TestCase):
         assert 'readme' in resp, resp.showbrowser()
         assert '+++' in resp, resp.showbrowser()
 
+    def test_diff_weirdchars(self):
+        self._setup_weird_chars_repo()
+        ci = self._get_ci(repo='/p/test/weird-chars/')
+        resp = self.app.get(h.urlquote(ci + 'tree/привіт.txt') + '?diff=407950e8fba4dbc108ffbce0128ed1085c52cfd7')
+        diffhtml = six.text_type(resp.html.select_one('.diffbrowser'))
+        assert_in(textwrap.dedent('''\
+                    <span class="gd">--- a/привіт.txt</span>
+                    <span class="gi">+++ b/привіт.txt</span>
+                    <span class="gu">@@ -1 +1,2 @@</span>
+                     Привіт!
+                    <span class="gi">+Which means Hello!</span>'''),
+                  diffhtml)
+
+        resp = self.app.get(h.urlquote(ci + 'tree/привіт.txt') + '?diff=407950e8fba4dbc108ffbce0128ed1085c52cfd7&diformat=sidebyside')
+        diffhtml = six.text_type(resp.html.select_one('.diffbrowser'))
+        assert_in(textwrap.dedent('''\
+                    <thead>
+                    <th class="lineno"></th>
+                    <th>a/привіт.txt</th>
+                    <th class="lineno"></th>
+                    <th>b/привіт.txt</th>
+                    </thead>
+                    <tr>
+                    <td class="lineno">1</td>
+                    <td><pre>Привіт!
+                    </pre></td>
+                    <td class="lineno">1</td>
+                    <td><pre>Привіт!
+                    </pre></td>
+                    </tr>
+                    <tr>
+                    <td class="lineno"></td>
+                    <td><pre>
+                    </pre></td>
+                    <td class="lineno">2</td>
+                    <td class="diff-add"><pre>Which means Hello!
+                    </pre></td>'''),
+                  diffhtml)
+
     def test_diff_view_mode(self):
         ci = self._get_ci()
         fn = 'tree/README?diff=df30427c488aeab84b2352bdf88a3b19223f9d7a'