Mercurial > hg > mercurial-crew-with-dirclash
diff mercurial/hgweb/hgweb_mod.py @ 2356:2db831b33e8f
Final stage of the hgweb split up.
hgweb and hgwebdir now have their own modules.
author | Eric Hopper <hopper@omnifarious.org> |
---|---|
date | Wed, 31 May 2006 10:42:44 -0700 |
parents | mercurial/hgweb/__init__.py@eb08fb4d41e1 |
children | 8819fc1dcf4b |
line wrap: on
line diff
copy from mercurial/hgweb/__init__.py copy to mercurial/hgweb/hgweb_mod.py --- a/mercurial/hgweb/__init__.py +++ b/mercurial/hgweb/hgweb_mod.py @@ -6,17 +6,18 @@ # This software may be used and distributed according to the terms # of the GNU General Public License, incorporated herein by reference. -import os, cgi, sys +import os +import os.path import mimetypes from mercurial.demandload import demandload -demandload(globals(), "time re socket zlib errno ConfigParser tempfile") +demandload(globals(), "re zlib ConfigParser") demandload(globals(), "mercurial:mdiff,ui,hg,util,archival,templater") demandload(globals(), "mercurial.hgweb.request:hgrequest") -demandload(globals(), "mercurial.hgweb.server:create_server") +demandload(globals(), "mercurial.hgweb.common:get_mtime,staticfile") from mercurial.node import * from mercurial.i18n import gettext as _ -def up(p): +def _up(p): if p[0] != "/": p = "/" + p if p[-1] == "/": @@ -26,38 +27,6 @@ def up(p): return "/" return up + "/" -def get_mtime(repo_path): - hg_path = os.path.join(repo_path, ".hg") - cl_path = os.path.join(hg_path, "00changelog.i") - if os.path.exists(os.path.join(cl_path)): - return os.stat(cl_path).st_mtime - else: - return os.stat(hg_path).st_mtime - -def staticfile(directory, fname): - """return a file inside directory with guessed content-type header - - fname always uses '/' as directory separator and isn't allowed to - contain unusual path components. - Content-type is guessed using the mimetypes module. - Return an empty string if fname is illegal or file not found. - - """ - parts = fname.split('/') - path = directory - for part in parts: - if (part in ('', os.curdir, os.pardir) or - os.sep in part or os.altsep is not None and os.altsep in part): - return "" - path = os.path.join(path, part) - try: - os.stat(path) - ct = mimetypes.guess_type(path)[0] or "text/plain" - return "Content-type: %s\n\n%s" % (ct, file(path).read()) - except (TypeError, OSError): - # illegal fname or unreadable file - return "" - class hgweb(object): def __init__(self, repo, name=None): if type(repo) == type(""): @@ -401,7 +370,7 @@ class hgweb(object): yield self.t("filerevision", file=f, filenode=node, - path=up(f), + path=_up(f), text=lines(), raw=rawtext, mimetype=mt, @@ -458,7 +427,7 @@ class hgweb(object): file=f, filenode=node, annotate=annotate, - path=up(f), + path=_up(f), rev=changerev, node=hex(cn), manifest=hex(mfn), @@ -534,7 +503,7 @@ class hgweb(object): rev=rev, node=hex(node), path=path, - up=up(path), + up=_up(path), fentries=filelist, dentries=dirlist, archives=self.archivelist(hex(node))) @@ -848,141 +817,3 @@ class hgweb(object): else: req.write(self.t("error")) - -# This is a stopgap -class hgwebdir(object): - def __init__(self, config): - def cleannames(items): - return [(name.strip(os.sep), path) for name, path in items] - - self.motd = "" - self.repos_sorted = ('name', False) - if isinstance(config, (list, tuple)): - self.repos = cleannames(config) - self.repos_sorted = ('', False) - elif isinstance(config, dict): - self.repos = cleannames(config.items()) - self.repos.sort() - else: - cp = ConfigParser.SafeConfigParser() - cp.read(config) - self.repos = [] - if cp.has_section('web') and cp.has_option('web', 'motd'): - self.motd = cp.get('web', 'motd') - if cp.has_section('paths'): - self.repos.extend(cleannames(cp.items('paths'))) - if cp.has_section('collections'): - for prefix, root in cp.items('collections'): - for path in util.walkrepos(root): - repo = os.path.normpath(path) - name = repo - if name.startswith(prefix): - name = name[len(prefix):] - self.repos.append((name.lstrip(os.sep), repo)) - self.repos.sort() - - def run(self, req=hgrequest()): - def header(**map): - yield tmpl("header", **map) - - def footer(**map): - yield tmpl("footer", motd=self.motd, **map) - - m = os.path.join(templater.templatepath(), "map") - tmpl = templater.templater(m, templater.common_filters, - defaults={"header": header, - "footer": footer}) - - def archivelist(ui, nodeid, url): - for i in ['zip', 'gz', 'bz2']: - if ui.configbool("web", "allow" + i, False): - yield {"type" : i, "node": nodeid, "url": url} - - def entries(sortcolumn="", descending=False, **map): - rows = [] - parity = 0 - for name, path in self.repos: - u = ui.ui() - try: - u.readconfig(os.path.join(path, '.hg', 'hgrc')) - except IOError: - pass - get = u.config - - url = ('/'.join([req.env["REQUEST_URI"].split('?')[0], name]) - .replace("//", "/")) - - # update time with local timezone - try: - d = (get_mtime(path), util.makedate()[1]) - except OSError: - continue - - contact = (get("ui", "username") or # preferred - get("web", "contact") or # deprecated - get("web", "author", "")) # also - description = get("web", "description", "") - name = get("web", "name", name) - row = dict(contact=contact or "unknown", - contact_sort=contact.upper() or "unknown", - name=name, - name_sort=name, - url=url, - description=description or "unknown", - description_sort=description.upper() or "unknown", - lastchange=d, - lastchange_sort=d[1]-d[0], - archives=archivelist(u, "tip", url)) - if (not sortcolumn - or (sortcolumn, descending) == self.repos_sorted): - # fast path for unsorted output - row['parity'] = parity - parity = 1 - parity - yield row - else: - rows.append((row["%s_sort" % sortcolumn], row)) - if rows: - rows.sort() - if descending: - rows.reverse() - for key, row in rows: - row['parity'] = parity - parity = 1 - parity - yield row - - virtual = req.env.get("PATH_INFO", "").strip('/') - if virtual: - real = dict(self.repos).get(virtual) - if real: - try: - hgweb(real).run(req) - except IOError, inst: - req.write(tmpl("error", error=inst.strerror)) - except hg.RepoError, inst: - req.write(tmpl("error", error=str(inst))) - else: - req.write(tmpl("notfound", repo=virtual)) - else: - if req.form.has_key('static'): - static = os.path.join(templater.templatepath(), "static") - fname = req.form['static'][0] - req.write(staticfile(static, fname) - or tmpl("error", error="%r not found" % fname)) - else: - sortable = ["name", "description", "contact", "lastchange"] - sortcolumn, descending = self.repos_sorted - if req.form.has_key('sort'): - sortcolumn = req.form['sort'][0] - descending = sortcolumn.startswith('-') - if descending: - sortcolumn = sortcolumn[1:] - if sortcolumn not in sortable: - sortcolumn = "" - - sort = [("sort_%s" % column, - "%s%s" % ((not descending and column == sortcolumn) - and "-" or "", column)) - for column in sortable] - req.write(tmpl("index", entries=entries, - sortcolumn=sortcolumn, descending=descending, - **dict(sort)))