summaryrefslogtreecommitdiff
path: root/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb
diff options
context:
space:
mode:
authorNishanth Amuluru2011-01-11 22:41:51 +0530
committerNishanth Amuluru2011-01-11 22:41:51 +0530
commitb03203c8cb991c16ac8a3d74c8c4078182d0bb48 (patch)
tree7cf13b2deacbfaaec99edb431b83ddd5ea734a52 /eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb
parent0c50203cd9eb94b819883c3110922e873f003138 (diff)
downloadpytask-b03203c8cb991c16ac8a3d74c8c4078182d0bb48.tar.gz
pytask-b03203c8cb991c16ac8a3d74c8c4078182d0bb48.tar.bz2
pytask-b03203c8cb991c16ac8a3d74c8c4078182d0bb48.zip
removed all the buildout files
Diffstat (limited to 'eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb')
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.py31
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.pyobin1270 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.py161
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.pyobin6498 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgweb_mod.py290
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgweb_mod.pyobin10447 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgwebdir_mod.py359
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/hgwebdir_mod.pyobin14489 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.py75
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.pyobin4062 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.py147
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.pyobin7397 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.py309
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.pyobin15769 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.py783
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.pyobin30612 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.py226
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.pyobin11377 -> 0 bytes
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.py77
-rw-r--r--eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.pyobin2518 -> 0 bytes
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
deleted file mode 100644
index fe872c0..0000000
--- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/__init__.pyo
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index c743684..0000000
--- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/common.pyo
+++ /dev/null
Binary files differ
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
deleted 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
Binary files differ
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
deleted 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
Binary files differ
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
deleted file mode 100644
index a747da1..0000000
--- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/protocol.pyo
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index 2d9b8b2..0000000
--- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/request.pyo
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index c90e5de..0000000
--- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/server.pyo
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index 0ae06ef..0000000
--- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webcommands.pyo
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index 5a9a36f..0000000
--- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/webutil.pyo
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index 0b669d9..0000000
--- a/eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/hgweb/wsgicgi.pyo
+++ /dev/null
Binary files differ