From d51c87a71a4303e3de0ed326cef876a526020c6e Mon Sep 17 00:00:00 2001 From: gstein Date: Tue, 11 Mar 2003 20:43:06 +0000 Subject: [PATCH] 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-e597b4017df7 --- lib/config.py | 2 +- lib/popen.py | 4 +- lib/sapi.py | 8 +- lib/viewcvs.py | 246 ++++++++++++++++++++++++++----------------------- 4 files changed, 138 insertions(+), 122 deletions(-) diff --git a/lib/config.py b/lib/config.py index eb27d317..a76592b0 100644 --- a/lib/config.py +++ b/lib/config.py @@ -221,7 +221,7 @@ class Config: def _parse_roots(config_name, config_value): roots = { } for root in config_value: - pos = root.find(':') + pos = string.find(root, ':') if pos < 0: raise MalformedRoot(config_name, root) name, path = map(string.strip, (root[:pos], root[pos+1:])) diff --git a/lib/popen.py b/lib/popen.py index 55673dab..a7b8ea2e 100644 --- a/lib/popen.py +++ b/lib/popen.py @@ -153,7 +153,7 @@ def pipe_cmds(cmds): i = 0 for cmd in cmds: - i += 1 + i = i + 1 dbgOut, dbgErr = StringIO.StringIO(), StringIO.StringIO() @@ -181,7 +181,7 @@ def pipe_cmds(cmds): i = 0 for cmd in cmds: - i += 1 + i = i + 1 if i < len(cmds): nextStdIn, hStdOut = win32popen.CreatePipe(1, 1, 1, 1) else: diff --git a/lib/sapi.py b/lib/sapi.py index 39e094c8..2aec030b 100644 --- a/lib/sapi.py +++ b/lib/sapi.py @@ -19,7 +19,7 @@ class CgiServer: self.header_sent = 0 self.pageGlobals = {} - if os.getenv('SERVER_SOFTWARE', '')[:13] == 'Microsoft-IIS': + if os.environ.get('SERVER_SOFTWARE', '')[:13] == 'Microsoft-IIS': self.iis = 1 else: self.iis = 0 @@ -54,7 +54,7 @@ class CgiServer: def escape(self, s, quote = None): 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 # request looks like # @@ -111,9 +111,9 @@ def IIS_FixURL(url): else: dport = "80" prefix = "http://" - prefix += os.environ['HTTP_HOST'] + prefix = prefix + os.environ['HTTP_HOST'] if os.environ['SERVER_PORT'] != dport: - prefix += ":" + os.environ['SERVER_PORT'] + prefix = prefix + ":" + os.environ['SERVER_PORT'] return prefix + url return url diff --git a/lib/viewcvs.py b/lib/viewcvs.py index 56d01d31..1f5a712d 100644 --- a/lib/viewcvs.py +++ b/lib/viewcvs.py @@ -578,6 +578,10 @@ def markup_stream_default(fp): print '' 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: # see if Marc-Andre Lemburg's py2html stuff is around # http://starship.python.net/crew/lemburg/SoftwareDescriptions.html#py2html.py @@ -2898,123 +2902,134 @@ def handle_config(): debug.t_end('load-config') -def main(): - global server +def run_viewcvs(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: + 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: - server = 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') + run_viewcvs(sapi.server) except SystemExit, e: return except: @@ -3025,6 +3040,7 @@ def main(): debug.dump() debug.DumpChildren() + class _item: def __init__(self, **kw): vars(self).update(kw)