Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
 def test_preprocess(self):
     d = self.diff
     self.assertEquals(d._preprocess(None), None)
     self.assertEquals(d._preprocess('<br>&nbsp;'), '&lt;br&gt;&amp;nbsp;')
     self.assertEquals(d._preprocess('\ttabbed'), '    tabbed')
     # test non default tab size
     d = HtmlSideBySideDiff(2)
     self.assertEquals(d._preprocess('\ttabbed'), '  tabbed')
Exemplo n.º 4
0
 def test_preprocess(self):
     d = self.diff
     self.assertEquals(d._preprocess(None), None)
     self.assertEquals(d._preprocess("<br>&nbsp;"), "&lt;br&gt;&amp;nbsp;")
     self.assertEquals(d._preprocess("\ttabbed"), "    tabbed")
     # test non default tab size
     d = HtmlSideBySideDiff(2)
     self.assertEquals(d._preprocess("\ttabbed"), "  tabbed")
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
 def setUp(self):
     self.diff = HtmlSideBySideDiff()
Exemplo n.º 9
0
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>&nbsp;'), '&lt;br&gt;&amp;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
Exemplo n.º 10
0
 def setUp(self):
     self.diff = HtmlSideBySideDiff()
Exemplo n.º 11
0
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>&nbsp;"), "&lt;br&gt;&amp;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