~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-24 06:44:26 UTC
  • Revision ID: robey@lag.net-20061224064426-bedaid2zrw69igfg
initial homepage

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
#
19
19
 
20
20
import logging
21
 
import os
22
21
import re
 
22
import sys
 
23
import time
 
24
 
 
25
from configobj import ConfigObj
23
26
 
24
27
import turbogears
25
28
from turbogears import controllers
26
 
from configobj import ConfigObj
 
29
from cherrypy import HTTPRedirect, NotFound
 
30
 
 
31
my_config = ConfigObj('loggerhead.conf', encoding='utf-8')
 
32
extra_path = my_config.get('bzrpath', None)
 
33
if extra_path:
 
34
    sys.path.insert(0, extra_path)
27
35
 
28
36
from loggerhead import util
29
37
from loggerhead.branchview import BranchView
30
 
from loggerhead.history import is_branch
 
38
from loggerhead.history import History
31
39
 
32
40
log = logging.getLogger("loggerhead.controllers")
33
41
 
39
47
    return re.sub(r'[^\w\d_]', '_', s)
40
48
 
41
49
 
42
 
class Project (object):
 
50
class Group (object):
43
51
    def __init__(self, name, config):
44
52
        self.name = name
45
53
        self.friendly_name = config.get('name', name)
46
54
        self.description = config.get('description', '')
47
 
        self.long_description = config.get('long_description', '')
48
 
        self._config = config
49
55
        
50
56
        self._views = []
51
57
        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()
 
58
            log.debug('Configuring (group %r) branch %r...', name, view_name)
 
59
            c_view_name = cherrypy_friendly(view_name)
 
60
            view = BranchView(name, c_view_name, config[view_name])
 
61
            self._views.append(view)
 
62
            setattr(self, c_view_name, view)
59
63
    
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
64
    views = property(lambda self: self._views)
91
65
 
92
66
 
93
67
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)
 
68
    def __init__(self):
 
69
        global my_config
 
70
        self._groups = []
 
71
        for group_name in my_config.sections:
 
72
            # FIXME: clean out any non-python chars
 
73
            c_group_name = cherrypy_friendly(group_name)
 
74
            group = Group(c_group_name, my_config[group_name])
 
75
            self._groups.append(group)
 
76
            setattr(self, c_group_name, group)
102
77
        
103
78
    @turbogears.expose(template='loggerhead.templates.browse')
104
79
    def index(self):
105
 
        for p in self._projects:
106
 
            p._recheck_auto_folders()
107
80
        return {
108
 
            'projects': self._projects,
 
81
            'groups': self._groups,
109
82
            'util': util,
110
 
            'title': self._config.get('title', ''),
 
83
            'title': my_config.get('title', ''),
111
84
        }
112
85
 
113
86
    def _check_rebuild(self):
114
 
        for p in self._projects:
115
 
            for v in p.views:
 
87
        for g in self._groups:
 
88
            for v in g.views:
116
89
                v.check_rebuild()
117
90
 
118
91
 
 
92
# singleton:
 
93
Root = Root()
 
94
 
 
95
# re-index every 6 hours
 
96
index_freq = 6 * 3600
 
97
 
 
98
turbogears.scheduler.add_interval_task(initialdelay=1, interval=index_freq, action=Root._check_rebuild)
119
99
 
120
100
# for use in profiling the very-slow get_change() method:
121
 
#h = Root.bazaar.bzr_dev.get_history()
 
101
#h = util.get_history()
122
102
#w = list(h.get_revision_history())
123
103
#h._get_changes_profiled(w[:100])
124
104