def diff(self, commit, fmt=None, **kw): try: path, filename = os.path.split(self._blob.path()) a_ci = c.app.repo.commit(commit) a = a_ci.get_path(self._blob.path()) apath = a.path() except: a = [] apath = '' b = self._blob if not self._blob.has_html_view: diff = "Cannot display: file marked as a binary type." return dict(a=a, b=b, diff=diff) la = list(a) lb = list(b) adesc = (u'a' + h.really_unicode(apath)).encode('utf-8') bdesc = (u'b' + h.really_unicode(b.path())).encode('utf-8') if not fmt: fmt = web_session.get('diformat', '') else: web_session['diformat'] = fmt web_session.save() if fmt == 'sidebyside': hd = HtmlSideBySideDiff() diff = hd.make_table(la, lb, adesc, bdesc) else: diff = ''.join(difflib.unified_diff(la, lb, adesc, bdesc)) return dict(a=a, b=b, diff=diff)
def diff(self, commit, fmt=None): try: path, filename = os.path.split(self._blob.path()) a_ci = c.app.repo.commit(commit) a = a_ci.get_path(self._blob.path()) apath = a.path() except: a = [] apath = '' b = self._blob if not self._blob.has_html_view: diff = "Cannot display: file marked as a binary type." return dict(a=a, b=b, diff=diff) la = list(a) lb = list(b) adesc = (u'a' + h.really_unicode(apath)).encode('utf-8') bdesc = (u'b' + h.really_unicode(b.path())).encode('utf-8') if not fmt: fmt = web_session.get('diformat', '') else: web_session['diformat'] = fmt web_session.save() if fmt == 'sidebyside': hd = HtmlSideBySideDiff() diff = hd.make_table(la, lb, adesc, bdesc) else: diff = ''.join(difflib.unified_diff(la, lb, adesc, bdesc)) return dict(a=a, b=b, diff=diff)
def test_preprocess(self): d = self.diff self.assertEquals(d._preprocess(None), None) self.assertEquals(d._preprocess('<br> '), '<br>&nbsp;') self.assertEquals(d._preprocess('\ttabbed'), ' tabbed') # test non default tab size d = HtmlSideBySideDiff(2) self.assertEquals(d._preprocess('\ttabbed'), ' tabbed')
def test_preprocess(self): d = self.diff self.assertEquals(d._preprocess(None), None) self.assertEquals(d._preprocess("<br> "), "<br>&nbsp;") self.assertEquals(d._preprocess("\ttabbed"), " tabbed") # test non default tab size d = HtmlSideBySideDiff(2) self.assertEquals(d._preprocess("\ttabbed"), " tabbed")
def diff(self, prev_commit, fmt=None, prev_file=None, **kw): ''' :param prev_commit: previous commit to compare against :param fmt: "sidebyside", or anything else for "unified" :param prev_file: previous filename, if different :return: ''' try: path, filename = os.path.split(self._blob.path()) a_ci = c.app.repo.commit(prev_commit) a = a_ci.get_path(prev_file or self._blob.path()) apath = a.path() except Exception: # prev commit doesn't have the file a = M.repository.EmptyBlob() apath = '' b = self._blob if not self._blob.has_html_view: diff = "Cannot display: file marked as a binary type." return dict(a=a, b=b, diff=diff) # could consider making Blob.__iter__ do unicode conversion? # 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()) if not fmt: fmt = web_session.get('diformat', '') else: web_session['diformat'] = fmt web_session.save() if fmt == 'sidebyside': if max(a.size, b.size) > asint( tg.config.get('scm.view.max_syntax_highlight_bytes', 500000)): # have to check the original file size, not diff size, because difflib._mdiff inside HtmlSideBySideDiff # can take an extremely long time on large files (and its even a generator) diff = '<em>File too large for side-by-side view</em>' else: 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)
def diff(self, prev_commit, fmt=None, prev_file=None, **kw): ''' :param prev_commit: previous commit to compare against :param fmt: "sidebyside", or anything else for "unified" :param prev_file: previous filename, if different :return: ''' try: path, filename = os.path.split(self._blob.path()) a_ci = c.app.repo.commit(prev_commit) a = a_ci.get_path(prev_file or self._blob.path()) apath = a.path() except: # prev commit doesn't have the file a = [] apath = '' b = self._blob if not self._blob.has_html_view: diff = "Cannot display: file marked as a binary type." return dict(a=a, b=b, diff=diff) la = list(a) lb = list(b) adesc = (u'a' + h.really_unicode(apath)).encode('utf-8') bdesc = (u'b' + h.really_unicode(b.path())).encode('utf-8') if not fmt: fmt = web_session.get('diformat', '') else: web_session['diformat'] = fmt web_session.save() if fmt == 'sidebyside': hd = HtmlSideBySideDiff() diff = hd.make_table(la, lb, adesc, bdesc) else: diff = ''.join(difflib.unified_diff(la, lb, adesc, bdesc)) return dict(a=a, b=b, diff=diff)
def diff(self, prev_commit, fmt=None, prev_file=None, **kw): ''' :param prev_commit: previous commit to compare against :param fmt: "sidebyside", or anything else for "unified" :param prev_file: previous filename, if different :return: ''' try: path, filename = os.path.split(self._blob.path()) a_ci = c.app.repo.commit(prev_commit) a = a_ci.get_path(prev_file or self._blob.path()) apath = a.path() except: # prev commit doesn't have the file a = [] apath = '' b = self._blob if not self._blob.has_html_view: diff = "Cannot display: file marked as a binary type." return dict(a=a, b=b, diff=diff) la = list(a) lb = list(b) adesc = (u'a' + h.really_unicode(apath)).encode('utf-8') bdesc = (u'b' + h.really_unicode(b.path())).encode('utf-8') if not fmt: fmt = web_session.get('diformat', '') else: web_session['diformat'] = fmt web_session.save() if fmt == 'sidebyside': hd = HtmlSideBySideDiff() diff = hd.make_table(la, lb, adesc, bdesc) else: diff = ''.join(difflib.unified_diff(la, lb, adesc, bdesc)) return dict(a=a, b=b, diff=diff)
def setUp(self): self.diff = HtmlSideBySideDiff()
class TestHtmlSideBySideDiff(unittest.TestCase): def setUp(self): self.diff = HtmlSideBySideDiff() def test_render_change(self): html = self.diff._render_change( 'aline', 'aline <span class="diff-add">bline</span>', 1, 2, 'aclass', 'bclass') expected = ''' <tr> <td class="lineno">1</td> <td class="aclass"><pre>aline</pre></td> <td class="lineno">2</td> <td class="bclass"><pre>aline <span class="diff-add">bline</span></pre></td> </tr>'''.strip() self.assertEqual(html, expected) def test_render_change_default_args(self): html = self.diff._render_change('aline', 'bline') expected = ''' <tr> <td class="lineno"></td> <td><pre>aline</pre></td> <td class="lineno"></td> <td><pre>bline</pre></td> </tr>'''.strip() self.assertEqual(html, expected) def test_preprocess(self): d = self.diff self.assertEquals(d._preprocess(None), None) self.assertEquals(d._preprocess('<br> '), '<br>&nbsp;') self.assertEquals(d._preprocess('\ttabbed'), ' tabbed') # test non default tab size d = HtmlSideBySideDiff(2) self.assertEquals(d._preprocess('\ttabbed'), ' tabbed') def test_replace_marks(self): line, flag = self.diff._replace_marks('\0+line added\1') self.assertEquals(line, 'line added') self.assertEquals(flag, 'diff-add') line, flag = self.diff._replace_marks('\0-line removed\1') self.assertEquals(line, 'line removed') self.assertEquals(flag, 'diff-rem') line, flag = self.diff._replace_marks('\0^line changed\1') self.assertEquals(line, '<span class="diff-chg">line changed</span>') self.assertEquals(flag, 'diff-chg') line, flag = self.diff._replace_marks('chunk \0+add\1ed') self.assertEquals(line, 'chunk <span class="diff-add">add</span>ed') self.assertEquals(flag, 'diff-chg') line, flag = self.diff._replace_marks('chunk \0-remov\1ed') self.assertEquals(line, 'chunk <span class="diff-rem">remov</span>ed') self.assertEquals(flag, 'diff-chg') line, flag = self.diff._replace_marks('chunk \0^chang\1ed') self.assertEquals(line, 'chunk <span class="diff-chg">chang</span>ed') self.assertEquals(flag, 'diff-chg') def test_make_line(self): # context separation d = (None, None, None) expected = ''' <tr> <td class="lineno"></td> <td class="diff-gap"><pre>...</pre></td> <td class="lineno"></td> <td class="diff-gap"><pre>...</pre></td> </tr>'''.strip() self.assertEquals(self.diff._make_line(d), expected) # no change d = ((1, 'aline'), (1, 'aline'), False) expected = ''' <tr> <td class="lineno">1</td> <td><pre>aline</pre></td> <td class="lineno">1</td> <td><pre>aline</pre></td> </tr>'''.strip() self.assertEquals(self.diff._make_line(d), expected) # has change d = ((1, '\0^a\1line'), (1, '\0^b\1line'), True) expected = ''' <tr> <td class="lineno">1</td> <td class="diff-chg"><pre><span class="diff-chg">a</span>line</pre></td> <td class="lineno">1</td> <td class="diff-chg"><pre><span class="diff-chg">b</span>line</pre></td> </tr>'''.strip() self.assertEquals(self.diff._make_line(d), expected) def test_make_table(self): a = 'line 1\nline 2'.split('\n') b = 'changed line 1\nchanged line 2'.split('\n') expected = ''' <table class="side-by-side-diff"> <thead> <th class="lineno"></th> <th>file a</th> <th class="lineno"></th> <th>file b</th> </thead> <tr> <td class="lineno">1</td> <td class="diff-rem"><pre>line 1</pre></td> <td class="lineno">1</td> <td class="diff-add"><pre>changed line 1</pre></td> </tr> <tr> <td class="lineno">2</td> <td class="diff-rem"><pre>line 2</pre></td> <td class="lineno">2</td> <td class="diff-add"><pre>changed line 2</pre></td> </tr> </table> '''.strip() html = self.diff.make_table(a, b, 'file a', 'file b') self.assertEquals(html, expected) def test_unicode_make_table(self): a = ['строка'] b = ['измененная строка'] html = self.diff.make_table(a, b, 'file a', 'file b') assert 'строка' in html
def setUp(self): self.diff = HtmlSideBySideDiff()
class TestHtmlSideBySideDiff(unittest.TestCase): def setUp(self): self.diff = HtmlSideBySideDiff() def test_render_change(self): html = self.diff._render_change("aline", 'aline <span class="diff-add">bline</span>', 1, 2, "aclass", "bclass") expected = """ <tr> <td class="lineno">1</td> <td class="aclass"><pre>aline</pre></td> <td class="lineno">2</td> <td class="bclass"><pre>aline <span class="diff-add">bline</span></pre></td> </tr>""".strip() self.assertEqual(html, expected) def test_render_change_default_args(self): html = self.diff._render_change("aline", "bline") expected = """ <tr> <td class="lineno"></td> <td><pre>aline</pre></td> <td class="lineno"></td> <td><pre>bline</pre></td> </tr>""".strip() self.assertEqual(html, expected) def test_preprocess(self): d = self.diff self.assertEquals(d._preprocess(None), None) self.assertEquals(d._preprocess("<br> "), "<br>&nbsp;") self.assertEquals(d._preprocess("\ttabbed"), " tabbed") # test non default tab size d = HtmlSideBySideDiff(2) self.assertEquals(d._preprocess("\ttabbed"), " tabbed") def test_replace_marks(self): line, flag = self.diff._replace_marks("\0+line added\1") self.assertEquals(line, "line added") self.assertEquals(flag, "diff-add") line, flag = self.diff._replace_marks("\0-line removed\1") self.assertEquals(line, "line removed") self.assertEquals(flag, "diff-rem") line, flag = self.diff._replace_marks("\0^line changed\1") self.assertEquals(line, '<span class="diff-chg">line changed</span>') self.assertEquals(flag, "diff-chg") line, flag = self.diff._replace_marks("chunk \0+add\1ed") self.assertEquals(line, 'chunk <span class="diff-add">add</span>ed') self.assertEquals(flag, "diff-chg") line, flag = self.diff._replace_marks("chunk \0-remov\1ed") self.assertEquals(line, 'chunk <span class="diff-rem">remov</span>ed') self.assertEquals(flag, "diff-chg") line, flag = self.diff._replace_marks("chunk \0^chang\1ed") self.assertEquals(line, 'chunk <span class="diff-chg">chang</span>ed') self.assertEquals(flag, "diff-chg") def test_make_line(self): # context separation d = (None, None, None) expected = """ <tr> <td class="lineno"></td> <td class="diff-gap"><pre>...</pre></td> <td class="lineno"></td> <td class="diff-gap"><pre>...</pre></td> </tr>""".strip() self.assertEquals(self.diff._make_line(d), expected) # no change d = ((1, "aline"), (1, "aline"), False) expected = """ <tr> <td class="lineno">1</td> <td><pre>aline</pre></td> <td class="lineno">1</td> <td><pre>aline</pre></td> </tr>""".strip() self.assertEquals(self.diff._make_line(d), expected) # has change d = ((1, "\0^a\1line"), (1, "\0^b\1line"), True) expected = """ <tr> <td class="lineno">1</td> <td class="diff-chg"><pre><span class="diff-chg">a</span>line</pre></td> <td class="lineno">1</td> <td class="diff-chg"><pre><span class="diff-chg">b</span>line</pre></td> </tr>""".strip() self.assertEquals(self.diff._make_line(d), expected) def test_make_table(self): a = "line 1\nline 2".split("\n") b = "changed line 1\nchanged line 2".split("\n") expected = """ <table class="side-by-side-diff"> <thead> <th class="lineno"></th> <th>file a</th> <th class="lineno"></th> <th>file b</th> </thead> <tr> <td class="lineno">1</td> <td class="diff-rem"><pre>line 1</pre></td> <td class="lineno">1</td> <td class="diff-add"><pre>changed line 1</pre></td> </tr> <tr> <td class="lineno">2</td> <td class="diff-rem"><pre>line 2</pre></td> <td class="lineno">2</td> <td class="diff-add"><pre>changed line 2</pre></td> </tr> </table> """.strip() html = self.diff.make_table(a, b, "file a", "file b") self.assertEquals(html, expected) def test_unicode_make_table(self): a = ["строка"] b = ["измененная строка"] html = self.diff.make_table(a, b, "file a", "file b") assert u"строка" in html