示例#1
0
 def _my_diff(self, old_content, new_content):
     # Determine the difference between two text items.
     if old_content != new_content:
         context = 0
         if context < 0:
             context = None
         return hdf_diff(old_content.splitlines(),
                         new_content.splitlines(),
                         context,
                         tabwidth=8,
                         ignore_blank_lines=True,
                         ignore_case=True,
                         ignore_space_changes=True)
示例#2
0
 def _my_diff(self, old_content, new_content):
     # Determine the difference between two text items.
     if old_content != new_content:
         context = 0
         if context < 0:
             context = None
         return hdf_diff(
             old_content.splitlines(),
             new_content.splitlines(),
             context,
             tabwidth=8,
             ignore_blank_lines=True,
             ignore_case=True,
             ignore_space_changes=True,
         )
示例#3
0
    def _diff_cr(self, req):
        add_stylesheet(req, 'common/css/diff.css')
        cs_id = req.args.get('id')
        old_version = req.args.get('old_version', 1)
        version = req.args.get('version', 1)
        db = self.env.get_db_cnx()
        cursor = db.cursor()
        try:
            version_author, version_status, newtext = self._get_version_record(
                cursor, cs_id, version)
            oldversion_author, oldversion_status, oldtext = self._get_version_record(
                cursor, cs_id, old_version)
        except ValueError:
            return pretty_err(req, 'Version Error')
        ctime = round(time.time(), 2)
        diff_style, diff_options = get_diff_options(req)
        context = 3
        for option in diff_options:
            if option.startswith('-U'):
                context = int(option[2:])
                break
        if context < 0:
            context = None
        changes = hdf_diff(oldtext.splitlines(),
                           newtext.splitlines(),
                           context=context,
                           ignore_blank_lines='-B' in diff_options,
                           ignore_case='-i' in diff_options,
                           ignore_space_changes='-b' in diff_options)
        req.hdf['version.diff'] = changes

        req.hdf['version_author'] = version_author
        req.hdf['oldversion_author'] = oldversion_author
        req.hdf['version_status'] = status_str[version_status]
        req.hdf['oldversion_status'] = status_str[oldversion_status]
        req.hdf['ctime'] = time.ctime(ctime)
        req.hdf['old_version'] = old_version
        req.hdf['version'] = version
        req.hdf['rev'] = cs_id
        req.hdf['update.href'] = self.env.href.CodeReview(cs_id, action='diff')
        return 'codereviewdiff.cs', None
示例#4
0
文件: changeset.py 项目: yeoupooh/tow
        def _content_changes(old_node, new_node):
            """Returns the list of differences.

            The list is empty when no differences between comparable files
            are detected, but the return value is None for non-comparable files.
            """
            old_content = old_node.get_content().read()
            if is_binary(old_content):
                return None

            new_content = new_node.get_content().read()
            if is_binary(new_content):
                return None

            mview = Mimeview(self.env)
            old_content = mview.to_unicode(old_content, old_node.content_type)
            new_content = mview.to_unicode(new_content, new_node.content_type)

            if old_content != new_content:
                context = 3
                options = diff_options[1]
                for option in options:
                    if option.startswith('-U'):
                        context = int(option[2:])
                        break
                if context < 0:
                    context = None
                tabwidth = self.config['diff'].getint('tab_width') or \
                           self.config['mimeviewer'].getint('tab_width', 8)
                return hdf_diff(old_content.splitlines(),
                                new_content.splitlines(),
                                context, tabwidth,
                                ignore_blank_lines='-B' in options,
                                ignore_case='-i' in options,
                                ignore_space_changes='-b' in options)
            else:
                return []
示例#5
0
        def _content_changes(old_node, new_node):
            """Returns the list of differences.

            The list is empty when no differences between comparable files
            are detected, but the return value is None for non-comparable files.
            """
            old_content = old_node.get_content().read()
            if is_binary(old_content):
                return None

            new_content = new_node.get_content().read()
            if is_binary(new_content):
                return None

            mview = Mimeview(self.env)
            old_content = mview.to_unicode(old_content, old_node.content_type)
            new_content = mview.to_unicode(new_content, new_node.content_type)

            if old_content != new_content:
                context = 3
                options = diff_options[1]
                for option in options:
                    if option.startswith('-U'):
                        context = int(option[2:])
                        break
                if context < 0:
                    context = None
                tabwidth = self.config['diff'].getint('tab_width') or \
                           self.config['mimeviewer'].getint('tab_width', 8)
                return hdf_diff(old_content.splitlines(),
                                new_content.splitlines(),
                                context, tabwidth,
                                ignore_blank_lines='-B' in options,
                                ignore_case='-i' in options,
                                ignore_space_changes='-b' in options)
            else:
                return []
示例#6
0
    def _diff_cr(self, req):
        add_stylesheet(req, 'common/css/diff.css')
        cs_id = req.args.get('id')
        old_version = req.args.get('old_version', 1)
        version = req.args.get('version', 1)
        db = self.env.get_db_cnx()
        cursor = db.cursor()
        try:
            version_author, version_status, newtext = self._get_version_record(cursor, cs_id, version)
            oldversion_author, oldversion_status, oldtext = self._get_version_record(cursor, cs_id, old_version)
        except ValueError:
            return pretty_err(req, 'Version Error')
        ctime = round(time.time(), 2)
        diff_style, diff_options = get_diff_options(req)
        context = 3
        for option in diff_options:
            if option.startswith('-U'):
                context = int(option[2:])
                break
        if context < 0:
            context = None
        changes = hdf_diff(oldtext.splitlines(), newtext.splitlines(), context=context,
                           ignore_blank_lines='-B' in diff_options,
                           ignore_case='-i' in diff_options,
                           ignore_space_changes='-b' in diff_options)
        req.hdf['version.diff'] = changes

        req.hdf['version_author'] = version_author
        req.hdf['oldversion_author'] = oldversion_author
        req.hdf['version_status'] = status_str[version_status]
        req.hdf['oldversion_status'] = status_str[oldversion_status]
        req.hdf['ctime'] = time.ctime(ctime)
        req.hdf['old_version'] = old_version
        req.hdf['version'] = version
        req.hdf['rev'] = cs_id
        req.hdf['update.href'] = self.env.href.CodeReview(cs_id, action='diff')
        return 'codereviewdiff.cs', None
示例#7
0
    def _render_html(self, req, repos, chgset, diff_options):
        """HTML version"""
        req.hdf['title'] = '[%s]' % chgset.rev
        req.hdf['changeset'] = {
            'revision':
            chgset.rev,
            'time':
            time.strftime('%c', time.localtime(chgset.date)),
            'author':
            util.escape(chgset.author or 'anonymous'),
            'message':
            wiki_to_html(chgset.message or '--',
                         self.env,
                         req,
                         escape_newlines=True)
        }

        oldest_rev = repos.oldest_rev
        if chgset.rev != oldest_rev:
            add_link(req, 'first', self.env.href.changeset(oldest_rev),
                     'Changeset %s' % oldest_rev)
            previous_rev = repos.previous_rev(chgset.rev)
            add_link(req, 'prev', self.env.href.changeset(previous_rev),
                     'Changeset %s' % previous_rev)
        youngest_rev = repos.youngest_rev
        if str(chgset.rev) != str(youngest_rev):
            next_rev = repos.next_rev(chgset.rev)
            add_link(req, 'next', self.env.href.changeset(next_rev),
                     'Changeset %s' % next_rev)
            add_link(req, 'last', self.env.href.changeset(youngest_rev),
                     'Changeset %s' % youngest_rev)

        edits = []
        idx = 0
        for path, kind, change, base_path, base_rev in chgset.get_changes():
            info = {'change': change}
            if base_path:
                info['path.old'] = base_path
                info['rev.old'] = base_rev
                info['browser_href.old'] = self.env.href.browser(base_path,
                                                                 rev=base_rev)
            if path:
                info['path.new'] = path
                info['rev.new'] = chgset.rev
                info['browser_href.new'] = self.env.href.browser(
                    path, rev=chgset.rev)
            if change in (Changeset.COPY, Changeset.EDIT, Changeset.MOVE):
                edits.append((idx, path, kind, base_path, base_rev))
            req.hdf['changeset.changes.%d' % idx] = info
            idx += 1

        hidden_properties = [
            p.strip() for p in self.config.get('browser', 'hide_properties',
                                               'svk:merge').split(',')
        ]

        for idx, path, kind, base_path, base_rev in edits:
            old_node = repos.get_node(base_path or path, base_rev)
            new_node = repos.get_node(path, chgset.rev)

            # Property changes
            old_props = old_node.get_properties()
            new_props = new_node.get_properties()
            changed_props = {}
            if old_props != new_props:
                for k, v in old_props.items():
                    if not k in new_props:
                        changed_props[k] = {'old': v}
                    elif v != new_props[k]:
                        changed_props[k] = {'old': v, 'new': new_props[k]}
                for k, v in new_props.items():
                    if not k in old_props:
                        changed_props[k] = {'new': v}
                for k in hidden_properties:
                    if k in changed_props:
                        del changed_props[k]
                req.hdf['changeset.changes.%d.props' % idx] = changed_props

            if kind == Node.DIRECTORY:
                continue

            # Content changes
            default_charset = self.config.get('trac', 'default_charset')
            old_content = old_node.get_content().read()
            if mimeview.is_binary(old_content):
                continue
            charset = mimeview.get_charset(old_node.content_type) or \
                      default_charset
            old_content = util.to_utf8(old_content, charset)

            new_content = new_node.get_content().read()
            if mimeview.is_binary(new_content):
                continue
            charset = mimeview.get_charset(new_node.content_type) or \
                      default_charset
            new_content = util.to_utf8(new_content, charset)

            if old_content != new_content:
                context = 3
                for option in diff_options[1]:
                    if option.startswith('-U'):
                        context = int(option[2:])
                        break
                tabwidth = int(
                    self.config.get('diff', 'tab_width',
                                    self.config.get('mimeviewer',
                                                    'tab_width')))
                changes = hdf_diff(old_content.splitlines(),
                                   new_content.splitlines(),
                                   context,
                                   tabwidth,
                                   ignore_blank_lines='-B' in diff_options[1],
                                   ignore_case='-i' in diff_options[1],
                                   ignore_space_changes='-b'
                                   in diff_options[1])
                req.hdf['changeset.changes.%d.diff' % idx] = changes
示例#8
0
    def _render_diff(self, req, db, page):
        req.perm.assert_permission('WIKI_VIEW')

        if not page.exists:
            raise TracError, "Version %s of page %s does not exist" \
                             % (req.args.get('version'), page.name)

        add_stylesheet(req, 'common/css/diff.css')

        req.hdf['title'] = escape(page.name) + ' (diff)'

        # Ask web spiders to not index old versions
        req.hdf['html.norobots'] = 1

        old_version = req.args.get('old_version')
        if old_version:
            old_version = int(old_version)
            if old_version == page.version:
                old_version = None
            elif old_version > page.version:
                old_version, page = page.version, \
                                    WikiPage(self.env, page.name, old_version)

        info = {
            'version': page.version,
            'history_href':
            escape(self.env.href.wiki(page.name, action='history'))
        }

        num_changes = 0
        old_page = None
        for version, t, author, comment, ipnr in page.get_history():
            if version == page.version:
                if t:
                    info['time'] = format_datetime(t)
                    info['time_delta'] = pretty_timedelta(t)
                info['author'] = escape(author or 'anonymous')
                info['comment'] = escape(comment or '--')
                info['ipnr'] = escape(ipnr or '')
            else:
                num_changes += 1
                if version < page.version:
                    if (old_version and version == old_version) or \
                            not old_version:
                        old_page = WikiPage(self.env, page.name, version)
                        info['num_changes'] = num_changes
                        info['old_version'] = version
                        break

        req.hdf['wiki'] = info

        diff_style, diff_options = get_diff_options(req)

        oldtext = old_page and old_page.text.splitlines() or []
        newtext = page.text.splitlines()
        context = 3
        for option in diff_options:
            if option.startswith('-U'):
                context = int(option[2:])
                break
        if context < 0:
            context = None
        changes = hdf_diff(oldtext,
                           newtext,
                           context=context,
                           ignore_blank_lines='-B' in diff_options,
                           ignore_case='-i' in diff_options,
                           ignore_space_changes='-b' in diff_options)
        req.hdf['wiki.diff'] = changes
示例#9
0
    def _render_diff(self, req, db, page):
        req.perm.assert_permission('WIKI_VIEW')

        if not page.exists:
            raise TracError("Version %s of page %s does not exist" %
                            (req.args.get('version'), page.name))

        add_stylesheet(req, 'common/css/diff.css')

        self._set_title(req, page, u'变化')

        # Ask web spiders to not index old versions
        req.hdf['html.norobots'] = 1

        old_version = req.args.get('old_version')
        if old_version:
            old_version = int(old_version)
            if old_version == page.version:
                old_version = None
            elif old_version > page.version: # FIXME: what about reverse diffs?
                old_version, page = page.version, \
                                    WikiPage(self.env, page.name, old_version)
        latest_page = WikiPage(self.env, page.name)
        new_version = int(page.version)
        info = {
            'version': new_version,
            'latest_version': latest_page.version,
            'history_href': req.href.wiki(page.name, action='history')
        }

        num_changes = 0
        old_page = None
        prev_version = next_version = None
        for version,t,author,comment,ipnr in latest_page.get_history():
            if version == new_version:
                if t:
                    info['time'] = format_datetime(t)
                    info['time_delta'] = pretty_timedelta(t)
                info['author'] = author or 'anonymous'
                info['comment'] = wiki_to_html(comment or '--',
                                               self.env, req, db)
                info['ipnr'] = ipnr or ''
            else:
                if version < new_version:
                    num_changes += 1
                    if not prev_version:
                        prev_version = version
                    if (old_version and version == old_version) or \
                            not old_version:
                        old_page = WikiPage(self.env, page.name, version)
                        info['num_changes'] = num_changes
                        info['old_version'] = version
                        break
                else:
                    next_version = version
        req.hdf['wiki'] = info

        # -- prev/next links
        if prev_version:
            add_link(req, 'prev', req.href.wiki(page.name, action='diff',
                                                version=prev_version),
                     'Version %d' % prev_version)
        if next_version:
            add_link(req, 'next', req.href.wiki(page.name, action='diff',
                                                version=next_version),
                     'Version %d' % next_version)

        # -- text diffs
        diff_style, diff_options = get_diff_options(req)

        oldtext = old_page and old_page.text.splitlines() or []
        newtext = page.text.splitlines()
        context = 3
        for option in diff_options:
            if option.startswith('-U'):
                context = int(option[2:])
                break
        if context < 0:
            context = None
        changes = hdf_diff(oldtext, newtext, context=context,
                           ignore_blank_lines='-B' in diff_options,
                           ignore_case='-i' in diff_options,
                           ignore_space_changes='-b' in diff_options)
        req.hdf['wiki.diff'] = changes
示例#10
0
    def _render_diff(self, req, db, page):
        req.perm.assert_permission('WIKI_VIEW')

        if not page.exists:
            raise TracError("Version %s of page %s does not exist" %
                            (req.args.get('version'), page.name))

        add_stylesheet(req, 'common/css/diff.css')

        self._set_title(req, page, u'变化')

        # Ask web spiders to not index old versions
        req.hdf['html.norobots'] = 1

        old_version = req.args.get('old_version')
        if old_version:
            old_version = int(old_version)
            if old_version == page.version:
                old_version = None
            elif old_version > page.version:  # FIXME: what about reverse diffs?
                old_version, page = page.version, \
                                    WikiPage(self.env, page.name, old_version)
        latest_page = WikiPage(self.env, page.name)
        new_version = int(page.version)
        info = {
            'version': new_version,
            'latest_version': latest_page.version,
            'history_href': req.href.wiki(page.name, action='history')
        }

        num_changes = 0
        old_page = None
        prev_version = next_version = None
        for version, t, author, comment, ipnr in latest_page.get_history():
            if version == new_version:
                if t:
                    info['time'] = format_datetime(t)
                    info['time_delta'] = pretty_timedelta(t)
                info['author'] = author or 'anonymous'
                info['comment'] = wiki_to_html(comment or '--', self.env, req,
                                               db)
                info['ipnr'] = ipnr or ''
            else:
                if version < new_version:
                    num_changes += 1
                    if not prev_version:
                        prev_version = version
                    if (old_version and version == old_version) or \
                            not old_version:
                        old_page = WikiPage(self.env, page.name, version)
                        info['num_changes'] = num_changes
                        info['old_version'] = version
                        break
                else:
                    next_version = version
        req.hdf['wiki'] = info

        # -- prev/next links
        if prev_version:
            add_link(
                req, 'prev',
                req.href.wiki(page.name, action='diff', version=prev_version),
                'Version %d' % prev_version)
        if next_version:
            add_link(
                req, 'next',
                req.href.wiki(page.name, action='diff', version=next_version),
                'Version %d' % next_version)

        # -- text diffs
        diff_style, diff_options = get_diff_options(req)

        oldtext = old_page and old_page.text.splitlines() or []
        newtext = page.text.splitlines()
        context = 3
        for option in diff_options:
            if option.startswith('-U'):
                context = int(option[2:])
                break
        if context < 0:
            context = None
        changes = hdf_diff(oldtext,
                           newtext,
                           context=context,
                           ignore_blank_lines='-B' in diff_options,
                           ignore_case='-i' in diff_options,
                           ignore_space_changes='-b' in diff_options)
        req.hdf['wiki.diff'] = changes
示例#11
0
    def _render_diff(self, req, db, page):
        req.perm.assert_permission("WIKI_VIEW")

        if not page.exists:
            raise TracError, "Version %s of page %s does not exist" % (req.args.get("version"), page.name)

        add_stylesheet(req, "common/css/diff.css")

        req.hdf["title"] = page.name + " (diff)"

        # Ask web spiders to not index old versions
        req.hdf["html.norobots"] = 1

        old_version = req.args.get("old_version")
        if old_version:
            old_version = int(old_version)
            if old_version == page.version:
                old_version = None
            elif old_version > page.version:
                old_version, page = page.version, WikiPage(self.env, page.name, old_version)

        info = {"version": page.version, "history_href": self.env.href.wiki(page.name, action="history")}

        num_changes = 0
        old_page = None
        for version, t, author, comment, ipnr in page.get_history():
            if version == page.version:
                if t:
                    info["time"] = format_datetime(t)
                    info["time_delta"] = pretty_timedelta(t)
                info["author"] = author or "anonymous"
                info["comment"] = comment or "--"
                info["ipnr"] = ipnr or ""
            else:
                num_changes += 1
                if version < page.version:
                    if (old_version and version == old_version) or not old_version:
                        old_page = WikiPage(self.env, page.name, version)
                        info["num_changes"] = num_changes
                        info["old_version"] = version
                        break

        req.hdf["wiki"] = info

        diff_style, diff_options = get_diff_options(req)

        oldtext = old_page and old_page.text.splitlines() or []
        newtext = page.text.splitlines()
        context = 3
        for option in diff_options:
            if option.startswith("-U"):
                context = int(option[2:])
                break
        if context < 0:
            context = None
        changes = hdf_diff(
            oldtext,
            newtext,
            context=context,
            ignore_blank_lines="-B" in diff_options,
            ignore_case="-i" in diff_options,
            ignore_space_changes="-b" in diff_options,
        )
        req.hdf["wiki.diff"] = changes