hgweb: make viewing of non-text work in hgweb
We use mimetypes.guess_type to guess file types and util.binary to determine
whether a file is displayable as text.
This lets us display displayable text files in our normal source view.
Files that appear to be binary will be displayed as something like
"(binary:image/gif)".
Clicking on raw view will send the raw file with an appropriate MIME
type. Thus things like GIFs will now be viewable inside hgweb without
making a mess. Further, things like postscript files that are text
should show source in the normal view and a browser can launch a
postscript viewer for the raw view.
--- a/mercurial/hgweb.py Tue Oct 18 23:08:35 2005 -0700
+++ b/mercurial/hgweb.py Tue Oct 18 23:50:55 2005 -0700
@@ -10,6 +10,7 @@
from demandload import demandload
demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser")
demandload(globals(), "zipfile tempfile StringIO tarfile BaseHTTPServer util")
+demandload(globals(), "mimetypes")
from node import *
from i18n import gettext as _
@@ -466,6 +467,11 @@
cs = cl.read(cn)
mfn = cs[0]
+ mt = mimetypes.guess_type(f)[0]
+ rawtext = text
+ if util.binary(text):
+ text = "(binary:%s)" % mt
+
def lines():
for l, t in enumerate(text.splitlines(1)):
yield {"line": t,
@@ -477,6 +483,8 @@
filenode=node,
path=up(f),
text=lines(),
+ raw=rawtext,
+ mimetype=mt,
rev=changerev,
node=hex(cn),
manifest=hex(mfn),
--- a/templates/filerevision-raw.tmpl Tue Oct 18 23:08:35 2005 -0700
+++ b/templates/filerevision-raw.tmpl Tue Oct 18 23:50:55 2005 -0700
@@ -1,3 +1,4 @@
-#header#
-#text%fileline#
-#footer#
+Context-type: #mimetype#
+Content-disposition: filename=#file#
+
+#raw#
--- a/templates/filerevision.tmpl Tue Oct 18 23:08:35 2005 -0700
+++ b/templates/filerevision.tmpl Tue Oct 18 23:50:55 2005 -0700
@@ -10,7 +10,7 @@
<a href="?mf=#manifest|short#;path=#path#">manifest</a>
<a href="?fl=#filenode|short#;file=#file#">revisions</a>
<a href="?fa=#filenode|short#;file=#file#">annotate</a>
-<a href="?f=#node|short#;file=#file#;style=raw">raw</a>
+<a href="?f=#filenode|short#;file=#file#;style=raw">raw</a>
</div>
<h2>#file#</h2>