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.
--- a/mercurial/hgweb/webcommands.py Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/hgweb/webcommands.py Tue Jul 31 14:14:15 2012 +0200
@@ -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 @@
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 @@
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):
--- a/mercurial/hgweb/webutil.py Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/hgweb/webutil.py Tue Jul 31 14:14:15 2012 +0200
@@ -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 @@
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 @@
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.'''
--- a/mercurial/templates/coal/map Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/templates/coal/map Tue Jul 31 14:14:15 2012 +0200
@@ -84,16 +84,6 @@
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}
--- a/mercurial/templates/gitweb/filecomparison.tmpl Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/templates/gitweb/filecomparison.tmpl Tue Jul 31 14:14:15 2012 +0200
@@ -55,7 +55,15 @@
</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>
--- a/mercurial/templates/gitweb/map Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/templates/gitweb/map Tue Jul 31 14:14:15 2012 +0200
@@ -103,16 +103,6 @@
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}
--- a/mercurial/templates/monoblue/filecomparison.tmpl Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/templates/monoblue/filecomparison.tmpl Tue Jul 31 14:14:15 2012 +0200
@@ -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}
--- a/mercurial/templates/monoblue/map Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/templates/monoblue/map Tue Jul 31 14:14:15 2012 +0200
@@ -98,16 +98,6 @@
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}
--- a/mercurial/templates/paper/filecomparison.tmpl Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/templates/paper/filecomparison.tmpl Tue Jul 31 14:14:15 2012 +0200
@@ -76,7 +76,15 @@
<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>
--- a/mercurial/templates/paper/map Mon Jul 30 22:33:45 2012 -0500
+++ b/mercurial/templates/paper/map Tue Jul 31 14:14:15 2012 +0200
@@ -83,16 +83,6 @@
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}
--- a/tests/test-hgweb-diffs.t Mon Jul 30 22:33:45 2012 -0500
+++ b/tests/test-hgweb-diffs.t Tue Jul 31 14:14:15 2012 +0200
@@ -642,15 +642,14 @@
<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 @@
<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 @@
<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>