##// END OF EJS Templates
application: add debug mode that switches logging to debug....
marcink -
r3270:312a83d9 default
parent child Browse files
Show More
@@ -1,724 +1,718 b''
1
1
2
2
3 ################################################################################
3 ################################################################################
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
5 ################################################################################
5 ################################################################################
6
6
7 [DEFAULT]
7 [DEFAULT]
8 ## Debug flag sets all loggers to debug, and enables request tracking
8 debug = true
9 debug = true
9
10
10 ################################################################################
11 ################################################################################
11 ## EMAIL CONFIGURATION ##
12 ## EMAIL CONFIGURATION ##
12 ## Uncomment and replace with the email address which should receive ##
13 ## Uncomment and replace with the email address which should receive ##
13 ## any error reports after an application crash ##
14 ## any error reports after an application crash ##
14 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ################################################################################
16 ################################################################################
16
17
17 ## prefix all emails subjects with given prefix, helps filtering out emails
18 ## prefix all emails subjects with given prefix, helps filtering out emails
18 #email_prefix = [RhodeCode]
19 #email_prefix = [RhodeCode]
19
20
20 ## email FROM address all mails will be sent
21 ## email FROM address all mails will be sent
21 #app_email_from = rhodecode-noreply@localhost
22 #app_email_from = rhodecode-noreply@localhost
22
23
23 #smtp_server = mail.server.com
24 #smtp_server = mail.server.com
24 #smtp_username =
25 #smtp_username =
25 #smtp_password =
26 #smtp_password =
26 #smtp_port =
27 #smtp_port =
27 #smtp_use_tls = false
28 #smtp_use_tls = false
28 #smtp_use_ssl = true
29 #smtp_use_ssl = true
29
30
30 [server:main]
31 [server:main]
31 ## COMMON ##
32 ## COMMON ##
32 host = 127.0.0.1
33 host = 127.0.0.1
33 port = 5000
34 port = 5000
34
35
35 ###########################################################
36 ###########################################################
36 ## WAITRESS WSGI SERVER - Recommended for Development ####
37 ## WAITRESS WSGI SERVER - Recommended for Development ####
37 ###########################################################
38 ###########################################################
38
39
39 use = egg:waitress#main
40 use = egg:waitress#main
40 ## number of worker threads
41 ## number of worker threads
41 threads = 5
42 threads = 5
42 ## MAX BODY SIZE 100GB
43 ## MAX BODY SIZE 100GB
43 max_request_body_size = 107374182400
44 max_request_body_size = 107374182400
44 ## Use poll instead of select, fixes file descriptors limits problems.
45 ## Use poll instead of select, fixes file descriptors limits problems.
45 ## May not work on old windows systems.
46 ## May not work on old windows systems.
46 asyncore_use_poll = true
47 asyncore_use_poll = true
47
48
48
49
49 ##########################
50 ##########################
50 ## GUNICORN WSGI SERVER ##
51 ## GUNICORN WSGI SERVER ##
51 ##########################
52 ##########################
52 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
53 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
53
54
54 #use = egg:gunicorn#main
55 #use = egg:gunicorn#main
55 ## Sets the number of process workers. More workers means more concurent connections
56 ## Sets the number of process workers. More workers means more concurent connections
56 ## RhodeCode can handle at the same time. Each additional worker also it increases
57 ## RhodeCode can handle at the same time. Each additional worker also it increases
57 ## memory usage as each has it's own set of caches.
58 ## memory usage as each has it's own set of caches.
58 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
59 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
59 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
60 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
60 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
61 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
61 ## when using more than 1 worker.
62 ## when using more than 1 worker.
62 #workers = 2
63 #workers = 2
63 ## process name visible in process list
64 ## process name visible in process list
64 #proc_name = rhodecode
65 #proc_name = rhodecode
65 ## type of worker class, one of sync, gevent
66 ## type of worker class, one of sync, gevent
66 ## recommended for bigger setup is using of of other than sync one
67 ## recommended for bigger setup is using of of other than sync one
67 #worker_class = gevent
68 #worker_class = gevent
68 ## The maximum number of simultaneous clients. Valid only for Gevent
69 ## The maximum number of simultaneous clients. Valid only for Gevent
69 #worker_connections = 10
70 #worker_connections = 10
70 ## max number of requests that worker will handle before being gracefully
71 ## max number of requests that worker will handle before being gracefully
71 ## restarted, could prevent memory leaks
72 ## restarted, could prevent memory leaks
72 #max_requests = 1000
73 #max_requests = 1000
73 #max_requests_jitter = 30
74 #max_requests_jitter = 30
74 ## amount of time a worker can spend with handling a request before it
75 ## amount of time a worker can spend with handling a request before it
75 ## gets killed and restarted. Set to 6hrs
76 ## gets killed and restarted. Set to 6hrs
76 #timeout = 21600
77 #timeout = 21600
77
78
78
79
79 ## prefix middleware for RhodeCode.
80 ## prefix middleware for RhodeCode.
80 ## recommended when using proxy setup.
81 ## recommended when using proxy setup.
81 ## allows to set RhodeCode under a prefix in server.
82 ## allows to set RhodeCode under a prefix in server.
82 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
83 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
83 ## And set your prefix like: `prefix = /custom_prefix`
84 ## And set your prefix like: `prefix = /custom_prefix`
84 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
85 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
85 ## to make your cookies only work on prefix url
86 ## to make your cookies only work on prefix url
86 [filter:proxy-prefix]
87 [filter:proxy-prefix]
87 use = egg:PasteDeploy#prefix
88 use = egg:PasteDeploy#prefix
88 prefix = /
89 prefix = /
89
90
90 [app:main]
91 [app:main]
91 ## The %(here)s variable will be replaced with the absolute path of parent directory
92 ## The %(here)s variable will be replaced with the absolute path of parent directory
92 ## of this file
93 ## of this file
93 ## In addition ENVIRONMENT variables usage is possible, e.g
94 ## In addition ENVIRONMENT variables usage is possible, e.g
94 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
95 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
95
96
96 use = egg:rhodecode-enterprise-ce
97 use = egg:rhodecode-enterprise-ce
97
98
98 ## enable proxy prefix middleware, defined above
99 ## enable proxy prefix middleware, defined above
99 #filter-with = proxy-prefix
100 #filter-with = proxy-prefix
100
101
101 # During development the we want to have the debug toolbar enabled
102 # During development the we want to have the debug toolbar enabled
102 pyramid.includes =
103 pyramid.includes =
103 pyramid_debugtoolbar
104 pyramid_debugtoolbar
104 rhodecode.lib.middleware.request_wrapper
105 rhodecode.lib.middleware.request_wrapper
105
106
106 pyramid.reload_templates = true
107 pyramid.reload_templates = true
107
108
108 debugtoolbar.hosts = 0.0.0.0/0
109 debugtoolbar.hosts = 0.0.0.0/0
109 debugtoolbar.exclude_prefixes =
110 debugtoolbar.exclude_prefixes =
110 /css
111 /css
111 /fonts
112 /fonts
112 /images
113 /images
113 /js
114 /js
114
115
115 ## RHODECODE PLUGINS ##
116 ## RHODECODE PLUGINS ##
116 rhodecode.includes =
117 rhodecode.includes =
117 rhodecode.api
118 rhodecode.api
118
119
119
120
120 # api prefix url
121 # api prefix url
121 rhodecode.api.url = /_admin/api
122 rhodecode.api.url = /_admin/api
122
123
123
124
124 ## END RHODECODE PLUGINS ##
125 ## END RHODECODE PLUGINS ##
125
126
126 ## encryption key used to encrypt social plugin tokens,
127 ## encryption key used to encrypt social plugin tokens,
127 ## remote_urls with credentials etc, if not set it defaults to
128 ## remote_urls with credentials etc, if not set it defaults to
128 ## `beaker.session.secret`
129 ## `beaker.session.secret`
129 #rhodecode.encrypted_values.secret =
130 #rhodecode.encrypted_values.secret =
130
131
131 ## decryption strict mode (enabled by default). It controls if decryption raises
132 ## decryption strict mode (enabled by default). It controls if decryption raises
132 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
133 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
133 #rhodecode.encrypted_values.strict = false
134 #rhodecode.encrypted_values.strict = false
134
135
135 ## return gzipped responses from Rhodecode (static files/application)
136 ## return gzipped responses from Rhodecode (static files/application)
136 gzip_responses = false
137 gzip_responses = false
137
138
138 ## autogenerate javascript routes file on startup
139 ## autogenerate javascript routes file on startup
139 generate_js_files = false
140 generate_js_files = false
140
141
141 ## System global default language.
142 ## System global default language.
142 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
143 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
143 lang = en
144 lang = en
144
145
145 ## Perform a full repository scan and import on each server start.
146 ## Perform a full repository scan and import on each server start.
146 ## Settings this to true could lead to very long startup time.
147 ## Settings this to true could lead to very long startup time.
147 startup.import_repos = false
148 startup.import_repos = false
148
149
149 ## Uncomment and set this path to use archive download cache.
150 ## Uncomment and set this path to use archive download cache.
150 ## Once enabled, generated archives will be cached at this location
151 ## Once enabled, generated archives will be cached at this location
151 ## and served from the cache during subsequent requests for the same archive of
152 ## and served from the cache during subsequent requests for the same archive of
152 ## the repository.
153 ## the repository.
153 #archive_cache_dir = /tmp/tarballcache
154 #archive_cache_dir = /tmp/tarballcache
154
155
155 ## URL at which the application is running. This is used for bootstraping
156 ## URL at which the application is running. This is used for bootstraping
156 ## requests in context when no web request is available. Used in ishell, or
157 ## requests in context when no web request is available. Used in ishell, or
157 ## SSH calls. Set this for events to receive proper url for SSH calls.
158 ## SSH calls. Set this for events to receive proper url for SSH calls.
158 app.base_url = http://rhodecode.local
159 app.base_url = http://rhodecode.local
159
160
160 ## Unique application ID. Should be a random unique string for security.
161 ## Unique application ID. Should be a random unique string for security.
161 app_instance_uuid = rc-production
162 app_instance_uuid = rc-production
162
163
163 ## Cut off limit for large diffs (size in bytes). If overall diff size on
164 ## Cut off limit for large diffs (size in bytes). If overall diff size on
164 ## commit, or pull request exceeds this limit this diff will be displayed
165 ## commit, or pull request exceeds this limit this diff will be displayed
165 ## partially. E.g 512000 == 512Kb
166 ## partially. E.g 512000 == 512Kb
166 cut_off_limit_diff = 512000
167 cut_off_limit_diff = 512000
167
168
168 ## Cut off limit for large files inside diffs (size in bytes). Each individual
169 ## Cut off limit for large files inside diffs (size in bytes). Each individual
169 ## file inside diff which exceeds this limit will be displayed partially.
170 ## file inside diff which exceeds this limit will be displayed partially.
170 ## E.g 128000 == 128Kb
171 ## E.g 128000 == 128Kb
171 cut_off_limit_file = 128000
172 cut_off_limit_file = 128000
172
173
173 ## use cached version of vcs repositories everywhere. Recommended to be `true`
174 ## use cached version of vcs repositories everywhere. Recommended to be `true`
174 vcs_full_cache = true
175 vcs_full_cache = true
175
176
176 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
177 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
177 ## Normally this is controlled by proper http flags sent from http server
178 ## Normally this is controlled by proper http flags sent from http server
178 force_https = false
179 force_https = false
179
180
180 ## use Strict-Transport-Security headers
181 ## use Strict-Transport-Security headers
181 use_htsts = false
182 use_htsts = false
182
183
183 ## git rev filter option, --all is the default filter, if you need to
184 ## git rev filter option, --all is the default filter, if you need to
184 ## hide all refs in changelog switch this to --branches --tags
185 ## hide all refs in changelog switch this to --branches --tags
185 git_rev_filter = --branches --tags
186 git_rev_filter = --branches --tags
186
187
187 # Set to true if your repos are exposed using the dumb protocol
188 # Set to true if your repos are exposed using the dumb protocol
188 git_update_server_info = false
189 git_update_server_info = false
189
190
190 ## RSS/ATOM feed options
191 ## RSS/ATOM feed options
191 rss_cut_off_limit = 256000
192 rss_cut_off_limit = 256000
192 rss_items_per_page = 10
193 rss_items_per_page = 10
193 rss_include_diff = false
194 rss_include_diff = false
194
195
195 ## gist URL alias, used to create nicer urls for gist. This should be an
196 ## gist URL alias, used to create nicer urls for gist. This should be an
196 ## url that does rewrites to _admin/gists/{gistid}.
197 ## url that does rewrites to _admin/gists/{gistid}.
197 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
198 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
198 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
199 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
199 gist_alias_url =
200 gist_alias_url =
200
201
201 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
202 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
202 ## used for access.
203 ## used for access.
203 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
204 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
204 ## came from the the logged in user who own this authentication token.
205 ## came from the the logged in user who own this authentication token.
205 ## Additionally @TOKEN syntaxt can be used to bound the view to specific
206 ## Additionally @TOKEN syntaxt can be used to bound the view to specific
206 ## authentication token. Such view would be only accessible when used together
207 ## authentication token. Such view would be only accessible when used together
207 ## with this authentication token
208 ## with this authentication token
208 ##
209 ##
209 ## list of all views can be found under `/_admin/permissions/auth_token_access`
210 ## list of all views can be found under `/_admin/permissions/auth_token_access`
210 ## The list should be "," separated and on a single line.
211 ## The list should be "," separated and on a single line.
211 ##
212 ##
212 ## Most common views to enable:
213 ## Most common views to enable:
213 # RepoCommitsView:repo_commit_download
214 # RepoCommitsView:repo_commit_download
214 # RepoCommitsView:repo_commit_patch
215 # RepoCommitsView:repo_commit_patch
215 # RepoCommitsView:repo_commit_raw
216 # RepoCommitsView:repo_commit_raw
216 # RepoCommitsView:repo_commit_raw@TOKEN
217 # RepoCommitsView:repo_commit_raw@TOKEN
217 # RepoFilesView:repo_files_diff
218 # RepoFilesView:repo_files_diff
218 # RepoFilesView:repo_archivefile
219 # RepoFilesView:repo_archivefile
219 # RepoFilesView:repo_file_raw
220 # RepoFilesView:repo_file_raw
220 # GistView:*
221 # GistView:*
221 api_access_controllers_whitelist =
222 api_access_controllers_whitelist =
222
223
223 ## Default encoding used to convert from and to unicode
224 ## Default encoding used to convert from and to unicode
224 ## can be also a comma separated list of encoding in case of mixed encodings
225 ## can be also a comma separated list of encoding in case of mixed encodings
225 default_encoding = UTF-8
226 default_encoding = UTF-8
226
227
227 ## instance-id prefix
228 ## instance-id prefix
228 ## a prefix key for this instance used for cache invalidation when running
229 ## a prefix key for this instance used for cache invalidation when running
229 ## multiple instances of rhodecode, make sure it's globally unique for
230 ## multiple instances of rhodecode, make sure it's globally unique for
230 ## all running rhodecode instances. Leave empty if you don't use it
231 ## all running rhodecode instances. Leave empty if you don't use it
231 instance_id =
232 instance_id =
232
233
233 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
234 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
234 ## of an authentication plugin also if it is disabled by it's settings.
235 ## of an authentication plugin also if it is disabled by it's settings.
235 ## This could be useful if you are unable to log in to the system due to broken
236 ## This could be useful if you are unable to log in to the system due to broken
236 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
237 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
237 ## module to log in again and fix the settings.
238 ## module to log in again and fix the settings.
238 ##
239 ##
239 ## Available builtin plugin IDs (hash is part of the ID):
240 ## Available builtin plugin IDs (hash is part of the ID):
240 ## egg:rhodecode-enterprise-ce#rhodecode
241 ## egg:rhodecode-enterprise-ce#rhodecode
241 ## egg:rhodecode-enterprise-ce#pam
242 ## egg:rhodecode-enterprise-ce#pam
242 ## egg:rhodecode-enterprise-ce#ldap
243 ## egg:rhodecode-enterprise-ce#ldap
243 ## egg:rhodecode-enterprise-ce#jasig_cas
244 ## egg:rhodecode-enterprise-ce#jasig_cas
244 ## egg:rhodecode-enterprise-ce#headers
245 ## egg:rhodecode-enterprise-ce#headers
245 ## egg:rhodecode-enterprise-ce#crowd
246 ## egg:rhodecode-enterprise-ce#crowd
246 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
247 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
247
248
248 ## alternative return HTTP header for failed authentication. Default HTTP
249 ## alternative return HTTP header for failed authentication. Default HTTP
249 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
250 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
250 ## handling that causing a series of failed authentication calls.
251 ## handling that causing a series of failed authentication calls.
251 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
252 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
252 ## This will be served instead of default 401 on bad authnetication
253 ## This will be served instead of default 401 on bad authnetication
253 auth_ret_code =
254 auth_ret_code =
254
255
255 ## use special detection method when serving auth_ret_code, instead of serving
256 ## use special detection method when serving auth_ret_code, instead of serving
256 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
257 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
257 ## and then serve auth_ret_code to clients
258 ## and then serve auth_ret_code to clients
258 auth_ret_code_detection = false
259 auth_ret_code_detection = false
259
260
260 ## locking return code. When repository is locked return this HTTP code. 2XX
261 ## locking return code. When repository is locked return this HTTP code. 2XX
261 ## codes don't break the transactions while 4XX codes do
262 ## codes don't break the transactions while 4XX codes do
262 lock_ret_code = 423
263 lock_ret_code = 423
263
264
264 ## allows to change the repository location in settings page
265 ## allows to change the repository location in settings page
265 allow_repo_location_change = true
266 allow_repo_location_change = true
266
267
267 ## allows to setup custom hooks in settings page
268 ## allows to setup custom hooks in settings page
268 allow_custom_hooks_settings = true
269 allow_custom_hooks_settings = true
269
270
270 ## Generated license token required for EE edition license.
271 ## Generated license token required for EE edition license.
271 ## New generated token value can be found in Admin > settings > license page.
272 ## New generated token value can be found in Admin > settings > license page.
272 license_token =
273 license_token =
273
274
274 ## supervisor connection uri, for managing supervisor and logs.
275 ## supervisor connection uri, for managing supervisor and logs.
275 supervisor.uri =
276 supervisor.uri =
276 ## supervisord group name/id we only want this RC instance to handle
277 ## supervisord group name/id we only want this RC instance to handle
277 supervisor.group_id = dev
278 supervisor.group_id = dev
278
279
279 ## Display extended labs settings
280 ## Display extended labs settings
280 labs_settings_active = true
281 labs_settings_active = true
281
282
282 ## Custom exception store path, defaults to TMPDIR
283 ## Custom exception store path, defaults to TMPDIR
283 ## This is used to store exception from RhodeCode in shared directory
284 ## This is used to store exception from RhodeCode in shared directory
284 #exception_tracker.store_path =
285 #exception_tracker.store_path =
285
286
286
287
287 ####################################
288 ####################################
288 ### CELERY CONFIG ####
289 ### CELERY CONFIG ####
289 ####################################
290 ####################################
290 ## run: /path/to/celery worker \
291 ## run: /path/to/celery worker \
291 ## -E --beat --app rhodecode.lib.celerylib.loader \
292 ## -E --beat --app rhodecode.lib.celerylib.loader \
292 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
293 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
293 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
294 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
294
295
295 use_celery = false
296 use_celery = false
296
297
297 ## connection url to the message broker (default rabbitmq)
298 ## connection url to the message broker (default rabbitmq)
298 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
299 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
299
300
300 ## maximum tasks to execute before worker restart
301 ## maximum tasks to execute before worker restart
301 celery.max_tasks_per_child = 100
302 celery.max_tasks_per_child = 100
302
303
303 ## tasks will never be sent to the queue, but executed locally instead.
304 ## tasks will never be sent to the queue, but executed locally instead.
304 celery.task_always_eager = false
305 celery.task_always_eager = false
305
306
306 #####################################
307 #####################################
307 ### DOGPILE CACHE ####
308 ### DOGPILE CACHE ####
308 #####################################
309 #####################################
309 ## Default cache dir for caches. Putting this into a ramdisk
310 ## Default cache dir for caches. Putting this into a ramdisk
310 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
311 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
311 ## large amount of space
312 ## large amount of space
312 cache_dir = %(here)s/data
313 cache_dir = %(here)s/data
313
314
314 ## `cache_perms` cache settings for permission tree, auth TTL.
315 ## `cache_perms` cache settings for permission tree, auth TTL.
315 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
316 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
316 rc_cache.cache_perms.expiration_time = 300
317 rc_cache.cache_perms.expiration_time = 300
317
318
318 ## alternative `cache_perms` redis backend with distributed lock
319 ## alternative `cache_perms` redis backend with distributed lock
319 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
320 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
320 #rc_cache.cache_perms.expiration_time = 300
321 #rc_cache.cache_perms.expiration_time = 300
321 ## redis_expiration_time needs to be greater then expiration_time
322 ## redis_expiration_time needs to be greater then expiration_time
322 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
323 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
323 #rc_cache.cache_perms.arguments.socket_timeout = 30
324 #rc_cache.cache_perms.arguments.socket_timeout = 30
324 #rc_cache.cache_perms.arguments.host = localhost
325 #rc_cache.cache_perms.arguments.host = localhost
325 #rc_cache.cache_perms.arguments.port = 6379
326 #rc_cache.cache_perms.arguments.port = 6379
326 #rc_cache.cache_perms.arguments.db = 0
327 #rc_cache.cache_perms.arguments.db = 0
327 #rc_cache.cache_perms.arguments.distributed_lock = true
328 #rc_cache.cache_perms.arguments.distributed_lock = true
328
329
329 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
330 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
330 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
331 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
331 rc_cache.cache_repo.expiration_time = 2592000
332 rc_cache.cache_repo.expiration_time = 2592000
332
333
333 ## alternative `cache_repo` redis backend with distributed lock
334 ## alternative `cache_repo` redis backend with distributed lock
334 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
335 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
335 #rc_cache.cache_repo.expiration_time = 2592000
336 #rc_cache.cache_repo.expiration_time = 2592000
336 ## redis_expiration_time needs to be greater then expiration_time
337 ## redis_expiration_time needs to be greater then expiration_time
337 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
338 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
338 #rc_cache.cache_repo.arguments.socket_timeout = 30
339 #rc_cache.cache_repo.arguments.socket_timeout = 30
339 #rc_cache.cache_repo.arguments.host = localhost
340 #rc_cache.cache_repo.arguments.host = localhost
340 #rc_cache.cache_repo.arguments.port = 6379
341 #rc_cache.cache_repo.arguments.port = 6379
341 #rc_cache.cache_repo.arguments.db = 1
342 #rc_cache.cache_repo.arguments.db = 1
342 #rc_cache.cache_repo.arguments.distributed_lock = true
343 #rc_cache.cache_repo.arguments.distributed_lock = true
343
344
344 ## cache settings for SQL queries, this needs to use memory type backend
345 ## cache settings for SQL queries, this needs to use memory type backend
345 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
346 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
346 rc_cache.sql_cache_short.expiration_time = 30
347 rc_cache.sql_cache_short.expiration_time = 30
347
348
348 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
349 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
349 ## type backend as the objects kept are not pickle serializable
350 ## type backend as the objects kept are not pickle serializable
350 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
351 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
351 ## by default we use 96H, this is using invalidation on push anyway
352 ## by default we use 96H, this is using invalidation on push anyway
352 rc_cache.cache_repo_longterm.expiration_time = 345600
353 rc_cache.cache_repo_longterm.expiration_time = 345600
353 ## max items in LRU cache, reduce this number to save memory, and expire last used
354 ## max items in LRU cache, reduce this number to save memory, and expire last used
354 ## cached objects
355 ## cached objects
355 rc_cache.cache_repo_longterm.max_size = 10000
356 rc_cache.cache_repo_longterm.max_size = 10000
356
357
357
358
358 ####################################
359 ####################################
359 ### BEAKER SESSION ####
360 ### BEAKER SESSION ####
360 ####################################
361 ####################################
361
362
362 ## .session.type is type of storage options for the session, current allowed
363 ## .session.type is type of storage options for the session, current allowed
363 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
364 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
364 beaker.session.type = file
365 beaker.session.type = file
365 beaker.session.data_dir = %(here)s/data/sessions
366 beaker.session.data_dir = %(here)s/data/sessions
366
367
367 ## db based session, fast, and allows easy management over logged in users
368 ## db based session, fast, and allows easy management over logged in users
368 #beaker.session.type = ext:database
369 #beaker.session.type = ext:database
369 #beaker.session.table_name = db_session
370 #beaker.session.table_name = db_session
370 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
371 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
371 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
372 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
372 #beaker.session.sa.pool_recycle = 3600
373 #beaker.session.sa.pool_recycle = 3600
373 #beaker.session.sa.echo = false
374 #beaker.session.sa.echo = false
374
375
375 beaker.session.key = rhodecode
376 beaker.session.key = rhodecode
376 beaker.session.secret = develop-rc-uytcxaz
377 beaker.session.secret = develop-rc-uytcxaz
377 beaker.session.lock_dir = %(here)s/data/sessions/lock
378 beaker.session.lock_dir = %(here)s/data/sessions/lock
378
379
379 ## Secure encrypted cookie. Requires AES and AES python libraries
380 ## Secure encrypted cookie. Requires AES and AES python libraries
380 ## you must disable beaker.session.secret to use this
381 ## you must disable beaker.session.secret to use this
381 #beaker.session.encrypt_key = key_for_encryption
382 #beaker.session.encrypt_key = key_for_encryption
382 #beaker.session.validate_key = validation_key
383 #beaker.session.validate_key = validation_key
383
384
384 ## sets session as invalid(also logging out user) if it haven not been
385 ## sets session as invalid(also logging out user) if it haven not been
385 ## accessed for given amount of time in seconds
386 ## accessed for given amount of time in seconds
386 beaker.session.timeout = 2592000
387 beaker.session.timeout = 2592000
387 beaker.session.httponly = true
388 beaker.session.httponly = true
388 ## Path to use for the cookie. Set to prefix if you use prefix middleware
389 ## Path to use for the cookie. Set to prefix if you use prefix middleware
389 #beaker.session.cookie_path = /custom_prefix
390 #beaker.session.cookie_path = /custom_prefix
390
391
391 ## uncomment for https secure cookie
392 ## uncomment for https secure cookie
392 beaker.session.secure = false
393 beaker.session.secure = false
393
394
394 ## auto save the session to not to use .save()
395 ## auto save the session to not to use .save()
395 beaker.session.auto = false
396 beaker.session.auto = false
396
397
397 ## default cookie expiration time in seconds, set to `true` to set expire
398 ## default cookie expiration time in seconds, set to `true` to set expire
398 ## at browser close
399 ## at browser close
399 #beaker.session.cookie_expires = 3600
400 #beaker.session.cookie_expires = 3600
400
401
401 ###################################
402 ###################################
402 ## SEARCH INDEXING CONFIGURATION ##
403 ## SEARCH INDEXING CONFIGURATION ##
403 ###################################
404 ###################################
404 ## Full text search indexer is available in rhodecode-tools under
405 ## Full text search indexer is available in rhodecode-tools under
405 ## `rhodecode-tools index` command
406 ## `rhodecode-tools index` command
406
407
407 ## WHOOSH Backend, doesn't require additional services to run
408 ## WHOOSH Backend, doesn't require additional services to run
408 ## it works good with few dozen repos
409 ## it works good with few dozen repos
409 search.module = rhodecode.lib.index.whoosh
410 search.module = rhodecode.lib.index.whoosh
410 search.location = %(here)s/data/index
411 search.location = %(here)s/data/index
411
412
412 ########################################
413 ########################################
413 ### CHANNELSTREAM CONFIG ####
414 ### CHANNELSTREAM CONFIG ####
414 ########################################
415 ########################################
415 ## channelstream enables persistent connections and live notification
416 ## channelstream enables persistent connections and live notification
416 ## in the system. It's also used by the chat system
417 ## in the system. It's also used by the chat system
418
417 channelstream.enabled = false
419 channelstream.enabled = false
418
420
419 ## server address for channelstream server on the backend
421 ## server address for channelstream server on the backend
420 channelstream.server = 127.0.0.1:9800
422 channelstream.server = 127.0.0.1:9800
421
423
422 ## location of the channelstream server from outside world
424 ## location of the channelstream server from outside world
423 ## use ws:// for http or wss:// for https. This address needs to be handled
425 ## use ws:// for http or wss:// for https. This address needs to be handled
424 ## by external HTTP server such as Nginx or Apache
426 ## by external HTTP server such as Nginx or Apache
425 ## see nginx/apache configuration examples in our docs
427 ## see nginx/apache configuration examples in our docs
426 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
428 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
427 channelstream.secret = secret
429 channelstream.secret = secret
428 channelstream.history.location = %(here)s/channelstream_history
430 channelstream.history.location = %(here)s/channelstream_history
429
431
430 ## Internal application path that Javascript uses to connect into.
432 ## Internal application path that Javascript uses to connect into.
431 ## If you use proxy-prefix the prefix should be added before /_channelstream
433 ## If you use proxy-prefix the prefix should be added before /_channelstream
432 channelstream.proxy_path = /_channelstream
434 channelstream.proxy_path = /_channelstream
433
435
434
436
435 ###################################
437 ###################################
436 ## APPENLIGHT CONFIG ##
438 ## APPENLIGHT CONFIG ##
437 ###################################
439 ###################################
438
440
439 ## Appenlight is tailored to work with RhodeCode, see
441 ## Appenlight is tailored to work with RhodeCode, see
440 ## http://appenlight.com for details how to obtain an account
442 ## http://appenlight.com for details how to obtain an account
441
443
442 ## appenlight integration enabled
444 ## appenlight integration enabled
443 appenlight = false
445 appenlight = false
444
446
445 appenlight.server_url = https://api.appenlight.com
447 appenlight.server_url = https://api.appenlight.com
446 appenlight.api_key = YOUR_API_KEY
448 appenlight.api_key = YOUR_API_KEY
447 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
449 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
448
450
449 # used for JS client
451 # used for JS client
450 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
452 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
451
453
452 ## TWEAK AMOUNT OF INFO SENT HERE
454 ## TWEAK AMOUNT OF INFO SENT HERE
453
455
454 ## enables 404 error logging (default False)
456 ## enables 404 error logging (default False)
455 appenlight.report_404 = false
457 appenlight.report_404 = false
456
458
457 ## time in seconds after request is considered being slow (default 1)
459 ## time in seconds after request is considered being slow (default 1)
458 appenlight.slow_request_time = 1
460 appenlight.slow_request_time = 1
459
461
460 ## record slow requests in application
462 ## record slow requests in application
461 ## (needs to be enabled for slow datastore recording and time tracking)
463 ## (needs to be enabled for slow datastore recording and time tracking)
462 appenlight.slow_requests = true
464 appenlight.slow_requests = true
463
465
464 ## enable hooking to application loggers
466 ## enable hooking to application loggers
465 appenlight.logging = true
467 appenlight.logging = true
466
468
467 ## minimum log level for log capture
469 ## minimum log level for log capture
468 appenlight.logging.level = WARNING
470 appenlight.logging.level = WARNING
469
471
470 ## send logs only from erroneous/slow requests
472 ## send logs only from erroneous/slow requests
471 ## (saves API quota for intensive logging)
473 ## (saves API quota for intensive logging)
472 appenlight.logging_on_error = false
474 appenlight.logging_on_error = false
473
475
474 ## list of additonal keywords that should be grabbed from environ object
476 ## list of additonal keywords that should be grabbed from environ object
475 ## can be string with comma separated list of words in lowercase
477 ## can be string with comma separated list of words in lowercase
476 ## (by default client will always send following info:
478 ## (by default client will always send following info:
477 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
479 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
478 ## start with HTTP* this list be extended with additional keywords here
480 ## start with HTTP* this list be extended with additional keywords here
479 appenlight.environ_keys_whitelist =
481 appenlight.environ_keys_whitelist =
480
482
481 ## list of keywords that should be blanked from request object
483 ## list of keywords that should be blanked from request object
482 ## can be string with comma separated list of words in lowercase
484 ## can be string with comma separated list of words in lowercase
483 ## (by default client will always blank keys that contain following words
485 ## (by default client will always blank keys that contain following words
484 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
486 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
485 ## this list be extended with additional keywords set here
487 ## this list be extended with additional keywords set here
486 appenlight.request_keys_blacklist =
488 appenlight.request_keys_blacklist =
487
489
488 ## list of namespaces that should be ignores when gathering log entries
490 ## list of namespaces that should be ignores when gathering log entries
489 ## can be string with comma separated list of namespaces
491 ## can be string with comma separated list of namespaces
490 ## (by default the client ignores own entries: appenlight_client.client)
492 ## (by default the client ignores own entries: appenlight_client.client)
491 appenlight.log_namespace_blacklist =
493 appenlight.log_namespace_blacklist =
492
494
493
494 ################################################################################
495 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
496 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
497 ## execute malicious code after an exception is raised. ##
498 ################################################################################
499 #set debug = false
500
501 # enable debug style page
495 # enable debug style page
502 debug_style = true
496 debug_style = true
503
497
504 ###########################################
498 ###########################################
505 ### MAIN RHODECODE DATABASE CONFIG ###
499 ### MAIN RHODECODE DATABASE CONFIG ###
506 ###########################################
500 ###########################################
507 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
501 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
508 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
502 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
509 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
503 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
510 # pymysql is an alternative driver for MySQL, use in case of problems with default one
504 # pymysql is an alternative driver for MySQL, use in case of problems with default one
511 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
505 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
512
506
513 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
507 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
514
508
515 # see sqlalchemy docs for other advanced settings
509 # see sqlalchemy docs for other advanced settings
516
510
517 ## print the sql statements to output
511 ## print the sql statements to output
518 sqlalchemy.db1.echo = false
512 sqlalchemy.db1.echo = false
519 ## recycle the connections after this amount of seconds
513 ## recycle the connections after this amount of seconds
520 sqlalchemy.db1.pool_recycle = 3600
514 sqlalchemy.db1.pool_recycle = 3600
521 sqlalchemy.db1.convert_unicode = true
515 sqlalchemy.db1.convert_unicode = true
522
516
523 ## the number of connections to keep open inside the connection pool.
517 ## the number of connections to keep open inside the connection pool.
524 ## 0 indicates no limit
518 ## 0 indicates no limit
525 #sqlalchemy.db1.pool_size = 5
519 #sqlalchemy.db1.pool_size = 5
526
520
527 ## the number of connections to allow in connection pool "overflow", that is
521 ## the number of connections to allow in connection pool "overflow", that is
528 ## connections that can be opened above and beyond the pool_size setting,
522 ## connections that can be opened above and beyond the pool_size setting,
529 ## which defaults to five.
523 ## which defaults to five.
530 #sqlalchemy.db1.max_overflow = 10
524 #sqlalchemy.db1.max_overflow = 10
531
525
532 ## Connection check ping, used to detect broken database connections
526 ## Connection check ping, used to detect broken database connections
533 ## could be enabled to better handle cases if MySQL has gone away errors
527 ## could be enabled to better handle cases if MySQL has gone away errors
534 #sqlalchemy.db1.ping_connection = true
528 #sqlalchemy.db1.ping_connection = true
535
529
536 ##################
530 ##################
537 ### VCS CONFIG ###
531 ### VCS CONFIG ###
538 ##################
532 ##################
539 vcs.server.enable = true
533 vcs.server.enable = true
540 vcs.server = localhost:9900
534 vcs.server = localhost:9900
541
535
542 ## Web server connectivity protocol, responsible for web based VCS operatations
536 ## Web server connectivity protocol, responsible for web based VCS operatations
543 ## Available protocols are:
537 ## Available protocols are:
544 ## `http` - use http-rpc backend (default)
538 ## `http` - use http-rpc backend (default)
545 vcs.server.protocol = http
539 vcs.server.protocol = http
546
540
547 ## Push/Pull operations protocol, available options are:
541 ## Push/Pull operations protocol, available options are:
548 ## `http` - use http-rpc backend (default)
542 ## `http` - use http-rpc backend (default)
549 vcs.scm_app_implementation = http
543 vcs.scm_app_implementation = http
550
544
551 ## Push/Pull operations hooks protocol, available options are:
545 ## Push/Pull operations hooks protocol, available options are:
552 ## `http` - use http-rpc backend (default)
546 ## `http` - use http-rpc backend (default)
553 vcs.hooks.protocol = http
547 vcs.hooks.protocol = http
554
548
555 ## Host on which this instance is listening for hooks. If vcsserver is in other location
549 ## Host on which this instance is listening for hooks. If vcsserver is in other location
556 ## this should be adjusted.
550 ## this should be adjusted.
557 vcs.hooks.host = 127.0.0.1
551 vcs.hooks.host = 127.0.0.1
558
552
559 vcs.server.log_level = debug
553 vcs.server.log_level = debug
560 ## Start VCSServer with this instance as a subprocess, useful for development
554 ## Start VCSServer with this instance as a subprocess, useful for development
561 vcs.start_server = false
555 vcs.start_server = false
562
556
563 ## List of enabled VCS backends, available options are:
557 ## List of enabled VCS backends, available options are:
564 ## `hg` - mercurial
558 ## `hg` - mercurial
565 ## `git` - git
559 ## `git` - git
566 ## `svn` - subversion
560 ## `svn` - subversion
567 vcs.backends = hg, git, svn
561 vcs.backends = hg, git, svn
568
562
569 vcs.connection_timeout = 3600
563 vcs.connection_timeout = 3600
570 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
564 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
571 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
565 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
572 #vcs.svn.compatible_version = pre-1.8-compatible
566 #vcs.svn.compatible_version = pre-1.8-compatible
573
567
574
568
575 ############################################################
569 ############################################################
576 ### Subversion proxy support (mod_dav_svn) ###
570 ### Subversion proxy support (mod_dav_svn) ###
577 ### Maps RhodeCode repo groups into SVN paths for Apache ###
571 ### Maps RhodeCode repo groups into SVN paths for Apache ###
578 ############################################################
572 ############################################################
579 ## Enable or disable the config file generation.
573 ## Enable or disable the config file generation.
580 svn.proxy.generate_config = false
574 svn.proxy.generate_config = false
581 ## Generate config file with `SVNListParentPath` set to `On`.
575 ## Generate config file with `SVNListParentPath` set to `On`.
582 svn.proxy.list_parent_path = true
576 svn.proxy.list_parent_path = true
583 ## Set location and file name of generated config file.
577 ## Set location and file name of generated config file.
584 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
578 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
585 ## alternative mod_dav config template. This needs to be a mako template
579 ## alternative mod_dav config template. This needs to be a mako template
586 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
580 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
587 ## Used as a prefix to the `Location` block in the generated config file.
581 ## Used as a prefix to the `Location` block in the generated config file.
588 ## In most cases it should be set to `/`.
582 ## In most cases it should be set to `/`.
589 svn.proxy.location_root = /
583 svn.proxy.location_root = /
590 ## Command to reload the mod dav svn configuration on change.
584 ## Command to reload the mod dav svn configuration on change.
591 ## Example: `/etc/init.d/apache2 reload`
585 ## Example: `/etc/init.d/apache2 reload`
592 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
586 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
593 ## If the timeout expires before the reload command finishes, the command will
587 ## If the timeout expires before the reload command finishes, the command will
594 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
588 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
595 #svn.proxy.reload_timeout = 10
589 #svn.proxy.reload_timeout = 10
596
590
597 ############################################################
591 ############################################################
598 ### SSH Support Settings ###
592 ### SSH Support Settings ###
599 ############################################################
593 ############################################################
600
594
601 ## Defines if a custom authorized_keys file should be created and written on
595 ## Defines if a custom authorized_keys file should be created and written on
602 ## any change user ssh keys. Setting this to false also disables posibility
596 ## any change user ssh keys. Setting this to false also disables posibility
603 ## of adding SSH keys by users from web interface. Super admins can still
597 ## of adding SSH keys by users from web interface. Super admins can still
604 ## manage SSH Keys.
598 ## manage SSH Keys.
605 ssh.generate_authorized_keyfile = false
599 ssh.generate_authorized_keyfile = false
606
600
607 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
601 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
608 # ssh.authorized_keys_ssh_opts =
602 # ssh.authorized_keys_ssh_opts =
609
603
610 ## Path to the authrozied_keys file where the generate entries are placed.
604 ## Path to the authrozied_keys file where the generate entries are placed.
611 ## It is possible to have multiple key files specified in `sshd_config` e.g.
605 ## It is possible to have multiple key files specified in `sshd_config` e.g.
612 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
606 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
613 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
607 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
614
608
615 ## Command to execute the SSH wrapper. The binary is available in the
609 ## Command to execute the SSH wrapper. The binary is available in the
616 ## rhodecode installation directory.
610 ## rhodecode installation directory.
617 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
611 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
618 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
612 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
619
613
620 ## Allow shell when executing the ssh-wrapper command
614 ## Allow shell when executing the ssh-wrapper command
621 ssh.wrapper_cmd_allow_shell = false
615 ssh.wrapper_cmd_allow_shell = false
622
616
623 ## Enables logging, and detailed output send back to the client during SSH
617 ## Enables logging, and detailed output send back to the client during SSH
624 ## operations. Usefull for debugging, shouldn't be used in production.
618 ## operations. Usefull for debugging, shouldn't be used in production.
625 ssh.enable_debug_logging = true
619 ssh.enable_debug_logging = true
626
620
627 ## Paths to binary executable, by default they are the names, but we can
621 ## Paths to binary executable, by default they are the names, but we can
628 ## override them if we want to use a custom one
622 ## override them if we want to use a custom one
629 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
623 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
630 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
624 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
631 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
625 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
632
626
633
627
634 ## Dummy marker to add new entries after.
628 ## Dummy marker to add new entries after.
635 ## Add any custom entries below. Please don't remove.
629 ## Add any custom entries below. Please don't remove.
636 custom.conf = 1
630 custom.conf = 1
637
631
638
632
639 ################################
633 ################################
640 ### LOGGING CONFIGURATION ####
634 ### LOGGING CONFIGURATION ####
641 ################################
635 ################################
642 [loggers]
636 [loggers]
643 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
637 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
644
638
645 [handlers]
639 [handlers]
646 keys = console, console_sql
640 keys = console, console_sql
647
641
648 [formatters]
642 [formatters]
649 keys = generic, color_formatter, color_formatter_sql
643 keys = generic, color_formatter, color_formatter_sql
650
644
651 #############
645 #############
652 ## LOGGERS ##
646 ## LOGGERS ##
653 #############
647 #############
654 [logger_root]
648 [logger_root]
655 level = NOTSET
649 level = NOTSET
656 handlers = console
650 handlers = console
657
651
658 [logger_sqlalchemy]
652 [logger_sqlalchemy]
659 level = INFO
653 level = INFO
660 handlers = console_sql
654 handlers = console_sql
661 qualname = sqlalchemy.engine
655 qualname = sqlalchemy.engine
662 propagate = 0
656 propagate = 0
663
657
664 [logger_beaker]
658 [logger_beaker]
665 level = DEBUG
659 level = DEBUG
666 handlers =
660 handlers =
667 qualname = beaker.container
661 qualname = beaker.container
668 propagate = 1
662 propagate = 1
669
663
670 [logger_rhodecode]
664 [logger_rhodecode]
671 level = DEBUG
665 level = DEBUG
672 handlers =
666 handlers =
673 qualname = rhodecode
667 qualname = rhodecode
674 propagate = 1
668 propagate = 1
675
669
676 [logger_ssh_wrapper]
670 [logger_ssh_wrapper]
677 level = DEBUG
671 level = DEBUG
678 handlers =
672 handlers =
679 qualname = ssh_wrapper
673 qualname = ssh_wrapper
680 propagate = 1
674 propagate = 1
681
675
682 [logger_celery]
676 [logger_celery]
683 level = DEBUG
677 level = DEBUG
684 handlers =
678 handlers =
685 qualname = celery
679 qualname = celery
686
680
687
681
688 ##############
682 ##############
689 ## HANDLERS ##
683 ## HANDLERS ##
690 ##############
684 ##############
691
685
692 [handler_console]
686 [handler_console]
693 class = StreamHandler
687 class = StreamHandler
694 args = (sys.stderr, )
688 args = (sys.stderr, )
695 level = DEBUG
689 level = DEBUG
696 formatter = color_formatter
690 formatter = color_formatter
697
691
698 [handler_console_sql]
692 [handler_console_sql]
699 # "level = DEBUG" logs SQL queries and results.
693 # "level = DEBUG" logs SQL queries and results.
700 # "level = INFO" logs SQL queries.
694 # "level = INFO" logs SQL queries.
701 # "level = WARN" logs neither. (Recommended for production systems.)
695 # "level = WARN" logs neither. (Recommended for production systems.)
702 class = StreamHandler
696 class = StreamHandler
703 args = (sys.stderr, )
697 args = (sys.stderr, )
704 level = WARN
698 level = WARN
705 formatter = color_formatter_sql
699 formatter = color_formatter_sql
706
700
707 ################
701 ################
708 ## FORMATTERS ##
702 ## FORMATTERS ##
709 ################
703 ################
710
704
711 [formatter_generic]
705 [formatter_generic]
712 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
706 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
713 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
707 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
714 datefmt = %Y-%m-%d %H:%M:%S
708 datefmt = %Y-%m-%d %H:%M:%S
715
709
716 [formatter_color_formatter]
710 [formatter_color_formatter]
717 class = rhodecode.lib.logging_formatter.ColorFormatter
711 class = rhodecode.lib.logging_formatter.ColorFormatter
718 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
712 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
719 datefmt = %Y-%m-%d %H:%M:%S
713 datefmt = %Y-%m-%d %H:%M:%S
720
714
721 [formatter_color_formatter_sql]
715 [formatter_color_formatter_sql]
722 class = rhodecode.lib.logging_formatter.ColorFormatterSql
716 class = rhodecode.lib.logging_formatter.ColorFormatterSql
723 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
717 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
724 datefmt = %Y-%m-%d %H:%M:%S
718 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,696 +1,691 b''
1
1
2
2
3 ################################################################################
3 ################################################################################
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
5 ################################################################################
5 ################################################################################
6
6
7 [DEFAULT]
7 [DEFAULT]
8 debug = true
8 ## Debug flag sets all loggers to debug, and enables request tracking
9 debug = false
9
10
10 ################################################################################
11 ################################################################################
11 ## EMAIL CONFIGURATION ##
12 ## EMAIL CONFIGURATION ##
12 ## Uncomment and replace with the email address which should receive ##
13 ## Uncomment and replace with the email address which should receive ##
13 ## any error reports after an application crash ##
14 ## any error reports after an application crash ##
14 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
15 ################################################################################
16 ################################################################################
16
17
17 ## prefix all emails subjects with given prefix, helps filtering out emails
18 ## prefix all emails subjects with given prefix, helps filtering out emails
18 #email_prefix = [RhodeCode]
19 #email_prefix = [RhodeCode]
19
20
20 ## email FROM address all mails will be sent
21 ## email FROM address all mails will be sent
21 #app_email_from = rhodecode-noreply@localhost
22 #app_email_from = rhodecode-noreply@localhost
22
23
23 #smtp_server = mail.server.com
24 #smtp_server = mail.server.com
24 #smtp_username =
25 #smtp_username =
25 #smtp_password =
26 #smtp_password =
26 #smtp_port =
27 #smtp_port =
27 #smtp_use_tls = false
28 #smtp_use_tls = false
28 #smtp_use_ssl = true
29 #smtp_use_ssl = true
29
30
30 [server:main]
31 [server:main]
31 ## COMMON ##
32 ## COMMON ##
32 host = 127.0.0.1
33 host = 127.0.0.1
33 port = 5000
34 port = 5000
34
35
35 ###########################################################
36 ###########################################################
36 ## WAITRESS WSGI SERVER - Recommended for Development ####
37 ## WAITRESS WSGI SERVER - Recommended for Development ####
37 ###########################################################
38 ###########################################################
38
39
39 #use = egg:waitress#main
40 #use = egg:waitress#main
40 ## number of worker threads
41 ## number of worker threads
41 #threads = 5
42 #threads = 5
42 ## MAX BODY SIZE 100GB
43 ## MAX BODY SIZE 100GB
43 #max_request_body_size = 107374182400
44 #max_request_body_size = 107374182400
44 ## Use poll instead of select, fixes file descriptors limits problems.
45 ## Use poll instead of select, fixes file descriptors limits problems.
45 ## May not work on old windows systems.
46 ## May not work on old windows systems.
46 #asyncore_use_poll = true
47 #asyncore_use_poll = true
47
48
48
49
49 ##########################
50 ##########################
50 ## GUNICORN WSGI SERVER ##
51 ## GUNICORN WSGI SERVER ##
51 ##########################
52 ##########################
52 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
53 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
53
54
54 use = egg:gunicorn#main
55 use = egg:gunicorn#main
55 ## Sets the number of process workers. More workers means more concurent connections
56 ## Sets the number of process workers. More workers means more concurent connections
56 ## RhodeCode can handle at the same time. Each additional worker also it increases
57 ## RhodeCode can handle at the same time. Each additional worker also it increases
57 ## memory usage as each has it's own set of caches.
58 ## memory usage as each has it's own set of caches.
58 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
59 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
59 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
60 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
60 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
61 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
61 ## when using more than 1 worker.
62 ## when using more than 1 worker.
62 workers = 2
63 workers = 2
63 ## process name visible in process list
64 ## process name visible in process list
64 proc_name = rhodecode
65 proc_name = rhodecode
65 ## type of worker class, one of sync, gevent
66 ## type of worker class, one of sync, gevent
66 ## recommended for bigger setup is using of of other than sync one
67 ## recommended for bigger setup is using of of other than sync one
67 worker_class = gevent
68 worker_class = gevent
68 ## The maximum number of simultaneous clients. Valid only for Gevent
69 ## The maximum number of simultaneous clients. Valid only for Gevent
69 worker_connections = 10
70 worker_connections = 10
70 ## max number of requests that worker will handle before being gracefully
71 ## max number of requests that worker will handle before being gracefully
71 ## restarted, could prevent memory leaks
72 ## restarted, could prevent memory leaks
72 max_requests = 1000
73 max_requests = 1000
73 max_requests_jitter = 30
74 max_requests_jitter = 30
74 ## amount of time a worker can spend with handling a request before it
75 ## amount of time a worker can spend with handling a request before it
75 ## gets killed and restarted. Set to 6hrs
76 ## gets killed and restarted. Set to 6hrs
76 timeout = 21600
77 timeout = 21600
77
78
78
79
79 ## prefix middleware for RhodeCode.
80 ## prefix middleware for RhodeCode.
80 ## recommended when using proxy setup.
81 ## recommended when using proxy setup.
81 ## allows to set RhodeCode under a prefix in server.
82 ## allows to set RhodeCode under a prefix in server.
82 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
83 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
83 ## And set your prefix like: `prefix = /custom_prefix`
84 ## And set your prefix like: `prefix = /custom_prefix`
84 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
85 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
85 ## to make your cookies only work on prefix url
86 ## to make your cookies only work on prefix url
86 [filter:proxy-prefix]
87 [filter:proxy-prefix]
87 use = egg:PasteDeploy#prefix
88 use = egg:PasteDeploy#prefix
88 prefix = /
89 prefix = /
89
90
90 [app:main]
91 [app:main]
91 ## The %(here)s variable will be replaced with the absolute path of parent directory
92 ## The %(here)s variable will be replaced with the absolute path of parent directory
92 ## of this file
93 ## of this file
93 ## In addition ENVIRONMENT variables usage is possible, e.g
94 ## In addition ENVIRONMENT variables usage is possible, e.g
94 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
95 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
95
96
96 use = egg:rhodecode-enterprise-ce
97 use = egg:rhodecode-enterprise-ce
97
98
98 ## enable proxy prefix middleware, defined above
99 ## enable proxy prefix middleware, defined above
99 #filter-with = proxy-prefix
100 #filter-with = proxy-prefix
100
101
101 ## encryption key used to encrypt social plugin tokens,
102 ## encryption key used to encrypt social plugin tokens,
102 ## remote_urls with credentials etc, if not set it defaults to
103 ## remote_urls with credentials etc, if not set it defaults to
103 ## `beaker.session.secret`
104 ## `beaker.session.secret`
104 #rhodecode.encrypted_values.secret =
105 #rhodecode.encrypted_values.secret =
105
106
106 ## decryption strict mode (enabled by default). It controls if decryption raises
107 ## decryption strict mode (enabled by default). It controls if decryption raises
107 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
108 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
108 #rhodecode.encrypted_values.strict = false
109 #rhodecode.encrypted_values.strict = false
109
110
110 ## return gzipped responses from Rhodecode (static files/application)
111 ## return gzipped responses from Rhodecode (static files/application)
111 gzip_responses = false
112 gzip_responses = false
112
113
113 ## autogenerate javascript routes file on startup
114 ## autogenerate javascript routes file on startup
114 generate_js_files = false
115 generate_js_files = false
115
116
116 ## System global default language.
117 ## System global default language.
117 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
118 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
118 lang = en
119 lang = en
119
120
120 ## Perform a full repository scan and import on each server start.
121 ## Perform a full repository scan and import on each server start.
121 ## Settings this to true could lead to very long startup time.
122 ## Settings this to true could lead to very long startup time.
122 startup.import_repos = false
123 startup.import_repos = false
123
124
124 ## Uncomment and set this path to use archive download cache.
125 ## Uncomment and set this path to use archive download cache.
125 ## Once enabled, generated archives will be cached at this location
126 ## Once enabled, generated archives will be cached at this location
126 ## and served from the cache during subsequent requests for the same archive of
127 ## and served from the cache during subsequent requests for the same archive of
127 ## the repository.
128 ## the repository.
128 #archive_cache_dir = /tmp/tarballcache
129 #archive_cache_dir = /tmp/tarballcache
129
130
130 ## URL at which the application is running. This is used for bootstraping
131 ## URL at which the application is running. This is used for bootstraping
131 ## requests in context when no web request is available. Used in ishell, or
132 ## requests in context when no web request is available. Used in ishell, or
132 ## SSH calls. Set this for events to receive proper url for SSH calls.
133 ## SSH calls. Set this for events to receive proper url for SSH calls.
133 app.base_url = http://rhodecode.local
134 app.base_url = http://rhodecode.local
134
135
135 ## Unique application ID. Should be a random unique string for security.
136 ## Unique application ID. Should be a random unique string for security.
136 app_instance_uuid = rc-production
137 app_instance_uuid = rc-production
137
138
138 ## Cut off limit for large diffs (size in bytes). If overall diff size on
139 ## Cut off limit for large diffs (size in bytes). If overall diff size on
139 ## commit, or pull request exceeds this limit this diff will be displayed
140 ## commit, or pull request exceeds this limit this diff will be displayed
140 ## partially. E.g 512000 == 512Kb
141 ## partially. E.g 512000 == 512Kb
141 cut_off_limit_diff = 512000
142 cut_off_limit_diff = 512000
142
143
143 ## Cut off limit for large files inside diffs (size in bytes). Each individual
144 ## Cut off limit for large files inside diffs (size in bytes). Each individual
144 ## file inside diff which exceeds this limit will be displayed partially.
145 ## file inside diff which exceeds this limit will be displayed partially.
145 ## E.g 128000 == 128Kb
146 ## E.g 128000 == 128Kb
146 cut_off_limit_file = 128000
147 cut_off_limit_file = 128000
147
148
148 ## use cached version of vcs repositories everywhere. Recommended to be `true`
149 ## use cached version of vcs repositories everywhere. Recommended to be `true`
149 vcs_full_cache = true
150 vcs_full_cache = true
150
151
151 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
152 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
152 ## Normally this is controlled by proper http flags sent from http server
153 ## Normally this is controlled by proper http flags sent from http server
153 force_https = false
154 force_https = false
154
155
155 ## use Strict-Transport-Security headers
156 ## use Strict-Transport-Security headers
156 use_htsts = false
157 use_htsts = false
157
158
158 ## git rev filter option, --all is the default filter, if you need to
159 ## git rev filter option, --all is the default filter, if you need to
159 ## hide all refs in changelog switch this to --branches --tags
160 ## hide all refs in changelog switch this to --branches --tags
160 git_rev_filter = --branches --tags
161 git_rev_filter = --branches --tags
161
162
162 # Set to true if your repos are exposed using the dumb protocol
163 # Set to true if your repos are exposed using the dumb protocol
163 git_update_server_info = false
164 git_update_server_info = false
164
165
165 ## RSS/ATOM feed options
166 ## RSS/ATOM feed options
166 rss_cut_off_limit = 256000
167 rss_cut_off_limit = 256000
167 rss_items_per_page = 10
168 rss_items_per_page = 10
168 rss_include_diff = false
169 rss_include_diff = false
169
170
170 ## gist URL alias, used to create nicer urls for gist. This should be an
171 ## gist URL alias, used to create nicer urls for gist. This should be an
171 ## url that does rewrites to _admin/gists/{gistid}.
172 ## url that does rewrites to _admin/gists/{gistid}.
172 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
173 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
173 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
174 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
174 gist_alias_url =
175 gist_alias_url =
175
176
176 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
177 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
177 ## used for access.
178 ## used for access.
178 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
179 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
179 ## came from the the logged in user who own this authentication token.
180 ## came from the the logged in user who own this authentication token.
180 ## Additionally @TOKEN syntaxt can be used to bound the view to specific
181 ## Additionally @TOKEN syntaxt can be used to bound the view to specific
181 ## authentication token. Such view would be only accessible when used together
182 ## authentication token. Such view would be only accessible when used together
182 ## with this authentication token
183 ## with this authentication token
183 ##
184 ##
184 ## list of all views can be found under `/_admin/permissions/auth_token_access`
185 ## list of all views can be found under `/_admin/permissions/auth_token_access`
185 ## The list should be "," separated and on a single line.
186 ## The list should be "," separated and on a single line.
186 ##
187 ##
187 ## Most common views to enable:
188 ## Most common views to enable:
188 # RepoCommitsView:repo_commit_download
189 # RepoCommitsView:repo_commit_download
189 # RepoCommitsView:repo_commit_patch
190 # RepoCommitsView:repo_commit_patch
190 # RepoCommitsView:repo_commit_raw
191 # RepoCommitsView:repo_commit_raw
191 # RepoCommitsView:repo_commit_raw@TOKEN
192 # RepoCommitsView:repo_commit_raw@TOKEN
192 # RepoFilesView:repo_files_diff
193 # RepoFilesView:repo_files_diff
193 # RepoFilesView:repo_archivefile
194 # RepoFilesView:repo_archivefile
194 # RepoFilesView:repo_file_raw
195 # RepoFilesView:repo_file_raw
195 # GistView:*
196 # GistView:*
196 api_access_controllers_whitelist =
197 api_access_controllers_whitelist =
197
198
198 ## Default encoding used to convert from and to unicode
199 ## Default encoding used to convert from and to unicode
199 ## can be also a comma separated list of encoding in case of mixed encodings
200 ## can be also a comma separated list of encoding in case of mixed encodings
200 default_encoding = UTF-8
201 default_encoding = UTF-8
201
202
202 ## instance-id prefix
203 ## instance-id prefix
203 ## a prefix key for this instance used for cache invalidation when running
204 ## a prefix key for this instance used for cache invalidation when running
204 ## multiple instances of rhodecode, make sure it's globally unique for
205 ## multiple instances of rhodecode, make sure it's globally unique for
205 ## all running rhodecode instances. Leave empty if you don't use it
206 ## all running rhodecode instances. Leave empty if you don't use it
206 instance_id =
207 instance_id =
207
208
208 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
209 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
209 ## of an authentication plugin also if it is disabled by it's settings.
210 ## of an authentication plugin also if it is disabled by it's settings.
210 ## This could be useful if you are unable to log in to the system due to broken
211 ## This could be useful if you are unable to log in to the system due to broken
211 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
212 ## authentication settings. Then you can enable e.g. the internal rhodecode auth
212 ## module to log in again and fix the settings.
213 ## module to log in again and fix the settings.
213 ##
214 ##
214 ## Available builtin plugin IDs (hash is part of the ID):
215 ## Available builtin plugin IDs (hash is part of the ID):
215 ## egg:rhodecode-enterprise-ce#rhodecode
216 ## egg:rhodecode-enterprise-ce#rhodecode
216 ## egg:rhodecode-enterprise-ce#pam
217 ## egg:rhodecode-enterprise-ce#pam
217 ## egg:rhodecode-enterprise-ce#ldap
218 ## egg:rhodecode-enterprise-ce#ldap
218 ## egg:rhodecode-enterprise-ce#jasig_cas
219 ## egg:rhodecode-enterprise-ce#jasig_cas
219 ## egg:rhodecode-enterprise-ce#headers
220 ## egg:rhodecode-enterprise-ce#headers
220 ## egg:rhodecode-enterprise-ce#crowd
221 ## egg:rhodecode-enterprise-ce#crowd
221 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
222 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
222
223
223 ## alternative return HTTP header for failed authentication. Default HTTP
224 ## alternative return HTTP header for failed authentication. Default HTTP
224 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
225 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
225 ## handling that causing a series of failed authentication calls.
226 ## handling that causing a series of failed authentication calls.
226 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
227 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
227 ## This will be served instead of default 401 on bad authnetication
228 ## This will be served instead of default 401 on bad authnetication
228 auth_ret_code =
229 auth_ret_code =
229
230
230 ## use special detection method when serving auth_ret_code, instead of serving
231 ## use special detection method when serving auth_ret_code, instead of serving
231 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
232 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
232 ## and then serve auth_ret_code to clients
233 ## and then serve auth_ret_code to clients
233 auth_ret_code_detection = false
234 auth_ret_code_detection = false
234
235
235 ## locking return code. When repository is locked return this HTTP code. 2XX
236 ## locking return code. When repository is locked return this HTTP code. 2XX
236 ## codes don't break the transactions while 4XX codes do
237 ## codes don't break the transactions while 4XX codes do
237 lock_ret_code = 423
238 lock_ret_code = 423
238
239
239 ## allows to change the repository location in settings page
240 ## allows to change the repository location in settings page
240 allow_repo_location_change = true
241 allow_repo_location_change = true
241
242
242 ## allows to setup custom hooks in settings page
243 ## allows to setup custom hooks in settings page
243 allow_custom_hooks_settings = true
244 allow_custom_hooks_settings = true
244
245
245 ## Generated license token required for EE edition license.
246 ## Generated license token required for EE edition license.
246 ## New generated token value can be found in Admin > settings > license page.
247 ## New generated token value can be found in Admin > settings > license page.
247 license_token =
248 license_token =
248
249
249 ## supervisor connection uri, for managing supervisor and logs.
250 ## supervisor connection uri, for managing supervisor and logs.
250 supervisor.uri =
251 supervisor.uri =
251 ## supervisord group name/id we only want this RC instance to handle
252 ## supervisord group name/id we only want this RC instance to handle
252 supervisor.group_id = prod
253 supervisor.group_id = prod
253
254
254 ## Display extended labs settings
255 ## Display extended labs settings
255 labs_settings_active = true
256 labs_settings_active = true
256
257
257 ## Custom exception store path, defaults to TMPDIR
258 ## Custom exception store path, defaults to TMPDIR
258 ## This is used to store exception from RhodeCode in shared directory
259 ## This is used to store exception from RhodeCode in shared directory
259 #exception_tracker.store_path =
260 #exception_tracker.store_path =
260
261
261
262
262 ####################################
263 ####################################
263 ### CELERY CONFIG ####
264 ### CELERY CONFIG ####
264 ####################################
265 ####################################
265 ## run: /path/to/celery worker \
266 ## run: /path/to/celery worker \
266 ## -E --beat --app rhodecode.lib.celerylib.loader \
267 ## -E --beat --app rhodecode.lib.celerylib.loader \
267 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
268 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
268 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
269 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
269
270
270 use_celery = false
271 use_celery = false
271
272
272 ## connection url to the message broker (default rabbitmq)
273 ## connection url to the message broker (default rabbitmq)
273 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
274 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
274
275
275 ## maximum tasks to execute before worker restart
276 ## maximum tasks to execute before worker restart
276 celery.max_tasks_per_child = 100
277 celery.max_tasks_per_child = 100
277
278
278 ## tasks will never be sent to the queue, but executed locally instead.
279 ## tasks will never be sent to the queue, but executed locally instead.
279 celery.task_always_eager = false
280 celery.task_always_eager = false
280
281
281 #####################################
282 #####################################
282 ### DOGPILE CACHE ####
283 ### DOGPILE CACHE ####
283 #####################################
284 #####################################
284 ## Default cache dir for caches. Putting this into a ramdisk
285 ## Default cache dir for caches. Putting this into a ramdisk
285 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
286 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
286 ## large amount of space
287 ## large amount of space
287 cache_dir = %(here)s/data
288 cache_dir = %(here)s/data
288
289
289 ## `cache_perms` cache settings for permission tree, auth TTL.
290 ## `cache_perms` cache settings for permission tree, auth TTL.
290 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
291 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
291 rc_cache.cache_perms.expiration_time = 300
292 rc_cache.cache_perms.expiration_time = 300
292
293
293 ## alternative `cache_perms` redis backend with distributed lock
294 ## alternative `cache_perms` redis backend with distributed lock
294 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
295 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
295 #rc_cache.cache_perms.expiration_time = 300
296 #rc_cache.cache_perms.expiration_time = 300
296 ## redis_expiration_time needs to be greater then expiration_time
297 ## redis_expiration_time needs to be greater then expiration_time
297 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
298 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
298 #rc_cache.cache_perms.arguments.socket_timeout = 30
299 #rc_cache.cache_perms.arguments.socket_timeout = 30
299 #rc_cache.cache_perms.arguments.host = localhost
300 #rc_cache.cache_perms.arguments.host = localhost
300 #rc_cache.cache_perms.arguments.port = 6379
301 #rc_cache.cache_perms.arguments.port = 6379
301 #rc_cache.cache_perms.arguments.db = 0
302 #rc_cache.cache_perms.arguments.db = 0
302 #rc_cache.cache_perms.arguments.distributed_lock = true
303 #rc_cache.cache_perms.arguments.distributed_lock = true
303
304
304 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
305 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
305 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
306 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
306 rc_cache.cache_repo.expiration_time = 2592000
307 rc_cache.cache_repo.expiration_time = 2592000
307
308
308 ## alternative `cache_repo` redis backend with distributed lock
309 ## alternative `cache_repo` redis backend with distributed lock
309 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
310 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
310 #rc_cache.cache_repo.expiration_time = 2592000
311 #rc_cache.cache_repo.expiration_time = 2592000
311 ## redis_expiration_time needs to be greater then expiration_time
312 ## redis_expiration_time needs to be greater then expiration_time
312 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
313 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
313 #rc_cache.cache_repo.arguments.socket_timeout = 30
314 #rc_cache.cache_repo.arguments.socket_timeout = 30
314 #rc_cache.cache_repo.arguments.host = localhost
315 #rc_cache.cache_repo.arguments.host = localhost
315 #rc_cache.cache_repo.arguments.port = 6379
316 #rc_cache.cache_repo.arguments.port = 6379
316 #rc_cache.cache_repo.arguments.db = 1
317 #rc_cache.cache_repo.arguments.db = 1
317 #rc_cache.cache_repo.arguments.distributed_lock = true
318 #rc_cache.cache_repo.arguments.distributed_lock = true
318
319
319 ## cache settings for SQL queries, this needs to use memory type backend
320 ## cache settings for SQL queries, this needs to use memory type backend
320 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
321 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
321 rc_cache.sql_cache_short.expiration_time = 30
322 rc_cache.sql_cache_short.expiration_time = 30
322
323
323 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
324 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
324 ## type backend as the objects kept are not pickle serializable
325 ## type backend as the objects kept are not pickle serializable
325 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
326 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
326 ## by default we use 96H, this is using invalidation on push anyway
327 ## by default we use 96H, this is using invalidation on push anyway
327 rc_cache.cache_repo_longterm.expiration_time = 345600
328 rc_cache.cache_repo_longterm.expiration_time = 345600
328 ## max items in LRU cache, reduce this number to save memory, and expire last used
329 ## max items in LRU cache, reduce this number to save memory, and expire last used
329 ## cached objects
330 ## cached objects
330 rc_cache.cache_repo_longterm.max_size = 10000
331 rc_cache.cache_repo_longterm.max_size = 10000
331
332
332
333
333 ####################################
334 ####################################
334 ### BEAKER SESSION ####
335 ### BEAKER SESSION ####
335 ####################################
336 ####################################
336
337
337 ## .session.type is type of storage options for the session, current allowed
338 ## .session.type is type of storage options for the session, current allowed
338 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
339 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
339 beaker.session.type = file
340 beaker.session.type = file
340 beaker.session.data_dir = %(here)s/data/sessions
341 beaker.session.data_dir = %(here)s/data/sessions
341
342
342 ## db based session, fast, and allows easy management over logged in users
343 ## db based session, fast, and allows easy management over logged in users
343 #beaker.session.type = ext:database
344 #beaker.session.type = ext:database
344 #beaker.session.table_name = db_session
345 #beaker.session.table_name = db_session
345 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
346 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
346 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
347 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
347 #beaker.session.sa.pool_recycle = 3600
348 #beaker.session.sa.pool_recycle = 3600
348 #beaker.session.sa.echo = false
349 #beaker.session.sa.echo = false
349
350
350 beaker.session.key = rhodecode
351 beaker.session.key = rhodecode
351 beaker.session.secret = production-rc-uytcxaz
352 beaker.session.secret = production-rc-uytcxaz
352 beaker.session.lock_dir = %(here)s/data/sessions/lock
353 beaker.session.lock_dir = %(here)s/data/sessions/lock
353
354
354 ## Secure encrypted cookie. Requires AES and AES python libraries
355 ## Secure encrypted cookie. Requires AES and AES python libraries
355 ## you must disable beaker.session.secret to use this
356 ## you must disable beaker.session.secret to use this
356 #beaker.session.encrypt_key = key_for_encryption
357 #beaker.session.encrypt_key = key_for_encryption
357 #beaker.session.validate_key = validation_key
358 #beaker.session.validate_key = validation_key
358
359
359 ## sets session as invalid(also logging out user) if it haven not been
360 ## sets session as invalid(also logging out user) if it haven not been
360 ## accessed for given amount of time in seconds
361 ## accessed for given amount of time in seconds
361 beaker.session.timeout = 2592000
362 beaker.session.timeout = 2592000
362 beaker.session.httponly = true
363 beaker.session.httponly = true
363 ## Path to use for the cookie. Set to prefix if you use prefix middleware
364 ## Path to use for the cookie. Set to prefix if you use prefix middleware
364 #beaker.session.cookie_path = /custom_prefix
365 #beaker.session.cookie_path = /custom_prefix
365
366
366 ## uncomment for https secure cookie
367 ## uncomment for https secure cookie
367 beaker.session.secure = false
368 beaker.session.secure = false
368
369
369 ## auto save the session to not to use .save()
370 ## auto save the session to not to use .save()
370 beaker.session.auto = false
371 beaker.session.auto = false
371
372
372 ## default cookie expiration time in seconds, set to `true` to set expire
373 ## default cookie expiration time in seconds, set to `true` to set expire
373 ## at browser close
374 ## at browser close
374 #beaker.session.cookie_expires = 3600
375 #beaker.session.cookie_expires = 3600
375
376
376 ###################################
377 ###################################
377 ## SEARCH INDEXING CONFIGURATION ##
378 ## SEARCH INDEXING CONFIGURATION ##
378 ###################################
379 ###################################
379 ## Full text search indexer is available in rhodecode-tools under
380 ## Full text search indexer is available in rhodecode-tools under
380 ## `rhodecode-tools index` command
381 ## `rhodecode-tools index` command
381
382
382 ## WHOOSH Backend, doesn't require additional services to run
383 ## WHOOSH Backend, doesn't require additional services to run
383 ## it works good with few dozen repos
384 ## it works good with few dozen repos
384 search.module = rhodecode.lib.index.whoosh
385 search.module = rhodecode.lib.index.whoosh
385 search.location = %(here)s/data/index
386 search.location = %(here)s/data/index
386
387
387 ########################################
388 ########################################
388 ### CHANNELSTREAM CONFIG ####
389 ### CHANNELSTREAM CONFIG ####
389 ########################################
390 ########################################
390 ## channelstream enables persistent connections and live notification
391 ## channelstream enables persistent connections and live notification
391 ## in the system. It's also used by the chat system
392 ## in the system. It's also used by the chat system
393
392 channelstream.enabled = false
394 channelstream.enabled = false
393
395
394 ## server address for channelstream server on the backend
396 ## server address for channelstream server on the backend
395 channelstream.server = 127.0.0.1:9800
397 channelstream.server = 127.0.0.1:9800
396
398
397 ## location of the channelstream server from outside world
399 ## location of the channelstream server from outside world
398 ## use ws:// for http or wss:// for https. This address needs to be handled
400 ## use ws:// for http or wss:// for https. This address needs to be handled
399 ## by external HTTP server such as Nginx or Apache
401 ## by external HTTP server such as Nginx or Apache
400 ## see nginx/apache configuration examples in our docs
402 ## see nginx/apache configuration examples in our docs
401 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
403 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
402 channelstream.secret = secret
404 channelstream.secret = secret
403 channelstream.history.location = %(here)s/channelstream_history
405 channelstream.history.location = %(here)s/channelstream_history
404
406
405 ## Internal application path that Javascript uses to connect into.
407 ## Internal application path that Javascript uses to connect into.
406 ## If you use proxy-prefix the prefix should be added before /_channelstream
408 ## If you use proxy-prefix the prefix should be added before /_channelstream
407 channelstream.proxy_path = /_channelstream
409 channelstream.proxy_path = /_channelstream
408
410
409
411
410 ###################################
412 ###################################
411 ## APPENLIGHT CONFIG ##
413 ## APPENLIGHT CONFIG ##
412 ###################################
414 ###################################
413
415
414 ## Appenlight is tailored to work with RhodeCode, see
416 ## Appenlight is tailored to work with RhodeCode, see
415 ## http://appenlight.com for details how to obtain an account
417 ## http://appenlight.com for details how to obtain an account
416
418
417 ## appenlight integration enabled
419 ## appenlight integration enabled
418 appenlight = false
420 appenlight = false
419
421
420 appenlight.server_url = https://api.appenlight.com
422 appenlight.server_url = https://api.appenlight.com
421 appenlight.api_key = YOUR_API_KEY
423 appenlight.api_key = YOUR_API_KEY
422 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
424 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
423
425
424 # used for JS client
426 # used for JS client
425 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
427 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
426
428
427 ## TWEAK AMOUNT OF INFO SENT HERE
429 ## TWEAK AMOUNT OF INFO SENT HERE
428
430
429 ## enables 404 error logging (default False)
431 ## enables 404 error logging (default False)
430 appenlight.report_404 = false
432 appenlight.report_404 = false
431
433
432 ## time in seconds after request is considered being slow (default 1)
434 ## time in seconds after request is considered being slow (default 1)
433 appenlight.slow_request_time = 1
435 appenlight.slow_request_time = 1
434
436
435 ## record slow requests in application
437 ## record slow requests in application
436 ## (needs to be enabled for slow datastore recording and time tracking)
438 ## (needs to be enabled for slow datastore recording and time tracking)
437 appenlight.slow_requests = true
439 appenlight.slow_requests = true
438
440
439 ## enable hooking to application loggers
441 ## enable hooking to application loggers
440 appenlight.logging = true
442 appenlight.logging = true
441
443
442 ## minimum log level for log capture
444 ## minimum log level for log capture
443 appenlight.logging.level = WARNING
445 appenlight.logging.level = WARNING
444
446
445 ## send logs only from erroneous/slow requests
447 ## send logs only from erroneous/slow requests
446 ## (saves API quota for intensive logging)
448 ## (saves API quota for intensive logging)
447 appenlight.logging_on_error = false
449 appenlight.logging_on_error = false
448
450
449 ## list of additonal keywords that should be grabbed from environ object
451 ## list of additonal keywords that should be grabbed from environ object
450 ## can be string with comma separated list of words in lowercase
452 ## can be string with comma separated list of words in lowercase
451 ## (by default client will always send following info:
453 ## (by default client will always send following info:
452 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
454 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
453 ## start with HTTP* this list be extended with additional keywords here
455 ## start with HTTP* this list be extended with additional keywords here
454 appenlight.environ_keys_whitelist =
456 appenlight.environ_keys_whitelist =
455
457
456 ## list of keywords that should be blanked from request object
458 ## list of keywords that should be blanked from request object
457 ## can be string with comma separated list of words in lowercase
459 ## can be string with comma separated list of words in lowercase
458 ## (by default client will always blank keys that contain following words
460 ## (by default client will always blank keys that contain following words
459 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
461 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
460 ## this list be extended with additional keywords set here
462 ## this list be extended with additional keywords set here
461 appenlight.request_keys_blacklist =
463 appenlight.request_keys_blacklist =
462
464
463 ## list of namespaces that should be ignores when gathering log entries
465 ## list of namespaces that should be ignores when gathering log entries
464 ## can be string with comma separated list of namespaces
466 ## can be string with comma separated list of namespaces
465 ## (by default the client ignores own entries: appenlight_client.client)
467 ## (by default the client ignores own entries: appenlight_client.client)
466 appenlight.log_namespace_blacklist =
468 appenlight.log_namespace_blacklist =
467
469
468
470
469 ################################################################################
470 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
471 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
472 ## execute malicious code after an exception is raised. ##
473 ################################################################################
474 set debug = false
475
476
477 ###########################################
471 ###########################################
478 ### MAIN RHODECODE DATABASE CONFIG ###
472 ### MAIN RHODECODE DATABASE CONFIG ###
479 ###########################################
473 ###########################################
480 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
474 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
481 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
475 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
482 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
476 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
483 # pymysql is an alternative driver for MySQL, use in case of problems with default one
477 # pymysql is an alternative driver for MySQL, use in case of problems with default one
484 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
478 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
485
479
486 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
480 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
487
481
488 # see sqlalchemy docs for other advanced settings
482 # see sqlalchemy docs for other advanced settings
489
483
490 ## print the sql statements to output
484 ## print the sql statements to output
491 sqlalchemy.db1.echo = false
485 sqlalchemy.db1.echo = false
492 ## recycle the connections after this amount of seconds
486 ## recycle the connections after this amount of seconds
493 sqlalchemy.db1.pool_recycle = 3600
487 sqlalchemy.db1.pool_recycle = 3600
494 sqlalchemy.db1.convert_unicode = true
488 sqlalchemy.db1.convert_unicode = true
495
489
496 ## the number of connections to keep open inside the connection pool.
490 ## the number of connections to keep open inside the connection pool.
497 ## 0 indicates no limit
491 ## 0 indicates no limit
498 #sqlalchemy.db1.pool_size = 5
492 #sqlalchemy.db1.pool_size = 5
499
493
500 ## the number of connections to allow in connection pool "overflow", that is
494 ## the number of connections to allow in connection pool "overflow", that is
501 ## connections that can be opened above and beyond the pool_size setting,
495 ## connections that can be opened above and beyond the pool_size setting,
502 ## which defaults to five.
496 ## which defaults to five.
503 #sqlalchemy.db1.max_overflow = 10
497 #sqlalchemy.db1.max_overflow = 10
504
498
505 ## Connection check ping, used to detect broken database connections
499 ## Connection check ping, used to detect broken database connections
506 ## could be enabled to better handle cases if MySQL has gone away errors
500 ## could be enabled to better handle cases if MySQL has gone away errors
507 #sqlalchemy.db1.ping_connection = true
501 #sqlalchemy.db1.ping_connection = true
508
502
509 ##################
503 ##################
510 ### VCS CONFIG ###
504 ### VCS CONFIG ###
511 ##################
505 ##################
512 vcs.server.enable = true
506 vcs.server.enable = true
513 vcs.server = localhost:9900
507 vcs.server = localhost:9900
514
508
515 ## Web server connectivity protocol, responsible for web based VCS operatations
509 ## Web server connectivity protocol, responsible for web based VCS operatations
516 ## Available protocols are:
510 ## Available protocols are:
517 ## `http` - use http-rpc backend (default)
511 ## `http` - use http-rpc backend (default)
518 vcs.server.protocol = http
512 vcs.server.protocol = http
519
513
520 ## Push/Pull operations protocol, available options are:
514 ## Push/Pull operations protocol, available options are:
521 ## `http` - use http-rpc backend (default)
515 ## `http` - use http-rpc backend (default)
522 vcs.scm_app_implementation = http
516 vcs.scm_app_implementation = http
523
517
524 ## Push/Pull operations hooks protocol, available options are:
518 ## Push/Pull operations hooks protocol, available options are:
525 ## `http` - use http-rpc backend (default)
519 ## `http` - use http-rpc backend (default)
526 vcs.hooks.protocol = http
520 vcs.hooks.protocol = http
521
527 ## Host on which this instance is listening for hooks. If vcsserver is in other location
522 ## Host on which this instance is listening for hooks. If vcsserver is in other location
528 ## this should be adjusted.
523 ## this should be adjusted.
529 vcs.hooks.host = 127.0.0.1
524 vcs.hooks.host = 127.0.0.1
530
525
531 vcs.server.log_level = info
526 vcs.server.log_level = info
532 ## Start VCSServer with this instance as a subprocess, useful for development
527 ## Start VCSServer with this instance as a subprocess, useful for development
533 vcs.start_server = false
528 vcs.start_server = false
534
529
535 ## List of enabled VCS backends, available options are:
530 ## List of enabled VCS backends, available options are:
536 ## `hg` - mercurial
531 ## `hg` - mercurial
537 ## `git` - git
532 ## `git` - git
538 ## `svn` - subversion
533 ## `svn` - subversion
539 vcs.backends = hg, git, svn
534 vcs.backends = hg, git, svn
540
535
541 vcs.connection_timeout = 3600
536 vcs.connection_timeout = 3600
542 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
537 ## Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
543 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
538 ## Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
544 #vcs.svn.compatible_version = pre-1.8-compatible
539 #vcs.svn.compatible_version = pre-1.8-compatible
545
540
546
541
547 ############################################################
542 ############################################################
548 ### Subversion proxy support (mod_dav_svn) ###
543 ### Subversion proxy support (mod_dav_svn) ###
549 ### Maps RhodeCode repo groups into SVN paths for Apache ###
544 ### Maps RhodeCode repo groups into SVN paths for Apache ###
550 ############################################################
545 ############################################################
551 ## Enable or disable the config file generation.
546 ## Enable or disable the config file generation.
552 svn.proxy.generate_config = false
547 svn.proxy.generate_config = false
553 ## Generate config file with `SVNListParentPath` set to `On`.
548 ## Generate config file with `SVNListParentPath` set to `On`.
554 svn.proxy.list_parent_path = true
549 svn.proxy.list_parent_path = true
555 ## Set location and file name of generated config file.
550 ## Set location and file name of generated config file.
556 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
551 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
557 ## alternative mod_dav config template. This needs to be a mako template
552 ## alternative mod_dav config template. This needs to be a mako template
558 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
553 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
559 ## Used as a prefix to the `Location` block in the generated config file.
554 ## Used as a prefix to the `Location` block in the generated config file.
560 ## In most cases it should be set to `/`.
555 ## In most cases it should be set to `/`.
561 svn.proxy.location_root = /
556 svn.proxy.location_root = /
562 ## Command to reload the mod dav svn configuration on change.
557 ## Command to reload the mod dav svn configuration on change.
563 ## Example: `/etc/init.d/apache2 reload`
558 ## Example: `/etc/init.d/apache2 reload`
564 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
559 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
565 ## If the timeout expires before the reload command finishes, the command will
560 ## If the timeout expires before the reload command finishes, the command will
566 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
561 ## be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
567 #svn.proxy.reload_timeout = 10
562 #svn.proxy.reload_timeout = 10
568
563
569 ############################################################
564 ############################################################
570 ### SSH Support Settings ###
565 ### SSH Support Settings ###
571 ############################################################
566 ############################################################
572
567
573 ## Defines if a custom authorized_keys file should be created and written on
568 ## Defines if a custom authorized_keys file should be created and written on
574 ## any change user ssh keys. Setting this to false also disables posibility
569 ## any change user ssh keys. Setting this to false also disables posibility
575 ## of adding SSH keys by users from web interface. Super admins can still
570 ## of adding SSH keys by users from web interface. Super admins can still
576 ## manage SSH Keys.
571 ## manage SSH Keys.
577 ssh.generate_authorized_keyfile = false
572 ssh.generate_authorized_keyfile = false
578
573
579 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
574 ## Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
580 # ssh.authorized_keys_ssh_opts =
575 # ssh.authorized_keys_ssh_opts =
581
576
582 ## Path to the authrozied_keys file where the generate entries are placed.
577 ## Path to the authrozied_keys file where the generate entries are placed.
583 ## It is possible to have multiple key files specified in `sshd_config` e.g.
578 ## It is possible to have multiple key files specified in `sshd_config` e.g.
584 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
579 ## AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
585 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
580 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
586
581
587 ## Command to execute the SSH wrapper. The binary is available in the
582 ## Command to execute the SSH wrapper. The binary is available in the
588 ## rhodecode installation directory.
583 ## rhodecode installation directory.
589 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
584 ## e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
590 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
585 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
591
586
592 ## Allow shell when executing the ssh-wrapper command
587 ## Allow shell when executing the ssh-wrapper command
593 ssh.wrapper_cmd_allow_shell = false
588 ssh.wrapper_cmd_allow_shell = false
594
589
595 ## Enables logging, and detailed output send back to the client during SSH
590 ## Enables logging, and detailed output send back to the client during SSH
596 ## operations. Usefull for debugging, shouldn't be used in production.
591 ## operations. Usefull for debugging, shouldn't be used in production.
597 ssh.enable_debug_logging = false
592 ssh.enable_debug_logging = false
598
593
599 ## Paths to binary executable, by default they are the names, but we can
594 ## Paths to binary executable, by default they are the names, but we can
600 ## override them if we want to use a custom one
595 ## override them if we want to use a custom one
601 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
596 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
602 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
597 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
603 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
598 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
604
599
605
600
606 ## Dummy marker to add new entries after.
601 ## Dummy marker to add new entries after.
607 ## Add any custom entries below. Please don't remove.
602 ## Add any custom entries below. Please don't remove.
608 custom.conf = 1
603 custom.conf = 1
609
604
610
605
611 ################################
606 ################################
612 ### LOGGING CONFIGURATION ####
607 ### LOGGING CONFIGURATION ####
613 ################################
608 ################################
614 [loggers]
609 [loggers]
615 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
610 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
616
611
617 [handlers]
612 [handlers]
618 keys = console, console_sql
613 keys = console, console_sql
619
614
620 [formatters]
615 [formatters]
621 keys = generic, color_formatter, color_formatter_sql
616 keys = generic, color_formatter, color_formatter_sql
622
617
623 #############
618 #############
624 ## LOGGERS ##
619 ## LOGGERS ##
625 #############
620 #############
626 [logger_root]
621 [logger_root]
627 level = NOTSET
622 level = NOTSET
628 handlers = console
623 handlers = console
629
624
630 [logger_sqlalchemy]
625 [logger_sqlalchemy]
631 level = INFO
626 level = INFO
632 handlers = console_sql
627 handlers = console_sql
633 qualname = sqlalchemy.engine
628 qualname = sqlalchemy.engine
634 propagate = 0
629 propagate = 0
635
630
636 [logger_beaker]
631 [logger_beaker]
637 level = DEBUG
632 level = DEBUG
638 handlers =
633 handlers =
639 qualname = beaker.container
634 qualname = beaker.container
640 propagate = 1
635 propagate = 1
641
636
642 [logger_rhodecode]
637 [logger_rhodecode]
643 level = DEBUG
638 level = DEBUG
644 handlers =
639 handlers =
645 qualname = rhodecode
640 qualname = rhodecode
646 propagate = 1
641 propagate = 1
647
642
648 [logger_ssh_wrapper]
643 [logger_ssh_wrapper]
649 level = DEBUG
644 level = DEBUG
650 handlers =
645 handlers =
651 qualname = ssh_wrapper
646 qualname = ssh_wrapper
652 propagate = 1
647 propagate = 1
653
648
654 [logger_celery]
649 [logger_celery]
655 level = DEBUG
650 level = DEBUG
656 handlers =
651 handlers =
657 qualname = celery
652 qualname = celery
658
653
659
654
660 ##############
655 ##############
661 ## HANDLERS ##
656 ## HANDLERS ##
662 ##############
657 ##############
663
658
664 [handler_console]
659 [handler_console]
665 class = StreamHandler
660 class = StreamHandler
666 args = (sys.stderr, )
661 args = (sys.stderr, )
667 level = INFO
662 level = INFO
668 formatter = generic
663 formatter = generic
669
664
670 [handler_console_sql]
665 [handler_console_sql]
671 # "level = DEBUG" logs SQL queries and results.
666 # "level = DEBUG" logs SQL queries and results.
672 # "level = INFO" logs SQL queries.
667 # "level = INFO" logs SQL queries.
673 # "level = WARN" logs neither. (Recommended for production systems.)
668 # "level = WARN" logs neither. (Recommended for production systems.)
674 class = StreamHandler
669 class = StreamHandler
675 args = (sys.stderr, )
670 args = (sys.stderr, )
676 level = WARN
671 level = WARN
677 formatter = generic
672 formatter = generic
678
673
679 ################
674 ################
680 ## FORMATTERS ##
675 ## FORMATTERS ##
681 ################
676 ################
682
677
683 [formatter_generic]
678 [formatter_generic]
684 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
679 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
685 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
680 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
686 datefmt = %Y-%m-%d %H:%M:%S
681 datefmt = %Y-%m-%d %H:%M:%S
687
682
688 [formatter_color_formatter]
683 [formatter_color_formatter]
689 class = rhodecode.lib.logging_formatter.ColorFormatter
684 class = rhodecode.lib.logging_formatter.ColorFormatter
690 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
685 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
691 datefmt = %Y-%m-%d %H:%M:%S
686 datefmt = %Y-%m-%d %H:%M:%S
692
687
693 [formatter_color_formatter_sql]
688 [formatter_color_formatter_sql]
694 class = rhodecode.lib.logging_formatter.ColorFormatterSql
689 class = rhodecode.lib.logging_formatter.ColorFormatterSql
695 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
690 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
696 datefmt = %Y-%m-%d %H:%M:%S
691 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,112 +1,148 b''
1 .. _debug-mode:
1 .. _debug-mode:
2
2
3 Enabling Debug Mode
3 Enabling Debug Mode
4 -------------------
4 -------------------
5
5
6 Debug Mode will enable debug logging, and request tracking middleware. Debug Mode
7 enabled DEBUG log-level which allows tracking various information about authentication
8 failures, LDAP connection, email etc.
9
10 The request tracking will add a special
11 unique ID: `| req_id:00000000-0000-0000-0000-000000000000` at the end of each log line.
12 The req_id is the same for each individual requests, it means that if you want to
13 track particular user logs only, and exclude other concurrent ones
14 simply grep by `req_id` uuid which you'll have to find for the individual request.
15
6 To enable debug mode on a |RCE| instance you need to set the debug property
16 To enable debug mode on a |RCE| instance you need to set the debug property
7 in the :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file. To
17 in the :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file. To
8 do this, use the following steps
18 do this, use the following steps
9
19
10 1. Open the file and set the ``debug`` line to ``true``
20 1. Open the file and set the ``debug`` line to ``true``
11 2. Restart you instance using the ``rccontrol restart`` command,
21 2. Restart you instance using the ``rccontrol restart`` command,
12 see the following example:
22 see the following example:
13
23
14 You can also set the log level, the follow are the valid options;
15 ``debug``, ``info``, ``warning``, or ``fatal``.
16
17 .. code-block:: ini
24 .. code-block:: ini
18
25
19 [DEFAULT]
26 [DEFAULT]
20 debug = true
27 debug = true
21 pdebug = false
22
28
23 .. code-block:: bash
29 .. code-block:: bash
24
30
25 # Restart your instance
31 # Restart your instance
26 $ rccontrol restart enterprise-1
32 $ rccontrol restart enterprise-1
27 Instance "enterprise-1" successfully stopped.
33 Instance "enterprise-1" successfully stopped.
28 Instance "enterprise-1" successfully started.
34 Instance "enterprise-1" successfully started.
29
35
36
30 Debug and Logging Configuration
37 Debug and Logging Configuration
31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
38 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
32
39
33 Further debugging and logging settings can also be set in the
40 Further debugging and logging settings can also be set in the
34 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
41 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
35
42
36 In the logging section, the various packages that run with |RCE| can have
43 In the logging section, the various packages that run with |RCE| can have
37 different debug levels set. If you want to increase the logging level change
44 different debug levels set. If you want to increase the logging level change
38 ``level = DEBUG`` line to one of the valid options.
45 ``level = DEBUG`` line to one of the valid options.
39
46
40 You also need to change the log level for handlers. See the example
47 You also need to change the log level for handlers. See the example
41 ``##handler`` section below. The ``handler`` level takes the same options as
48 ``##handler`` section below. The ``handler`` level takes the same options as
42 the ``debug`` level.
49 the ``debug`` level.
43
50
44 .. code-block:: ini
51 .. code-block:: ini
45
52
46 ################################
53 ################################
47 ### LOGGING CONFIGURATION ####
54 ### LOGGING CONFIGURATION ####
48 ################################
55 ################################
49 [loggers]
56 [loggers]
50 keys = root, sqlalchemy, rhodecode, ssh_wrapper
57 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
51
58
52 [handlers]
59 [handlers]
53 keys = console, console_sql, file, file_rotating
60 keys = console, console_sql, file, file_rotating
54
61
55 [formatters]
62 [formatters]
56 keys = generic, color_formatter, color_formatter_sql
63 keys = generic, color_formatter, color_formatter_sql
57
64
58 #############
65 #############
59 ## LOGGERS ##
66 ## LOGGERS ##
60 #############
67 #############
61 [logger_root]
68 [logger_root]
62 level = NOTSET
69 level = NOTSET
63 handlers = console
70 handlers = console
64
71
65 [logger_routes]
72 [logger_sqlalchemy]
73 level = INFO
74 handlers = console_sql
75 qualname = sqlalchemy.engine
76 propagate = 0
77
78 [logger_beaker]
66 level = DEBUG
79 level = DEBUG
67 handlers =
80 handlers =
68 qualname = routes.middleware
81 qualname = beaker.container
69 ## "level = DEBUG" logs the route matched and routing variables.
70 propagate = 1
82 propagate = 1
71
83
72 [logger_rhodecode]
84 [logger_rhodecode]
73 level = DEBUG
85 level = DEBUG
74 handlers =
86 handlers =
75 qualname = rhodecode
87 qualname = rhodecode
76 propagate = 1
88 propagate = 1
77
89
78 [logger_sqlalchemy]
90 [logger_ssh_wrapper]
79 level = INFO
91 level = DEBUG
80 handlers = console_sql
92 handlers =
81 qualname = sqlalchemy.engine
93 qualname = ssh_wrapper
82 propagate = 0
94 propagate = 1
95
96 [logger_celery]
97 level = DEBUG
98 handlers =
99 qualname = celery
83
100
84 ##############
101 ##############
85 ## HANDLERS ##
102 ## HANDLERS ##
86 ##############
103 ##############
87
104
88 [handler_console]
105 [handler_console]
89 class = StreamHandler
106 class = StreamHandler
90 args = (sys.stderr,)
107 args = (sys.stderr, )
91 level = INFO
108 level = DEBUG
92 formatter = generic
109 formatter = generic
93
110
94 [handler_console_sql]
111 [handler_console_sql]
95 class = StreamHandler
112 class = StreamHandler
96 args = (sys.stderr,)
113 args = (sys.stderr, )
97 level = WARN
114 level = INFO
98 formatter = generic
115 formatter = generic
99
116
100 [handler_file]
117 [handler_file]
101 class = FileHandler
118 class = FileHandler
102 args = ('rhodecode.log', 'a',)
119 args = ('rhodecode_debug.log', 'a',)
103 level = INFO
120 level = INFO
104 formatter = generic
121 formatter = generic
105
122
106 [handler_file_rotating]
123 [handler_file_rotating]
107 class = logging.handlers.TimedRotatingFileHandler
124 class = logging.handlers.TimedRotatingFileHandler
108 # 'D', 5 - rotate every 5days
125 # 'D', 5 - rotate every 5days
109 # you can set 'h', 'midnight'
126 # you can set 'h', 'midnight'
110 args = ('rhodecode.log', 'D', 5, 10,)
127 args = ('rhodecode_debug_rotated.log', 'D', 5, 10,)
111 level = INFO
128 level = INFO
112 formatter = generic
129 formatter = generic
130
131 ################
132 ## FORMATTERS ##
133 ################
134
135 [formatter_generic]
136 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
137 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
138 datefmt = %Y-%m-%d %H:%M:%S
139
140 [formatter_color_formatter]
141 class = rhodecode.lib.logging_formatter.ColorFormatter
142 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
143 datefmt = %Y-%m-%d %H:%M:%S
144
145 [formatter_color_formatter_sql]
146 class = rhodecode.lib.logging_formatter.ColorFormatterSql
147 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
148 datefmt = %Y-%m-%d %H:%M:%S No newline at end of file
@@ -1,614 +1,727 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import os
21 import os
22 import sys
22 import sys
23 import logging
23 import logging
24 import collections
24 import collections
25 import tempfile
25 import tempfile
26 import time
26 import time
27
27
28 from paste.gzipper import make_gzip_middleware
28 from paste.gzipper import make_gzip_middleware
29 import pyramid.events
29 import pyramid.events
30 from pyramid.wsgi import wsgiapp
30 from pyramid.wsgi import wsgiapp
31 from pyramid.authorization import ACLAuthorizationPolicy
31 from pyramid.authorization import ACLAuthorizationPolicy
32 from pyramid.config import Configurator
32 from pyramid.config import Configurator
33 from pyramid.settings import asbool, aslist
33 from pyramid.settings import asbool, aslist
34 from pyramid.httpexceptions import (
34 from pyramid.httpexceptions import (
35 HTTPException, HTTPError, HTTPInternalServerError, HTTPFound, HTTPNotFound)
35 HTTPException, HTTPError, HTTPInternalServerError, HTTPFound, HTTPNotFound)
36 from pyramid.renderers import render_to_response
36 from pyramid.renderers import render_to_response
37
37
38 from rhodecode.model import meta
38 from rhodecode.model import meta
39 from rhodecode.config import patches
39 from rhodecode.config import patches
40 from rhodecode.config import utils as config_utils
40 from rhodecode.config import utils as config_utils
41 from rhodecode.config.environment import load_pyramid_environment
41 from rhodecode.config.environment import load_pyramid_environment
42
42
43 import rhodecode.events
43 import rhodecode.events
44 from rhodecode.lib.middleware.vcs import VCSMiddleware
44 from rhodecode.lib.middleware.vcs import VCSMiddleware
45 from rhodecode.lib.request import Request
45 from rhodecode.lib.request import Request
46 from rhodecode.lib.vcs import VCSCommunicationError
46 from rhodecode.lib.vcs import VCSCommunicationError
47 from rhodecode.lib.exceptions import VCSServerUnavailable
47 from rhodecode.lib.exceptions import VCSServerUnavailable
48 from rhodecode.lib.middleware.appenlight import wrap_in_appenlight_if_enabled
48 from rhodecode.lib.middleware.appenlight import wrap_in_appenlight_if_enabled
49 from rhodecode.lib.middleware.https_fixup import HttpsFixup
49 from rhodecode.lib.middleware.https_fixup import HttpsFixup
50 from rhodecode.lib.celerylib.loader import configure_celery
50 from rhodecode.lib.celerylib.loader import configure_celery
51 from rhodecode.lib.plugins.utils import register_rhodecode_plugin
51 from rhodecode.lib.plugins.utils import register_rhodecode_plugin
52 from rhodecode.lib.utils2 import aslist as rhodecode_aslist, AttributeDict
52 from rhodecode.lib.utils2 import aslist as rhodecode_aslist, AttributeDict
53 from rhodecode.lib.exc_tracking import store_exception
53 from rhodecode.lib.exc_tracking import store_exception
54 from rhodecode.subscribers import (
54 from rhodecode.subscribers import (
55 scan_repositories_if_enabled, write_js_routes_if_enabled,
55 scan_repositories_if_enabled, write_js_routes_if_enabled,
56 write_metadata_if_needed, inject_app_settings)
56 write_metadata_if_needed, inject_app_settings)
57
57
58
58
59 log = logging.getLogger(__name__)
59 log = logging.getLogger(__name__)
60
60
61
61
62 def is_http_error(response):
62 def is_http_error(response):
63 # error which should have traceback
63 # error which should have traceback
64 return response.status_code > 499
64 return response.status_code > 499
65
65
66
66
67 def should_load_all():
67 def should_load_all():
68 """
68 """
69 Returns if all application components should be loaded. In some cases it's
69 Returns if all application components should be loaded. In some cases it's
70 desired to skip apps loading for faster shell script execution
70 desired to skip apps loading for faster shell script execution
71 """
71 """
72 return True
72 return True
73
73
74
74
75 def make_pyramid_app(global_config, **settings):
75 def make_pyramid_app(global_config, **settings):
76 """
76 """
77 Constructs the WSGI application based on Pyramid.
77 Constructs the WSGI application based on Pyramid.
78
78
79 Specials:
79 Specials:
80
80
81 * The application can also be integrated like a plugin via the call to
81 * The application can also be integrated like a plugin via the call to
82 `includeme`. This is accompanied with the other utility functions which
82 `includeme`. This is accompanied with the other utility functions which
83 are called. Changing this should be done with great care to not break
83 are called. Changing this should be done with great care to not break
84 cases when these fragments are assembled from another place.
84 cases when these fragments are assembled from another place.
85
85
86 """
86 """
87
87
88 # Allows to use format style "{ENV_NAME}" placeholders in the configuration. It
88 # Allows to use format style "{ENV_NAME}" placeholders in the configuration. It
89 # will be replaced by the value of the environment variable "NAME" in this case.
89 # will be replaced by the value of the environment variable "NAME" in this case.
90 start_time = time.time()
90 start_time = time.time()
91
91
92 debug = asbool(global_config.get('debug'))
93 if debug:
94 enable_debug()
95
92 environ = {'ENV_{}'.format(key): value for key, value in os.environ.items()}
96 environ = {'ENV_{}'.format(key): value for key, value in os.environ.items()}
93
97
94 global_config = _substitute_values(global_config, environ)
98 global_config = _substitute_values(global_config, environ)
95 settings = _substitute_values(settings, environ)
99 settings = _substitute_values(settings, environ)
96
100
97 sanitize_settings_and_apply_defaults(settings)
101 sanitize_settings_and_apply_defaults(settings)
98
102
99 config = Configurator(settings=settings)
103 config = Configurator(settings=settings)
100
104
101 # Apply compatibility patches
105 # Apply compatibility patches
102 patches.inspect_getargspec()
106 patches.inspect_getargspec()
103
107
104 load_pyramid_environment(global_config, settings)
108 load_pyramid_environment(global_config, settings)
105
109
106 # Static file view comes first
110 # Static file view comes first
107 includeme_first(config)
111 includeme_first(config)
108
112
109 includeme(config)
113 includeme(config)
110
114
111 pyramid_app = config.make_wsgi_app()
115 pyramid_app = config.make_wsgi_app()
112 pyramid_app = wrap_app_in_wsgi_middlewares(pyramid_app, config)
116 pyramid_app = wrap_app_in_wsgi_middlewares(pyramid_app, config)
113 pyramid_app.config = config
117 pyramid_app.config = config
114
118
115 config.configure_celery(global_config['__file__'])
119 config.configure_celery(global_config['__file__'])
116 # creating the app uses a connection - return it after we are done
120 # creating the app uses a connection - return it after we are done
117 meta.Session.remove()
121 meta.Session.remove()
118 total_time = time.time() - start_time
122 total_time = time.time() - start_time
119 log.info('Pyramid app `%s` created and configured in %.2fs',
123 log.info('Pyramid app `%s` created and configured in %.2fs',
120 pyramid_app.func_name, total_time)
124 pyramid_app.func_name, total_time)
125
121 return pyramid_app
126 return pyramid_app
122
127
123
128
124 def not_found_view(request):
129 def not_found_view(request):
125 """
130 """
126 This creates the view which should be registered as not-found-view to
131 This creates the view which should be registered as not-found-view to
127 pyramid.
132 pyramid.
128 """
133 """
129
134
130 if not getattr(request, 'vcs_call', None):
135 if not getattr(request, 'vcs_call', None):
131 # handle like regular case with our error_handler
136 # handle like regular case with our error_handler
132 return error_handler(HTTPNotFound(), request)
137 return error_handler(HTTPNotFound(), request)
133
138
134 # handle not found view as a vcs call
139 # handle not found view as a vcs call
135 settings = request.registry.settings
140 settings = request.registry.settings
136 ae_client = getattr(request, 'ae_client', None)
141 ae_client = getattr(request, 'ae_client', None)
137 vcs_app = VCSMiddleware(
142 vcs_app = VCSMiddleware(
138 HTTPNotFound(), request.registry, settings,
143 HTTPNotFound(), request.registry, settings,
139 appenlight_client=ae_client)
144 appenlight_client=ae_client)
140
145
141 return wsgiapp(vcs_app)(None, request)
146 return wsgiapp(vcs_app)(None, request)
142
147
143
148
144 def error_handler(exception, request):
149 def error_handler(exception, request):
145 import rhodecode
150 import rhodecode
146 from rhodecode.lib import helpers
151 from rhodecode.lib import helpers
147
152
148 rhodecode_title = rhodecode.CONFIG.get('rhodecode_title') or 'RhodeCode'
153 rhodecode_title = rhodecode.CONFIG.get('rhodecode_title') or 'RhodeCode'
149
154
150 base_response = HTTPInternalServerError()
155 base_response = HTTPInternalServerError()
151 # prefer original exception for the response since it may have headers set
156 # prefer original exception for the response since it may have headers set
152 if isinstance(exception, HTTPException):
157 if isinstance(exception, HTTPException):
153 base_response = exception
158 base_response = exception
154 elif isinstance(exception, VCSCommunicationError):
159 elif isinstance(exception, VCSCommunicationError):
155 base_response = VCSServerUnavailable()
160 base_response = VCSServerUnavailable()
156
161
157 if is_http_error(base_response):
162 if is_http_error(base_response):
158 log.exception(
163 log.exception(
159 'error occurred handling this request for path: %s', request.path)
164 'error occurred handling this request for path: %s', request.path)
160
165
161 error_explanation = base_response.explanation or str(base_response)
166 error_explanation = base_response.explanation or str(base_response)
162 if base_response.status_code == 404:
167 if base_response.status_code == 404:
163 error_explanation += " Or you don't have permission to access it."
168 error_explanation += " Or you don't have permission to access it."
164 c = AttributeDict()
169 c = AttributeDict()
165 c.error_message = base_response.status
170 c.error_message = base_response.status
166 c.error_explanation = error_explanation
171 c.error_explanation = error_explanation
167 c.visual = AttributeDict()
172 c.visual = AttributeDict()
168
173
169 c.visual.rhodecode_support_url = (
174 c.visual.rhodecode_support_url = (
170 request.registry.settings.get('rhodecode_support_url') or
175 request.registry.settings.get('rhodecode_support_url') or
171 request.route_url('rhodecode_support')
176 request.route_url('rhodecode_support')
172 )
177 )
173 c.redirect_time = 0
178 c.redirect_time = 0
174 c.rhodecode_name = rhodecode_title
179 c.rhodecode_name = rhodecode_title
175 if not c.rhodecode_name:
180 if not c.rhodecode_name:
176 c.rhodecode_name = 'Rhodecode'
181 c.rhodecode_name = 'Rhodecode'
177
182
178 c.causes = []
183 c.causes = []
179 if is_http_error(base_response):
184 if is_http_error(base_response):
180 c.causes.append('Server is overloaded.')
185 c.causes.append('Server is overloaded.')
181 c.causes.append('Server database connection is lost.')
186 c.causes.append('Server database connection is lost.')
182 c.causes.append('Server expected unhandled error.')
187 c.causes.append('Server expected unhandled error.')
183
188
184 if hasattr(base_response, 'causes'):
189 if hasattr(base_response, 'causes'):
185 c.causes = base_response.causes
190 c.causes = base_response.causes
186
191
187 c.messages = helpers.flash.pop_messages(request=request)
192 c.messages = helpers.flash.pop_messages(request=request)
188
193
189 exc_info = sys.exc_info()
194 exc_info = sys.exc_info()
190 c.exception_id = id(exc_info)
195 c.exception_id = id(exc_info)
191 c.show_exception_id = isinstance(base_response, VCSServerUnavailable) \
196 c.show_exception_id = isinstance(base_response, VCSServerUnavailable) \
192 or base_response.status_code > 499
197 or base_response.status_code > 499
193 c.exception_id_url = request.route_url(
198 c.exception_id_url = request.route_url(
194 'admin_settings_exception_tracker_show', exception_id=c.exception_id)
199 'admin_settings_exception_tracker_show', exception_id=c.exception_id)
195
200
196 if c.show_exception_id:
201 if c.show_exception_id:
197 store_exception(c.exception_id, exc_info)
202 store_exception(c.exception_id, exc_info)
198
203
199 response = render_to_response(
204 response = render_to_response(
200 '/errors/error_document.mako', {'c': c, 'h': helpers}, request=request,
205 '/errors/error_document.mako', {'c': c, 'h': helpers}, request=request,
201 response=base_response)
206 response=base_response)
202
207
203 return response
208 return response
204
209
205
210
206 def includeme_first(config):
211 def includeme_first(config):
207 # redirect automatic browser favicon.ico requests to correct place
212 # redirect automatic browser favicon.ico requests to correct place
208 def favicon_redirect(context, request):
213 def favicon_redirect(context, request):
209 return HTTPFound(
214 return HTTPFound(
210 request.static_path('rhodecode:public/images/favicon.ico'))
215 request.static_path('rhodecode:public/images/favicon.ico'))
211
216
212 config.add_view(favicon_redirect, route_name='favicon')
217 config.add_view(favicon_redirect, route_name='favicon')
213 config.add_route('favicon', '/favicon.ico')
218 config.add_route('favicon', '/favicon.ico')
214
219
215 def robots_redirect(context, request):
220 def robots_redirect(context, request):
216 return HTTPFound(
221 return HTTPFound(
217 request.static_path('rhodecode:public/robots.txt'))
222 request.static_path('rhodecode:public/robots.txt'))
218
223
219 config.add_view(robots_redirect, route_name='robots')
224 config.add_view(robots_redirect, route_name='robots')
220 config.add_route('robots', '/robots.txt')
225 config.add_route('robots', '/robots.txt')
221
226
222 config.add_static_view(
227 config.add_static_view(
223 '_static/deform', 'deform:static')
228 '_static/deform', 'deform:static')
224 config.add_static_view(
229 config.add_static_view(
225 '_static/rhodecode', path='rhodecode:public', cache_max_age=3600 * 24)
230 '_static/rhodecode', path='rhodecode:public', cache_max_age=3600 * 24)
226
231
227
232
228 def includeme(config):
233 def includeme(config):
229 log.debug('Initializing main includeme from %s', os.path.basename(__file__))
234 log.debug('Initializing main includeme from %s', os.path.basename(__file__))
230 settings = config.registry.settings
235 settings = config.registry.settings
231 config.set_request_factory(Request)
236 config.set_request_factory(Request)
232
237
233 # plugin information
238 # plugin information
234 config.registry.rhodecode_plugins = collections.OrderedDict()
239 config.registry.rhodecode_plugins = collections.OrderedDict()
235
240
236 config.add_directive(
241 config.add_directive(
237 'register_rhodecode_plugin', register_rhodecode_plugin)
242 'register_rhodecode_plugin', register_rhodecode_plugin)
238
243
239 config.add_directive('configure_celery', configure_celery)
244 config.add_directive('configure_celery', configure_celery)
240
245
241 if asbool(settings.get('appenlight', 'false')):
246 if asbool(settings.get('appenlight', 'false')):
242 config.include('appenlight_client.ext.pyramid_tween')
247 config.include('appenlight_client.ext.pyramid_tween')
243
248
244 load_all = should_load_all()
249 load_all = should_load_all()
245
250
246 # Includes which are required. The application would fail without them.
251 # Includes which are required. The application would fail without them.
247 config.include('pyramid_mako')
252 config.include('pyramid_mako')
248 config.include('pyramid_beaker')
253 config.include('pyramid_beaker')
249 config.include('rhodecode.lib.rc_cache')
254 config.include('rhodecode.lib.rc_cache')
250
255
251 config.include('rhodecode.apps._base.navigation')
256 config.include('rhodecode.apps._base.navigation')
252 config.include('rhodecode.apps._base.subscribers')
257 config.include('rhodecode.apps._base.subscribers')
253 config.include('rhodecode.tweens')
258 config.include('rhodecode.tweens')
254
259
255 config.include('rhodecode.integrations')
260 config.include('rhodecode.integrations')
256 config.include('rhodecode.authentication')
261 config.include('rhodecode.authentication')
257
262
258 if load_all:
263 if load_all:
259 from rhodecode.authentication import discover_legacy_plugins
264 from rhodecode.authentication import discover_legacy_plugins
260 # load CE authentication plugins
265 # load CE authentication plugins
261 config.include('rhodecode.authentication.plugins.auth_crowd')
266 config.include('rhodecode.authentication.plugins.auth_crowd')
262 config.include('rhodecode.authentication.plugins.auth_headers')
267 config.include('rhodecode.authentication.plugins.auth_headers')
263 config.include('rhodecode.authentication.plugins.auth_jasig_cas')
268 config.include('rhodecode.authentication.plugins.auth_jasig_cas')
264 config.include('rhodecode.authentication.plugins.auth_ldap')
269 config.include('rhodecode.authentication.plugins.auth_ldap')
265 config.include('rhodecode.authentication.plugins.auth_pam')
270 config.include('rhodecode.authentication.plugins.auth_pam')
266 config.include('rhodecode.authentication.plugins.auth_rhodecode')
271 config.include('rhodecode.authentication.plugins.auth_rhodecode')
267 config.include('rhodecode.authentication.plugins.auth_token')
272 config.include('rhodecode.authentication.plugins.auth_token')
268
273
269 # Auto discover authentication plugins and include their configuration.
274 # Auto discover authentication plugins and include their configuration.
270 discover_legacy_plugins(config)
275 discover_legacy_plugins(config)
271
276
272 # apps
277 # apps
273 config.include('rhodecode.apps._base')
278 config.include('rhodecode.apps._base')
274
279
275 if load_all:
280 if load_all:
276 config.include('rhodecode.apps.ops')
281 config.include('rhodecode.apps.ops')
277 config.include('rhodecode.apps.admin')
282 config.include('rhodecode.apps.admin')
278 config.include('rhodecode.apps.channelstream')
283 config.include('rhodecode.apps.channelstream')
279 config.include('rhodecode.apps.login')
284 config.include('rhodecode.apps.login')
280 config.include('rhodecode.apps.home')
285 config.include('rhodecode.apps.home')
281 config.include('rhodecode.apps.journal')
286 config.include('rhodecode.apps.journal')
282 config.include('rhodecode.apps.repository')
287 config.include('rhodecode.apps.repository')
283 config.include('rhodecode.apps.repo_group')
288 config.include('rhodecode.apps.repo_group')
284 config.include('rhodecode.apps.user_group')
289 config.include('rhodecode.apps.user_group')
285 config.include('rhodecode.apps.search')
290 config.include('rhodecode.apps.search')
286 config.include('rhodecode.apps.user_profile')
291 config.include('rhodecode.apps.user_profile')
287 config.include('rhodecode.apps.user_group_profile')
292 config.include('rhodecode.apps.user_group_profile')
288 config.include('rhodecode.apps.my_account')
293 config.include('rhodecode.apps.my_account')
289 config.include('rhodecode.apps.svn_support')
294 config.include('rhodecode.apps.svn_support')
290 config.include('rhodecode.apps.ssh_support')
295 config.include('rhodecode.apps.ssh_support')
291 config.include('rhodecode.apps.gist')
296 config.include('rhodecode.apps.gist')
292 config.include('rhodecode.apps.debug_style')
297 config.include('rhodecode.apps.debug_style')
293 config.include('rhodecode.api')
298 config.include('rhodecode.api')
294
299
295 config.add_route('rhodecode_support', 'https://rhodecode.com/help/', static=True)
300 config.add_route('rhodecode_support', 'https://rhodecode.com/help/', static=True)
296 config.add_translation_dirs('rhodecode:i18n/')
301 config.add_translation_dirs('rhodecode:i18n/')
297 settings['default_locale_name'] = settings.get('lang', 'en')
302 settings['default_locale_name'] = settings.get('lang', 'en')
298
303
299 # Add subscribers.
304 # Add subscribers.
300 config.add_subscriber(inject_app_settings,
305 config.add_subscriber(inject_app_settings,
301 pyramid.events.ApplicationCreated)
306 pyramid.events.ApplicationCreated)
302 config.add_subscriber(scan_repositories_if_enabled,
307 config.add_subscriber(scan_repositories_if_enabled,
303 pyramid.events.ApplicationCreated)
308 pyramid.events.ApplicationCreated)
304 config.add_subscriber(write_metadata_if_needed,
309 config.add_subscriber(write_metadata_if_needed,
305 pyramid.events.ApplicationCreated)
310 pyramid.events.ApplicationCreated)
306 config.add_subscriber(write_js_routes_if_enabled,
311 config.add_subscriber(write_js_routes_if_enabled,
307 pyramid.events.ApplicationCreated)
312 pyramid.events.ApplicationCreated)
308
313
309 # request custom methods
314 # request custom methods
310 config.add_request_method(
315 config.add_request_method(
311 'rhodecode.lib.partial_renderer.get_partial_renderer',
316 'rhodecode.lib.partial_renderer.get_partial_renderer',
312 'get_partial_renderer')
317 'get_partial_renderer')
313
318
314 # Set the authorization policy.
319 # Set the authorization policy.
315 authz_policy = ACLAuthorizationPolicy()
320 authz_policy = ACLAuthorizationPolicy()
316 config.set_authorization_policy(authz_policy)
321 config.set_authorization_policy(authz_policy)
317
322
318 # Set the default renderer for HTML templates to mako.
323 # Set the default renderer for HTML templates to mako.
319 config.add_mako_renderer('.html')
324 config.add_mako_renderer('.html')
320
325
321 config.add_renderer(
326 config.add_renderer(
322 name='json_ext',
327 name='json_ext',
323 factory='rhodecode.lib.ext_json_renderer.pyramid_ext_json')
328 factory='rhodecode.lib.ext_json_renderer.pyramid_ext_json')
324
329
325 # include RhodeCode plugins
330 # include RhodeCode plugins
326 includes = aslist(settings.get('rhodecode.includes', []))
331 includes = aslist(settings.get('rhodecode.includes', []))
327 for inc in includes:
332 for inc in includes:
328 config.include(inc)
333 config.include(inc)
329
334
330 # custom not found view, if our pyramid app doesn't know how to handle
335 # custom not found view, if our pyramid app doesn't know how to handle
331 # the request pass it to potential VCS handling ap
336 # the request pass it to potential VCS handling ap
332 config.add_notfound_view(not_found_view)
337 config.add_notfound_view(not_found_view)
333 if not settings.get('debugtoolbar.enabled', False):
338 if not settings.get('debugtoolbar.enabled', False):
334 # disabled debugtoolbar handle all exceptions via the error_handlers
339 # disabled debugtoolbar handle all exceptions via the error_handlers
335 config.add_view(error_handler, context=Exception)
340 config.add_view(error_handler, context=Exception)
336
341
337 # all errors including 403/404/50X
342 # all errors including 403/404/50X
338 config.add_view(error_handler, context=HTTPError)
343 config.add_view(error_handler, context=HTTPError)
339
344
340
345
341 def wrap_app_in_wsgi_middlewares(pyramid_app, config):
346 def wrap_app_in_wsgi_middlewares(pyramid_app, config):
342 """
347 """
343 Apply outer WSGI middlewares around the application.
348 Apply outer WSGI middlewares around the application.
344 """
349 """
345 registry = config.registry
350 registry = config.registry
346 settings = registry.settings
351 settings = registry.settings
347
352
348 # enable https redirects based on HTTP_X_URL_SCHEME set by proxy
353 # enable https redirects based on HTTP_X_URL_SCHEME set by proxy
349 pyramid_app = HttpsFixup(pyramid_app, settings)
354 pyramid_app = HttpsFixup(pyramid_app, settings)
350
355
351 pyramid_app, _ae_client = wrap_in_appenlight_if_enabled(
356 pyramid_app, _ae_client = wrap_in_appenlight_if_enabled(
352 pyramid_app, settings)
357 pyramid_app, settings)
353 registry.ae_client = _ae_client
358 registry.ae_client = _ae_client
354
359
355 if settings['gzip_responses']:
360 if settings['gzip_responses']:
356 pyramid_app = make_gzip_middleware(
361 pyramid_app = make_gzip_middleware(
357 pyramid_app, settings, compress_level=1)
362 pyramid_app, settings, compress_level=1)
358
363
359 # this should be the outer most middleware in the wsgi stack since
364 # this should be the outer most middleware in the wsgi stack since
360 # middleware like Routes make database calls
365 # middleware like Routes make database calls
361 def pyramid_app_with_cleanup(environ, start_response):
366 def pyramid_app_with_cleanup(environ, start_response):
362 try:
367 try:
363 return pyramid_app(environ, start_response)
368 return pyramid_app(environ, start_response)
364 finally:
369 finally:
365 # Dispose current database session and rollback uncommitted
370 # Dispose current database session and rollback uncommitted
366 # transactions.
371 # transactions.
367 meta.Session.remove()
372 meta.Session.remove()
368
373
369 # In a single threaded mode server, on non sqlite db we should have
374 # In a single threaded mode server, on non sqlite db we should have
370 # '0 Current Checked out connections' at the end of a request,
375 # '0 Current Checked out connections' at the end of a request,
371 # if not, then something, somewhere is leaving a connection open
376 # if not, then something, somewhere is leaving a connection open
372 pool = meta.Base.metadata.bind.engine.pool
377 pool = meta.Base.metadata.bind.engine.pool
373 log.debug('sa pool status: %s', pool.status())
378 log.debug('sa pool status: %s', pool.status())
374 log.debug('Request processing finalized')
379 log.debug('Request processing finalized')
375
380
376 return pyramid_app_with_cleanup
381 return pyramid_app_with_cleanup
377
382
378
383
379 def sanitize_settings_and_apply_defaults(settings):
384 def sanitize_settings_and_apply_defaults(settings):
380 """
385 """
381 Applies settings defaults and does all type conversion.
386 Applies settings defaults and does all type conversion.
382
387
383 We would move all settings parsing and preparation into this place, so that
388 We would move all settings parsing and preparation into this place, so that
384 we have only one place left which deals with this part. The remaining parts
389 we have only one place left which deals with this part. The remaining parts
385 of the application would start to rely fully on well prepared settings.
390 of the application would start to rely fully on well prepared settings.
386
391
387 This piece would later be split up per topic to avoid a big fat monster
392 This piece would later be split up per topic to avoid a big fat monster
388 function.
393 function.
389 """
394 """
390
395
391 settings.setdefault('rhodecode.edition', 'Community Edition')
396 settings.setdefault('rhodecode.edition', 'Community Edition')
392
397
393 if 'mako.default_filters' not in settings:
398 if 'mako.default_filters' not in settings:
394 # set custom default filters if we don't have it defined
399 # set custom default filters if we don't have it defined
395 settings['mako.imports'] = 'from rhodecode.lib.base import h_filter'
400 settings['mako.imports'] = 'from rhodecode.lib.base import h_filter'
396 settings['mako.default_filters'] = 'h_filter'
401 settings['mako.default_filters'] = 'h_filter'
397
402
398 if 'mako.directories' not in settings:
403 if 'mako.directories' not in settings:
399 mako_directories = settings.setdefault('mako.directories', [
404 mako_directories = settings.setdefault('mako.directories', [
400 # Base templates of the original application
405 # Base templates of the original application
401 'rhodecode:templates',
406 'rhodecode:templates',
402 ])
407 ])
403 log.debug(
408 log.debug(
404 "Using the following Mako template directories: %s",
409 "Using the following Mako template directories: %s",
405 mako_directories)
410 mako_directories)
406
411
407 # Default includes, possible to change as a user
412 # Default includes, possible to change as a user
408 pyramid_includes = settings.setdefault('pyramid.includes', [
413 pyramid_includes = settings.setdefault('pyramid.includes', [
409 'rhodecode.lib.middleware.request_wrapper',
414 'rhodecode.lib.middleware.request_wrapper',
410 ])
415 ])
411 log.debug(
416 log.debug(
412 "Using the following pyramid.includes: %s",
417 "Using the following pyramid.includes: %s",
413 pyramid_includes)
418 pyramid_includes)
414
419
415 # TODO: johbo: Re-think this, usually the call to config.include
420 # TODO: johbo: Re-think this, usually the call to config.include
416 # should allow to pass in a prefix.
421 # should allow to pass in a prefix.
417 settings.setdefault('rhodecode.api.url', '/_admin/api')
422 settings.setdefault('rhodecode.api.url', '/_admin/api')
418
423
419 # Sanitize generic settings.
424 # Sanitize generic settings.
420 _list_setting(settings, 'default_encoding', 'UTF-8')
425 _list_setting(settings, 'default_encoding', 'UTF-8')
421 _bool_setting(settings, 'is_test', 'false')
426 _bool_setting(settings, 'is_test', 'false')
422 _bool_setting(settings, 'gzip_responses', 'false')
427 _bool_setting(settings, 'gzip_responses', 'false')
423
428
424 # Call split out functions that sanitize settings for each topic.
429 # Call split out functions that sanitize settings for each topic.
425 _sanitize_appenlight_settings(settings)
430 _sanitize_appenlight_settings(settings)
426 _sanitize_vcs_settings(settings)
431 _sanitize_vcs_settings(settings)
427 _sanitize_cache_settings(settings)
432 _sanitize_cache_settings(settings)
428
433
429 # configure instance id
434 # configure instance id
430 config_utils.set_instance_id(settings)
435 config_utils.set_instance_id(settings)
431
436
432 return settings
437 return settings
433
438
434
439
440 def enable_debug():
441 """
442 Helper to enable debug on running instance
443 :return:
444 """
445 import tempfile
446 import textwrap
447 import logging.config
448
449 ini_template = textwrap.dedent("""
450 #####################################
451 ### DEBUG LOGGING CONFIGURATION ####
452 #####################################
453 [loggers]
454 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
455
456 [handlers]
457 keys = console, console_sql
458
459 [formatters]
460 keys = generic, color_formatter, color_formatter_sql
461
462 #############
463 ## LOGGERS ##
464 #############
465 [logger_root]
466 level = NOTSET
467 handlers = console
468
469 [logger_sqlalchemy]
470 level = INFO
471 handlers = console_sql
472 qualname = sqlalchemy.engine
473 propagate = 0
474
475 [logger_beaker]
476 level = DEBUG
477 handlers =
478 qualname = beaker.container
479 propagate = 1
480
481 [logger_rhodecode]
482 level = DEBUG
483 handlers =
484 qualname = rhodecode
485 propagate = 1
486
487 [logger_ssh_wrapper]
488 level = DEBUG
489 handlers =
490 qualname = ssh_wrapper
491 propagate = 1
492
493 [logger_celery]
494 level = DEBUG
495 handlers =
496 qualname = celery
497
498
499 ##############
500 ## HANDLERS ##
501 ##############
502
503 [handler_console]
504 class = StreamHandler
505 args = (sys.stderr, )
506 level = DEBUG
507 formatter = color_formatter
508
509 [handler_console_sql]
510 # "level = DEBUG" logs SQL queries and results.
511 # "level = INFO" logs SQL queries.
512 # "level = WARN" logs neither. (Recommended for production systems.)
513 class = StreamHandler
514 args = (sys.stderr, )
515 level = WARN
516 formatter = color_formatter_sql
517
518 ################
519 ## FORMATTERS ##
520 ################
521
522 [formatter_generic]
523 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
524 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s | %(req_id)s
525 datefmt = %Y-%m-%d %H:%M:%S
526
527 [formatter_color_formatter]
528 class = rhodecode.lib.logging_formatter.ColorRequestTrackingFormatter
529 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s | %(req_id)s
530 datefmt = %Y-%m-%d %H:%M:%S
531
532 [formatter_color_formatter_sql]
533 class = rhodecode.lib.logging_formatter.ColorFormatterSql
534 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
535 datefmt = %Y-%m-%d %H:%M:%S
536 """)
537
538 with tempfile.NamedTemporaryFile(prefix='rc_debug_logging_', suffix='.ini',
539 delete=False) as f:
540 log.info('Saved Temporary DEBUG config at %s', f.name)
541 f.write(ini_template)
542
543 logging.config.fileConfig(f.name)
544 log.debug('DEBUG MODE ON')
545 os.remove(f.name)
546
547
435 def _sanitize_appenlight_settings(settings):
548 def _sanitize_appenlight_settings(settings):
436 _bool_setting(settings, 'appenlight', 'false')
549 _bool_setting(settings, 'appenlight', 'false')
437
550
438
551
439 def _sanitize_vcs_settings(settings):
552 def _sanitize_vcs_settings(settings):
440 """
553 """
441 Applies settings defaults and does type conversion for all VCS related
554 Applies settings defaults and does type conversion for all VCS related
442 settings.
555 settings.
443 """
556 """
444 _string_setting(settings, 'vcs.svn.compatible_version', '')
557 _string_setting(settings, 'vcs.svn.compatible_version', '')
445 _string_setting(settings, 'git_rev_filter', '--all')
558 _string_setting(settings, 'git_rev_filter', '--all')
446 _string_setting(settings, 'vcs.hooks.protocol', 'http')
559 _string_setting(settings, 'vcs.hooks.protocol', 'http')
447 _string_setting(settings, 'vcs.hooks.host', '127.0.0.1')
560 _string_setting(settings, 'vcs.hooks.host', '127.0.0.1')
448 _string_setting(settings, 'vcs.scm_app_implementation', 'http')
561 _string_setting(settings, 'vcs.scm_app_implementation', 'http')
449 _string_setting(settings, 'vcs.server', '')
562 _string_setting(settings, 'vcs.server', '')
450 _string_setting(settings, 'vcs.server.log_level', 'debug')
563 _string_setting(settings, 'vcs.server.log_level', 'debug')
451 _string_setting(settings, 'vcs.server.protocol', 'http')
564 _string_setting(settings, 'vcs.server.protocol', 'http')
452 _bool_setting(settings, 'startup.import_repos', 'false')
565 _bool_setting(settings, 'startup.import_repos', 'false')
453 _bool_setting(settings, 'vcs.hooks.direct_calls', 'false')
566 _bool_setting(settings, 'vcs.hooks.direct_calls', 'false')
454 _bool_setting(settings, 'vcs.server.enable', 'true')
567 _bool_setting(settings, 'vcs.server.enable', 'true')
455 _bool_setting(settings, 'vcs.start_server', 'false')
568 _bool_setting(settings, 'vcs.start_server', 'false')
456 _list_setting(settings, 'vcs.backends', 'hg, git, svn')
569 _list_setting(settings, 'vcs.backends', 'hg, git, svn')
457 _int_setting(settings, 'vcs.connection_timeout', 3600)
570 _int_setting(settings, 'vcs.connection_timeout', 3600)
458
571
459 # Support legacy values of vcs.scm_app_implementation. Legacy
572 # Support legacy values of vcs.scm_app_implementation. Legacy
460 # configurations may use 'rhodecode.lib.middleware.utils.scm_app_http', or
573 # configurations may use 'rhodecode.lib.middleware.utils.scm_app_http', or
461 # disabled since 4.13 'vcsserver.scm_app' which is now mapped to 'http'.
574 # disabled since 4.13 'vcsserver.scm_app' which is now mapped to 'http'.
462 scm_app_impl = settings['vcs.scm_app_implementation']
575 scm_app_impl = settings['vcs.scm_app_implementation']
463 if scm_app_impl in ['rhodecode.lib.middleware.utils.scm_app_http', 'vcsserver.scm_app']:
576 if scm_app_impl in ['rhodecode.lib.middleware.utils.scm_app_http', 'vcsserver.scm_app']:
464 settings['vcs.scm_app_implementation'] = 'http'
577 settings['vcs.scm_app_implementation'] = 'http'
465
578
466
579
467 def _sanitize_cache_settings(settings):
580 def _sanitize_cache_settings(settings):
468 temp_store = tempfile.gettempdir()
581 temp_store = tempfile.gettempdir()
469 default_cache_dir = os.path.join(temp_store, 'rc_cache')
582 default_cache_dir = os.path.join(temp_store, 'rc_cache')
470
583
471 # save default, cache dir, and use it for all backends later.
584 # save default, cache dir, and use it for all backends later.
472 default_cache_dir = _string_setting(
585 default_cache_dir = _string_setting(
473 settings,
586 settings,
474 'cache_dir',
587 'cache_dir',
475 default_cache_dir, lower=False, default_when_empty=True)
588 default_cache_dir, lower=False, default_when_empty=True)
476
589
477 # ensure we have our dir created
590 # ensure we have our dir created
478 if not os.path.isdir(default_cache_dir):
591 if not os.path.isdir(default_cache_dir):
479 os.makedirs(default_cache_dir, mode=0o755)
592 os.makedirs(default_cache_dir, mode=0o755)
480
593
481 # exception store cache
594 # exception store cache
482 _string_setting(
595 _string_setting(
483 settings,
596 settings,
484 'exception_tracker.store_path',
597 'exception_tracker.store_path',
485 temp_store, lower=False, default_when_empty=True)
598 temp_store, lower=False, default_when_empty=True)
486
599
487 # cache_perms
600 # cache_perms
488 _string_setting(
601 _string_setting(
489 settings,
602 settings,
490 'rc_cache.cache_perms.backend',
603 'rc_cache.cache_perms.backend',
491 'dogpile.cache.rc.file_namespace', lower=False)
604 'dogpile.cache.rc.file_namespace', lower=False)
492 _int_setting(
605 _int_setting(
493 settings,
606 settings,
494 'rc_cache.cache_perms.expiration_time',
607 'rc_cache.cache_perms.expiration_time',
495 60)
608 60)
496 _string_setting(
609 _string_setting(
497 settings,
610 settings,
498 'rc_cache.cache_perms.arguments.filename',
611 'rc_cache.cache_perms.arguments.filename',
499 os.path.join(default_cache_dir, 'rc_cache_1'), lower=False)
612 os.path.join(default_cache_dir, 'rc_cache_1'), lower=False)
500
613
501 # cache_repo
614 # cache_repo
502 _string_setting(
615 _string_setting(
503 settings,
616 settings,
504 'rc_cache.cache_repo.backend',
617 'rc_cache.cache_repo.backend',
505 'dogpile.cache.rc.file_namespace', lower=False)
618 'dogpile.cache.rc.file_namespace', lower=False)
506 _int_setting(
619 _int_setting(
507 settings,
620 settings,
508 'rc_cache.cache_repo.expiration_time',
621 'rc_cache.cache_repo.expiration_time',
509 60)
622 60)
510 _string_setting(
623 _string_setting(
511 settings,
624 settings,
512 'rc_cache.cache_repo.arguments.filename',
625 'rc_cache.cache_repo.arguments.filename',
513 os.path.join(default_cache_dir, 'rc_cache_2'), lower=False)
626 os.path.join(default_cache_dir, 'rc_cache_2'), lower=False)
514
627
515 # cache_license
628 # cache_license
516 _string_setting(
629 _string_setting(
517 settings,
630 settings,
518 'rc_cache.cache_license.backend',
631 'rc_cache.cache_license.backend',
519 'dogpile.cache.rc.file_namespace', lower=False)
632 'dogpile.cache.rc.file_namespace', lower=False)
520 _int_setting(
633 _int_setting(
521 settings,
634 settings,
522 'rc_cache.cache_license.expiration_time',
635 'rc_cache.cache_license.expiration_time',
523 5*60)
636 5*60)
524 _string_setting(
637 _string_setting(
525 settings,
638 settings,
526 'rc_cache.cache_license.arguments.filename',
639 'rc_cache.cache_license.arguments.filename',
527 os.path.join(default_cache_dir, 'rc_cache_3'), lower=False)
640 os.path.join(default_cache_dir, 'rc_cache_3'), lower=False)
528
641
529 # cache_repo_longterm memory, 96H
642 # cache_repo_longterm memory, 96H
530 _string_setting(
643 _string_setting(
531 settings,
644 settings,
532 'rc_cache.cache_repo_longterm.backend',
645 'rc_cache.cache_repo_longterm.backend',
533 'dogpile.cache.rc.memory_lru', lower=False)
646 'dogpile.cache.rc.memory_lru', lower=False)
534 _int_setting(
647 _int_setting(
535 settings,
648 settings,
536 'rc_cache.cache_repo_longterm.expiration_time',
649 'rc_cache.cache_repo_longterm.expiration_time',
537 345600)
650 345600)
538 _int_setting(
651 _int_setting(
539 settings,
652 settings,
540 'rc_cache.cache_repo_longterm.max_size',
653 'rc_cache.cache_repo_longterm.max_size',
541 10000)
654 10000)
542
655
543 # sql_cache_short
656 # sql_cache_short
544 _string_setting(
657 _string_setting(
545 settings,
658 settings,
546 'rc_cache.sql_cache_short.backend',
659 'rc_cache.sql_cache_short.backend',
547 'dogpile.cache.rc.memory_lru', lower=False)
660 'dogpile.cache.rc.memory_lru', lower=False)
548 _int_setting(
661 _int_setting(
549 settings,
662 settings,
550 'rc_cache.sql_cache_short.expiration_time',
663 'rc_cache.sql_cache_short.expiration_time',
551 30)
664 30)
552 _int_setting(
665 _int_setting(
553 settings,
666 settings,
554 'rc_cache.sql_cache_short.max_size',
667 'rc_cache.sql_cache_short.max_size',
555 10000)
668 10000)
556
669
557
670
558 def _int_setting(settings, name, default):
671 def _int_setting(settings, name, default):
559 settings[name] = int(settings.get(name, default))
672 settings[name] = int(settings.get(name, default))
560 return settings[name]
673 return settings[name]
561
674
562
675
563 def _bool_setting(settings, name, default):
676 def _bool_setting(settings, name, default):
564 input_val = settings.get(name, default)
677 input_val = settings.get(name, default)
565 if isinstance(input_val, unicode):
678 if isinstance(input_val, unicode):
566 input_val = input_val.encode('utf8')
679 input_val = input_val.encode('utf8')
567 settings[name] = asbool(input_val)
680 settings[name] = asbool(input_val)
568 return settings[name]
681 return settings[name]
569
682
570
683
571 def _list_setting(settings, name, default):
684 def _list_setting(settings, name, default):
572 raw_value = settings.get(name, default)
685 raw_value = settings.get(name, default)
573
686
574 old_separator = ','
687 old_separator = ','
575 if old_separator in raw_value:
688 if old_separator in raw_value:
576 # If we get a comma separated list, pass it to our own function.
689 # If we get a comma separated list, pass it to our own function.
577 settings[name] = rhodecode_aslist(raw_value, sep=old_separator)
690 settings[name] = rhodecode_aslist(raw_value, sep=old_separator)
578 else:
691 else:
579 # Otherwise we assume it uses pyramids space/newline separation.
692 # Otherwise we assume it uses pyramids space/newline separation.
580 settings[name] = aslist(raw_value)
693 settings[name] = aslist(raw_value)
581 return settings[name]
694 return settings[name]
582
695
583
696
584 def _string_setting(settings, name, default, lower=True, default_when_empty=False):
697 def _string_setting(settings, name, default, lower=True, default_when_empty=False):
585 value = settings.get(name, default)
698 value = settings.get(name, default)
586
699
587 if default_when_empty and not value:
700 if default_when_empty and not value:
588 # use default value when value is empty
701 # use default value when value is empty
589 value = default
702 value = default
590
703
591 if lower:
704 if lower:
592 value = value.lower()
705 value = value.lower()
593 settings[name] = value
706 settings[name] = value
594 return settings[name]
707 return settings[name]
595
708
596
709
597 def _substitute_values(mapping, substitutions):
710 def _substitute_values(mapping, substitutions):
598
711
599 try:
712 try:
600 result = {
713 result = {
601 # Note: Cannot use regular replacements, since they would clash
714 # Note: Cannot use regular replacements, since they would clash
602 # with the implementation of ConfigParser. Using "format" instead.
715 # with the implementation of ConfigParser. Using "format" instead.
603 key: value.format(**substitutions)
716 key: value.format(**substitutions)
604 for key, value in mapping.items()
717 for key, value in mapping.items()
605 }
718 }
606 except KeyError as e:
719 except KeyError as e:
607 raise ValueError(
720 raise ValueError(
608 'Failed to substitute env variable: {}. '
721 'Failed to substitute env variable: {}. '
609 'Make sure you have specified this env variable without ENV_ prefix'.format(e))
722 'Make sure you have specified this env variable without ENV_ prefix'.format(e))
610 except ValueError as e:
723 except ValueError as e:
611 log.warning('Failed to substitute ENV variable: %s', e)
724 log.warning('Failed to substitute ENV variable: %s', e)
612 result = mapping
725 result = mapping
613
726
614 return result
727 return result
@@ -1,336 +1,336 b''
1
1
2 /******************************************************************************
2 /******************************************************************************
3 * *
3 * *
4 * DO NOT CHANGE THIS FILE MANUALLY *
4 * DO NOT CHANGE THIS FILE MANUALLY *
5 * *
5 * *
6 * *
6 * *
7 * This file is automatically generated when the app starts up with *
7 * This file is automatically generated when the app starts up with *
8 * generate_js_files = true *
8 * generate_js_files = true *
9 * *
9 * *
10 * To add a route here pass jsroute=True to the route definition in the app *
10 * To add a route here pass jsroute=True to the route definition in the app *
11 * *
11 * *
12 ******************************************************************************/
12 ******************************************************************************/
13 function registerRCRoutes() {
13 function registerRCRoutes() {
14 // routes registration
14 // routes registration
15 pyroutes.register('favicon', '/favicon.ico', []);
15 pyroutes.register('favicon', '/favicon.ico', []);
16 pyroutes.register('robots', '/robots.txt', []);
16 pyroutes.register('robots', '/robots.txt', []);
17 pyroutes.register('auth_home', '/_admin/auth*traverse', []);
18 pyroutes.register('global_integrations_new', '/_admin/integrations/new', []);
17 pyroutes.register('global_integrations_new', '/_admin/integrations/new', []);
19 pyroutes.register('global_integrations_home', '/_admin/integrations', []);
18 pyroutes.register('global_integrations_home', '/_admin/integrations', []);
20 pyroutes.register('global_integrations_list', '/_admin/integrations/%(integration)s', ['integration']);
19 pyroutes.register('global_integrations_list', '/_admin/integrations/%(integration)s', ['integration']);
21 pyroutes.register('global_integrations_create', '/_admin/integrations/%(integration)s/new', ['integration']);
20 pyroutes.register('global_integrations_create', '/_admin/integrations/%(integration)s/new', ['integration']);
22 pyroutes.register('global_integrations_edit', '/_admin/integrations/%(integration)s/%(integration_id)s', ['integration', 'integration_id']);
21 pyroutes.register('global_integrations_edit', '/_admin/integrations/%(integration)s/%(integration_id)s', ['integration', 'integration_id']);
23 pyroutes.register('repo_group_integrations_home', '/%(repo_group_name)s/_settings/integrations', ['repo_group_name']);
22 pyroutes.register('repo_group_integrations_home', '/%(repo_group_name)s/_settings/integrations', ['repo_group_name']);
24 pyroutes.register('repo_group_integrations_new', '/%(repo_group_name)s/_settings/integrations/new', ['repo_group_name']);
23 pyroutes.register('repo_group_integrations_new', '/%(repo_group_name)s/_settings/integrations/new', ['repo_group_name']);
25 pyroutes.register('repo_group_integrations_list', '/%(repo_group_name)s/_settings/integrations/%(integration)s', ['repo_group_name', 'integration']);
24 pyroutes.register('repo_group_integrations_list', '/%(repo_group_name)s/_settings/integrations/%(integration)s', ['repo_group_name', 'integration']);
26 pyroutes.register('repo_group_integrations_create', '/%(repo_group_name)s/_settings/integrations/%(integration)s/new', ['repo_group_name', 'integration']);
25 pyroutes.register('repo_group_integrations_create', '/%(repo_group_name)s/_settings/integrations/%(integration)s/new', ['repo_group_name', 'integration']);
27 pyroutes.register('repo_group_integrations_edit', '/%(repo_group_name)s/_settings/integrations/%(integration)s/%(integration_id)s', ['repo_group_name', 'integration', 'integration_id']);
26 pyroutes.register('repo_group_integrations_edit', '/%(repo_group_name)s/_settings/integrations/%(integration)s/%(integration_id)s', ['repo_group_name', 'integration', 'integration_id']);
28 pyroutes.register('repo_integrations_home', '/%(repo_name)s/settings/integrations', ['repo_name']);
27 pyroutes.register('repo_integrations_home', '/%(repo_name)s/settings/integrations', ['repo_name']);
29 pyroutes.register('repo_integrations_new', '/%(repo_name)s/settings/integrations/new', ['repo_name']);
28 pyroutes.register('repo_integrations_new', '/%(repo_name)s/settings/integrations/new', ['repo_name']);
30 pyroutes.register('repo_integrations_list', '/%(repo_name)s/settings/integrations/%(integration)s', ['repo_name', 'integration']);
29 pyroutes.register('repo_integrations_list', '/%(repo_name)s/settings/integrations/%(integration)s', ['repo_name', 'integration']);
31 pyroutes.register('repo_integrations_create', '/%(repo_name)s/settings/integrations/%(integration)s/new', ['repo_name', 'integration']);
30 pyroutes.register('repo_integrations_create', '/%(repo_name)s/settings/integrations/%(integration)s/new', ['repo_name', 'integration']);
32 pyroutes.register('repo_integrations_edit', '/%(repo_name)s/settings/integrations/%(integration)s/%(integration_id)s', ['repo_name', 'integration', 'integration_id']);
31 pyroutes.register('repo_integrations_edit', '/%(repo_name)s/settings/integrations/%(integration)s/%(integration_id)s', ['repo_name', 'integration', 'integration_id']);
32 pyroutes.register('auth_home', '/_admin/auth*traverse', []);
33 pyroutes.register('ops_ping', '/_admin/ops/ping', []);
33 pyroutes.register('ops_ping', '/_admin/ops/ping', []);
34 pyroutes.register('ops_error_test', '/_admin/ops/error', []);
34 pyroutes.register('ops_error_test', '/_admin/ops/error', []);
35 pyroutes.register('ops_redirect_test', '/_admin/ops/redirect', []);
35 pyroutes.register('ops_redirect_test', '/_admin/ops/redirect', []);
36 pyroutes.register('ops_ping_legacy', '/_admin/ping', []);
36 pyroutes.register('ops_ping_legacy', '/_admin/ping', []);
37 pyroutes.register('ops_error_test_legacy', '/_admin/error_test', []);
37 pyroutes.register('ops_error_test_legacy', '/_admin/error_test', []);
38 pyroutes.register('admin_home', '/_admin', []);
38 pyroutes.register('admin_home', '/_admin', []);
39 pyroutes.register('admin_audit_logs', '/_admin/audit_logs', []);
39 pyroutes.register('admin_audit_logs', '/_admin/audit_logs', []);
40 pyroutes.register('admin_audit_log_entry', '/_admin/audit_logs/%(audit_log_id)s', ['audit_log_id']);
40 pyroutes.register('admin_audit_log_entry', '/_admin/audit_logs/%(audit_log_id)s', ['audit_log_id']);
41 pyroutes.register('pull_requests_global_0', '/_admin/pull_requests/%(pull_request_id)s', ['pull_request_id']);
41 pyroutes.register('pull_requests_global_0', '/_admin/pull_requests/%(pull_request_id)s', ['pull_request_id']);
42 pyroutes.register('pull_requests_global_1', '/_admin/pull-requests/%(pull_request_id)s', ['pull_request_id']);
42 pyroutes.register('pull_requests_global_1', '/_admin/pull-requests/%(pull_request_id)s', ['pull_request_id']);
43 pyroutes.register('pull_requests_global', '/_admin/pull-request/%(pull_request_id)s', ['pull_request_id']);
43 pyroutes.register('pull_requests_global', '/_admin/pull-request/%(pull_request_id)s', ['pull_request_id']);
44 pyroutes.register('admin_settings_open_source', '/_admin/settings/open_source', []);
44 pyroutes.register('admin_settings_open_source', '/_admin/settings/open_source', []);
45 pyroutes.register('admin_settings_vcs_svn_generate_cfg', '/_admin/settings/vcs/svn_generate_cfg', []);
45 pyroutes.register('admin_settings_vcs_svn_generate_cfg', '/_admin/settings/vcs/svn_generate_cfg', []);
46 pyroutes.register('admin_settings_system', '/_admin/settings/system', []);
46 pyroutes.register('admin_settings_system', '/_admin/settings/system', []);
47 pyroutes.register('admin_settings_system_update', '/_admin/settings/system/updates', []);
47 pyroutes.register('admin_settings_system_update', '/_admin/settings/system/updates', []);
48 pyroutes.register('admin_settings_exception_tracker', '/_admin/settings/exceptions', []);
48 pyroutes.register('admin_settings_exception_tracker', '/_admin/settings/exceptions', []);
49 pyroutes.register('admin_settings_exception_tracker_delete_all', '/_admin/settings/exceptions/delete', []);
49 pyroutes.register('admin_settings_exception_tracker_delete_all', '/_admin/settings/exceptions/delete', []);
50 pyroutes.register('admin_settings_exception_tracker_show', '/_admin/settings/exceptions/%(exception_id)s', ['exception_id']);
50 pyroutes.register('admin_settings_exception_tracker_show', '/_admin/settings/exceptions/%(exception_id)s', ['exception_id']);
51 pyroutes.register('admin_settings_exception_tracker_delete', '/_admin/settings/exceptions/%(exception_id)s/delete', ['exception_id']);
51 pyroutes.register('admin_settings_exception_tracker_delete', '/_admin/settings/exceptions/%(exception_id)s/delete', ['exception_id']);
52 pyroutes.register('admin_settings_sessions', '/_admin/settings/sessions', []);
52 pyroutes.register('admin_settings_sessions', '/_admin/settings/sessions', []);
53 pyroutes.register('admin_settings_sessions_cleanup', '/_admin/settings/sessions/cleanup', []);
53 pyroutes.register('admin_settings_sessions_cleanup', '/_admin/settings/sessions/cleanup', []);
54 pyroutes.register('admin_settings_process_management', '/_admin/settings/process_management', []);
54 pyroutes.register('admin_settings_process_management', '/_admin/settings/process_management', []);
55 pyroutes.register('admin_settings_process_management_data', '/_admin/settings/process_management/data', []);
55 pyroutes.register('admin_settings_process_management_data', '/_admin/settings/process_management/data', []);
56 pyroutes.register('admin_settings_process_management_signal', '/_admin/settings/process_management/signal', []);
56 pyroutes.register('admin_settings_process_management_signal', '/_admin/settings/process_management/signal', []);
57 pyroutes.register('admin_settings_process_management_master_signal', '/_admin/settings/process_management/master_signal', []);
57 pyroutes.register('admin_settings_process_management_master_signal', '/_admin/settings/process_management/master_signal', []);
58 pyroutes.register('admin_defaults_repositories', '/_admin/defaults/repositories', []);
58 pyroutes.register('admin_defaults_repositories', '/_admin/defaults/repositories', []);
59 pyroutes.register('admin_defaults_repositories_update', '/_admin/defaults/repositories/update', []);
59 pyroutes.register('admin_defaults_repositories_update', '/_admin/defaults/repositories/update', []);
60 pyroutes.register('admin_settings', '/_admin/settings', []);
60 pyroutes.register('admin_settings', '/_admin/settings', []);
61 pyroutes.register('admin_settings_update', '/_admin/settings/update', []);
61 pyroutes.register('admin_settings_update', '/_admin/settings/update', []);
62 pyroutes.register('admin_settings_global', '/_admin/settings/global', []);
62 pyroutes.register('admin_settings_global', '/_admin/settings/global', []);
63 pyroutes.register('admin_settings_global_update', '/_admin/settings/global/update', []);
63 pyroutes.register('admin_settings_global_update', '/_admin/settings/global/update', []);
64 pyroutes.register('admin_settings_vcs', '/_admin/settings/vcs', []);
64 pyroutes.register('admin_settings_vcs', '/_admin/settings/vcs', []);
65 pyroutes.register('admin_settings_vcs_update', '/_admin/settings/vcs/update', []);
65 pyroutes.register('admin_settings_vcs_update', '/_admin/settings/vcs/update', []);
66 pyroutes.register('admin_settings_vcs_svn_pattern_delete', '/_admin/settings/vcs/svn_pattern_delete', []);
66 pyroutes.register('admin_settings_vcs_svn_pattern_delete', '/_admin/settings/vcs/svn_pattern_delete', []);
67 pyroutes.register('admin_settings_mapping', '/_admin/settings/mapping', []);
67 pyroutes.register('admin_settings_mapping', '/_admin/settings/mapping', []);
68 pyroutes.register('admin_settings_mapping_update', '/_admin/settings/mapping/update', []);
68 pyroutes.register('admin_settings_mapping_update', '/_admin/settings/mapping/update', []);
69 pyroutes.register('admin_settings_visual', '/_admin/settings/visual', []);
69 pyroutes.register('admin_settings_visual', '/_admin/settings/visual', []);
70 pyroutes.register('admin_settings_visual_update', '/_admin/settings/visual/update', []);
70 pyroutes.register('admin_settings_visual_update', '/_admin/settings/visual/update', []);
71 pyroutes.register('admin_settings_issuetracker', '/_admin/settings/issue-tracker', []);
71 pyroutes.register('admin_settings_issuetracker', '/_admin/settings/issue-tracker', []);
72 pyroutes.register('admin_settings_issuetracker_update', '/_admin/settings/issue-tracker/update', []);
72 pyroutes.register('admin_settings_issuetracker_update', '/_admin/settings/issue-tracker/update', []);
73 pyroutes.register('admin_settings_issuetracker_test', '/_admin/settings/issue-tracker/test', []);
73 pyroutes.register('admin_settings_issuetracker_test', '/_admin/settings/issue-tracker/test', []);
74 pyroutes.register('admin_settings_issuetracker_delete', '/_admin/settings/issue-tracker/delete', []);
74 pyroutes.register('admin_settings_issuetracker_delete', '/_admin/settings/issue-tracker/delete', []);
75 pyroutes.register('admin_settings_email', '/_admin/settings/email', []);
75 pyroutes.register('admin_settings_email', '/_admin/settings/email', []);
76 pyroutes.register('admin_settings_email_update', '/_admin/settings/email/update', []);
76 pyroutes.register('admin_settings_email_update', '/_admin/settings/email/update', []);
77 pyroutes.register('admin_settings_hooks', '/_admin/settings/hooks', []);
77 pyroutes.register('admin_settings_hooks', '/_admin/settings/hooks', []);
78 pyroutes.register('admin_settings_hooks_update', '/_admin/settings/hooks/update', []);
78 pyroutes.register('admin_settings_hooks_update', '/_admin/settings/hooks/update', []);
79 pyroutes.register('admin_settings_hooks_delete', '/_admin/settings/hooks/delete', []);
79 pyroutes.register('admin_settings_hooks_delete', '/_admin/settings/hooks/delete', []);
80 pyroutes.register('admin_settings_search', '/_admin/settings/search', []);
80 pyroutes.register('admin_settings_search', '/_admin/settings/search', []);
81 pyroutes.register('admin_settings_labs', '/_admin/settings/labs', []);
81 pyroutes.register('admin_settings_labs', '/_admin/settings/labs', []);
82 pyroutes.register('admin_settings_labs_update', '/_admin/settings/labs/update', []);
82 pyroutes.register('admin_settings_labs_update', '/_admin/settings/labs/update', []);
83 pyroutes.register('admin_settings_automation', '/_admin/_admin/settings/automation', []);
83 pyroutes.register('admin_settings_automation', '/_admin/_admin/settings/automation', []);
84 pyroutes.register('admin_permissions_application', '/_admin/permissions/application', []);
84 pyroutes.register('admin_permissions_application', '/_admin/permissions/application', []);
85 pyroutes.register('admin_permissions_application_update', '/_admin/permissions/application/update', []);
85 pyroutes.register('admin_permissions_application_update', '/_admin/permissions/application/update', []);
86 pyroutes.register('admin_permissions_global', '/_admin/permissions/global', []);
86 pyroutes.register('admin_permissions_global', '/_admin/permissions/global', []);
87 pyroutes.register('admin_permissions_global_update', '/_admin/permissions/global/update', []);
87 pyroutes.register('admin_permissions_global_update', '/_admin/permissions/global/update', []);
88 pyroutes.register('admin_permissions_object', '/_admin/permissions/object', []);
88 pyroutes.register('admin_permissions_object', '/_admin/permissions/object', []);
89 pyroutes.register('admin_permissions_object_update', '/_admin/permissions/object/update', []);
89 pyroutes.register('admin_permissions_object_update', '/_admin/permissions/object/update', []);
90 pyroutes.register('admin_permissions_branch', '/_admin/permissions/branch', []);
90 pyroutes.register('admin_permissions_branch', '/_admin/permissions/branch', []);
91 pyroutes.register('admin_permissions_ips', '/_admin/permissions/ips', []);
91 pyroutes.register('admin_permissions_ips', '/_admin/permissions/ips', []);
92 pyroutes.register('admin_permissions_overview', '/_admin/permissions/overview', []);
92 pyroutes.register('admin_permissions_overview', '/_admin/permissions/overview', []);
93 pyroutes.register('admin_permissions_auth_token_access', '/_admin/permissions/auth_token_access', []);
93 pyroutes.register('admin_permissions_auth_token_access', '/_admin/permissions/auth_token_access', []);
94 pyroutes.register('admin_permissions_ssh_keys', '/_admin/permissions/ssh_keys', []);
94 pyroutes.register('admin_permissions_ssh_keys', '/_admin/permissions/ssh_keys', []);
95 pyroutes.register('admin_permissions_ssh_keys_data', '/_admin/permissions/ssh_keys/data', []);
95 pyroutes.register('admin_permissions_ssh_keys_data', '/_admin/permissions/ssh_keys/data', []);
96 pyroutes.register('admin_permissions_ssh_keys_update', '/_admin/permissions/ssh_keys/update', []);
96 pyroutes.register('admin_permissions_ssh_keys_update', '/_admin/permissions/ssh_keys/update', []);
97 pyroutes.register('users', '/_admin/users', []);
97 pyroutes.register('users', '/_admin/users', []);
98 pyroutes.register('users_data', '/_admin/users_data', []);
98 pyroutes.register('users_data', '/_admin/users_data', []);
99 pyroutes.register('users_create', '/_admin/users/create', []);
99 pyroutes.register('users_create', '/_admin/users/create', []);
100 pyroutes.register('users_new', '/_admin/users/new', []);
100 pyroutes.register('users_new', '/_admin/users/new', []);
101 pyroutes.register('user_edit', '/_admin/users/%(user_id)s/edit', ['user_id']);
101 pyroutes.register('user_edit', '/_admin/users/%(user_id)s/edit', ['user_id']);
102 pyroutes.register('user_edit_advanced', '/_admin/users/%(user_id)s/edit/advanced', ['user_id']);
102 pyroutes.register('user_edit_advanced', '/_admin/users/%(user_id)s/edit/advanced', ['user_id']);
103 pyroutes.register('user_edit_global_perms', '/_admin/users/%(user_id)s/edit/global_permissions', ['user_id']);
103 pyroutes.register('user_edit_global_perms', '/_admin/users/%(user_id)s/edit/global_permissions', ['user_id']);
104 pyroutes.register('user_edit_global_perms_update', '/_admin/users/%(user_id)s/edit/global_permissions/update', ['user_id']);
104 pyroutes.register('user_edit_global_perms_update', '/_admin/users/%(user_id)s/edit/global_permissions/update', ['user_id']);
105 pyroutes.register('user_update', '/_admin/users/%(user_id)s/update', ['user_id']);
105 pyroutes.register('user_update', '/_admin/users/%(user_id)s/update', ['user_id']);
106 pyroutes.register('user_delete', '/_admin/users/%(user_id)s/delete', ['user_id']);
106 pyroutes.register('user_delete', '/_admin/users/%(user_id)s/delete', ['user_id']);
107 pyroutes.register('user_force_password_reset', '/_admin/users/%(user_id)s/password_reset', ['user_id']);
107 pyroutes.register('user_force_password_reset', '/_admin/users/%(user_id)s/password_reset', ['user_id']);
108 pyroutes.register('user_create_personal_repo_group', '/_admin/users/%(user_id)s/create_repo_group', ['user_id']);
108 pyroutes.register('user_create_personal_repo_group', '/_admin/users/%(user_id)s/create_repo_group', ['user_id']);
109 pyroutes.register('edit_user_auth_tokens', '/_admin/users/%(user_id)s/edit/auth_tokens', ['user_id']);
109 pyroutes.register('edit_user_auth_tokens', '/_admin/users/%(user_id)s/edit/auth_tokens', ['user_id']);
110 pyroutes.register('edit_user_auth_tokens_add', '/_admin/users/%(user_id)s/edit/auth_tokens/new', ['user_id']);
110 pyroutes.register('edit_user_auth_tokens_add', '/_admin/users/%(user_id)s/edit/auth_tokens/new', ['user_id']);
111 pyroutes.register('edit_user_auth_tokens_delete', '/_admin/users/%(user_id)s/edit/auth_tokens/delete', ['user_id']);
111 pyroutes.register('edit_user_auth_tokens_delete', '/_admin/users/%(user_id)s/edit/auth_tokens/delete', ['user_id']);
112 pyroutes.register('edit_user_ssh_keys', '/_admin/users/%(user_id)s/edit/ssh_keys', ['user_id']);
112 pyroutes.register('edit_user_ssh_keys', '/_admin/users/%(user_id)s/edit/ssh_keys', ['user_id']);
113 pyroutes.register('edit_user_ssh_keys_generate_keypair', '/_admin/users/%(user_id)s/edit/ssh_keys/generate', ['user_id']);
113 pyroutes.register('edit_user_ssh_keys_generate_keypair', '/_admin/users/%(user_id)s/edit/ssh_keys/generate', ['user_id']);
114 pyroutes.register('edit_user_ssh_keys_add', '/_admin/users/%(user_id)s/edit/ssh_keys/new', ['user_id']);
114 pyroutes.register('edit_user_ssh_keys_add', '/_admin/users/%(user_id)s/edit/ssh_keys/new', ['user_id']);
115 pyroutes.register('edit_user_ssh_keys_delete', '/_admin/users/%(user_id)s/edit/ssh_keys/delete', ['user_id']);
115 pyroutes.register('edit_user_ssh_keys_delete', '/_admin/users/%(user_id)s/edit/ssh_keys/delete', ['user_id']);
116 pyroutes.register('edit_user_emails', '/_admin/users/%(user_id)s/edit/emails', ['user_id']);
116 pyroutes.register('edit_user_emails', '/_admin/users/%(user_id)s/edit/emails', ['user_id']);
117 pyroutes.register('edit_user_emails_add', '/_admin/users/%(user_id)s/edit/emails/new', ['user_id']);
117 pyroutes.register('edit_user_emails_add', '/_admin/users/%(user_id)s/edit/emails/new', ['user_id']);
118 pyroutes.register('edit_user_emails_delete', '/_admin/users/%(user_id)s/edit/emails/delete', ['user_id']);
118 pyroutes.register('edit_user_emails_delete', '/_admin/users/%(user_id)s/edit/emails/delete', ['user_id']);
119 pyroutes.register('edit_user_ips', '/_admin/users/%(user_id)s/edit/ips', ['user_id']);
119 pyroutes.register('edit_user_ips', '/_admin/users/%(user_id)s/edit/ips', ['user_id']);
120 pyroutes.register('edit_user_ips_add', '/_admin/users/%(user_id)s/edit/ips/new', ['user_id']);
120 pyroutes.register('edit_user_ips_add', '/_admin/users/%(user_id)s/edit/ips/new', ['user_id']);
121 pyroutes.register('edit_user_ips_delete', '/_admin/users/%(user_id)s/edit/ips/delete', ['user_id']);
121 pyroutes.register('edit_user_ips_delete', '/_admin/users/%(user_id)s/edit/ips/delete', ['user_id']);
122 pyroutes.register('edit_user_perms_summary', '/_admin/users/%(user_id)s/edit/permissions_summary', ['user_id']);
122 pyroutes.register('edit_user_perms_summary', '/_admin/users/%(user_id)s/edit/permissions_summary', ['user_id']);
123 pyroutes.register('edit_user_perms_summary_json', '/_admin/users/%(user_id)s/edit/permissions_summary/json', ['user_id']);
123 pyroutes.register('edit_user_perms_summary_json', '/_admin/users/%(user_id)s/edit/permissions_summary/json', ['user_id']);
124 pyroutes.register('edit_user_groups_management', '/_admin/users/%(user_id)s/edit/groups_management', ['user_id']);
124 pyroutes.register('edit_user_groups_management', '/_admin/users/%(user_id)s/edit/groups_management', ['user_id']);
125 pyroutes.register('edit_user_groups_management_updates', '/_admin/users/%(user_id)s/edit/edit_user_groups_management/updates', ['user_id']);
125 pyroutes.register('edit_user_groups_management_updates', '/_admin/users/%(user_id)s/edit/edit_user_groups_management/updates', ['user_id']);
126 pyroutes.register('edit_user_audit_logs', '/_admin/users/%(user_id)s/edit/audit', ['user_id']);
126 pyroutes.register('edit_user_audit_logs', '/_admin/users/%(user_id)s/edit/audit', ['user_id']);
127 pyroutes.register('edit_user_caches', '/_admin/users/%(user_id)s/edit/caches', ['user_id']);
127 pyroutes.register('edit_user_caches', '/_admin/users/%(user_id)s/edit/caches', ['user_id']);
128 pyroutes.register('edit_user_caches_update', '/_admin/users/%(user_id)s/edit/caches/update', ['user_id']);
128 pyroutes.register('edit_user_caches_update', '/_admin/users/%(user_id)s/edit/caches/update', ['user_id']);
129 pyroutes.register('user_groups', '/_admin/user_groups', []);
129 pyroutes.register('user_groups', '/_admin/user_groups', []);
130 pyroutes.register('user_groups_data', '/_admin/user_groups_data', []);
130 pyroutes.register('user_groups_data', '/_admin/user_groups_data', []);
131 pyroutes.register('user_groups_new', '/_admin/user_groups/new', []);
131 pyroutes.register('user_groups_new', '/_admin/user_groups/new', []);
132 pyroutes.register('user_groups_create', '/_admin/user_groups/create', []);
132 pyroutes.register('user_groups_create', '/_admin/user_groups/create', []);
133 pyroutes.register('repos', '/_admin/repos', []);
133 pyroutes.register('repos', '/_admin/repos', []);
134 pyroutes.register('repo_new', '/_admin/repos/new', []);
134 pyroutes.register('repo_new', '/_admin/repos/new', []);
135 pyroutes.register('repo_create', '/_admin/repos/create', []);
135 pyroutes.register('repo_create', '/_admin/repos/create', []);
136 pyroutes.register('repo_groups', '/_admin/repo_groups', []);
136 pyroutes.register('repo_groups', '/_admin/repo_groups', []);
137 pyroutes.register('repo_group_new', '/_admin/repo_group/new', []);
137 pyroutes.register('repo_group_new', '/_admin/repo_group/new', []);
138 pyroutes.register('repo_group_create', '/_admin/repo_group/create', []);
138 pyroutes.register('repo_group_create', '/_admin/repo_group/create', []);
139 pyroutes.register('channelstream_connect', '/_admin/channelstream/connect', []);
139 pyroutes.register('channelstream_connect', '/_admin/channelstream/connect', []);
140 pyroutes.register('channelstream_subscribe', '/_admin/channelstream/subscribe', []);
140 pyroutes.register('channelstream_subscribe', '/_admin/channelstream/subscribe', []);
141 pyroutes.register('channelstream_proxy', '/_channelstream', []);
141 pyroutes.register('channelstream_proxy', '/_channelstream', []);
142 pyroutes.register('login', '/_admin/login', []);
142 pyroutes.register('login', '/_admin/login', []);
143 pyroutes.register('logout', '/_admin/logout', []);
143 pyroutes.register('logout', '/_admin/logout', []);
144 pyroutes.register('register', '/_admin/register', []);
144 pyroutes.register('register', '/_admin/register', []);
145 pyroutes.register('reset_password', '/_admin/password_reset', []);
145 pyroutes.register('reset_password', '/_admin/password_reset', []);
146 pyroutes.register('reset_password_confirmation', '/_admin/password_reset_confirmation', []);
146 pyroutes.register('reset_password_confirmation', '/_admin/password_reset_confirmation', []);
147 pyroutes.register('home', '/', []);
147 pyroutes.register('home', '/', []);
148 pyroutes.register('user_autocomplete_data', '/_users', []);
148 pyroutes.register('user_autocomplete_data', '/_users', []);
149 pyroutes.register('user_group_autocomplete_data', '/_user_groups', []);
149 pyroutes.register('user_group_autocomplete_data', '/_user_groups', []);
150 pyroutes.register('repo_list_data', '/_repos', []);
150 pyroutes.register('repo_list_data', '/_repos', []);
151 pyroutes.register('goto_switcher_data', '/_goto_data', []);
151 pyroutes.register('goto_switcher_data', '/_goto_data', []);
152 pyroutes.register('markup_preview', '/_markup_preview', []);
152 pyroutes.register('markup_preview', '/_markup_preview', []);
153 pyroutes.register('store_user_session_value', '/_store_session_attr', []);
153 pyroutes.register('store_user_session_value', '/_store_session_attr', []);
154 pyroutes.register('journal', '/_admin/journal', []);
154 pyroutes.register('journal', '/_admin/journal', []);
155 pyroutes.register('journal_rss', '/_admin/journal/rss', []);
155 pyroutes.register('journal_rss', '/_admin/journal/rss', []);
156 pyroutes.register('journal_atom', '/_admin/journal/atom', []);
156 pyroutes.register('journal_atom', '/_admin/journal/atom', []);
157 pyroutes.register('journal_public', '/_admin/public_journal', []);
157 pyroutes.register('journal_public', '/_admin/public_journal', []);
158 pyroutes.register('journal_public_atom', '/_admin/public_journal/atom', []);
158 pyroutes.register('journal_public_atom', '/_admin/public_journal/atom', []);
159 pyroutes.register('journal_public_atom_old', '/_admin/public_journal_atom', []);
159 pyroutes.register('journal_public_atom_old', '/_admin/public_journal_atom', []);
160 pyroutes.register('journal_public_rss', '/_admin/public_journal/rss', []);
160 pyroutes.register('journal_public_rss', '/_admin/public_journal/rss', []);
161 pyroutes.register('journal_public_rss_old', '/_admin/public_journal_rss', []);
161 pyroutes.register('journal_public_rss_old', '/_admin/public_journal_rss', []);
162 pyroutes.register('toggle_following', '/_admin/toggle_following', []);
162 pyroutes.register('toggle_following', '/_admin/toggle_following', []);
163 pyroutes.register('repo_creating', '/%(repo_name)s/repo_creating', ['repo_name']);
163 pyroutes.register('repo_creating', '/%(repo_name)s/repo_creating', ['repo_name']);
164 pyroutes.register('repo_creating_check', '/%(repo_name)s/repo_creating_check', ['repo_name']);
164 pyroutes.register('repo_creating_check', '/%(repo_name)s/repo_creating_check', ['repo_name']);
165 pyroutes.register('repo_summary_explicit', '/%(repo_name)s/summary', ['repo_name']);
165 pyroutes.register('repo_summary_explicit', '/%(repo_name)s/summary', ['repo_name']);
166 pyroutes.register('repo_summary_commits', '/%(repo_name)s/summary-commits', ['repo_name']);
166 pyroutes.register('repo_summary_commits', '/%(repo_name)s/summary-commits', ['repo_name']);
167 pyroutes.register('repo_commit', '/%(repo_name)s/changeset/%(commit_id)s', ['repo_name', 'commit_id']);
167 pyroutes.register('repo_commit', '/%(repo_name)s/changeset/%(commit_id)s', ['repo_name', 'commit_id']);
168 pyroutes.register('repo_commit_children', '/%(repo_name)s/changeset_children/%(commit_id)s', ['repo_name', 'commit_id']);
168 pyroutes.register('repo_commit_children', '/%(repo_name)s/changeset_children/%(commit_id)s', ['repo_name', 'commit_id']);
169 pyroutes.register('repo_commit_parents', '/%(repo_name)s/changeset_parents/%(commit_id)s', ['repo_name', 'commit_id']);
169 pyroutes.register('repo_commit_parents', '/%(repo_name)s/changeset_parents/%(commit_id)s', ['repo_name', 'commit_id']);
170 pyroutes.register('repo_commit_raw', '/%(repo_name)s/changeset-diff/%(commit_id)s', ['repo_name', 'commit_id']);
170 pyroutes.register('repo_commit_raw', '/%(repo_name)s/changeset-diff/%(commit_id)s', ['repo_name', 'commit_id']);
171 pyroutes.register('repo_commit_patch', '/%(repo_name)s/changeset-patch/%(commit_id)s', ['repo_name', 'commit_id']);
171 pyroutes.register('repo_commit_patch', '/%(repo_name)s/changeset-patch/%(commit_id)s', ['repo_name', 'commit_id']);
172 pyroutes.register('repo_commit_download', '/%(repo_name)s/changeset-download/%(commit_id)s', ['repo_name', 'commit_id']);
172 pyroutes.register('repo_commit_download', '/%(repo_name)s/changeset-download/%(commit_id)s', ['repo_name', 'commit_id']);
173 pyroutes.register('repo_commit_data', '/%(repo_name)s/changeset-data/%(commit_id)s', ['repo_name', 'commit_id']);
173 pyroutes.register('repo_commit_data', '/%(repo_name)s/changeset-data/%(commit_id)s', ['repo_name', 'commit_id']);
174 pyroutes.register('repo_commit_comment_create', '/%(repo_name)s/changeset/%(commit_id)s/comment/create', ['repo_name', 'commit_id']);
174 pyroutes.register('repo_commit_comment_create', '/%(repo_name)s/changeset/%(commit_id)s/comment/create', ['repo_name', 'commit_id']);
175 pyroutes.register('repo_commit_comment_preview', '/%(repo_name)s/changeset/%(commit_id)s/comment/preview', ['repo_name', 'commit_id']);
175 pyroutes.register('repo_commit_comment_preview', '/%(repo_name)s/changeset/%(commit_id)s/comment/preview', ['repo_name', 'commit_id']);
176 pyroutes.register('repo_commit_comment_delete', '/%(repo_name)s/changeset/%(commit_id)s/comment/%(comment_id)s/delete', ['repo_name', 'commit_id', 'comment_id']);
176 pyroutes.register('repo_commit_comment_delete', '/%(repo_name)s/changeset/%(commit_id)s/comment/%(comment_id)s/delete', ['repo_name', 'commit_id', 'comment_id']);
177 pyroutes.register('repo_commit_raw_deprecated', '/%(repo_name)s/raw-changeset/%(commit_id)s', ['repo_name', 'commit_id']);
177 pyroutes.register('repo_commit_raw_deprecated', '/%(repo_name)s/raw-changeset/%(commit_id)s', ['repo_name', 'commit_id']);
178 pyroutes.register('repo_archivefile', '/%(repo_name)s/archive/%(fname)s', ['repo_name', 'fname']);
178 pyroutes.register('repo_archivefile', '/%(repo_name)s/archive/%(fname)s', ['repo_name', 'fname']);
179 pyroutes.register('repo_files_diff', '/%(repo_name)s/diff/%(f_path)s', ['repo_name', 'f_path']);
179 pyroutes.register('repo_files_diff', '/%(repo_name)s/diff/%(f_path)s', ['repo_name', 'f_path']);
180 pyroutes.register('repo_files_diff_2way_redirect', '/%(repo_name)s/diff-2way/%(f_path)s', ['repo_name', 'f_path']);
180 pyroutes.register('repo_files_diff_2way_redirect', '/%(repo_name)s/diff-2way/%(f_path)s', ['repo_name', 'f_path']);
181 pyroutes.register('repo_files', '/%(repo_name)s/files/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
181 pyroutes.register('repo_files', '/%(repo_name)s/files/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
182 pyroutes.register('repo_files:default_path', '/%(repo_name)s/files/%(commit_id)s/', ['repo_name', 'commit_id']);
182 pyroutes.register('repo_files:default_path', '/%(repo_name)s/files/%(commit_id)s/', ['repo_name', 'commit_id']);
183 pyroutes.register('repo_files:default_commit', '/%(repo_name)s/files', ['repo_name']);
183 pyroutes.register('repo_files:default_commit', '/%(repo_name)s/files', ['repo_name']);
184 pyroutes.register('repo_files:rendered', '/%(repo_name)s/render/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
184 pyroutes.register('repo_files:rendered', '/%(repo_name)s/render/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
185 pyroutes.register('repo_files:annotated', '/%(repo_name)s/annotate/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
185 pyroutes.register('repo_files:annotated', '/%(repo_name)s/annotate/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
186 pyroutes.register('repo_files:annotated_previous', '/%(repo_name)s/annotate-previous/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
186 pyroutes.register('repo_files:annotated_previous', '/%(repo_name)s/annotate-previous/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
187 pyroutes.register('repo_nodetree_full', '/%(repo_name)s/nodetree_full/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
187 pyroutes.register('repo_nodetree_full', '/%(repo_name)s/nodetree_full/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
188 pyroutes.register('repo_nodetree_full:default_path', '/%(repo_name)s/nodetree_full/%(commit_id)s/', ['repo_name', 'commit_id']);
188 pyroutes.register('repo_nodetree_full:default_path', '/%(repo_name)s/nodetree_full/%(commit_id)s/', ['repo_name', 'commit_id']);
189 pyroutes.register('repo_files_nodelist', '/%(repo_name)s/nodelist/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
189 pyroutes.register('repo_files_nodelist', '/%(repo_name)s/nodelist/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
190 pyroutes.register('repo_file_raw', '/%(repo_name)s/raw/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
190 pyroutes.register('repo_file_raw', '/%(repo_name)s/raw/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
191 pyroutes.register('repo_file_download', '/%(repo_name)s/download/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
191 pyroutes.register('repo_file_download', '/%(repo_name)s/download/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
192 pyroutes.register('repo_file_download:legacy', '/%(repo_name)s/rawfile/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
192 pyroutes.register('repo_file_download:legacy', '/%(repo_name)s/rawfile/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
193 pyroutes.register('repo_file_history', '/%(repo_name)s/history/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
193 pyroutes.register('repo_file_history', '/%(repo_name)s/history/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
194 pyroutes.register('repo_file_authors', '/%(repo_name)s/authors/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
194 pyroutes.register('repo_file_authors', '/%(repo_name)s/authors/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
195 pyroutes.register('repo_files_remove_file', '/%(repo_name)s/remove_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
195 pyroutes.register('repo_files_remove_file', '/%(repo_name)s/remove_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
196 pyroutes.register('repo_files_delete_file', '/%(repo_name)s/delete_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
196 pyroutes.register('repo_files_delete_file', '/%(repo_name)s/delete_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
197 pyroutes.register('repo_files_edit_file', '/%(repo_name)s/edit_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
197 pyroutes.register('repo_files_edit_file', '/%(repo_name)s/edit_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
198 pyroutes.register('repo_files_update_file', '/%(repo_name)s/update_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
198 pyroutes.register('repo_files_update_file', '/%(repo_name)s/update_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
199 pyroutes.register('repo_files_add_file', '/%(repo_name)s/add_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
199 pyroutes.register('repo_files_add_file', '/%(repo_name)s/add_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
200 pyroutes.register('repo_files_create_file', '/%(repo_name)s/create_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
200 pyroutes.register('repo_files_create_file', '/%(repo_name)s/create_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
201 pyroutes.register('repo_refs_data', '/%(repo_name)s/refs-data', ['repo_name']);
201 pyroutes.register('repo_refs_data', '/%(repo_name)s/refs-data', ['repo_name']);
202 pyroutes.register('repo_refs_changelog_data', '/%(repo_name)s/refs-data-changelog', ['repo_name']);
202 pyroutes.register('repo_refs_changelog_data', '/%(repo_name)s/refs-data-changelog', ['repo_name']);
203 pyroutes.register('repo_stats', '/%(repo_name)s/repo_stats/%(commit_id)s', ['repo_name', 'commit_id']);
203 pyroutes.register('repo_stats', '/%(repo_name)s/repo_stats/%(commit_id)s', ['repo_name', 'commit_id']);
204 pyroutes.register('repo_changelog', '/%(repo_name)s/changelog', ['repo_name']);
204 pyroutes.register('repo_changelog', '/%(repo_name)s/changelog', ['repo_name']);
205 pyroutes.register('repo_changelog_file', '/%(repo_name)s/changelog/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
205 pyroutes.register('repo_changelog_file', '/%(repo_name)s/changelog/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
206 pyroutes.register('repo_changelog_elements', '/%(repo_name)s/changelog_elements', ['repo_name']);
206 pyroutes.register('repo_changelog_elements', '/%(repo_name)s/changelog_elements', ['repo_name']);
207 pyroutes.register('repo_changelog_elements_file', '/%(repo_name)s/changelog_elements/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
207 pyroutes.register('repo_changelog_elements_file', '/%(repo_name)s/changelog_elements/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
208 pyroutes.register('repo_compare_select', '/%(repo_name)s/compare', ['repo_name']);
208 pyroutes.register('repo_compare_select', '/%(repo_name)s/compare', ['repo_name']);
209 pyroutes.register('repo_compare', '/%(repo_name)s/compare/%(source_ref_type)s@%(source_ref)s...%(target_ref_type)s@%(target_ref)s', ['repo_name', 'source_ref_type', 'source_ref', 'target_ref_type', 'target_ref']);
209 pyroutes.register('repo_compare', '/%(repo_name)s/compare/%(source_ref_type)s@%(source_ref)s...%(target_ref_type)s@%(target_ref)s', ['repo_name', 'source_ref_type', 'source_ref', 'target_ref_type', 'target_ref']);
210 pyroutes.register('tags_home', '/%(repo_name)s/tags', ['repo_name']);
210 pyroutes.register('tags_home', '/%(repo_name)s/tags', ['repo_name']);
211 pyroutes.register('branches_home', '/%(repo_name)s/branches', ['repo_name']);
211 pyroutes.register('branches_home', '/%(repo_name)s/branches', ['repo_name']);
212 pyroutes.register('bookmarks_home', '/%(repo_name)s/bookmarks', ['repo_name']);
212 pyroutes.register('bookmarks_home', '/%(repo_name)s/bookmarks', ['repo_name']);
213 pyroutes.register('repo_fork_new', '/%(repo_name)s/fork', ['repo_name']);
213 pyroutes.register('repo_fork_new', '/%(repo_name)s/fork', ['repo_name']);
214 pyroutes.register('repo_fork_create', '/%(repo_name)s/fork/create', ['repo_name']);
214 pyroutes.register('repo_fork_create', '/%(repo_name)s/fork/create', ['repo_name']);
215 pyroutes.register('repo_forks_show_all', '/%(repo_name)s/forks', ['repo_name']);
215 pyroutes.register('repo_forks_show_all', '/%(repo_name)s/forks', ['repo_name']);
216 pyroutes.register('repo_forks_data', '/%(repo_name)s/forks/data', ['repo_name']);
216 pyroutes.register('repo_forks_data', '/%(repo_name)s/forks/data', ['repo_name']);
217 pyroutes.register('pullrequest_show', '/%(repo_name)s/pull-request/%(pull_request_id)s', ['repo_name', 'pull_request_id']);
217 pyroutes.register('pullrequest_show', '/%(repo_name)s/pull-request/%(pull_request_id)s', ['repo_name', 'pull_request_id']);
218 pyroutes.register('pullrequest_show_all', '/%(repo_name)s/pull-request', ['repo_name']);
218 pyroutes.register('pullrequest_show_all', '/%(repo_name)s/pull-request', ['repo_name']);
219 pyroutes.register('pullrequest_show_all_data', '/%(repo_name)s/pull-request-data', ['repo_name']);
219 pyroutes.register('pullrequest_show_all_data', '/%(repo_name)s/pull-request-data', ['repo_name']);
220 pyroutes.register('pullrequest_repo_refs', '/%(repo_name)s/pull-request/refs/%(target_repo_name)s', ['repo_name', 'target_repo_name']);
220 pyroutes.register('pullrequest_repo_refs', '/%(repo_name)s/pull-request/refs/%(target_repo_name)s', ['repo_name', 'target_repo_name']);
221 pyroutes.register('pullrequest_repo_destinations', '/%(repo_name)s/pull-request/repo-destinations', ['repo_name']);
221 pyroutes.register('pullrequest_repo_destinations', '/%(repo_name)s/pull-request/repo-destinations', ['repo_name']);
222 pyroutes.register('pullrequest_new', '/%(repo_name)s/pull-request/new', ['repo_name']);
222 pyroutes.register('pullrequest_new', '/%(repo_name)s/pull-request/new', ['repo_name']);
223 pyroutes.register('pullrequest_create', '/%(repo_name)s/pull-request/create', ['repo_name']);
223 pyroutes.register('pullrequest_create', '/%(repo_name)s/pull-request/create', ['repo_name']);
224 pyroutes.register('pullrequest_update', '/%(repo_name)s/pull-request/%(pull_request_id)s/update', ['repo_name', 'pull_request_id']);
224 pyroutes.register('pullrequest_update', '/%(repo_name)s/pull-request/%(pull_request_id)s/update', ['repo_name', 'pull_request_id']);
225 pyroutes.register('pullrequest_merge', '/%(repo_name)s/pull-request/%(pull_request_id)s/merge', ['repo_name', 'pull_request_id']);
225 pyroutes.register('pullrequest_merge', '/%(repo_name)s/pull-request/%(pull_request_id)s/merge', ['repo_name', 'pull_request_id']);
226 pyroutes.register('pullrequest_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/delete', ['repo_name', 'pull_request_id']);
226 pyroutes.register('pullrequest_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/delete', ['repo_name', 'pull_request_id']);
227 pyroutes.register('pullrequest_comment_create', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment', ['repo_name', 'pull_request_id']);
227 pyroutes.register('pullrequest_comment_create', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment', ['repo_name', 'pull_request_id']);
228 pyroutes.register('pullrequest_comment_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment/%(comment_id)s/delete', ['repo_name', 'pull_request_id', 'comment_id']);
228 pyroutes.register('pullrequest_comment_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment/%(comment_id)s/delete', ['repo_name', 'pull_request_id', 'comment_id']);
229 pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
229 pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
230 pyroutes.register('edit_repo_advanced', '/%(repo_name)s/settings/advanced', ['repo_name']);
230 pyroutes.register('edit_repo_advanced', '/%(repo_name)s/settings/advanced', ['repo_name']);
231 pyroutes.register('edit_repo_advanced_archive', '/%(repo_name)s/settings/advanced/archive', ['repo_name']);
231 pyroutes.register('edit_repo_advanced_archive', '/%(repo_name)s/settings/advanced/archive', ['repo_name']);
232 pyroutes.register('edit_repo_advanced_delete', '/%(repo_name)s/settings/advanced/delete', ['repo_name']);
232 pyroutes.register('edit_repo_advanced_delete', '/%(repo_name)s/settings/advanced/delete', ['repo_name']);
233 pyroutes.register('edit_repo_advanced_locking', '/%(repo_name)s/settings/advanced/locking', ['repo_name']);
233 pyroutes.register('edit_repo_advanced_locking', '/%(repo_name)s/settings/advanced/locking', ['repo_name']);
234 pyroutes.register('edit_repo_advanced_journal', '/%(repo_name)s/settings/advanced/journal', ['repo_name']);
234 pyroutes.register('edit_repo_advanced_journal', '/%(repo_name)s/settings/advanced/journal', ['repo_name']);
235 pyroutes.register('edit_repo_advanced_fork', '/%(repo_name)s/settings/advanced/fork', ['repo_name']);
235 pyroutes.register('edit_repo_advanced_fork', '/%(repo_name)s/settings/advanced/fork', ['repo_name']);
236 pyroutes.register('edit_repo_advanced_hooks', '/%(repo_name)s/settings/advanced/hooks', ['repo_name']);
236 pyroutes.register('edit_repo_advanced_hooks', '/%(repo_name)s/settings/advanced/hooks', ['repo_name']);
237 pyroutes.register('edit_repo_caches', '/%(repo_name)s/settings/caches', ['repo_name']);
237 pyroutes.register('edit_repo_caches', '/%(repo_name)s/settings/caches', ['repo_name']);
238 pyroutes.register('edit_repo_perms', '/%(repo_name)s/settings/permissions', ['repo_name']);
238 pyroutes.register('edit_repo_perms', '/%(repo_name)s/settings/permissions', ['repo_name']);
239 pyroutes.register('edit_repo_perms_branch', '/%(repo_name)s/settings/branch_permissions', ['repo_name']);
239 pyroutes.register('edit_repo_perms_branch', '/%(repo_name)s/settings/branch_permissions', ['repo_name']);
240 pyroutes.register('edit_repo_perms_branch_delete', '/%(repo_name)s/settings/branch_permissions/%(rule_id)s/delete', ['repo_name', 'rule_id']);
240 pyroutes.register('edit_repo_perms_branch_delete', '/%(repo_name)s/settings/branch_permissions/%(rule_id)s/delete', ['repo_name', 'rule_id']);
241 pyroutes.register('edit_repo_maintenance', '/%(repo_name)s/settings/maintenance', ['repo_name']);
241 pyroutes.register('edit_repo_maintenance', '/%(repo_name)s/settings/maintenance', ['repo_name']);
242 pyroutes.register('edit_repo_maintenance_execute', '/%(repo_name)s/settings/maintenance/execute', ['repo_name']);
242 pyroutes.register('edit_repo_maintenance_execute', '/%(repo_name)s/settings/maintenance/execute', ['repo_name']);
243 pyroutes.register('edit_repo_fields', '/%(repo_name)s/settings/fields', ['repo_name']);
243 pyroutes.register('edit_repo_fields', '/%(repo_name)s/settings/fields', ['repo_name']);
244 pyroutes.register('edit_repo_fields_create', '/%(repo_name)s/settings/fields/create', ['repo_name']);
244 pyroutes.register('edit_repo_fields_create', '/%(repo_name)s/settings/fields/create', ['repo_name']);
245 pyroutes.register('edit_repo_fields_delete', '/%(repo_name)s/settings/fields/%(field_id)s/delete', ['repo_name', 'field_id']);
245 pyroutes.register('edit_repo_fields_delete', '/%(repo_name)s/settings/fields/%(field_id)s/delete', ['repo_name', 'field_id']);
246 pyroutes.register('repo_edit_toggle_locking', '/%(repo_name)s/settings/toggle_locking', ['repo_name']);
246 pyroutes.register('repo_edit_toggle_locking', '/%(repo_name)s/settings/toggle_locking', ['repo_name']);
247 pyroutes.register('edit_repo_remote', '/%(repo_name)s/settings/remote', ['repo_name']);
247 pyroutes.register('edit_repo_remote', '/%(repo_name)s/settings/remote', ['repo_name']);
248 pyroutes.register('edit_repo_remote_pull', '/%(repo_name)s/settings/remote/pull', ['repo_name']);
248 pyroutes.register('edit_repo_remote_pull', '/%(repo_name)s/settings/remote/pull', ['repo_name']);
249 pyroutes.register('edit_repo_remote_push', '/%(repo_name)s/settings/remote/push', ['repo_name']);
249 pyroutes.register('edit_repo_remote_push', '/%(repo_name)s/settings/remote/push', ['repo_name']);
250 pyroutes.register('edit_repo_statistics', '/%(repo_name)s/settings/statistics', ['repo_name']);
250 pyroutes.register('edit_repo_statistics', '/%(repo_name)s/settings/statistics', ['repo_name']);
251 pyroutes.register('edit_repo_statistics_reset', '/%(repo_name)s/settings/statistics/update', ['repo_name']);
251 pyroutes.register('edit_repo_statistics_reset', '/%(repo_name)s/settings/statistics/update', ['repo_name']);
252 pyroutes.register('edit_repo_issuetracker', '/%(repo_name)s/settings/issue_trackers', ['repo_name']);
252 pyroutes.register('edit_repo_issuetracker', '/%(repo_name)s/settings/issue_trackers', ['repo_name']);
253 pyroutes.register('edit_repo_issuetracker_test', '/%(repo_name)s/settings/issue_trackers/test', ['repo_name']);
253 pyroutes.register('edit_repo_issuetracker_test', '/%(repo_name)s/settings/issue_trackers/test', ['repo_name']);
254 pyroutes.register('edit_repo_issuetracker_delete', '/%(repo_name)s/settings/issue_trackers/delete', ['repo_name']);
254 pyroutes.register('edit_repo_issuetracker_delete', '/%(repo_name)s/settings/issue_trackers/delete', ['repo_name']);
255 pyroutes.register('edit_repo_issuetracker_update', '/%(repo_name)s/settings/issue_trackers/update', ['repo_name']);
255 pyroutes.register('edit_repo_issuetracker_update', '/%(repo_name)s/settings/issue_trackers/update', ['repo_name']);
256 pyroutes.register('edit_repo_vcs', '/%(repo_name)s/settings/vcs', ['repo_name']);
256 pyroutes.register('edit_repo_vcs', '/%(repo_name)s/settings/vcs', ['repo_name']);
257 pyroutes.register('edit_repo_vcs_update', '/%(repo_name)s/settings/vcs/update', ['repo_name']);
257 pyroutes.register('edit_repo_vcs_update', '/%(repo_name)s/settings/vcs/update', ['repo_name']);
258 pyroutes.register('edit_repo_vcs_svn_pattern_delete', '/%(repo_name)s/settings/vcs/svn_pattern/delete', ['repo_name']);
258 pyroutes.register('edit_repo_vcs_svn_pattern_delete', '/%(repo_name)s/settings/vcs/svn_pattern/delete', ['repo_name']);
259 pyroutes.register('repo_reviewers', '/%(repo_name)s/settings/review/rules', ['repo_name']);
259 pyroutes.register('repo_reviewers', '/%(repo_name)s/settings/review/rules', ['repo_name']);
260 pyroutes.register('repo_default_reviewers_data', '/%(repo_name)s/settings/review/default-reviewers', ['repo_name']);
260 pyroutes.register('repo_default_reviewers_data', '/%(repo_name)s/settings/review/default-reviewers', ['repo_name']);
261 pyroutes.register('repo_automation', '/%(repo_name)s/settings/automation', ['repo_name']);
261 pyroutes.register('repo_automation', '/%(repo_name)s/settings/automation', ['repo_name']);
262 pyroutes.register('edit_repo_strip', '/%(repo_name)s/settings/strip', ['repo_name']);
262 pyroutes.register('edit_repo_strip', '/%(repo_name)s/settings/strip', ['repo_name']);
263 pyroutes.register('strip_check', '/%(repo_name)s/settings/strip_check', ['repo_name']);
263 pyroutes.register('strip_check', '/%(repo_name)s/settings/strip_check', ['repo_name']);
264 pyroutes.register('strip_execute', '/%(repo_name)s/settings/strip_execute', ['repo_name']);
264 pyroutes.register('strip_execute', '/%(repo_name)s/settings/strip_execute', ['repo_name']);
265 pyroutes.register('edit_repo_audit_logs', '/%(repo_name)s/settings/audit_logs', ['repo_name']);
265 pyroutes.register('edit_repo_audit_logs', '/%(repo_name)s/settings/audit_logs', ['repo_name']);
266 pyroutes.register('rss_feed_home', '/%(repo_name)s/feed/rss', ['repo_name']);
266 pyroutes.register('rss_feed_home', '/%(repo_name)s/feed/rss', ['repo_name']);
267 pyroutes.register('atom_feed_home', '/%(repo_name)s/feed/atom', ['repo_name']);
267 pyroutes.register('atom_feed_home', '/%(repo_name)s/feed/atom', ['repo_name']);
268 pyroutes.register('repo_summary', '/%(repo_name)s', ['repo_name']);
268 pyroutes.register('repo_summary', '/%(repo_name)s', ['repo_name']);
269 pyroutes.register('repo_summary_slash', '/%(repo_name)s/', ['repo_name']);
269 pyroutes.register('repo_summary_slash', '/%(repo_name)s/', ['repo_name']);
270 pyroutes.register('edit_repo_group', '/%(repo_group_name)s/_edit', ['repo_group_name']);
270 pyroutes.register('edit_repo_group', '/%(repo_group_name)s/_edit', ['repo_group_name']);
271 pyroutes.register('edit_repo_group_advanced', '/%(repo_group_name)s/_settings/advanced', ['repo_group_name']);
271 pyroutes.register('edit_repo_group_advanced', '/%(repo_group_name)s/_settings/advanced', ['repo_group_name']);
272 pyroutes.register('edit_repo_group_advanced_delete', '/%(repo_group_name)s/_settings/advanced/delete', ['repo_group_name']);
272 pyroutes.register('edit_repo_group_advanced_delete', '/%(repo_group_name)s/_settings/advanced/delete', ['repo_group_name']);
273 pyroutes.register('edit_repo_group_perms', '/%(repo_group_name)s/_settings/permissions', ['repo_group_name']);
273 pyroutes.register('edit_repo_group_perms', '/%(repo_group_name)s/_settings/permissions', ['repo_group_name']);
274 pyroutes.register('edit_repo_group_perms_update', '/%(repo_group_name)s/_settings/permissions/update', ['repo_group_name']);
274 pyroutes.register('edit_repo_group_perms_update', '/%(repo_group_name)s/_settings/permissions/update', ['repo_group_name']);
275 pyroutes.register('repo_group_home', '/%(repo_group_name)s', ['repo_group_name']);
275 pyroutes.register('repo_group_home', '/%(repo_group_name)s', ['repo_group_name']);
276 pyroutes.register('repo_group_home_slash', '/%(repo_group_name)s/', ['repo_group_name']);
276 pyroutes.register('repo_group_home_slash', '/%(repo_group_name)s/', ['repo_group_name']);
277 pyroutes.register('user_group_members_data', '/_admin/user_groups/%(user_group_id)s/members', ['user_group_id']);
277 pyroutes.register('user_group_members_data', '/_admin/user_groups/%(user_group_id)s/members', ['user_group_id']);
278 pyroutes.register('edit_user_group_perms_summary', '/_admin/user_groups/%(user_group_id)s/edit/permissions_summary', ['user_group_id']);
278 pyroutes.register('edit_user_group_perms_summary', '/_admin/user_groups/%(user_group_id)s/edit/permissions_summary', ['user_group_id']);
279 pyroutes.register('edit_user_group_perms_summary_json', '/_admin/user_groups/%(user_group_id)s/edit/permissions_summary/json', ['user_group_id']);
279 pyroutes.register('edit_user_group_perms_summary_json', '/_admin/user_groups/%(user_group_id)s/edit/permissions_summary/json', ['user_group_id']);
280 pyroutes.register('edit_user_group', '/_admin/user_groups/%(user_group_id)s/edit', ['user_group_id']);
280 pyroutes.register('edit_user_group', '/_admin/user_groups/%(user_group_id)s/edit', ['user_group_id']);
281 pyroutes.register('user_groups_update', '/_admin/user_groups/%(user_group_id)s/update', ['user_group_id']);
281 pyroutes.register('user_groups_update', '/_admin/user_groups/%(user_group_id)s/update', ['user_group_id']);
282 pyroutes.register('edit_user_group_global_perms', '/_admin/user_groups/%(user_group_id)s/edit/global_permissions', ['user_group_id']);
282 pyroutes.register('edit_user_group_global_perms', '/_admin/user_groups/%(user_group_id)s/edit/global_permissions', ['user_group_id']);
283 pyroutes.register('edit_user_group_global_perms_update', '/_admin/user_groups/%(user_group_id)s/edit/global_permissions/update', ['user_group_id']);
283 pyroutes.register('edit_user_group_global_perms_update', '/_admin/user_groups/%(user_group_id)s/edit/global_permissions/update', ['user_group_id']);
284 pyroutes.register('edit_user_group_perms', '/_admin/user_groups/%(user_group_id)s/edit/permissions', ['user_group_id']);
284 pyroutes.register('edit_user_group_perms', '/_admin/user_groups/%(user_group_id)s/edit/permissions', ['user_group_id']);
285 pyroutes.register('edit_user_group_perms_update', '/_admin/user_groups/%(user_group_id)s/edit/permissions/update', ['user_group_id']);
285 pyroutes.register('edit_user_group_perms_update', '/_admin/user_groups/%(user_group_id)s/edit/permissions/update', ['user_group_id']);
286 pyroutes.register('edit_user_group_advanced', '/_admin/user_groups/%(user_group_id)s/edit/advanced', ['user_group_id']);
286 pyroutes.register('edit_user_group_advanced', '/_admin/user_groups/%(user_group_id)s/edit/advanced', ['user_group_id']);
287 pyroutes.register('edit_user_group_advanced_sync', '/_admin/user_groups/%(user_group_id)s/edit/advanced/sync', ['user_group_id']);
287 pyroutes.register('edit_user_group_advanced_sync', '/_admin/user_groups/%(user_group_id)s/edit/advanced/sync', ['user_group_id']);
288 pyroutes.register('user_groups_delete', '/_admin/user_groups/%(user_group_id)s/delete', ['user_group_id']);
288 pyroutes.register('user_groups_delete', '/_admin/user_groups/%(user_group_id)s/delete', ['user_group_id']);
289 pyroutes.register('search', '/_admin/search', []);
289 pyroutes.register('search', '/_admin/search', []);
290 pyroutes.register('search_repo', '/%(repo_name)s/search', ['repo_name']);
290 pyroutes.register('search_repo', '/%(repo_name)s/search', ['repo_name']);
291 pyroutes.register('user_profile', '/_profiles/%(username)s', ['username']);
291 pyroutes.register('user_profile', '/_profiles/%(username)s', ['username']);
292 pyroutes.register('user_group_profile', '/_profile_user_group/%(user_group_name)s', ['user_group_name']);
292 pyroutes.register('user_group_profile', '/_profile_user_group/%(user_group_name)s', ['user_group_name']);
293 pyroutes.register('my_account_profile', '/_admin/my_account/profile', []);
293 pyroutes.register('my_account_profile', '/_admin/my_account/profile', []);
294 pyroutes.register('my_account_edit', '/_admin/my_account/edit', []);
294 pyroutes.register('my_account_edit', '/_admin/my_account/edit', []);
295 pyroutes.register('my_account_update', '/_admin/my_account/update', []);
295 pyroutes.register('my_account_update', '/_admin/my_account/update', []);
296 pyroutes.register('my_account_password', '/_admin/my_account/password', []);
296 pyroutes.register('my_account_password', '/_admin/my_account/password', []);
297 pyroutes.register('my_account_password_update', '/_admin/my_account/password/update', []);
297 pyroutes.register('my_account_password_update', '/_admin/my_account/password/update', []);
298 pyroutes.register('my_account_auth_tokens', '/_admin/my_account/auth_tokens', []);
298 pyroutes.register('my_account_auth_tokens', '/_admin/my_account/auth_tokens', []);
299 pyroutes.register('my_account_auth_tokens_add', '/_admin/my_account/auth_tokens/new', []);
299 pyroutes.register('my_account_auth_tokens_add', '/_admin/my_account/auth_tokens/new', []);
300 pyroutes.register('my_account_auth_tokens_delete', '/_admin/my_account/auth_tokens/delete', []);
300 pyroutes.register('my_account_auth_tokens_delete', '/_admin/my_account/auth_tokens/delete', []);
301 pyroutes.register('my_account_ssh_keys', '/_admin/my_account/ssh_keys', []);
301 pyroutes.register('my_account_ssh_keys', '/_admin/my_account/ssh_keys', []);
302 pyroutes.register('my_account_ssh_keys_generate', '/_admin/my_account/ssh_keys/generate', []);
302 pyroutes.register('my_account_ssh_keys_generate', '/_admin/my_account/ssh_keys/generate', []);
303 pyroutes.register('my_account_ssh_keys_add', '/_admin/my_account/ssh_keys/new', []);
303 pyroutes.register('my_account_ssh_keys_add', '/_admin/my_account/ssh_keys/new', []);
304 pyroutes.register('my_account_ssh_keys_delete', '/_admin/my_account/ssh_keys/delete', []);
304 pyroutes.register('my_account_ssh_keys_delete', '/_admin/my_account/ssh_keys/delete', []);
305 pyroutes.register('my_account_user_group_membership', '/_admin/my_account/user_group_membership', []);
305 pyroutes.register('my_account_user_group_membership', '/_admin/my_account/user_group_membership', []);
306 pyroutes.register('my_account_emails', '/_admin/my_account/emails', []);
306 pyroutes.register('my_account_emails', '/_admin/my_account/emails', []);
307 pyroutes.register('my_account_emails_add', '/_admin/my_account/emails/new', []);
307 pyroutes.register('my_account_emails_add', '/_admin/my_account/emails/new', []);
308 pyroutes.register('my_account_emails_delete', '/_admin/my_account/emails/delete', []);
308 pyroutes.register('my_account_emails_delete', '/_admin/my_account/emails/delete', []);
309 pyroutes.register('my_account_repos', '/_admin/my_account/repos', []);
309 pyroutes.register('my_account_repos', '/_admin/my_account/repos', []);
310 pyroutes.register('my_account_watched', '/_admin/my_account/watched', []);
310 pyroutes.register('my_account_watched', '/_admin/my_account/watched', []);
311 pyroutes.register('my_account_perms', '/_admin/my_account/perms', []);
311 pyroutes.register('my_account_perms', '/_admin/my_account/perms', []);
312 pyroutes.register('my_account_notifications', '/_admin/my_account/notifications', []);
312 pyroutes.register('my_account_notifications', '/_admin/my_account/notifications', []);
313 pyroutes.register('my_account_notifications_toggle_visibility', '/_admin/my_account/toggle_visibility', []);
313 pyroutes.register('my_account_notifications_toggle_visibility', '/_admin/my_account/toggle_visibility', []);
314 pyroutes.register('my_account_pullrequests', '/_admin/my_account/pull_requests', []);
314 pyroutes.register('my_account_pullrequests', '/_admin/my_account/pull_requests', []);
315 pyroutes.register('my_account_pullrequests_data', '/_admin/my_account/pull_requests/data', []);
315 pyroutes.register('my_account_pullrequests_data', '/_admin/my_account/pull_requests/data', []);
316 pyroutes.register('notifications_show_all', '/_admin/notifications', []);
316 pyroutes.register('notifications_show_all', '/_admin/notifications', []);
317 pyroutes.register('notifications_mark_all_read', '/_admin/notifications/mark_all_read', []);
317 pyroutes.register('notifications_mark_all_read', '/_admin/notifications/mark_all_read', []);
318 pyroutes.register('notifications_show', '/_admin/notifications/%(notification_id)s', ['notification_id']);
318 pyroutes.register('notifications_show', '/_admin/notifications/%(notification_id)s', ['notification_id']);
319 pyroutes.register('notifications_update', '/_admin/notifications/%(notification_id)s/update', ['notification_id']);
319 pyroutes.register('notifications_update', '/_admin/notifications/%(notification_id)s/update', ['notification_id']);
320 pyroutes.register('notifications_delete', '/_admin/notifications/%(notification_id)s/delete', ['notification_id']);
320 pyroutes.register('notifications_delete', '/_admin/notifications/%(notification_id)s/delete', ['notification_id']);
321 pyroutes.register('my_account_notifications_test_channelstream', '/_admin/my_account/test_channelstream', []);
321 pyroutes.register('my_account_notifications_test_channelstream', '/_admin/my_account/test_channelstream', []);
322 pyroutes.register('gists_show', '/_admin/gists', []);
322 pyroutes.register('gists_show', '/_admin/gists', []);
323 pyroutes.register('gists_new', '/_admin/gists/new', []);
323 pyroutes.register('gists_new', '/_admin/gists/new', []);
324 pyroutes.register('gists_create', '/_admin/gists/create', []);
324 pyroutes.register('gists_create', '/_admin/gists/create', []);
325 pyroutes.register('gist_show', '/_admin/gists/%(gist_id)s', ['gist_id']);
325 pyroutes.register('gist_show', '/_admin/gists/%(gist_id)s', ['gist_id']);
326 pyroutes.register('gist_delete', '/_admin/gists/%(gist_id)s/delete', ['gist_id']);
326 pyroutes.register('gist_delete', '/_admin/gists/%(gist_id)s/delete', ['gist_id']);
327 pyroutes.register('gist_edit', '/_admin/gists/%(gist_id)s/edit', ['gist_id']);
327 pyroutes.register('gist_edit', '/_admin/gists/%(gist_id)s/edit', ['gist_id']);
328 pyroutes.register('gist_edit_check_revision', '/_admin/gists/%(gist_id)s/edit/check_revision', ['gist_id']);
328 pyroutes.register('gist_edit_check_revision', '/_admin/gists/%(gist_id)s/edit/check_revision', ['gist_id']);
329 pyroutes.register('gist_update', '/_admin/gists/%(gist_id)s/update', ['gist_id']);
329 pyroutes.register('gist_update', '/_admin/gists/%(gist_id)s/update', ['gist_id']);
330 pyroutes.register('gist_show_rev', '/_admin/gists/%(gist_id)s/%(revision)s', ['gist_id', 'revision']);
330 pyroutes.register('gist_show_rev', '/_admin/gists/%(gist_id)s/%(revision)s', ['gist_id', 'revision']);
331 pyroutes.register('gist_show_formatted', '/_admin/gists/%(gist_id)s/%(revision)s/%(format)s', ['gist_id', 'revision', 'format']);
331 pyroutes.register('gist_show_formatted', '/_admin/gists/%(gist_id)s/%(revision)s/%(format)s', ['gist_id', 'revision', 'format']);
332 pyroutes.register('gist_show_formatted_path', '/_admin/gists/%(gist_id)s/%(revision)s/%(format)s/%(f_path)s', ['gist_id', 'revision', 'format', 'f_path']);
332 pyroutes.register('gist_show_formatted_path', '/_admin/gists/%(gist_id)s/%(revision)s/%(format)s/%(f_path)s', ['gist_id', 'revision', 'format', 'f_path']);
333 pyroutes.register('debug_style_home', '/_admin/debug_style', []);
333 pyroutes.register('debug_style_home', '/_admin/debug_style', []);
334 pyroutes.register('debug_style_template', '/_admin/debug_style/t/%(t_path)s', ['t_path']);
334 pyroutes.register('debug_style_template', '/_admin/debug_style/t/%(t_path)s', ['t_path']);
335 pyroutes.register('apiv2', '/_admin/api', []);
335 pyroutes.register('apiv2', '/_admin/api', []);
336 }
336 }
General Comments 0
You need to be logged in to leave comments. Login now