annotate examples/trac/trac/env.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2003-2005 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2003-2005 Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # Author: Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 import os
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 from trac import db_default, util
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 from trac.config import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 from trac.core import Component, ComponentManager, implements, Interface, \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 ExtensionPoint, TracError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 from trac.db import DatabaseManager
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 from trac.versioncontrol import RepositoryManager
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 __all__ = ['Environment', 'IEnvironmentSetupParticipant', 'open_environment']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 class IEnvironmentSetupParticipant(Interface):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 """Extension point interface for components that need to participate in the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 creation and upgrading of Trac environments, for example to create
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 additional database tables."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 def environment_created():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 """Called when a new Trac environment is created."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 def environment_needs_upgrade(db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 """Called when Trac checks whether the environment needs to be upgraded.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 Should return `True` if this participant needs an upgrade to be
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 performed, `False` otherwise.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44 def upgrade_environment(db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 """Actually perform an environment upgrade.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 Implementations of this method should not commit any database
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 transactions. This is done implicitly after all participants have
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 performed the upgrades they need without an error being raised.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 class Environment(Component, ComponentManager):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 """Trac stores project information in a Trac environment.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 A Trac environment consists of a directory structure containing among other
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 things:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 * a configuration file.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 * an SQLite database (stores tickets, wiki pages...)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 * Project specific templates and wiki macros.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 * wiki and ticket attachments.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 setup_participants = ExtensionPoint(IEnvironmentSetupParticipant)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 base_url = Option('trac', 'base_url', '',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 """Base URL of the Trac deployment.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 In most configurations, Trac will automatically reconstruct the URL
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 that is used to access it automatically. However, in more complex
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 setups, usually involving running Trac behind a HTTP proxy, you may
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 need to use this option to force Trac to use the correct URL.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 project_name = Option('project', 'name', 'My Project',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 """Name of the project.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 project_description = Option('project', 'descr', 'My example project',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 """Short description of the project.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 project_url = Option('project', 'url', 'http://example.org/',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 """URL of the main project web site.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 project_footer = Option('project', 'footer',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 'Visit the Trac open source project at<br />'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 '<a href="http://trac.edgewall.com/">'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 'http://trac.edgewall.com/</a>',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 """Page footer text (right-aligned).""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 project_icon = Option('project', 'icon', 'common/trac.ico',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 """URL of the icon of the project.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 log_type = Option('logging', 'log_type', 'none',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 """Logging facility to use.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 Should be one of (`none`, `file`, `stderr`, `syslog`, `winlog`).""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 log_file = Option('logging', 'log_file', 'trac.log',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 """If `log_type` is `file`, this should be a path to the log-file.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 log_level = Option('logging', 'log_level', 'DEBUG',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 """Level of verbosity in log.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 Should be one of (`CRITICAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`).""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 def __init__(self, path, create=False, options=[]):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 """Initialize the Trac environment.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 @param path: the absolute path to the Trac environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 @param create: if `True`, the environment is created and populated with
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 default data; otherwise, the environment is expected to
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 already exist.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 @param options: A list of `(section, name, value)` tuples that define
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 configuration options
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 ComponentManager.__init__(self)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 self.path = path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 self.setup_config(load_defaults=create)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 self.setup_log()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 from trac.loader import load_components
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 load_components(self)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 if create:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 self.create(options)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 self.verify()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 if create:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 for setup_participant in self.setup_participants:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 setup_participant.environment_created()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 def component_activated(self, component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 """Initialize additional member variables for components.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 Every component activated through the `Environment` object gets three
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 member variables: `env` (the environment object), `config` (the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 environment configuration) and `log` (a logger object)."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 component.env = self
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 component.config = self.config
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 component.log = self.log
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 def is_component_enabled(self, cls):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 """Implemented to only allow activation of components that are not
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 disabled in the configuration.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 This is called by the `ComponentManager` base class when a component is
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 about to be activated. If this method returns false, the component does
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 not get activated."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 if not isinstance(cls, basestring):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 component_name = (cls.__module__ + '.' + cls.__name__).lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 component_name = cls.lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 rules = [(name.lower(), value.lower() in ('enabled', 'on'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 for name, value in self.config.options('components')]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 rules.sort(lambda a, b: -cmp(len(a[0]), len(b[0])))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 for pattern, enabled in rules:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 if component_name == pattern or pattern.endswith('*') \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 and component_name.startswith(pattern[:-1]):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 return enabled
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 # versioncontrol components are enabled if the repository is configured
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 # FIXME: this shouldn't be hardcoded like this
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 if component_name.startswith('trac.versioncontrol.'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 return self.config.get('trac', 'repository_dir') != ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 # By default, all components in the trac package are enabled
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 return component_name.startswith('trac.')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 def verify(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 """Verify that the provided path points to a valid Trac environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 directory."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 fd = open(os.path.join(self.path, 'VERSION'), 'r')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 assert fd.read(26) == 'Trac Environment Version 1'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 fd.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 def get_db_cnx(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 """Return a database connection from the connection pool."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 return DatabaseManager(self).get_connection()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 def shutdown(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 """Close the environment."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 DatabaseManager(self).shutdown()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 def get_repository(self, authname=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 """Return the version control repository configured for this
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 environment.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 @param authname: user name for authorization
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 return RepositoryManager(self).get_repository(authname)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 def create(self, options=[]):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 """Create the basic directory structure of the environment, initialize
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 the database and populate the configuration file with default values."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 def _create_file(fname, data=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 fd = open(fname, 'w')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 if data: fd.write(data)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 fd.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 # Create the directory structure
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 if not os.path.exists(self.path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 os.mkdir(self.path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 os.mkdir(self.get_log_dir())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 os.mkdir(self.get_htdocs_dir())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 os.mkdir(os.path.join(self.path, 'plugins'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 os.mkdir(os.path.join(self.path, 'wiki-macros'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 # Create a few files
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 _create_file(os.path.join(self.path, 'VERSION'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 'Trac Environment Version 1\n')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 _create_file(os.path.join(self.path, 'README'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 'This directory contains a Trac environment.\n'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 'Visit http://trac.edgewall.com/ for more information.\n')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 # Setup the default configuration
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220 os.mkdir(os.path.join(self.path, 'conf'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 _create_file(os.path.join(self.path, 'conf', 'trac.ini'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 self.setup_config(load_defaults=True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 for section, name, value in options:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 self.config.set(section, name, value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 self.config.save()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227 # Create the database
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 DatabaseManager(self).init_db()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 def get_version(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 """Return the current version of the database."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 db = self.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235 cursor.execute("SELECT value FROM system WHERE name='database_version'")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 return row and int(row[0])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 def setup_config(self, load_defaults=False):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 """Load the configuration file."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 self.config = Configuration(os.path.join(self.path, 'conf', 'trac.ini'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 if load_defaults:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243 for section, default_options in self.config.defaults().iteritems():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 for name, value in default_options.iteritems():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245 self.config.set(section, name, value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247 def get_templates_dir(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 """Return absolute path to the templates directory."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249 return os.path.join(self.path, 'templates')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251 def get_htdocs_dir(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252 """Return absolute path to the htdocs directory."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 return os.path.join(self.path, 'htdocs')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255 def get_log_dir(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
256 """Return absolute path to the log directory."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
257 return os.path.join(self.path, 'log')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
258
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
259 def setup_log(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
260 """Initialize the logging sub-system."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
261 from trac.log import logger_factory
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
262 logtype = self.log_type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
263 logfile = self.log_file
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
264 if logtype == 'file' and not os.path.isabs(logfile):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
265 logfile = os.path.join(self.get_log_dir(), logfile)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
266 self.log = logger_factory(logtype, logfile, self.log_level, self.path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
267
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
268 def get_known_users(self, cnx=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
269 """Generator that yields information about all known users, i.e. users
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
270 that have logged in to this Trac environment and possibly set their name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
271 and email.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
272
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
273 This function generates one tuple for every user, of the form
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
274 (username, name, email) ordered alpha-numerically by username.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
275
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
276 @param cnx: the database connection; if ommitted, a new connection is
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
277 retrieved
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
278 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
279 if not cnx:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
280 cnx = self.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
281 cursor = cnx.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
282 cursor.execute("SELECT DISTINCT s.sid, n.value, e.value "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
283 "FROM session AS s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
284 " LEFT JOIN session_attribute AS n ON (n.sid=s.sid "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
285 " and n.authenticated=1 AND n.name = 'name') "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
286 " LEFT JOIN session_attribute AS e ON (e.sid=s.sid "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
287 " AND e.authenticated=1 AND e.name = 'email') "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
288 "WHERE s.authenticated=1 ORDER BY s.sid")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
289 for username,name,email in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
290 yield username, name, email
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
291
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
292 def backup(self, dest=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
293 """Simple SQLite-specific backup of the database.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
294
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
295 @param dest: Destination file; if not specified, the backup is stored in
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
296 a file called db_name.trac_version.bak
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
297 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
298 import shutil
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
299
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
300 db_str = self.config.get('trac', 'database')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
301 if not db_str.startswith('sqlite:'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
302 raise EnvironmentError, 'Can only backup sqlite databases'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
303 db_name = os.path.join(self.path, db_str[7:])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
304 if not dest:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
305 dest = '%s.%i.bak' % (db_name, self.get_version())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
306 shutil.copy (db_name, dest)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
307
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
308 def needs_upgrade(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
309 """Return whether the environment needs to be upgraded."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
310 db = self.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
311 for participant in self.setup_participants:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
312 if participant.environment_needs_upgrade(db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
313 self.log.warning('Component %s requires environment upgrade',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
314 participant)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
315 return True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
316 return False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
317
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
318 def upgrade(self, backup=False, backup_dest=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
319 """Upgrade database.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
320
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
321 Each db version should have its own upgrade module, names
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
322 upgrades/dbN.py, where 'N' is the version number (int).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
323
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
324 @param backup: whether or not to backup before upgrading
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
325 @param backup_dest: name of the backup file
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
326 @return: whether the upgrade was performed
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
327 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
328 db = self.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
329
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
330 upgraders = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
331 for participant in self.setup_participants:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
332 if participant.environment_needs_upgrade(db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
333 upgraders.append(participant)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
334 if not upgraders:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
335 return False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
336
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
337 if backup:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
338 self.backup(backup_dest)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
339 for participant in upgraders:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
340 participant.upgrade_environment(db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
341 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
342
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
343 # Database schema may have changed, so close all connections
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
344 self.shutdown()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
345
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
346 return True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
347
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
348
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
349 class EnvironmentSetup(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
350 implements(IEnvironmentSetupParticipant)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
351
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
352 # IEnvironmentSetupParticipant methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
353
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
354 def environment_created(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
355 """Insert default data into the database."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
356 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
357 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
358 for table, cols, vals in db_default.data:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
359 cursor.executemany("INSERT INTO %s (%s) VALUES (%s)" % (table,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
360 ','.join(cols), ','.join(['%s' for c in cols])),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
361 vals)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
362 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
363 self._update_sample_config()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
364
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
365 def environment_needs_upgrade(self, db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
366 dbver = self.env.get_version(db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
367 if dbver == db_default.db_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
368 return False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
369 elif dbver > db_default.db_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
370 raise TracError, 'Database newer than Trac version'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
371 return True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
372
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
373 def upgrade_environment(self, db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
374 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
375 dbver = self.env.get_version()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
376 for i in range(dbver + 1, db_default.db_version + 1):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
377 name = 'db%i' % i
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
378 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
379 upgrades = __import__('upgrades', globals(), locals(), [name])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
380 script = getattr(upgrades, name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
381 except AttributeError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
382 err = 'No upgrade module for version %i (%s.py)' % (i, name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
383 raise TracError, err
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
384 script.do_upgrade(self.env, i, cursor)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
385 cursor.execute("UPDATE system SET value=%s WHERE "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
386 "name='database_version'", (db_default.db_version,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
387 self.log.info('Upgraded database version from %d to %d',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
388 dbver, db_default.db_version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
389 self._update_sample_config()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
390
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
391 # Internal methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
392
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
393 def _update_sample_config(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
394 from ConfigParser import ConfigParser
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
395 config = ConfigParser()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
396 for section, options in self.config.defaults().items():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
397 config.add_section(section)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
398 for name, value in options.items():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
399 config.set(section, name, value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
400 filename = os.path.join(self.env.path, 'conf', 'trac.ini.sample')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
401 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
402 fileobj = file(filename, 'w')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
403 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
404 config.write(fileobj)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
405 fileobj.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
406 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
407 fileobj.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
408 self.log.info('Wrote sample configuration file with the new '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
409 'settings and their default values: %s',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
410 filename)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
411 except IOError, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
412 self.log.warn('Couldn\'t write sample configuration file (%s)', e,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
413 exc_info=True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
414
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
415
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
416 def open_environment(env_path=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
417 """Open an existing environment object, and verify that the database is up
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
418 to date.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
419
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
420 @param: env_path absolute path to the environment directory; if ommitted,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
421 the value of the `TRAC_ENV` environment variable is used
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
422 @return: the `Environment` object
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
423 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
424 if not env_path:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
425 env_path = os.getenv('TRAC_ENV')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
426 if not env_path:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
427 raise TracError, 'Missing environment variable "TRAC_ENV". Trac ' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
428 'requires this variable to point to a valid Trac ' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
429 'environment.'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
430
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
431 env = Environment(env_path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
432 if env.needs_upgrade():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
433 raise TracError, 'The Trac Environment needs to be upgraded. Run ' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
434 'trac-admin %s upgrade"' % env_path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
435 return env
Copyright (C) 2012-2017 Edgewall Software