~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/__init__.py

  • Committer: Launchpad Patch Queue Manager
  • Date: 2008-02-27 11:38:19 UTC
  • mfrom: (144.1.10 fix-pyflakes-notes)
  • Revision ID: launchpad@pqm.canonical.com-20080227113819-soawqhenqe9znu1p
[r=thumper][!log] remove unused files and imports and normalize the whitespace

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# You should have received a copy of the GNU General Public License
16
16
# along with this program; if not, write to the Free Software
17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 
 
19
 
import time
20
 
 
21
 
from paste.request import path_info_pop
 
18
#
 
19
 
 
20
import logging
 
21
import os
 
22
import re
 
23
 
 
24
import turbogears
 
25
from turbogears import controllers
 
26
from configobj import ConfigObj
22
27
 
23
28
from loggerhead import util
24
 
from loggerhead.templatefunctions import templatefunctions
25
 
from loggerhead.zptsupport import load_template
26
 
 
27
 
class TemplatedBranchView(object):
28
 
 
29
 
    template_path = None
30
 
 
31
 
    def __init__(self, branch):
32
 
        self._branch = branch
33
 
        self.log = branch.log
34
 
 
35
 
    def default(self, request, response):
36
 
        z = time.time()
37
 
        h = self._branch.history
38
 
        kw = request.GET
39
 
        util.set_context(kw)
40
 
 
41
 
        h._branch.lock_read()
42
 
        try:
43
 
            args = []
44
 
            while 1:
45
 
                arg = path_info_pop(request.environ)
46
 
                if arg is None:
47
 
                    break
48
 
                args.append(arg)
49
 
 
50
 
            vals = {
51
 
                'branch': self._branch,
52
 
                'util': util,
53
 
                'history': h,
54
 
                'url': self._branch.context_url,
55
 
            }
56
 
            vals.update(templatefunctions)
57
 
            del response.headers['Content-Type']
58
 
            vals.update(self.get_values(h, args, kw, response))
59
 
 
60
 
            self.log.info('/%s: %r secs' % (
61
 
                self.__class__.__name__, time.time() - z,))
62
 
            if 'Content-Type' not in response.headers:
63
 
                response.headers['Content-Type'] = 'text/html'
64
 
            template = load_template(self.template_path)
65
 
            template.expand_into(response, **vals)
66
 
        finally:
67
 
            h._branch.unlock()
 
29
from loggerhead.branchview import BranchView
 
30
from loggerhead.history import is_branch
 
31
 
 
32
log = logging.getLogger("loggerhead.controllers")
 
33
 
 
34
 
 
35
def cherrypy_friendly(s):
 
36
    """
 
37
    convert a config section name into a name that pleases cherrypy.
 
38
    """
 
39
    return re.sub(r'[^\w\d_]', '_', s)
 
40
 
 
41
 
 
42
class Project (object):
 
43
    def __init__(self, name, config):
 
44
        self.name = name
 
45
        self.friendly_name = config.get('name', name)
 
46
        self.description = config.get('description', '')
 
47
        self.long_description = config.get('long_description', '')
 
48
        self._config = config
 
49
        
 
50
        self._views = []
 
51
        for view_name in config.sections:
 
52
            log.debug('Configuring (project %s) branch %s...', name, view_name)
 
53
            self._add_view(view_name, config[view_name], config[view_name].get('folder'))
 
54
        
 
55
        self._auto_folder = config.get('auto_publish_folder', None)
 
56
        self._auto_list = []
 
57
        if self._auto_folder is not None:
 
58
            self._recheck_auto_folders()
 
59
    
 
60
    def _recheck_auto_folders(self):
 
61
        if self._auto_folder is None:
 
62
            return
 
63
        auto_list = []
 
64
        # scan a folder for bazaar branches, and add them automatically
 
65
        for path, folders, filenames in os.walk(self._auto_folder):
 
66
            for folder in folders:
 
67
                folder = os.path.join(path, folder)
 
68
                if is_branch(folder):
 
69
                    auto_list.append(folder)
 
70
        auto_list.sort()
 
71
        if auto_list == self._auto_list:
 
72
            # nothing has changed; do nothing.
 
73
            return
 
74
 
 
75
        # rebuild views:
 
76
        log.debug('Rescanning auto-folder for project %s ...', self.name)
 
77
        self._views = []
 
78
        for folder in auto_list:
 
79
            view_name = os.path.basename(folder)
 
80
            log.debug('Auto-configuring (project %s) branch %s...', self.name, view_name)
 
81
            self._add_view(view_name, ConfigObj(), folder)
 
82
        self._auto_list = auto_list
 
83
        
 
84
    def _add_view(self, view_name, view_config, folder):
 
85
        c_view_name = cherrypy_friendly(view_name)
 
86
        view = BranchView(self.name, c_view_name, view_name, folder, view_config, self._config)
 
87
        self._views.append(view)
 
88
        setattr(self, c_view_name, view)
 
89
        
 
90
    views = property(lambda self: self._views)
 
91
 
 
92
 
 
93
class Root (controllers.RootController):
 
94
    def __init__(self, config):
 
95
        self._projects = []
 
96
        self._config = config
 
97
        for project_name in self._config.sections:
 
98
            c_project_name = cherrypy_friendly(project_name)
 
99
            project = Project(c_project_name, self._config[project_name])
 
100
            self._projects.append(project)
 
101
            setattr(self, c_project_name, project)
 
102
        
 
103
    @turbogears.expose(template='loggerhead.templates.browse')
 
104
    def index(self):
 
105
        for p in self._projects:
 
106
            p._recheck_auto_folders()
 
107
        return {
 
108
            'projects': self._projects,
 
109
            'util': util,
 
110
            'title': self._config.get('title', ''),
 
111
        }
 
112
 
 
113
    def _check_rebuild(self):
 
114
        for p in self._projects:
 
115
            for v in p.views:
 
116
                v.check_rebuild()
 
117
 
 
118
 
 
119
 
 
120
# for use in profiling the very-slow get_change() method:
 
121
#h = Root.bazaar.bzr_dev.get_history()
 
122
#w = list(h.get_revision_history())
 
123
#h._get_changes_profiled(w[:100])
68
124