webcommands.py
127 lines
| 3.8 KiB
| text/x-python
|
PythonLexer
Dirkjan Ochtman
|
r5591 | # | ||
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> | ||||
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com> | ||||
# | ||||
# This software may be used and distributed according to the terms | ||||
# of the GNU General Public License, incorporated herein by reference. | ||||
Dirkjan Ochtman
|
r5890 | import os, mimetypes | ||
Joel Rosdahl
|
r6217 | from mercurial import revlog, util | ||
from mercurial.repo import RepoError | ||||
Dirkjan Ochtman
|
r5993 | from common import staticfile, ErrorResponse, HTTP_OK, HTTP_NOT_FOUND | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5963 | # __all__ is populated with the allowed commands. Be sure to add to it if | ||
# you're adding a new command, or the new command won't work. | ||||
__all__ = [ | ||||
'log', 'rawfile', 'file', 'changelog', 'shortlog', 'changeset', 'rev', | ||||
'manifest', 'tags', 'summary', 'filediff', 'diff', 'annotate', 'filelog', | ||||
'archive', 'static', | ||||
] | ||||
Dirkjan Ochtman
|
r5600 | def log(web, req, tmpl): | ||
Christian Ebert
|
r5915 | if 'file' in req.form and req.form['file'][0]: | ||
Dirkjan Ochtman
|
r5964 | return filelog(web, req, tmpl) | ||
Dirkjan Ochtman
|
r5591 | else: | ||
Dirkjan Ochtman
|
r5964 | return changelog(web, req, tmpl) | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5890 | def rawfile(web, req, tmpl): | ||
path = web.cleanpath(req.form.get('file', [''])[0]) | ||||
if not path: | ||||
Dirkjan Ochtman
|
r5993 | content = web.manifest(tmpl, web.changectx(req), path) | ||
req.respond(HTTP_OK, web.ctype) | ||||
return content | ||||
Dirkjan Ochtman
|
r5890 | |||
try: | ||||
fctx = web.filectx(req) | ||||
Dirkjan Ochtman
|
r6368 | except revlog.LookupError, inst: | ||
try: | ||||
content = web.manifest(tmpl, web.changectx(req), path) | ||||
req.respond(HTTP_OK, web.ctype) | ||||
return content | ||||
except ErrorResponse: | ||||
raise inst | ||||
Dirkjan Ochtman
|
r5890 | |||
path = fctx.path() | ||||
text = fctx.data() | ||||
mt = mimetypes.guess_type(path)[0] | ||||
Dirkjan Ochtman
|
r5926 | if mt is None or util.binary(text): | ||
Dirkjan Ochtman
|
r5890 | mt = mt or 'application/octet-stream' | ||
Dirkjan Ochtman
|
r5993 | req.respond(HTTP_OK, mt, path, len(text)) | ||
Dirkjan Ochtman
|
r5964 | return [text] | ||
Dirkjan Ochtman
|
r5890 | |||
Dirkjan Ochtman
|
r5600 | def file(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5591 | path = web.cleanpath(req.form.get('file', [''])[0]) | ||
if path: | ||||
try: | ||||
Dirkjan Ochtman
|
r5964 | return web.filerevision(tmpl, web.filectx(req)) | ||
Dirkjan Ochtman
|
r6368 | except revlog.LookupError, inst: | ||
Dirkjan Ochtman
|
r5591 | pass | ||
Dirkjan Ochtman
|
r6368 | try: | ||
return web.manifest(tmpl, web.changectx(req), path) | ||||
except ErrorResponse: | ||||
raise inst | ||||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def changelog(web, req, tmpl, shortlog = False): | ||
Christian Ebert
|
r5915 | if 'node' in req.form: | ||
Dirkjan Ochtman
|
r5591 | ctx = web.changectx(req) | ||
else: | ||||
Christian Ebert
|
r5915 | if 'rev' in req.form: | ||
Dirkjan Ochtman
|
r5591 | hi = req.form['rev'][0] | ||
else: | ||||
hi = web.repo.changelog.count() - 1 | ||||
try: | ||||
ctx = web.repo.changectx(hi) | ||||
Joel Rosdahl
|
r6217 | except RepoError: | ||
Dirkjan Ochtman
|
r5964 | return web.search(tmpl, hi) # XXX redirect to 404 page? | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5964 | return web.changelog(tmpl, ctx, shortlog = shortlog) | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def shortlog(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5964 | return changelog(web, req, tmpl, shortlog = True) | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def changeset(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5964 | return web.changeset(tmpl, web.changectx(req)) | ||
Dirkjan Ochtman
|
r5591 | |||
rev = changeset | ||||
Dirkjan Ochtman
|
r5600 | def manifest(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5964 | return web.manifest(tmpl, web.changectx(req), | ||
web.cleanpath(req.form['path'][0])) | ||||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def tags(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5964 | return web.tags(tmpl) | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def summary(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5964 | return web.summary(tmpl) | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def filediff(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5964 | return web.filediff(tmpl, web.filectx(req)) | ||
Dirkjan Ochtman
|
r5591 | |||
diff = filediff | ||||
Dirkjan Ochtman
|
r5600 | def annotate(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5964 | return web.fileannotate(tmpl, web.filectx(req)) | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def filelog(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5964 | return web.filelog(tmpl, web.filectx(req)) | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def archive(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5591 | type_ = req.form['type'][0] | ||
allowed = web.configlist("web", "allow_archive") | ||||
if (type_ in web.archives and (type_ in allowed or | ||||
web.configbool("web", "allow" + type_, False))): | ||||
Dirkjan Ochtman
|
r5600 | web.archive(tmpl, req, req.form['node'][0], type_) | ||
Dirkjan Ochtman
|
r5964 | return [] | ||
Dirkjan Ochtman
|
r6368 | raise ErrorResponse(HTTP_NOT_FOUND, 'unsupported archive type: %s' % type_) | ||
Dirkjan Ochtman
|
r5591 | |||
Dirkjan Ochtman
|
r5600 | def static(web, req, tmpl): | ||
Dirkjan Ochtman
|
r5591 | fname = req.form['file'][0] | ||
# a repo owner may set web.static in .hg/hgrc to get any file | ||||
# readable by the user running the CGI script | ||||
static = web.config("web", "static", | ||||
os.path.join(web.templatepath, "static"), | ||||
untrusted=False) | ||||
Dirkjan Ochtman
|
r5964 | return [staticfile(static, fname, req)] | ||