Various fixes and improvements.
* lib/config.py: (_parse_roots): get rid of a string method usage. * lib/popen.py: (pipe_cmds): stop using the += syntax (not compatible with 1.5.2) * lib/sapi.py: (CgiServer.__init__): use os.environ, not os.getenv() (IIS_FixURL): stop using the += syntax * lib/viewcvs.py: - note: these changes look big, but are small. use 'cvs diff -b' to see the real change without the reindentation. (markup_stream_python): record a note about some future work (run_viewcvs): new function which holds the guts of ViewCVS. this used to be main() a long while back before that got monkeyed. this is really just a reindent. (main): hold the exception handling logic. tweak then the t_start and t_end calls are made, relative to the try/finally. git-svn-id: http://viewvc.tigris.org/svn/viewvc/trunk@638 8cb11bc2-c004-0410-86c3-e597b4017df7remotes/tags/1.0.0-rc1
parent
14c0409e77
commit
d51c87a71a
|
@ -221,7 +221,7 @@ class Config:
|
||||||
def _parse_roots(config_name, config_value):
|
def _parse_roots(config_name, config_value):
|
||||||
roots = { }
|
roots = { }
|
||||||
for root in config_value:
|
for root in config_value:
|
||||||
pos = root.find(':')
|
pos = string.find(root, ':')
|
||||||
if pos < 0:
|
if pos < 0:
|
||||||
raise MalformedRoot(config_name, root)
|
raise MalformedRoot(config_name, root)
|
||||||
name, path = map(string.strip, (root[:pos], root[pos+1:]))
|
name, path = map(string.strip, (root[:pos], root[pos+1:]))
|
||||||
|
|
|
@ -153,7 +153,7 @@ def pipe_cmds(cmds):
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
i += 1
|
i = i + 1
|
||||||
|
|
||||||
dbgOut, dbgErr = StringIO.StringIO(), StringIO.StringIO()
|
dbgOut, dbgErr = StringIO.StringIO(), StringIO.StringIO()
|
||||||
|
|
||||||
|
@ -181,7 +181,7 @@ def pipe_cmds(cmds):
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
i += 1
|
i = i + 1
|
||||||
if i < len(cmds):
|
if i < len(cmds):
|
||||||
nextStdIn, hStdOut = win32popen.CreatePipe(1, 1, 1, 1)
|
nextStdIn, hStdOut = win32popen.CreatePipe(1, 1, 1, 1)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -19,7 +19,7 @@ class CgiServer:
|
||||||
self.header_sent = 0
|
self.header_sent = 0
|
||||||
self.pageGlobals = {}
|
self.pageGlobals = {}
|
||||||
|
|
||||||
if os.getenv('SERVER_SOFTWARE', '')[:13] == 'Microsoft-IIS':
|
if os.environ.get('SERVER_SOFTWARE', '')[:13] == 'Microsoft-IIS':
|
||||||
self.iis = 1
|
self.iis = 1
|
||||||
else:
|
else:
|
||||||
self.iis = 0
|
self.iis = 0
|
||||||
|
@ -54,7 +54,7 @@ class CgiServer:
|
||||||
def escape(self, s, quote = None):
|
def escape(self, s, quote = None):
|
||||||
return cgi.escape(s, quote)
|
return cgi.escape(s, quote)
|
||||||
|
|
||||||
def getenv(self, name,value = None):
|
def getenv(self, name, value=None):
|
||||||
# If the viewcvs cgi's are in the /viewcvs/ folder on the web server and a
|
# If the viewcvs cgi's are in the /viewcvs/ folder on the web server and a
|
||||||
# request looks like
|
# request looks like
|
||||||
#
|
#
|
||||||
|
@ -111,9 +111,9 @@ def IIS_FixURL(url):
|
||||||
else:
|
else:
|
||||||
dport = "80"
|
dport = "80"
|
||||||
prefix = "http://"
|
prefix = "http://"
|
||||||
prefix += os.environ['HTTP_HOST']
|
prefix = prefix + os.environ['HTTP_HOST']
|
||||||
if os.environ['SERVER_PORT'] != dport:
|
if os.environ['SERVER_PORT'] != dport:
|
||||||
prefix += ":" + os.environ['SERVER_PORT']
|
prefix = prefix + ":" + os.environ['SERVER_PORT']
|
||||||
return prefix + url
|
return prefix + url
|
||||||
return url
|
return url
|
||||||
|
|
||||||
|
|
246
lib/viewcvs.py
246
lib/viewcvs.py
|
@ -578,6 +578,10 @@ def markup_stream_default(fp):
|
||||||
print '</pre>'
|
print '</pre>'
|
||||||
|
|
||||||
def markup_stream_python(fp):
|
def markup_stream_python(fp):
|
||||||
|
### convert this code to use the recipe at:
|
||||||
|
### http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52298
|
||||||
|
### note that the cookbook states all the code is licensed according to
|
||||||
|
### the Python license.
|
||||||
try:
|
try:
|
||||||
# see if Marc-Andre Lemburg's py2html stuff is around
|
# see if Marc-Andre Lemburg's py2html stuff is around
|
||||||
# http://starship.python.net/crew/lemburg/SoftwareDescriptions.html#py2html.py
|
# http://starship.python.net/crew/lemburg/SoftwareDescriptions.html#py2html.py
|
||||||
|
@ -2898,123 +2902,134 @@ def handle_config():
|
||||||
debug.t_end('load-config')
|
debug.t_end('load-config')
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def run_viewcvs(server):
|
||||||
global server
|
# handle the configuration stuff
|
||||||
|
handle_config()
|
||||||
|
|
||||||
|
# build a Request object, which contains info about the HTTP request
|
||||||
|
request = Request()
|
||||||
|
|
||||||
|
# most of the startup is done now.
|
||||||
|
debug.t_end('startup')
|
||||||
|
|
||||||
|
# if this is just a simple hunk of doc, then serve it up
|
||||||
|
if request.has_docroot_magic:
|
||||||
|
view_doc(request)
|
||||||
|
return
|
||||||
|
|
||||||
|
# check the forbidden list
|
||||||
|
if cfg.is_forbidden(request.module):
|
||||||
|
raise debug.ViewcvsException('Access to "%s" is forbidden.'
|
||||||
|
% request.module, '403 Forbidden')
|
||||||
|
|
||||||
|
# we must be referring to something in the repository. what is it?
|
||||||
|
isdir = 0
|
||||||
|
type = None
|
||||||
try:
|
try:
|
||||||
|
type = request.repos.itemtype(request.path_parts)
|
||||||
|
isdir = (type == vclib.DIR)
|
||||||
|
except vclib.ItemNotFound: # Let ItemNotFound errors fall through for now
|
||||||
|
pass
|
||||||
|
|
||||||
|
url = request.url
|
||||||
|
|
||||||
|
# if we have a directory and the request didn't end in "/", then redirect
|
||||||
|
# so that it does. (so that relative URLs in our output work right)
|
||||||
|
if isdir and server.getenv('PATH_INFO', '')[-1:] != '/':
|
||||||
|
server.redirect(url + '/' + request.qmark_query)
|
||||||
|
|
||||||
|
if isdir:
|
||||||
|
if request.roottype == 'cvs':
|
||||||
|
view_directory_cvs(request)
|
||||||
|
else:
|
||||||
|
view_directory_svn(request)
|
||||||
|
return
|
||||||
|
|
||||||
|
full_name = request.full_name
|
||||||
|
|
||||||
|
# since we aren't talking about a directory, set up the mime type info
|
||||||
|
# for the potential file.
|
||||||
|
request.setup_mime_type_info()
|
||||||
|
|
||||||
|
query_dict = request.query_dict
|
||||||
|
|
||||||
|
# Not a dir, and not a file ... is this some kind of URL hackery
|
||||||
|
# (blessed or otherwise) ?
|
||||||
|
if type != vclib.FILE:
|
||||||
|
if full_name[-5:] == '.diff' \
|
||||||
|
and query_dict.has_key('r1') and query_dict.has_key('r2'):
|
||||||
|
path_parts = request.path_parts[:]
|
||||||
|
path_parts[-1] = path_parts[-1][:-5]
|
||||||
|
if request.repos.itemtype(path_parts) == vclib.FILE:
|
||||||
|
# this is a versioned file with the old .diff tack-on present.
|
||||||
|
# redirect.
|
||||||
|
server.redirect(url[:-5] + '?' + compat.urlencode(query_dict))
|
||||||
|
elif cfg.options.allow_tar \
|
||||||
|
and full_name[-7:] == '.tar.gz' and query_dict.has_key('tarball'):
|
||||||
|
# getting your tarball on? so be it.
|
||||||
|
download_tarball(request)
|
||||||
|
return
|
||||||
|
elif request.roottype == 'cvs':
|
||||||
|
# if the file is in a cvs Attic, then redirect.
|
||||||
|
idx = string.rfind(full_name, '/')
|
||||||
|
attic_name = full_name[:idx] + '/Attic' + full_name[idx:]
|
||||||
|
if os.path.isfile(attic_name + ',v') or \
|
||||||
|
full_name[-5:] == '.diff' and os.path.isfile(attic_name[:-5] + ',v'):
|
||||||
|
idx = string.rfind(url, '/')
|
||||||
|
server.redirect(url[:idx] + '/Attic' + url[idx:] + \
|
||||||
|
'?' + compat.urlencode(query_dict))
|
||||||
|
|
||||||
|
# when all else fails: complain about it.
|
||||||
|
raise debug.ViewcvsException('%s: unknown location'
|
||||||
|
% request.url, '404 Not Found')
|
||||||
|
|
||||||
|
### at this point, we know we're talking about a file.
|
||||||
|
|
||||||
|
# do Subversion-y things here until more concepts mesh with CVS's
|
||||||
|
if request.roottype == 'svn':
|
||||||
|
if query_dict.has_key('rev') or request.has_checkout_magic:
|
||||||
|
view_checkout(request)
|
||||||
|
elif query_dict.has_key('r1') and query_dict.has_key('r2'):
|
||||||
|
view_diff(request)
|
||||||
|
else:
|
||||||
|
view_log_svn(request)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if query_dict.has_key('rev') or request.has_checkout_magic:
|
||||||
|
view_checkout(request)
|
||||||
|
elif query_dict.has_key('annotate') and cfg.options.allow_annotate:
|
||||||
|
view_annotate(request)
|
||||||
|
elif query_dict.has_key('r1') and query_dict.has_key('r2'):
|
||||||
|
view_diff(request)
|
||||||
|
elif query_dict.has_key('graph') and cfg.options.use_cvsgraph:
|
||||||
|
if not query_dict.has_key('makeimage'):
|
||||||
|
view_cvsgraph(cfg, request)
|
||||||
|
else:
|
||||||
|
cvsgraph_image(cfg, request)
|
||||||
|
else:
|
||||||
|
view_log_cvs(request)
|
||||||
|
return
|
||||||
|
|
||||||
|
raise debug.ViewcvsException(
|
||||||
|
'%s: unable to determine desired operation'
|
||||||
|
% request.url, '404 Not Found')
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
### this is a bad hack. various functions expect a runtime global
|
||||||
|
### named 'server' which corresponds to how we generate output.
|
||||||
|
### bleck. the right answer is to make this part of the Request object
|
||||||
|
### and ensure that every function is passed the Request instance.
|
||||||
|
### this would also allow us to toss the AspProxy and its per-thread
|
||||||
|
### nonsense.
|
||||||
|
global server
|
||||||
|
server = sapi.server
|
||||||
|
|
||||||
|
try:
|
||||||
|
debug.t_start('main')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
server = sapi.server
|
run_viewcvs(sapi.server)
|
||||||
debug.t_start('main')
|
|
||||||
|
|
||||||
# handle the configuration stuff
|
|
||||||
handle_config()
|
|
||||||
|
|
||||||
# build a Request object, which contains info about the HTTP request
|
|
||||||
request = Request()
|
|
||||||
|
|
||||||
# most of the startup is done now.
|
|
||||||
debug.t_end('startup')
|
|
||||||
|
|
||||||
# if this is just a simple hunk of doc, then serve it up
|
|
||||||
if request.has_docroot_magic:
|
|
||||||
view_doc(request)
|
|
||||||
return
|
|
||||||
|
|
||||||
# check the forbidden list
|
|
||||||
if cfg.is_forbidden(request.module):
|
|
||||||
raise debug.ViewcvsException('Access to "%s" is forbidden.'
|
|
||||||
% request.module, '403 Forbidden')
|
|
||||||
|
|
||||||
# we must be referring to something in the repository. what is it?
|
|
||||||
isdir = 0
|
|
||||||
type = None
|
|
||||||
try:
|
|
||||||
type = request.repos.itemtype(request.path_parts)
|
|
||||||
isdir = (type == vclib.DIR)
|
|
||||||
except vclib.ItemNotFound: # Let ItemNotFound errors fall through for now
|
|
||||||
pass
|
|
||||||
|
|
||||||
url = request.url
|
|
||||||
|
|
||||||
# if we have a directory and the request didn't end in "/", then redirect
|
|
||||||
# so that it does. (so that relative URLs in our output work right)
|
|
||||||
if isdir and server.getenv('PATH_INFO', '')[-1:] != '/':
|
|
||||||
server.redirect(url + '/' + request.qmark_query)
|
|
||||||
|
|
||||||
if isdir:
|
|
||||||
if request.roottype == 'cvs':
|
|
||||||
view_directory_cvs(request)
|
|
||||||
else:
|
|
||||||
view_directory_svn(request)
|
|
||||||
return
|
|
||||||
|
|
||||||
full_name = request.full_name
|
|
||||||
|
|
||||||
# since we aren't talking about a directory, set up the mime type info
|
|
||||||
# for the potential file.
|
|
||||||
request.setup_mime_type_info()
|
|
||||||
|
|
||||||
query_dict = request.query_dict
|
|
||||||
|
|
||||||
# Not a dir, and not a file ... is this some kind of URL hackery
|
|
||||||
# (blessed or otherwise) ?
|
|
||||||
if type != vclib.FILE:
|
|
||||||
if full_name[-5:] == '.diff' \
|
|
||||||
and query_dict.has_key('r1') and query_dict.has_key('r2'):
|
|
||||||
path_parts = request.path_parts[:]
|
|
||||||
path_parts[-1] = path_parts[-1][:-5]
|
|
||||||
if request.repos.itemtype(path_parts) == vclib.FILE:
|
|
||||||
# this is a versioned file with the old .diff tack-on present.
|
|
||||||
# redirect.
|
|
||||||
server.redirect(url[:-5] + '?' + compat.urlencode(query_dict))
|
|
||||||
elif cfg.options.allow_tar \
|
|
||||||
and full_name[-7:] == '.tar.gz' and query_dict.has_key('tarball'):
|
|
||||||
# getting your tarball on? so be it.
|
|
||||||
download_tarball(request)
|
|
||||||
return
|
|
||||||
elif request.roottype == 'cvs':
|
|
||||||
# if the file is in a cvs Attic, then redirect.
|
|
||||||
idx = string.rfind(full_name, '/')
|
|
||||||
attic_name = full_name[:idx] + '/Attic' + full_name[idx:]
|
|
||||||
if os.path.isfile(attic_name + ',v') or \
|
|
||||||
full_name[-5:] == '.diff' and os.path.isfile(attic_name[:-5] + ',v'):
|
|
||||||
idx = string.rfind(url, '/')
|
|
||||||
server.redirect(url[:idx] + '/Attic' + url[idx:] + \
|
|
||||||
'?' + compat.urlencode(query_dict))
|
|
||||||
|
|
||||||
# when all else fails: complain about it.
|
|
||||||
raise debug.ViewcvsException('%s: unknown location'
|
|
||||||
% request.url, '404 Not Found')
|
|
||||||
|
|
||||||
### at this point, we know we're talking about a file.
|
|
||||||
|
|
||||||
# do Subversion-y things here until more concepts mesh with CVS's
|
|
||||||
if request.roottype == 'svn':
|
|
||||||
if query_dict.has_key('rev') or request.has_checkout_magic:
|
|
||||||
view_checkout(request)
|
|
||||||
elif query_dict.has_key('r1') and query_dict.has_key('r2'):
|
|
||||||
view_diff(request)
|
|
||||||
else:
|
|
||||||
view_log_svn(request)
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
if query_dict.has_key('rev') or request.has_checkout_magic:
|
|
||||||
view_checkout(request)
|
|
||||||
elif query_dict.has_key('annotate') and cfg.options.allow_annotate:
|
|
||||||
view_annotate(request)
|
|
||||||
elif query_dict.has_key('r1') and query_dict.has_key('r2'):
|
|
||||||
view_diff(request)
|
|
||||||
elif query_dict.has_key('graph') and cfg.options.use_cvsgraph:
|
|
||||||
if not query_dict.has_key('makeimage'):
|
|
||||||
view_cvsgraph(cfg, request)
|
|
||||||
else:
|
|
||||||
cvsgraph_image(cfg, request)
|
|
||||||
else:
|
|
||||||
view_log_cvs(request)
|
|
||||||
return
|
|
||||||
|
|
||||||
raise debug.ViewcvsException(
|
|
||||||
'%s: unable to determine desired operation'
|
|
||||||
% request.url, '404 Not Found')
|
|
||||||
except SystemExit, e:
|
except SystemExit, e:
|
||||||
return
|
return
|
||||||
except:
|
except:
|
||||||
|
@ -3025,6 +3040,7 @@ def main():
|
||||||
debug.dump()
|
debug.dump()
|
||||||
debug.DumpChildren()
|
debug.DumpChildren()
|
||||||
|
|
||||||
|
|
||||||
class _item:
|
class _item:
|
||||||
def __init__(self, **kw):
|
def __init__(self, **kw):
|
||||||
vars(self).update(kw)
|
vars(self).update(kw)
|
||||||
|
|
Loading…
Reference in New Issue