diff options
Diffstat (limited to 'eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb')
20 files changed, 0 insertions, 2458 deletions
diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.py deleted file mode 100644 index dd4d089..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -# hgweb/__init__.py - web interface to a mercurial repository -# -# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> -# Copyright 2005 Matt Mackall <mpm@selenic.com> -# -# 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 -import hgweb_mod, hgwebdir_mod - -def hgweb(config, name=None, baseui=None): - '''create an hgweb wsgi object - - config can be one of: - - repo object (single repo view) - - path to repo (single repo view) - - path to config file (multi-repo view) - - dict of virtual:real pairs (multi-repo view) - - list of virtual:real tuples (multi-repo view) - ''' - - if ((isinstance(config, str) and not os.path.isdir(config)) or - isinstance(config, dict) or isinstance(config, list)): - # create a multi-dir interface - return hgwebdir_mod.hgwebdir(config, baseui=baseui) - return hgweb_mod.hgweb(config, name=name, baseui=baseui) - -def hgwebdir(config, baseui=None): - return hgwebdir_mod.hgwebdir(config, baseui=baseui) - diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.pyo Binary files differdeleted file mode 100644 index fe872c0..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.py deleted file mode 100644 index eb7e02a..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.py +++ /dev/null @@ -1,161 +0,0 @@ -# hgweb/common.py - Utility functions needed by hgweb_mod and hgwebdir_mod -# -# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> -# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com> -# -# This software may be used and distributed according to the terms of the -# GNU General Public License version 2 or any later version. - -import errno, mimetypes, os - -HTTP_OK = 200 -HTTP_NOT_MODIFIED = 304 -HTTP_BAD_REQUEST = 400 -HTTP_UNAUTHORIZED = 401 -HTTP_FORBIDDEN = 403 -HTTP_NOT_FOUND = 404 -HTTP_METHOD_NOT_ALLOWED = 405 -HTTP_SERVER_ERROR = 500 - -# Hooks for hgweb permission checks; extensions can add hooks here. Each hook -# is invoked like this: hook(hgweb, request, operation), where operation is -# either read, pull or push. Hooks should either raise an ErrorResponse -# exception, or just return. -# It is possible to do both authentication and authorization through this. -permhooks = [] - -def checkauthz(hgweb, req, op): - '''Check permission for operation based on request data (including - authentication info). Return if op allowed, else raise an ErrorResponse - exception.''' - - user = req.env.get('REMOTE_USER') - - deny_read = hgweb.configlist('web', 'deny_read') - if deny_read and (not user or deny_read == ['*'] or user in deny_read): - raise ErrorResponse(HTTP_UNAUTHORIZED, 'read not authorized') - - allow_read = hgweb.configlist('web', 'allow_read') - result = (not allow_read) or (allow_read == ['*']) - if not (result or user in allow_read): - raise ErrorResponse(HTTP_UNAUTHORIZED, 'read not authorized') - - if op == 'pull' and not hgweb.allowpull: - raise ErrorResponse(HTTP_UNAUTHORIZED, 'pull not authorized') - elif op == 'pull' or op is None: # op is None for interface requests - return - - # enforce that you can only push using POST requests - if req.env['REQUEST_METHOD'] != 'POST': - msg = 'push requires POST request' - raise ErrorResponse(HTTP_METHOD_NOT_ALLOWED, msg) - - # require ssl by default for pushing, auth info cannot be sniffed - # and replayed - scheme = req.env.get('wsgi.url_scheme') - if hgweb.configbool('web', 'push_ssl', True) and scheme != 'https': - raise ErrorResponse(HTTP_OK, 'ssl required') - - deny = hgweb.configlist('web', 'deny_push') - if deny and (not user or deny == ['*'] or user in deny): - raise ErrorResponse(HTTP_UNAUTHORIZED, 'push not authorized') - - allow = hgweb.configlist('web', 'allow_push') - result = allow and (allow == ['*'] or user in allow) - if not result: - raise ErrorResponse(HTTP_UNAUTHORIZED, 'push not authorized') - -# Add the default permhook, which provides simple authorization. -permhooks.append(checkauthz) - - -class ErrorResponse(Exception): - def __init__(self, code, message=None, headers=[]): - Exception.__init__(self) - self.code = code - self.headers = headers - if message is not None: - self.message = message - else: - self.message = _statusmessage(code) - -def _statusmessage(code): - from BaseHTTPServer import BaseHTTPRequestHandler - responses = BaseHTTPRequestHandler.responses - return responses.get(code, ('Error', 'Unknown error'))[0] - -def statusmessage(code, message=None): - return '%d %s' % (code, message or _statusmessage(code)) - -def get_mtime(spath): - cl_path = os.path.join(spath, "00changelog.i") - if os.path.exists(cl_path): - return os.stat(cl_path).st_mtime - else: - return os.stat(spath).st_mtime - -def staticfile(directory, fname, req): - """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('/') - 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 "" - fpath = os.path.join(*parts) - if isinstance(directory, str): - directory = [directory] - for d in directory: - path = os.path.join(d, fpath) - if os.path.exists(path): - break - try: - os.stat(path) - ct = mimetypes.guess_type(path)[0] or "text/plain" - req.respond(HTTP_OK, ct, length = os.path.getsize(path)) - return open(path, 'rb').read() - except TypeError: - raise ErrorResponse(HTTP_SERVER_ERROR, 'illegal filename') - except OSError, err: - if err.errno == errno.ENOENT: - raise ErrorResponse(HTTP_NOT_FOUND) - else: - raise ErrorResponse(HTTP_SERVER_ERROR, err.strerror) - -def paritygen(stripecount, offset=0): - """count parity of horizontal stripes for easier reading""" - if stripecount and offset: - # account for offset, e.g. due to building the list in reverse - count = (stripecount + offset) % stripecount - parity = (stripecount + offset) / stripecount & 1 - else: - count = 0 - parity = 0 - while True: - yield parity - count += 1 - if stripecount and count >= stripecount: - parity = 1 - parity - count = 0 - -def get_contact(config): - """Return repo contact information or empty string. - - web.contact is the primary source, but if that is not set, try - ui.username or $EMAIL as a fallback to display something useful. - """ - return (config("web", "contact") or - config("ui", "username") or - os.environ.get("EMAIL") or "") - -def caching(web, req): - tag = str(web.mtime) - if req.env.get('HTTP_IF_NONE_MATCH') == tag: - raise ErrorResponse(HTTP_NOT_MODIFIED) - req.headers.append(('ETag', tag)) diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.pyo Binary files differdeleted file mode 100644 index c743684..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgweb_mod.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgweb_mod.py deleted file mode 100644 index f886277..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgweb_mod.py +++ /dev/null @@ -1,290 +0,0 @@ -# hgweb/hgweb_mod.py - Web interface for a repository. -# -# 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 version 2 or any later version. - -import os -from mercurial import ui, hg, hook, error, encoding, templater -from common import get_mtime, ErrorResponse, permhooks, caching -from common import HTTP_OK, HTTP_NOT_MODIFIED, HTTP_BAD_REQUEST -from common import HTTP_NOT_FOUND, HTTP_SERVER_ERROR -from request import wsgirequest -import webcommands, protocol, webutil - -perms = { - 'changegroup': 'pull', - 'changegroupsubset': 'pull', - 'stream_out': 'pull', - 'listkeys': 'pull', - 'unbundle': 'push', - 'pushkey': 'push', -} - -class hgweb(object): - def __init__(self, repo, name=None, baseui=None): - if isinstance(repo, str): - if baseui: - u = baseui.copy() - else: - u = ui.ui() - self.repo = hg.repository(u, repo) - else: - self.repo = repo - - self.repo.ui.setconfig('ui', 'report_untrusted', 'off') - self.repo.ui.setconfig('ui', 'interactive', 'off') - hook.redirect(True) - self.mtime = -1 - self.reponame = name - self.archives = 'zip', 'gz', 'bz2' - self.stripecount = 1 - # a repo owner may set web.templates in .hg/hgrc to get any file - # readable by the user running the CGI script - self.templatepath = self.config('web', 'templates') - - # The CGI scripts are often run by a user different from the repo owner. - # Trust the settings from the .hg/hgrc files by default. - def config(self, section, name, default=None, untrusted=True): - return self.repo.ui.config(section, name, default, - untrusted=untrusted) - - def configbool(self, section, name, default=False, untrusted=True): - return self.repo.ui.configbool(section, name, default, - untrusted=untrusted) - - def configlist(self, section, name, default=None, untrusted=True): - return self.repo.ui.configlist(section, name, default, - untrusted=untrusted) - - def refresh(self, request=None): - if request: - self.repo.ui.environ = request.env - mtime = get_mtime(self.repo.spath) - if mtime != self.mtime: - self.mtime = mtime - self.repo = hg.repository(self.repo.ui, self.repo.root) - self.maxchanges = int(self.config("web", "maxchanges", 10)) - self.stripecount = int(self.config("web", "stripes", 1)) - self.maxshortchanges = int(self.config("web", "maxshortchanges", 60)) - self.maxfiles = int(self.config("web", "maxfiles", 10)) - self.allowpull = self.configbool("web", "allowpull", True) - encoding.encoding = self.config("web", "encoding", - encoding.encoding) - - def run(self): - if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."): - raise RuntimeError("This function is only intended to be " - "called while running as a CGI script.") - import mercurial.hgweb.wsgicgi as wsgicgi - wsgicgi.launch(self) - - def __call__(self, env, respond): - req = wsgirequest(env, respond) - return self.run_wsgi(req) - - def run_wsgi(self, req): - - self.refresh(req) - - # work with CGI variables to create coherent structure - # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME - - req.url = req.env['SCRIPT_NAME'] - if not req.url.endswith('/'): - req.url += '/' - if 'REPO_NAME' in req.env: - req.url += req.env['REPO_NAME'] + '/' - - if 'PATH_INFO' in req.env: - parts = req.env['PATH_INFO'].strip('/').split('/') - repo_parts = req.env.get('REPO_NAME', '').split('/') - if parts[:len(repo_parts)] == repo_parts: - parts = parts[len(repo_parts):] - query = '/'.join(parts) - else: - query = req.env['QUERY_STRING'].split('&', 1)[0] - query = query.split(';', 1)[0] - - # process this if it's a protocol request - # protocol bits don't need to create any URLs - # and the clients always use the old URL structure - - cmd = req.form.get('cmd', [''])[0] - if protocol.iscmd(cmd): - if query: - raise ErrorResponse(HTTP_NOT_FOUND) - if cmd in perms: - try: - self.check_perm(req, perms[cmd]) - except ErrorResponse, inst: - if cmd == 'unbundle': - req.drain() - req.respond(inst, protocol.HGTYPE) - return '0\n%s\n' % inst.message - return protocol.call(self.repo, req, cmd) - - # translate user-visible url structure to internal structure - - args = query.split('/', 2) - if 'cmd' not in req.form and args and args[0]: - - cmd = args.pop(0) - style = cmd.rfind('-') - if style != -1: - req.form['style'] = [cmd[:style]] - cmd = cmd[style + 1:] - - # avoid accepting e.g. style parameter as command - if hasattr(webcommands, cmd): - req.form['cmd'] = [cmd] - else: - cmd = '' - - if cmd == 'static': - req.form['file'] = ['/'.join(args)] - else: - if args and args[0]: - node = args.pop(0) - req.form['node'] = [node] - if args: - req.form['file'] = args - - ua = req.env.get('HTTP_USER_AGENT', '') - if cmd == 'rev' and 'mercurial' in ua: - req.form['style'] = ['raw'] - - if cmd == 'archive': - fn = req.form['node'][0] - for type_, spec in self.archive_specs.iteritems(): - ext = spec[2] - if fn.endswith(ext): - req.form['node'] = [fn[:-len(ext)]] - req.form['type'] = [type_] - - # process the web interface request - - try: - tmpl = self.templater(req) - ctype = tmpl('mimetype', encoding=encoding.encoding) - ctype = templater.stringify(ctype) - - # check read permissions non-static content - if cmd != 'static': - self.check_perm(req, None) - - if cmd == '': - req.form['cmd'] = [tmpl.cache['default']] - cmd = req.form['cmd'][0] - - caching(self, req) # sets ETag header or raises NOT_MODIFIED - if cmd not in webcommands.__all__: - msg = 'no such method: %s' % cmd - raise ErrorResponse(HTTP_BAD_REQUEST, msg) - elif cmd == 'file' and 'raw' in req.form.get('style', []): - self.ctype = ctype - content = webcommands.rawfile(self, req, tmpl) - else: - content = getattr(webcommands, cmd)(self, req, tmpl) - req.respond(HTTP_OK, ctype) - - return content - - except error.LookupError, err: - req.respond(HTTP_NOT_FOUND, ctype) - msg = str(err) - if 'manifest' not in msg: - msg = 'revision not found: %s' % err.name - return tmpl('error', error=msg) - except (error.RepoError, error.RevlogError), inst: - req.respond(HTTP_SERVER_ERROR, ctype) - return tmpl('error', error=str(inst)) - except ErrorResponse, inst: - req.respond(inst, ctype) - if inst.code == HTTP_NOT_MODIFIED: - # Not allowed to return a body on a 304 - return [''] - return tmpl('error', error=inst.message) - - def templater(self, req): - - # determine scheme, port and server name - # this is needed to create absolute urls - - proto = req.env.get('wsgi.url_scheme') - if proto == 'https': - proto = 'https' - default_port = "443" - else: - proto = 'http' - default_port = "80" - - port = req.env["SERVER_PORT"] - port = port != default_port and (":" + port) or "" - urlbase = '%s://%s%s' % (proto, req.env['SERVER_NAME'], port) - staticurl = self.config("web", "staticurl") or req.url + 'static/' - if not staticurl.endswith('/'): - staticurl += '/' - - # some functions for the templater - - def header(**map): - yield tmpl('header', encoding=encoding.encoding, **map) - - def footer(**map): - yield tmpl("footer", **map) - - def motd(**map): - yield self.config("web", "motd", "") - - # figure out which style to use - - vars = {} - styles = ( - req.form.get('style', [None])[0], - self.config('web', 'style'), - 'paper', - ) - style, mapfile = templater.stylemap(styles, self.templatepath) - if style == styles[0]: - vars['style'] = style - - start = req.url[-1] == '?' and '&' or '?' - sessionvars = webutil.sessionvars(vars, start) - - if not self.reponame: - self.reponame = (self.config("web", "name") - or req.env.get('REPO_NAME') - or req.url.strip('/') or self.repo.root) - - # create the templater - - tmpl = templater.templater(mapfile, - defaults={"url": req.url, - "staticurl": staticurl, - "urlbase": urlbase, - "repo": self.reponame, - "header": header, - "footer": footer, - "motd": motd, - "sessionvars": sessionvars - }) - return tmpl - - def archivelist(self, nodeid): - allowed = self.configlist("web", "allow_archive") - for i, spec in self.archive_specs.iteritems(): - if i in allowed or self.configbool("web", "allow" + i): - yield {"type" : i, "extension" : spec[2], "node" : nodeid} - - archive_specs = { - 'bz2': ('application/x-bzip2', 'tbz2', '.tar.bz2', None), - 'gz': ('application/x-gzip', 'tgz', '.tar.gz', None), - 'zip': ('application/zip', 'zip', '.zip', None), - } - - def check_perm(self, req, op): - for hook in permhooks: - hook(self, req, op) diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgweb_mod.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgweb_mod.pyo Binary files differdeleted file mode 100644 index 375c705..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgweb_mod.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgwebdir_mod.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgwebdir_mod.py deleted file mode 100644 index 167cf35..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgwebdir_mod.py +++ /dev/null @@ -1,359 +0,0 @@ -# hgweb/hgwebdir_mod.py - Web interface for a directory of repositories. -# -# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> -# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com> -# -# 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, re, time, urlparse -from mercurial.i18n import _ -from mercurial import ui, hg, util, templater -from mercurial import error, encoding -from common import ErrorResponse, get_mtime, staticfile, paritygen, \ - get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR -from hgweb_mod import hgweb -from request import wsgirequest -import webutil - -def cleannames(items): - return [(util.pconvert(name).strip('/'), path) for name, path in items] - -def findrepos(paths): - repos = [] - for prefix, root in cleannames(paths): - roothead, roottail = os.path.split(root) - # "foo = /bar/*" makes every subrepo of /bar/ to be - # mounted as foo/subrepo - # and "foo = /bar/**" also recurses into the subdirectories, - # remember to use it without working dir. - try: - recurse = {'*': False, '**': True}[roottail] - except KeyError: - repos.append((prefix, root)) - continue - roothead = os.path.normpath(os.path.abspath(roothead)) - for path in util.walkrepos(roothead, followsym=True, recurse=recurse): - path = os.path.normpath(path) - name = util.pconvert(path[len(roothead):]).strip('/') - if prefix: - name = prefix + '/' + name - repos.append((name, path)) - return repos - -class hgwebdir(object): - refreshinterval = 20 - - def __init__(self, conf, baseui=None): - self.conf = conf - self.baseui = baseui - self.lastrefresh = 0 - self.motd = None - self.refresh() - - def refresh(self): - if self.lastrefresh + self.refreshinterval > time.time(): - return - - if self.baseui: - u = self.baseui.copy() - else: - u = ui.ui() - u.setconfig('ui', 'report_untrusted', 'off') - u.setconfig('ui', 'interactive', 'off') - - if not isinstance(self.conf, (dict, list, tuple)): - map = {'paths': 'hgweb-paths'} - if not os.path.exists(self.conf): - raise util.Abort(_('config file %s not found!') % self.conf) - u.readconfig(self.conf, remap=map, trust=True) - paths = u.configitems('hgweb-paths') - elif isinstance(self.conf, (list, tuple)): - paths = self.conf - elif isinstance(self.conf, dict): - paths = self.conf.items() - - repos = findrepos(paths) - for prefix, root in u.configitems('collections'): - prefix = util.pconvert(prefix) - for path in util.walkrepos(root, followsym=True): - repo = os.path.normpath(path) - name = util.pconvert(repo) - if name.startswith(prefix): - name = name[len(prefix):] - repos.append((name.lstrip('/'), repo)) - - self.repos = repos - self.ui = u - encoding.encoding = self.ui.config('web', 'encoding', - encoding.encoding) - self.style = self.ui.config('web', 'style', 'paper') - self.templatepath = self.ui.config('web', 'templates', None) - self.stripecount = self.ui.config('web', 'stripes', 1) - if self.stripecount: - self.stripecount = int(self.stripecount) - self._baseurl = self.ui.config('web', 'baseurl') - self.lastrefresh = time.time() - - def run(self): - if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."): - raise RuntimeError("This function is only intended to be " - "called while running as a CGI script.") - import mercurial.hgweb.wsgicgi as wsgicgi - wsgicgi.launch(self) - - def __call__(self, env, respond): - req = wsgirequest(env, respond) - return self.run_wsgi(req) - - def read_allowed(self, ui, req): - """Check allow_read and deny_read config options of a repo's ui object - to determine user permissions. By default, with neither option set (or - both empty), allow all users to read the repo. There are two ways a - user can be denied read access: (1) deny_read is not empty, and the - user is unauthenticated or deny_read contains user (or *), and (2) - allow_read is not empty and the user is not in allow_read. Return True - if user is allowed to read the repo, else return False.""" - - user = req.env.get('REMOTE_USER') - - deny_read = ui.configlist('web', 'deny_read', untrusted=True) - if deny_read and (not user or deny_read == ['*'] or user in deny_read): - return False - - allow_read = ui.configlist('web', 'allow_read', untrusted=True) - # by default, allow reading if no allow_read option has been set - if (not allow_read) or (allow_read == ['*']) or (user in allow_read): - return True - - return False - - def run_wsgi(self, req): - try: - try: - self.refresh() - - virtual = req.env.get("PATH_INFO", "").strip('/') - tmpl = self.templater(req) - ctype = tmpl('mimetype', encoding=encoding.encoding) - ctype = templater.stringify(ctype) - - # a static file - if virtual.startswith('static/') or 'static' in req.form: - if virtual.startswith('static/'): - fname = virtual[7:] - else: - fname = req.form['static'][0] - static = templater.templatepath('static') - return (staticfile(static, fname, req),) - - # top-level index - elif not virtual: - req.respond(HTTP_OK, ctype) - return self.makeindex(req, tmpl) - - # nested indexes and hgwebs - - repos = dict(self.repos) - virtualrepo = virtual - while virtualrepo: - real = repos.get(virtualrepo) - if real: - req.env['REPO_NAME'] = virtualrepo - try: - repo = hg.repository(self.ui, real) - return hgweb(repo).run_wsgi(req) - except IOError, inst: - msg = inst.strerror - raise ErrorResponse(HTTP_SERVER_ERROR, msg) - except error.RepoError, inst: - raise ErrorResponse(HTTP_SERVER_ERROR, str(inst)) - - up = virtualrepo.rfind('/') - if up < 0: - break - virtualrepo = virtualrepo[:up] - - # browse subdirectories - subdir = virtual + '/' - if [r for r in repos if r.startswith(subdir)]: - req.respond(HTTP_OK, ctype) - return self.makeindex(req, tmpl, subdir) - - # prefixes not found - req.respond(HTTP_NOT_FOUND, ctype) - return tmpl("notfound", repo=virtual) - - except ErrorResponse, err: - req.respond(err, ctype) - return tmpl('error', error=err.message or '') - finally: - tmpl = None - - def makeindex(self, req, tmpl, subdir=""): - - def archivelist(ui, nodeid, url): - allowed = ui.configlist("web", "allow_archive", untrusted=True) - for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]: - if i[0] in allowed or ui.configbool("web", "allow" + i[0], - untrusted=True): - yield {"type" : i[0], "extension": i[1], - "node": nodeid, "url": url} - - def rawentries(subdir="", **map): - - descend = self.ui.configbool('web', 'descend', True) - for name, path in self.repos: - - if not name.startswith(subdir): - continue - name = name[len(subdir):] - if not descend and '/' in name: - continue - - u = self.ui.copy() - try: - u.readconfig(os.path.join(path, '.hg', 'hgrc')) - except Exception, e: - u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) - continue - def get(section, name, default=None): - return u.config(section, name, default, untrusted=True) - - if u.configbool("web", "hidden", untrusted=True): - continue - - if not self.read_allowed(u, req): - continue - - parts = [name] - if 'PATH_INFO' in req.env: - parts.insert(0, req.env['PATH_INFO'].rstrip('/')) - if req.env['SCRIPT_NAME']: - parts.insert(0, req.env['SCRIPT_NAME']) - url = re.sub(r'/+', '/', '/'.join(parts) + '/') - - # update time with local timezone - try: - r = hg.repository(self.ui, path) - except error.RepoError: - u.warn(_('error accessing repository at %s\n') % path) - continue - try: - d = (get_mtime(r.spath), util.makedate()[1]) - except OSError: - continue - - contact = get_contact(get) - 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)) - yield row - - sortdefault = None, False - def entries(sortcolumn="", descending=False, subdir="", **map): - rows = rawentries(subdir=subdir, **map) - - if sortcolumn and sortdefault != (sortcolumn, descending): - sortkey = '%s_sort' % sortcolumn - rows = sorted(rows, key=lambda x: x[sortkey], - reverse=descending) - for row, parity in zip(rows, paritygen(self.stripecount)): - row['parity'] = parity - yield row - - self.refresh() - sortable = ["name", "description", "contact", "lastchange"] - sortcolumn, descending = sortdefault - if 'sort' in req.form: - 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] - - self.refresh() - self.updatereqenv(req.env) - - return tmpl("index", entries=entries, subdir=subdir, - sortcolumn=sortcolumn, descending=descending, - **dict(sort)) - - def templater(self, req): - - def header(**map): - yield tmpl('header', encoding=encoding.encoding, **map) - - def footer(**map): - yield tmpl("footer", **map) - - def motd(**map): - if self.motd is not None: - yield self.motd - else: - yield config('web', 'motd', '') - - def config(section, name, default=None, untrusted=True): - return self.ui.config(section, name, default, untrusted) - - self.updatereqenv(req.env) - - url = req.env.get('SCRIPT_NAME', '') - if not url.endswith('/'): - url += '/' - - vars = {} - styles = ( - req.form.get('style', [None])[0], - config('web', 'style'), - 'paper' - ) - style, mapfile = templater.stylemap(styles, self.templatepath) - if style == styles[0]: - vars['style'] = style - - start = url[-1] == '?' and '&' or '?' - sessionvars = webutil.sessionvars(vars, start) - staticurl = config('web', 'staticurl') or url + 'static/' - if not staticurl.endswith('/'): - staticurl += '/' - - tmpl = templater.templater(mapfile, - defaults={"header": header, - "footer": footer, - "motd": motd, - "url": url, - "staticurl": staticurl, - "sessionvars": sessionvars}) - return tmpl - - def updatereqenv(self, env): - def splitnetloc(netloc): - if ':' in netloc: - return netloc.split(':', 1) - else: - return (netloc, None) - - if self._baseurl is not None: - urlcomp = urlparse.urlparse(self._baseurl) - host, port = splitnetloc(urlcomp[1]) - path = urlcomp[2] - env['SERVER_NAME'] = host - if port: - env['SERVER_PORT'] = port - env['SCRIPT_NAME'] = path diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgwebdir_mod.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgwebdir_mod.pyo Binary files differdeleted file mode 100644 index fa80ba1..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgwebdir_mod.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.py deleted file mode 100644 index c87805f..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# 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 version 2 or any later version. - -import cStringIO, zlib, sys, urllib -from mercurial import util, wireproto -from common import HTTP_OK - -HGTYPE = 'application/mercurial-0.1' - -class webproto(object): - def __init__(self, req): - self.req = req - self.response = '' - def getargs(self, args): - data = {} - keys = args.split() - for k in keys: - if k == '*': - star = {} - for key in self.req.form.keys(): - if key not in keys: - star[key] = self.req.form[key][0] - data['*'] = star - else: - data[k] = self.req.form[k][0] - return [data[k] for k in keys] - def getfile(self, fp): - length = int(self.req.env['CONTENT_LENGTH']) - for s in util.filechunkiter(self.req, limit=length): - fp.write(s) - def redirect(self): - self.oldio = sys.stdout, sys.stderr - sys.stderr = sys.stdout = cStringIO.StringIO() - def groupchunks(self, cg): - z = zlib.compressobj() - while 1: - chunk = cg.read(4096) - if not chunk: - break - yield z.compress(chunk) - yield z.flush() - def _client(self): - return 'remote:%s:%s:%s' % ( - self.req.env.get('wsgi.url_scheme') or 'http', - urllib.quote(self.req.env.get('REMOTE_HOST', '')), - urllib.quote(self.req.env.get('REMOTE_USER', ''))) - -def iscmd(cmd): - return cmd in wireproto.commands - -def call(repo, req, cmd): - p = webproto(req) - rsp = wireproto.dispatch(repo, p, cmd) - if isinstance(rsp, str): - req.respond(HTTP_OK, HGTYPE, length=len(rsp)) - return [rsp] - elif isinstance(rsp, wireproto.streamres): - req.respond(HTTP_OK, HGTYPE) - return rsp.gen - elif isinstance(rsp, wireproto.pushres): - val = sys.stdout.getvalue() - sys.stdout, sys.stderr = p.oldio - req.respond(HTTP_OK, HGTYPE) - return ['%d\n%s' % (rsp.res, val)] - elif isinstance(rsp, wireproto.pusherr): - # drain the incoming bundle - req.drain() - sys.stdout, sys.stderr = p.oldio - rsp = '0\n%s\n' % rsp.res - req.respond(HTTP_OK, HGTYPE, length=len(rsp)) - return [rsp] diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.pyo Binary files differdeleted file mode 100644 index a747da1..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.py deleted file mode 100644 index cb68664..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.py +++ /dev/null @@ -1,147 +0,0 @@ -# hgweb/request.py - An http request from either CGI or the standalone server. -# -# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> -# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com> -# -# This software may be used and distributed according to the terms of the -# GNU General Public License version 2 or any later version. - -import socket, cgi, errno -from mercurial import util -from common import ErrorResponse, statusmessage, HTTP_NOT_MODIFIED - -shortcuts = { - 'cl': [('cmd', ['changelog']), ('rev', None)], - 'sl': [('cmd', ['shortlog']), ('rev', None)], - 'cs': [('cmd', ['changeset']), ('node', None)], - 'f': [('cmd', ['file']), ('filenode', None)], - 'fl': [('cmd', ['filelog']), ('filenode', None)], - 'fd': [('cmd', ['filediff']), ('node', None)], - 'fa': [('cmd', ['annotate']), ('filenode', None)], - 'mf': [('cmd', ['manifest']), ('manifest', None)], - 'ca': [('cmd', ['archive']), ('node', None)], - 'tags': [('cmd', ['tags'])], - 'tip': [('cmd', ['changeset']), ('node', ['tip'])], - 'static': [('cmd', ['static']), ('file', None)] -} - -def normalize(form): - # first expand the shortcuts - for k in shortcuts.iterkeys(): - if k in form: - for name, value in shortcuts[k]: - if value is None: - value = form[k] - form[name] = value - del form[k] - # And strip the values - for k, v in form.iteritems(): - form[k] = [i.strip() for i in v] - return form - -class wsgirequest(object): - def __init__(self, wsgienv, start_response): - version = wsgienv['wsgi.version'] - if (version < (1, 0)) or (version >= (2, 0)): - raise RuntimeError("Unknown and unsupported WSGI version %d.%d" - % version) - self.inp = wsgienv['wsgi.input'] - self.err = wsgienv['wsgi.errors'] - self.threaded = wsgienv['wsgi.multithread'] - self.multiprocess = wsgienv['wsgi.multiprocess'] - self.run_once = wsgienv['wsgi.run_once'] - self.env = wsgienv - self.form = normalize(cgi.parse(self.inp, - self.env, - keep_blank_values=1)) - self._start_response = start_response - self.server_write = None - self.headers = [] - - def __iter__(self): - return iter([]) - - def read(self, count=-1): - return self.inp.read(count) - - def drain(self): - '''need to read all data from request, httplib is half-duplex''' - length = int(self.env.get('CONTENT_LENGTH', 0)) - for s in util.filechunkiter(self.inp, limit=length): - pass - - def respond(self, status, type=None, filename=None, length=0): - if self._start_response is not None: - - self.httphdr(type, filename, length) - if not self.headers: - raise RuntimeError("request.write called before headers sent") - - for k, v in self.headers: - if not isinstance(v, str): - raise TypeError('header value must be string: %r' % v) - - if isinstance(status, ErrorResponse): - self.header(status.headers) - if status.code == HTTP_NOT_MODIFIED: - # RFC 2616 Section 10.3.5: 304 Not Modified has cases where - # it MUST NOT include any headers other than these and no - # body - self.headers = [(k, v) for (k, v) in self.headers if - k in ('Date', 'ETag', 'Expires', - 'Cache-Control', 'Vary')] - status = statusmessage(status.code, status.message) - elif status == 200: - status = '200 Script output follows' - elif isinstance(status, int): - status = statusmessage(status) - - self.server_write = self._start_response(status, self.headers) - self._start_response = None - self.headers = [] - - def write(self, thing): - if hasattr(thing, "__iter__"): - for part in thing: - self.write(part) - else: - thing = str(thing) - try: - self.server_write(thing) - except socket.error, inst: - if inst[0] != errno.ECONNRESET: - raise - - def writelines(self, lines): - for line in lines: - self.write(line) - - def flush(self): - return None - - def close(self): - return None - - def header(self, headers=[('Content-Type','text/html')]): - self.headers.extend(headers) - - def httphdr(self, type=None, filename=None, length=0, headers={}): - headers = headers.items() - if type is not None: - headers.append(('Content-Type', type)) - if filename: - filename = (filename.split('/')[-1] - .replace('\\', '\\\\').replace('"', '\\"')) - headers.append(('Content-Disposition', - 'inline; filename="%s"' % filename)) - if length: - headers.append(('Content-Length', str(length))) - self.header(headers) - -def wsgiapplication(app_maker): - '''For compatibility with old CGI scripts. A plain hgweb() or hgwebdir() - can and should now be used as a WSGI application.''' - application = app_maker() - def run_wsgi(env, respond): - return application(env, respond) - return run_wsgi diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.pyo Binary files differdeleted file mode 100644 index 2d9b8b2..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.py deleted file mode 100644 index fa31afa..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.py +++ /dev/null @@ -1,309 +0,0 @@ -# hgweb/server.py - The standalone hg web server. -# -# 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 version 2 or any later version. - -import os, sys, errno, urllib, BaseHTTPServer, socket, SocketServer, traceback -from mercurial import util, error -from mercurial.i18n import _ - -def _splitURI(uri): - """ Return path and query splited from uri - - Just like CGI environment, the path is unquoted, the query is - not. - """ - if '?' in uri: - path, query = uri.split('?', 1) - else: - path, query = uri, '' - return urllib.unquote(path), query - -class _error_logger(object): - def __init__(self, handler): - self.handler = handler - def flush(self): - pass - def write(self, str): - self.writelines(str.split('\n')) - def writelines(self, seq): - for msg in seq: - self.handler.log_error("HG error: %s", msg) - -class _httprequesthandler(BaseHTTPServer.BaseHTTPRequestHandler): - - url_scheme = 'http' - - @staticmethod - def preparehttpserver(httpserver, ssl_cert): - """Prepare .socket of new HTTPServer instance""" - pass - - def __init__(self, *args, **kargs): - self.protocol_version = 'HTTP/1.1' - BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args, **kargs) - - def _log_any(self, fp, format, *args): - fp.write("%s - - [%s] %s\n" % (self.client_address[0], - self.log_date_time_string(), - format % args)) - fp.flush() - - def log_error(self, format, *args): - self._log_any(self.server.errorlog, format, *args) - - def log_message(self, format, *args): - self._log_any(self.server.accesslog, format, *args) - - def do_write(self): - try: - self.do_hgweb() - except socket.error, inst: - if inst[0] != errno.EPIPE: - raise - - def do_POST(self): - try: - self.do_write() - except StandardError: - self._start_response("500 Internal Server Error", []) - self._write("Internal Server Error") - tb = "".join(traceback.format_exception(*sys.exc_info())) - self.log_error("Exception happened during processing " - "request '%s':\n%s", self.path, tb) - - def do_GET(self): - self.do_POST() - - def do_hgweb(self): - path, query = _splitURI(self.path) - - env = {} - env['GATEWAY_INTERFACE'] = 'CGI/1.1' - env['REQUEST_METHOD'] = self.command - env['SERVER_NAME'] = self.server.server_name - env['SERVER_PORT'] = str(self.server.server_port) - env['REQUEST_URI'] = self.path - env['SCRIPT_NAME'] = self.server.prefix - env['PATH_INFO'] = path[len(self.server.prefix):] - env['REMOTE_HOST'] = self.client_address[0] - env['REMOTE_ADDR'] = self.client_address[0] - if query: - env['QUERY_STRING'] = query - - if self.headers.typeheader is None: - env['CONTENT_TYPE'] = self.headers.type - else: - env['CONTENT_TYPE'] = self.headers.typeheader - length = self.headers.getheader('content-length') - if length: - env['CONTENT_LENGTH'] = length - for header in [h for h in self.headers.keys() - if h not in ('content-type', 'content-length')]: - hkey = 'HTTP_' + header.replace('-', '_').upper() - hval = self.headers.getheader(header) - hval = hval.replace('\n', '').strip() - if hval: - env[hkey] = hval - env['SERVER_PROTOCOL'] = self.request_version - env['wsgi.version'] = (1, 0) - env['wsgi.url_scheme'] = self.url_scheme - env['wsgi.input'] = self.rfile - env['wsgi.errors'] = _error_logger(self) - env['wsgi.multithread'] = isinstance(self.server, - SocketServer.ThreadingMixIn) - env['wsgi.multiprocess'] = isinstance(self.server, - SocketServer.ForkingMixIn) - env['wsgi.run_once'] = 0 - - self.close_connection = True - self.saved_status = None - self.saved_headers = [] - self.sent_headers = False - self.length = None - for chunk in self.server.application(env, self._start_response): - self._write(chunk) - - def send_headers(self): - if not self.saved_status: - raise AssertionError("Sending headers before " - "start_response() called") - saved_status = self.saved_status.split(None, 1) - saved_status[0] = int(saved_status[0]) - self.send_response(*saved_status) - should_close = True - for h in self.saved_headers: - self.send_header(*h) - if h[0].lower() == 'content-length': - should_close = False - self.length = int(h[1]) - # The value of the Connection header is a list of case-insensitive - # tokens separated by commas and optional whitespace. - if 'close' in [token.strip().lower() for token in - self.headers.get('connection', '').split(',')]: - should_close = True - if should_close: - self.send_header('Connection', 'close') - self.close_connection = should_close - self.end_headers() - self.sent_headers = True - - def _start_response(self, http_status, headers, exc_info=None): - code, msg = http_status.split(None, 1) - code = int(code) - self.saved_status = http_status - bad_headers = ('connection', 'transfer-encoding') - self.saved_headers = [h for h in headers - if h[0].lower() not in bad_headers] - return self._write - - def _write(self, data): - if not self.saved_status: - raise AssertionError("data written before start_response() called") - elif not self.sent_headers: - self.send_headers() - if self.length is not None: - if len(data) > self.length: - raise AssertionError("Content-length header sent, but more " - "bytes than specified are being written.") - self.length = self.length - len(data) - self.wfile.write(data) - self.wfile.flush() - -class _httprequesthandleropenssl(_httprequesthandler): - """HTTPS handler based on pyOpenSSL""" - - url_scheme = 'https' - - @staticmethod - def preparehttpserver(httpserver, ssl_cert): - try: - import OpenSSL - OpenSSL.SSL.Context - except ImportError: - raise util.Abort(_("SSL support is unavailable")) - ctx = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD) - ctx.use_privatekey_file(ssl_cert) - ctx.use_certificate_file(ssl_cert) - sock = socket.socket(httpserver.address_family, httpserver.socket_type) - httpserver.socket = OpenSSL.SSL.Connection(ctx, sock) - httpserver.server_bind() - httpserver.server_activate() - - def setup(self): - self.connection = self.request - self.rfile = socket._fileobject(self.request, "rb", self.rbufsize) - self.wfile = socket._fileobject(self.request, "wb", self.wbufsize) - - def do_write(self): - import OpenSSL - try: - _httprequesthandler.do_write(self) - except OpenSSL.SSL.SysCallError, inst: - if inst.args[0] != errno.EPIPE: - raise - - def handle_one_request(self): - import OpenSSL - try: - _httprequesthandler.handle_one_request(self) - except (OpenSSL.SSL.SysCallError, OpenSSL.SSL.ZeroReturnError): - self.close_connection = True - pass - -class _httprequesthandlerssl(_httprequesthandler): - """HTTPS handler based on Pythons ssl module (introduced in 2.6)""" - - url_scheme = 'https' - - @staticmethod - def preparehttpserver(httpserver, ssl_cert): - try: - import ssl - ssl.wrap_socket - except ImportError: - raise util.Abort(_("SSL support is unavailable")) - httpserver.socket = ssl.wrap_socket(httpserver.socket, server_side=True, - certfile=ssl_cert, ssl_version=ssl.PROTOCOL_SSLv23) - - def setup(self): - self.connection = self.request - self.rfile = socket._fileobject(self.request, "rb", self.rbufsize) - self.wfile = socket._fileobject(self.request, "wb", self.wbufsize) - -try: - from threading import activeCount - _mixin = SocketServer.ThreadingMixIn -except ImportError: - if hasattr(os, "fork"): - _mixin = SocketServer.ForkingMixIn - else: - class _mixin: - pass - -def openlog(opt, default): - if opt and opt != '-': - return open(opt, 'a') - return default - -class MercurialHTTPServer(object, _mixin, BaseHTTPServer.HTTPServer): - - # SO_REUSEADDR has broken semantics on windows - if os.name == 'nt': - allow_reuse_address = 0 - - def __init__(self, ui, app, addr, handler, **kwargs): - BaseHTTPServer.HTTPServer.__init__(self, addr, handler, **kwargs) - self.daemon_threads = True - self.application = app - - handler.preparehttpserver(self, ui.config('web', 'certificate')) - - prefix = ui.config('web', 'prefix', '') - if prefix: - prefix = '/' + prefix.strip('/') - self.prefix = prefix - - alog = openlog(ui.config('web', 'accesslog', '-'), sys.stdout) - elog = openlog(ui.config('web', 'errorlog', '-'), sys.stderr) - self.accesslog = alog - self.errorlog = elog - - self.addr, self.port = self.socket.getsockname()[0:2] - self.fqaddr = socket.getfqdn(addr[0]) - -class IPv6HTTPServer(MercurialHTTPServer): - address_family = getattr(socket, 'AF_INET6', None) - def __init__(self, *args, **kwargs): - if self.address_family is None: - raise error.RepoError(_('IPv6 is not available on this system')) - super(IPv6HTTPServer, self).__init__(*args, **kwargs) - -def create_server(ui, app): - - if ui.config('web', 'certificate'): - if sys.version_info >= (2, 6): - handler = _httprequesthandlerssl - else: - handler = _httprequesthandleropenssl - else: - handler = _httprequesthandler - - if ui.configbool('web', 'ipv6'): - cls = IPv6HTTPServer - else: - cls = MercurialHTTPServer - - # ugly hack due to python issue5853 (for threaded use) - import mimetypes; mimetypes.init() - - address = ui.config('web', 'address', '') - port = util.getport(ui.config('web', 'port', 8000)) - try: - return cls(ui, app, (address, port), handler) - except socket.error, inst: - raise util.Abort(_("cannot start server at '%s:%d': %s") - % (address, port, inst.args[1])) diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.pyo Binary files differdeleted file mode 100644 index c90e5de..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.py deleted file mode 100644 index e290da6..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.py +++ /dev/null @@ -1,783 +0,0 @@ -# -# 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 version 2 or any later version. - -import os, mimetypes, re, cgi, copy -import webutil -from mercurial import error, encoding, archival, templater, templatefilters -from mercurial.node import short, hex -from mercurial.util import binary -from common import paritygen, staticfile, get_contact, ErrorResponse -from common import HTTP_OK, HTTP_FORBIDDEN, HTTP_NOT_FOUND -from mercurial import graphmod -from mercurial import help as helpmod -from mercurial.i18n import _ - -# __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', 'branches', 'summary', 'filediff', 'diff', 'annotate', - 'filelog', 'archive', 'static', 'graph', 'help', -] - -def log(web, req, tmpl): - if 'file' in req.form and req.form['file'][0]: - return filelog(web, req, tmpl) - else: - return changelog(web, req, tmpl) - -def rawfile(web, req, tmpl): - path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0]) - if not path: - content = manifest(web, req, tmpl) - req.respond(HTTP_OK, web.ctype) - return content - - try: - fctx = webutil.filectx(web.repo, req) - except error.LookupError, inst: - try: - content = manifest(web, req, tmpl) - req.respond(HTTP_OK, web.ctype) - return content - except ErrorResponse: - raise inst - - path = fctx.path() - text = fctx.data() - mt = mimetypes.guess_type(path)[0] - if mt is None: - mt = binary(text) and 'application/octet-stream' or 'text/plain' - if mt.startswith('text/'): - mt += '; charset="%s"' % encoding.encoding - - req.respond(HTTP_OK, mt, path, len(text)) - return [text] - -def _filerevision(web, tmpl, fctx): - f = fctx.path() - text = fctx.data() - parity = paritygen(web.stripecount) - - if binary(text): - mt = mimetypes.guess_type(f)[0] or 'application/octet-stream' - text = '(binary:%s)' % mt - - def lines(): - for lineno, t in enumerate(text.splitlines(True)): - yield {"line": t, - "lineid": "l%d" % (lineno + 1), - "linenumber": "% 6d" % (lineno + 1), - "parity": parity.next()} - - return tmpl("filerevision", - file=f, - path=webutil.up(f), - text=lines(), - rev=fctx.rev(), - node=hex(fctx.node()), - author=fctx.user(), - date=fctx.date(), - desc=fctx.description(), - branch=webutil.nodebranchnodefault(fctx), - parent=webutil.parents(fctx), - child=webutil.children(fctx), - rename=webutil.renamelink(fctx), - permissions=fctx.manifest().flags(f)) - -def file(web, req, tmpl): - path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0]) - if not path: - return manifest(web, req, tmpl) - try: - return _filerevision(web, tmpl, webutil.filectx(web.repo, req)) - except error.LookupError, inst: - try: - return manifest(web, req, tmpl) - except ErrorResponse: - raise inst - -def _search(web, req, tmpl): - - query = req.form['rev'][0] - revcount = web.maxchanges - if 'revcount' in req.form: - revcount = int(req.form.get('revcount', [revcount])[0]) - tmpl.defaults['sessionvars']['revcount'] = revcount - - lessvars = copy.copy(tmpl.defaults['sessionvars']) - lessvars['revcount'] = revcount / 2 - lessvars['rev'] = query - morevars = copy.copy(tmpl.defaults['sessionvars']) - morevars['revcount'] = revcount * 2 - morevars['rev'] = query - - def changelist(**map): - count = 0 - qw = query.lower().split() - - def revgen(): - for i in xrange(len(web.repo) - 1, 0, -100): - l = [] - for j in xrange(max(0, i - 100), i + 1): - ctx = web.repo[j] - l.append(ctx) - l.reverse() - for e in l: - yield e - - for ctx in revgen(): - miss = 0 - for q in qw: - if not (q in ctx.user().lower() or - q in ctx.description().lower() or - q in " ".join(ctx.files()).lower()): - miss = 1 - break - if miss: - continue - - count += 1 - n = ctx.node() - showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n) - files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles) - - yield tmpl('searchentry', - parity=parity.next(), - author=ctx.user(), - parent=webutil.parents(ctx), - child=webutil.children(ctx), - changelogtag=showtags, - desc=ctx.description(), - date=ctx.date(), - files=files, - rev=ctx.rev(), - node=hex(n), - tags=webutil.nodetagsdict(web.repo, n), - inbranch=webutil.nodeinbranch(web.repo, ctx), - branches=webutil.nodebranchdict(web.repo, ctx)) - - if count >= revcount: - break - - tip = web.repo['tip'] - parity = paritygen(web.stripecount) - - return tmpl('search', query=query, node=tip.hex(), - entries=changelist, archives=web.archivelist("tip"), - morevars=morevars, lessvars=lessvars) - -def changelog(web, req, tmpl, shortlog=False): - - if 'node' in req.form: - ctx = webutil.changectx(web.repo, req) - else: - if 'rev' in req.form: - hi = req.form['rev'][0] - else: - hi = len(web.repo) - 1 - try: - ctx = web.repo[hi] - except error.RepoError: - return _search(web, req, tmpl) # XXX redirect to 404 page? - - def changelist(limit=0, **map): - l = [] # build a list in forward order for efficiency - for i in xrange(start, end): - ctx = web.repo[i] - n = ctx.node() - showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n) - files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles) - - l.insert(0, {"parity": parity.next(), - "author": ctx.user(), - "parent": webutil.parents(ctx, i - 1), - "child": webutil.children(ctx, i + 1), - "changelogtag": showtags, - "desc": ctx.description(), - "date": ctx.date(), - "files": files, - "rev": i, - "node": hex(n), - "tags": webutil.nodetagsdict(web.repo, n), - "inbranch": webutil.nodeinbranch(web.repo, ctx), - "branches": webutil.nodebranchdict(web.repo, ctx) - }) - - if limit > 0: - l = l[:limit] - - for e in l: - yield e - - revcount = shortlog and web.maxshortchanges or web.maxchanges - if 'revcount' in req.form: - revcount = int(req.form.get('revcount', [revcount])[0]) - tmpl.defaults['sessionvars']['revcount'] = revcount - - lessvars = copy.copy(tmpl.defaults['sessionvars']) - lessvars['revcount'] = revcount / 2 - morevars = copy.copy(tmpl.defaults['sessionvars']) - morevars['revcount'] = revcount * 2 - - count = len(web.repo) - pos = ctx.rev() - start = max(0, pos - revcount + 1) - end = min(count, start + revcount) - pos = end - 1 - parity = paritygen(web.stripecount, offset=start - end) - - changenav = webutil.revnavgen(pos, revcount, count, web.repo.changectx) - - return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav, - node=hex(ctx.node()), rev=pos, changesets=count, - entries=lambda **x: changelist(limit=0,**x), - latestentry=lambda **x: changelist(limit=1,**x), - archives=web.archivelist("tip"), revcount=revcount, - morevars=morevars, lessvars=lessvars) - -def shortlog(web, req, tmpl): - return changelog(web, req, tmpl, shortlog = True) - -def changeset(web, req, tmpl): - ctx = webutil.changectx(web.repo, req) - showtags = webutil.showtag(web.repo, tmpl, 'changesettag', ctx.node()) - showbranch = webutil.nodebranchnodefault(ctx) - - files = [] - parity = paritygen(web.stripecount) - for f in ctx.files(): - template = f in ctx and 'filenodelink' or 'filenolink' - files.append(tmpl(template, - node=ctx.hex(), file=f, - parity=parity.next())) - - parity = paritygen(web.stripecount) - style = web.config('web', 'style', 'paper') - if 'style' in req.form: - style = req.form['style'][0] - - diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style) - return tmpl('changeset', - diff=diffs, - rev=ctx.rev(), - node=ctx.hex(), - parent=webutil.parents(ctx), - child=webutil.children(ctx), - changesettag=showtags, - changesetbranch=showbranch, - author=ctx.user(), - desc=ctx.description(), - date=ctx.date(), - files=files, - archives=web.archivelist(ctx.hex()), - tags=webutil.nodetagsdict(web.repo, ctx.node()), - branch=webutil.nodebranchnodefault(ctx), - inbranch=webutil.nodeinbranch(web.repo, ctx), - branches=webutil.nodebranchdict(web.repo, ctx)) - -rev = changeset - -def manifest(web, req, tmpl): - ctx = webutil.changectx(web.repo, req) - path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0]) - mf = ctx.manifest() - node = ctx.node() - - files = {} - dirs = {} - parity = paritygen(web.stripecount) - - if path and path[-1] != "/": - path += "/" - l = len(path) - abspath = "/" + path - - for f, n in mf.iteritems(): - if f[:l] != path: - continue - remain = f[l:] - elements = remain.split('/') - if len(elements) == 1: - files[remain] = f - else: - h = dirs # need to retain ref to dirs (root) - for elem in elements[0:-1]: - if elem not in h: - h[elem] = {} - h = h[elem] - if len(h) > 1: - break - h[None] = None # denotes files present - - if mf and not files and not dirs: - raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path) - - def filelist(**map): - for f in sorted(files): - full = files[f] - - fctx = ctx.filectx(full) - yield {"file": full, - "parity": parity.next(), - "basename": f, - "date": fctx.date(), - "size": fctx.size(), - "permissions": mf.flags(full)} - - def dirlist(**map): - for d in sorted(dirs): - - emptydirs = [] - h = dirs[d] - while isinstance(h, dict) and len(h) == 1: - k, v = h.items()[0] - if v: - emptydirs.append(k) - h = v - - path = "%s%s" % (abspath, d) - yield {"parity": parity.next(), - "path": path, - "emptydirs": "/".join(emptydirs), - "basename": d} - - return tmpl("manifest", - rev=ctx.rev(), - node=hex(node), - path=abspath, - up=webutil.up(abspath), - upparity=parity.next(), - fentries=filelist, - dentries=dirlist, - archives=web.archivelist(hex(node)), - tags=webutil.nodetagsdict(web.repo, node), - inbranch=webutil.nodeinbranch(web.repo, ctx), - branches=webutil.nodebranchdict(web.repo, ctx)) - -def tags(web, req, tmpl): - i = web.repo.tagslist() - i.reverse() - parity = paritygen(web.stripecount) - - def entries(notip=False, limit=0, **map): - count = 0 - for k, n in i: - if notip and k == "tip": - continue - if limit > 0 and count >= limit: - continue - count = count + 1 - yield {"parity": parity.next(), - "tag": k, - "date": web.repo[n].date(), - "node": hex(n)} - - return tmpl("tags", - node=hex(web.repo.changelog.tip()), - entries=lambda **x: entries(False, 0, **x), - entriesnotip=lambda **x: entries(True, 0, **x), - latestentry=lambda **x: entries(True, 1, **x)) - -def branches(web, req, tmpl): - tips = (web.repo[n] for t, n in web.repo.branchtags().iteritems()) - heads = web.repo.heads() - parity = paritygen(web.stripecount) - sortkey = lambda ctx: ('close' not in ctx.extra(), ctx.rev()) - - def entries(limit, **map): - count = 0 - for ctx in sorted(tips, key=sortkey, reverse=True): - if limit > 0 and count >= limit: - return - count += 1 - if ctx.node() not in heads: - status = 'inactive' - elif not web.repo.branchheads(ctx.branch()): - status = 'closed' - else: - status = 'open' - yield {'parity': parity.next(), - 'branch': ctx.branch(), - 'status': status, - 'node': ctx.hex(), - 'date': ctx.date()} - - return tmpl('branches', node=hex(web.repo.changelog.tip()), - entries=lambda **x: entries(0, **x), - latestentry=lambda **x: entries(1, **x)) - -def summary(web, req, tmpl): - i = web.repo.tagslist() - i.reverse() - - def tagentries(**map): - parity = paritygen(web.stripecount) - count = 0 - for k, n in i: - if k == "tip": # skip tip - continue - - count += 1 - if count > 10: # limit to 10 tags - break - - yield tmpl("tagentry", - parity=parity.next(), - tag=k, - node=hex(n), - date=web.repo[n].date()) - - def branches(**map): - parity = paritygen(web.stripecount) - - b = web.repo.branchtags() - l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()] - for r, n, t in sorted(l): - yield {'parity': parity.next(), - 'branch': t, - 'node': hex(n), - 'date': web.repo[n].date()} - - def changelist(**map): - parity = paritygen(web.stripecount, offset=start - end) - l = [] # build a list in forward order for efficiency - for i in xrange(start, end): - ctx = web.repo[i] - n = ctx.node() - hn = hex(n) - - l.insert(0, tmpl( - 'shortlogentry', - parity=parity.next(), - author=ctx.user(), - desc=ctx.description(), - date=ctx.date(), - rev=i, - node=hn, - tags=webutil.nodetagsdict(web.repo, n), - inbranch=webutil.nodeinbranch(web.repo, ctx), - branches=webutil.nodebranchdict(web.repo, ctx))) - - yield l - - tip = web.repo['tip'] - count = len(web.repo) - start = max(0, count - web.maxchanges) - end = min(count, start + web.maxchanges) - - return tmpl("summary", - desc=web.config("web", "description", "unknown"), - owner=get_contact(web.config) or "unknown", - lastchange=tip.date(), - tags=tagentries, - branches=branches, - shortlog=changelist, - node=tip.hex(), - archives=web.archivelist("tip")) - -def filediff(web, req, tmpl): - fctx, ctx = None, None - try: - fctx = webutil.filectx(web.repo, req) - except LookupError: - ctx = webutil.changectx(web.repo, req) - path = webutil.cleanpath(web.repo, req.form['file'][0]) - if path not in ctx.files(): - raise - - if fctx is not None: - n = fctx.node() - path = fctx.path() - else: - n = ctx.node() - # path already defined in except clause - - parity = paritygen(web.stripecount) - style = web.config('web', 'style', 'paper') - if 'style' in req.form: - style = req.form['style'][0] - - diffs = webutil.diffs(web.repo, tmpl, fctx or ctx, [path], parity, style) - rename = fctx and webutil.renamelink(fctx) or [] - ctx = fctx and fctx or ctx - return tmpl("filediff", - file=path, - node=hex(n), - rev=ctx.rev(), - date=ctx.date(), - desc=ctx.description(), - author=ctx.user(), - rename=rename, - branch=webutil.nodebranchnodefault(ctx), - parent=webutil.parents(ctx), - child=webutil.children(ctx), - diff=diffs) - -diff = filediff - -def annotate(web, req, tmpl): - fctx = webutil.filectx(web.repo, req) - f = fctx.path() - parity = paritygen(web.stripecount) - - def annotate(**map): - last = None - if binary(fctx.data()): - mt = (mimetypes.guess_type(fctx.path())[0] - or 'application/octet-stream') - lines = enumerate([((fctx.filectx(fctx.filerev()), 1), - '(binary:%s)' % mt)]) - else: - lines = enumerate(fctx.annotate(follow=True, linenumber=True)) - for lineno, ((f, targetline), l) in lines: - fnode = f.filenode() - - if last != fnode: - last = fnode - - yield {"parity": parity.next(), - "node": hex(f.node()), - "rev": f.rev(), - "author": f.user(), - "desc": f.description(), - "file": f.path(), - "targetline": targetline, - "line": l, - "lineid": "l%d" % (lineno + 1), - "linenumber": "% 6d" % (lineno + 1)} - - return tmpl("fileannotate", - file=f, - annotate=annotate, - path=webutil.up(f), - rev=fctx.rev(), - node=hex(fctx.node()), - author=fctx.user(), - date=fctx.date(), - desc=fctx.description(), - rename=webutil.renamelink(fctx), - branch=webutil.nodebranchnodefault(fctx), - parent=webutil.parents(fctx), - child=webutil.children(fctx), - permissions=fctx.manifest().flags(f)) - -def filelog(web, req, tmpl): - - try: - fctx = webutil.filectx(web.repo, req) - f = fctx.path() - fl = fctx.filelog() - except error.LookupError: - f = webutil.cleanpath(web.repo, req.form['file'][0]) - fl = web.repo.file(f) - numrevs = len(fl) - if not numrevs: # file doesn't exist at all - raise - rev = webutil.changectx(web.repo, req).rev() - first = fl.linkrev(0) - if rev < first: # current rev is from before file existed - raise - frev = numrevs - 1 - while fl.linkrev(frev) > rev: - frev -= 1 - fctx = web.repo.filectx(f, fl.linkrev(frev)) - - revcount = web.maxshortchanges - if 'revcount' in req.form: - revcount = int(req.form.get('revcount', [revcount])[0]) - tmpl.defaults['sessionvars']['revcount'] = revcount - - lessvars = copy.copy(tmpl.defaults['sessionvars']) - lessvars['revcount'] = revcount / 2 - morevars = copy.copy(tmpl.defaults['sessionvars']) - morevars['revcount'] = revcount * 2 - - count = fctx.filerev() + 1 - start = max(0, fctx.filerev() - revcount + 1) # first rev on this page - end = min(count, start + revcount) # last rev on this page - parity = paritygen(web.stripecount, offset=start - end) - - def entries(limit=0, **map): - l = [] - - repo = web.repo - for i in xrange(start, end): - iterfctx = fctx.filectx(i) - - l.insert(0, {"parity": parity.next(), - "filerev": i, - "file": f, - "node": hex(iterfctx.node()), - "author": iterfctx.user(), - "date": iterfctx.date(), - "rename": webutil.renamelink(iterfctx), - "parent": webutil.parents(iterfctx), - "child": webutil.children(iterfctx), - "desc": iterfctx.description(), - "tags": webutil.nodetagsdict(repo, iterfctx.node()), - "branch": webutil.nodebranchnodefault(iterfctx), - "inbranch": webutil.nodeinbranch(repo, iterfctx), - "branches": webutil.nodebranchdict(repo, iterfctx)}) - - if limit > 0: - l = l[:limit] - - for e in l: - yield e - - nodefunc = lambda x: fctx.filectx(fileid=x) - nav = webutil.revnavgen(end - 1, revcount, count, nodefunc) - return tmpl("filelog", file=f, node=hex(fctx.node()), nav=nav, - entries=lambda **x: entries(limit=0, **x), - latestentry=lambda **x: entries(limit=1, **x), - revcount=revcount, morevars=morevars, lessvars=lessvars) - -def archive(web, req, tmpl): - type_ = req.form.get('type', [None])[0] - allowed = web.configlist("web", "allow_archive") - key = req.form['node'][0] - - if type_ not in web.archives: - msg = 'Unsupported archive type: %s' % type_ - raise ErrorResponse(HTTP_NOT_FOUND, msg) - - if not ((type_ in allowed or - web.configbool("web", "allow" + type_, False))): - msg = 'Archive type not allowed: %s' % type_ - raise ErrorResponse(HTTP_FORBIDDEN, msg) - - reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame)) - cnode = web.repo.lookup(key) - arch_version = key - if cnode == key or key == 'tip': - arch_version = short(cnode) - name = "%s-%s" % (reponame, arch_version) - mimetype, artype, extension, encoding = web.archive_specs[type_] - headers = [ - ('Content-Type', mimetype), - ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension)) - ] - if encoding: - headers.append(('Content-Encoding', encoding)) - req.header(headers) - req.respond(HTTP_OK) - archival.archive(web.repo, req, cnode, artype, prefix=name) - return [] - - -def static(web, req, tmpl): - 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", None, untrusted=False) - if not static: - tp = web.templatepath or templater.templatepath() - if isinstance(tp, str): - tp = [tp] - static = [os.path.join(p, 'static') for p in tp] - return [staticfile(static, fname, req)] - -def graph(web, req, tmpl): - - rev = webutil.changectx(web.repo, req).rev() - bg_height = 39 - revcount = web.maxshortchanges - if 'revcount' in req.form: - revcount = int(req.form.get('revcount', [revcount])[0]) - tmpl.defaults['sessionvars']['revcount'] = revcount - - lessvars = copy.copy(tmpl.defaults['sessionvars']) - lessvars['revcount'] = revcount / 2 - morevars = copy.copy(tmpl.defaults['sessionvars']) - morevars['revcount'] = revcount * 2 - - max_rev = len(web.repo) - 1 - revcount = min(max_rev, revcount) - revnode = web.repo.changelog.node(rev) - revnode_hex = hex(revnode) - uprev = min(max_rev, rev + revcount) - downrev = max(0, rev - revcount) - count = len(web.repo) - changenav = webutil.revnavgen(rev, revcount, count, web.repo.changectx) - - dag = graphmod.revisions(web.repo, rev, downrev) - tree = list(graphmod.colored(dag)) - canvasheight = (len(tree) + 1) * bg_height - 27 - data = [] - for (id, type, ctx, vtx, edges) in tree: - if type != graphmod.CHANGESET: - continue - node = short(ctx.node()) - age = templatefilters.age(ctx.date()) - desc = templatefilters.firstline(ctx.description()) - desc = cgi.escape(templatefilters.nonempty(desc)) - user = cgi.escape(templatefilters.person(ctx.user())) - branch = ctx.branch() - branch = branch, web.repo.branchtags().get(branch) == ctx.node() - data.append((node, vtx, edges, desc, user, age, branch, ctx.tags())) - - return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev, - lessvars=lessvars, morevars=morevars, downrev=downrev, - canvasheight=canvasheight, jsdata=data, bg_height=bg_height, - node=revnode_hex, changenav=changenav) - -def _getdoc(e): - doc = e[0].__doc__ - if doc: - doc = doc.split('\n')[0] - else: - doc = _('(no help text available)') - return doc - -def help(web, req, tmpl): - from mercurial import commands # avoid cycle - - topicname = req.form.get('node', [None])[0] - if not topicname: - topic = [] - - def topics(**map): - for entries, summary, _ in helpmod.helptable: - entries = sorted(entries, key=len) - yield {'topic': entries[-1], 'summary': summary} - - early, other = [], [] - primary = lambda s: s.split('|')[0] - for c, e in commands.table.iteritems(): - doc = _getdoc(e) - if 'DEPRECATED' in doc or c.startswith('debug'): - continue - cmd = primary(c) - if cmd.startswith('^'): - early.append((cmd[1:], doc)) - else: - other.append((cmd, doc)) - - early.sort() - other.sort() - - def earlycommands(**map): - for c, doc in early: - yield {'topic': c, 'summary': doc} - - def othercommands(**map): - for c, doc in other: - yield {'topic': c, 'summary': doc} - - return tmpl('helptopics', topics=topics, earlycommands=earlycommands, - othercommands=othercommands, title='Index') - - u = webutil.wsgiui() - u.pushbuffer() - try: - commands.help_(u, topicname) - except error.UnknownCommand: - raise ErrorResponse(HTTP_NOT_FOUND) - doc = u.popbuffer() - return tmpl('help', topic=topicname, doc=doc) diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.pyo Binary files differdeleted file mode 100644 index 0ae06ef..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.py deleted file mode 100644 index 5dbff02..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.py +++ /dev/null @@ -1,226 +0,0 @@ -# hgweb/webutil.py - utility library for the web interface. -# -# 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 version 2 or any later version. - -import os, copy -from mercurial import match, patch, util, error, ui -from mercurial.node import hex, nullid - -def up(p): - if p[0] != "/": - p = "/" + p - if p[-1] == "/": - p = p[:-1] - up = os.path.dirname(p) - if up == "/": - return "/" - return up + "/" - -def revnavgen(pos, pagelen, limit, nodefunc): - def seq(factor, limit=None): - if limit: - yield limit - if limit >= 20 and limit <= 40: - yield 50 - else: - yield 1 * factor - yield 3 * factor - for f in seq(factor * 10): - yield f - - navbefore = [] - navafter = [] - - last = 0 - for f in seq(1, pagelen): - if f < pagelen or f <= last: - continue - if f > limit: - break - last = f - if pos + f < limit: - navafter.append(("+%d" % f, hex(nodefunc(pos + f).node()))) - if pos - f >= 0: - navbefore.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node()))) - - navafter.append(("tip", "tip")) - try: - navbefore.insert(0, ("(0)", hex(nodefunc('0').node()))) - except error.RepoError: - pass - - def gen(l): - def f(**map): - for label, node in l: - yield {"label": label, "node": node} - return f - - return (dict(before=gen(navbefore), after=gen(navafter)),) - -def _siblings(siblings=[], hiderev=None): - siblings = [s for s in siblings if s.node() != nullid] - if len(siblings) == 1 and siblings[0].rev() == hiderev: - return - for s in siblings: - d = {'node': hex(s.node()), 'rev': s.rev()} - d['user'] = s.user() - d['date'] = s.date() - d['description'] = s.description() - d['branch'] = s.branch() - if hasattr(s, 'path'): - d['file'] = s.path() - yield d - -def parents(ctx, hide=None): - return _siblings(ctx.parents(), hide) - -def children(ctx, hide=None): - return _siblings(ctx.children(), hide) - -def renamelink(fctx): - r = fctx.renamed() - if r: - return [dict(file=r[0], node=hex(r[1]))] - return [] - -def nodetagsdict(repo, node): - return [{"name": i} for i in repo.nodetags(node)] - -def nodebranchdict(repo, ctx): - branches = [] - branch = ctx.branch() - # If this is an empty repo, ctx.node() == nullid, - # ctx.branch() == 'default', but branchtags() is - # an empty dict. Using dict.get avoids a traceback. - if repo.branchtags().get(branch) == ctx.node(): - branches.append({"name": branch}) - return branches - -def nodeinbranch(repo, ctx): - branches = [] - branch = ctx.branch() - if branch != 'default' and repo.branchtags().get(branch) != ctx.node(): - branches.append({"name": branch}) - return branches - -def nodebranchnodefault(ctx): - branches = [] - branch = ctx.branch() - if branch != 'default': - branches.append({"name": branch}) - return branches - -def showtag(repo, tmpl, t1, node=nullid, **args): - for t in repo.nodetags(node): - yield tmpl(t1, tag=t, **args) - -def cleanpath(repo, path): - path = path.lstrip('/') - return util.canonpath(repo.root, '', path) - -def changectx(repo, req): - changeid = "tip" - if 'node' in req.form: - changeid = req.form['node'][0] - elif 'manifest' in req.form: - changeid = req.form['manifest'][0] - - try: - ctx = repo[changeid] - except error.RepoError: - man = repo.manifest - ctx = repo[man.linkrev(man.rev(man.lookup(changeid)))] - - return ctx - -def filectx(repo, req): - path = cleanpath(repo, req.form['file'][0]) - if 'node' in req.form: - changeid = req.form['node'][0] - else: - changeid = req.form['filenode'][0] - try: - fctx = repo[changeid][path] - except error.RepoError: - fctx = repo.filectx(path, fileid=changeid) - - return fctx - -def listfilediffs(tmpl, files, node, max): - for f in files[:max]: - yield tmpl('filedifflink', node=hex(node), file=f) - if len(files) > max: - yield tmpl('fileellipses') - -def diffs(repo, tmpl, ctx, files, parity, style): - - def countgen(): - start = 1 - while True: - yield start - start += 1 - - blockcount = countgen() - def prettyprintlines(diff): - blockno = blockcount.next() - for lineno, l in enumerate(diff.splitlines(True)): - lineno = "%d.%d" % (blockno, lineno + 1) - if l.startswith('+'): - ltype = "difflineplus" - elif l.startswith('-'): - ltype = "difflineminus" - elif l.startswith('@'): - ltype = "difflineat" - else: - ltype = "diffline" - yield tmpl(ltype, - line=l, - lineid="l%s" % lineno, - linenumber="% 8s" % lineno) - - if files: - m = match.exact(repo.root, repo.getcwd(), files) - else: - m = match.always(repo.root, repo.getcwd()) - - diffopts = patch.diffopts(repo.ui, untrusted=True) - parents = ctx.parents() - node1 = parents and parents[0].node() or nullid - node2 = ctx.node() - - block = [] - for chunk in patch.diff(repo, node1, node2, m, opts=diffopts): - if chunk.startswith('diff') and block: - yield tmpl('diffblock', parity=parity.next(), - lines=prettyprintlines(''.join(block))) - block = [] - if chunk.startswith('diff') and style != 'raw': - chunk = ''.join(chunk.splitlines(True)[1:]) - block.append(chunk) - yield tmpl('diffblock', parity=parity.next(), - lines=prettyprintlines(''.join(block))) - -class sessionvars(object): - def __init__(self, vars, start='?'): - self.start = start - self.vars = vars - def __getitem__(self, key): - return self.vars[key] - def __setitem__(self, key, value): - self.vars[key] = value - def __copy__(self): - return sessionvars(copy.copy(self.vars), self.start) - def __iter__(self): - separator = self.start - for key, value in self.vars.iteritems(): - yield {'name': key, 'value': str(value), 'separator': separator} - separator = '&' - -class wsgiui(ui.ui): - # default termwidth breaks under mod_wsgi - def termwidth(self): - return 80 diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.pyo Binary files differdeleted file mode 100644 index 5a9a36f..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.pyo +++ /dev/null diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.py b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.py deleted file mode 100644 index 8dc5060..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.py +++ /dev/null @@ -1,77 +0,0 @@ -# hgweb/wsgicgi.py - CGI->WSGI translator -# -# Copyright 2006 Eric Hopper <hopper@omnifarious.org> -# -# This software may be used and distributed according to the terms of the -# GNU General Public License version 2 or any later version. -# -# This was originally copied from the public domain code at -# http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side - -import os, sys -from mercurial import util - -def launch(application): - util.set_binary(sys.stdin) - util.set_binary(sys.stdout) - - environ = dict(os.environ.iteritems()) - environ.setdefault('PATH_INFO', '') - if environ.get('SERVER_SOFTWARE', '').startswith('Microsoft-IIS'): - # IIS includes script_name in path_info - scriptname = environ['SCRIPT_NAME'] - if environ['PATH_INFO'].startswith(scriptname): - environ['PATH_INFO'] = environ['PATH_INFO'][len(scriptname):] - - environ['wsgi.input'] = sys.stdin - environ['wsgi.errors'] = sys.stderr - environ['wsgi.version'] = (1, 0) - environ['wsgi.multithread'] = False - environ['wsgi.multiprocess'] = True - environ['wsgi.run_once'] = True - - if environ.get('HTTPS', 'off').lower() in ('on', '1', 'yes'): - environ['wsgi.url_scheme'] = 'https' - else: - environ['wsgi.url_scheme'] = 'http' - - headers_set = [] - headers_sent = [] - out = sys.stdout - - def write(data): - if not headers_set: - raise AssertionError("write() before start_response()") - - elif not headers_sent: - # Before the first output, send the stored headers - status, response_headers = headers_sent[:] = headers_set - out.write('Status: %s\r\n' % status) - for header in response_headers: - out.write('%s: %s\r\n' % header) - out.write('\r\n') - - out.write(data) - out.flush() - - def start_response(status, response_headers, exc_info=None): - if exc_info: - try: - if headers_sent: - # Re-raise original exception if headers sent - raise exc_info[0](exc_info[1], exc_info[2]) - finally: - exc_info = None # avoid dangling circular ref - elif headers_set: - raise AssertionError("Headers already set!") - - headers_set[:] = [status, response_headers] - return write - - content = application(environ, start_response) - try: - for chunk in content: - write(chunk) - finally: - if hasattr(content, 'close'): - content.close() diff --git a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.pyo b/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.pyo Binary files differdeleted file mode 100644 index 0b669d9..0000000 --- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.pyo +++ /dev/null |