mercurial/templates/rss/changelogentry.tmpl
author Jun Wu <quark@fb.com>
Mon, 09 Apr 2018 15:58:30 -0700
changeset 37732 35632d392279
parent 29436 849b8e84487e
permissions -rw-r--r--
patch: implement a new worddiff algorithm The previous worddiff algorithm has many problems. The major problem is it does a "similarity check" that selects a subset of matched lines to do inline diffs. It is a bad idea because: - The "similarity check" is non-obvious to users. For example, a simple change from "long long x" to "int64_t x" will fail the similarity check and won't be diff-ed as expected. - Selecting "lines" to diff won't work as people expect if there are line wrapping changes. - It has a sad time complexity if lines do not match, could be O(N^2)-ish. There are other problems in implementation details. - Lines can match across distant hunks (if the next hunk does not have "-" lines). - "difflib" is slow. The solution would be removing the "similarity check", and just diff all words in a same hunk. So no content will be missed and everything will be diff-ed as expected. This is similar to what code review tool like Phabricator does. This diff implements the word diff algorithm as described above. It also avoids difflib to be faster. Note about colors: To be consistent, "changed inserted" parts and "purely insertion blocks" should have a same color, since they do not exist in the previous version. Instead of highlighting differences, this patch chooses to dim common parts. This is also more consistent with Phabricator or GitHub webpage. That said, the labels are defined in a way that people can still highlight changed parts and leave purely inserted/deleted hunks use the "non-highlighted" color. As one example, running: hg log -pr df50b87d8f736aff8dc281f816bddcd6f306930c mercurial/commands.py \ --config experimental.worddiff=1 --color=debug --config diff.unified=0 The previous algorithm outputs: [diff.file_a|--- a/mercurial/commands.py Fri Mar 09 15:53:41 2018 +0100] [diff.file_b|+++ b/mercurial/commands.py Sat Mar 10 12:33:19 2018 +0530] [diff.hunk|@@ -2039,1 +2039,4 @@] [diff.deleted|-][diff.deleted.highlight|@command('^forget',][diff.deleted| ][diff.deleted.highlight|walkopts,][diff.deleted| _('[OPTION]... FILE...'), inferrepo=True)] [diff.inserted|+@command(] [diff.inserted|+ '^forget',] [diff.inserted|+ walkopts + dryrunopts,] [diff.inserted|+ ][diff.inserted.highlight| ][diff.inserted| _('[OPTION]... FILE...'), inferrepo=True)] [diff.hunk|@@ -2074,1 +2077,3 @@] [diff.deleted|- rejected = cmdutil.forget(ui, repo, m, prefix="",][diff.deleted.highlight| explicitonly=False)[0]] [diff.inserted|+ dryrun = opts.get(r'dry_run')] [diff.inserted|+ rejected = cmdutil.forget(ui, repo, m, prefix="",] [diff.inserted|+ explicitonly=False, dryrun=dryrun)[0]] The new algorithm outputs: [diff.file_a|--- a/mercurial/commands.py Fri Mar 09 15:53:41 2018 +0100] [diff.file_b|+++ b/mercurial/commands.py Sat Mar 10 12:33:19 2018 +0530] [diff.hunk|@@ -2039,1 +2039,4 @@] [diff.deleted|-][diff.deleted.unchanged|@command(][diff.deleted.unchanged|'^forget',][diff.deleted.unchanged| ][diff.deleted.changed|walkopts][diff.deleted.unchanged|,][diff.deleted.changed| ][diff.deleted.unchanged|_('[OPTION]... FILE...'), inferrepo=True)] [diff.inserted|+][diff.inserted.unchanged|@command(] [diff.inserted|+][diff.inserted.changed| ][diff.inserted.unchanged|'^forget',] [diff.inserted|+][diff.inserted.changed| walkopts][diff.inserted.unchanged| ][diff.inserted.changed|+ dryrunopts][diff.inserted.unchanged|,] [diff.inserted|+][diff.inserted.changed| ][diff.inserted.unchanged|_('[OPTION]... FILE...'), inferrepo=True)] [diff.hunk|@@ -2074,1 +2077,3 @@] [diff.deleted|-][diff.deleted.unchanged| rejected = cmdutil.forget(ui, repo, m, prefix="",][diff.deleted.changed| ][diff.deleted.unchanged|explicitonly=False][diff.deleted.unchanged|)[0]] [diff.inserted|+][diff.inserted.changed| dryrun = opts.get(r'dry_run')] [diff.inserted|+][diff.inserted.unchanged| rejected = cmdutil.forget(ui, repo, m, prefix="",] [diff.inserted|+][diff.inserted.changed| ][diff.inserted.unchanged|explicitonly=False][diff.inserted.changed|, dryrun=dryrun][diff.inserted.unchanged|)[0]] Practically, when diffing a 8k line change, the time spent on worddiff reduces from 4 seconds to 0.14 seconds. Differential Revision: https://phab.mercurial-scm.org/D3212
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
599
765182a4c843 [PATCH] Add RSS support to hgweb
mpm@selenic.com
parents:
diff changeset
     1
<item>
21118
e1a3898a8bb8 hgweb: adding branch names from inbranch template to rss feed
Aaron Jensen <ajensen@webmd.net>
parents: 21057
diff changeset
     2
    <title>{inbranch%"{if(name, '[{name|escape}] ')}"}{branches%"{if(name, '[{name|escape}] ')}"}{desc|strip|firstline|strip|escape}</title>
18526
9409aeaafdc1 hgweb: urlescape all urls, HTML escape repo/tag/branch/... names
Thomas Arendsen Hein <thomas@intevation.de>
parents: 9999
diff changeset
     3
    <guid isPermaLink="true">{urlbase}{url|urlescape}rev/{node|short}</guid>
29436
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
     4
    <link>{urlbase}{url|urlescape}rev/{node|short}</link>
21057
19ee4923a2b6 hgweb: adding branch, tags, bookmarks, user, and file list to rss feed entries
Aaron Jensen <ajensen@webmd.net>
parents: 18526
diff changeset
     5
    <description>
29436
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
     6
    <![CDATA[
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
     7
        <table>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
     8
            <tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
     9
                <th style="text-align:left;">changeset</th>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    10
                <td>{node|short}</td>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    11
            </tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    12
            <tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    13
                <th style="text-align:left;">branch</th>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    14
                <td>{inbranch%"{name|escape}"}{branches%"{name|escape}"}</td>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    15
            </tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    16
            <tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    17
                <th style="text-align:left;">bookmark</th>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    18
                <td>{bookmarks%"{name|escape}"}</td>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    19
            </tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    20
            <tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    21
                <th style="text-align:left;">tag</th>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    22
                <td>{tags%"{name|escape}"}</td>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    23
            </tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    24
            <tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    25
                <th style="text-align:left;vertical-align:top;">user</th>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    26
                <td>{author|obfuscate}</td>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    27
            </tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    28
            <tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    29
                <th style="text-align:left;vertical-align:top;">description</th>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    30
                <td>{desc|strip|escape|websub|addbreaks|nonempty}</td>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    31
            </tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    32
            <tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    33
                <th style="text-align:left;vertical-align:top;">files</th>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    34
                <td>{files}</td>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    35
            </tr>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    36
        </table>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    37
    ]]>
849b8e84487e hgweb: reindent rss/changelogentry.tmpl
Anton Shestakov <av6@dwimlabs.net>
parents: 21486
diff changeset
    38
    </description>
8428
5ccca71775e1 atom/rss: use newer template syntax everywhere
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8235
diff changeset
    39
    <author>{author|obfuscate}</author>
5ccca71775e1 atom/rss: use newer template syntax everywhere
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8235
diff changeset
    40
    <pubDate>{date|rfc822date}</pubDate>
599
765182a4c843 [PATCH] Add RSS support to hgweb
mpm@selenic.com
parents:
diff changeset
    41
</item>