~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/__init__.py

  • Committer: Robey Pointer
  • Date: 2006-12-13 01:45:10 UTC
  • Revision ID: robey@lag.net-20061213014510-caliusjw2auhzjpz
clean up revision navigation so that the "revlist" you're browsing is
remembered after you click through the "(changes)" list for a file.  also
clean up the navbar so that it fetches its info from a sub-container, and
let most pages fill that container from a standard method in history.
trimmed the ranges shown in the navbar (no more -1, -3).  and finally,
browsing into a folder should now work in inventory view.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#
2
2
# Copyright (C) 2006  Robey Pointer <robey@lag.net>
3
 
# Copyright (C) 2006  Goffredo Baroncelli <kreijack@inwind.it>
4
3
#
5
4
# This program is free software; you can redistribute it and/or modify
6
5
# it under the terms of the GNU General Public License as published by
15
14
# You should have received a copy of the GNU General Public License
16
15
# along with this program; if not, write to the Free Software
17
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 
 
19
 
import re
20
 
import time
21
 
 
22
 
from paste.request import path_info_pop, parse_querystring
23
 
 
24
 
from loggerhead import util
25
 
from loggerhead.templatefunctions import templatefunctions
26
 
from loggerhead.zptsupport import load_template
27
 
 
28
 
class BufferingWriter(object):
29
 
 
30
 
    def __init__(self, writefunc, buf_limit):
31
 
        self.bytes = 0
32
 
        self.buf = []
33
 
        self.buflen = 0
34
 
        self.writefunc = writefunc
35
 
        self.bytes_saved = 0
36
 
        self.buf_limit = buf_limit
37
 
 
38
 
    def flush(self):
39
 
        chunk = ''.join(self.buf)
40
 
        chunk = re.sub(r'\s*\n\s*', '\n', chunk)
41
 
        chunk = re.sub(r'[ \t]+', ' ', chunk)
42
 
        self.bytes_saved += self.buflen - len(chunk)
43
 
        self.writefunc(chunk)
44
 
        self.buf = []
45
 
        self.buflen = 0
46
 
 
47
 
    def write(self, data):
48
 
        self.buf.append(data)
49
 
        self.buflen += len(data)
50
 
        self.bytes += len(data)
51
 
        if self.buflen > self.buf_limit:
52
 
            self.flush()
53
 
 
54
 
class TemplatedBranchView(object):
55
 
 
56
 
    template_path = None
57
 
 
58
 
    def __init__(self, branch, history):
59
 
        self._branch = branch
60
 
        self._history = history
61
 
        self.log = branch.log
62
 
 
63
 
    def __call__(self, environ, start_response):
64
 
        z = time.time()
65
 
        h = self._history
66
 
        kw = dict(parse_querystring(environ))
67
 
        util.set_context(kw)
68
 
        args = []
69
 
        while 1:
70
 
            arg = path_info_pop(environ)
71
 
            if arg is None:
72
 
                break
73
 
            args.append(arg)
74
 
 
75
 
        vals = {
76
 
            'branch': self._branch,
77
 
            'util': util,
78
 
            'history': h,
79
 
            'url': self._branch.context_url,
80
 
        }
81
 
        vals.update(templatefunctions)
82
 
        headers = {}
83
 
        vals.update(self.get_values(h, args, kw, headers))
84
 
 
85
 
        self.log.info('Getting information for %s: %r secs' % (
86
 
            self.__class__.__name__, time.time() - z,))
87
 
        if 'Content-Type' not in headers:
88
 
            headers['Content-Type'] = 'text/html'
89
 
        writer = start_response("200 OK", headers.items())
90
 
        template = load_template(self.template_path)
91
 
        z = time.time()
92
 
        w = BufferingWriter(writer, 8192)
93
 
        template.expand_into(w, **vals)
94
 
        w.flush()
95
 
        self.log.info('Rendering %s: %r secs, %s bytes, %s (%2.1f%%) bytes saved' % (
96
 
            self.__class__.__name__, time.time() - z, w.bytes, w.bytes_saved, 100.0*w.bytes_saved/w.bytes))
97
 
        return []
 
17
#
 
18
 
 
19
import logging
 
20
 
 
21
import turbogears
 
22
from turbogears import controllers
 
23
from cherrypy import HTTPRedirect, NotFound
 
24
 
 
25
from loggerhead.controllers.changelog_ui import ChangeLogUI
 
26
from loggerhead.controllers.atom_ui import AtomUI
 
27
from loggerhead.controllers.revision_ui import RevisionUI
 
28
from loggerhead.controllers.inventory_ui import InventoryUI
 
29
 
 
30
 
 
31
log = logging.getLogger("loggerhead.controllers")
 
32
 
 
33
class Root (controllers.RootController):
 
34
    changes = ChangeLogUI()
 
35
    atom = AtomUI()
 
36
    revision = RevisionUI()
 
37
    inventory = InventoryUI()
 
38
    
 
39
    @turbogears.expose()
 
40
    def index(self):
 
41
        raise HTTPRedirect(turbogears.url('/changes'))