changeset 5176:c417ef1f43b1

diffs: avoid conflicts between inline diff mechanism and special markup It would sometimes emit markup like <pre><ins><u</ins> <ins>class</ins><ins>=</ins><ins>"cr</ins><ins>"></u></ins></pre> instead of <pre><ins><u class="cr"></u></ins></pre>
author Mads Kiilerich <madski@unity3d.com>
date Tue, 09 Jun 2015 22:50:20 +0200
parents 18b0e4d1ae58
children f47d6187095f
files kallithea/lib/diffs.py kallithea/tests/fixtures/markuptest.diff kallithea/tests/models/test_diff_parsers.py
diffstat 3 files changed, 48 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/lib/diffs.py	Tue Jun 09 22:50:20 2015 +0200
+++ b/kallithea/lib/diffs.py	Tue Jun 09 22:50:20 2015 +0200
@@ -193,8 +193,8 @@
         (?:^\+\+\+[ ](b/(?P<b_file>.+?)|/dev/null)\t?(?:\n|$))?
     """, re.VERBOSE | re.MULTILINE)
 
-    #used for inline highlighter word split
-    _token_re = re.compile(r'()(&gt;|&lt;|&amp;|<u>\t</u>| <i></i>|\W+?)')
+    # Used for inline highlighter word split, must match the substitutions in _escaper
+    _token_re = re.compile(r'()(&amp;|&lt;|&gt;|<u>\t</u>|<u class="cr"></u>| <i></i>|\W+?)')
 
     _escape_re = re.compile(r'(&)|(<)|(>)|(\t)|(\r)|(?<=.)( \n| $)')
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/fixtures/markuptest.diff	Tue Jun 09 22:50:20 2015 +0200
@@ -0,0 +1,17 @@
+diff --git a/f b/f
+--- a/f	
++++ b/f	
+@@ -51,5 +51,12 @@
+ 	begin();
+ 	
++	int foo;
++	int bar; 
++	int baz;	
++	int space; 
++	int tab;	
++	
+  
+-	#define MAX_STEPS (48)
++	
++	#define MAX_STEPS (64)
+ 
--- a/kallithea/tests/models/test_diff_parsers.py	Tue Jun 09 22:50:20 2015 +0200
+++ b/kallithea/tests/models/test_diff_parsers.py	Tue Jun 09 22:50:20 2015 +0200
@@ -275,3 +275,32 @@
         data = [(x['filename'], x['operation'], x['stats']) for x in diff_proc_d]
         expected_data = DIFF_FIXTURES[diff_fixture]
         self.assertListEqual(expected_data, data)
+
+    def test_diff_markup(self):
+        diff = fixture.load_resource('markuptest.diff', strip=False)
+        diff_proc = DiffProcessor(diff)
+        diff_proc_d = diff_proc.prepare()
+        chunks = diff_proc_d[0]['chunks']
+        self.assertFalse(chunks[0])
+        #from pprint import pprint; pprint(chunks[1])
+        l = ['\n']
+        for d in chunks[1]:
+            l.append('%(action)-7s %(new_lineno)3s %(old_lineno)3s %(line)r\n' % d)
+        s = ''.join(l)
+        print s
+        self.assertEqual(s, r'''
+context ... ... u'@@ -51,5 +51,12 @@\n'
+unmod    51  51 u'<u>\t</u>begin();\n'
+unmod    52  52 u'<u>\t</u>\n'
+add      53     u'<u>\t</u>int foo;<u class="cr"></u>\n'
+add      54     u'<u>\t</u>int bar; <u class="cr"></u>\n'
+add      55     u'<u>\t</u>int baz;<u>\t</u><u class="cr"></u>\n'
+add      56     u'<u>\t</u>int space; <i></i>'
+add      57     u'<u>\t</u>int tab;<u>\t</u>\n'
+add      58     u'<u>\t</u>\n'
+unmod    59  53 u' <i></i>'
+del          54 u'<u>\t</u><del>#define MAX_STEPS (48)</del>\n'
+add      60     u'<u>\t</u><ins><u class="cr"></u></ins>\n'
+add      61     u'<u>\t</u>#define MAX_STEPS (64)<u class="cr"></u>\n'
+unmod    62  55 u'\n'
+''')