# HG changeset patch # User wujek srujek <wujek.srujek@googlemail.com> # Date 2012-07-31 12:14:15 # Node ID 5c64ce6168da0b90a20fcbb97c36f93bb8840bad # Parent 2e8342aeab498f6f429e63e81a849830f0478815 hgweb: fixes traceback for invalid files by removing top-level template The top-level 'comparison' template was not really needed, and it also caused a traceback to be shown for inexistent files (as reported by Ross Lagerwall). Getting rid of it makes the overall templating structure simpler and causes invalid files to be handled nicely. diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py --- a/mercurial/hgweb/webcommands.py +++ b/mercurial/hgweb/webcommands.py @@ -8,7 +8,7 @@ import os, mimetypes, re, cgi, copy import webutil from mercurial import error, encoding, archival, templater, templatefilters -from mercurial.node import short, hex +from mercurial.node import short, hex, nullid from mercurial.util import binary from common import paritygen, staticfile, get_contact, ErrorResponse from common import HTTP_OK, HTTP_FORBIDDEN, HTTP_NOT_FOUND @@ -597,7 +597,39 @@ def comparison(web, req, tmpl): else: context = parsecontext(web.config('web', 'comparisoncontext', '5')) - comparison = webutil.compare(tmpl, ctx, path, context) + def filelines(f): + if binary(f.data()): + mt = mimetypes.guess_type(f.path())[0] + if not mt: + mt = 'application/octet-stream' + return [_('(binary file %s, hash: %s)') % (mt, hex(f.filenode()))] + return f.data().splitlines() + + if path in ctx: + fctx = ctx[path] + rightrev = fctx.filerev() + rightnode = fctx.filenode() + rightlines = filelines(fctx) + parents = fctx.parents() + if not parents: + leftrev = -1 + leftnode = nullid + leftlines = () + else: + pfctx = parents[0] + leftrev = pfctx.filerev() + leftnode = pfctx.filenode() + leftlines = filelines(pfctx) + else: + rightrev = -1 + rightnode = nullid + rightlines = () + fctx = ctx.parents()[0][path] + leftrev = fctx.filerev() + leftnode = fctx.filenode() + leftlines = filelines(fctx) + + comparison = webutil.compare(tmpl, context, leftlines, rightlines) return tmpl('filecomparison', file=path, node=hex(ctx.node()), @@ -609,6 +641,10 @@ def comparison(web, req, tmpl): branch=webutil.nodebranchnodefault(ctx), parent=webutil.parents(ctx), child=webutil.children(ctx), + leftrev=leftrev, + leftnode=hex(leftnode), + rightrev=rightrev, + rightnode=hex(rightnode), comparison=comparison) def annotate(web, req, tmpl): diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py --- a/mercurial/hgweb/webutil.py +++ b/mercurial/hgweb/webutil.py @@ -6,7 +6,7 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -import os, mimetypes, copy +import os, copy from mercurial import match, patch, scmutil, error, ui, util from mercurial.i18n import _ from mercurial.node import hex, nullid @@ -227,17 +227,9 @@ def diffs(repo, tmpl, ctx, files, parity yield tmpl('diffblock', parity=parity.next(), blockno=blockno, lines=prettyprintlines(''.join(block), blockno)) -def compare(tmpl, ctx, path, context): +def compare(tmpl, context, leftlines, rightlines): '''Generator function that provides side-by-side comparison data.''' - def filelines(f): - if util.binary(f.data()): - mt = mimetypes.guess_type(f.path())[0] - if not mt: - mt = 'application/octet-stream' - return [_('(binary file %s, hash: %s)') % (mt, hex(f.filenode()))] - return f.data().splitlines() - def compline(type, leftlineno, leftline, rightlineno, rightline): lineid = leftlineno and ("l%s" % leftlineno) or '' lineid += rightlineno and ("r%s" % rightlineno) or '' @@ -275,43 +267,12 @@ def compare(tmpl, ctx, path, context): rightlineno=i + 1, rightline=rightlines[i]) - if path in ctx: - fctx = ctx[path] - rightrev = fctx.filerev() - rightnode = fctx.filenode() - rightlines = filelines(fctx) - parents = fctx.parents() - if not parents: - leftrev = -1 - leftnode = nullid - leftlines = () - else: - pfctx = parents[0] - leftrev = pfctx.filerev() - leftnode = pfctx.filenode() - leftlines = filelines(pfctx) - else: - rightrev = -1 - rightnode = nullid - rightlines = () - fctx = ctx.parents()[0][path] - leftrev = fctx.filerev() - leftnode = fctx.filenode() - leftlines = filelines(fctx) - s = difflib.SequenceMatcher(None, leftlines, rightlines) if context < 0: - blocks = [tmpl('comparisonblock', lines=getblock(s.get_opcodes()))] + yield tmpl('comparisonblock', lines=getblock(s.get_opcodes())) else: - blocks = (tmpl('comparisonblock', lines=getblock(oc)) - for oc in s.get_grouped_opcodes(n=context)) - - yield tmpl('comparison', - leftrev=leftrev, - leftnode=hex(leftnode), - rightrev=rightrev, - rightnode=hex(rightnode), - blocks=blocks) + for oc in s.get_grouped_opcodes(n=context): + yield tmpl('comparisonblock', lines=getblock(oc)) def diffstatgen(ctx): '''Generator function that provides the diffstat data.''' diff --git a/mercurial/templates/coal/map b/mercurial/templates/coal/map --- a/mercurial/templates/coal/map +++ b/mercurial/templates/coal/map @@ -84,16 +84,6 @@ difflineminus = '<a href="#{lineid}" id= difflineat = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="atline">{line|escape}</span>' diffline = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}' -comparison = ' - <table class="bigtable"> - <thead class="header"> - <tr> - <th>{leftrev}:{leftnode|short}</th> - <th>{rightrev}:{rightnode|short}</th> - </tr> - </thead> - {blocks} - </table>' comparisonblock =' <tbody class="block"> {lines} diff --git a/mercurial/templates/gitweb/filecomparison.tmpl b/mercurial/templates/gitweb/filecomparison.tmpl --- a/mercurial/templates/gitweb/filecomparison.tmpl +++ b/mercurial/templates/gitweb/filecomparison.tmpl @@ -55,7 +55,15 @@ comparison | </div> <div class="comparison"> -{comparison} + <table style="border-collapse:collapse;"> + <thead class="header"> + <tr> + <th>{leftrev}:{leftnode|short}</th> + <th>{rightrev}:{rightnode|short}</th> + </tr> + </thead> + {comparison} + </table> </div> </div> diff --git a/mercurial/templates/gitweb/map b/mercurial/templates/gitweb/map --- a/mercurial/templates/gitweb/map +++ b/mercurial/templates/gitweb/map @@ -103,16 +103,6 @@ difflineminus = '<span style="color:#cc0 difflineat = '<span style="color:#990099;"><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>' diffline = '<span><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>' -comparison = ' - <table style="border-collapse:collapse;"> - <thead class="header"> - <tr> - <th>{leftrev}:{leftnode|short}</th> - <th>{rightrev}:{rightnode|short}</th> - </tr> - </thead> - {blocks} - </table>' comparisonblock =' <tbody class="block"> {lines} diff --git a/mercurial/templates/monoblue/filecomparison.tmpl b/mercurial/templates/monoblue/filecomparison.tmpl --- a/mercurial/templates/monoblue/filecomparison.tmpl +++ b/mercurial/templates/monoblue/filecomparison.tmpl @@ -58,7 +58,15 @@ </div> <div class="comparison"> - {comparison} + <table class="bigtable"> + <thead class="header"> + <tr> + <th>{leftrev}:{leftnode|short}</th> + <th>{rightrev}:{rightnode|short}</th> + </tr> + </thead> + {comparison} + </table> </div> {footer} diff --git a/mercurial/templates/monoblue/map b/mercurial/templates/monoblue/map --- a/mercurial/templates/monoblue/map +++ b/mercurial/templates/monoblue/map @@ -98,16 +98,6 @@ difflineminus = '<span style="color:#cc0 difflineat = '<span style="color:#990099;"><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>' diffline = '<span><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>' -comparison = ' - <table class="bigtable"> - <thead class="header"> - <tr> - <th>{leftrev}:{leftnode|short}</th> - <th>{rightrev}:{rightnode|short}</th> - </tr> - </thead> - {blocks} - </table>' comparisonblock =' <tbody class="block"> {lines} diff --git a/mercurial/templates/paper/filecomparison.tmpl b/mercurial/templates/paper/filecomparison.tmpl --- a/mercurial/templates/paper/filecomparison.tmpl +++ b/mercurial/templates/paper/filecomparison.tmpl @@ -76,7 +76,15 @@ files, or words in the commit message</d <span class="legendinfo replace">replaced</span> </div> -{comparison} +<table class="bigtable"> + <thead class="header"> + <tr> + <th>{leftrev}:{leftnode|short}</th> + <th>{rightrev}:{rightnode|short}</th> + </tr> + </thead> + {comparison} +</table> </div> </div> diff --git a/mercurial/templates/paper/map b/mercurial/templates/paper/map --- a/mercurial/templates/paper/map +++ b/mercurial/templates/paper/map @@ -83,16 +83,6 @@ difflineminus = '<a href="#{lineid}" id= difflineat = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="atline">{line|escape}</span>' diffline = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}' -comparison = ' - <table class="bigtable"> - <thead class="header"> - <tr> - <th>{leftrev}:{leftnode|short}</th> - <th>{rightrev}:{rightnode|short}</th> - </tr> - </thead> - {blocks} - </table>' comparisonblock =' <tbody class="block"> {lines} diff --git a/tests/test-hgweb-diffs.t b/tests/test-hgweb-diffs.t --- a/tests/test-hgweb-diffs.t +++ b/tests/test-hgweb-diffs.t @@ -642,15 +642,14 @@ comparison new file <span class="legendinfo replace">replaced</span> </div> - <table class="bigtable"> - <thead class="header"> - <tr> - <th>-1:000000000000</th> - <th>0:b789fdd96dc2</th> - </tr> - </thead> - + <thead class="header"> + <tr> + <th>-1:000000000000</th> + <th>0:b789fdd96dc2</th> + </tr> + </thead> + <tbody class="block"> <tr> @@ -765,15 +764,14 @@ comparison existing file <span class="legendinfo replace">replaced</span> </div> - <table class="bigtable"> - <thead class="header"> - <tr> - <th>0:b789fdd96dc2</th> - <th>1:a80d06849b33</th> - </tr> - </thead> - + <thead class="header"> + <tr> + <th>0:b789fdd96dc2</th> + <th>1:a80d06849b33</th> + </tr> + </thead> + <tbody class="block"> <tr> @@ -890,15 +888,14 @@ comparison removed file <span class="legendinfo replace">replaced</span> </div> - <table class="bigtable"> - <thead class="header"> - <tr> - <th>1:a80d06849b33</th> - <th>-1:000000000000</th> - </tr> - </thead> - + <thead class="header"> + <tr> + <th>1:a80d06849b33</th> + <th>-1:000000000000</th> + </tr> + </thead> + <tbody class="block"> <tr>