##// END OF EJS Templates
merge with rc1
marcink -
r3700:3563bb7b merge default
parent child Browse files
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -0,0 +1,11 b''
1 [default]
2 api_url = http://your.rhodecode.server:5000/_admin/api
3 api_user = admin
4 api_key = XXXXXXXXXXXX
5
6 ldap_uri = ldap://your.ldap.server:389
7 ldap_user = cn=rhodecode,ou=binders,dc=linaro,dc=org
8 ldap_key = XXXXXXXXX
9 base_dn = dc=linaro,dc=org
10
11 sync_users = True No newline at end of file
@@ -0,0 +1,237 b''
1 # This program is free software: you can redistribute it and/or modify
2 # it under the terms of the GNU General Public License as published by
3 # the Free Software Foundation, either version 3 of the License, or
4 # (at your option) any later version.
5 #
6 # This program is distributed in the hope that it will be useful,
7 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # GNU General Public License for more details.
10 #
11 # You should have received a copy of the GNU General Public License
12 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13
14 import ldap
15 import urllib2
16 import uuid
17 import json
18
19 from ConfigParser import ConfigParser
20
21 config = ConfigParser()
22 config.read('ldap_sync.conf')
23
24
25 class InvalidResponseIDError(Exception):
26 """ Request and response don't have the same UUID. """
27
28
29 class RhodecodeResponseError(Exception):
30 """ Response has an error, something went wrong with request execution. """
31
32
33 class UserAlreadyInGroupError(Exception):
34 """ User is already a member of the target group. """
35
36
37 class UserNotInGroupError(Exception):
38 """ User is not a member of the target group. """
39
40
41 class RhodecodeAPI():
42
43 def __init__(self, url, key):
44 self.url = url
45 self.key = key
46
47 def get_api_data(self, uid, method, args):
48 """Prepare dict for API post."""
49 return {
50 "id": uid,
51 "api_key": self.key,
52 "method": method,
53 "args": args
54 }
55
56 def rhodecode_api_post(self, method, args):
57 """Send a generic API post to Rhodecode.
58
59 This will generate the UUID for validation check after the
60 response is returned. Handle errors and get the result back.
61 """
62 uid = str(uuid.uuid1())
63 data = self.get_api_data(uid, method, args)
64
65 data = json.dumps(data)
66 headers = {'content-type': 'text/plain'}
67 req = urllib2.Request(self.url, data, headers)
68
69 response = urllib2.urlopen(req)
70 response = json.load(response)
71
72 if uid != response["id"]:
73 raise InvalidResponseIDError("UUID does not match.")
74
75 if response["error"] != None:
76 raise RhodecodeResponseError(response["error"])
77
78 return response["result"]
79
80 def create_group(self, name, active=True):
81 """Create the Rhodecode user group."""
82 args = {
83 "group_name": name,
84 "active": str(active)
85 }
86 self.rhodecode_api_post("create_users_group", args)
87
88 def add_membership(self, group, username):
89 """Add specific user to a group."""
90 args = {
91 "usersgroupid": group,
92 "userid": username
93 }
94 result = self.rhodecode_api_post("add_user_to_users_group", args)
95 if not result["success"]:
96 raise UserAlreadyInGroupError("User %s already in group %s." %
97 (username, group))
98
99 def remove_membership(self, group, username):
100 """Remove specific user from a group."""
101 args = {
102 "usersgroupid": group,
103 "userid": username
104 }
105 result = self.rhodecode_api_post("remove_user_from_users_group", args)
106 if not result["success"]:
107 raise UserNotInGroupError("User %s not in group %s." %
108 (username, group))
109
110 def get_group_members(self, name):
111 """Get the list of member usernames from a user group."""
112 args = {"usersgroupid": name}
113 members = self.rhodecode_api_post("get_users_group", args)['members']
114 member_list = []
115 for member in members:
116 member_list.append(member["username"])
117 return member_list
118
119 def get_group(self, name):
120 """Return group info."""
121 args = {"usersgroupid": name}
122 return self.rhodecode_api_post("get_users_group", args)
123
124 def get_user(self, username):
125 """Return user info."""
126 args = {"userid": username}
127 return self.rhodecode_api_post("get_user", args)
128
129
130 class LdapClient():
131
132 def __init__(self, uri, user, key, base_dn):
133 self.client = ldap.initialize(uri, trace_level=0)
134 self.client.set_option(ldap.OPT_REFERRALS, 0)
135 self.client.simple_bind(user, key)
136 self.base_dn = base_dn
137
138 def __del__(self):
139 self.client.unbind()
140
141 def get_groups(self):
142 """Get all the groups in form of dict {group_name: group_info,...}."""
143 searchFilter = "objectClass=groupOfUniqueNames"
144 result = self.client.search_s(self.base_dn, ldap.SCOPE_SUBTREE,
145 searchFilter)
146
147 groups = {}
148 for group in result:
149 groups[group[1]['cn'][0]] = group[1]
150
151 return groups
152
153 def get_group_users(self, groups, group):
154 """Returns all the users belonging to a single group.
155
156 Based on the list of groups and memberships, returns all the
157 users belonging to a single group, searching recursively.
158 """
159 users = []
160 for member in groups[group]["uniqueMember"]:
161 member = self.parse_member_string(member)
162 if member[0] == "uid":
163 users.append(member[1])
164 elif member[0] == "cn":
165 users += self.get_group_users(groups, member[1])
166
167 return users
168
169 def parse_member_string(self, member):
170 """Parses the member string and returns a touple of type and name.
171
172 Unique member can be either user or group. Users will have 'uid' as
173 prefix while groups will have 'cn'.
174 """
175 member = member.split(",")[0]
176 return member.split('=')
177
178
179 class LdapSync(object):
180
181 def __init__(self):
182 self.ldap_client = LdapClient(config.get("default", "ldap_uri"),
183 config.get("default", "ldap_user"),
184 config.get("default", "ldap_key"),
185 config.get("default", "base_dn"))
186 self.rhodocode_api = RhodecodeAPI(config.get("default", "api_url"),
187 config.get("default", "api_key"))
188
189 def update_groups_from_ldap(self):
190 """Add all the groups from LDAP to Rhodecode."""
191 added = existing = 0
192 groups = self.ldap_client.get_groups()
193 for group in groups:
194 try:
195 self.rhodecode_api.create_group(group)
196 added += 1
197 except Exception:
198 existing += 1
199
200 return added, existing
201
202 def update_memberships_from_ldap(self, group):
203 """Update memberships in rhodecode based on the LDAP groups."""
204 groups = self.ldap_client.get_groups()
205 group_users = self.ldap_client.get_group_users(groups, group)
206
207 # Delete memberships first from each group which are not part
208 # of the group any more.
209 rhodecode_members = self.rhodecode_api.get_group_members(group)
210 for rhodecode_member in rhodecode_members:
211 if rhodecode_member not in group_users:
212 try:
213 self.rhodocode_api.remove_membership(group,
214 rhodecode_member)
215 except UserNotInGroupError:
216 pass
217
218 # Add memberships.
219 for member in group_users:
220 try:
221 self.rhodecode_api.add_membership(group, member)
222 except UserAlreadyInGroupError:
223 # TODO: handle somehow maybe..
224 pass
225
226
227 if __name__ == '__main__':
228 sync = LdapSync()
229 print sync.update_groups_from_ldap()
230
231 for gr in sync.ldap_client.get_groups():
232 # TODO: exception when user does not exist during add membership...
233 # How should we handle this.. Either sync users as well at this step,
234 # or just ignore those who don't exist. If we want the second case,
235 # we need to find a way to recognize the right exception (we always get
236 # RhodecodeResponseError with no error code so maybe by return msg (?)
237 sync.update_memberships_from_ldap(gr)
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -33,3 +33,4 b' List of contributors to RhodeCode projec'
33 Philip Jameson <philip.j@hostdime.com>
33 Philip Jameson <philip.j@hostdime.com>
34 Mads Kiilerich <madski@unity3d.com>
34 Mads Kiilerich <madski@unity3d.com>
35 Dan Sheridan <djs@adelard.com>
35 Dan Sheridan <djs@adelard.com>
36 Dennis Brakhane <brakhane@googlemail.com>
@@ -75,7 +75,7 b' RhodeCode Features'
75 - Supports http/https, LDAP, AD, proxy-pass authentication.
75 - Supports http/https, LDAP, AD, proxy-pass authentication.
76 - Full permissions (private/read/write/admin) together with IP restrictions for each repository,
76 - Full permissions (private/read/write/admin) together with IP restrictions for each repository,
77 additional explicit forking and repository creation permissions.
77 additional explicit forking and repository creation permissions.
78 - Users groups for easier permission management
78 - User groups for easier permission management
79 - Repository groups let you group repos and manage them easier.
79 - Repository groups let you group repos and manage them easier.
80 - Users can fork other users repos, and compare them at any time.
80 - Users can fork other users repos, and compare them at any time.
81 - Integrates easily with other systems, with custom created mappers you can connect it to almost
81 - Integrates easily with other systems, with custom created mappers you can connect it to almost
@@ -25,59 +25,92 b' pdebug = false'
25 #smtp_port =
25 #smtp_port =
26 #smtp_use_tls = false
26 #smtp_use_tls = false
27 #smtp_use_ssl = true
27 #smtp_use_ssl = true
28 # Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
28 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
29 #smtp_auth =
29 #smtp_auth =
30
30
31 [server:main]
31 [server:main]
32 ## PASTE
32 ## PASTE
33 ##nr of threads to spawn
33 ## nr of threads to spawn
34 #threadpool_workers = 5
34 #threadpool_workers = 5
35
35
36 ##max request before thread respawn
36 ## max request before thread respawn
37 #threadpool_max_requests = 10
37 #threadpool_max_requests = 10
38
38
39 ##option to use threads of process
39 ## option to use threads of process
40 #use_threadpool = true
40 #use_threadpool = true
41
41
42 #use = egg:Paste#http
42 #use = egg:Paste#http
43
43
44 #WAITRESS
44 ## WAITRESS
45 threads = 5
45 threads = 5
46 ## 100GB
47 max_request_body_size = 107374182400
46 use = egg:waitress#main
48 use = egg:waitress#main
47
49
48 host = 0.0.0.0
50 host = 0.0.0.0
49 port = 5000
51 port = 5000
50
52
51 [filter:proxy-prefix]
53 ## prefix middleware for rc
52 # prefix middleware for rc
54 #[filter:proxy-prefix]
53 use = egg:PasteDeploy#prefix
55 #use = egg:PasteDeploy#prefix
54 prefix = /<your-prefix>
56 #prefix = /<your-prefix>
55
57
56 [app:main]
58 [app:main]
57 use = egg:rhodecode
59 use = egg:rhodecode
60 ## enable proxy prefix middleware
58 #filter-with = proxy-prefix
61 #filter-with = proxy-prefix
62
59 full_stack = true
63 full_stack = true
60 static_files = true
64 static_files = true
61 # Optional Languages
65 ## Optional Languages
62 # en, fr, ja, pt_BR, zh_CN, zh_TW, pl
66 ## en, fr, ja, pt_BR, zh_CN, zh_TW, pl
63 lang = en
67 lang = en
64 cache_dir = %(here)s/data
68 cache_dir = %(here)s/data
65 index_dir = %(here)s/data/index
69 index_dir = %(here)s/data/index
66 app_instance_uuid = rc-develop
70
71 ## uncomment and set this path to use archive download cache
72 #archive_cache_dir = /tmp/tarballcache
73
74 ## change this to unique ID for security
75 app_instance_uuid = rc-production
76
77 ## cut off limit for large diffs (size in bytes)
67 cut_off_limit = 256000
78 cut_off_limit = 256000
68 vcs_full_cache = True
79
80 ## use cache version of scm repo everywhere
81 vcs_full_cache = true
82
83 ## force https in RhodeCode, fixes https redirects, assumes it's always https
69 force_https = false
84 force_https = false
85
86 ## use Strict-Transport-Security headers
87 use_htsts = false
88
89 ## number of commits stats will parse on each iteration
70 commit_parse_limit = 25
90 commit_parse_limit = 25
71 # number of items displayed in lightweight dashboard before paginating
91
92 ## number of items displayed in lightweight dashboard before paginating is shown
72 dashboard_items = 100
93 dashboard_items = 100
94
95 ## use gravatar service to display avatars
73 use_gravatar = true
96 use_gravatar = true
74
97
98 ## path to git executable
99 git_path = git
100
101 ## git rev filter option, --all is the default filter, if you need to
102 ## hide all refs in changelog switch this to --branches --tags
103 git_rev_filter=--all
104
75 ## RSS feed options
105 ## RSS feed options
76
77 rss_cut_off_limit = 256000
106 rss_cut_off_limit = 256000
78 rss_items_per_page = 10
107 rss_items_per_page = 10
79 rss_include_diff = false
108 rss_include_diff = false
80
109
110 ## options for showing and identifying changesets
111 show_sha_length = 12
112 show_revision_number = true
113
81
114
82 ## alternative_gravatar_url allows you to use your own avatar server application
115 ## alternative_gravatar_url allows you to use your own avatar server application
83 ## the following parts of the URL will be replaced
116 ## the following parts of the URL will be replaced
@@ -89,8 +122,11 b' rss_include_diff = false'
89 #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
122 #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
90 #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
123 #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
91
124
125
126 ## container auth options
92 container_auth_enabled = false
127 container_auth_enabled = false
93 proxypass_auth_enabled = false
128 proxypass_auth_enabled = false
129
94 ## default encoding used to convert from and to unicode
130 ## default encoding used to convert from and to unicode
95 ## can be also a comma seperated list of encoding in case of mixed encodings
131 ## can be also a comma seperated list of encoding in case of mixed encodings
96 default_encoding = utf8
132 default_encoding = utf8
@@ -146,6 +182,11 b' instance_id ='
146 ## handling that. Set this variable to 403 to return HTTPForbidden
182 ## handling that. Set this variable to 403 to return HTTPForbidden
147 auth_ret_code =
183 auth_ret_code =
148
184
185 ## locking return code. When repository is locked return this HTTP code. 2XX
186 ## codes don't break the transactions while 4XX codes do
187 lock_ret_code = 423
188
189
149 ####################################
190 ####################################
150 ### CELERY CONFIG ####
191 ### CELERY CONFIG ####
151 ####################################
192 ####################################
@@ -170,7 +211,7 b' celeryd.concurrency = 2'
170 celeryd.log.level = debug
211 celeryd.log.level = debug
171 celeryd.max.tasks.per.child = 1
212 celeryd.max.tasks.per.child = 1
172
213
173 #tasks will never be sent to the queue, but executed locally instead.
214 ## tasks will never be sent to the queue, but executed locally instead.
174 celery.always.eager = false
215 celery.always.eager = false
175
216
176 ####################################
217 ####################################
@@ -226,18 +267,19 b' beaker.cache.sql_cache_long.key_length ='
226
267
227
268
228 beaker.session.key = rhodecode
269 beaker.session.key = rhodecode
229 ## secure cookie requires AES python libraries ##
270 ## secure cookie requires AES python libraries
230 #beaker.session.encrypt_key = g654dcno0-9873jhgfreyu
271 #beaker.session.encrypt_key = <key_for_encryption>
231 #beaker.session.validate_key = 9712sds2212c--zxc123
272 #beaker.session.validate_key = <validation_key>
273
232 ## sets session as invalid if it haven't been accessed for given amount of time
274 ## sets session as invalid if it haven't been accessed for given amount of time
233 beaker.session.timeout = 2592000
275 beaker.session.timeout = 2592000
234 beaker.session.httponly = true
276 beaker.session.httponly = true
235 #beaker.session.cookie_path = /<your-prefix>
277 #beaker.session.cookie_path = /<your-prefix>
236
278
237 ## uncomment for https secure cookie ##
279 ## uncomment for https secure cookie
238 beaker.session.secure = false
280 beaker.session.secure = false
239
281
240 ## auto save the session to not to use .save() ##
282 ## auto save the session to not to use .save()
241 beaker.session.auto = False
283 beaker.session.auto = False
242
284
243 ## default cookie expiration time in seconds `true` expire at browser close ##
285 ## default cookie expiration time in seconds `true` expire at browser close ##
@@ -252,57 +294,57 b' beaker.session.auto = False'
252 ### [errormator] ###
294 ### [errormator] ###
253 ####################
295 ####################
254
296
255 # Errormator is tailored to work with RhodeCode, see
297 ## Errormator is tailored to work with RhodeCode, see
256 # http://errormator.com for details how to obtain an account
298 ## http://errormator.com for details how to obtain an account
257 # you must install python package `errormator_client` to make it work
299 ## you must install python package `errormator_client` to make it work
258
300
259 # errormator enabled
301 ## errormator enabled
260 errormator = true
302 errormator = false
261
303
262 errormator.server_url = https://api.errormator.com
304 errormator.server_url = https://api.errormator.com
263 errormator.api_key = YOUR_API_KEY
305 errormator.api_key = YOUR_API_KEY
264
306
265 # TWEAK AMOUNT OF INFO SENT HERE
307 ## TWEAK AMOUNT OF INFO SENT HERE
266
308
267 # enables 404 error logging (default False)
309 ## enables 404 error logging (default False)
268 errormator.report_404 = false
310 errormator.report_404 = false
269
311
270 # time in seconds after request is considered being slow (default 1)
312 ## time in seconds after request is considered being slow (default 1)
271 errormator.slow_request_time = 1
313 errormator.slow_request_time = 1
272
314
273 # record slow requests in application
315 ## record slow requests in application
274 # (needs to be enabled for slow datastore recording and time tracking)
316 ## (needs to be enabled for slow datastore recording and time tracking)
275 errormator.slow_requests = true
317 errormator.slow_requests = true
276
318
277 # enable hooking to application loggers
319 ## enable hooking to application loggers
278 # errormator.logging = true
320 # errormator.logging = true
279
321
280 # minimum log level for log capture
322 ## minimum log level for log capture
281 # errormator.logging.level = WARNING
323 # errormator.logging.level = WARNING
282
324
283 # send logs only from erroneous/slow requests
325 ## send logs only from erroneous/slow requests
284 # (saves API quota for intensive logging)
326 ## (saves API quota for intensive logging)
285 errormator.logging_on_error = false
327 errormator.logging_on_error = false
286
328
287 # list of additonal keywords that should be grabbed from environ object
329 ## list of additonal keywords that should be grabbed from environ object
288 # can be string with comma separated list of words in lowercase
330 ## can be string with comma separated list of words in lowercase
289 # (by default client will always send following info:
331 ## (by default client will always send following info:
290 # 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
332 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
291 # start with HTTP* this list be extended with additional keywords here
333 ## start with HTTP* this list be extended with additional keywords here
292 errormator.environ_keys_whitelist =
334 errormator.environ_keys_whitelist =
293
335
294
336
295 # list of keywords that should be blanked from request object
337 ## list of keywords that should be blanked from request object
296 # can be string with comma separated list of words in lowercase
338 ## can be string with comma separated list of words in lowercase
297 # (by default client will always blank keys that contain following words
339 ## (by default client will always blank keys that contain following words
298 # 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
340 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
299 # this list be extended with additional keywords set here
341 ## this list be extended with additional keywords set here
300 errormator.request_keys_blacklist =
342 errormator.request_keys_blacklist =
301
343
302
344
303 # list of namespaces that should be ignores when gathering log entries
345 ## list of namespaces that should be ignores when gathering log entries
304 # can be string with comma separated list of namespaces
346 ## can be string with comma separated list of namespaces
305 # (by default the client ignores own entries: errormator_client.client)
347 ## (by default the client ignores own entries: errormator_client.client)
306 errormator.log_namespace_blacklist =
348 errormator.log_namespace_blacklist =
307
349
308
350
@@ -310,8 +352,8 b' errormator.log_namespace_blacklist ='
310 ### [sentry] ###
352 ### [sentry] ###
311 ################
353 ################
312
354
313 # sentry is a alternative open source error aggregator
355 ## sentry is a alternative open source error aggregator
314 # you must install python packages `sentry` and `raven` to enable
356 ## you must install python packages `sentry` and `raven` to enable
315
357
316 sentry.dsn = YOUR_DNS
358 sentry.dsn = YOUR_DNS
317 sentry.servers =
359 sentry.servers =
@@ -371,7 +413,7 b' handlers = console'
371 level = DEBUG
413 level = DEBUG
372 handlers =
414 handlers =
373 qualname = routes.middleware
415 qualname = routes.middleware
374 # "level = DEBUG" logs the route matched and routing variables.
416 ## "level = DEBUG" logs the route matched and routing variables.
375 propagate = 1
417 propagate = 1
376
418
377 [logger_beaker]
419 [logger_beaker]
@@ -13,10 +13,10 b' with JSON protocol both ways. An url to '
13 API ACCESS FOR WEB VIEWS
13 API ACCESS FOR WEB VIEWS
14 ++++++++++++++++++++++++
14 ++++++++++++++++++++++++
15
15
16 API access can also be turned on for each web view in RhodeCode that is
16 API access can also be turned on for each web view in RhodeCode that is
17 decorated with `@LoginRequired` decorator. To enable API access simple change
17 decorated with `@LoginRequired` decorator. To enable API access simple change
18 the standard login decorator to `@LoginRequired(api_access=True)`.
18 the standard login decorator to `@LoginRequired(api_access=True)`.
19 After this change, a rhodecode view can be accessed without login by adding a
19 After this change, a rhodecode view can be accessed without login by adding a
20 GET parameter `?api_key=<api_key>` to url. By default this is only
20 GET parameter `?api_key=<api_key>` to url. By default this is only
21 enabled on RSS/ATOM feed views.
21 enabled on RSS/ATOM feed views.
22
22
@@ -26,7 +26,7 b' API ACCESS'
26
26
27 All clients are required to send JSON-RPC spec JSON data::
27 All clients are required to send JSON-RPC spec JSON data::
28
28
29 {
29 {
30 "id:"<id>",
30 "id:"<id>",
31 "api_key":"<api_key>",
31 "api_key":"<api_key>",
32 "method":"<method_name>",
32 "method":"<method_name>",
@@ -49,7 +49,7 b' Simply provide'
49
49
50 RhodeCode API will return always a JSON-RPC response::
50 RhodeCode API will return always a JSON-RPC response::
51
51
52 {
52 {
53 "id":<id>, # matching id sent by request
53 "id":<id>, # matching id sent by request
54 "result": "<result>"|null, # JSON formatted result, null if any errors
54 "result": "<result>"|null, # JSON formatted result, null if any errors
55 "error": "null"|<error_message> # JSON formatted error (if any)
55 "error": "null"|<error_message> # JSON formatted error (if any)
@@ -70,14 +70,14 b' will be available.'
70 To get started quickly simply run::
70 To get started quickly simply run::
71
71
72 rhodecode-api _create_config --apikey=<youapikey> --apihost=<rhodecode host>
72 rhodecode-api _create_config --apikey=<youapikey> --apihost=<rhodecode host>
73
73
74 This will create a file named .config in the directory you executed it storing
74 This will create a file named .config in the directory you executed it storing
75 json config file with credentials. You can skip this step and always provide
75 json config file with credentials. You can skip this step and always provide
76 both of the arguments to be able to communicate with server
76 both of the arguments to be able to communicate with server
77
77
78
78
79 after that simply run any api command for example get_repo::
79 after that simply run any api command for example get_repo::
80
80
81 rhodecode-api get_repo
81 rhodecode-api get_repo
82
82
83 calling {"api_key": "<apikey>", "id": 75, "args": {}, "method": "get_repo"} to http://127.0.0.1:5000
83 calling {"api_key": "<apikey>", "id": 75, "args": {}, "method": "get_repo"} to http://127.0.0.1:5000
@@ -90,8 +90,8 b' Ups looks like we forgot to add an argum'
90
90
91 Let's try again now giving the repoid as parameters::
91 Let's try again now giving the repoid as parameters::
92
92
93 rhodecode-api get_repo repoid:rhodecode
93 rhodecode-api get_repo repoid:rhodecode
94
94
95 calling {"api_key": "<apikey>", "id": 39, "args": {"repoid": "rhodecode"}, "method": "get_repo"} to http://127.0.0.1:5000
95 calling {"api_key": "<apikey>", "id": 39, "args": {"repoid": "rhodecode"}, "method": "get_repo"} to http://127.0.0.1:5000
96 rhodecode said:
96 rhodecode said:
97 {'error': None,
97 {'error': None,
@@ -132,7 +132,7 b' rescan_repos'
132
132
133 Dispatch rescan repositories action. If remove_obsolete is set
133 Dispatch rescan repositories action. If remove_obsolete is set
134 RhodeCode will delete repos that are in database but not in the filesystem.
134 RhodeCode will delete repos that are in database but not in the filesystem.
135 This command can be executed only using api_key belonging to user with admin
135 This command can be executed only using api_key belonging to user with admin
136 rights.
136 rights.
137
137
138 INPUT::
138 INPUT::
@@ -147,17 +147,40 b' INPUT::'
147 OUTPUT::
147 OUTPUT::
148
148
149 id : <id_given_in_input>
149 id : <id_given_in_input>
150 result : "{'added': [<list of names of added repos>],
150 result : "{'added': [<list of names of added repos>],
151 'removed': [<list of names of removed repos>]}"
151 'removed': [<list of names of removed repos>]}"
152 error : null
152 error : null
153
153
154
154
155 invalidate_cache
156 ----------------
157
158 Invalidate cache for repository.
159 This command can be executed only using api_key belonging to user with admin
160 rights or regular user that have write or admin or write access to repository.
161
162 INPUT::
163
164 id : <id_for_response>
165 api_key : "<api_key>"
166 method : "invalidate_cache"
167 args : {
168 "repoid" : "<reponame or repo_id>"
169 }
170
171 OUTPUT::
172
173 id : <id_given_in_input>
174 result : "Cache for repository `<reponame>` was invalidated: invalidated cache keys: <list_of_cache_keys>"
175 error : null
176
155 lock
177 lock
156 ----
178 ----
157
179
158 Set locking state on given repository by given user. If userid param is skipped
180 Set locking state on given repository by given user. If userid param is skipped
159 , then it is set to id of user whos calling this method.
181 , then it is set to id of user whos calling this method. If locked param is skipped
160 This command can be executed only using api_key belonging to user with admin
182 then function shows current lock state of given repo.
183 This command can be executed only using api_key belonging to user with admin
161 rights or regular user that have admin or write access to repository.
184 rights or regular user that have admin or write access to repository.
162
185
163 INPUT::
186 INPUT::
@@ -168,7 +191,7 b' INPUT::'
168 args : {
191 args : {
169 "repoid" : "<reponame or repo_id>"
192 "repoid" : "<reponame or repo_id>"
170 "userid" : "<user_id or username = Optional(=apiuser)>",
193 "userid" : "<user_id or username = Optional(=apiuser)>",
171 "locked" : "<bool true|false>"
194 "locked" : "<bool true|false = Optional(=None)>"
172 }
195 }
173
196
174 OUTPUT::
197 OUTPUT::
@@ -183,7 +206,7 b' show_ip'
183
206
184 Shows IP address as seen from RhodeCode server, together with all
207 Shows IP address as seen from RhodeCode server, together with all
185 defined IP addresses for given user.
208 defined IP addresses for given user.
186 This command can be executed only using api_key belonging to user with admin
209 This command can be executed only using api_key belonging to user with admin
187 rights.
210 rights.
188
211
189 INPUT::
212 INPUT::
@@ -208,7 +231,7 b' OUTPUT::'
208 ...
231 ...
209 ]
232 ]
210 }
233 }
211
234
212 error : null
235 error : null
213
236
214
237
@@ -217,7 +240,7 b' get_user'
217
240
218 Get's an user by username or user_id, Returns empty result if user is not found.
241 Get's an user by username or user_id, Returns empty result if user is not found.
219 If userid param is skipped it is set to id of user who is calling this method.
242 If userid param is skipped it is set to id of user who is calling this method.
220 This command can be executed only using api_key belonging to user with admin
243 This command can be executed only using api_key belonging to user with admin
221 rights, or regular users that cannot specify different userid than theirs
244 rights, or regular users that cannot specify different userid than theirs
222
245
223
246
@@ -226,16 +249,17 b' INPUT::'
226 id : <id_for_response>
249 id : <id_for_response>
227 api_key : "<api_key>"
250 api_key : "<api_key>"
228 method : "get_user"
251 method : "get_user"
229 args : {
252 args : {
230 "userid" : "<username or user_id Optional(=apiuser)>"
253 "userid" : "<username or user_id Optional(=apiuser)>"
231 }
254 }
232
255
233 OUTPUT::
256 OUTPUT::
234
257
235 id : <id_given_in_input>
258 id : <id_given_in_input>
236 result: None if user does not exist or
259 result: None if user does not exist or
237 {
260 {
238 "user_id" : "<user_id>",
261 "user_id" : "<user_id>",
262 "api_key" : "<api_key>",
239 "username" : "<username>",
263 "username" : "<username>",
240 "firstname": "<firstname>",
264 "firstname": "<firstname>",
241 "lastname" : "<lastname>",
265 "lastname" : "<lastname>",
@@ -289,7 +313,7 b' OUTPUT::'
289 "ldap_dn" : "<ldap_dn>",
313 "ldap_dn" : "<ldap_dn>",
290 "last_login": "<last_login>",
314 "last_login": "<last_login>",
291 },
315 },
292
316
293 ]
317 ]
294 error: null
318 error: null
295
319
@@ -297,7 +321,7 b' OUTPUT::'
297 create_user
321 create_user
298 -----------
322 -----------
299
323
300 Creates new user. This command can
324 Creates new user. This command can
301 be executed only using api_key belonging to user with admin rights.
325 be executed only using api_key belonging to user with admin rights.
302
326
303
327
@@ -341,7 +365,7 b' OUTPUT::'
341 update_user
365 update_user
342 -----------
366 -----------
343
367
344 updates given user if such user exists. This command can
368 updates given user if such user exists. This command can
345 be executed only using api_key belonging to user with admin rights.
369 be executed only using api_key belonging to user with admin rights.
346
370
347
371
@@ -378,7 +402,7 b' OUTPUT::'
378 "admin" :  "<bool>",
402 "admin" :  "<bool>",
379 "ldap_dn" : "<ldap_dn>",
403 "ldap_dn" : "<ldap_dn>",
380 "last_login": "<last_login>",
404 "last_login": "<last_login>",
381 },
405 },
382 }
406 }
383 error: null
407 error: null
384
408
@@ -387,7 +411,7 b' delete_user'
387 -----------
411 -----------
388
412
389
413
390 deletes givenuser if such user exists. This command can
414 deletes givenuser if such user exists. This command can
391 be executed only using api_key belonging to user with admin rights.
415 be executed only using api_key belonging to user with admin rights.
392
416
393
417
@@ -413,7 +437,7 b' OUTPUT::'
413 get_users_group
437 get_users_group
414 ---------------
438 ---------------
415
439
416 Gets an existing users group. This command can be executed only using api_key
440 Gets an existing user group. This command can be executed only using api_key
417 belonging to user with admin rights.
441 belonging to user with admin rights.
418
442
419
443
@@ -423,7 +447,7 b' INPUT::'
423 api_key : "<api_key>"
447 api_key : "<api_key>"
424 method : "get_users_group"
448 method : "get_users_group"
425 args : {
449 args : {
426 "usersgroupid" : "<users group id or name>"
450 "usersgroupid" : "<user group id or name>"
427 }
451 }
428
452
429 OUTPUT::
453 OUTPUT::
@@ -435,7 +459,7 b' OUTPUT::'
435 "group_name" : "<groupname>",
459 "group_name" : "<groupname>",
436 "active": "<bool>",
460 "active": "<bool>",
437 "members" : [
461 "members" : [
438 {
462 {
439 "user_id" : "<user_id>",
463 "user_id" : "<user_id>",
440 "username" : "<username>",
464 "username" : "<username>",
441 "firstname": "<firstname>",
465 "firstname": "<firstname>",
@@ -456,7 +480,7 b' OUTPUT::'
456 get_users_groups
480 get_users_groups
457 ----------------
481 ----------------
458
482
459 Lists all existing users groups. This command can be executed only using
483 Lists all existing user groups. This command can be executed only using
460 api_key belonging to user with admin rights.
484 api_key belonging to user with admin rights.
461
485
462
486
@@ -484,7 +508,7 b' OUTPUT::'
484 create_users_group
508 create_users_group
485 ------------------
509 ------------------
486
510
487 Creates new users group. This command can be executed only using api_key
511 Creates new user group. This command can be executed only using api_key
488 belonging to user with admin rights
512 belonging to user with admin rights
489
513
490
514
@@ -502,7 +526,7 b' OUTPUT::'
502
526
503 id : <id_given_in_input>
527 id : <id_given_in_input>
504 result: {
528 result: {
505 "msg": "created new users group `<groupname>`",
529 "msg": "created new user group `<groupname>`",
506 "users_group": {
530 "users_group": {
507 "users_group_id" : "<id>",
531 "users_group_id" : "<id>",
508 "group_name" : "<groupname>",
532 "group_name" : "<groupname>",
@@ -515,7 +539,7 b' OUTPUT::'
515 add_user_to_users_group
539 add_user_to_users_group
516 -----------------------
540 -----------------------
517
541
518 Adds a user to a users group. If user exists in that group success will be
542 Adds a user to a user group. If user exists in that group success will be
519 `false`. This command can be executed only using api_key
543 `false`. This command can be executed only using api_key
520 belonging to user with admin rights
544 belonging to user with admin rights
521
545
@@ -526,7 +550,7 b' INPUT::'
526 api_key : "<api_key>"
550 api_key : "<api_key>"
527 method : "add_user_users_group"
551 method : "add_user_users_group"
528 args: {
552 args: {
529 "usersgroupid" : "<users group id or name>",
553 "usersgroupid" : "<user group id or name>",
530 "userid" : "<user_id or username>",
554 "userid" : "<user_id or username>",
531 }
555 }
532
556
@@ -535,7 +559,7 b' OUTPUT::'
535 id : <id_given_in_input>
559 id : <id_given_in_input>
536 result: {
560 result: {
537 "success": True|False # depends on if member is in group
561 "success": True|False # depends on if member is in group
538 "msg": "added member `<username>` to users group `<groupname>` |
562 "msg": "added member `<username>` to user group `<groupname>` |
539 User is already in that group"
563 User is already in that group"
540 }
564 }
541 error: null
565 error: null
@@ -544,8 +568,8 b' OUTPUT::'
544 remove_user_from_users_group
568 remove_user_from_users_group
545 ----------------------------
569 ----------------------------
546
570
547 Removes a user from a users group. If user is not in given group success will
571 Removes a user from a user group. If user is not in given group success will
548 be `false`. This command can be executed only
572 be `false`. This command can be executed only
549 using api_key belonging to user with admin rights
573 using api_key belonging to user with admin rights
550
574
551
575
@@ -555,7 +579,7 b' INPUT::'
555 api_key : "<api_key>"
579 api_key : "<api_key>"
556 method : "remove_user_from_users_group"
580 method : "remove_user_from_users_group"
557 args: {
581 args: {
558 "usersgroupid" : "<users group id or name>",
582 "usersgroupid" : "<user group id or name>",
559 "userid" : "<user_id or username>",
583 "userid" : "<user_id or username>",
560 }
584 }
561
585
@@ -564,7 +588,7 b' OUTPUT::'
564 id : <id_given_in_input>
588 id : <id_given_in_input>
565 result: {
589 result: {
566 "success": True|False, # depends on if member is in group
590 "success": True|False, # depends on if member is in group
567 "msg": "removed member <username> from users group <groupname> |
591 "msg": "removed member <username> from user group <groupname> |
568 User wasn't in group"
592 User wasn't in group"
569 }
593 }
570 error: null
594 error: null
@@ -574,8 +598,8 b' get_repo'
574 --------
598 --------
575
599
576 Gets an existing repository by it's name or repository_id. Members will return
600 Gets an existing repository by it's name or repository_id. Members will return
577 either users_group or user associated to that repository. This command can be
601 either users_group or user associated to that repository. This command can be
578 executed only using api_key belonging to user with admin
602 executed only using api_key belonging to user with admin
579 rights or regular user that have at least read access to repository.
603 rights or regular user that have at least read access to repository.
580
604
581
605
@@ -599,9 +623,9 b' OUTPUT::'
599 "clone_uri" : "<clone_uri>",
623 "clone_uri" : "<clone_uri>",
600 "enable_downloads": "<bool>",
624 "enable_downloads": "<bool>",
601 "enable_locking": "<bool>",
625 "enable_locking": "<bool>",
602 "enable_statistics": "<bool>",
626 "enable_statistics": "<bool>",
603 "private": "<bool>",
627 "private": "<bool>",
604 "created_on" : "<date_time_created>",
628 "created_on" : "<date_time_created>",
605 "description" : "<description>",
629 "description" : "<description>",
606 "landing_rev": "<landing_rev>",
630 "landing_rev": "<landing_rev>",
607 "last_changeset": {
631 "last_changeset": {
@@ -615,8 +639,8 b' OUTPUT::'
615 "owner": "<repo_owner>",
639 "owner": "<repo_owner>",
616 "fork_of": "<name_of_fork_parent>",
640 "fork_of": "<name_of_fork_parent>",
617 "members" : [
641 "members" : [
618 {
642 {
619 "type": "user",
643 "type": "user",
620 "user_id" : "<user_id>",
644 "user_id" : "<user_id>",
621 "username" : "<username>",
645 "username" : "<username>",
622 "firstname": "<firstname>",
646 "firstname": "<firstname>",
@@ -630,8 +654,8 b' OUTPUT::'
630 "permission" : "repository.(read|write|admin)"
654 "permission" : "repository.(read|write|admin)"
631 },
655 },
632
656
633 {
657 {
634 "type": "users_group",
658 "type": "users_group",
635 "id" : "<usersgroupid>",
659 "id" : "<usersgroupid>",
636 "name" : "<usersgroupname>",
660 "name" : "<usersgroupname>",
637 "active": "<bool>",
661 "active": "<bool>",
@@ -639,6 +663,22 b' OUTPUT::'
639 },
663 },
640
664
641 ]
665 ]
666 "followers": [
667 {
668 "user_id" : "<user_id>",
669 "username" : "<username>",
670 "firstname": "<firstname>",
671 "lastname" : "<lastname>",
672 "email" : "<email>",
673 "emails": "<list_of_all_additional_emails>",
674 "ip_addresses": "<list_of_ip_addresses_for_user>",
675 "active" : "<bool>",
676 "admin" :  "<bool>",
677 "ldap_dn" : "<ldap_dn>",
678 "last_login": "<last_login>",
679 },
680
681 ]
642 }
682 }
643 error: null
683 error: null
644
684
@@ -646,8 +686,8 b' OUTPUT::'
646 get_repos
686 get_repos
647 ---------
687 ---------
648
688
649 Lists all existing repositories. This command can be executed only using
689 Lists all existing repositories. This command can be executed only using
650 api_key belonging to user with admin rights or regular user that have
690 api_key belonging to user with admin rights or regular user that have
651 admin, write or read access to repository.
691 admin, write or read access to repository.
652
692
653
693
@@ -668,14 +708,14 b' OUTPUT::'
668 "repo_type" : "<repo_type>",
708 "repo_type" : "<repo_type>",
669 "clone_uri" : "<clone_uri>",
709 "clone_uri" : "<clone_uri>",
670 "private": : "<bool>",
710 "private": : "<bool>",
671 "created_on" : "<datetimecreated>",
711 "created_on" : "<datetimecreated>",
672 "description" : "<description>",
712 "description" : "<description>",
673 "landing_rev": "<landing_rev>",
713 "landing_rev": "<landing_rev>",
674 "owner": "<repo_owner>",
714 "owner": "<repo_owner>",
675 "fork_of": "<name_of_fork_parent>",
715 "fork_of": "<name_of_fork_parent>",
676 "enable_downloads": "<bool>",
716 "enable_downloads": "<bool>",
677 "enable_locking": "<bool>",
717 "enable_locking": "<bool>",
678 "enable_statistics": "<bool>",
718 "enable_statistics": "<bool>",
679 },
719 },
680
720
681 ]
721 ]
@@ -685,9 +725,9 b' OUTPUT::'
685 get_repo_nodes
725 get_repo_nodes
686 --------------
726 --------------
687
727
688 returns a list of nodes and it's children in a flat list for a given path
728 returns a list of nodes and it's children in a flat list for a given path
689 at given revision. It's possible to specify ret_type to show only `files` or
729 at given revision. It's possible to specify ret_type to show only `files` or
690 `dirs`. This command can be executed only using api_key belonging to user
730 `dirs`. This command can be executed only using api_key belonging to user
691 with admin rights
731 with admin rights
692
732
693
733
@@ -720,9 +760,9 b' create_repo'
720 -----------
760 -----------
721
761
722 Creates a repository. If repository name contains "/", all needed repository
762 Creates a repository. If repository name contains "/", all needed repository
723 groups will be created. For example "foo/bar/baz" will create groups
763 groups will be created. For example "foo/bar/baz" will create groups
724 "foo", "bar" (with "foo" as parent), and create "baz" repository with
764 "foo", "bar" (with "foo" as parent), and create "baz" repository with
725 "bar" as group. This command can be executed only using api_key belonging to user with admin
765 "bar" as group. This command can be executed only using api_key belonging to user with admin
726 rights or regular user that have create repository permission. Regular users
766 rights or regular user that have create repository permission. Regular users
727 cannot specify owner parameter
767 cannot specify owner parameter
728
768
@@ -756,14 +796,14 b' OUTPUT::'
756 "repo_type" : "<repo_type>",
796 "repo_type" : "<repo_type>",
757 "clone_uri" : "<clone_uri>",
797 "clone_uri" : "<clone_uri>",
758 "private": : "<bool>",
798 "private": : "<bool>",
759 "created_on" : "<datetimecreated>",
799 "created_on" : "<datetimecreated>",
760 "description" : "<description>",
800 "description" : "<description>",
761 "landing_rev": "<landing_rev>",
801 "landing_rev": "<landing_rev>",
762 "owner": "<username or user_id>",
802 "owner": "<username or user_id>",
763 "fork_of": "<name_of_fork_parent>",
803 "fork_of": "<name_of_fork_parent>",
764 "enable_downloads": "<bool>",
804 "enable_downloads": "<bool>",
765 "enable_locking": "<bool>",
805 "enable_locking": "<bool>",
766 "enable_statistics": "<bool>",
806 "enable_statistics": "<bool>",
767 },
807 },
768 }
808 }
769 error: null
809 error: null
@@ -792,7 +832,7 b' INPUT::'
792 "copy_permissions": "<bool>",
832 "copy_permissions": "<bool>",
793 "private": "<bool>",
833 "private": "<bool>",
794 "landing_rev": "<landing_rev>"
834 "landing_rev": "<landing_rev>"
795
835
796 }
836 }
797
837
798 OUTPUT::
838 OUTPUT::
@@ -808,8 +848,10 b' OUTPUT::'
808 delete_repo
848 delete_repo
809 -----------
849 -----------
810
850
811 Deletes a repository. This command can be executed only using api_key belonging to user with admin
851 Deletes a repository. This command can be executed only using api_key belonging
812 rights or regular user that have admin access to repository.
852 to user with admin rights or regular user that have admin access to repository.
853 When `forks` param is set it's possible to detach or delete forks of deleting
854 repository
813
855
814
856
815 INPUT::
857 INPUT::
@@ -818,7 +860,8 b' INPUT::'
818 api_key : "<api_key>"
860 api_key : "<api_key>"
819 method : "delete_repo"
861 method : "delete_repo"
820 args: {
862 args: {
821 "repoid" : "<reponame or repo_id>"
863 "repoid" : "<reponame or repo_id>",
864 "forks" : "`delete` or `detach` = Optional(None)"
822 }
865 }
823
866
824 OUTPUT::
867 OUTPUT::
@@ -835,7 +878,7 b' grant_user_permission'
835 ---------------------
878 ---------------------
836
879
837 Grant permission for user on given repository, or update existing one
880 Grant permission for user on given repository, or update existing one
838 if found. This command can be executed only using api_key belonging to user
881 if found. This command can be executed only using api_key belonging to user
839 with admin rights.
882 with admin rights.
840
883
841
884
@@ -863,7 +906,7 b' OUTPUT::'
863 revoke_user_permission
906 revoke_user_permission
864 ----------------------
907 ----------------------
865
908
866 Revoke permission for user on given repository. This command can be executed
909 Revoke permission for user on given repository. This command can be executed
867 only using api_key belonging to user with admin rights.
910 only using api_key belonging to user with admin rights.
868
911
869
912
@@ -890,8 +933,8 b' OUTPUT::'
890 grant_users_group_permission
933 grant_users_group_permission
891 ----------------------------
934 ----------------------------
892
935
893 Grant permission for users group on given repository, or update
936 Grant permission for user group on given repository, or update
894 existing one if found. This command can be executed only using
937 existing one if found. This command can be executed only using
895 api_key belonging to user with admin rights.
938 api_key belonging to user with admin rights.
896
939
897
940
@@ -902,7 +945,7 b' INPUT::'
902 method : "grant_users_group_permission"
945 method : "grant_users_group_permission"
903 args: {
946 args: {
904 "repoid" : "<reponame or repo_id>"
947 "repoid" : "<reponame or repo_id>"
905 "usersgroupid" : "<users group id or name>"
948 "usersgroupid" : "<user group id or name>"
906 "perm" : "(repository.(none|read|write|admin))",
949 "perm" : "(repository.(none|read|write|admin))",
907 }
950 }
908
951
@@ -914,12 +957,12 b' OUTPUT::'
914 "success": true
957 "success": true
915 }
958 }
916 error: null
959 error: null
917
960
918
961
919 revoke_users_group_permission
962 revoke_users_group_permission
920 -----------------------------
963 -----------------------------
921
964
922 Revoke permission for users group on given repository.This command can be
965 Revoke permission for user group on given repository.This command can be
923 executed only using api_key belonging to user with admin rights.
966 executed only using api_key belonging to user with admin rights.
924
967
925 INPUT::
968 INPUT::
@@ -929,7 +972,7 b' INPUT::'
929 method : "revoke_users_group_permission"
972 method : "revoke_users_group_permission"
930 args: {
973 args: {
931 "repoid" : "<reponame or repo_id>"
974 "repoid" : "<reponame or repo_id>"
932 "usersgroupid" : "<users group id or name>"
975 "usersgroupid" : "<user group id or name>"
933 }
976 }
934
977
935 OUTPUT::
978 OUTPUT::
@@ -939,4 +982,4 b' OUTPUT::'
939 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
982 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
940 "success": true
983 "success": true
941 }
984 }
942 error: null No newline at end of file
985 error: null
@@ -6,30 +6,30 b' The :mod:`models` Module'
6
6
7 .. automodule:: rhodecode.model
7 .. automodule:: rhodecode.model
8 :members:
8 :members:
9
9
10 .. automodule:: rhodecode.model.comment
10 .. automodule:: rhodecode.model.comment
11 :members:
11 :members:
12
12
13 .. automodule:: rhodecode.model.notification
13 .. automodule:: rhodecode.model.notification
14 :members:
14 :members:
15
15
16 .. automodule:: rhodecode.model.permission
16 .. automodule:: rhodecode.model.permission
17 :members:
17 :members:
18
18
19 .. automodule:: rhodecode.model.repo_permission
19 .. automodule:: rhodecode.model.repo_permission
20 :members:
20 :members:
21
21
22 .. automodule:: rhodecode.model.repo
22 .. automodule:: rhodecode.model.repo
23 :members:
23 :members:
24
24
25 .. automodule:: rhodecode.model.repos_group
25 .. automodule:: rhodecode.model.repos_group
26 :members:
26 :members:
27
27
28 .. automodule:: rhodecode.model.scm
28 .. automodule:: rhodecode.model.scm
29 :members:
29 :members:
30
30
31 .. automodule:: rhodecode.model.user
31 .. automodule:: rhodecode.model.user
32 :members:
32 :members:
33
33
34 .. automodule:: rhodecode.model.users_group
34 .. automodule:: rhodecode.model.users_group
35 :members: No newline at end of file
35 :members:
@@ -4,6 +4,82 b''
4 Changelog
4 Changelog
5 =========
5 =========
6
6
7 1.6.0rc1 (**2013-04-07**)
8 -------------------------
9
10 news
11 ++++
12
13 - Redesign UI, with lots of small improvements.
14 - Group management delegation. Group admin can manage a group, and repos
15 under it, admin can create child groups inside group he manages.
16 - Repository extra fields. Optional unlimited extra fields can be defined for
17 each repository to store custom data.
18 - API get_repo call includes repo followers now.
19 - Large amounts of improvements in pull requests.
20 - #734 repo switcher is available in all pages.
21 - #733 API invalidate_cache function.
22 - Added option to turn on HSTS headers when using SSL.
23 - #83 show repo size on summary page.
24 - #745 added show full diff link into to big diff message.
25 - Deprecated RSS links - ATOM is the present and the future.
26 - Add option to define custom lexers for custom extensions for code highlight
27 in rcextension module.
28 - Git executable is now configurable via .ini files.
29 - #689 repositories now has optional detach/delete option for connected forks.
30 - Obfuscate password when cloning a remote repo with credentials.
31 - #788 tarball cache. zip or compressed tarballs can be optionally cached for
32 faster serving.
33 - Speed up of last_changeset extraction in VCS.
34 - API get_locks function.
35 - Configurable HTTP codes for repository locking.
36 - Possible to use closed branches in ?branch= in changelog.
37 - Linaro's ldap sync scripts.
38 - #797 git refs filter is now configurable via .ini file.
39 - New ishell paster command for easier administrative tasks.
40
41 fixes
42 +++++
43
44 - #654 switch to handles `/` in branch/tag/bookmark names.
45 - #572 moved out password reset tasks from celery.
46 - #730 filter out repo groups choices to only ones that you have write+ access.
47 - #462 disable file editing when not on branch head.
48 - #731 update-repoinfo sometimes failed to update data when changesets were
49 initial commits.
50 - #749,#805 and #516 Removed duplication of repo settings for rhodecode admins
51 and repo admins.
52 - Global permission update with "overwrite existing settings" shouldn't
53 override private repositories.
54 - #642 added recursion limit for stats gathering.
55 - #739 Delete/Edit repositories should only point to admin links if the user
56 is an super admin.
57 - Fixed escaping of html in "patch" view for GIT repos.
58 - #747 load changeset cache after forking to refresh lightweight dashboard caches.
59 - Quick repo list: public/private icon control should only control icons,
60 not repo visibility.
61 - #746 UnicodeDedode errors on feed controllers.
62 - #756 cleanup repos didn't properly compose paths of repos to be cleaned up.
63 - #763 gravatar helper function should fallback into default image if somehow
64 email provided is empty.
65 - Fixes #762, LDAP and container created users are now activated based on
66 the registration settings in permissions.
67 - Cleanup would recurse into every leaf and could thus not be used on lots of
68 large repositories.
69 - Better detection of deleting groups with subgroups inside.
70 - Fixed issue with renaming repos group together with changing parents with
71 multiple nested trees.
72 - #594 web interface file committing executes push hooks.
73 - Disallow cloning from different URI's that http[s]/svn/git/hg.
74 - Handling of RhodeCode extra params in consistent way.
75 - Don't normalize path if it's empty on adding a file through web interface.
76 - #808 missing changesets and files should return 404 not redirect
77 - #809 added url quote in clone url.
78 - Fixed issues with importing non-ascii repo names.
79 - Automatically assign instance_id for host and process if it has been set to *
80 - Fixed multiple IP addresses in each of extracted IP.
81 - Lot of other small bug fixes and improvements.
82
7 1.5.4 (**2013-03-13**)
83 1.5.4 (**2013-03-13**)
8 ----------------------
84 ----------------------
9
85
@@ -20,8 +96,8 b' fixes'
20 if email is empty
96 if email is empty
21 - fixes #762 user global activation flag is also respected for LDAP created
97 - fixes #762 user global activation flag is also respected for LDAP created
22 accounts
98 accounts
23 - use password obfuscate when clonning a remote repo with credentials inside
99 - use password obfuscate when clonning a remote repo with credentials inside
24 - fixed issue with renaming repos group together with changing parents
100 - fixed issue with renaming repository group together with changing parents
25 - disallow cloning from file:/// URIs
101 - disallow cloning from file:/// URIs
26 - handle all cases with multiple IP addresses in proxy headers
102 - handle all cases with multiple IP addresses in proxy headers
27
103
@@ -84,7 +160,7 b' 1.5.1 (**2012-12-13**)'
84 news
160 news
85 ++++
161 ++++
86
162
87 - implements #677: Don't allow to close pull requests when they are
163 - implements #677: Don't allow to close pull requests when they are
88 under-review status
164 under-review status
89 - implemented #670 Implementation of Roles in Pull Request
165 - implemented #670 Implementation of Roles in Pull Request
90
166
@@ -95,6 +171,7 b' fixes'
95 - fixed changeset status labels, they now select radio buttons
171 - fixed changeset status labels, they now select radio buttons
96 - #682 translation difficult for multi-line text
172 - #682 translation difficult for multi-line text
97 - #683 fixed difference between messages about not mapped repositories
173 - #683 fixed difference between messages about not mapped repositories
174 - email: fail nicely when no SMTP server has been configured
98
175
99 1.5.0 (**2012-12-12**)
176 1.5.0 (**2012-12-12**)
100 ----------------------
177 ----------------------
@@ -120,7 +197,7 b' news'
120 - implemented #638 permissions overview to groups
197 - implemented #638 permissions overview to groups
121 - implements #636, lazy loading of history and authors to speed up source
198 - implements #636, lazy loading of history and authors to speed up source
122 pages rendering
199 pages rendering
123 - implemented #647, option to pass list of default encoding used to
200 - implemented #647, option to pass list of default encoding used to
124 encode to/decode from unicode
201 encode to/decode from unicode
125 - added caching layer into RSS/ATOM feeds.
202 - added caching layer into RSS/ATOM feeds.
126 - basic implementation of cherry picking changesets for pull request, ref #575
203 - basic implementation of cherry picking changesets for pull request, ref #575
@@ -143,17 +220,17 b' fixes'
143 - fixes #612 Double quotes to Single quotes result in bad html in diff
220 - fixes #612 Double quotes to Single quotes result in bad html in diff
144 - fixes #630 git statistics do too much work making them slow.
221 - fixes #630 git statistics do too much work making them slow.
145 - fixes #625 Git-Tags are not displayed in Shortlog
222 - fixes #625 Git-Tags are not displayed in Shortlog
146 - fix for issue #602, enforce str when setting mercurial UI object.
223 - fix for issue #602, enforce str when setting mercurial UI object.
147 When this is used together with mercurial internal translation system
224 When this is used together with mercurial internal translation system
148 it can lead to UnicodeDecodeErrors
225 it can lead to UnicodeDecodeErrors
149 - fixes #645 Fix git handler when doing delete remote branch
226 - fixes #645 Fix git handler when doing delete remote branch
150 - implements #649 added two seperate method for author and commiter to VCS
227 - implements #649 added two seperate method for author and committer to VCS
151 changeset class switch author for git backed to be the real author not commiter
228 changeset class switch author for git backed to be the real author not committer
152 - fix issue #504 RhodeCode is showing different versions of README on
229 - fix issue #504 RhodeCode is showing different versions of README on
153 different summary page loads
230 different summary page loads
154 - implemented #658 Changing username in LDAP-Mode should not be allowed.
231 - implemented #658 Changing username in LDAP-Mode should not be allowed.
155 - fixes #652 switch to generator approach when doing file annotation to prevent
232 - fixes #652 switch to generator approach when doing file annotation to prevent
156 huge memory consumption
233 huge memory consumption
157 - fixes #666 move lockkey path location to cache_dir to ensure this path is
234 - fixes #666 move lockkey path location to cache_dir to ensure this path is
158 always writable for rhodecode server
235 always writable for rhodecode server
159 - many more small fixes and improvements
236 - many more small fixes and improvements
@@ -204,9 +281,9 b' news'
204 fixes
281 fixes
205 +++++
282 +++++
206
283
207 - fixed #570 explicit users group permissions can overwrite owner permissions
284 - fixed #570 explicit user group permissions can overwrite owner permissions
208 - fixed #578 set proper PATH with current Python for Git
285 - fixed #578 set proper PATH with current Python for Git
209 hooks to execute within same Python as RhodeCode
286 hooks to execute within same Python as RhodeCode
210 - fixed issue with Git bare repos that ends with .git in name
287 - fixed issue with Git bare repos that ends with .git in name
211
288
212 1.4.2 (**2012-09-12**)
289 1.4.2 (**2012-09-12**)
@@ -221,12 +298,12 b' news'
221 groups. Now only write access to group allows to create a repostiory
298 groups. Now only write access to group allows to create a repostiory
222 within that group
299 within that group
223 - #565 Add support for {netloc} and {scheme} to alternative_gravatar_url
300 - #565 Add support for {netloc} and {scheme} to alternative_gravatar_url
224 - updated translation for zh_CN
301 - updated translation for zh_CN
225
302
226 fixes
303 fixes
227 +++++
304 +++++
228
305
229 - fixed visual permissions check on repos groups inside groups
306 - fixed visual permissions check on repository groups inside groups
230 - fixed issues with non-ascii search terms in search, and indexers
307 - fixed issues with non-ascii search terms in search, and indexers
231 - fixed parsing of page number in GET parameters
308 - fixed parsing of page number in GET parameters
232 - fixed issues with generating pull-request overview for repos with
309 - fixed issues with generating pull-request overview for repos with
@@ -240,7 +317,7 b' news'
240 ++++
317 ++++
241
318
242 - always put a comment about code-review status change even if user send
319 - always put a comment about code-review status change even if user send
243 empty data
320 empty data
244 - modified_on column saves repository update and it's going to be used
321 - modified_on column saves repository update and it's going to be used
245 later for light version of main page ref #500
322 later for light version of main page ref #500
246 - pull request notifications send much nicer emails with details about pull
323 - pull request notifications send much nicer emails with details about pull
@@ -251,10 +328,10 b' fixes'
251 +++++
328 +++++
252
329
253 - fixed migrations of permissions that can lead to inconsistency.
330 - fixed migrations of permissions that can lead to inconsistency.
254 Some users sent feedback that after upgrading from older versions issues
331 Some users sent feedback that after upgrading from older versions issues
255 with updating default permissions occurred. RhodeCode detects that now and
332 with updating default permissions occurred. RhodeCode detects that now and
256 resets default user permission to initial state if there is a need for that.
333 resets default user permission to initial state if there is a need for that.
257 Also forces users to set the default value for new forking permission.
334 Also forces users to set the default value for new forking permission.
258 - #535 improved apache wsgi example configuration in docs
335 - #535 improved apache wsgi example configuration in docs
259 - fixes #550 mercurial repositories comparision failed when origin repo had
336 - fixes #550 mercurial repositories comparision failed when origin repo had
260 additional not-common changesets
337 additional not-common changesets
@@ -273,7 +350,7 b' 1.4.0 (**2012-09-03**)'
273
350
274 news
351 news
275 ++++
352 ++++
276
353
277 - new codereview system
354 - new codereview system
278 - email map, allowing users to have multiple email addresses mapped into
355 - email map, allowing users to have multiple email addresses mapped into
279 their accounts
356 their accounts
@@ -284,11 +361,11 b' news'
284 - #464 added links to groups in permission box
361 - #464 added links to groups in permission box
285 - #465 mentions autocomplete inside comments boxes
362 - #465 mentions autocomplete inside comments boxes
286 - #469 added --update-only option to whoosh to re-index only given list
363 - #469 added --update-only option to whoosh to re-index only given list
287 of repos in index
364 of repos in index
288 - rhodecode-api CLI client
365 - rhodecode-api CLI client
289 - new git http protocol replaced buggy dulwich implementation.
366 - new git http protocol replaced buggy dulwich implementation.
290 Now based on pygrack & gitweb
367 Now based on pygrack & gitweb
291 - Improved RSS/ATOM feeds. Discoverable by browsers using proper headers, and
368 - Improved RSS/ATOM feeds. Discoverable by browsers using proper headers, and
292 reformated based on user suggestions. Additional rss/atom feeds for user
369 reformated based on user suggestions. Additional rss/atom feeds for user
293 journal
370 journal
294 - various i18n improvements
371 - various i18n improvements
@@ -296,21 +373,21 b' news'
296 - File view now displays small gravatars off all authors of given file
373 - File view now displays small gravatars off all authors of given file
297 - Implemented landing revisions. Each repository will get landing_rev attribute
374 - Implemented landing revisions. Each repository will get landing_rev attribute
298 that defines 'default' revision/branch for generating readme files
375 that defines 'default' revision/branch for generating readme files
299 - Implemented #509, RhodeCode enforces SSL for push/pulling if requested at
376 - Implemented #509, RhodeCode enforces SSL for push/pulling if requested at
300 earliest possible call.
377 earliest possible call.
301 - Import remote svn repositories to mercurial using hgsubversion.
378 - Import remote svn repositories to mercurial using hgsubversion.
302 - Fixed #508 RhodeCode now has a option to explicitly set forking permissions
379 - Fixed #508 RhodeCode now has a option to explicitly set forking permissions
303 - RhodeCode can use alternative server for generating avatar icons
380 - RhodeCode can use alternative server for generating avatar icons
304 - implemented repositories locking. Pull locks, push unlocks. Also can be done
381 - implemented repositories locking. Pull locks, push unlocks. Also can be done
305 via API calls
382 via API calls
306 - #538 form for permissions can handle multiple users at once
383 - #538 form for permissions can handle multiple users at once
307
384
308 fixes
385 fixes
309 +++++
386 +++++
310
387
311 - improved translations
388 - improved translations
312 - fixes issue #455 Creating an archive generates an exception on Windows
389 - fixes issue #455 Creating an archive generates an exception on Windows
313 - fixes #448 Download ZIP archive keeps file in /tmp open and results
390 - fixes #448 Download ZIP archive keeps file in /tmp open and results
314 in out of disk space
391 in out of disk space
315 - fixes issue #454 Search results under Windows include proceeding
392 - fixes issue #454 Search results under Windows include proceeding
316 backslash
393 backslash
@@ -322,9 +399,9 b' fixes'
322 - fixed issue #459. Changed the way of obtaining logger in reindex task.
399 - fixed issue #459. Changed the way of obtaining logger in reindex task.
323 - fixed #453 added ID field in whoosh SCHEMA that solves the issue of
400 - fixed #453 added ID field in whoosh SCHEMA that solves the issue of
324 reindexing modified files
401 reindexing modified files
325 - fixed #481 rhodecode emails are sent without Date header
402 - fixed #481 rhodecode emails are sent without Date header
326 - fixed #458 wrong count when no repos are present
403 - fixed #458 wrong count when no repos are present
327 - fixed issue #492 missing `\ No newline at end of file` test at the end of
404 - fixed issue #492 missing `\ No newline at end of file` test at the end of
328 new chunk in html diff
405 new chunk in html diff
329 - full text search now works also for commit messages
406 - full text search now works also for commit messages
330
407
@@ -335,8 +412,8 b' news'
335 ++++
412 ++++
336
413
337 - chinese traditional translation
414 - chinese traditional translation
338 - changed setup-app into setup-rhodecode and added arguments for auto-setup
415 - changed setup-app into setup-rhodecode and added arguments for auto-setup
339 mode that doesn't need user interaction
416 mode that doesn't need user interaction
340
417
341 fixes
418 fixes
342 +++++
419 +++++
@@ -356,11 +433,11 b' news'
356 - use ext_json for json module
433 - use ext_json for json module
357 - unified annotation view with file source view
434 - unified annotation view with file source view
358 - notification improvements, better inbox + css
435 - notification improvements, better inbox + css
359 - #419 don't strip passwords for login forms, make rhodecode
436 - #419 don't strip passwords for login forms, make rhodecode
360 more compatible with LDAP servers
437 more compatible with LDAP servers
361 - Added HTTP_X_FORWARDED_FOR as another method of extracting
438 - Added HTTP_X_FORWARDED_FOR as another method of extracting
362 IP for pull/push logs. - moved all to base controller
439 IP for pull/push logs. - moved all to base controller
363 - #415: Adding comment to changeset causes reload.
440 - #415: Adding comment to changeset causes reload.
364 Comments are now added via ajax and doesn't reload the page
441 Comments are now added via ajax and doesn't reload the page
365 - #374 LDAP config is discarded when LDAP can't be activated
442 - #374 LDAP config is discarded when LDAP can't be activated
366 - limited push/pull operations are now logged for git in the journal
443 - limited push/pull operations are now logged for git in the journal
@@ -376,7 +453,7 b' fixes'
376 - #418 cast to unicode fixes in notification objects
453 - #418 cast to unicode fixes in notification objects
377 - #426 fixed mention extracting regex
454 - #426 fixed mention extracting regex
378 - fixed remote-pulling for git remotes remopositories
455 - fixed remote-pulling for git remotes remopositories
379 - fixed #434: Error when accessing files or changesets of a git repository
456 - fixed #434: Error when accessing files or changesets of a git repository
380 with submodules
457 with submodules
381 - fixed issue with empty APIKEYS for users after registration ref. #438
458 - fixed issue with empty APIKEYS for users after registration ref. #438
382 - fixed issue with getting README files from git repositories
459 - fixed issue with getting README files from git repositories
@@ -393,15 +470,15 b' news'
393 - created rcextensions module with additional mappings (ref #322) and
470 - created rcextensions module with additional mappings (ref #322) and
394 post push/pull/create repo hooks callbacks
471 post push/pull/create repo hooks callbacks
395 - implemented #377 Users view for his own permissions on account page
472 - implemented #377 Users view for his own permissions on account page
396 - #399 added inheritance of permissions for users group on repos groups
473 - #399 added inheritance of permissions for user group on repository groups
397 - #401 repository group is automatically pre-selected when adding repos
474 - #401 repository group is automatically pre-selected when adding repos
398 inside a repository group
475 inside a repository group
399 - added alternative HTTP 403 response when client failed to authenticate. Helps
476 - added alternative HTTP 403 response when client failed to authenticate. Helps
400 solving issues with Mercurial and LDAP
477 solving issues with Mercurial and LDAP
401 - #402 removed group prefix from repository name when listing repositories
478 - #402 removed group prefix from repository name when listing repositories
402 inside a group
479 inside a group
403 - added gravatars into permission view and permissions autocomplete
480 - added gravatars into permission view and permissions autocomplete
404 - #347 when running multiple RhodeCode instances, properly invalidates cache
481 - #347 when running multiple RhodeCode instances, properly invalidates cache
405 for all registered servers
482 for all registered servers
406
483
407 fixes
484 fixes
@@ -411,15 +488,15 b' fixes'
411 - fixed #385 clone by ID url was loosing proxy prefix in URL
488 - fixed #385 clone by ID url was loosing proxy prefix in URL
412 - fixed some unicode problems with waitress
489 - fixed some unicode problems with waitress
413 - fixed issue with escaping < and > in changeset commits
490 - fixed issue with escaping < and > in changeset commits
414 - fixed error occurring during recursive group creation in API
491 - fixed error occurring during recursive group creation in API
415 create_repo function
492 create_repo function
416 - fixed #393 py2.5 fixes for routes url generator
493 - fixed #393 py2.5 fixes for routes url generator
417 - fixed #397 Private repository groups shows up before login
494 - fixed #397 Private repository groups shows up before login
418 - fixed #396 fixed problems with revoking users in nested groups
495 - fixed #396 fixed problems with revoking users in nested groups
419 - fixed mysql unicode issues + specified InnoDB as default engine with
496 - fixed mysql unicode issues + specified InnoDB as default engine with
420 utf8 charset
497 utf8 charset
421 - #406 trim long branch/tag names in changelog to not break UI
498 - #406 trim long branch/tag names in changelog to not break UI
422
499
423 1.3.3 (**2012-03-02**)
500 1.3.3 (**2012-03-02**)
424 ----------------------
501 ----------------------
425
502
@@ -430,11 +507,11 b' news'
430 fixes
507 fixes
431 +++++
508 +++++
432
509
433 - fixed some python2.5 compatibility issues
510 - fixed some python2.5 compatibility issues
434 - fixed issues with removed repos was accidentally added as groups, after
511 - fixed issues with removed repos was accidentally added as groups, after
435 full rescan of paths
512 full rescan of paths
436 - fixes #376 Cannot edit user (using container auth)
513 - fixes #376 Cannot edit user (using container auth)
437 - fixes #378 Invalid image urls on changeset screen with proxy-prefix
514 - fixes #378 Invalid image urls on changeset screen with proxy-prefix
438 configuration
515 configuration
439 - fixed initial sorting of repos inside repo group
516 - fixed initial sorting of repos inside repo group
440 - fixes issue when user tried to resubmit same permission into user/user_groups
517 - fixes issue when user tried to resubmit same permission into user/user_groups
@@ -442,7 +519,7 b' fixes'
442 - fixed raw_changeset for git. It was generated with hg patch headers
519 - fixed raw_changeset for git. It was generated with hg patch headers
443 - fixed vcs issue with last_changeset for filenodes
520 - fixed vcs issue with last_changeset for filenodes
444 - fixed missing commit after hook delete
521 - fixed missing commit after hook delete
445 - fixed #372 issues with git operation detection that caused a security issue
522 - fixed #372 issues with git operation detection that caused a security issue
446 for git repos
523 for git repos
447
524
448 1.3.2 (**2012-02-28**)
525 1.3.2 (**2012-02-28**)
@@ -459,9 +536,9 b' fixes'
459 - fixed git remote repos validator that prevented from cloning remote git repos
536 - fixed git remote repos validator that prevented from cloning remote git repos
460 - fixes #370 ending slashes fixes for repo and groups
537 - fixes #370 ending slashes fixes for repo and groups
461 - fixes #368 improved git-protocol detection to handle other clients
538 - fixes #368 improved git-protocol detection to handle other clients
462 - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be
539 - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be
463 Moved To Root
540 Moved To Root
464 - fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys
541 - fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys
465 - fixed #373 missing cascade drop on user_group_to_perm table
542 - fixed #373 missing cascade drop on user_group_to_perm table
466
543
467 1.3.1 (**2012-02-27**)
544 1.3.1 (**2012-02-27**)
@@ -475,7 +552,7 b' fixes'
475 +++++
552 +++++
476
553
477 - redirection loop occurs when remember-me wasn't checked during login
554 - redirection loop occurs when remember-me wasn't checked during login
478 - fixes issues with git blob history generation
555 - fixes issues with git blob history generation
479 - don't fetch branch for git in file history dropdown. Causes unneeded slowness
556 - don't fetch branch for git in file history dropdown. Causes unneeded slowness
480
557
481 1.3.0 (**2012-02-26**)
558 1.3.0 (**2012-02-26**)
@@ -484,19 +561,19 b' 1.3.0 (**2012-02-26**)'
484 news
561 news
485 ++++
562 ++++
486
563
487 - code review, inspired by github code-comments
564 - code review, inspired by github code-comments
488 - #215 rst and markdown README files support
565 - #215 rst and markdown README files support
489 - #252 Container-based and proxy pass-through authentication support
566 - #252 Container-based and proxy pass-through authentication support
490 - #44 branch browser. Filtering of changelog by branches
567 - #44 branch browser. Filtering of changelog by branches
491 - mercurial bookmarks support
568 - mercurial bookmarks support
492 - new hover top menu, optimized to add maximum size for important views
569 - new hover top menu, optimized to add maximum size for important views
493 - configurable clone url template with possibility to specify protocol like
570 - configurable clone url template with possibility to specify protocol like
494 ssh:// or http:// and also manually alter other parts of clone_url.
571 ssh:// or http:// and also manually alter other parts of clone_url.
495 - enabled largefiles extension by default
572 - enabled largefiles extension by default
496 - optimized summary file pages and saved a lot of unused space in them
573 - optimized summary file pages and saved a lot of unused space in them
497 - #239 option to manually mark repository as fork
574 - #239 option to manually mark repository as fork
498 - #320 mapping of commit authors to RhodeCode users
575 - #320 mapping of commit authors to RhodeCode users
499 - #304 hashes are displayed using monospace font
576 - #304 hashes are displayed using monospace font
500 - diff configuration, toggle white lines and context lines
577 - diff configuration, toggle white lines and context lines
501 - #307 configurable diffs, whitespace toggle, increasing context lines
578 - #307 configurable diffs, whitespace toggle, increasing context lines
502 - sorting on branches, tags and bookmarks using YUI datatable
579 - sorting on branches, tags and bookmarks using YUI datatable
@@ -504,17 +581,17 b' news'
504 - implements #330 api method for listing nodes ar particular revision
581 - implements #330 api method for listing nodes ar particular revision
505 - #73 added linking issues in commit messages to chosen issue tracker url
582 - #73 added linking issues in commit messages to chosen issue tracker url
506 based on user defined regular expression
583 based on user defined regular expression
507 - added linking of changesets in commit messages
584 - added linking of changesets in commit messages
508 - new compact changelog with expandable commit messages
585 - new compact changelog with expandable commit messages
509 - firstname and lastname are optional in user creation
586 - firstname and lastname are optional in user creation
510 - #348 added post-create repository hook
587 - #348 added post-create repository hook
511 - #212 global encoding settings is now configurable from .ini files
588 - #212 global encoding settings is now configurable from .ini files
512 - #227 added repository groups permissions
589 - #227 added repository groups permissions
513 - markdown gets codehilite extensions
590 - markdown gets codehilite extensions
514 - new API methods, delete_repositories, grante/revoke permissions for groups
591 - new API methods, delete_repositories, grante/revoke permissions for groups
515 and repos
592 and repos
516
593
517
594
518 fixes
595 fixes
519 +++++
596 +++++
520
597
@@ -522,15 +599,15 b' fixes'
522 - fixed sorting of repo tables
599 - fixed sorting of repo tables
523 - #326 escape of special html entities in diffs
600 - #326 escape of special html entities in diffs
524 - normalized user_name => username in api attributes
601 - normalized user_name => username in api attributes
525 - fixes #298 ldap created users with mixed case emails created conflicts
602 - fixes #298 ldap created users with mixed case emails created conflicts
526 on saving a form
603 on saving a form
527 - fixes issue when owner of a repo couldn't revoke permissions for users
604 - fixes issue when owner of a repo couldn't revoke permissions for users
528 and groups
605 and groups
529 - fixes #271 rare JSON serialization problem with statistics
606 - fixes #271 rare JSON serialization problem with statistics
530 - fixes #337 missing validation check for conflicting names of a group with a
607 - fixes #337 missing validation check for conflicting names of a group with a
531 repositories group
608 repository group
532 - #340 fixed session problem for mysql and celery tasks
609 - #340 fixed session problem for mysql and celery tasks
533 - fixed #331 RhodeCode mangles repository names if the a repository group
610 - fixed #331 RhodeCode mangles repository names if the a repository group
534 contains the "full path" to the repositories
611 contains the "full path" to the repositories
535 - #355 RhodeCode doesn't store encrypted LDAP passwords
612 - #355 RhodeCode doesn't store encrypted LDAP passwords
536
613
@@ -551,7 +628,7 b' fixes'
551 operation leading to crash.
628 operation leading to crash.
552 - fixed missing email in account page.
629 - fixed missing email in account page.
553 - Reverted Mercurial to 2.0.1 for windows due to bug in Mercurial that makes
630 - Reverted Mercurial to 2.0.1 for windows due to bug in Mercurial that makes
554 forking on windows impossible
631 forking on windows impossible
555
632
556 1.2.4 (**2012-01-19**)
633 1.2.4 (**2012-01-19**)
557 ----------------------
634 ----------------------
@@ -563,23 +640,23 b' news'
563 full support to largefiles extension. Enabled by default in new installations
640 full support to largefiles extension. Enabled by default in new installations
564 - #329 Ability to Add/Remove Groups to/from a Repository via AP
641 - #329 Ability to Add/Remove Groups to/from a Repository via AP
565 - added requires.txt file with requirements
642 - added requires.txt file with requirements
566
643
567 fixes
644 fixes
568 +++++
645 +++++
569
646
570 - fixes db session issues with celery when emailing admins
647 - fixes db session issues with celery when emailing admins
571 - #331 RhodeCode mangles repository names if the a repository group
648 - #331 RhodeCode mangles repository names if the a repository group
572 contains the "full path" to the repositories
649 contains the "full path" to the repositories
573 - #298 Conflicting e-mail addresses for LDAP and RhodeCode users
650 - #298 Conflicting e-mail addresses for LDAP and RhodeCode users
574 - DB session cleanup after hg protocol operations, fixes issues with
651 - DB session cleanup after hg protocol operations, fixes issues with
575 `mysql has gone away` errors
652 `mysql has gone away` errors
576 - #333 doc fixes for get_repo api function
653 - #333 doc fixes for get_repo api function
577 - #271 rare JSON serialization problem with statistics enabled
654 - #271 rare JSON serialization problem with statistics enabled
578 - #337 Fixes issues with validation of repository name conflicting with
655 - #337 Fixes issues with validation of repository name conflicting with
579 a group name. A proper message is now displayed.
656 a group name. A proper message is now displayed.
580 - #292 made ldap_dn in user edit readonly, to get rid of confusion that field
657 - #292 made ldap_dn in user edit readonly, to get rid of confusion that field
581 doesn't work
658 doesn't work
582 - #316 fixes issues with web description in hgrc files
659 - #316 fixes issues with web description in hgrc files
583
660
584 1.2.3 (**2011-11-02**)
661 1.2.3 (**2011-11-02**)
585 ----------------------
662 ----------------------
@@ -587,21 +664,21 b' 1.2.3 (**2011-11-02**)'
587 news
664 news
588 ++++
665 ++++
589
666
590 - added option to manage repos group for non admin users
667 - added option to manage repository group for non admin users
591 - added following API methods for get_users, create_user, get_users_groups,
668 - added following API methods for get_users, create_user, get_users_groups,
592 get_users_group, create_users_group, add_user_to_users_groups, get_repos,
669 get_users_group, create_users_group, add_user_to_users_groups, get_repos,
593 get_repo, create_repo, add_user_to_repo
670 get_repo, create_repo, add_user_to_repo
594 - implements #237 added password confirmation for my account
671 - implements #237 added password confirmation for my account
595 and admin edit user.
672 and admin edit user.
596 - implements #291 email notification for global events are now sent to all
673 - implements #291 email notification for global events are now sent to all
597 administrator users, and global config email.
674 administrator users, and global config email.
598
675
599 fixes
676 fixes
600 +++++
677 +++++
601
678
602 - added option for passing auth method for smtp mailer
679 - added option for passing auth method for smtp mailer
603 - #276 issue with adding a single user with id>10 to usergroups
680 - #276 issue with adding a single user with id>10 to usergroups
604 - #277 fixes windows LDAP settings in which missing values breaks the ldap auth
681 - #277 fixes windows LDAP settings in which missing values breaks the ldap auth
605 - #288 fixes managing of repos in a group for non admin user
682 - #288 fixes managing of repos in a group for non admin user
606
683
607 1.2.2 (**2011-10-17**)
684 1.2.2 (**2011-10-17**)
@@ -611,17 +688,17 b' news'
611 ++++
688 ++++
612
689
613 - #226 repo groups are available by path instead of numerical id
690 - #226 repo groups are available by path instead of numerical id
614
691
615 fixes
692 fixes
616 +++++
693 +++++
617
694
618 - #259 Groups with the same name but with different parent group
695 - #259 Groups with the same name but with different parent group
619 - #260 Put repo in group, then move group to another group -> repo becomes unavailable
696 - #260 Put repo in group, then move group to another group -> repo becomes unavailable
620 - #258 RhodeCode 1.2 assumes egg folder is writable (lockfiles problems)
697 - #258 RhodeCode 1.2 assumes egg folder is writable (lockfiles problems)
621 - #265 ldap save fails sometimes on converting attributes to booleans,
698 - #265 ldap save fails sometimes on converting attributes to booleans,
622 added getter and setter into model that will prevent from this on db model level
699 added getter and setter into model that will prevent from this on db model level
623 - fixed problems with timestamps issues #251 and #213
700 - fixed problems with timestamps issues #251 and #213
624 - fixes #266 RhodeCode allows to create repo with the same name and in
701 - fixes #266 RhodeCode allows to create repo with the same name and in
625 the same parent as group
702 the same parent as group
626 - fixes #245 Rescan of the repositories on Windows
703 - fixes #245 Rescan of the repositories on Windows
627 - fixes #248 cannot edit repos inside a group on windows
704 - fixes #248 cannot edit repos inside a group on windows
@@ -637,7 +714,7 b' news'
637 fixes
714 fixes
638 +++++
715 +++++
639
716
640 - fixed problems with basic auth and push problems
717 - fixed problems with basic auth and push problems
641 - gui fixes
718 - gui fixes
642 - fixed logger
719 - fixed logger
643
720
@@ -655,30 +732,30 b' news'
655 - implemented #84 downloads can be enabled/disabled for each repository
732 - implemented #84 downloads can be enabled/disabled for each repository
656 - anonymous repository can be cloned without having to pass default:default
733 - anonymous repository can be cloned without having to pass default:default
657 into clone url
734 into clone url
658 - fixed #90 whoosh indexer can index chooses repositories passed in command
735 - fixed #90 whoosh indexer can index chooses repositories passed in command
659 line
736 line
660 - extended journal with day aggregates and paging
737 - extended journal with day aggregates and paging
661 - implemented #107 source code lines highlight ranges
738 - implemented #107 source code lines highlight ranges
662 - implemented #93 customizable changelog on combined revision ranges -
739 - implemented #93 customizable changelog on combined revision ranges -
663 equivalent of githubs compare view
740 equivalent of githubs compare view
664 - implemented #108 extended and more powerful LDAP configuration
741 - implemented #108 extended and more powerful LDAP configuration
665 - implemented #56 users groups
742 - implemented #56 user groups
666 - major code rewrites optimized codes for speed and memory usage
743 - major code rewrites optimized codes for speed and memory usage
667 - raw and diff downloads are now in git format
744 - raw and diff downloads are now in git format
668 - setup command checks for write access to given path
745 - setup command checks for write access to given path
669 - fixed many issues with international characters and unicode. It uses utf8
746 - fixed many issues with international characters and unicode. It uses utf8
670 decode with replace to provide less errors even with non utf8 encoded strings
747 decode with replace to provide less errors even with non utf8 encoded strings
671 - #125 added API KEY access to feeds
748 - #125 added API KEY access to feeds
672 - #109 Repository can be created from external Mercurial link (aka. remote
749 - #109 Repository can be created from external Mercurial link (aka. remote
673 repository, and manually updated (via pull) from admin panel
750 repository, and manually updated (via pull) from admin panel
674 - beta git support - push/pull server + basic view for git repos
751 - beta git support - push/pull server + basic view for git repos
675 - added followers page and forks page
752 - added followers page and forks page
676 - server side file creation (with binary file upload interface)
753 - server side file creation (with binary file upload interface)
677 and edition with commits powered by codemirror
754 and edition with commits powered by codemirror
678 - #111 file browser file finder, quick lookup files on whole file tree
755 - #111 file browser file finder, quick lookup files on whole file tree
679 - added quick login sliding menu into main page
756 - added quick login sliding menu into main page
680 - changelog uses lazy loading of affected files details, in some scenarios
757 - changelog uses lazy loading of affected files details, in some scenarios
681 this can improve speed of changelog page dramatically especially for
758 this can improve speed of changelog page dramatically especially for
682 larger repositories.
759 larger repositories.
683 - implements #214 added support for downloading subrepos in download menu.
760 - implements #214 added support for downloading subrepos in download menu.
684 - Added basic API for direct operations on rhodecode via JSON
761 - Added basic API for direct operations on rhodecode via JSON
@@ -687,7 +764,7 b' news'
687 fixes
764 fixes
688 +++++
765 +++++
689
766
690 - fixed file browser bug, when switching into given form revision the url was
767 - fixed file browser bug, when switching into given form revision the url was
691 not changing
768 not changing
692 - fixed propagation to error controller on simplehg and simplegit middlewares
769 - fixed propagation to error controller on simplehg and simplegit middlewares
693 - fixed error when trying to make a download on empty repository
770 - fixed error when trying to make a download on empty repository
@@ -696,8 +773,8 b' fixes'
696 - journal fork fixes
773 - journal fork fixes
697 - removed issue with space inside renamed repository after deletion
774 - removed issue with space inside renamed repository after deletion
698 - fixed strange issue on formencode imports
775 - fixed strange issue on formencode imports
699 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
776 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
700 - #150 fixes for errors on repositories mapped in db but corrupted in
777 - #150 fixes for errors on repositories mapped in db but corrupted in
701 filesystem
778 filesystem
702 - fixed problem with ascendant characters in realm #181
779 - fixed problem with ascendant characters in realm #181
703 - fixed problem with sqlite file based database connection pool
780 - fixed problem with sqlite file based database connection pool
@@ -707,12 +784,12 b' fixes'
707 - fixes issue #197 Relative paths for pidlocks
784 - fixes issue #197 Relative paths for pidlocks
708 - fixes issue #198 password will require only 3 chars now for login form
785 - fixes issue #198 password will require only 3 chars now for login form
709 - fixes issue #199 wrong redirection for non admin users after creating a repository
786 - fixes issue #199 wrong redirection for non admin users after creating a repository
710 - fixes issues #202, bad db constraint made impossible to attach same group
787 - fixes issues #202, bad db constraint made impossible to attach same group
711 more than one time. Affects only mysql/postgres
788 more than one time. Affects only mysql/postgres
712 - fixes #218 os.kill patch for windows was missing sig param
789 - fixes #218 os.kill patch for windows was missing sig param
713 - improved rendering of dag (they are not trimmed anymore when number of
790 - improved rendering of dag (they are not trimmed anymore when number of
714 heads exceeds 5)
791 heads exceeds 5)
715
792
716 1.1.8 (**2011-04-12**)
793 1.1.8 (**2011-04-12**)
717 ----------------------
794 ----------------------
718
795
@@ -739,7 +816,7 b' fixes'
739 - fixed problems with displaying binary files, thanks to Thomas Waldmann
816 - fixed problems with displaying binary files, thanks to Thomas Waldmann
740 - removed name from archive files since it's breaking ui for long repo names
817 - removed name from archive files since it's breaking ui for long repo names
741 - fixed issue with archive headers sent to browser, thanks to Thomas Waldmann
818 - fixed issue with archive headers sent to browser, thanks to Thomas Waldmann
742 - fixed compatibility for 1024px displays, and larger dpi settings, thanks to
819 - fixed compatibility for 1024px displays, and larger dpi settings, thanks to
743 Thomas Waldmann
820 Thomas Waldmann
744 - fixed issue #166 summary pager was skipping 10 revisions on second page
821 - fixed issue #166 summary pager was skipping 10 revisions on second page
745
822
@@ -783,8 +860,8 b' fixes'
783 - fixed sorting by author in main page
860 - fixed sorting by author in main page
784 - fixed crashes with diffs on binary files
861 - fixed crashes with diffs on binary files
785 - fixed #131 problem with boolean values for LDAP
862 - fixed #131 problem with boolean values for LDAP
786 - fixed #122 mysql problems thanks to striker69
863 - fixed #122 mysql problems thanks to striker69
787 - fixed problem with errors on calling raw/raw_files/annotate functions
864 - fixed problem with errors on calling raw/raw_files/annotate functions
788 with unknown revisions
865 with unknown revisions
789 - fixed returned rawfiles attachment names with international character
866 - fixed returned rawfiles attachment names with international character
790 - cleaned out docs, big thanks to Jason Harris
867 - cleaned out docs, big thanks to Jason Harris
@@ -801,7 +878,7 b' fixes'
801 - fixed formencode import problem on settings page, that caused server crash
878 - fixed formencode import problem on settings page, that caused server crash
802 when that page was accessed as first after server start
879 when that page was accessed as first after server start
803 - journal fixes
880 - journal fixes
804 - fixed option to access repository just by entering http://server/<repo_name>
881 - fixed option to access repository just by entering http://server/<repo_name>
805
882
806 1.1.3 (**2011-02-16**)
883 1.1.3 (**2011-02-16**)
807 ----------------------
884 ----------------------
@@ -816,11 +893,11 b' news'
816 fixes
893 fixes
817 +++++
894 +++++
818
895
819 - fixed ehlo command and non auth mail servers on smtp_lib. Thanks to
896 - fixed ehlo command and non auth mail servers on smtp_lib. Thanks to
820 apollo13 and Johan Walles
897 apollo13 and Johan Walles
821 - small fixes in journal
898 - small fixes in journal
822 - fixed problems with getting setting for celery from .ini files
899 - fixed problems with getting setting for celery from .ini files
823 - registration, password reset and login boxes share the same title as main
900 - registration, password reset and login boxes share the same title as main
824 application now
901 application now
825 - fixed #113: to high permissions to fork repository
902 - fixed #113: to high permissions to fork repository
826 - fixed problem with '[' chars in commit messages in journal
903 - fixed problem with '[' chars in commit messages in journal
@@ -841,11 +918,11 b' fixes'
841
918
842 - fixes #98 protection against float division of percentage stats
919 - fixes #98 protection against float division of percentage stats
843 - fixed graph bug
920 - fixed graph bug
844 - forced webhelpers version since it was making troubles during installation
921 - forced webhelpers version since it was making troubles during installation
845
922
846 1.1.1 (**2011-01-06**)
923 1.1.1 (**2011-01-06**)
847 ----------------------
924 ----------------------
848
925
849 news
926 news
850 ++++
927 ++++
851
928
@@ -869,10 +946,10 b' news'
869 ++++
946 ++++
870
947
871 - rewrite of internals for vcs >=0.1.10
948 - rewrite of internals for vcs >=0.1.10
872 - uses mercurial 1.7 with dotencode disabled for maintaining compatibility
949 - uses mercurial 1.7 with dotencode disabled for maintaining compatibility
873 with older clients
950 with older clients
874 - anonymous access, authentication via ldap
951 - anonymous access, authentication via ldap
875 - performance upgrade for cached repos list - each repository has its own
952 - performance upgrade for cached repos list - each repository has its own
876 cache that's invalidated when needed.
953 cache that's invalidated when needed.
877 - performance upgrades on repositories with large amount of commits (20K+)
954 - performance upgrades on repositories with large amount of commits (20K+)
878 - main page quick filter for filtering repositories
955 - main page quick filter for filtering repositories
@@ -882,7 +959,7 b' news'
882 - more detailed action logger (based on hooks) with pushed changesets lists
959 - more detailed action logger (based on hooks) with pushed changesets lists
883 and options to disable those hooks from admin panel
960 and options to disable those hooks from admin panel
884 - introduced new enhanced changelog for merges that shows more accurate results
961 - introduced new enhanced changelog for merges that shows more accurate results
885 - new improved and faster code stats (based on pygments lexers mapping tables,
962 - new improved and faster code stats (based on pygments lexers mapping tables,
886 showing up to 10 trending sources for each repository. Additionally stats
963 showing up to 10 trending sources for each repository. Additionally stats
887 can be disabled in repository settings.
964 can be disabled in repository settings.
888 - gui optimizations, fixed application width to 1024px
965 - gui optimizations, fixed application width to 1024px
@@ -903,10 +980,10 b' fixes'
903 - a lot of fixes and tweaks for file browser
980 - a lot of fixes and tweaks for file browser
904 - fixed detached session issues
981 - fixed detached session issues
905 - fixed when user had no repos he would see all repos listed in my account
982 - fixed when user had no repos he would see all repos listed in my account
906 - fixed ui() instance bug when global hgrc settings was loaded for server
983 - fixed ui() instance bug when global hgrc settings was loaded for server
907 instance and all hgrc options were merged with our db ui() object
984 instance and all hgrc options were merged with our db ui() object
908 - numerous small bugfixes
985 - numerous small bugfixes
909
986
910 (special thanks for TkSoh for detailed feedback)
987 (special thanks for TkSoh for detailed feedback)
911
988
912
989
@@ -971,6 +1048,6 b' 1.0.0rc3 (**2010-10-11**)'
971 1.0.0rc2 (**2010-10-11**)
1048 1.0.0rc2 (**2010-10-11**)
972 -------------------------
1049 -------------------------
973
1050
974 - Disabled dirsize in file browser, it's causing nasty bug when dir renames
1051 - Disabled dirsize in file browser, it's causing nasty bug when dir renames
975 occure. After vcs is fixed it'll be put back again.
1052 occure. After vcs is fixed it'll be put back again.
976 - templating/css rewrites, optimized css.
1053 - templating/css rewrites, optimized css.
@@ -10,9 +10,9 b' greatly appreciated!'
10 Could I request that you make your source contributions by first forking the
10 Could I request that you make your source contributions by first forking the
11 RhodeCode repository on bitbucket_
11 RhodeCode repository on bitbucket_
12 https://bitbucket.org/marcinkuzminski/rhodecode and then make your changes to
12 https://bitbucket.org/marcinkuzminski/rhodecode and then make your changes to
13 your forked repository. Please post all fixes into **BETA** branch since your
13 your forked repository. Please post all fixes into **BETA** branch since your
14 fix might be already fixed there and i try to merge all fixes from beta into
14 fix might be already fixed there and i try to merge all fixes from beta into
15 stable, and not the other way. Finally, when you are finished making a change,
15 stable, and not the other way. Finally, when you are finished making a change,
16 please send me a pull request.
16 please send me a pull request.
17
17
18 To run RhodeCode in a development version you always need to install the latest
18 To run RhodeCode in a development version you always need to install the latest
@@ -22,7 +22,7 b' after downloading/pulling RhodeCode make'
22
22
23 python setup.py develop
23 python setup.py develop
24
24
25 command to install/verify all required packages, and prepare development
25 command to install/verify all required packages, and prepare development
26 enviroment.
26 enviroment.
27
27
28
28
@@ -13,7 +13,7 b' Users Guide'
13 installation
13 installation
14 setup
14 setup
15 upgrade
15 upgrade
16
16
17 **Usage**
17 **Usage**
18
18
19 .. toctree::
19 .. toctree::
@@ -33,7 +33,7 b' Users Guide'
33
33
34 .. toctree::
34 .. toctree::
35 :maxdepth: 1
35 :maxdepth: 1
36
36
37 contributing
37 contributing
38 changelog
38 changelog
39
39
@@ -44,7 +44,7 b' Users Guide'
44
44
45 api/api
45 api/api
46 api/models
46 api/models
47
47
48
48
49 Other topics
49 Other topics
50 ------------
50 ------------
@@ -61,4 +61,4 b' Other topics'
61 .. _git: http://git-scm.com/
61 .. _git: http://git-scm.com/
62 .. _celery: http://celeryproject.org/
62 .. _celery: http://celeryproject.org/
63 .. _Sphinx: http://sphinx.pocoo.org/
63 .. _Sphinx: http://sphinx.pocoo.org/
64 .. _vcs: http://pypi.python.org/pypi/vcs No newline at end of file
64 .. _vcs: http://pypi.python.org/pypi/vcs
@@ -4,8 +4,8 b''
4 Installation
4 Installation
5 ============
5 ============
6
6
7 ``RhodeCode`` is written entirely in Python. Before posting any issues make
7 ``RhodeCode`` is written entirely in Python. Before posting any issues make
8 sure, your not missing any system libraries and using right version of
8 sure, your not missing any system libraries and using right version of
9 libraries required by RhodeCode. There's also restriction in terms of mercurial
9 libraries required by RhodeCode. There's also restriction in terms of mercurial
10 clients. Minimal version of hg client known working fine with RhodeCode is
10 clients. Minimal version of hg client known working fine with RhodeCode is
11 **1.6**. If you're using older client, please upgrade.
11 **1.6**. If you're using older client, please upgrade.
@@ -41,14 +41,14 b' Step by step installation example for Li'
41
41
42 For installing RhodeCode i highly recommend using separate virtualenv_. This
42 For installing RhodeCode i highly recommend using separate virtualenv_. This
43 way many required by RhodeCode libraries will remain sandboxed from your main
43 way many required by RhodeCode libraries will remain sandboxed from your main
44 python and making things less problematic when doing system python updates.
44 python and making things less problematic when doing system python updates.
45
45
46 Alternative very detailed installation instructions for Ubuntu Server with
46 Alternative very detailed installation instructions for Ubuntu Server with
47 celery, indexer and daemon scripts: https://gist.github.com/4546398
47 celery, indexer and daemon scripts: https://gist.github.com/4546398
48
48
49
49
50 - Assuming you have installed virtualenv_ create a new virtual environment
50 - Assuming you have installed virtualenv_ create a new virtual environment
51 using virtualenv command::
51 using virtualenv command::
52
52
53 virtualenv --no-site-packages /opt/rhodecode-venv
53 virtualenv --no-site-packages /opt/rhodecode-venv
54
54
@@ -63,7 +63,7 b' celery, indexer and daemon scripts: http'
63 Python's "main" site-packages dir.
63 Python's "main" site-packages dir.
64
64
65
65
66 - this will install new virtualenv_ into `/opt/rhodecode-venv`.
66 - this will install new virtualenv_ into `/opt/rhodecode-venv`.
67 - Activate the virtualenv_ by running::
67 - Activate the virtualenv_ by running::
68
68
69 source /opt/rhodecode-venv/bin/activate
69 source /opt/rhodecode-venv/bin/activate
@@ -71,52 +71,52 b' celery, indexer and daemon scripts: http'
71 .. note:: If you're using UNIX, *do not* use ``sudo`` to run the
71 .. note:: If you're using UNIX, *do not* use ``sudo`` to run the
72 ``virtualenv`` script. It's perfectly acceptable (and desirable)
72 ``virtualenv`` script. It's perfectly acceptable (and desirable)
73 to create a virtualenv as a normal user.
73 to create a virtualenv as a normal user.
74
74
75 - Make a folder for rhodecode data files, and configuration somewhere on the
75 - Make a folder for rhodecode data files, and configuration somewhere on the
76 filesystem. For example::
76 filesystem. For example::
77
77
78 mkdir /opt/rhodecode
78 mkdir /opt/rhodecode
79
79
80
80
81 - Go into the created directory run this command to install rhodecode::
81 - Go into the created directory run this command to install rhodecode::
82
82
83 easy_install rhodecode
83 easy_install rhodecode
84
84
85 or::
85 or::
86
87 pip install rhodecode
88
86
89 - This will install rhodecode together with pylons and all other required
87 pip install rhodecode
88
89 - This will install rhodecode together with pylons and all other required
90 python libraries into activated virtualenv
90 python libraries into activated virtualenv
91
91
92 Requirements for Celery (optional)
92 Requirements for Celery (optional)
93 ----------------------------------
93 ----------------------------------
94
94
95 In order to gain maximum performance
95 In order to gain maximum performance
96 there are some third-party you must install. When RhodeCode is used
96 there are some third-party you must install. When RhodeCode is used
97 together with celery you have to install some kind of message broker,
97 together with celery you have to install some kind of message broker,
98 recommended one is rabbitmq_ to make the async tasks work.
98 recommended one is rabbitmq_ to make the async tasks work.
99
99
100 Of course RhodeCode works in sync mode also and then you do not have to install
100 Of course RhodeCode works in sync mode also and then you do not have to install
101 any third party applications. However, using Celery_ will give you a large
101 any third party applications. However, using Celery_ will give you a large
102 speed improvement when using many big repositories. If you plan to use
102 speed improvement when using many big repositories. If you plan to use
103 RhodeCode for say 7 to 10 repositories, RhodeCode will perform perfectly well
103 RhodeCode for say 7 to 10 repositories, RhodeCode will perform perfectly well
104 without celery running.
104 without celery running.
105
105
106 If you make the decision to run RhodeCode with celery make sure you run
106 If you make the decision to run RhodeCode with celery make sure you run
107 celeryd using paster and message broker together with the application.
107 celeryd using paster and message broker together with the application.
108
108
109 .. note::
109 .. note::
110 Installing message broker and using celery is optional, RhodeCode will
110 Installing message broker and using celery is optional, RhodeCode will
111 work perfectly fine without them.
111 work perfectly fine without them.
112
112
113
113
114 **Message Broker**
114 **Message Broker**
115
115
116 - preferred is `RabbitMq <http://www.rabbitmq.com/>`_
116 - preferred is `RabbitMq <http://www.rabbitmq.com/>`_
117 - A possible alternative is `Redis <http://code.google.com/p/redis/>`_
117 - A possible alternative is `Redis <http://code.google.com/p/redis/>`_
118
118
119 For installation instructions you can visit:
119 For installation instructions you can visit:
120 http://ask.github.com/celery/getting-started/index.html.
120 http://ask.github.com/celery/getting-started/index.html.
121 This is a very nice tutorial on how to start using celery_ with rabbitmq_
121 This is a very nice tutorial on how to start using celery_ with rabbitmq_
122
122
@@ -126,7 +126,7 b' You can now proceed to :ref:`setup`'
126
126
127
127
128
128
129 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
129 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
130 .. _python: http://www.python.org/
130 .. _python: http://www.python.org/
131 .. _mercurial: http://mercurial.selenic.com/
131 .. _mercurial: http://mercurial.selenic.com/
132 .. _celery: http://celeryproject.org/
132 .. _celery: http://celeryproject.org/
@@ -47,7 +47,7 b' choose "Visual C++ 2008 Express" when in'
47 required, you can uncheck them
47 required, you can uncheck them
48
48
49 .. note::
49 .. note::
50
50
51 64bit: You also need to install the Microsoft Windows SDK for .NET 3.5 SP1 (.NET 4.0 won't work).
51 64bit: You also need to install the Microsoft Windows SDK for .NET 3.5 SP1 (.NET 4.0 won't work).
52 Download from: http://www.microsoft.com/en-us/download/details.aspx?id=3138
52 Download from: http://www.microsoft.com/en-us/download/details.aspx?id=3138
53
53
@@ -90,7 +90,7 b' http://sourceforge.net/projects/pywin32/'
90 .. note::
90 .. note::
91
91
92 64bit: Download and install the 64bit version.
92 64bit: Download and install the 64bit version.
93 At the time of writing you can find this at:
93 At the time of writing you can find this at:
94 http://sourceforge.net/projects/pywin32/files/pywin32/Build%20218/pywin32-218.win-amd64-py2.7.exe/download
94 http://sourceforge.net/projects/pywin32/files/pywin32/Build%20218/pywin32-218.win-amd64-py2.7.exe/download
95
95
96 Step4 - Python BIN
96 Step4 - Python BIN
@@ -478,7 +478,7 b' Changing default encoding'
478
478
479 By default RhodeCode uses utf8 encoding, starting from 1.3 series this
479 By default RhodeCode uses utf8 encoding, starting from 1.3 series this
480 can be changed, simply edit default_encoding in .ini file to desired one.
480 can be changed, simply edit default_encoding in .ini file to desired one.
481 This affects many parts in rhodecode including commiters names, filenames,
481 This affects many parts in rhodecode including committers names, filenames,
482 encoding of commit messages. In addition RhodeCode can detect if `chardet`
482 encoding of commit messages. In addition RhodeCode can detect if `chardet`
483 library is installed. If `chardet` is detected RhodeCode will fallback to it
483 library is installed. If `chardet` is detected RhodeCode will fallback to it
484 when there are encode/decode errors.
484 when there are encode/decode errors.
@@ -652,7 +652,7 b' Add the following at the end of the .ini'
652 prefix = /<someprefix>
652 prefix = /<someprefix>
653
653
654
654
655 then change <someprefix> into your choosen prefix
655 then change <someprefix> into your chosen prefix
656
656
657 Apache's WSGI config
657 Apache's WSGI config
658 --------------------
658 --------------------
@@ -3,16 +3,16 b''
3 {% block sidebarlogo %}
3 {% block sidebarlogo %}
4 <h3>Support RhodeCode development.</h3>
4 <h3>Support RhodeCode development.</h3>
5 <div style="text-align:center">
5 <div style="text-align:center">
6 <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
6 <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
7 <input type="hidden" name="cmd" value="_s-xclick">
7 <input type="hidden" name="cmd" value="_s-xclick">
8 <input type="hidden" name="hosted_button_id" value="8U2LLRPLBKWDU">
8 <input type="hidden" name="hosted_button_id" value="8U2LLRPLBKWDU">
9 <input style="border:0px !important" type="image" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif"
9 <input style="border:0px !important" type="image" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif"
10 border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
10 border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
11 <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
11 <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
12 </form>
12 </form>
13 <div style="padding:5px">
13 <div style="padding:5px">
14 <a href="http://flattr.com/thing/167489/RhodeCode" target="_blank">
14 <a href="http://flattr.com/thing/167489/RhodeCode" target="_blank">
15 <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>
15 <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>
16 </div>
16 </div>
17 </div>
17 </div>
18 {% endblock %}}
18 {% endblock %}}
@@ -51,4 +51,4 b''
51 .vc { color: #ff99ff } /* Name.Variable.Class */
51 .vc { color: #ff99ff } /* Name.Variable.Class */
52 .vg { color: #ff99ff } /* Name.Variable.Global */
52 .vg { color: #ff99ff } /* Name.Variable.Global */
53 .vi { color: #ff99ff } /* Name.Variable.Instance */
53 .vi { color: #ff99ff } /* Name.Variable.Instance */
54 .il { color: #009999 } /* Literal.Number.Integer.Long */ No newline at end of file
54 .il { color: #009999 } /* Literal.Number.Integer.Long */
@@ -23,4 +23,4 b' Database'
23 When using sqlite just copy rhodecode.db.
23 When using sqlite just copy rhodecode.db.
24 Any other database engine requires a manual backup operation.
24 Any other database engine requires a manual backup operation.
25
25
26 Database backup will contain all gathered statistics No newline at end of file
26 Database backup will contain all gathered statistics
@@ -14,7 +14,7 b' enable detailed debug'
14
14
15 RhodeCode uses standard python logging modules to log it's output.
15 RhodeCode uses standard python logging modules to log it's output.
16 By default only loggers with INFO level are displayed. To enable full output
16 By default only loggers with INFO level are displayed. To enable full output
17 change `level = DEBUG` for all logging handlers in currently used .ini file.
17 change `level = DEBUG` for all logging handlers in currently used .ini file.
18 This change will allow to see much more detailed output in the logfile or
18 This change will allow to see much more detailed output in the logfile or
19 console. This generally helps a lot to track issues.
19 console. This generally helps a lot to track issues.
20
20
@@ -38,7 +38,7 b' Compare view from changelog'
38 Checkboxes in compare view allow users to view combined compare view. You can
38 Checkboxes in compare view allow users to view combined compare view. You can
39 only show the range between the first and last checkbox (no cherry pick).
39 only show the range between the first and last checkbox (no cherry pick).
40 Clicking more than one checkbox will activate a link in top saying
40 Clicking more than one checkbox will activate a link in top saying
41 `Show selected changes <from-rev> -> <to-rev>` clicking this will bring
41 `Show selected changesets <from-rev> -> <to-rev>` clicking this will bring
42 compare view. In this view also it's possible to switch to combined compare.
42 compare view. In this view also it's possible to switch to combined compare.
43
43
44 Compare view is also available from the journal on pushes having more than
44 Compare view is also available from the journal on pushes having more than
@@ -105,7 +105,7 b' Currently it support following options:'
105
105
106 .. note::
106 .. note::
107
107
108 * `svn -> hg` cloning requires `hgsubversion` library to be installed.*
108 - *`svn -> hg` cloning requires `hgsubversion` library to be installed.*
109
109
110 If you need to clone repositories that are protected via basic auth, you
110 If you need to clone repositories that are protected via basic auth, you
111 might pass the url with stored credentials inside eg.
111 might pass the url with stored credentials inside eg.
@@ -11,10 +11,10 b' client installed on the machine to make '
11 Although There is one limitation on git usage.
11 Although There is one limitation on git usage.
12
12
13 - large pushes requires a http server with chunked encoding support.
13 - large pushes requires a http server with chunked encoding support.
14
14
15 if you plan to use git you need to run RhodeCode with some
15 if you plan to use git you need to run RhodeCode with some
16 http server that supports chunked encoding which git http protocol uses,
16 http server that supports chunked encoding which git http protocol uses,
17 i recommend using waitress_ or gunicorn_ (linux only) for `paste` wsgi app
17 i recommend using waitress_ or gunicorn_ (linux only) for `paste` wsgi app
18 replacement. Starting from version 1.4 waitress_ is the default wsgi server
18 replacement. Starting from version 1.4 waitress_ is the default wsgi server
19 used in RhodeCode.
19 used in RhodeCode.
20
20
@@ -23,33 +23,33 b' To use, simply change change the followi'
23 use = egg:Paste#http
23 use = egg:Paste#http
24
24
25 to::
25 to::
26
26
27 use = egg:waitress#main
27 use = egg:waitress#main
28
28
29 or::
29 or::
30
30
31 use = egg:gunicorn#main
31 use = egg:gunicorn#main
32
32
33
33
34 And comment out bellow options::
34 And comment out bellow options::
35
35
36 threadpool_workers =
36 threadpool_workers =
37 threadpool_max_requests =
37 threadpool_max_requests =
38 use_threadpool =
38 use_threadpool =
39
39
40
40
41 You can simply run `paster serve` as usual.
41 You can simply run `paster serve` as usual.
42
42
43
43
44 You can always disable git/hg support by editing a
44 You can always disable git/hg support by editing a
45 file **rhodecode/__init__.py** and commenting out backends
45 file **rhodecode/__init__.py** and commenting out backends
46
46
47 .. code-block:: python
47 .. code-block:: python
48
48
49 BACKENDS = {
49 BACKENDS = {
50 'hg': 'Mercurial repository',
50 'hg': 'Mercurial repository',
51 #'git': 'Git repository',
51 #'git': 'Git repository',
52 }
52 }
53
53
54 .. _waitress: http://pypi.python.org/pypi/waitress
54 .. _waitress: http://pypi.python.org/pypi/waitress
55 .. _gunicorn: http://pypi.python.org/pypi/gunicorn No newline at end of file
55 .. _gunicorn: http://pypi.python.org/pypi/gunicorn
@@ -5,37 +5,37 b' RhodeCode repository locking system'
5 ===================================
5 ===================================
6
6
7
7
8 | Repos with **locking function=disabled** is the default, that's how repos work
8 | Repos with **locking function=disabled** is the default, that's how repos work
9 today.
9 today.
10 | Repos with **locking function=enabled** behaves like follows:
10 | Repos with **locking function=enabled** behaves like follows:
11
11
12 Repos have a state called `locked` that can be true or false.
12 Repos have a state called `locked` that can be true or false.
13 The hg/git commands `hg/git clone`, `hg/git pull`, and `hg/git push`
13 The hg/git commands `hg/git clone`, `hg/git pull`, and `hg/git push`
14 influence this state:
14 influence this state:
15
15
16 - The command `hg/git pull <repo>` will lock that repo (locked=true)
16 - The command `hg/git pull <repo>` will lock that repo (locked=true)
17 if the user has write/admin permissions on this repo
17 if the user has write/admin permissions on this repo
18
18
19 - The command `hg/git clone <repo>` will lock that repo (locked=true) if the
19 - The command `hg/git clone <repo>` will lock that repo (locked=true) if the
20 user has write/admin permissions on this repo
20 user has write/admin permissions on this repo
21
21
22
22
23 RhodeCode will remember the user id who locked the repo
23 RhodeCode will remember the user id who locked the repo
24 only this specific user can unlock the repo (locked=false) by calling
24 only this specific user can unlock the repo (locked=false) by calling
25
25
26 - `hg/git push <repo>`
26 - `hg/git push <repo>`
27
27
28 every other command on that repo from this user and
28 every other command on that repo from this user and
29 every command from any other user will result in http return code 423 (locked)
29 every command from any other user will result in http return code 423 (locked)
30
30
31
31
32 additionally the http error includes the <user> that locked the repo
32 additionally the http error includes the <user> that locked the repo
33 (e.g. “repository <repo> locked by user <user>”)
33 (e.g. “repository <repo> locked by user <user>”)
34
34
35
35
36 So the scenario of use for repos with `locking function` enabled is that
36 So the scenario of use for repos with `locking function` enabled is that
37 every initial clone and every pull gives users (with write permission)
37 every initial clone and every pull gives users (with write permission)
38 the exclusive right to do a push.
38 the exclusive right to do a push.
39
39
40
40
41 Each repo can be manually unlocked by admin from the repo settings menu. No newline at end of file
41 Each repo can be manually unlocked by admin from the repo settings menu.
@@ -13,7 +13,8 b' the best performance.'
13 more important to have faster disk than faster CPU.
13 more important to have faster disk than faster CPU.
14
14
15 * Slowness on initial page can be easily fixed by grouping repositories, and/or
15 * Slowness on initial page can be easily fixed by grouping repositories, and/or
16 increasing cache size (see below)
16 increasing cache size (see below), that includes using lightweight dashboard
17 option and vcs_full_cache setting in .ini file
17
18
18
19
19 Follow these few steps to improve performance of RhodeCode system.
20 Follow these few steps to improve performance of RhodeCode system.
@@ -22,7 +23,7 b' Follow these few steps to improve perfor'
22 1. Increase cache
23 1. Increase cache
23
24
24 in the .ini file::
25 in the .ini file::
25
26
26 beaker.cache.sql_cache_long.expire=3600 <-- set this to higher number
27 beaker.cache.sql_cache_long.expire=3600 <-- set this to higher number
27
28
28 This option affects the cache expiration time for main page. Having
29 This option affects the cache expiration time for main page. Having
@@ -33,18 +34,29 b' 1. Increase cache'
33 system and it will expire cache for repositories that had been changed.
34 system and it will expire cache for repositories that had been changed.
34
35
35 2. Switch from sqlite to postgres or mysql
36 2. Switch from sqlite to postgres or mysql
36
37
37 sqlite is a good option when having small load on the system. But due to
38 sqlite is a good option when having small load on the system. But due to
38 locking issues with sqlite, it's not recommended to use it for larger
39 locking issues with sqlite, it's not recommended to use it for larger
39 setup. Switching to mysql or postgres will result in a immediate
40 setup. Switching to mysql or postgres will result in a immediate
40 performance increase.
41 performance increase.
41
42
42 3. Scale RhodeCode horizontally
43 3. Scale RhodeCode horizontally
43
44
44 - running two or more instances on the same server can speed up things a lot
45 Scaling horizontally can give huge performance increase when dealing with
45 - load balance using round robin or ip hash
46 large traffic (large amount of users, CI servers etc). RhodeCode can be
46 - you need to handle consistent user session storage by switching to
47 scaled horizontally on one (recommended) or multiple machines. In order
47 db sessions, client side sessions or sharing session data folder across
48 to scale horizontally you need to do the following:
48 instances. See http://beaker.readthedocs.org/ docs for details.
49
49 - remember that each instance needs it's own .ini file and unique
50 - each instance needs it's own .ini file and unique `instance_id` set in them
50 `instance_id` set in them No newline at end of file
51 - each instance `data` storage needs to be configured to be stored on a
52 shared disk storage, preferably together with repositories. This `data`
53 dir contains template caches, sessions, whoosh index and it's used for
54 tasks locking (so it's safe across multiple instances). Set the
55 `cache_dir`, `index_dir`, `beaker.cache.data_dir`, `beaker.cache.lock_dir`
56 variables in each .ini file to shared location across RhodeCode instances
57 - if celery is used each instance should run separate celery instance, but
58 the message broken should be common to all of them (ex one rabbitmq
59 shared server)
60 - load balance using round robin or ip hash, recommended is writing LB rules
61 that will separate regular user traffic from automated processes like CI
62 servers or build bots.
@@ -5,14 +5,14 b' working with RhodeCode and mercurial sub'
5 =============================================
5 =============================================
6
6
7 example usage of Subrepos with RhodeCode::
7 example usage of Subrepos with RhodeCode::
8
8
9 ## init a simple repo
9 ## init a simple repo
10 hg init repo1
10 hg init repo1
11 cd repo1
11 cd repo1
12 echo "file1" > file1
12 echo "file1" > file1
13 hg add file1
13 hg add file1
14 hg ci --message "initial file 1"
14 hg ci --message "initial file 1"
15
15
16 #clone subrepo we want to add
16 #clone subrepo we want to add
17 hg clone http://rc.local/subrepo
17 hg clone http://rc.local/subrepo
18
18
@@ -22,7 +22,7 b' example usage of Subrepos with RhodeCode'
22 hg add .hgsub
22 hg add .hgsub
23 hg ci --message "added remote subrepo"
23 hg ci --message "added remote subrepo"
24
24
25
25
26
26
27 In file list of repo1 you will see a connected subrepo at revision it was
27 In file list of repo1 you will see a connected subrepo at revision it was
28 during cloning.
28 during cloning.
@@ -34,4 +34,4 b' Next we can edit the subrepo data, and p'
34 both of repositories.
34 both of repositories.
35
35
36 see http://mercurial.aragost.com/kick-start/en/subrepositories/ for more
36 see http://mercurial.aragost.com/kick-start/en/subrepositories/ for more
37 information about subrepositories No newline at end of file
37 information about subrepositories
@@ -2,7 +2,7 b''
2 ########################################
2 ########################################
3 #### THIS IS A DEBIAN INIT.D SCRIPT ####
3 #### THIS IS A DEBIAN INIT.D SCRIPT ####
4 ########################################
4 ########################################
5
5
6 ### BEGIN INIT INFO
6 ### BEGIN INIT INFO
7 # Provides: rhodecode
7 # Provides: rhodecode
8 # Required-Start: $all
8 # Required-Start: $all
@@ -12,29 +12,29 b''
12 # Short-Description: starts instance of rhodecode
12 # Short-Description: starts instance of rhodecode
13 # Description: starts instance of rhodecode using start-stop-daemon
13 # Description: starts instance of rhodecode using start-stop-daemon
14 ### END INIT INFO
14 ### END INIT INFO
15
15
16 APP_NAME="rhodecode"
16 APP_NAME="rhodecode"
17 APP_HOMEDIR="marcink/python_workspace"
17 APP_HOMEDIR="opt"
18 APP_PATH="/home/$APP_HOMEDIR/$APP_NAME"
18 APP_PATH="/$APP_HOMEDIR/$APP_NAME"
19
19
20 CONF_NAME="production.ini"
20 CONF_NAME="production.ini"
21
21
22 PID_PATH="$APP_PATH/$APP_NAME.pid"
22 PID_PATH="$APP_PATH/$APP_NAME.pid"
23 LOG_PATH="$APP_PATH/$APP_NAME.log"
23 LOG_PATH="$APP_PATH/$APP_NAME.log"
24
24
25 PYTHON_PATH="/home/$APP_HOMEDIR/v-env"
25 PYTHON_PATH="/$APP_HOMEDIR/$APP_NAME-venv"
26
26
27 RUN_AS="marcink"
27 RUN_AS="root"
28
28
29 DAEMON="$PYTHON_PATH/bin/paster"
29 DAEMON="$PYTHON_PATH/bin/paster"
30
30
31 DAEMON_OPTS="serve --daemon \
31 DAEMON_OPTS="serve --daemon \
32 --user=$RUN_AS \
32 --user=$RUN_AS \
33 --group=$RUN_AS \
33 --group=$RUN_AS \
34 --pid-file=$PID_PATH \
34 --pid-file=$PID_PATH \
35 --log-file=$LOG_PATH $APP_PATH/$CONF_NAME"
35 --log-file=$LOG_PATH $APP_PATH/$CONF_NAME"
36
36
37
37
38 start() {
38 start() {
39 echo "Starting $APP_NAME"
39 echo "Starting $APP_NAME"
40 PYTHON_EGG_CACHE="/tmp" start-stop-daemon -d $APP_PATH \
40 PYTHON_EGG_CACHE="/tmp" start-stop-daemon -d $APP_PATH \
@@ -43,19 +43,33 b' start() {'
43 --user $RUN_AS \
43 --user $RUN_AS \
44 --exec $DAEMON -- $DAEMON_OPTS
44 --exec $DAEMON -- $DAEMON_OPTS
45 }
45 }
46
46
47 stop() {
47 stop() {
48 echo "Stopping $APP_NAME"
48 echo "Stopping $APP_NAME"
49 start-stop-daemon -d $APP_PATH \
49 start-stop-daemon -d $APP_PATH \
50 --stop --quiet \
50 --stop --quiet \
51 --pidfile $PID_PATH || echo "$APP_NAME - Not running!"
51 --pidfile $PID_PATH || echo "$APP_NAME - Not running!"
52
52
53 if [ -f $PID_PATH ]; then
53 if [ -f $PID_PATH ]; then
54 rm $PID_PATH
54 rm $PID_PATH
55 fi
55 fi
56 }
56 }
57
57
58 status() {
59 echo -n "Checking status of $APP_NAME ... "
60 pid=`cat $PID_PATH`
61 status=`ps ax | grep $pid | grep -ve grep`
62 if [ "$?" -eq 0 ]; then
63 echo "running"
64 else
65 echo "NOT running"
66 fi
67 }
68
58 case "$1" in
69 case "$1" in
70 status)
71 status
72 ;;
59 start)
73 start)
60 start
74 start
61 ;;
75 ;;
@@ -73,4 +87,4 b' case "$1" in'
73 *)
87 *)
74 echo "Usage: $0 {start|stop|restart}"
88 echo "Usage: $0 {start|stop|restart}"
75 exit 1
89 exit 1
76 esac
90 esac No newline at end of file
@@ -25,59 +25,92 b' pdebug = false'
25 #smtp_port =
25 #smtp_port =
26 #smtp_use_tls = false
26 #smtp_use_tls = false
27 #smtp_use_ssl = true
27 #smtp_use_ssl = true
28 # Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
28 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
29 #smtp_auth =
29 #smtp_auth =
30
30
31 [server:main]
31 [server:main]
32 ## PASTE
32 ## PASTE
33 ##nr of threads to spawn
33 ## nr of threads to spawn
34 #threadpool_workers = 5
34 #threadpool_workers = 5
35
35
36 ##max request before thread respawn
36 ## max request before thread respawn
37 #threadpool_max_requests = 10
37 #threadpool_max_requests = 10
38
38
39 ##option to use threads of process
39 ## option to use threads of process
40 #use_threadpool = true
40 #use_threadpool = true
41
41
42 #use = egg:Paste#http
42 #use = egg:Paste#http
43
43
44 #WAITRESS
44 ## WAITRESS
45 threads = 5
45 threads = 5
46 ## 100GB
47 max_request_body_size = 107374182400
46 use = egg:waitress#main
48 use = egg:waitress#main
47
49
48 host = 127.0.0.1
50 host = 127.0.0.1
49 port = 8001
51 port = 8001
50
52
51 [filter:proxy-prefix]
53 ## prefix middleware for rc
52 # prefix middleware for rc
54 #[filter:proxy-prefix]
53 use = egg:PasteDeploy#prefix
55 #use = egg:PasteDeploy#prefix
54 prefix = /<your-prefix>
56 #prefix = /<your-prefix>
55
57
56 [app:main]
58 [app:main]
57 use = egg:rhodecode
59 use = egg:rhodecode
60 ## enable proxy prefix middleware
58 #filter-with = proxy-prefix
61 #filter-with = proxy-prefix
62
59 full_stack = true
63 full_stack = true
60 static_files = true
64 static_files = true
61 # Optional Languages
65 ## Optional Languages
62 # en, fr, ja, pt_BR, zh_CN, zh_TW, pl
66 ## en, fr, ja, pt_BR, zh_CN, zh_TW, pl
63 lang = en
67 lang = en
64 cache_dir = %(here)s/data
68 cache_dir = %(here)s/data
65 index_dir = %(here)s/data/index
69 index_dir = %(here)s/data/index
70
71 ## uncomment and set this path to use archive download cache
72 #archive_cache_dir = /tmp/tarballcache
73
74 ## change this to unique ID for security
66 app_instance_uuid = rc-production
75 app_instance_uuid = rc-production
76
77 ## cut off limit for large diffs (size in bytes)
67 cut_off_limit = 256000
78 cut_off_limit = 256000
68 vcs_full_cache = True
79
80 ## use cache version of scm repo everywhere
81 vcs_full_cache = true
82
83 ## force https in RhodeCode, fixes https redirects, assumes it's always https
69 force_https = false
84 force_https = false
70 commit_parse_limit = 50
85
71 # number of items displayed in lightweight dashboard before paginating
86 ## use Strict-Transport-Security headers
87 use_htsts = false
88
89 ## number of commits stats will parse on each iteration
90 commit_parse_limit = 25
91
92 ## number of items displayed in lightweight dashboard before paginating is shown
72 dashboard_items = 100
93 dashboard_items = 100
94
95 ## use gravatar service to display avatars
73 use_gravatar = true
96 use_gravatar = true
74
97
98 ## path to git executable
99 git_path = git
100
101 ## git rev filter option, --all is the default filter, if you need to
102 ## hide all refs in changelog switch this to --branches --tags
103 git_rev_filter=--all
104
75 ## RSS feed options
105 ## RSS feed options
76
77 rss_cut_off_limit = 256000
106 rss_cut_off_limit = 256000
78 rss_items_per_page = 10
107 rss_items_per_page = 10
79 rss_include_diff = false
108 rss_include_diff = false
80
109
110 ## options for showing and identifying changesets
111 show_sha_length = 12
112 show_revision_number = true
113
81
114
82 ## alternative_gravatar_url allows you to use your own avatar server application
115 ## alternative_gravatar_url allows you to use your own avatar server application
83 ## the following parts of the URL will be replaced
116 ## the following parts of the URL will be replaced
@@ -89,8 +122,11 b' rss_include_diff = false'
89 #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
122 #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
90 #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
123 #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
91
124
125
126 ## container auth options
92 container_auth_enabled = false
127 container_auth_enabled = false
93 proxypass_auth_enabled = false
128 proxypass_auth_enabled = false
129
94 ## default encoding used to convert from and to unicode
130 ## default encoding used to convert from and to unicode
95 ## can be also a comma seperated list of encoding in case of mixed encodings
131 ## can be also a comma seperated list of encoding in case of mixed encodings
96 default_encoding = utf8
132 default_encoding = utf8
@@ -146,6 +182,11 b' instance_id ='
146 ## handling that. Set this variable to 403 to return HTTPForbidden
182 ## handling that. Set this variable to 403 to return HTTPForbidden
147 auth_ret_code =
183 auth_ret_code =
148
184
185 ## locking return code. When repository is locked return this HTTP code. 2XX
186 ## codes don't break the transactions while 4XX codes do
187 lock_ret_code = 423
188
189
149 ####################################
190 ####################################
150 ### CELERY CONFIG ####
191 ### CELERY CONFIG ####
151 ####################################
192 ####################################
@@ -170,7 +211,7 b' celeryd.concurrency = 2'
170 celeryd.log.level = debug
211 celeryd.log.level = debug
171 celeryd.max.tasks.per.child = 1
212 celeryd.max.tasks.per.child = 1
172
213
173 #tasks will never be sent to the queue, but executed locally instead.
214 ## tasks will never be sent to the queue, but executed locally instead.
174 celery.always.eager = false
215 celery.always.eager = false
175
216
176 ####################################
217 ####################################
@@ -226,18 +267,19 b' beaker.cache.sql_cache_long.key_length ='
226
267
227
268
228 beaker.session.key = rhodecode
269 beaker.session.key = rhodecode
229 ## secure cookie requires AES python libraries ##
270 ## secure cookie requires AES python libraries
230 #beaker.session.encrypt_key = g654dcno0-9873jhgfreyu
271 #beaker.session.encrypt_key = <key_for_encryption>
231 #beaker.session.validate_key = 9712sds2212c--zxc123
272 #beaker.session.validate_key = <validation_key>
273
232 ## sets session as invalid if it haven't been accessed for given amount of time
274 ## sets session as invalid if it haven't been accessed for given amount of time
233 beaker.session.timeout = 2592000
275 beaker.session.timeout = 2592000
234 beaker.session.httponly = true
276 beaker.session.httponly = true
235 #beaker.session.cookie_path = /<your-prefix>
277 #beaker.session.cookie_path = /<your-prefix>
236
278
237 ## uncomment for https secure cookie ##
279 ## uncomment for https secure cookie
238 beaker.session.secure = false
280 beaker.session.secure = false
239
281
240 ## auto save the session to not to use .save() ##
282 ## auto save the session to not to use .save()
241 beaker.session.auto = False
283 beaker.session.auto = False
242
284
243 ## default cookie expiration time in seconds `true` expire at browser close ##
285 ## default cookie expiration time in seconds `true` expire at browser close ##
@@ -252,57 +294,57 b' beaker.session.auto = False'
252 ### [errormator] ###
294 ### [errormator] ###
253 ####################
295 ####################
254
296
255 # Errormator is tailored to work with RhodeCode, see
297 ## Errormator is tailored to work with RhodeCode, see
256 # http://errormator.com for details how to obtain an account
298 ## http://errormator.com for details how to obtain an account
257 # you must install python package `errormator_client` to make it work
299 ## you must install python package `errormator_client` to make it work
258
300
259 # errormator enabled
301 ## errormator enabled
260 errormator = true
302 errormator = false
261
303
262 errormator.server_url = https://api.errormator.com
304 errormator.server_url = https://api.errormator.com
263 errormator.api_key = YOUR_API_KEY
305 errormator.api_key = YOUR_API_KEY
264
306
265 # TWEAK AMOUNT OF INFO SENT HERE
307 ## TWEAK AMOUNT OF INFO SENT HERE
266
308
267 # enables 404 error logging (default False)
309 ## enables 404 error logging (default False)
268 errormator.report_404 = false
310 errormator.report_404 = false
269
311
270 # time in seconds after request is considered being slow (default 1)
312 ## time in seconds after request is considered being slow (default 1)
271 errormator.slow_request_time = 1
313 errormator.slow_request_time = 1
272
314
273 # record slow requests in application
315 ## record slow requests in application
274 # (needs to be enabled for slow datastore recording and time tracking)
316 ## (needs to be enabled for slow datastore recording and time tracking)
275 errormator.slow_requests = true
317 errormator.slow_requests = true
276
318
277 # enable hooking to application loggers
319 ## enable hooking to application loggers
278 # errormator.logging = true
320 # errormator.logging = true
279
321
280 # minimum log level for log capture
322 ## minimum log level for log capture
281 # errormator.logging.level = WARNING
323 # errormator.logging.level = WARNING
282
324
283 # send logs only from erroneous/slow requests
325 ## send logs only from erroneous/slow requests
284 # (saves API quota for intensive logging)
326 ## (saves API quota for intensive logging)
285 errormator.logging_on_error = false
327 errormator.logging_on_error = false
286
328
287 # list of additonal keywords that should be grabbed from environ object
329 ## list of additonal keywords that should be grabbed from environ object
288 # can be string with comma separated list of words in lowercase
330 ## can be string with comma separated list of words in lowercase
289 # (by default client will always send following info:
331 ## (by default client will always send following info:
290 # 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
332 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
291 # start with HTTP* this list be extended with additional keywords here
333 ## start with HTTP* this list be extended with additional keywords here
292 errormator.environ_keys_whitelist =
334 errormator.environ_keys_whitelist =
293
335
294
336
295 # list of keywords that should be blanked from request object
337 ## list of keywords that should be blanked from request object
296 # can be string with comma separated list of words in lowercase
338 ## can be string with comma separated list of words in lowercase
297 # (by default client will always blank keys that contain following words
339 ## (by default client will always blank keys that contain following words
298 # 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
340 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
299 # this list be extended with additional keywords set here
341 ## this list be extended with additional keywords set here
300 errormator.request_keys_blacklist =
342 errormator.request_keys_blacklist =
301
343
302
344
303 # list of namespaces that should be ignores when gathering log entries
345 ## list of namespaces that should be ignores when gathering log entries
304 # can be string with comma separated list of namespaces
346 ## can be string with comma separated list of namespaces
305 # (by default the client ignores own entries: errormator_client.client)
347 ## (by default the client ignores own entries: errormator_client.client)
306 errormator.log_namespace_blacklist =
348 errormator.log_namespace_blacklist =
307
349
308
350
@@ -310,8 +352,8 b' errormator.log_namespace_blacklist ='
310 ### [sentry] ###
352 ### [sentry] ###
311 ################
353 ################
312
354
313 # sentry is a alternative open source error aggregator
355 ## sentry is a alternative open source error aggregator
314 # you must install python packages `sentry` and `raven` to enable
356 ## you must install python packages `sentry` and `raven` to enable
315
357
316 sentry.dsn = YOUR_DNS
358 sentry.dsn = YOUR_DNS
317 sentry.servers =
359 sentry.servers =
@@ -371,7 +413,7 b' handlers = console'
371 level = DEBUG
413 level = DEBUG
372 handlers =
414 handlers =
373 qualname = routes.middleware
415 qualname = routes.middleware
374 # "level = DEBUG" logs the route matched and routing variables.
416 ## "level = DEBUG" logs the route matched and routing variables.
375 propagate = 1
417 propagate = 1
376
418
377 [logger_beaker]
419 [logger_beaker]
@@ -26,7 +26,7 b''
26 import sys
26 import sys
27 import platform
27 import platform
28
28
29 VERSION = (1, 5, 4)
29 VERSION = (1, 6, 0, 'rc1')
30
30
31 try:
31 try:
32 from rhodecode.lib import get_current_revision
32 from rhodecode.lib import get_current_revision
@@ -38,7 +38,7 b' except ImportError:'
38
38
39 __version__ = ('.'.join((str(each) for each in VERSION[:3])) +
39 __version__ = ('.'.join((str(each) for each in VERSION[:3])) +
40 '.'.join(VERSION[3:]))
40 '.'.join(VERSION[3:]))
41 __dbversion__ = 10 # defines current db version for migrations
41 __dbversion__ = 11 # defines current db version for migrations
42 __platform__ = platform.system()
42 __platform__ = platform.system()
43 __license__ = 'GPLv3'
43 __license__ = 'GPLv3'
44 __py_version__ = sys.version_info
44 __py_version__ = sys.version_info
@@ -238,7 +238,7 b' def main(argv=None):'
238
238
239 try:
239 try:
240 margs = dict(map(lambda s: s.split(':', 1), other))
240 margs = dict(map(lambda s: s.split(':', 1), other))
241 except:
241 except Exception:
242 sys.stderr.write('Error parsing arguments \n')
242 sys.stderr.write('Error parsing arguments \n')
243 sys.exit()
243 sys.exit()
244
244
@@ -25,59 +25,92 b' pdebug = false'
25 #smtp_port =
25 #smtp_port =
26 #smtp_use_tls = false
26 #smtp_use_tls = false
27 #smtp_use_ssl = true
27 #smtp_use_ssl = true
28 # Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
28 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
29 #smtp_auth =
29 #smtp_auth =
30
30
31 [server:main]
31 [server:main]
32 ## PASTE
32 ## PASTE
33 ##nr of threads to spawn
33 ## nr of threads to spawn
34 #threadpool_workers = 5
34 #threadpool_workers = 5
35
35
36 ##max request before thread respawn
36 ## max request before thread respawn
37 #threadpool_max_requests = 10
37 #threadpool_max_requests = 10
38
38
39 ##option to use threads of process
39 ## option to use threads of process
40 #use_threadpool = true
40 #use_threadpool = true
41
41
42 #use = egg:Paste#http
42 #use = egg:Paste#http
43
43
44 #WAITRESS
44 ## WAITRESS
45 threads = 5
45 threads = 5
46 ## 100GB
47 max_request_body_size = 107374182400
46 use = egg:waitress#main
48 use = egg:waitress#main
47
49
48 host = 127.0.0.1
50 host = 127.0.0.1
49 port = 5000
51 port = 5000
50
52
51 [filter:proxy-prefix]
53 ## prefix middleware for rc
52 # prefix middleware for rc
54 #[filter:proxy-prefix]
53 use = egg:PasteDeploy#prefix
55 #use = egg:PasteDeploy#prefix
54 prefix = /<your-prefix>
56 #prefix = /<your-prefix>
55
57
56 [app:main]
58 [app:main]
57 use = egg:rhodecode
59 use = egg:rhodecode
60 ## enable proxy prefix middleware
58 #filter-with = proxy-prefix
61 #filter-with = proxy-prefix
62
59 full_stack = true
63 full_stack = true
60 static_files = true
64 static_files = true
61 # Optional Languages
65 ## Optional Languages
62 # en, fr, ja, pt_BR, zh_CN, zh_TW, pl
66 ## en, fr, ja, pt_BR, zh_CN, zh_TW, pl
63 lang = en
67 lang = en
64 cache_dir = %(here)s/data
68 cache_dir = %(here)s/data
65 index_dir = %(here)s/data/index
69 index_dir = %(here)s/data/index
70
71 ## uncomment and set this path to use archive download cache
72 #archive_cache_dir = /tmp/tarballcache
73
74 ## change this to unique ID for security
66 app_instance_uuid = ${app_instance_uuid}
75 app_instance_uuid = ${app_instance_uuid}
76
77 ## cut off limit for large diffs (size in bytes)
67 cut_off_limit = 256000
78 cut_off_limit = 256000
68 vcs_full_cache = True
79
80 ## use cache version of scm repo everywhere
81 vcs_full_cache = true
82
83 ## force https in RhodeCode, fixes https redirects, assumes it's always https
69 force_https = false
84 force_https = false
70 commit_parse_limit = 50
85
71 # number of items displayed in lightweight dashboard before paginating
86 ## use Strict-Transport-Security headers
87 use_htsts = false
88
89 ## number of commits stats will parse on each iteration
90 commit_parse_limit = 25
91
92 ## number of items displayed in lightweight dashboard before paginating is shown
72 dashboard_items = 100
93 dashboard_items = 100
94
95 ## use gravatar service to display avatars
73 use_gravatar = true
96 use_gravatar = true
74
97
98 ## path to git executable
99 git_path = git
100
101 ## git rev filter option, --all is the default filter, if you need to
102 ## hide all refs in changelog switch this to --branches --tags
103 git_rev_filter=--all
104
75 ## RSS feed options
105 ## RSS feed options
76
77 rss_cut_off_limit = 256000
106 rss_cut_off_limit = 256000
78 rss_items_per_page = 10
107 rss_items_per_page = 10
79 rss_include_diff = false
108 rss_include_diff = false
80
109
110 ## options for showing and identifying changesets
111 show_sha_length = 12
112 show_revision_number = true
113
81
114
82 ## alternative_gravatar_url allows you to use your own avatar server application
115 ## alternative_gravatar_url allows you to use your own avatar server application
83 ## the following parts of the URL will be replaced
116 ## the following parts of the URL will be replaced
@@ -89,8 +122,11 b' rss_include_diff = false'
89 #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
122 #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
90 #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
123 #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
91
124
125
126 ## container auth options
92 container_auth_enabled = false
127 container_auth_enabled = false
93 proxypass_auth_enabled = false
128 proxypass_auth_enabled = false
129
94 ## default encoding used to convert from and to unicode
130 ## default encoding used to convert from and to unicode
95 ## can be also a comma seperated list of encoding in case of mixed encodings
131 ## can be also a comma seperated list of encoding in case of mixed encodings
96 default_encoding = utf8
132 default_encoding = utf8
@@ -146,6 +182,11 b' instance_id ='
146 ## handling that. Set this variable to 403 to return HTTPForbidden
182 ## handling that. Set this variable to 403 to return HTTPForbidden
147 auth_ret_code =
183 auth_ret_code =
148
184
185 ## locking return code. When repository is locked return this HTTP code. 2XX
186 ## codes don't break the transactions while 4XX codes do
187 lock_ret_code = 423
188
189
149 ####################################
190 ####################################
150 ### CELERY CONFIG ####
191 ### CELERY CONFIG ####
151 ####################################
192 ####################################
@@ -170,7 +211,7 b' celeryd.concurrency = 2'
170 celeryd.log.level = debug
211 celeryd.log.level = debug
171 celeryd.max.tasks.per.child = 1
212 celeryd.max.tasks.per.child = 1
172
213
173 #tasks will never be sent to the queue, but executed locally instead.
214 ## tasks will never be sent to the queue, but executed locally instead.
174 celery.always.eager = false
215 celery.always.eager = false
175
216
176 ####################################
217 ####################################
@@ -226,18 +267,19 b' beaker.cache.sql_cache_long.key_length ='
226
267
227
268
228 beaker.session.key = rhodecode
269 beaker.session.key = rhodecode
229 ## secure cookie requires AES python libraries ##
270 ## secure cookie requires AES python libraries
230 #beaker.session.encrypt_key = g654dcno0-9873jhgfreyu
271 #beaker.session.encrypt_key = <key_for_encryption>
231 #beaker.session.validate_key = 9712sds2212c--zxc123
272 #beaker.session.validate_key = <validation_key>
273
232 ## sets session as invalid if it haven't been accessed for given amount of time
274 ## sets session as invalid if it haven't been accessed for given amount of time
233 beaker.session.timeout = 2592000
275 beaker.session.timeout = 2592000
234 beaker.session.httponly = true
276 beaker.session.httponly = true
235 #beaker.session.cookie_path = /<your-prefix>
277 #beaker.session.cookie_path = /<your-prefix>
236
278
237 ## uncomment for https secure cookie ##
279 ## uncomment for https secure cookie
238 beaker.session.secure = false
280 beaker.session.secure = false
239
281
240 ## auto save the session to not to use .save() ##
282 ## auto save the session to not to use .save()
241 beaker.session.auto = False
283 beaker.session.auto = False
242
284
243 ## default cookie expiration time in seconds `true` expire at browser close ##
285 ## default cookie expiration time in seconds `true` expire at browser close ##
@@ -252,57 +294,57 b' beaker.session.auto = False'
252 ### [errormator] ###
294 ### [errormator] ###
253 ####################
295 ####################
254
296
255 # Errormator is tailored to work with RhodeCode, see
297 ## Errormator is tailored to work with RhodeCode, see
256 # http://errormator.com for details how to obtain an account
298 ## http://errormator.com for details how to obtain an account
257 # you must install python package `errormator_client` to make it work
299 ## you must install python package `errormator_client` to make it work
258
300
259 # errormator enabled
301 ## errormator enabled
260 errormator = true
302 errormator = false
261
303
262 errormator.server_url = https://api.errormator.com
304 errormator.server_url = https://api.errormator.com
263 errormator.api_key = YOUR_API_KEY
305 errormator.api_key = YOUR_API_KEY
264
306
265 # TWEAK AMOUNT OF INFO SENT HERE
307 ## TWEAK AMOUNT OF INFO SENT HERE
266
308
267 # enables 404 error logging (default False)
309 ## enables 404 error logging (default False)
268 errormator.report_404 = false
310 errormator.report_404 = false
269
311
270 # time in seconds after request is considered being slow (default 1)
312 ## time in seconds after request is considered being slow (default 1)
271 errormator.slow_request_time = 1
313 errormator.slow_request_time = 1
272
314
273 # record slow requests in application
315 ## record slow requests in application
274 # (needs to be enabled for slow datastore recording and time tracking)
316 ## (needs to be enabled for slow datastore recording and time tracking)
275 errormator.slow_requests = true
317 errormator.slow_requests = true
276
318
277 # enable hooking to application loggers
319 ## enable hooking to application loggers
278 # errormator.logging = true
320 # errormator.logging = true
279
321
280 # minimum log level for log capture
322 ## minimum log level for log capture
281 # errormator.logging.level = WARNING
323 # errormator.logging.level = WARNING
282
324
283 # send logs only from erroneous/slow requests
325 ## send logs only from erroneous/slow requests
284 # (saves API quota for intensive logging)
326 ## (saves API quota for intensive logging)
285 errormator.logging_on_error = false
327 errormator.logging_on_error = false
286
328
287 # list of additonal keywords that should be grabbed from environ object
329 ## list of additonal keywords that should be grabbed from environ object
288 # can be string with comma separated list of words in lowercase
330 ## can be string with comma separated list of words in lowercase
289 # (by default client will always send following info:
331 ## (by default client will always send following info:
290 # 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
332 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
291 # start with HTTP* this list be extended with additional keywords here
333 ## start with HTTP* this list be extended with additional keywords here
292 errormator.environ_keys_whitelist =
334 errormator.environ_keys_whitelist =
293
335
294
336
295 # list of keywords that should be blanked from request object
337 ## list of keywords that should be blanked from request object
296 # can be string with comma separated list of words in lowercase
338 ## can be string with comma separated list of words in lowercase
297 # (by default client will always blank keys that contain following words
339 ## (by default client will always blank keys that contain following words
298 # 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
340 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
299 # this list be extended with additional keywords set here
341 ## this list be extended with additional keywords set here
300 errormator.request_keys_blacklist =
342 errormator.request_keys_blacklist =
301
343
302
344
303 # list of namespaces that should be ignores when gathering log entries
345 ## list of namespaces that should be ignores when gathering log entries
304 # can be string with comma separated list of namespaces
346 ## can be string with comma separated list of namespaces
305 # (by default the client ignores own entries: errormator_client.client)
347 ## (by default the client ignores own entries: errormator_client.client)
306 errormator.log_namespace_blacklist =
348 errormator.log_namespace_blacklist =
307
349
308
350
@@ -310,8 +352,8 b' errormator.log_namespace_blacklist ='
310 ### [sentry] ###
352 ### [sentry] ###
311 ################
353 ################
312
354
313 # sentry is a alternative open source error aggregator
355 ## sentry is a alternative open source error aggregator
314 # you must install python packages `sentry` and `raven` to enable
356 ## you must install python packages `sentry` and `raven` to enable
315
357
316 sentry.dsn = YOUR_DNS
358 sentry.dsn = YOUR_DNS
317 sentry.servers =
359 sentry.servers =
@@ -381,7 +423,7 b' handlers = console'
381 level = DEBUG
423 level = DEBUG
382 handlers =
424 handlers =
383 qualname = routes.middleware
425 qualname = routes.middleware
384 # "level = DEBUG" logs the route matched and routing variables.
426 ## "level = DEBUG" logs the route matched and routing variables.
385 propagate = 1
427 propagate = 1
386
428
387 [logger_beaker]
429 [logger_beaker]
@@ -20,6 +20,7 b' from rhodecode.lib.auth import set_avail'
20 from rhodecode.lib.utils import repo2db_mapper, make_ui, set_rhodecode_config,\
20 from rhodecode.lib.utils import repo2db_mapper, make_ui, set_rhodecode_config,\
21 load_rcextensions, check_git_version
21 load_rcextensions, check_git_version
22 from rhodecode.lib.utils2 import engine_from_config, str2bool
22 from rhodecode.lib.utils2 import engine_from_config, str2bool
23 from rhodecode.lib.db_manage import DbManage
23 from rhodecode.model import init_model
24 from rhodecode.model import init_model
24 from rhodecode.model.scm import ScmModel
25 from rhodecode.model.scm import ScmModel
25
26
@@ -88,7 +89,7 b' def load_environment(global_conf, app_co'
88
89
89 #check git version
90 #check git version
90 check_git_version()
91 check_git_version()
91
92 DbManage.check_waitress()
92 # MULTIPLE DB configs
93 # MULTIPLE DB configs
93 # Setup the SQLAlchemy database engine
94 # Setup the SQLAlchemy database engine
94 sa_engine_db1 = engine_from_config(config, 'sqlalchemy.db1.')
95 sa_engine_db1 = engine_from_config(config, 'sqlalchemy.db1.')
@@ -100,6 +101,12 b' def load_environment(global_conf, app_co'
100 set_available_permissions(config)
101 set_available_permissions(config)
101 config['base_path'] = repos_path
102 config['base_path'] = repos_path
102 set_rhodecode_config(config)
103 set_rhodecode_config(config)
104
105 instance_id = rhodecode.CONFIG.get('instance_id')
106 if instance_id == '*':
107 instance_id = '%s-%s' % (os.uname()[1], os.getpid())
108 rhodecode.CONFIG['instance_id'] = instance_id
109
103 # CONFIGURATION OPTIONS HERE (note: all config options will override
110 # CONFIGURATION OPTIONS HERE (note: all config options will override
104 # any Pylons config options)
111 # any Pylons config options)
105
112
@@ -15,6 +15,7 b' from rhodecode.lib.middleware.simplehg i'
15 from rhodecode.lib.middleware.simplegit import SimpleGit
15 from rhodecode.lib.middleware.simplegit import SimpleGit
16 from rhodecode.lib.middleware.https_fixup import HttpsFixup
16 from rhodecode.lib.middleware.https_fixup import HttpsFixup
17 from rhodecode.config.environment import load_environment
17 from rhodecode.config.environment import load_environment
18 from rhodecode.lib.middleware.wrapper import RequestWrapper
18
19
19
20
20 def make_app(global_conf, full_stack=True, static_files=True, **app_conf):
21 def make_app(global_conf, full_stack=True, static_files=True, **app_conf):
@@ -55,7 +56,7 b' def make_app(global_conf, full_stack=Tru'
55
56
56 from rhodecode.lib.middleware.sentry import Sentry
57 from rhodecode.lib.middleware.sentry import Sentry
57 from rhodecode.lib.middleware.errormator import Errormator
58 from rhodecode.lib.middleware.errormator import Errormator
58 if Errormator:
59 if Errormator and asbool(config['app_conf'].get('errormator')):
59 app = Errormator(app, config)
60 app = Errormator(app, config)
60 elif Sentry:
61 elif Sentry:
61 app = Sentry(app, config)
62 app = Sentry(app, config)
@@ -67,7 +68,7 b' def make_app(global_conf, full_stack=Tru'
67 # need any pylons stack middleware in them
68 # need any pylons stack middleware in them
68 app = SimpleHg(app, config)
69 app = SimpleHg(app, config)
69 app = SimpleGit(app, config)
70 app = SimpleGit(app, config)
70
71 app = RequestWrapper(app, config)
71 # Display error documents for 401, 403, 404 status codes (and
72 # Display error documents for 401, 403, 404 status codes (and
72 # 500 when debug is disabled)
73 # 500 when debug is disabled)
73 if asbool(config['debug']):
74 if asbool(config['debug']):
@@ -6,6 +6,14 b''
6 # build by pygments
6 # build by pygments
7 EXTRA_MAPPINGS = {}
7 EXTRA_MAPPINGS = {}
8
8
9 # additional lexer definitions for custom files
10 # it's overrides pygments lexers, and uses defined name of lexer to colorize the
11 # files. Format is {'ext': 'lexer_name'}
12 # List of lexers can be printed running:
13 # python -c "import pprint;from pygments import lexers;pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);"
14
15 EXTRA_LEXERS = {}
16
9 #==============================================================================
17 #==============================================================================
10 # WHOOSH INDEX EXTENSIONS
18 # WHOOSH INDEX EXTENSIONS
11 #==============================================================================
19 #==============================================================================
@@ -41,21 +41,32 b' def make_map(config):'
41 if len(by_id) == 2 and by_id[1].isdigit() and by_id[0] == '':
41 if len(by_id) == 2 and by_id[1].isdigit() and by_id[0] == '':
42 repo_name = Repository.get(by_id[1]).repo_name
42 repo_name = Repository.get(by_id[1]).repo_name
43 match_dict['repo_name'] = repo_name
43 match_dict['repo_name'] = repo_name
44 except:
44 except Exception:
45 pass
45 pass
46
46
47 return is_valid_repo(repo_name, config['base_path'])
47 return is_valid_repo(repo_name, config['base_path'])
48
48
49 def check_group(environ, match_dict):
49 def check_group(environ, match_dict):
50 """
50 """
51 check for valid repositories group for proper 404 handling
51 check for valid repository group for proper 404 handling
52
52
53 :param environ:
53 :param environ:
54 :param match_dict:
54 :param match_dict:
55 """
55 """
56 repos_group_name = match_dict.get('group_name')
56 repos_group_name = match_dict.get('group_name')
57 return is_valid_repos_group(repos_group_name, config['base_path'])
57
58
58 return is_valid_repos_group(repos_group_name, config['base_path'])
59 def check_group_skip_path(environ, match_dict):
60 """
61 check for valid repository group for proper 404 handling, but skips
62 verification of existing path
63
64 :param environ:
65 :param match_dict:
66 """
67 repos_group_name = match_dict.get('group_name')
68 return is_valid_repos_group(repos_group_name, config['base_path'],
69 skip_path_check=True)
59
70
60 def check_int(environ, match_dict):
71 def check_int(environ, match_dict):
61 return match_dict.get('id').isdigit()
72 return match_dict.get('id').isdigit()
@@ -93,19 +104,14 b' def make_map(config):'
93 m.connect("formatted_repos", "/repos.{format}",
104 m.connect("formatted_repos", "/repos.{format}",
94 action="index",
105 action="index",
95 conditions=dict(method=["GET"]))
106 conditions=dict(method=["GET"]))
96 m.connect("new_repo", "/repos/new",
107 m.connect("new_repo", "/create_repository",
97 action="new", conditions=dict(method=["GET"]))
108 action="create_repository", conditions=dict(method=["GET"]))
98 m.connect("formatted_new_repo", "/repos/new.{format}",
99 action="new", conditions=dict(method=["GET"]))
100 m.connect("/repos/{repo_name:.*?}",
109 m.connect("/repos/{repo_name:.*?}",
101 action="update", conditions=dict(method=["PUT"],
110 action="update", conditions=dict(method=["PUT"],
102 function=check_repo))
111 function=check_repo))
103 m.connect("/repos/{repo_name:.*?}",
112 m.connect("/repos/{repo_name:.*?}",
104 action="delete", conditions=dict(method=["DELETE"],
113 action="delete", conditions=dict(method=["DELETE"],
105 function=check_repo))
114 function=check_repo))
106 m.connect("edit_repo", "/repos/{repo_name:.*?}/edit",
107 action="edit", conditions=dict(method=["GET"],
108 function=check_repo))
109 m.connect("formatted_edit_repo", "/repos/{repo_name:.*?}.{format}/edit",
115 m.connect("formatted_edit_repo", "/repos/{repo_name:.*?}.{format}/edit",
110 action="edit", conditions=dict(method=["GET"],
116 action="edit", conditions=dict(method=["GET"],
111 function=check_repo))
117 function=check_repo))
@@ -115,6 +121,11 b' def make_map(config):'
115 m.connect("formatted_repo", "/repos/{repo_name:.*?}.{format}",
121 m.connect("formatted_repo", "/repos/{repo_name:.*?}.{format}",
116 action="show", conditions=dict(method=["GET"],
122 action="show", conditions=dict(method=["GET"],
117 function=check_repo))
123 function=check_repo))
124 #add repo perm member
125 m.connect('set_repo_perm_member', "/set_repo_perm_member/{repo_name:.*?}",
126 action="set_repo_perm_member",
127 conditions=dict(method=["POST"], function=check_repo))
128
118 #ajax delete repo perm user
129 #ajax delete repo perm user
119 m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*?}",
130 m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*?}",
120 action="delete_perm_user",
131 action="delete_perm_user",
@@ -145,6 +156,18 b' def make_map(config):'
145 m.connect('repo_locking', "/repo_locking/{repo_name:.*?}",
156 m.connect('repo_locking', "/repo_locking/{repo_name:.*?}",
146 action="repo_locking", conditions=dict(method=["PUT"],
157 action="repo_locking", conditions=dict(method=["PUT"],
147 function=check_repo))
158 function=check_repo))
159 m.connect('toggle_locking', "/locking_toggle/{repo_name:.*?}",
160 action="toggle_locking", conditions=dict(method=["GET"],
161 function=check_repo))
162
163 #repo fields
164 m.connect('create_repo_fields', "/repo_fields/{repo_name:.*?}/new",
165 action="create_repo_field", conditions=dict(method=["PUT"],
166 function=check_repo))
167
168 m.connect('delete_repo_fields', "/repo_fields/{repo_name:.*?}/{field_id}",
169 action="delete_repo_field", conditions=dict(method=["DELETE"],
170 function=check_repo))
148
171
149 with rmap.submapper(path_prefix=ADMIN_PREFIX,
172 with rmap.submapper(path_prefix=ADMIN_PREFIX,
150 controller='admin/repos_groups') as m:
173 controller='admin/repos_groups') as m:
@@ -158,33 +181,34 b' def make_map(config):'
158 action="new", conditions=dict(method=["GET"]))
181 action="new", conditions=dict(method=["GET"]))
159 m.connect("formatted_new_repos_group", "/repos_groups/new.{format}",
182 m.connect("formatted_new_repos_group", "/repos_groups/new.{format}",
160 action="new", conditions=dict(method=["GET"]))
183 action="new", conditions=dict(method=["GET"]))
161 m.connect("update_repos_group", "/repos_groups/{id}",
184 m.connect("update_repos_group", "/repos_groups/{group_name:.*?}",
162 action="update", conditions=dict(method=["PUT"],
185 action="update", conditions=dict(method=["PUT"],
163 function=check_int))
186 function=check_group))
164 m.connect("delete_repos_group", "/repos_groups/{id}",
187 m.connect("delete_repos_group", "/repos_groups/{group_name:.*?}",
165 action="delete", conditions=dict(method=["DELETE"],
188 action="delete", conditions=dict(method=["DELETE"],
166 function=check_int))
189 function=check_group_skip_path))
167 m.connect("edit_repos_group", "/repos_groups/{id:.*?}/edit",
190 m.connect("edit_repos_group", "/repos_groups/{group_name:.*?}/edit",
168 action="edit", conditions=dict(method=["GET"],))
169 m.connect("formatted_edit_repos_group",
170 "/repos_groups/{id}.{format}/edit",
171 action="edit", conditions=dict(method=["GET"],
191 action="edit", conditions=dict(method=["GET"],
172 function=check_int))
192 function=check_group))
173 m.connect("repos_group", "/repos_groups/{id}",
193 m.connect("formatted_edit_repos_group",
194 "/repos_groups/{group_name:.*?}.{format}/edit",
195 action="edit", conditions=dict(method=["GET"],
196 function=check_group))
197 m.connect("repos_group", "/repos_groups/{group_name:.*?}",
174 action="show", conditions=dict(method=["GET"],
198 action="show", conditions=dict(method=["GET"],
175 function=check_int))
199 function=check_group))
176 m.connect("formatted_repos_group", "/repos_groups/{id}.{format}",
200 m.connect("formatted_repos_group", "/repos_groups/{group_name:.*?}.{format}",
177 action="show", conditions=dict(method=["GET"],
201 action="show", conditions=dict(method=["GET"],
178 function=check_int))
202 function=check_group))
179 # ajax delete repos group perm user
203 # ajax delete repository group perm user
180 m.connect('delete_repos_group_user_perm',
204 m.connect('delete_repos_group_user_perm',
181 "/delete_repos_group_user_perm/{group_name:.*}",
205 "/delete_repos_group_user_perm/{group_name:.*?}",
182 action="delete_repos_group_user_perm",
206 action="delete_repos_group_user_perm",
183 conditions=dict(method=["DELETE"], function=check_group))
207 conditions=dict(method=["DELETE"], function=check_group))
184
208
185 # ajax delete repos group perm users_group
209 # ajax delete repository group perm users_group
186 m.connect('delete_repos_group_users_group_perm',
210 m.connect('delete_repos_group_users_group_perm',
187 "/delete_repos_group_users_group_perm/{group_name:.*}",
211 "/delete_repos_group_users_group_perm/{group_name:.*?}",
188 action="delete_repos_group_users_group_perm",
212 action="delete_repos_group_users_group_perm",
189 conditions=dict(method=["DELETE"], function=check_group))
213 conditions=dict(method=["DELETE"], function=check_group))
190
214
@@ -227,7 +251,7 b' def make_map(config):'
227 m.connect("user_ips_delete", "/users_ips/{id}",
251 m.connect("user_ips_delete", "/users_ips/{id}",
228 action="delete_ip", conditions=dict(method=["DELETE"]))
252 action="delete_ip", conditions=dict(method=["DELETE"]))
229
253
230 #ADMIN USERS GROUPS REST ROUTES
254 #ADMIN USER GROUPS REST ROUTES
231 with rmap.submapper(path_prefix=ADMIN_PREFIX,
255 with rmap.submapper(path_prefix=ADMIN_PREFIX,
232 controller='admin/users_groups') as m:
256 controller='admin/users_groups') as m:
233 m.connect("users_groups", "/users_groups",
257 m.connect("users_groups", "/users_groups",
@@ -308,8 +332,6 b' def make_map(config):'
308 action="my_account", conditions=dict(method=["GET"]))
332 action="my_account", conditions=dict(method=["GET"]))
309 m.connect("admin_settings_my_account_update", "/my_account_update",
333 m.connect("admin_settings_my_account_update", "/my_account_update",
310 action="my_account_update", conditions=dict(method=["PUT"]))
334 action="my_account_update", conditions=dict(method=["PUT"]))
311 m.connect("admin_settings_create_repository", "/create_repository",
312 action="create_repository", conditions=dict(method=["GET"]))
313 m.connect("admin_settings_my_repos", "/my_account/repos",
335 m.connect("admin_settings_my_repos", "/my_account/repos",
314 action="my_account_my_repos", conditions=dict(method=["GET"]))
336 action="my_account_my_repos", conditions=dict(method=["GET"]))
315 m.connect("admin_settings_my_pullrequests", "/my_account/pull_requests",
337 m.connect("admin_settings_my_pullrequests", "/my_account/pull_requests",
@@ -389,8 +411,13 b' def make_map(config):'
389
411
390 #SEARCH
412 #SEARCH
391 rmap.connect('search', '%s/search' % ADMIN_PREFIX, controller='search',)
413 rmap.connect('search', '%s/search' % ADMIN_PREFIX, controller='search',)
392 rmap.connect('search_repo', '%s/search/{search_repo:.*}' % ADMIN_PREFIX,
414 rmap.connect('search_repo_admin', '%s/search/{repo_name:.*}' % ADMIN_PREFIX,
393 controller='search')
415 controller='search',
416 conditions=dict(function=check_repo))
417 rmap.connect('search_repo', '/{repo_name:.*?}/search',
418 controller='search',
419 conditions=dict(function=check_repo),
420 )
394
421
395 #LOGIN/LOGOUT/REGISTER/SIGN IN
422 #LOGIN/LOGOUT/REGISTER/SIGN IN
396 rmap.connect('login_home', '%s/login' % ADMIN_PREFIX, controller='login')
423 rmap.connect('login_home', '%s/login' % ADMIN_PREFIX, controller='login')
@@ -423,6 +450,10 b' def make_map(config):'
423 controller='summary',
450 controller='summary',
424 conditions=dict(function=check_repo))
451 conditions=dict(function=check_repo))
425
452
453 rmap.connect('repo_size', '/{repo_name:.*?}/repo_size',
454 controller='summary', action='repo_size',
455 conditions=dict(function=check_repo))
456
426 rmap.connect('repos_group_home', '/{group_name:.*}',
457 rmap.connect('repos_group_home', '/{group_name:.*}',
427 controller='admin/repos_groups', action="show_by_name",
458 controller='admin/repos_groups', action="show_by_name",
428 conditions=dict(function=check_group))
459 conditions=dict(function=check_group))
@@ -431,6 +462,17 b' def make_map(config):'
431 controller='changeset', revision='tip',
462 controller='changeset', revision='tip',
432 conditions=dict(function=check_repo))
463 conditions=dict(function=check_repo))
433
464
465 # no longer user, but kept for routes to work
466 rmap.connect("_edit_repo", "/{repo_name:.*?}/edit",
467 controller='admin/repos', action="edit",
468 conditions=dict(method=["GET"], function=check_repo)
469 )
470
471 rmap.connect("edit_repo", "/{repo_name:.*?}/settings",
472 controller='admin/repos', action="edit",
473 conditions=dict(method=["GET"], function=check_repo)
474 )
475
434 #still working url for backward compat.
476 #still working url for backward compat.
435 rmap.connect('raw_changeset_home_depraced',
477 rmap.connect('raw_changeset_home_depraced',
436 '/{repo_name:.*?}/raw-changeset/{revision}',
478 '/{repo_name:.*?}/raw-changeset/{revision}',
@@ -471,8 +513,8 b' def make_map(config):'
471 controller='compare', action='index',
513 controller='compare', action='index',
472 conditions=dict(function=check_repo),
514 conditions=dict(function=check_repo),
473 requirements=dict(
515 requirements=dict(
474 org_ref_type='(branch|book|tag|rev|org_ref_type)',
516 org_ref_type='(branch|book|tag|rev|__other_ref_type__)',
475 other_ref_type='(branch|book|tag|rev|other_ref_type)')
517 other_ref_type='(branch|book|tag|rev|__org_ref_type__)')
476 )
518 )
477
519
478 rmap.connect('pullrequest_home',
520 rmap.connect('pullrequest_home',
@@ -518,7 +560,7 b' def make_map(config):'
518 controller='pullrequests', action='delete_comment',
560 controller='pullrequests', action='delete_comment',
519 conditions=dict(function=check_repo, method=["DELETE"]))
561 conditions=dict(function=check_repo, method=["DELETE"]))
520
562
521 rmap.connect('summary_home', '/{repo_name:.*?}/summary',
563 rmap.connect('summary_home_summary', '/{repo_name:.*?}/summary',
522 controller='summary', conditions=dict(function=check_repo))
564 controller='summary', conditions=dict(function=check_repo))
523
565
524 rmap.connect('shortlog_home', '/{repo_name:.*?}/shortlog',
566 rmap.connect('shortlog_home', '/{repo_name:.*?}/shortlog',
@@ -548,6 +590,10 b' def make_map(config):'
548 controller='files', revision='tip', f_path='',
590 controller='files', revision='tip', f_path='',
549 conditions=dict(function=check_repo))
591 conditions=dict(function=check_repo))
550
592
593 rmap.connect('files_home_nopath', '/{repo_name:.*?}/files/{revision}',
594 controller='files', revision='tip', f_path='',
595 conditions=dict(function=check_repo))
596
551 rmap.connect('files_history_home',
597 rmap.connect('files_history_home',
552 '/{repo_name:.*?}/history/{revision}/{f_path:.*}',
598 '/{repo_name:.*?}/history/{revision}/{f_path:.*}',
553 controller='files', action='history', revision='tip', f_path='',
599 controller='files', action='history', revision='tip', f_path='',
@@ -591,22 +637,6 b' def make_map(config):'
591 controller='files', action='nodelist',
637 controller='files', action='nodelist',
592 conditions=dict(function=check_repo))
638 conditions=dict(function=check_repo))
593
639
594 rmap.connect('repo_settings_delete', '/{repo_name:.*?}/settings',
595 controller='settings', action="delete",
596 conditions=dict(method=["DELETE"], function=check_repo))
597
598 rmap.connect('repo_settings_update', '/{repo_name:.*?}/settings',
599 controller='settings', action="update",
600 conditions=dict(method=["PUT"], function=check_repo))
601
602 rmap.connect('repo_settings_home', '/{repo_name:.*?}/settings',
603 controller='settings', action='index',
604 conditions=dict(function=check_repo))
605
606 rmap.connect('toggle_locking', "/{repo_name:.*?}/locking_toggle",
607 controller='settings', action="toggle_locking",
608 conditions=dict(method=["GET"], function=check_repo))
609
610 rmap.connect('repo_fork_create_home', '/{repo_name:.*?}/fork',
640 rmap.connect('repo_fork_create_home', '/{repo_name:.*?}/fork',
611 controller='forks', action='fork_create',
641 controller='forks', action='fork_create',
612 conditions=dict(function=check_repo, method=["POST"]))
642 conditions=dict(function=check_repo, method=["POST"]))
@@ -130,7 +130,7 b' class AdminController(BaseController):'
130 c.search_term = request.GET.get('filter')
130 c.search_term = request.GET.get('filter')
131 try:
131 try:
132 users_log = _journal_filter(users_log, c.search_term)
132 users_log = _journal_filter(users_log, c.search_term)
133 except:
133 except Exception:
134 # we want this to crash for now
134 # we want this to crash for now
135 raise
135 raise
136
136
@@ -107,7 +107,7 b' class DefaultsController(BaseController)'
107 encoding="UTF-8")
107 encoding="UTF-8")
108 except Exception:
108 except Exception:
109 log.error(traceback.format_exc())
109 log.error(traceback.format_exc())
110 h.flash(_('error occurred during update of defaults'),
110 h.flash(_('Error occurred during update of defaults'),
111 category='error')
111 category='error')
112
112
113 return redirect(url('defaults'))
113 return redirect(url('defaults'))
@@ -123,7 +123,7 b' class LdapSettingsController(BaseControl'
123 Session().add(setting)
123 Session().add(setting)
124
124
125 Session().commit()
125 Session().commit()
126 h.flash(_('Ldap settings updated successfully'),
126 h.flash(_('LDAP settings updated successfully'),
127 category='success')
127 category='success')
128 if not ldap_active:
128 if not ldap_active:
129 #if ldap is missing send an info to user
129 #if ldap is missing send an info to user
@@ -144,7 +144,7 b' class LdapSettingsController(BaseControl'
144 encoding="UTF-8")
144 encoding="UTF-8")
145 except Exception:
145 except Exception:
146 log.error(traceback.format_exc())
146 log.error(traceback.format_exc())
147 h.flash(_('error occurred during update of ldap settings'),
147 h.flash(_('Error occurred during update of ldap settings'),
148 category='error')
148 category='error')
149
149
150 return redirect(url('ldap_home'))
150 return redirect(url('ldap_home'))
@@ -28,7 +28,7 b' import traceback'
28
28
29 from pylons import request
29 from pylons import request
30 from pylons import tmpl_context as c, url
30 from pylons import tmpl_context as c, url
31 from pylons.controllers.util import redirect
31 from pylons.controllers.util import redirect, abort
32
32
33 from webhelpers.paginate import Page
33 from webhelpers.paginate import Page
34
34
@@ -117,7 +117,7 b' class NotificationsController(BaseContro'
117 Session().commit()
117 Session().commit()
118 return 'ok'
118 return 'ok'
119 except Exception:
119 except Exception:
120 Session.rollback()
120 Session().rollback()
121 log.error(traceback.format_exc())
121 log.error(traceback.format_exc())
122 return 'fail'
122 return 'fail'
123
123
@@ -139,7 +139,7 b' class NotificationsController(BaseContro'
139 Session().commit()
139 Session().commit()
140 return 'ok'
140 return 'ok'
141 except Exception:
141 except Exception:
142 Session.rollback()
142 Session().rollback()
143 log.error(traceback.format_exc())
143 log.error(traceback.format_exc())
144 return 'fail'
144 return 'fail'
145
145
@@ -149,8 +149,9 b' class NotificationsController(BaseContro'
149 c.user = self.rhodecode_user
149 c.user = self.rhodecode_user
150 no = Notification.get(notification_id)
150 no = Notification.get(notification_id)
151
151
152 owner = all(un.user.user_id == c.rhodecode_user.user_id
152 owner = any(un.user.user_id == c.rhodecode_user.user_id
153 for un in no.notifications_to_users)
153 for un in no.notifications_to_users)
154
154 if no and (h.HasPermissionAny('hg.admin', 'repository.admin')() or owner):
155 if no and (h.HasPermissionAny('hg.admin', 'repository.admin')() or owner):
155 unotification = NotificationModel()\
156 unotification = NotificationModel()\
156 .get_user_notification(c.user.user_id, no)
157 .get_user_notification(c.user.user_id, no)
@@ -158,14 +159,14 b' class NotificationsController(BaseContro'
158 # if this association to user is not valid, we don't want to show
159 # if this association to user is not valid, we don't want to show
159 # this message
160 # this message
160 if unotification:
161 if unotification:
161 if unotification.read is False:
162 if not unotification.read:
162 unotification.mark_as_read()
163 unotification.mark_as_read()
163 Session().commit()
164 Session().commit()
164 c.notification = no
165 c.notification = no
165
166
166 return render('admin/notifications/show_notification.html')
167 return render('admin/notifications/show_notification.html')
167
168
168 return redirect(url('notifications'))
169 return abort(403)
169
170
170 def edit(self, notification_id, format='html'):
171 def edit(self, notification_id, format='html'):
171 """GET /_admin/notifications/id/edit: Form to edit an existing item"""
172 """GET /_admin/notifications/id/edit: Form to edit an existing item"""
@@ -67,11 +67,11 b' class PermissionsController(BaseControll'
67 ('group.admin', _('Admin'),)]
67 ('group.admin', _('Admin'),)]
68 self.register_choices = [
68 self.register_choices = [
69 ('hg.register.none',
69 ('hg.register.none',
70 _('disabled')),
70 _('Disabled')),
71 ('hg.register.manual_activate',
71 ('hg.register.manual_activate',
72 _('allowed with manual account activation')),
72 _('Allowed with manual account activation')),
73 ('hg.register.auto_activate',
73 ('hg.register.auto_activate',
74 _('allowed with automatic account activation')), ]
74 _('Allowed with automatic account activation')), ]
75
75
76 self.create_choices = [('hg.create.none', _('Disabled')),
76 self.create_choices = [('hg.create.none', _('Disabled')),
77 ('hg.create.repository', _('Enabled'))]
77 ('hg.create.repository', _('Enabled'))]
@@ -139,7 +139,7 b' class PermissionsController(BaseControll'
139 encoding="UTF-8")
139 encoding="UTF-8")
140 except Exception:
140 except Exception:
141 log.error(traceback.format_exc())
141 log.error(traceback.format_exc())
142 h.flash(_('error occurred during update of permissions'),
142 h.flash(_('Error occurred during update of permissions'),
143 category='error')
143 category='error')
144
144
145 return redirect(url('edit_permission', id=id))
145 return redirect(url('edit_permission', id=id))
@@ -28,7 +28,7 b' import traceback'
28 import formencode
28 import formencode
29 from formencode import htmlfill
29 from formencode import htmlfill
30
30
31 from webob.exc import HTTPInternalServerError
31 from webob.exc import HTTPInternalServerError, HTTPForbidden
32 from pylons import request, session, tmpl_context as c, url
32 from pylons import request, session, tmpl_context as c, url
33 from pylons.controllers.util import redirect
33 from pylons.controllers.util import redirect
34 from pylons.i18n.translation import _
34 from pylons.i18n.translation import _
@@ -37,23 +37,25 b' from sqlalchemy.exc import IntegrityErro'
37 import rhodecode
37 import rhodecode
38 from rhodecode.lib import helpers as h
38 from rhodecode.lib import helpers as h
39 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
39 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
40 HasPermissionAnyDecorator, HasRepoPermissionAllDecorator
40 HasPermissionAnyDecorator, HasRepoPermissionAllDecorator, NotAnonymous,\
41 from rhodecode.lib.base import BaseController, render
41 HasPermissionAny, HasReposGroupPermissionAny, HasRepoPermissionAnyDecorator
42 from rhodecode.lib.base import BaseRepoController, render
42 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
43 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
43 from rhodecode.lib.helpers import get_token
44 from rhodecode.lib.helpers import get_token
44 from rhodecode.model.meta import Session
45 from rhodecode.model.meta import Session
45 from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup,\
46 from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup,\
46 RhodeCodeSetting
47 RhodeCodeSetting, RepositoryField
47 from rhodecode.model.forms import RepoForm
48 from rhodecode.model.forms import RepoForm, RepoFieldForm, RepoPermsForm
48 from rhodecode.model.scm import ScmModel
49 from rhodecode.model.scm import ScmModel, GroupList
49 from rhodecode.model.repo import RepoModel
50 from rhodecode.model.repo import RepoModel
50 from rhodecode.lib.compat import json
51 from rhodecode.lib.compat import json
51 from sqlalchemy.sql.expression import func
52 from sqlalchemy.sql.expression import func
53 from rhodecode.lib.exceptions import AttachedForksError
52
54
53 log = logging.getLogger(__name__)
55 log = logging.getLogger(__name__)
54
56
55
57
56 class ReposController(BaseController):
58 class ReposController(BaseRepoController):
57 """
59 """
58 REST Controller styled on the Atom Publishing Protocol"""
60 REST Controller styled on the Atom Publishing Protocol"""
59 # To properly map this controller, ensure your config/routing.py
61 # To properly map this controller, ensure your config/routing.py
@@ -61,14 +63,15 b' class ReposController(BaseController):'
61 # map.resource('repo', 'repos')
63 # map.resource('repo', 'repos')
62
64
63 @LoginRequired()
65 @LoginRequired()
64 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
65 def __before__(self):
66 def __before__(self):
66 c.admin_user = session.get('admin_user')
67 c.admin_user = session.get('admin_user')
67 c.admin_username = session.get('admin_username')
68 c.admin_username = session.get('admin_username')
68 super(ReposController, self).__before__()
69 super(ReposController, self).__before__()
69
70
70 def __load_defaults(self):
71 def __load_defaults(self):
71 c.repo_groups = RepoGroup.groups_choices(check_perms=True)
72 acl_groups = GroupList(RepoGroup.query().all(),
73 perm_set=['group.write', 'group.admin'])
74 c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
72 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
75 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
73
76
74 repo_model = RepoModel()
77 repo_model = RepoModel()
@@ -116,6 +119,9 b' class ReposController(BaseController):'
116 c.stats_percentage = '%.2f' % ((float((last_rev)) /
119 c.stats_percentage = '%.2f' % ((float((last_rev)) /
117 c.repo_last_rev) * 100)
120 c.repo_last_rev) * 100)
118
121
122 c.repo_fields = RepositoryField.query()\
123 .filter(RepositoryField.repository == db_repo).all()
124
119 defaults = RepoModel()._get_defaults(repo_name)
125 defaults = RepoModel()._get_defaults(repo_name)
120
126
121 c.repos_list = [('', _('--REMOVE FORK--'))]
127 c.repos_list = [('', _('--REMOVE FORK--'))]
@@ -136,13 +142,14 b' class ReposController(BaseController):'
136 .all()
142 .all()
137
143
138 repos_data = RepoModel().get_repos_as_dict(repos_list=c.repos_list,
144 repos_data = RepoModel().get_repos_as_dict(repos_list=c.repos_list,
139 admin=True)
145 admin=True,
146 super_user_actions=True)
140 #json used to render the grid
147 #json used to render the grid
141 c.data = json.dumps(repos_data)
148 c.data = json.dumps(repos_data)
142
149
143 return render('admin/repos/repos.html')
150 return render('admin/repos/repos.html')
144
151
145 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
152 @NotAnonymous()
146 def create(self):
153 def create(self):
147 """
154 """
148 POST /repos: Create a new item"""
155 POST /repos: Create a new item"""
@@ -154,15 +161,18 b' class ReposController(BaseController):'
154 form_result = RepoForm(repo_groups=c.repo_groups_choices,
161 form_result = RepoForm(repo_groups=c.repo_groups_choices,
155 landing_revs=c.landing_revs_choices)()\
162 landing_revs=c.landing_revs_choices)()\
156 .to_python(dict(request.POST))
163 .to_python(dict(request.POST))
164
157 new_repo = RepoModel().create(form_result,
165 new_repo = RepoModel().create(form_result,
158 self.rhodecode_user.user_id)
166 self.rhodecode_user.user_id)
159 if form_result['clone_uri']:
167 if form_result['clone_uri']:
160 h.flash(_('created repository %s from %s') \
168 h.flash(_('Created repository %s from %s') \
161 % (form_result['repo_name'], form_result['clone_uri']),
169 % (form_result['repo_name'], form_result['clone_uri']),
162 category='success')
170 category='success')
163 else:
171 else:
164 h.flash(_('created repository %s') % form_result['repo_name'],
172 repo_url = h.link_to(form_result['repo_name'],
165 category='success')
173 h.url('summary_home', repo_name=form_result['repo_name_full']))
174 h.flash(h.literal(_('Created repository %s') % repo_url),
175 category='success')
166
176
167 if request.POST.get('user_created'):
177 if request.POST.get('user_created'):
168 # created by regular non admin user
178 # created by regular non admin user
@@ -175,16 +185,8 b' class ReposController(BaseController):'
175 self.sa)
185 self.sa)
176 Session().commit()
186 Session().commit()
177 except formencode.Invalid, errors:
187 except formencode.Invalid, errors:
178
179 c.new_repo = errors.value['repo_name']
180
181 if request.POST.get('user_created'):
182 r = render('admin/repos/repo_add_create_repository.html')
183 else:
184 r = render('admin/repos/repo_add.html')
185
186 return htmlfill.render(
188 return htmlfill.render(
187 r,
189 render('admin/repos/repo_add.html'),
188 defaults=errors.value,
190 defaults=errors.value,
189 errors=errors.error_dict or {},
191 errors=errors.error_dict or {},
190 prefix_error=False,
192 prefix_error=False,
@@ -192,21 +194,41 b' class ReposController(BaseController):'
192
194
193 except Exception:
195 except Exception:
194 log.error(traceback.format_exc())
196 log.error(traceback.format_exc())
195 msg = _('error occurred during creation of repository %s') \
197 msg = _('Error creating repository %s') \
196 % form_result.get('repo_name')
198 % form_result.get('repo_name')
197 h.flash(msg, category='error')
199 h.flash(msg, category='error')
198 return redirect(url('repos'))
200 if c.rhodecode_user.is_admin:
201 return redirect(url('repos'))
202 return redirect(url('home'))
199 #redirect to our new repo !
203 #redirect to our new repo !
200 return redirect(url('summary_home', repo_name=new_repo.repo_name))
204 return redirect(url('summary_home', repo_name=new_repo.repo_name))
201
205
202 @HasPermissionAllDecorator('hg.admin')
206 @NotAnonymous()
203 def new(self, format='html'):
207 def create_repository(self):
204 """GET /repos/new: Form to create a new item"""
208 """GET /_admin/create_repository: Form to create a new item"""
205 new_repo = request.GET.get('repo', '')
209 new_repo = request.GET.get('repo', '')
210 parent_group = request.GET.get('parent_group')
211 if not HasPermissionAny('hg.admin', 'hg.create.repository')():
212 #you're not super admin nor have global create permissions,
213 #but maybe you have at least write permission to a parent group ?
214 _gr = RepoGroup.get(parent_group)
215 gr_name = _gr.group_name if _gr else None
216 if not HasReposGroupPermissionAny('group.admin', 'group.write')(group_name=gr_name):
217 raise HTTPForbidden
218
219 acl_groups = GroupList(RepoGroup.query().all(),
220 perm_set=['group.write', 'group.admin'])
221 c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
222 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
223 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
224
206 c.new_repo = repo_name_slug(new_repo)
225 c.new_repo = repo_name_slug(new_repo)
207 self.__load_defaults()
226
208 ## apply the defaults from defaults page
227 ## apply the defaults from defaults page
209 defaults = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True)
228 defaults = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True)
229 if parent_group:
230 defaults.update({'repo_group': parent_group})
231
210 return htmlfill.render(
232 return htmlfill.render(
211 render('admin/repos/repo_add.html'),
233 render('admin/repos/repo_add.html'),
212 defaults=defaults,
234 defaults=defaults,
@@ -215,7 +237,7 b' class ReposController(BaseController):'
215 encoding="UTF-8"
237 encoding="UTF-8"
216 )
238 )
217
239
218 @HasPermissionAllDecorator('hg.admin')
240 @HasRepoPermissionAllDecorator('repository.admin')
219 def update(self, repo_name):
241 def update(self, repo_name):
220 """
242 """
221 PUT /repos/repo_name: Update an existing item"""
243 PUT /repos/repo_name: Update an existing item"""
@@ -259,11 +281,11 b' class ReposController(BaseController):'
259
281
260 except Exception:
282 except Exception:
261 log.error(traceback.format_exc())
283 log.error(traceback.format_exc())
262 h.flash(_('error occurred during update of repository %s') \
284 h.flash(_('Error occurred during update of repository %s') \
263 % repo_name, category='error')
285 % repo_name, category='error')
264 return redirect(url('edit_repo', repo_name=changed_name))
286 return redirect(url('edit_repo', repo_name=changed_name))
265
287
266 @HasPermissionAllDecorator('hg.admin')
288 @HasRepoPermissionAllDecorator('repository.admin')
267 def delete(self, repo_name):
289 def delete(self, repo_name):
268 """
290 """
269 DELETE /repos/repo_name: Delete an existing item"""
291 DELETE /repos/repo_name: Delete an existing item"""
@@ -280,25 +302,27 b' class ReposController(BaseController):'
280 h.not_mapped_error(repo_name)
302 h.not_mapped_error(repo_name)
281 return redirect(url('repos'))
303 return redirect(url('repos'))
282 try:
304 try:
305 _forks = repo.forks.count()
306 handle_forks = None
307 if _forks and request.POST.get('forks'):
308 do = request.POST['forks']
309 if do == 'detach_forks':
310 handle_forks = 'detach'
311 h.flash(_('Detached %s forks') % _forks, category='success')
312 elif do == 'delete_forks':
313 handle_forks = 'delete'
314 h.flash(_('Deleted %s forks') % _forks, category='success')
315 repo_model.delete(repo, forks=handle_forks)
283 action_logger(self.rhodecode_user, 'admin_deleted_repo',
316 action_logger(self.rhodecode_user, 'admin_deleted_repo',
284 repo_name, self.ip_addr, self.sa)
317 repo_name, self.ip_addr, self.sa)
285 repo_model.delete(repo)
286 invalidate_cache('get_repo_cached_%s' % repo_name)
318 invalidate_cache('get_repo_cached_%s' % repo_name)
287 h.flash(_('deleted repository %s') % repo_name, category='success')
319 h.flash(_('Deleted repository %s') % repo_name, category='success')
288 Session().commit()
320 Session().commit()
289 except IntegrityError, e:
321 except AttachedForksError:
290 if e.message.find('repositories_fork_id_fkey') != -1:
322 h.flash(_('Cannot delete %s it still contains attached forks')
291 log.error(traceback.format_exc())
323 % repo_name, category='warning')
292 h.flash(_('Cannot delete %s it still contains attached '
293 'forks') % repo_name,
294 category='warning')
295 else:
296 log.error(traceback.format_exc())
297 h.flash(_('An error occurred during '
298 'deletion of %s') % repo_name,
299 category='error')
300
324
301 except Exception, e:
325 except Exception:
302 log.error(traceback.format_exc())
326 log.error(traceback.format_exc())
303 h.flash(_('An error occurred during deletion of %s') % repo_name,
327 h.flash(_('An error occurred during deletion of %s') % repo_name,
304 category='error')
328 category='error')
@@ -306,6 +330,42 b' class ReposController(BaseController):'
306 return redirect(url('repos'))
330 return redirect(url('repos'))
307
331
308 @HasRepoPermissionAllDecorator('repository.admin')
332 @HasRepoPermissionAllDecorator('repository.admin')
333 def set_repo_perm_member(self, repo_name):
334 form = RepoPermsForm()().to_python(request.POST)
335
336 perms_new = form['perms_new']
337 perms_updates = form['perms_updates']
338 cur_repo = repo_name
339
340 # update permissions
341 for member, perm, member_type in perms_updates:
342 if member_type == 'user':
343 # this updates existing one
344 RepoModel().grant_user_permission(
345 repo=cur_repo, user=member, perm=perm
346 )
347 else:
348 RepoModel().grant_users_group_permission(
349 repo=cur_repo, group_name=member, perm=perm
350 )
351 # set new permissions
352 for member, perm, member_type in perms_new:
353 if member_type == 'user':
354 RepoModel().grant_user_permission(
355 repo=cur_repo, user=member, perm=perm
356 )
357 else:
358 RepoModel().grant_users_group_permission(
359 repo=cur_repo, group_name=member, perm=perm
360 )
361 #TODO: implement this
362 #action_logger(self.rhodecode_user, 'admin_changed_repo_permissions',
363 # repo_name, self.ip_addr, self.sa)
364 Session().commit()
365 h.flash(_('Repository permissions updated'), category='success')
366 return redirect(url('edit_repo', repo_name=repo_name))
367
368 @HasRepoPermissionAllDecorator('repository.admin')
309 def delete_perm_user(self, repo_name):
369 def delete_perm_user(self, repo_name):
310 """
370 """
311 DELETE an existing repository permission user
371 DELETE an existing repository permission user
@@ -315,6 +375,9 b' class ReposController(BaseController):'
315 try:
375 try:
316 RepoModel().revoke_user_permission(repo=repo_name,
376 RepoModel().revoke_user_permission(repo=repo_name,
317 user=request.POST['user_id'])
377 user=request.POST['user_id'])
378 #TODO: implement this
379 #action_logger(self.rhodecode_user, 'admin_revoked_repo_permissions',
380 # repo_name, self.ip_addr, self.sa)
318 Session().commit()
381 Session().commit()
319 except Exception:
382 except Exception:
320 log.error(traceback.format_exc())
383 log.error(traceback.format_exc())
@@ -325,7 +388,7 b' class ReposController(BaseController):'
325 @HasRepoPermissionAllDecorator('repository.admin')
388 @HasRepoPermissionAllDecorator('repository.admin')
326 def delete_perm_users_group(self, repo_name):
389 def delete_perm_users_group(self, repo_name):
327 """
390 """
328 DELETE an existing repository permission users group
391 DELETE an existing repository permission user group
329
392
330 :param repo_name:
393 :param repo_name:
331 """
394 """
@@ -338,11 +401,11 b' class ReposController(BaseController):'
338 except Exception:
401 except Exception:
339 log.error(traceback.format_exc())
402 log.error(traceback.format_exc())
340 h.flash(_('An error occurred during deletion of repository'
403 h.flash(_('An error occurred during deletion of repository'
341 ' users groups'),
404 ' user groups'),
342 category='error')
405 category='error')
343 raise HTTPInternalServerError()
406 raise HTTPInternalServerError()
344
407
345 @HasPermissionAllDecorator('hg.admin')
408 @HasRepoPermissionAllDecorator('repository.admin')
346 def repo_stats(self, repo_name):
409 def repo_stats(self, repo_name):
347 """
410 """
348 DELETE an existing repository statistics
411 DELETE an existing repository statistics
@@ -359,7 +422,7 b' class ReposController(BaseController):'
359 category='error')
422 category='error')
360 return redirect(url('edit_repo', repo_name=repo_name))
423 return redirect(url('edit_repo', repo_name=repo_name))
361
424
362 @HasPermissionAllDecorator('hg.admin')
425 @HasRepoPermissionAllDecorator('repository.admin')
363 def repo_cache(self, repo_name):
426 def repo_cache(self, repo_name):
364 """
427 """
365 INVALIDATE existing repository cache
428 INVALIDATE existing repository cache
@@ -376,7 +439,7 b' class ReposController(BaseController):'
376 category='error')
439 category='error')
377 return redirect(url('edit_repo', repo_name=repo_name))
440 return redirect(url('edit_repo', repo_name=repo_name))
378
441
379 @HasPermissionAllDecorator('hg.admin')
442 @HasRepoPermissionAllDecorator('repository.admin')
380 def repo_locking(self, repo_name):
443 def repo_locking(self, repo_name):
381 """
444 """
382 Unlock repository when it is locked !
445 Unlock repository when it is locked !
@@ -396,7 +459,34 b' class ReposController(BaseController):'
396 category='error')
459 category='error')
397 return redirect(url('edit_repo', repo_name=repo_name))
460 return redirect(url('edit_repo', repo_name=repo_name))
398
461
399 @HasPermissionAllDecorator('hg.admin')
462 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
463 def toggle_locking(self, repo_name):
464 """
465 Toggle locking of repository by simple GET call to url
466
467 :param repo_name:
468 """
469
470 try:
471 repo = Repository.get_by_repo_name(repo_name)
472
473 if repo.enable_locking:
474 if repo.locked[0]:
475 Repository.unlock(repo)
476 action = _('Unlocked')
477 else:
478 Repository.lock(repo, c.rhodecode_user.user_id)
479 action = _('Locked')
480
481 h.flash(_('Repository has been %s') % action,
482 category='success')
483 except Exception, e:
484 log.error(traceback.format_exc())
485 h.flash(_('An error occurred during unlocking'),
486 category='error')
487 return redirect(url('summary_home', repo_name=repo_name))
488
489 @HasRepoPermissionAllDecorator('repository.admin')
400 def repo_public_journal(self, repo_name):
490 def repo_public_journal(self, repo_name):
401 """
491 """
402 Set's this repository to be visible in public journal,
492 Set's this repository to be visible in public journal,
@@ -415,7 +505,7 b' class ReposController(BaseController):'
415 h.flash(_('Updated repository visibility in public journal'),
505 h.flash(_('Updated repository visibility in public journal'),
416 category='success')
506 category='success')
417 Session().commit()
507 Session().commit()
418 except:
508 except Exception:
419 h.flash(_('An error occurred during setting this'
509 h.flash(_('An error occurred during setting this'
420 ' repository in public journal'),
510 ' repository in public journal'),
421 category='error')
511 category='error')
@@ -424,7 +514,7 b' class ReposController(BaseController):'
424 h.flash(_('Token mismatch'), category='error')
514 h.flash(_('Token mismatch'), category='error')
425 return redirect(url('edit_repo', repo_name=repo_name))
515 return redirect(url('edit_repo', repo_name=repo_name))
426
516
427 @HasPermissionAllDecorator('hg.admin')
517 @HasRepoPermissionAllDecorator('repository.admin')
428 def repo_pull(self, repo_name):
518 def repo_pull(self, repo_name):
429 """
519 """
430 Runs task to update given repository with remote changes,
520 Runs task to update given repository with remote changes,
@@ -441,7 +531,7 b' class ReposController(BaseController):'
441
531
442 return redirect(url('edit_repo', repo_name=repo_name))
532 return redirect(url('edit_repo', repo_name=repo_name))
443
533
444 @HasPermissionAllDecorator('hg.admin')
534 @HasRepoPermissionAllDecorator('repository.admin')
445 def repo_as_fork(self, repo_name):
535 def repo_as_fork(self, repo_name):
446 """
536 """
447 Mark given repository as a fork of another
537 Mark given repository as a fork of another
@@ -468,7 +558,7 b' class ReposController(BaseController):'
468 """GET /repos/repo_name: Show a specific item"""
558 """GET /repos/repo_name: Show a specific item"""
469 # url('repo', repo_name=ID)
559 # url('repo', repo_name=ID)
470
560
471 @HasPermissionAllDecorator('hg.admin')
561 @HasRepoPermissionAllDecorator('repository.admin')
472 def edit(self, repo_name, format='html'):
562 def edit(self, repo_name, format='html'):
473 """GET /repos/repo_name/edit: Form to edit an existing item"""
563 """GET /repos/repo_name/edit: Form to edit an existing item"""
474 # url('edit_repo', repo_name=ID)
564 # url('edit_repo', repo_name=ID)
@@ -480,3 +570,37 b' class ReposController(BaseController):'
480 encoding="UTF-8",
570 encoding="UTF-8",
481 force_defaults=False
571 force_defaults=False
482 )
572 )
573
574 @HasPermissionAllDecorator('hg.admin')
575 def create_repo_field(self, repo_name):
576 try:
577 form_result = RepoFieldForm()().to_python(dict(request.POST))
578 new_field = RepositoryField()
579 new_field.repository = Repository.get_by_repo_name(repo_name)
580 new_field.field_key = form_result['new_field_key']
581 new_field.field_type = form_result['new_field_type'] # python type
582 new_field.field_value = form_result['new_field_value'] # set initial blank value
583 new_field.field_desc = form_result['new_field_desc']
584 new_field.field_label = form_result['new_field_label']
585 Session().add(new_field)
586 Session().commit()
587
588 except Exception, e:
589 log.error(traceback.format_exc())
590 msg = _('An error occurred during creation of field')
591 if isinstance(e, formencode.Invalid):
592 msg += ". " + e.msg
593 h.flash(msg, category='error')
594 return redirect(url('edit_repo', repo_name=repo_name))
595
596 @HasPermissionAllDecorator('hg.admin')
597 def delete_repo_field(self, repo_name, field_id):
598 field = RepositoryField.get_or_404(field_id)
599 try:
600 Session().delete(field)
601 Session().commit()
602 except Exception, e:
603 log.error(traceback.format_exc())
604 msg = _('An error occurred during removal of field')
605 h.flash(msg, category='error')
606 return redirect(url('edit_repo', repo_name=repo_name))
@@ -3,7 +3,7 b''
3 rhodecode.controllers.admin.repos_groups
3 rhodecode.controllers.admin.repos_groups
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Repositories groups controller for RhodeCode
6 Repository groups controller for RhodeCode
7
7
8 :created_on: Mar 23, 2010
8 :created_on: Mar 23, 2010
9 :author: marcink
9 :author: marcink
@@ -30,7 +30,7 b' import formencode'
30 from formencode import htmlfill
30 from formencode import htmlfill
31
31
32 from pylons import request, tmpl_context as c, url
32 from pylons import request, tmpl_context as c, url
33 from pylons.controllers.util import redirect
33 from pylons.controllers.util import abort, redirect
34 from pylons.i18n.translation import _
34 from pylons.i18n.translation import _
35
35
36 from sqlalchemy.exc import IntegrityError
36 from sqlalchemy.exc import IntegrityError
@@ -39,7 +39,8 b' import rhodecode'
39 from rhodecode.lib import helpers as h
39 from rhodecode.lib import helpers as h
40 from rhodecode.lib.ext_json import json
40 from rhodecode.lib.ext_json import json
41 from rhodecode.lib.auth import LoginRequired, HasPermissionAnyDecorator,\
41 from rhodecode.lib.auth import LoginRequired, HasPermissionAnyDecorator,\
42 HasReposGroupPermissionAnyDecorator
42 HasReposGroupPermissionAnyDecorator, HasReposGroupPermissionAll,\
43 HasPermissionAll
43 from rhodecode.lib.base import BaseController, render
44 from rhodecode.lib.base import BaseController, render
44 from rhodecode.model.db import RepoGroup, Repository
45 from rhodecode.model.db import RepoGroup, Repository
45 from rhodecode.model.repos_group import ReposGroupModel
46 from rhodecode.model.repos_group import ReposGroupModel
@@ -47,8 +48,9 b' from rhodecode.model.forms import ReposG'
47 from rhodecode.model.meta import Session
48 from rhodecode.model.meta import Session
48 from rhodecode.model.repo import RepoModel
49 from rhodecode.model.repo import RepoModel
49 from webob.exc import HTTPInternalServerError, HTTPNotFound
50 from webob.exc import HTTPInternalServerError, HTTPNotFound
50 from rhodecode.lib.utils2 import str2bool
51 from rhodecode.lib.utils2 import str2bool, safe_int
51 from sqlalchemy.sql.expression import func
52 from sqlalchemy.sql.expression import func
53 from rhodecode.model.scm import GroupList
52
54
53 log = logging.getLogger(__name__)
55 log = logging.getLogger(__name__)
54
56
@@ -63,10 +65,21 b' class ReposGroupsController(BaseControll'
63 def __before__(self):
65 def __before__(self):
64 super(ReposGroupsController, self).__before__()
66 super(ReposGroupsController, self).__before__()
65
67
66 def __load_defaults(self):
68 def __load_defaults(self, allow_empty_group=False, exclude_group_ids=[]):
67 c.repo_groups = RepoGroup.groups_choices()
69 if HasPermissionAll('hg.admin')('group edit'):
70 #we're global admin, we're ok and we can create TOP level groups
71 allow_empty_group = True
72
73 #override the choices for this form, we need to filter choices
74 #and display only those we have ADMIN right
75 groups_with_admin_rights = GroupList(RepoGroup.query().all(),
76 perm_set=['group.admin'])
77 c.repo_groups = RepoGroup.groups_choices(groups=groups_with_admin_rights,
78 show_empty_group=allow_empty_group)
79 # exclude filtered ids
80 c.repo_groups = filter(lambda x: x[0] not in exclude_group_ids,
81 c.repo_groups)
68 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
82 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
69
70 repo_model = RepoModel()
83 repo_model = RepoModel()
71 c.users_array = repo_model.get_users_js()
84 c.users_array = repo_model.get_users_js()
72 c.users_groups_array = repo_model.get_users_groups_js()
85 c.users_groups_array = repo_model.get_users_groups_js()
@@ -77,7 +90,6 b' class ReposGroupsController(BaseControll'
77
90
78 :param group_id:
91 :param group_id:
79 """
92 """
80 self.__load_defaults()
81 repo_group = RepoGroup.get_or_404(group_id)
93 repo_group = RepoGroup.get_or_404(group_id)
82 data = repo_group.get_dict()
94 data = repo_group.get_dict()
83 data['group_name'] = repo_group.name
95 data['group_name'] = repo_group.name
@@ -94,34 +106,46 b' class ReposGroupsController(BaseControll'
94
106
95 return data
107 return data
96
108
97 @HasPermissionAnyDecorator('hg.admin')
109 def _revoke_perms_on_yourself(self, form_result):
110 _up = filter(lambda u: c.rhodecode_user.username == u[0],
111 form_result['perms_updates'])
112 _new = filter(lambda u: c.rhodecode_user.username == u[0],
113 form_result['perms_new'])
114 if _new and _new[0][1] != 'group.admin' or _up and _up[0][1] != 'group.admin':
115 return True
116 return False
117
98 def index(self, format='html'):
118 def index(self, format='html'):
99 """GET /repos_groups: All items in the collection"""
119 """GET /repos_groups: All items in the collection"""
100 # url('repos_groups')
120 # url('repos_groups')
121 group_iter = GroupList(RepoGroup.query().all(), perm_set=['group.admin'])
101 sk = lambda g: g.parents[0].group_name if g.parents else g.group_name
122 sk = lambda g: g.parents[0].group_name if g.parents else g.group_name
102 c.groups = sorted(RepoGroup.query().all(), key=sk)
123 c.groups = sorted(group_iter, key=sk)
103 return render('admin/repos_groups/repos_groups_show.html')
124 return render('admin/repos_groups/repos_groups_show.html')
104
125
105 @HasPermissionAnyDecorator('hg.admin')
106 def create(self):
126 def create(self):
107 """POST /repos_groups: Create a new item"""
127 """POST /repos_groups: Create a new item"""
108 # url('repos_groups')
128 # url('repos_groups')
129
109 self.__load_defaults()
130 self.__load_defaults()
110 repos_group_form = ReposGroupForm(available_groups =
131
111 c.repo_groups_choices)()
132 # permissions for can create group based on parent_id are checked
133 # here in the Form
134 repos_group_form = ReposGroupForm(available_groups=
135 map(lambda k: unicode(k[0]), c.repo_groups))()
112 try:
136 try:
113 form_result = repos_group_form.to_python(dict(request.POST))
137 form_result = repos_group_form.to_python(dict(request.POST))
114 ReposGroupModel().create(
138 ReposGroupModel().create(
115 group_name=form_result['group_name'],
139 group_name=form_result['group_name'],
116 group_description=form_result['group_description'],
140 group_description=form_result['group_description'],
117 parent=form_result['group_parent_id']
141 parent=form_result['group_parent_id'],
142 owner=self.rhodecode_user.user_id
118 )
143 )
119 Session().commit()
144 Session().commit()
120 h.flash(_('created repos group %s') \
145 h.flash(_('Created repository group %s') \
121 % form_result['group_name'], category='success')
146 % form_result['group_name'], category='success')
122 #TODO: in futureaction_logger(, '', '', '', self.sa)
147 #TODO: in futureaction_logger(, '', '', '', self.sa)
123 except formencode.Invalid, errors:
148 except formencode.Invalid, errors:
124
125 return htmlfill.render(
149 return htmlfill.render(
126 render('admin/repos_groups/repos_groups_add.html'),
150 render('admin/repos_groups/repos_groups_add.html'),
127 defaults=errors.value,
151 defaults=errors.value,
@@ -130,42 +154,73 b' class ReposGroupsController(BaseControll'
130 encoding="UTF-8")
154 encoding="UTF-8")
131 except Exception:
155 except Exception:
132 log.error(traceback.format_exc())
156 log.error(traceback.format_exc())
133 h.flash(_('error occurred during creation of repos group %s') \
157 h.flash(_('Error occurred during creation of repository group %s') \
134 % request.POST.get('group_name'), category='error')
158 % request.POST.get('group_name'), category='error')
159 parent_group_id = form_result['group_parent_id']
160 #TODO: maybe we should get back to the main view, not the admin one
161 return redirect(url('repos_groups', parent_group=parent_group_id))
135
162
136 return redirect(url('repos_groups'))
137
138 @HasPermissionAnyDecorator('hg.admin')
139 def new(self, format='html'):
163 def new(self, format='html'):
140 """GET /repos_groups/new: Form to create a new item"""
164 """GET /repos_groups/new: Form to create a new item"""
141 # url('new_repos_group')
165 # url('new_repos_group')
166 if HasPermissionAll('hg.admin')('group create'):
167 #we're global admin, we're ok and we can create TOP level groups
168 pass
169 else:
170 # we pass in parent group into creation form, thus we know
171 # what would be the group, we can check perms here !
172 group_id = safe_int(request.GET.get('parent_group'))
173 group = RepoGroup.get(group_id) if group_id else None
174 group_name = group.group_name if group else None
175 if HasReposGroupPermissionAll('group.admin')(group_name, 'group create'):
176 pass
177 else:
178 return abort(403)
179
142 self.__load_defaults()
180 self.__load_defaults()
143 return render('admin/repos_groups/repos_groups_add.html')
181 return render('admin/repos_groups/repos_groups_add.html')
144
182
145 @HasPermissionAnyDecorator('hg.admin')
183 @HasReposGroupPermissionAnyDecorator('group.admin')
146 def update(self, id):
184 def update(self, group_name):
147 """PUT /repos_groups/id: Update an existing item"""
185 """PUT /repos_groups/group_name: Update an existing item"""
148 # Forms posted to this method should contain a hidden field:
186 # Forms posted to this method should contain a hidden field:
149 # <input type="hidden" name="_method" value="PUT" />
187 # <input type="hidden" name="_method" value="PUT" />
150 # Or using helpers:
188 # Or using helpers:
151 # h.form(url('repos_group', id=ID),
189 # h.form(url('repos_group', group_name=GROUP_NAME),
152 # method='put')
190 # method='put')
153 # url('repos_group', id=ID)
191 # url('repos_group', group_name=GROUP_NAME)
154
192
155 self.__load_defaults()
193 c.repos_group = ReposGroupModel()._get_repos_group(group_name)
156 c.repos_group = RepoGroup.get(id)
194 if HasPermissionAll('hg.admin')('group edit'):
195 #we're global admin, we're ok and we can create TOP level groups
196 allow_empty_group = True
197 elif not c.repos_group.parent_group:
198 allow_empty_group = True
199 else:
200 allow_empty_group = False
201 self.__load_defaults(allow_empty_group=allow_empty_group,
202 exclude_group_ids=[c.repos_group.group_id])
157
203
158 repos_group_form = ReposGroupForm(
204 repos_group_form = ReposGroupForm(
159 edit=True,
205 edit=True,
160 old_data=c.repos_group.get_dict(),
206 old_data=c.repos_group.get_dict(),
161 available_groups=c.repo_groups_choices
207 available_groups=c.repo_groups_choices,
208 can_create_in_root=allow_empty_group,
162 )()
209 )()
163 try:
210 try:
164 form_result = repos_group_form.to_python(dict(request.POST))
211 form_result = repos_group_form.to_python(dict(request.POST))
165 ReposGroupModel().update(id, form_result)
212 if not c.rhodecode_user.is_admin:
213 if self._revoke_perms_on_yourself(form_result):
214 msg = _('Cannot revoke permission for yourself as admin')
215 h.flash(msg, category='warning')
216 raise Exception('revoke admin permission on self')
217
218 new_gr = ReposGroupModel().update(group_name, form_result)
166 Session().commit()
219 Session().commit()
167 h.flash(_('updated repos group %s') \
220 h.flash(_('Updated repository group %s') \
168 % form_result['group_name'], category='success')
221 % form_result['group_name'], category='success')
222 # we now have new name !
223 group_name = new_gr.group_name
169 #TODO: in future action_logger(, '', '', '', self.sa)
224 #TODO: in future action_logger(, '', '', '', self.sa)
170 except formencode.Invalid, errors:
225 except formencode.Invalid, errors:
171
226
@@ -177,61 +232,60 b' class ReposGroupsController(BaseControll'
177 encoding="UTF-8")
232 encoding="UTF-8")
178 except Exception:
233 except Exception:
179 log.error(traceback.format_exc())
234 log.error(traceback.format_exc())
180 h.flash(_('error occurred during update of repos group %s') \
235 h.flash(_('Error occurred during update of repository group %s') \
181 % request.POST.get('group_name'), category='error')
236 % request.POST.get('group_name'), category='error')
182
237
183 return redirect(url('edit_repos_group', id=id))
238 return redirect(url('edit_repos_group', group_name=group_name))
184
239
185 @HasPermissionAnyDecorator('hg.admin')
240 @HasReposGroupPermissionAnyDecorator('group.admin')
186 def delete(self, id):
241 def delete(self, group_name):
187 """DELETE /repos_groups/id: Delete an existing item"""
242 """DELETE /repos_groups/group_name: Delete an existing item"""
188 # Forms posted to this method should contain a hidden field:
243 # Forms posted to this method should contain a hidden field:
189 # <input type="hidden" name="_method" value="DELETE" />
244 # <input type="hidden" name="_method" value="DELETE" />
190 # Or using helpers:
245 # Or using helpers:
191 # h.form(url('repos_group', id=ID),
246 # h.form(url('repos_group', group_name=GROUP_NAME),
192 # method='delete')
247 # method='delete')
193 # url('repos_group', id=ID)
248 # url('repos_group', group_name=GROUP_NAME)
194
249
195 gr = RepoGroup.get(id)
250 gr = c.repos_group = ReposGroupModel()._get_repos_group(group_name)
196 repos = gr.repositories.all()
251 repos = gr.repositories.all()
197 if repos:
252 if repos:
198 h.flash(_('This group contains %s repositores and cannot be '
253 h.flash(_('This group contains %s repositores and cannot be '
199 'deleted') % len(repos),
254 'deleted') % len(repos), category='warning')
200 category='error')
255 return redirect(url('repos_groups'))
256
257 children = gr.children.all()
258 if children:
259 h.flash(_('This group contains %s subgroups and cannot be deleted'
260 % (len(children))), category='warning')
201 return redirect(url('repos_groups'))
261 return redirect(url('repos_groups'))
202
262
203 try:
263 try:
204 ReposGroupModel().delete(id)
264 ReposGroupModel().delete(group_name)
205 Session().commit()
265 Session().commit()
206 h.flash(_('removed repos group %s') % gr.group_name,
266 h.flash(_('Removed repository group %s') % group_name,
207 category='success')
267 category='success')
208 #TODO: in future action_logger(, '', '', '', self.sa)
268 #TODO: in future action_logger(, '', '', '', self.sa)
209 except IntegrityError, e:
210 if str(e.message).find('groups_group_parent_id_fkey') != -1:
211 log.error(traceback.format_exc())
212 h.flash(_('Cannot delete this group it still contains '
213 'subgroups'),
214 category='warning')
215 else:
216 log.error(traceback.format_exc())
217 h.flash(_('error occurred during deletion of repos '
218 'group %s') % gr.group_name, category='error')
219
220 except Exception:
269 except Exception:
221 log.error(traceback.format_exc())
270 log.error(traceback.format_exc())
222 h.flash(_('error occurred during deletion of repos '
271 h.flash(_('Error occurred during deletion of repos '
223 'group %s') % gr.group_name, category='error')
272 'group %s') % group_name, category='error')
224
273
225 return redirect(url('repos_groups'))
274 return redirect(url('repos_groups'))
226
275
227 @HasReposGroupPermissionAnyDecorator('group.admin')
276 @HasReposGroupPermissionAnyDecorator('group.admin')
228 def delete_repos_group_user_perm(self, group_name):
277 def delete_repos_group_user_perm(self, group_name):
229 """
278 """
230 DELETE an existing repositories group permission user
279 DELETE an existing repository group permission user
231
280
232 :param group_name:
281 :param group_name:
233 """
282 """
234 try:
283 try:
284 if not c.rhodecode_user.is_admin:
285 if c.rhodecode_user.user_id == safe_int(request.POST['user_id']):
286 msg = _('Cannot revoke permission for yourself as admin')
287 h.flash(msg, category='warning')
288 raise Exception('revoke admin permission on self')
235 recursive = str2bool(request.POST.get('recursive', False))
289 recursive = str2bool(request.POST.get('recursive', False))
236 ReposGroupModel().delete_permission(
290 ReposGroupModel().delete_permission(
237 repos_group=group_name, obj=request.POST['user_id'],
291 repos_group=group_name, obj=request.POST['user_id'],
@@ -247,7 +301,7 b' class ReposGroupsController(BaseControll'
247 @HasReposGroupPermissionAnyDecorator('group.admin')
301 @HasReposGroupPermissionAnyDecorator('group.admin')
248 def delete_repos_group_users_group_perm(self, group_name):
302 def delete_repos_group_users_group_perm(self, group_name):
249 """
303 """
250 DELETE an existing repositories group permission users group
304 DELETE an existing repository group permission user group
251
305
252 :param group_name:
306 :param group_name:
253 """
307 """
@@ -262,7 +316,7 b' class ReposGroupsController(BaseControll'
262 except Exception:
316 except Exception:
263 log.error(traceback.format_exc())
317 log.error(traceback.format_exc())
264 h.flash(_('An error occurred during deletion of group'
318 h.flash(_('An error occurred during deletion of group'
265 ' users groups'),
319 ' user groups'),
266 category='error')
320 category='error')
267 raise HTTPInternalServerError()
321 raise HTTPInternalServerError()
268
322
@@ -279,11 +333,11 b' class ReposGroupsController(BaseControll'
279
333
280 @HasReposGroupPermissionAnyDecorator('group.read', 'group.write',
334 @HasReposGroupPermissionAnyDecorator('group.read', 'group.write',
281 'group.admin')
335 'group.admin')
282 def show(self, id, format='html'):
336 def show(self, group_name, format='html'):
283 """GET /repos_groups/id: Show a specific item"""
337 """GET /repos_groups/group_name: Show a specific item"""
284 # url('repos_group', id=ID)
338 # url('repos_group', group_name=GROUP_NAME)
285
339
286 c.group = RepoGroup.get_or_404(id)
340 c.group = c.repos_group = ReposGroupModel()._get_repos_group(group_name)
287 c.group_repos = c.group.repositories.all()
341 c.group_repos = c.group.repositories.all()
288
342
289 #overwrite our cached list with current filter
343 #overwrite our cached list with current filter
@@ -291,15 +345,15 b' class ReposGroupsController(BaseControll'
291 c.repo_cnt = 0
345 c.repo_cnt = 0
292
346
293 groups = RepoGroup.query().order_by(RepoGroup.group_name)\
347 groups = RepoGroup.query().order_by(RepoGroup.group_name)\
294 .filter(RepoGroup.group_parent_id == id).all()
348 .filter(RepoGroup.group_parent_id == c.group.group_id).all()
295 c.groups = self.scm_model.get_repos_groups(groups)
349 c.groups = self.scm_model.get_repos_groups(groups)
296
350
297 if c.visual.lightweight_dashboard is False:
351 if not c.visual.lightweight_dashboard:
298 c.repos_list = self.scm_model.get_repos(all_repos=gr_filter)
352 c.repos_list = self.scm_model.get_repos(all_repos=gr_filter)
299 ## lightweight version of dashboard
353 ## lightweight version of dashboard
300 else:
354 else:
301 c.repos_list = Repository.query()\
355 c.repos_list = Repository.query()\
302 .filter(Repository.group_id == id)\
356 .filter(Repository.group_id == c.group.group_id)\
303 .order_by(func.lower(Repository.repo_name))\
357 .order_by(func.lower(Repository.repo_name))\
304 .all()
358 .all()
305
359
@@ -310,17 +364,25 b' class ReposGroupsController(BaseControll'
310
364
311 return render('admin/repos_groups/repos_groups.html')
365 return render('admin/repos_groups/repos_groups.html')
312
366
313 @HasPermissionAnyDecorator('hg.admin')
367 @HasReposGroupPermissionAnyDecorator('group.admin')
314 def edit(self, id, format='html'):
368 def edit(self, group_name, format='html'):
315 """GET /repos_groups/id/edit: Form to edit an existing item"""
369 """GET /repos_groups/group_name/edit: Form to edit an existing item"""
316 # url('edit_repos_group', id=ID)
370 # url('edit_repos_group', group_name=GROUP_NAME)
317
371
318 c.repos_group = ReposGroupModel()._get_repos_group(id)
372 c.repos_group = ReposGroupModel()._get_repos_group(group_name)
319 defaults = self.__load_data(c.repos_group.group_id)
373 #we can only allow moving empty group if it's already a top-level
374 #group, ie has no parents, or we're admin
375 if HasPermissionAll('hg.admin')('group edit'):
376 #we're global admin, we're ok and we can create TOP level groups
377 allow_empty_group = True
378 elif not c.repos_group.parent_group:
379 allow_empty_group = True
380 else:
381 allow_empty_group = False
320
382
321 # we need to exclude this group from the group list for editing
383 self.__load_defaults(allow_empty_group=allow_empty_group,
322 c.repo_groups = filter(lambda x: x[0] != c.repos_group.group_id,
384 exclude_group_ids=[c.repos_group.group_id])
323 c.repo_groups)
385 defaults = self.__load_data(c.repos_group.group_id)
324
386
325 return htmlfill.render(
387 return htmlfill.render(
326 render('admin/repos_groups/repos_groups_edit.html'),
388 render('admin/repos_groups/repos_groups_edit.html'),
@@ -37,7 +37,8 b' from pylons.i18n.translation import _'
37
37
38 from rhodecode.lib import helpers as h
38 from rhodecode.lib import helpers as h
39 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
39 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
40 HasPermissionAnyDecorator, NotAnonymous
40 HasPermissionAnyDecorator, NotAnonymous, HasPermissionAny,\
41 HasReposGroupPermissionAll, HasReposGroupPermissionAny, AuthUser
41 from rhodecode.lib.base import BaseController, render
42 from rhodecode.lib.base import BaseController, render
42 from rhodecode.lib.celerylib import tasks, run_task
43 from rhodecode.lib.celerylib import tasks, run_task
43 from rhodecode.lib.utils import repo2db_mapper, invalidate_cache, \
44 from rhodecode.lib.utils import repo2db_mapper, invalidate_cache, \
@@ -46,7 +47,7 b' from rhodecode.model.db import RhodeCode'
46 RhodeCodeSetting, PullRequest, PullRequestReviewers
47 RhodeCodeSetting, PullRequest, PullRequestReviewers
47 from rhodecode.model.forms import UserForm, ApplicationSettingsForm, \
48 from rhodecode.model.forms import UserForm, ApplicationSettingsForm, \
48 ApplicationUiSettingsForm, ApplicationVisualisationForm
49 ApplicationUiSettingsForm, ApplicationVisualisationForm
49 from rhodecode.model.scm import ScmModel
50 from rhodecode.model.scm import ScmModel, GroupList
50 from rhodecode.model.user import UserModel
51 from rhodecode.model.user import UserModel
51 from rhodecode.model.repo import RepoModel
52 from rhodecode.model.repo import RepoModel
52 from rhodecode.model.db import User
53 from rhodecode.model.db import User
@@ -54,6 +55,7 b' from rhodecode.model.notification import'
54 from rhodecode.model.meta import Session
55 from rhodecode.model.meta import Session
55 from rhodecode.lib.utils2 import str2bool, safe_unicode
56 from rhodecode.lib.utils2 import str2bool, safe_unicode
56 from rhodecode.lib.compat import json
57 from rhodecode.lib.compat import json
58 from webob.exc import HTTPForbidden
57 log = logging.getLogger(__name__)
59 log = logging.getLogger(__name__)
58
60
59
61
@@ -165,7 +167,7 b' class SettingsController(BaseController)'
165
167
166 except Exception:
168 except Exception:
167 log.error(traceback.format_exc())
169 log.error(traceback.format_exc())
168 h.flash(_('error occurred during updating '
170 h.flash(_('Error occurred during updating '
169 'application settings'),
171 'application settings'),
170 category='error')
172 category='error')
171
173
@@ -204,6 +206,11 b' class SettingsController(BaseController)'
204 form_result['rhodecode_lightweight_dashboard']
206 form_result['rhodecode_lightweight_dashboard']
205 Session().add(sett4)
207 Session().add(sett4)
206
208
209 sett4 = RhodeCodeSetting.get_by_name_or_create('repository_fields')
210 sett4.app_settings_value = \
211 form_result['rhodecode_repository_fields']
212 Session().add(sett4)
213
207 Session().commit()
214 Session().commit()
208 set_rhodecode_config(config)
215 set_rhodecode_config(config)
209 h.flash(_('Updated visualisation settings'),
216 h.flash(_('Updated visualisation settings'),
@@ -211,7 +218,7 b' class SettingsController(BaseController)'
211
218
212 except Exception:
219 except Exception:
213 log.error(traceback.format_exc())
220 log.error(traceback.format_exc())
214 h.flash(_('error occurred during updating '
221 h.flash(_('Error occurred during updating '
215 'visualisation settings'),
222 'visualisation settings'),
216 category='error')
223 category='error')
217
224
@@ -229,9 +236,6 b' class SettingsController(BaseController)'
229 )
236 )
230
237
231 try:
238 try:
232 # fix namespaces for hooks and extensions
233 _f = lambda s: s.replace('.', '_')
234
235 sett = RhodeCodeUi.get_by_key('push_ssl')
239 sett = RhodeCodeUi.get_by_key('push_ssl')
236 sett.ui_value = form_result['web_push_ssl']
240 sett.ui_value = form_result['web_push_ssl']
237 Session().add(sett)
241 Session().add(sett)
@@ -242,23 +246,19 b' class SettingsController(BaseController)'
242
246
243 #HOOKS
247 #HOOKS
244 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_UPDATE)
248 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_UPDATE)
245 sett.ui_active = form_result[_f('hooks_%s' %
249 sett.ui_active = form_result['hooks_changegroup_update']
246 RhodeCodeUi.HOOK_UPDATE)]
247 Session().add(sett)
250 Session().add(sett)
248
251
249 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_REPO_SIZE)
252 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_REPO_SIZE)
250 sett.ui_active = form_result[_f('hooks_%s' %
253 sett.ui_active = form_result['hooks_changegroup_repo_size']
251 RhodeCodeUi.HOOK_REPO_SIZE)]
252 Session().add(sett)
254 Session().add(sett)
253
255
254 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_PUSH)
256 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_PUSH)
255 sett.ui_active = form_result[_f('hooks_%s' %
257 sett.ui_active = form_result['hooks_changegroup_push_logger']
256 RhodeCodeUi.HOOK_PUSH)]
257 Session().add(sett)
258 Session().add(sett)
258
259
259 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_PULL)
260 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_PULL)
260 sett.ui_active = form_result[_f('hooks_%s' %
261 sett.ui_active = form_result['hooks_outgoing_pull_logger']
261 RhodeCodeUi.HOOK_PULL)]
262
262
263 Session().add(sett)
263 Session().add(sett)
264
264
@@ -269,7 +269,7 b' class SettingsController(BaseController)'
269 sett = RhodeCodeUi()
269 sett = RhodeCodeUi()
270 sett.ui_key = 'largefiles'
270 sett.ui_key = 'largefiles'
271 sett.ui_section = 'extensions'
271 sett.ui_section = 'extensions'
272 sett.ui_active = form_result[_f('extensions_largefiles')]
272 sett.ui_active = form_result['extensions_largefiles']
273 Session().add(sett)
273 Session().add(sett)
274
274
275 sett = RhodeCodeUi.get_by_key('hgsubversion')
275 sett = RhodeCodeUi.get_by_key('hgsubversion')
@@ -279,7 +279,7 b' class SettingsController(BaseController)'
279 sett.ui_key = 'hgsubversion'
279 sett.ui_key = 'hgsubversion'
280 sett.ui_section = 'extensions'
280 sett.ui_section = 'extensions'
281
281
282 sett.ui_active = form_result[_f('extensions_hgsubversion')]
282 sett.ui_active = form_result['extensions_hgsubversion']
283 Session().add(sett)
283 Session().add(sett)
284
284
285 # sett = RhodeCodeUi.get_by_key('hggit')
285 # sett = RhodeCodeUi.get_by_key('hggit')
@@ -289,7 +289,7 b' class SettingsController(BaseController)'
289 # sett.ui_key = 'hggit'
289 # sett.ui_key = 'hggit'
290 # sett.ui_section = 'extensions'
290 # sett.ui_section = 'extensions'
291 #
291 #
292 # sett.ui_active = form_result[_f('extensions_hggit')]
292 # sett.ui_active = form_result['extensions_hggit']
293 # Session().add(sett)
293 # Session().add(sett)
294
294
295 Session().commit()
295 Session().commit()
@@ -298,7 +298,7 b' class SettingsController(BaseController)'
298
298
299 except Exception:
299 except Exception:
300 log.error(traceback.format_exc())
300 log.error(traceback.format_exc())
301 h.flash(_('error occurred during updating '
301 h.flash(_('Error occurred during updating '
302 'application settings'), category='error')
302 'application settings'), category='error')
303
303
304 if setting_id == 'hooks':
304 if setting_id == 'hooks':
@@ -324,7 +324,7 b' class SettingsController(BaseController)'
324 Session().commit()
324 Session().commit()
325 except Exception:
325 except Exception:
326 log.error(traceback.format_exc())
326 log.error(traceback.format_exc())
327 h.flash(_('error occurred during hook creation'),
327 h.flash(_('Error occurred during hook creation'),
328 category='error')
328 category='error')
329
329
330 return redirect(url('admin_edit_setting', setting_id='hooks'))
330 return redirect(url('admin_edit_setting', setting_id='hooks'))
@@ -402,6 +402,8 b' class SettingsController(BaseController)'
402 # url('admin_settings_my_account')
402 # url('admin_settings_my_account')
403
403
404 c.user = User.get(self.rhodecode_user.user_id)
404 c.user = User.get(self.rhodecode_user.user_id)
405 c.perm_user = AuthUser(user_id=self.rhodecode_user.user_id,
406 ip_addr=self.ip_addr)
405 c.ldap_dn = c.user.ldap_dn
407 c.ldap_dn = c.user.ldap_dn
406
408
407 if c.user.username == 'default':
409 if c.user.username == 'default':
@@ -433,6 +435,8 b' class SettingsController(BaseController)'
433 # url('admin_settings_my_account_update', id=ID)
435 # url('admin_settings_my_account_update', id=ID)
434 uid = self.rhodecode_user.user_id
436 uid = self.rhodecode_user.user_id
435 c.user = User.get(self.rhodecode_user.user_id)
437 c.user = User.get(self.rhodecode_user.user_id)
438 c.perm_user = AuthUser(user_id=self.rhodecode_user.user_id,
439 ip_addr=self.ip_addr)
436 c.ldap_dn = c.user.ldap_dn
440 c.ldap_dn = c.user.ldap_dn
437 email = self.rhodecode_user.email
441 email = self.rhodecode_user.email
438 _form = UserForm(edit=True,
442 _form = UserForm(edit=True,
@@ -460,45 +464,32 b' class SettingsController(BaseController)'
460 return render('admin/users/user_edit_my_account.html')
464 return render('admin/users/user_edit_my_account.html')
461 except Exception:
465 except Exception:
462 log.error(traceback.format_exc())
466 log.error(traceback.format_exc())
463 h.flash(_('error occurred during update of user %s') \
467 h.flash(_('Error occurred during update of user %s') \
464 % form_result.get('username'), category='error')
468 % form_result.get('username'), category='error')
465
469
466 return redirect(url('my_account'))
470 return redirect(url('my_account'))
467
471
468 @NotAnonymous()
472 @NotAnonymous()
469 def my_account_my_pullrequests(self):
473 def my_account_my_pullrequests(self):
470 c.my_pull_requests = PullRequest.query()\
474 c.show_closed = request.GET.get('pr_show_closed')
475
476 def _filter(pr):
477 s = sorted(pr, key=lambda o: o.created_on, reverse=True)
478 if not c.show_closed:
479 s = filter(lambda p: p.status != PullRequest.STATUS_CLOSED, s)
480 return s
481
482 c.my_pull_requests = _filter(PullRequest.query()\
471 .filter(PullRequest.user_id ==
483 .filter(PullRequest.user_id ==
472 self.rhodecode_user.user_id)\
484 self.rhodecode_user.user_id)\
473 .all()
485 .all())
474 c.participate_in_pull_requests = \
475 [x.pull_request for x in PullRequestReviewers.query()\
476 .filter(PullRequestReviewers.user_id ==
477 self.rhodecode_user.user_id)\
478 .all()]
479 return render('admin/users/user_edit_my_account_pullrequests.html')
480
481 @NotAnonymous()
482 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
483 def create_repository(self):
484 """GET /_admin/create_repository: Form to create a new item"""
485
486
486 c.repo_groups = RepoGroup.groups_choices(check_perms=True)
487 c.participate_in_pull_requests = _filter([
487 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
488 x.pull_request for x in PullRequestReviewers.query()\
488 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
489 .filter(PullRequestReviewers.user_id ==
489
490 self.rhodecode_user.user_id).all()])
490 new_repo = request.GET.get('repo', '')
491 c.new_repo = repo_name_slug(new_repo)
492
491
493 ## apply the defaults from defaults page
492 return render('admin/users/user_edit_my_account_pullrequests.html')
494 defaults = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True)
495 return htmlfill.render(
496 render('admin/repos/repo_add_create_repository.html'),
497 defaults=defaults,
498 errors={},
499 prefix_error=False,
500 encoding="UTF-8"
501 )
502
493
503 def _get_hg_ui_settings(self):
494 def _get_hg_ui_settings(self):
504 ret = RhodeCodeUi.query().all()
495 ret = RhodeCodeUi.query().all()
@@ -99,9 +99,9 b' class UsersController(BaseController):'
99 "lastname": user.lastname,
99 "lastname": user.lastname,
100 "last_login": h.fmt_date(user.last_login),
100 "last_login": h.fmt_date(user.last_login),
101 "last_login_raw": datetime_to_time(user.last_login),
101 "last_login_raw": datetime_to_time(user.last_login),
102 "active": h.bool2icon(user.active),
102 "active": h.boolicon(user.active),
103 "admin": h.bool2icon(user.admin),
103 "admin": h.boolicon(user.admin),
104 "ldap": h.bool2icon(bool(user.ldap_dn)),
104 "ldap": h.boolicon(bool(user.ldap_dn)),
105 "action": user_actions(user.user_id, user.username),
105 "action": user_actions(user.user_id, user.username),
106 })
106 })
107
107
@@ -127,7 +127,7 b' class UsersController(BaseController):'
127 usr = form_result['username']
127 usr = form_result['username']
128 action_logger(self.rhodecode_user, 'admin_created_user:%s' % usr,
128 action_logger(self.rhodecode_user, 'admin_created_user:%s' % usr,
129 None, self.ip_addr, self.sa)
129 None, self.ip_addr, self.sa)
130 h.flash(_('created user %s') % usr,
130 h.flash(_('Created user %s') % usr,
131 category='success')
131 category='success')
132 Session().commit()
132 Session().commit()
133 except formencode.Invalid, errors:
133 except formencode.Invalid, errors:
@@ -139,7 +139,7 b' class UsersController(BaseController):'
139 encoding="UTF-8")
139 encoding="UTF-8")
140 except Exception:
140 except Exception:
141 log.error(traceback.format_exc())
141 log.error(traceback.format_exc())
142 h.flash(_('error occurred during creation of user %s') \
142 h.flash(_('Error occurred during creation of user %s') \
143 % request.POST.get('username'), category='error')
143 % request.POST.get('username'), category='error')
144 return redirect(url('users'))
144 return redirect(url('users'))
145
145
@@ -195,7 +195,7 b' class UsersController(BaseController):'
195 encoding="UTF-8")
195 encoding="UTF-8")
196 except Exception:
196 except Exception:
197 log.error(traceback.format_exc())
197 log.error(traceback.format_exc())
198 h.flash(_('error occurred during update of user %s') \
198 h.flash(_('Error occurred during update of user %s') \
199 % form_result.get('username'), category='error')
199 % form_result.get('username'), category='error')
200 return redirect(url('edit_user', id=id))
200 return redirect(url('edit_user', id=id))
201
201
@@ -211,7 +211,7 b' class UsersController(BaseController):'
211 try:
211 try:
212 UserModel().delete(usr)
212 UserModel().delete(usr)
213 Session().commit()
213 Session().commit()
214 h.flash(_('successfully deleted user'), category='success')
214 h.flash(_('Successfully deleted user'), category='success')
215 except (UserOwnsReposException, DefaultUserException), e:
215 except (UserOwnsReposException, DefaultUserException), e:
216 h.flash(e, category='warning')
216 h.flash(e, category='warning')
217 except Exception:
217 except Exception:
@@ -3,7 +3,7 b''
3 rhodecode.controllers.admin.users_groups
3 rhodecode.controllers.admin.users_groups
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Users Groups crud controller for pylons
6 User Groups crud controller for pylons
7
7
8 :created_on: Jan 25, 2011
8 :created_on: Jan 25, 2011
9 :author: marcink
9 :author: marcink
@@ -33,16 +33,16 b' from pylons.controllers.util import abor'
33 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
34
34
35 from rhodecode.lib import helpers as h
35 from rhodecode.lib import helpers as h
36 from rhodecode.lib.exceptions import UsersGroupsAssignedException
36 from rhodecode.lib.exceptions import UserGroupsAssignedException
37 from rhodecode.lib.utils2 import safe_unicode, str2bool
37 from rhodecode.lib.utils2 import safe_unicode, str2bool
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
39 from rhodecode.lib.base import BaseController, render
39 from rhodecode.lib.base import BaseController, render
40
40
41 from rhodecode.model.users_group import UsersGroupModel
41 from rhodecode.model.users_group import UserGroupModel
42
42
43 from rhodecode.model.db import User, UsersGroup, UsersGroupToPerm,\
43 from rhodecode.model.db import User, UserGroup, UserGroupToPerm,\
44 UsersGroupRepoToPerm, UsersGroupRepoGroupToPerm
44 UserGroupRepoToPerm, UserGroupRepoGroupToPerm
45 from rhodecode.model.forms import UsersGroupForm
45 from rhodecode.model.forms import UserGroupForm
46 from rhodecode.model.meta import Session
46 from rhodecode.model.meta import Session
47 from rhodecode.lib.utils import action_logger
47 from rhodecode.lib.utils import action_logger
48 from sqlalchemy.orm import joinedload
48 from sqlalchemy.orm import joinedload
@@ -67,23 +67,23 b' class UsersGroupsController(BaseControll'
67 def index(self, format='html'):
67 def index(self, format='html'):
68 """GET /users_groups: All items in the collection"""
68 """GET /users_groups: All items in the collection"""
69 # url('users_groups')
69 # url('users_groups')
70 c.users_groups_list = UsersGroup().query().all()
70 c.users_groups_list = UserGroup().query().all()
71 return render('admin/users_groups/users_groups.html')
71 return render('admin/users_groups/users_groups.html')
72
72
73 def create(self):
73 def create(self):
74 """POST /users_groups: Create a new item"""
74 """POST /users_groups: Create a new item"""
75 # url('users_groups')
75 # url('users_groups')
76
76
77 users_group_form = UsersGroupForm()()
77 users_group_form = UserGroupForm()()
78 try:
78 try:
79 form_result = users_group_form.to_python(dict(request.POST))
79 form_result = users_group_form.to_python(dict(request.POST))
80 UsersGroupModel().create(name=form_result['users_group_name'],
80 UserGroupModel().create(name=form_result['users_group_name'],
81 active=form_result['users_group_active'])
81 active=form_result['users_group_active'])
82 gr = form_result['users_group_name']
82 gr = form_result['users_group_name']
83 action_logger(self.rhodecode_user,
83 action_logger(self.rhodecode_user,
84 'admin_created_users_group:%s' % gr,
84 'admin_created_users_group:%s' % gr,
85 None, self.ip_addr, self.sa)
85 None, self.ip_addr, self.sa)
86 h.flash(_('created users group %s') % gr, category='success')
86 h.flash(_('Created user group %s') % gr, category='success')
87 Session().commit()
87 Session().commit()
88 except formencode.Invalid, errors:
88 except formencode.Invalid, errors:
89 return htmlfill.render(
89 return htmlfill.render(
@@ -94,7 +94,7 b' class UsersGroupsController(BaseControll'
94 encoding="UTF-8")
94 encoding="UTF-8")
95 except Exception:
95 except Exception:
96 log.error(traceback.format_exc())
96 log.error(traceback.format_exc())
97 h.flash(_('error occurred during creation of users group %s') \
97 h.flash(_('Error occurred during creation of user group %s') \
98 % request.POST.get('users_group_name'), category='error')
98 % request.POST.get('users_group_name'), category='error')
99
99
100 return redirect(url('users_groups'))
100 return redirect(url('users_groups'))
@@ -110,31 +110,33 b' class UsersGroupsController(BaseControll'
110 'repositories_groups': {}
110 'repositories_groups': {}
111 }
111 }
112
112
113 ugroup_repo_perms = UsersGroupRepoToPerm.query()\
113 ugroup_repo_perms = UserGroupRepoToPerm.query()\
114 .options(joinedload(UsersGroupRepoToPerm.permission))\
114 .options(joinedload(UserGroupRepoToPerm.permission))\
115 .options(joinedload(UsersGroupRepoToPerm.repository))\
115 .options(joinedload(UserGroupRepoToPerm.repository))\
116 .filter(UsersGroupRepoToPerm.users_group_id == id)\
116 .filter(UserGroupRepoToPerm.users_group_id == id)\
117 .all()
117 .all()
118
118
119 for gr in ugroup_repo_perms:
119 for gr in ugroup_repo_perms:
120 c.users_group.permissions['repositories'][gr.repository.repo_name] \
120 c.users_group.permissions['repositories'][gr.repository.repo_name] \
121 = gr.permission.permission_name
121 = gr.permission.permission_name
122
122
123 ugroup_group_perms = UsersGroupRepoGroupToPerm.query()\
123 ugroup_group_perms = UserGroupRepoGroupToPerm.query()\
124 .options(joinedload(UsersGroupRepoGroupToPerm.permission))\
124 .options(joinedload(UserGroupRepoGroupToPerm.permission))\
125 .options(joinedload(UsersGroupRepoGroupToPerm.group))\
125 .options(joinedload(UserGroupRepoGroupToPerm.group))\
126 .filter(UsersGroupRepoGroupToPerm.users_group_id == id)\
126 .filter(UserGroupRepoGroupToPerm.users_group_id == id)\
127 .all()
127 .all()
128
128
129 for gr in ugroup_group_perms:
129 for gr in ugroup_group_perms:
130 c.users_group.permissions['repositories_groups'][gr.group.group_name] \
130 c.users_group.permissions['repositories_groups'][gr.group.group_name] \
131 = gr.permission.permission_name
131 = gr.permission.permission_name
132
132
133 c.group_members_obj = [x.user for x in c.users_group.members]
133 c.group_members_obj = sorted((x.user for x in c.users_group.members),
134 key=lambda u: u.username.lower())
134 c.group_members = [(x.user_id, x.username) for x in
135 c.group_members = [(x.user_id, x.username) for x in
135 c.group_members_obj]
136 c.group_members_obj]
136 c.available_members = [(x.user_id, x.username) for x in
137 c.available_members = sorted(((x.user_id, x.username) for x in
137 User.query().all()]
138 User.query().all()),
139 key=lambda u: u[1].lower())
138
140
139 def update(self, id):
141 def update(self, id):
140 """PUT /users_groups/id: Update an existing item"""
142 """PUT /users_groups/id: Update an existing item"""
@@ -145,26 +147,26 b' class UsersGroupsController(BaseControll'
145 # method='put')
147 # method='put')
146 # url('users_group', id=ID)
148 # url('users_group', id=ID)
147
149
148 c.users_group = UsersGroup.get_or_404(id)
150 c.users_group = UserGroup.get_or_404(id)
149 self._load_data(id)
151 self._load_data(id)
150
152
151 available_members = [safe_unicode(x[0]) for x in c.available_members]
153 available_members = [safe_unicode(x[0]) for x in c.available_members]
152
154
153 users_group_form = UsersGroupForm(edit=True,
155 users_group_form = UserGroupForm(edit=True,
154 old_data=c.users_group.get_dict(),
156 old_data=c.users_group.get_dict(),
155 available_members=available_members)()
157 available_members=available_members)()
156
158
157 try:
159 try:
158 form_result = users_group_form.to_python(request.POST)
160 form_result = users_group_form.to_python(request.POST)
159 UsersGroupModel().update(c.users_group, form_result)
161 UserGroupModel().update(c.users_group, form_result)
160 gr = form_result['users_group_name']
162 gr = form_result['users_group_name']
161 action_logger(self.rhodecode_user,
163 action_logger(self.rhodecode_user,
162 'admin_updated_users_group:%s' % gr,
164 'admin_updated_users_group:%s' % gr,
163 None, self.ip_addr, self.sa)
165 None, self.ip_addr, self.sa)
164 h.flash(_('updated users group %s') % gr, category='success')
166 h.flash(_('Updated user group %s') % gr, category='success')
165 Session().commit()
167 Session().commit()
166 except formencode.Invalid, errors:
168 except formencode.Invalid, errors:
167 ug_model = UsersGroupModel()
169 ug_model = UserGroupModel()
168 defaults = errors.value
170 defaults = errors.value
169 e = errors.error_dict or {}
171 e = errors.error_dict or {}
170 defaults.update({
172 defaults.update({
@@ -183,7 +185,7 b' class UsersGroupsController(BaseControll'
183 encoding="UTF-8")
185 encoding="UTF-8")
184 except Exception:
186 except Exception:
185 log.error(traceback.format_exc())
187 log.error(traceback.format_exc())
186 h.flash(_('error occurred during update of users group %s') \
188 h.flash(_('Error occurred during update of user group %s') \
187 % request.POST.get('users_group_name'), category='error')
189 % request.POST.get('users_group_name'), category='error')
188
190
189 return redirect(url('edit_users_group', id=id))
191 return redirect(url('edit_users_group', id=id))
@@ -196,16 +198,16 b' class UsersGroupsController(BaseControll'
196 # h.form(url('users_group', id=ID),
198 # h.form(url('users_group', id=ID),
197 # method='delete')
199 # method='delete')
198 # url('users_group', id=ID)
200 # url('users_group', id=ID)
199 usr_gr = UsersGroup.get_or_404(id)
201 usr_gr = UserGroup.get_or_404(id)
200 try:
202 try:
201 UsersGroupModel().delete(usr_gr)
203 UserGroupModel().delete(usr_gr)
202 Session().commit()
204 Session().commit()
203 h.flash(_('successfully deleted users group'), category='success')
205 h.flash(_('Successfully deleted user group'), category='success')
204 except UsersGroupsAssignedException, e:
206 except UserGroupsAssignedException, e:
205 h.flash(e, category='error')
207 h.flash(e, category='error')
206 except Exception:
208 except Exception:
207 log.error(traceback.format_exc())
209 log.error(traceback.format_exc())
208 h.flash(_('An error occurred during deletion of users group'),
210 h.flash(_('An error occurred during deletion of user group'),
209 category='error')
211 category='error')
210 return redirect(url('users_groups'))
212 return redirect(url('users_groups'))
211
213
@@ -217,10 +219,10 b' class UsersGroupsController(BaseControll'
217 """GET /users_groups/id/edit: Form to edit an existing item"""
219 """GET /users_groups/id/edit: Form to edit an existing item"""
218 # url('edit_users_group', id=ID)
220 # url('edit_users_group', id=ID)
219
221
220 c.users_group = UsersGroup.get_or_404(id)
222 c.users_group = UserGroup.get_or_404(id)
221 self._load_data(id)
223 self._load_data(id)
222
224
223 ug_model = UsersGroupModel()
225 ug_model = UserGroupModel()
224 defaults = c.users_group.get_dict()
226 defaults = c.users_group.get_dict()
225 defaults.update({
227 defaults.update({
226 'create_repo_perm': ug_model.has_perm(c.users_group,
228 'create_repo_perm': ug_model.has_perm(c.users_group,
@@ -240,37 +242,37 b' class UsersGroupsController(BaseControll'
240 """PUT /users_perm/id: Update an existing item"""
242 """PUT /users_perm/id: Update an existing item"""
241 # url('users_group_perm', id=ID, method='put')
243 # url('users_group_perm', id=ID, method='put')
242
244
243 users_group = UsersGroup.get_or_404(id)
245 users_group = UserGroup.get_or_404(id)
244 grant_create_perm = str2bool(request.POST.get('create_repo_perm'))
246 grant_create_perm = str2bool(request.POST.get('create_repo_perm'))
245 grant_fork_perm = str2bool(request.POST.get('fork_repo_perm'))
247 grant_fork_perm = str2bool(request.POST.get('fork_repo_perm'))
246 inherit_perms = str2bool(request.POST.get('inherit_default_permissions'))
248 inherit_perms = str2bool(request.POST.get('inherit_default_permissions'))
247
249
248 usersgroup_model = UsersGroupModel()
250 usergroup_model = UserGroupModel()
249
251
250 try:
252 try:
251 users_group.inherit_default_permissions = inherit_perms
253 users_group.inherit_default_permissions = inherit_perms
252 Session().add(users_group)
254 Session().add(users_group)
253
255
254 if grant_create_perm:
256 if grant_create_perm:
255 usersgroup_model.revoke_perm(id, 'hg.create.none')
257 usergroup_model.revoke_perm(id, 'hg.create.none')
256 usersgroup_model.grant_perm(id, 'hg.create.repository')
258 usergroup_model.grant_perm(id, 'hg.create.repository')
257 h.flash(_("Granted 'repository create' permission to users group"),
259 h.flash(_("Granted 'repository create' permission to user group"),
258 category='success')
260 category='success')
259 else:
261 else:
260 usersgroup_model.revoke_perm(id, 'hg.create.repository')
262 usergroup_model.revoke_perm(id, 'hg.create.repository')
261 usersgroup_model.grant_perm(id, 'hg.create.none')
263 usergroup_model.grant_perm(id, 'hg.create.none')
262 h.flash(_("Revoked 'repository create' permission to users group"),
264 h.flash(_("Revoked 'repository create' permission to user group"),
263 category='success')
265 category='success')
264
266
265 if grant_fork_perm:
267 if grant_fork_perm:
266 usersgroup_model.revoke_perm(id, 'hg.fork.none')
268 usergroup_model.revoke_perm(id, 'hg.fork.none')
267 usersgroup_model.grant_perm(id, 'hg.fork.repository')
269 usergroup_model.grant_perm(id, 'hg.fork.repository')
268 h.flash(_("Granted 'repository fork' permission to users group"),
270 h.flash(_("Granted 'repository fork' permission to user group"),
269 category='success')
271 category='success')
270 else:
272 else:
271 usersgroup_model.revoke_perm(id, 'hg.fork.repository')
273 usergroup_model.revoke_perm(id, 'hg.fork.repository')
272 usersgroup_model.grant_perm(id, 'hg.fork.none')
274 usergroup_model.grant_perm(id, 'hg.fork.none')
273 h.flash(_("Revoked 'repository fork' permission to users group"),
275 h.flash(_("Revoked 'repository fork' permission to user group"),
274 category='success')
276 category='success')
275
277
276 Session().commit()
278 Session().commit()
@@ -27,20 +27,22 b''
27
27
28 import traceback
28 import traceback
29 import logging
29 import logging
30 from pylons.controllers.util import abort
31
30
32 from rhodecode.controllers.api import JSONRPCController, JSONRPCError
31 from rhodecode.controllers.api import JSONRPCController, JSONRPCError
33 from rhodecode.lib.auth import PasswordGenerator, AuthUser, \
32 from rhodecode.lib.auth import PasswordGenerator, AuthUser, \
34 HasPermissionAllDecorator, HasPermissionAnyDecorator, \
33 HasPermissionAllDecorator, HasPermissionAnyDecorator, \
35 HasPermissionAnyApi, HasRepoPermissionAnyApi
34 HasPermissionAnyApi, HasRepoPermissionAnyApi
36 from rhodecode.lib.utils import map_groups, repo2db_mapper
35 from rhodecode.lib.utils import map_groups, repo2db_mapper
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_int
37 from rhodecode.lib import helpers as h
37 from rhodecode.model.meta import Session
38 from rhodecode.model.meta import Session
38 from rhodecode.model.scm import ScmModel
39 from rhodecode.model.scm import ScmModel
39 from rhodecode.model.repo import RepoModel
40 from rhodecode.model.repo import RepoModel
40 from rhodecode.model.user import UserModel
41 from rhodecode.model.user import UserModel
41 from rhodecode.model.users_group import UsersGroupModel
42 from rhodecode.model.users_group import UserGroupModel
42 from rhodecode.model.permission import PermissionModel
43 from rhodecode.model.permission import PermissionModel
43 from rhodecode.model.db import Repository, RhodeCodeSetting, UserIpMap
44 from rhodecode.model.db import Repository, RhodeCodeSetting, UserIpMap
45 from rhodecode.lib.compat import json
44
46
45 log = logging.getLogger(__name__)
47 log = logging.getLogger(__name__)
46
48
@@ -121,13 +123,13 b' def get_repo_or_error(repoid):'
121
123
122 def get_users_group_or_error(usersgroupid):
124 def get_users_group_or_error(usersgroupid):
123 """
125 """
124 Get users group by id or name or return JsonRPCError if not found
126 Get user group by id or name or return JsonRPCError if not found
125
127
126 :param userid:
128 :param userid:
127 """
129 """
128 users_group = UsersGroupModel().get_group(usersgroupid)
130 users_group = UserGroupModel().get_group(usersgroupid)
129 if users_group is None:
131 if users_group is None:
130 raise JSONRPCError('users group `%s` does not exist' % usersgroupid)
132 raise JSONRPCError('user group `%s` does not exist' % usersgroupid)
131 return users_group
133 return users_group
132
134
133
135
@@ -202,7 +204,34 b' class ApiController(JSONRPCController):'
202 'Error occurred during rescan repositories action'
204 'Error occurred during rescan repositories action'
203 )
205 )
204
206
205 def lock(self, apiuser, repoid, locked, userid=Optional(OAttr('apiuser'))):
207 def invalidate_cache(self, apiuser, repoid):
208 """
209 Dispatch cache invalidation action on given repo
210
211 :param apiuser:
212 :param repoid:
213 """
214 repo = get_repo_or_error(repoid)
215 if HasPermissionAnyApi('hg.admin')(user=apiuser) is False:
216 # check if we have admin permission for this repo !
217 if HasRepoPermissionAnyApi('repository.admin',
218 'repository.write')(user=apiuser,
219 repo_name=repo.repo_name) is False:
220 raise JSONRPCError('repository `%s` does not exist' % (repoid))
221
222 try:
223 invalidated_keys = ScmModel().mark_for_invalidation(repo.repo_name)
224 Session().commit()
225 return ('Cache for repository `%s` was invalidated: '
226 'invalidated cache keys: %s' % (repoid, invalidated_keys))
227 except Exception:
228 log.error(traceback.format_exc())
229 raise JSONRPCError(
230 'Error occurred during cache invalidation action'
231 )
232
233 def lock(self, apiuser, repoid, locked=Optional(None),
234 userid=Optional(OAttr('apiuser'))):
206 """
235 """
207 Set locking state on particular repository by given user, if
236 Set locking state on particular repository by given user, if
208 this command is runned by non-admin account userid is set to user
237 this command is runned by non-admin account userid is set to user
@@ -230,21 +259,77 b' class ApiController(JSONRPCController):'
230
259
231 if isinstance(userid, Optional):
260 if isinstance(userid, Optional):
232 userid = apiuser.user_id
261 userid = apiuser.user_id
262
233 user = get_user_or_error(userid)
263 user = get_user_or_error(userid)
234 locked = bool(locked)
264
235 try:
265 if isinstance(locked, Optional):
236 if locked:
266 lockobj = Repository.getlock(repo)
237 Repository.lock(repo, user.user_id)
267
268 if lockobj[0] is None:
269 return ('Repo `%s` not locked. Locked=`False`.'
270 % (repo.repo_name))
238 else:
271 else:
239 Repository.unlock(repo)
272 userid, time_ = lockobj
273 user = get_user_or_error(userid)
274
275 return ('Repo `%s` locked by `%s`. Locked=`True`. '
276 'Locked since: `%s`'
277 % (repo.repo_name, user.username,
278 json.dumps(time_to_datetime(time_))))
279
280 else:
281 locked = str2bool(locked)
282 try:
283 if locked:
284 Repository.lock(repo, user.user_id)
285 else:
286 Repository.unlock(repo)
287
288 return ('User `%s` set lock state for repo `%s` to `%s`'
289 % (user.username, repo.repo_name, locked))
290 except Exception:
291 log.error(traceback.format_exc())
292 raise JSONRPCError(
293 'Error occurred locking repository `%s`' % repo.repo_name
294 )
240
295
241 return ('User `%s` set lock state for repo `%s` to `%s`'
296 def get_locks(self, apiuser, userid=Optional(OAttr('apiuser'))):
242 % (user.username, repo.repo_name, locked))
297 """
243 except Exception:
298 Get all locks for given userid, if
244 log.error(traceback.format_exc())
299 this command is runned by non-admin account userid is set to user
245 raise JSONRPCError(
300 who is calling this method, thus returning locks for himself
246 'Error occurred locking repository `%s`' % repo.repo_name
301
247 )
302 :param apiuser:
303 :param userid:
304 """
305 if HasPermissionAnyApi('hg.admin')(user=apiuser):
306 pass
307 else:
308 #make sure normal user does not pass someone else userid,
309 #he is not allowed to do that
310 if not isinstance(userid, Optional) and userid != apiuser.user_id:
311 raise JSONRPCError(
312 'userid is not the same as your user'
313 )
314 ret = []
315 if isinstance(userid, Optional):
316 user = None
317 else:
318 user = get_user_or_error(userid)
319
320 #show all locks
321 for r in Repository.getAll():
322 userid, time_ = r.locked
323 if time_:
324 _api_data = r.get_api_data()
325 # if we use userfilter just show the locks for this user
326 if user:
327 if safe_int(userid) == user.user_id:
328 ret.append(_api_data)
329 else:
330 ret.append(_api_data)
331
332 return ret
248
333
249 @HasPermissionAllDecorator('hg.admin')
334 @HasPermissionAllDecorator('hg.admin')
250 def show_ip(self, apiuser, userid):
335 def show_ip(self, apiuser, userid):
@@ -423,7 +508,7 b' class ApiController(JSONRPCController):'
423 @HasPermissionAllDecorator('hg.admin')
508 @HasPermissionAllDecorator('hg.admin')
424 def get_users_group(self, apiuser, usersgroupid):
509 def get_users_group(self, apiuser, usersgroupid):
425 """"
510 """"
426 Get users group by name or id
511 Get user group by name or id
427
512
428 :param apiuser:
513 :param apiuser:
429 :param usersgroupid:
514 :param usersgroupid:
@@ -442,13 +527,13 b' class ApiController(JSONRPCController):'
442 @HasPermissionAllDecorator('hg.admin')
527 @HasPermissionAllDecorator('hg.admin')
443 def get_users_groups(self, apiuser):
528 def get_users_groups(self, apiuser):
444 """"
529 """"
445 Get all users groups
530 Get all user groups
446
531
447 :param apiuser:
532 :param apiuser:
448 """
533 """
449
534
450 result = []
535 result = []
451 for users_group in UsersGroupModel().get_all():
536 for users_group in UserGroupModel().get_all():
452 result.append(users_group.get_api_data())
537 result.append(users_group.get_api_data())
453 return result
538 return result
454
539
@@ -462,15 +547,15 b' class ApiController(JSONRPCController):'
462 :param active:
547 :param active:
463 """
548 """
464
549
465 if UsersGroupModel().get_by_name(group_name):
550 if UserGroupModel().get_by_name(group_name):
466 raise JSONRPCError("users group `%s` already exist" % group_name)
551 raise JSONRPCError("user group `%s` already exist" % group_name)
467
552
468 try:
553 try:
469 active = Optional.extract(active)
554 active = Optional.extract(active)
470 ug = UsersGroupModel().create(name=group_name, active=active)
555 ug = UserGroupModel().create(name=group_name, active=active)
471 Session().commit()
556 Session().commit()
472 return dict(
557 return dict(
473 msg='created new users group `%s`' % group_name,
558 msg='created new user group `%s`' % group_name,
474 users_group=ug.get_api_data()
559 users_group=ug.get_api_data()
475 )
560 )
476 except Exception:
561 except Exception:
@@ -480,7 +565,7 b' class ApiController(JSONRPCController):'
480 @HasPermissionAllDecorator('hg.admin')
565 @HasPermissionAllDecorator('hg.admin')
481 def add_user_to_users_group(self, apiuser, usersgroupid, userid):
566 def add_user_to_users_group(self, apiuser, usersgroupid, userid):
482 """"
567 """"
483 Add a user to a users group
568 Add a user to a user group
484
569
485 :param apiuser:
570 :param apiuser:
486 :param usersgroupid:
571 :param usersgroupid:
@@ -490,9 +575,9 b' class ApiController(JSONRPCController):'
490 users_group = get_users_group_or_error(usersgroupid)
575 users_group = get_users_group_or_error(usersgroupid)
491
576
492 try:
577 try:
493 ugm = UsersGroupModel().add_user_to_group(users_group, user)
578 ugm = UserGroupModel().add_user_to_group(users_group, user)
494 success = True if ugm != True else False
579 success = True if ugm != True else False
495 msg = 'added member `%s` to users group `%s`' % (
580 msg = 'added member `%s` to user group `%s`' % (
496 user.username, users_group.users_group_name
581 user.username, users_group.users_group_name
497 )
582 )
498 msg = msg if success else 'User is already in that group'
583 msg = msg if success else 'User is already in that group'
@@ -505,7 +590,7 b' class ApiController(JSONRPCController):'
505 except Exception:
590 except Exception:
506 log.error(traceback.format_exc())
591 log.error(traceback.format_exc())
507 raise JSONRPCError(
592 raise JSONRPCError(
508 'failed to add member to users group `%s`' % (
593 'failed to add member to user group `%s`' % (
509 users_group.users_group_name
594 users_group.users_group_name
510 )
595 )
511 )
596 )
@@ -523,9 +608,9 b' class ApiController(JSONRPCController):'
523 users_group = get_users_group_or_error(usersgroupid)
608 users_group = get_users_group_or_error(usersgroupid)
524
609
525 try:
610 try:
526 success = UsersGroupModel().remove_user_from_group(users_group,
611 success = UserGroupModel().remove_user_from_group(users_group,
527 user)
612 user)
528 msg = 'removed member `%s` from users group `%s`' % (
613 msg = 'removed member `%s` from user group `%s`' % (
529 user.username, users_group.users_group_name
614 user.username, users_group.users_group_name
530 )
615 )
531 msg = msg if success else "User wasn't in group"
616 msg = msg if success else "User wasn't in group"
@@ -534,7 +619,7 b' class ApiController(JSONRPCController):'
534 except Exception:
619 except Exception:
535 log.error(traceback.format_exc())
620 log.error(traceback.format_exc())
536 raise JSONRPCError(
621 raise JSONRPCError(
537 'failed to remove member from users group `%s`' % (
622 'failed to remove member from user group `%s`' % (
538 users_group.users_group_name
623 users_group.users_group_name
539 )
624 )
540 )
625 )
@@ -555,6 +640,7 b' class ApiController(JSONRPCController):'
555 raise JSONRPCError('repository `%s` does not exist' % (repoid))
640 raise JSONRPCError('repository `%s` does not exist' % (repoid))
556
641
557 members = []
642 members = []
643 followers = []
558 for user in repo.repo_to_perm:
644 for user in repo.repo_to_perm:
559 perm = user.permission.permission_name
645 perm = user.permission.permission_name
560 user = user.user
646 user = user.user
@@ -571,8 +657,12 b' class ApiController(JSONRPCController):'
571 users_group_data['permission'] = perm
657 users_group_data['permission'] = perm
572 members.append(users_group_data)
658 members.append(users_group_data)
573
659
660 for user in repo.followers:
661 followers.append(user.user.get_api_data())
662
574 data = repo.get_api_data()
663 data = repo.get_api_data()
575 data['members'] = members
664 data['members'] = members
665 data['followers'] = followers
576 return data
666 return data
577
667
578 def get_repos(self, apiuser):
668 def get_repos(self, apiuser):
@@ -763,12 +853,13 b' class ApiController(JSONRPCController):'
763 fork_name)
853 fork_name)
764 )
854 )
765
855
766 def delete_repo(self, apiuser, repoid):
856 def delete_repo(self, apiuser, repoid, forks=Optional(None)):
767 """
857 """
768 Deletes a given repository
858 Deletes a given repository
769
859
770 :param apiuser:
860 :param apiuser:
771 :param repoid:
861 :param repoid:
862 :param forks: detach or delete, what do do with attached forks for repo
772 """
863 """
773 repo = get_repo_or_error(repoid)
864 repo = get_repo_or_error(repoid)
774
865
@@ -776,13 +867,26 b' class ApiController(JSONRPCController):'
776 # check if we have admin permission for this repo !
867 # check if we have admin permission for this repo !
777 if HasRepoPermissionAnyApi('repository.admin')(user=apiuser,
868 if HasRepoPermissionAnyApi('repository.admin')(user=apiuser,
778 repo_name=repo.repo_name) is False:
869 repo_name=repo.repo_name) is False:
779 raise JSONRPCError('repository `%s` does not exist' % (repoid))
870 raise JSONRPCError('repository `%s` does not exist' % (repoid))
780
871
781 try:
872 try:
782 RepoModel().delete(repo)
873 handle_forks = Optional.extract(forks)
874 _forks_msg = ''
875 _forks = [f for f in repo.forks]
876 if handle_forks == 'detach':
877 _forks_msg = ' ' + _('Detached %s forks') % len(_forks)
878 elif handle_forks == 'delete':
879 _forks_msg = ' ' + _('Deleted %s forks') % len(_forks)
880 elif _forks:
881 raise JSONRPCError(
882 'Cannot delete `%s` it still contains attached forks'
883 % repo.repo_name
884 )
885
886 RepoModel().delete(repo, forks=forks)
783 Session().commit()
887 Session().commit()
784 return dict(
888 return dict(
785 msg='Deleted repository `%s`' % repo.repo_name,
889 msg='Deleted repository `%s`%s' % (repo.repo_name, _forks_msg),
786 success=True
890 success=True
787 )
891 )
788 except Exception:
892 except Exception:
@@ -859,7 +963,7 b' class ApiController(JSONRPCController):'
859 def grant_users_group_permission(self, apiuser, repoid, usersgroupid,
963 def grant_users_group_permission(self, apiuser, repoid, usersgroupid,
860 perm):
964 perm):
861 """
965 """
862 Grant permission for users group on given repository, or update
966 Grant permission for user group on given repository, or update
863 existing one if found
967 existing one if found
864
968
865 :param apiuser:
969 :param apiuser:
@@ -878,7 +982,7 b' class ApiController(JSONRPCController):'
878
982
879 Session().commit()
983 Session().commit()
880 return dict(
984 return dict(
881 msg='Granted perm: `%s` for users group: `%s` in '
985 msg='Granted perm: `%s` for user group: `%s` in '
882 'repo: `%s`' % (
986 'repo: `%s`' % (
883 perm.permission_name, users_group.users_group_name,
987 perm.permission_name, users_group.users_group_name,
884 repo.repo_name
988 repo.repo_name
@@ -888,7 +992,7 b' class ApiController(JSONRPCController):'
888 except Exception:
992 except Exception:
889 log.error(traceback.format_exc())
993 log.error(traceback.format_exc())
890 raise JSONRPCError(
994 raise JSONRPCError(
891 'failed to edit permission for users group: `%s` in '
995 'failed to edit permission for user group: `%s` in '
892 'repo: `%s`' % (
996 'repo: `%s`' % (
893 usersgroupid, repo.repo_name
997 usersgroupid, repo.repo_name
894 )
998 )
@@ -897,7 +1001,7 b' class ApiController(JSONRPCController):'
897 @HasPermissionAllDecorator('hg.admin')
1001 @HasPermissionAllDecorator('hg.admin')
898 def revoke_users_group_permission(self, apiuser, repoid, usersgroupid):
1002 def revoke_users_group_permission(self, apiuser, repoid, usersgroupid):
899 """
1003 """
900 Revoke permission for users group on given repository
1004 Revoke permission for user group on given repository
901
1005
902 :param apiuser:
1006 :param apiuser:
903 :param repoid:
1007 :param repoid:
@@ -912,7 +1016,7 b' class ApiController(JSONRPCController):'
912
1016
913 Session().commit()
1017 Session().commit()
914 return dict(
1018 return dict(
915 msg='Revoked perm for users group: `%s` in repo: `%s`' % (
1019 msg='Revoked perm for user group: `%s` in repo: `%s`' % (
916 users_group.users_group_name, repo.repo_name
1020 users_group.users_group_name, repo.repo_name
917 ),
1021 ),
918 success=True
1022 success=True
@@ -920,7 +1024,7 b' class ApiController(JSONRPCController):'
920 except Exception:
1024 except Exception:
921 log.error(traceback.format_exc())
1025 log.error(traceback.format_exc())
922 raise JSONRPCError(
1026 raise JSONRPCError(
923 'failed to edit permission for users group: `%s` in '
1027 'failed to edit permission for user group: `%s` in '
924 'repo: `%s`' % (
1028 'repo: `%s`' % (
925 users_group.users_group_name, repo.repo_name
1029 users_group.users_group_name, repo.repo_name
926 )
1030 )
@@ -86,8 +86,8 b' class ChangelogController(BaseRepoContro'
86 c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
86 c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
87 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
87 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
88 log.error(traceback.format_exc())
88 log.error(traceback.format_exc())
89 h.flash(str(e), category='warning')
89 h.flash(str(e), category='error')
90 return redirect(url('home'))
90 return redirect(url('changelog_home', repo_name=c.repo_name))
91
91
92 self._graph(c.rhodecode_repo, collection, c.total_cs, c.size, p)
92 self._graph(c.rhodecode_repo, collection, c.total_cs, c.size, p)
93
93
@@ -26,7 +26,7 b''
26 import logging
26 import logging
27 import traceback
27 import traceback
28 from collections import defaultdict
28 from collections import defaultdict
29 from webob.exc import HTTPForbidden, HTTPBadRequest
29 from webob.exc import HTTPForbidden, HTTPBadRequest, HTTPNotFound
30
30
31 from pylons import tmpl_context as c, url, request, response
31 from pylons import tmpl_context as c, url, request, response
32 from pylons.i18n.translation import _
32 from pylons.i18n.translation import _
@@ -71,7 +71,7 b' def get_ignore_ws(fid, GET):'
71 if ig_ws:
71 if ig_ws:
72 try:
72 try:
73 return int(ig_ws[0].split(':')[-1])
73 return int(ig_ws[0].split(':')[-1])
74 except:
74 except Exception:
75 pass
75 pass
76 return ig_ws_global
76 return ig_ws_global
77
77
@@ -80,21 +80,21 b' def _ignorews_url(GET, fileid=None):'
80 fileid = str(fileid) if fileid else None
80 fileid = str(fileid) if fileid else None
81 params = defaultdict(list)
81 params = defaultdict(list)
82 _update_with_GET(params, GET)
82 _update_with_GET(params, GET)
83 lbl = _('show white space')
83 lbl = _('Show white space')
84 ig_ws = get_ignore_ws(fileid, GET)
84 ig_ws = get_ignore_ws(fileid, GET)
85 ln_ctx = get_line_ctx(fileid, GET)
85 ln_ctx = get_line_ctx(fileid, GET)
86 # global option
86 # global option
87 if fileid is None:
87 if fileid is None:
88 if ig_ws is None:
88 if ig_ws is None:
89 params['ignorews'] += [1]
89 params['ignorews'] += [1]
90 lbl = _('ignore white space')
90 lbl = _('Ignore white space')
91 ctx_key = 'context'
91 ctx_key = 'context'
92 ctx_val = ln_ctx
92 ctx_val = ln_ctx
93 # per file options
93 # per file options
94 else:
94 else:
95 if ig_ws is None:
95 if ig_ws is None:
96 params[fileid] += ['WS:1']
96 params[fileid] += ['WS:1']
97 lbl = _('ignore white space')
97 lbl = _('Ignore white space')
98
98
99 ctx_key = fileid
99 ctx_key = fileid
100 ctx_val = 'C:%s' % ln_ctx
100 ctx_val = 'C:%s' % ln_ctx
@@ -124,7 +124,7 b' def get_line_ctx(fid, GET):'
124
124
125 try:
125 try:
126 return int(retval)
126 return int(retval)
127 except:
127 except Exception:
128 return 3
128 return 3
129
129
130
130
@@ -203,8 +203,8 b' class ChangesetController(BaseRepoContro'
203
203
204 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
204 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
205 log.error(traceback.format_exc())
205 log.error(traceback.format_exc())
206 h.flash(str(e), category='warning')
206 h.flash(str(e), category='error')
207 return redirect(url('home'))
207 raise HTTPNotFound()
208
208
209 c.changes = OrderedDict()
209 c.changes = OrderedDict()
210
210
@@ -329,7 +329,7 b' class ChangesetController(BaseRepoContro'
329 text = text or (_('Status change -> %s')
329 text = text or (_('Status change -> %s')
330 % ChangesetStatus.get_status_lbl(status))
330 % ChangesetStatus.get_status_lbl(status))
331
331
332 comm = ChangesetCommentsModel().create(
332 c.co = comm = ChangesetCommentsModel().create(
333 text=text,
333 text=text,
334 repo=c.rhodecode_db_repo.repo_id,
334 repo=c.rhodecode_db_repo.repo_id,
335 user=c.rhodecode_user.user_id,
335 user=c.rhodecode_user.user_id,
@@ -371,12 +371,11 b' class ChangesetController(BaseRepoContro'
371 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
371 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
372 return redirect(h.url('changeset_home', repo_name=repo_name,
372 return redirect(h.url('changeset_home', repo_name=repo_name,
373 revision=revision))
373 revision=revision))
374
374 #only ajax below
375 data = {
375 data = {
376 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
376 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
377 }
377 }
378 if comm:
378 if comm:
379 c.co = comm
380 data.update(comm.get_dict())
379 data.update(comm.get_dict())
381 data.update({'rendered_text':
380 data.update({'rendered_text':
382 render('changeset/changeset_comment_block.html')})
381 render('changeset/changeset_comment_block.html')})
@@ -3,7 +3,7 b''
3 rhodecode.controllers.compare
3 rhodecode.controllers.compare
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 compare controller for pylons showoing differences between two
6 compare controller for pylons showing differences between two
7 repos, branches, bookmarks or tips
7 repos, branches, bookmarks or tips
8
8
9 :created_on: May 6, 2012
9 :created_on: May 6, 2012
@@ -40,7 +40,6 b' from rhodecode.lib import diffs'
40 from rhodecode.model.db import Repository
40 from rhodecode.model.db import Repository
41 from rhodecode.model.pull_request import PullRequestModel
41 from rhodecode.model.pull_request import PullRequestModel
42 from webob.exc import HTTPBadRequest
42 from webob.exc import HTTPBadRequest
43 from rhodecode.lib.utils2 import str2bool
44 from rhodecode.lib.diffs import LimitedDiffContainer
43 from rhodecode.lib.diffs import LimitedDiffContainer
45 from rhodecode.lib.vcs.backends.base import EmptyChangeset
44 from rhodecode.lib.vcs.backends.base import EmptyChangeset
46
45
@@ -84,80 +83,85 b' class CompareController(BaseRepoControll'
84 raise HTTPBadRequest()
83 raise HTTPBadRequest()
85
84
86 def index(self, org_ref_type, org_ref, other_ref_type, other_ref):
85 def index(self, org_ref_type, org_ref, other_ref_type, other_ref):
87
86 # org_ref will be evaluated in org_repo
88 org_repo = c.rhodecode_db_repo.repo_name
87 org_repo = c.rhodecode_db_repo.repo_name
89 org_ref = (org_ref_type, org_ref)
88 org_ref = (org_ref_type, org_ref)
89 # other_ref will be evaluated in other_repo
90 other_ref = (other_ref_type, other_ref)
90 other_ref = (other_ref_type, other_ref)
91 other_repo = request.GET.get('repo', org_repo)
91 other_repo = request.GET.get('other_repo', org_repo)
92 incoming_changesets = str2bool(request.GET.get('bundle', False))
92 # If merge is True:
93 c.fulldiff = fulldiff = request.GET.get('fulldiff')
93 # Show what org would get if merged with other:
94 rev_start = request.GET.get('rev_start')
94 # List changesets that are ancestors of other but not of org.
95 rev_end = request.GET.get('rev_end')
95 # New changesets in org is thus ignored.
96 # Diff will be from common ancestor, and merges of org to other will thus be ignored.
97 # If merge is False:
98 # Make a raw diff from org to other, no matter if related or not.
99 # Changesets in one and not in the other will be ignored
100 merge = bool(request.GET.get('merge'))
101 # fulldiff disables cut_off_limit
102 c.fulldiff = request.GET.get('fulldiff')
103 # partial uses compare_cs.html template directly
104 partial = request.environ.get('HTTP_X_PARTIAL_XHR')
105 # as_form puts hidden input field with changeset revisions
106 c.as_form = partial and request.GET.get('as_form')
107 # swap url for compare_diff page - never partial and never as_form
108 c.swap_url = h.url('compare_url',
109 repo_name=other_repo,
110 org_ref_type=other_ref[0], org_ref=other_ref[1],
111 other_repo=org_repo,
112 other_ref_type=org_ref[0], other_ref=org_ref[1],
113 merge=merge or '')
96
114
97 c.swap_url = h.url('compare_url', repo_name=other_repo,
115 org_repo = Repository.get_by_repo_name(org_repo)
98 org_ref_type=other_ref[0], org_ref=other_ref[1],
116 other_repo = Repository.get_by_repo_name(other_repo)
99 other_ref_type=org_ref[0], other_ref=org_ref[1],
100 repo=org_repo, as_form=request.GET.get('as_form'),
101 bundle=incoming_changesets)
102
117
103 c.org_repo = org_repo = Repository.get_by_repo_name(org_repo)
118 if org_repo is None:
104 c.other_repo = other_repo = Repository.get_by_repo_name(other_repo)
105
106 if c.org_repo is None:
107 log.error('Could not find org repo %s' % org_repo)
119 log.error('Could not find org repo %s' % org_repo)
108 raise HTTPNotFound
120 raise HTTPNotFound
109 if c.other_repo is None:
121 if other_repo is None:
110 log.error('Could not find other repo %s' % other_repo)
122 log.error('Could not find other repo %s' % other_repo)
111 raise HTTPNotFound
123 raise HTTPNotFound
112
124
113 if c.org_repo != c.other_repo and h.is_git(c.rhodecode_repo):
125 if org_repo != other_repo and h.is_git(org_repo):
114 log.error('compare of two remote repos not available for GIT REPOS')
126 log.error('compare of two remote repos not available for GIT REPOS')
115 raise HTTPNotFound
127 raise HTTPNotFound
116
128
117 if c.org_repo.scm_instance.alias != c.other_repo.scm_instance.alias:
129 if org_repo.scm_instance.alias != other_repo.scm_instance.alias:
118 log.error('compare of two different kind of remote repos not available')
130 log.error('compare of two different kind of remote repos not available')
119 raise HTTPNotFound
131 raise HTTPNotFound
120
132
121 partial = request.environ.get('HTTP_X_PARTIAL_XHR')
122 self.__get_cs_or_redirect(rev=org_ref, repo=org_repo, partial=partial)
133 self.__get_cs_or_redirect(rev=org_ref, repo=org_repo, partial=partial)
123 self.__get_cs_or_redirect(rev=other_ref, repo=other_repo, partial=partial)
134 self.__get_cs_or_redirect(rev=other_ref, repo=other_repo, partial=partial)
124
135
125 if rev_start and rev_end:
136 c.org_repo = org_repo
126 #replace our org_ref with given CS
137 c.other_repo = other_repo
127 org_ref = ('rev', rev_start)
138 c.org_ref = org_ref[1]
128 other_ref = ('rev', rev_end)
139 c.other_ref = other_ref[1]
140 c.org_ref_type = org_ref[0]
141 c.other_ref_type = other_ref[0]
129
142
130 c.cs_ranges, discovery_data = PullRequestModel().get_compare_data(
143 c.cs_ranges, c.ancestor = PullRequestModel().get_compare_data(
131 org_repo, org_ref, other_repo, other_ref,
144 org_repo, org_ref, other_repo, other_ref, merge)
132 )
133
145
134 c.statuses = c.rhodecode_db_repo.statuses([x.raw_id for x in
146 c.statuses = c.rhodecode_db_repo.statuses([x.raw_id for x in
135 c.cs_ranges])
147 c.cs_ranges])
136 c.target_repo = c.repo_name
137 # defines that we need hidden inputs with changesets
138 c.as_form = request.GET.get('as_form', False)
139 if partial:
148 if partial:
149 assert c.ancestor
140 return render('compare/compare_cs.html')
150 return render('compare/compare_cs.html')
141
151
142 c.org_ref = org_ref[1]
152 if c.ancestor:
143 c.other_ref = other_ref[1]
153 assert merge
154 # case we want a simple diff without incoming changesets,
155 # previewing what will be merged.
156 # Make the diff on the other repo (which is known to have other_ref)
157 log.debug('Using ancestor %s as org_ref instead of %s'
158 % (c.ancestor, org_ref))
159 org_ref = ('rev', c.ancestor)
160 org_repo = other_repo
144
161
145 if not incoming_changesets and c.cs_ranges and c.org_repo != c.other_repo:
162 diff_limit = self.cut_off_limit if not c.fulldiff else None
146 # case we want a simple diff without incoming changesets, just
147 # for review purposes. Make the diff on the forked repo, with
148 # revision that is common ancestor
149 _org_ref = org_ref
150 org_ref = ('rev', getattr(c.cs_ranges[0].parents[0]
151 if c.cs_ranges[0].parents
152 else EmptyChangeset(), 'raw_id'))
153 log.debug('Changed org_ref from %s to %s' % (_org_ref, org_ref))
154 other_repo = org_repo
155
163
156 diff_limit = self.cut_off_limit if not fulldiff else None
164 _diff = diffs.differ(org_repo, org_ref, other_repo, other_ref)
157
158 _diff = diffs.differ(org_repo, org_ref, other_repo, other_ref,
159 discovery_data,
160 remote_compare=incoming_changesets)
161
165
162 diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff',
166 diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff',
163 diff_limit=diff_limit)
167 diff_limit=diff_limit)
@@ -91,7 +91,7 b' class ErrorController(BaseController):'
91 [400, 401, 403, 404, 500]'''
91 [400, 401, 403, 404, 500]'''
92 try:
92 try:
93 code = int(code)
93 code = int(code)
94 except:
94 except Exception:
95 code = 500
95 code = 500
96
96
97 if code == 400:
97 if code == 400:
@@ -88,9 +88,8 b' class FeedController(BaseRepoController)'
88
88
89 def __get_desc(self, cs):
89 def __get_desc(self, cs):
90 desc_msg = []
90 desc_msg = []
91 desc_msg.append('%s %s %s<br/>' % (h.person(cs.author),
91 desc_msg.append((_('%s committed on %s')
92 _('commited on'),
92 % (h.person(cs.author), h.fmt_date(cs.date))) + '<br/>')
93 h.fmt_date(cs.date)))
94 #branches, tags, bookmarks
93 #branches, tags, bookmarks
95 if cs.branch:
94 if cs.branch:
96 desc_msg.append('branch: %s<br/>' % cs.branch)
95 desc_msg.append('branch: %s<br/>' % cs.branch)
@@ -103,7 +102,7 b' class FeedController(BaseRepoController)'
103 # rev link
102 # rev link
104 _url = url('changeset_home', repo_name=cs.repository.name,
103 _url = url('changeset_home', repo_name=cs.repository.name,
105 revision=cs.raw_id, qualified=True)
104 revision=cs.raw_id, qualified=True)
106 desc_msg.append('changesest: <a href="%s">%s</a>' % (_url, cs.raw_id[:8]))
105 desc_msg.append('changeset: <a href="%s">%s</a>' % (_url, cs.raw_id[:8]))
107
106
108 desc_msg.append('<pre>')
107 desc_msg.append('<pre>')
109 desc_msg.append(cs.message)
108 desc_msg.append(cs.message)
@@ -27,6 +27,7 b' import os'
27 import logging
27 import logging
28 import traceback
28 import traceback
29 import tempfile
29 import tempfile
30 import shutil
30
31
31 from pylons import request, response, tmpl_context as c, url
32 from pylons import request, response, tmpl_context as c, url
32 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
@@ -55,6 +56,7 b' from rhodecode.model.db import Repositor'
55
56
56 from rhodecode.controllers.changeset import anchor_url, _ignorews_url,\
57 from rhodecode.controllers.changeset import anchor_url, _ignorews_url,\
57 _context_url, get_line_ctx, get_ignore_ws
58 _context_url, get_line_ctx, get_ignore_ws
59 from webob.exc import HTTPNotFound
58
60
59
61
60 log = logging.getLogger(__name__)
62 log = logging.getLogger(__name__)
@@ -83,14 +85,14 b' class FilesController(BaseRepoController'
83 url_ = url('files_add_home',
85 url_ = url('files_add_home',
84 repo_name=c.repo_name,
86 repo_name=c.repo_name,
85 revision=0, f_path='')
87 revision=0, f_path='')
86 add_new = '<a href="%s">[%s]</a>' % (url_, _('click here to add new file'))
88 add_new = h.link_to(_('Click here to add new file'), url_)
87 h.flash(h.literal(_('There are no files yet %s') % add_new),
89 h.flash(h.literal(_('There are no files yet %s') % add_new),
88 category='warning')
90 category='warning')
89 redirect(h.url('summary_home', repo_name=repo_name))
91 redirect(h.url('summary_home', repo_name=repo_name))
90
92
91 except RepositoryError, e:
93 except RepositoryError, e: # including ChangesetDoesNotExistError
92 h.flash(str(e), category='warning')
94 h.flash(str(e), category='error')
93 redirect(h.url('files_home', repo_name=repo_name, revision='tip'))
95 raise HTTPNotFound()
94
96
95 def __get_filenode_or_redirect(self, repo_name, cs, path):
97 def __get_filenode_or_redirect(self, repo_name, cs, path):
96 """
98 """
@@ -107,9 +109,8 b' class FilesController(BaseRepoController'
107 if file_node.is_dir():
109 if file_node.is_dir():
108 raise RepositoryError('given path is a directory')
110 raise RepositoryError('given path is a directory')
109 except RepositoryError, e:
111 except RepositoryError, e:
110 h.flash(str(e), category='warning')
112 h.flash(str(e), category='error')
111 redirect(h.url('files_home', repo_name=repo_name,
113 raise HTTPNotFound()
112 revision=cs.raw_id))
113
114
114 return file_node
115 return file_node
115
116
@@ -121,13 +122,12 b' class FilesController(BaseRepoController'
121 post_revision = request.POST.get('at_rev', None)
122 post_revision = request.POST.get('at_rev', None)
122 if post_revision:
123 if post_revision:
123 cs = self.__get_cs_or_redirect(post_revision, repo_name)
124 cs = self.__get_cs_or_redirect(post_revision, repo_name)
124 redirect(url('files_home', repo_name=c.repo_name,
125 revision=cs.raw_id, f_path=f_path))
126
125
127 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
126 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
128 c.branch = request.GET.get('branch', None)
127 c.branch = request.GET.get('branch', None)
129 c.f_path = f_path
128 c.f_path = f_path
130 c.annotate = annotate
129 c.annotate = annotate
130 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
131 cur_rev = c.changeset.revision
131 cur_rev = c.changeset.revision
132
132
133 # prev link
133 # prev link
@@ -160,6 +160,9 b' class FilesController(BaseRepoController'
160 c.file_changeset = (c.changeset
160 c.file_changeset = (c.changeset
161 if c.changeset.revision < file_last_cs.revision
161 if c.changeset.revision < file_last_cs.revision
162 else file_last_cs)
162 else file_last_cs)
163 #determine if we're on branch head
164 _branches = c.rhodecode_repo.branches
165 c.on_branch_head = revision in _branches.keys() + _branches.values()
163 _hist = []
166 _hist = []
164 c.file_history = []
167 c.file_history = []
165 if c.load_full_history:
168 if c.load_full_history:
@@ -171,9 +174,8 b' class FilesController(BaseRepoController'
171 else:
174 else:
172 c.authors = c.file_history = []
175 c.authors = c.file_history = []
173 except RepositoryError, e:
176 except RepositoryError, e:
174 h.flash(str(e), category='warning')
177 h.flash(str(e), category='error')
175 redirect(h.url('files_home', repo_name=repo_name,
178 raise HTTPNotFound()
176 revision='tip'))
177
179
178 if request.environ.get('HTTP_X_PARTIAL_XHR'):
180 if request.environ.get('HTTP_X_PARTIAL_XHR'):
179 return render('files/files_ypjax.html')
181 return render('files/files_ypjax.html')
@@ -260,7 +262,7 b' class FilesController(BaseRepoController'
260 @LoginRequired()
262 @LoginRequired()
261 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
263 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
262 def edit(self, repo_name, revision, f_path):
264 def edit(self, repo_name, revision, f_path):
263 repo = Repository.get_by_repo_name(repo_name)
265 repo = c.rhodecode_db_repo
264 if repo.enable_locking and repo.locked[0]:
266 if repo.enable_locking and repo.locked[0]:
265 h.flash(_('This repository is has been locked by %s on %s')
267 h.flash(_('This repository is has been locked by %s on %s')
266 % (h.person_by_id(repo.locked[0]),
268 % (h.person_by_id(repo.locked[0]),
@@ -269,6 +271,17 b' class FilesController(BaseRepoController'
269 return redirect(h.url('files_home',
271 return redirect(h.url('files_home',
270 repo_name=repo_name, revision='tip'))
272 repo_name=repo_name, revision='tip'))
271
273
274 # check if revision is a branch identifier- basically we cannot
275 # create multiple heads via file editing
276 _branches = repo.scm_instance.branches
277 # check if revision is a branch name or branch hash
278 if revision not in _branches.keys() + _branches.values():
279 h.flash(_('You can only edit files with revision '
280 'being a valid branch '), category='warning')
281 return redirect(h.url('files_home',
282 repo_name=repo_name, revision='tip',
283 f_path=f_path))
284
272 r_post = request.POST
285 r_post = request.POST
273
286
274 c.cs = self.__get_cs_or_redirect(revision, repo_name)
287 c.cs = self.__get_cs_or_redirect(revision, repo_name)
@@ -277,7 +290,7 b' class FilesController(BaseRepoController'
277 if c.file.is_binary:
290 if c.file.is_binary:
278 return redirect(url('files_home', repo_name=c.repo_name,
291 return redirect(url('files_home', repo_name=c.repo_name,
279 revision=c.cs.raw_id, f_path=f_path))
292 revision=c.cs.raw_id, f_path=f_path))
280
293 c.default_message = _('Edited file %s via RhodeCode') % (f_path)
281 c.f_path = f_path
294 c.f_path = f_path
282
295
283 if r_post:
296 if r_post:
@@ -289,20 +302,17 b' class FilesController(BaseRepoController'
289 mode = detect_mode(first_line, 0)
302 mode = detect_mode(first_line, 0)
290 content = convert_line_endings(r_post.get('content'), mode)
303 content = convert_line_endings(r_post.get('content'), mode)
291
304
292 message = r_post.get('message') or (_('Edited %s via RhodeCode')
305 message = r_post.get('message') or c.default_message
293 % (f_path))
294 author = self.rhodecode_user.full_contact
306 author = self.rhodecode_user.full_contact
295
307
296 if content == old_content:
308 if content == old_content:
297 h.flash(_('No changes'),
309 h.flash(_('No changes'), category='warning')
298 category='warning')
299 return redirect(url('changeset_home', repo_name=c.repo_name,
310 return redirect(url('changeset_home', repo_name=c.repo_name,
300 revision='tip'))
311 revision='tip'))
301
302 try:
312 try:
303 self.scm_model.commit_change(repo=c.rhodecode_repo,
313 self.scm_model.commit_change(repo=c.rhodecode_repo,
304 repo_name=repo_name, cs=c.cs,
314 repo_name=repo_name, cs=c.cs,
305 user=self.rhodecode_user,
315 user=self.rhodecode_user.user_id,
306 author=author, message=message,
316 author=author, message=message,
307 content=content, f_path=f_path)
317 content=content, f_path=f_path)
308 h.flash(_('Successfully committed to %s') % f_path,
318 h.flash(_('Successfully committed to %s') % f_path,
@@ -334,26 +344,22 b' class FilesController(BaseRepoController'
334 redirect_after=False)
344 redirect_after=False)
335 if c.cs is None:
345 if c.cs is None:
336 c.cs = EmptyChangeset(alias=c.rhodecode_repo.alias)
346 c.cs = EmptyChangeset(alias=c.rhodecode_repo.alias)
337
347 c.default_message = (_('Added file via RhodeCode'))
338 c.f_path = f_path
348 c.f_path = f_path
339
349
340 if r_post:
350 if r_post:
341 unix_mode = 0
351 unix_mode = 0
342 content = convert_line_endings(r_post.get('content'), unix_mode)
352 content = convert_line_endings(r_post.get('content'), unix_mode)
343
353
344 message = r_post.get('message') or (_('Added %s via RhodeCode')
354 message = r_post.get('message') or c.default_message
345 % (f_path))
355 filename = r_post.get('filename')
346 location = r_post.get('location')
356 location = r_post.get('location')
347 filename = r_post.get('filename')
348 file_obj = r_post.get('upload_file', None)
357 file_obj = r_post.get('upload_file', None)
349
358
350 if file_obj is not None and hasattr(file_obj, 'filename'):
359 if file_obj is not None and hasattr(file_obj, 'filename'):
351 filename = file_obj.filename
360 filename = file_obj.filename
352 content = file_obj.file
361 content = file_obj.file
353
362
354 node_path = os.path.join(location, filename)
355 author = self.rhodecode_user.full_contact
356
357 if not content:
363 if not content:
358 h.flash(_('No content'), category='warning')
364 h.flash(_('No content'), category='warning')
359 return redirect(url('changeset_home', repo_name=c.repo_name,
365 return redirect(url('changeset_home', repo_name=c.repo_name,
@@ -362,16 +368,26 b' class FilesController(BaseRepoController'
362 h.flash(_('No filename'), category='warning')
368 h.flash(_('No filename'), category='warning')
363 return redirect(url('changeset_home', repo_name=c.repo_name,
369 return redirect(url('changeset_home', repo_name=c.repo_name,
364 revision='tip'))
370 revision='tip'))
371 if location.startswith('/') or location.startswith('.') or '../' in location:
372 h.flash(_('Location must be relative path and must not '
373 'contain .. in path'), category='warning')
374 return redirect(url('changeset_home', repo_name=c.repo_name,
375 revision='tip'))
376 if location:
377 location = os.path.normpath(location)
378 filename = os.path.basename(filename)
379 node_path = os.path.join(location, filename)
380 author = self.rhodecode_user.full_contact
365
381
366 try:
382 try:
367 self.scm_model.create_node(repo=c.rhodecode_repo,
383 self.scm_model.create_node(repo=c.rhodecode_repo,
368 repo_name=repo_name, cs=c.cs,
384 repo_name=repo_name, cs=c.cs,
369 user=self.rhodecode_user,
385 user=self.rhodecode_user.user_id,
370 author=author, message=message,
386 author=author, message=message,
371 content=content, f_path=node_path)
387 content=content, f_path=node_path)
372 h.flash(_('Successfully committed to %s') % node_path,
388 h.flash(_('Successfully committed to %s') % node_path,
373 category='success')
389 category='success')
374 except NodeAlreadyExistsError, e:
390 except (NodeError, NodeAlreadyExistsError), e:
375 h.flash(_(e), category='error')
391 h.flash(_(e), category='error')
376 except Exception:
392 except Exception:
377 log.error(traceback.format_exc())
393 log.error(traceback.format_exc())
@@ -400,8 +416,8 b' class FilesController(BaseRepoController'
400
416
401 try:
417 try:
402 dbrepo = RepoModel().get_by_repo_name(repo_name)
418 dbrepo = RepoModel().get_by_repo_name(repo_name)
403 if dbrepo.enable_downloads is False:
419 if not dbrepo.enable_downloads:
404 return _('downloads disabled')
420 return _('Downloads disabled')
405
421
406 if c.rhodecode_repo.alias == 'hg':
422 if c.rhodecode_repo.alias == 'hg':
407 # patch and reset hooks section of UI config to not run any
423 # patch and reset hooks section of UI config to not run any
@@ -417,11 +433,40 b' class FilesController(BaseRepoController'
417 return _('Empty repository')
433 return _('Empty repository')
418 except (ImproperArchiveTypeError, KeyError):
434 except (ImproperArchiveTypeError, KeyError):
419 return _('Unknown archive type')
435 return _('Unknown archive type')
436 # archive cache
437 from rhodecode import CONFIG
438 rev_name = cs.raw_id[:12]
439 archive_name = '%s-%s%s' % (safe_str(repo_name.replace('/', '_')),
440 safe_str(rev_name), ext)
420
441
421 fd, archive = tempfile.mkstemp()
442 use_cached_archive = False # defines if we use cached version of archive
422 t = open(archive, 'wb')
443 archive_cache_enabled = CONFIG.get('archive_cache_dir')
423 cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos)
444 if not subrepos and archive_cache_enabled:
424 t.close()
445 #check if we it's ok to write
446 if not os.path.isdir(CONFIG['archive_cache_dir']):
447 os.makedirs(CONFIG['archive_cache_dir'])
448 cached_archive_path = os.path.join(CONFIG['archive_cache_dir'], archive_name)
449 if os.path.isfile(cached_archive_path):
450 log.debug('Found cached archive in %s' % cached_archive_path)
451 fd, archive = None, cached_archive_path
452 use_cached_archive = True
453 else:
454 log.debug('Archive %s is not yet cached' % (archive_name))
455
456 if not use_cached_archive:
457 #generate new archive
458 try:
459 fd, archive = tempfile.mkstemp()
460 t = open(archive, 'wb')
461 log.debug('Creating new temp archive in %s' % archive)
462 cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos)
463 if archive_cache_enabled:
464 #if we generated the archive and use cache rename that
465 log.debug('Storing new archive in %s' % cached_archive_path)
466 shutil.move(archive, cached_archive_path)
467 archive = cached_archive_path
468 finally:
469 t.close()
425
470
426 def get_chunked_archive(archive):
471 def get_chunked_archive(archive):
427 stream = open(archive, 'rb')
472 stream = open(archive, 'rb')
@@ -429,13 +474,15 b' class FilesController(BaseRepoController'
429 data = stream.read(16 * 1024)
474 data = stream.read(16 * 1024)
430 if not data:
475 if not data:
431 stream.close()
476 stream.close()
432 os.close(fd)
477 if fd: # fd means we used temporary file
433 os.remove(archive)
478 os.close(fd)
479 if not archive_cache_enabled:
480 log.debug('Destroing temp archive %s' % archive)
481 os.remove(archive)
434 break
482 break
435 yield data
483 yield data
436
484
437 response.content_disposition = str('attachment; filename=%s-%s%s' \
485 response.content_disposition = str('attachment; filename=%s' % (archive_name))
438 % (repo_name, revision[:12], ext))
439 response.content_type = str(content_type)
486 response.content_type = str(content_type)
440 return get_chunked_archive(archive)
487 return get_chunked_archive(archive)
441
488
@@ -474,6 +521,9 b' class FilesController(BaseRepoController'
474 c.changeset_1 = c.rhodecode_repo.get_changeset(diff1)
521 c.changeset_1 = c.rhodecode_repo.get_changeset(diff1)
475 try:
522 try:
476 node1 = c.changeset_1.get_node(f_path)
523 node1 = c.changeset_1.get_node(f_path)
524 if node1.is_dir():
525 raise NodeError('%s path is a %s not a file'
526 % (node1, type(node1)))
477 except NodeDoesNotExistError:
527 except NodeDoesNotExistError:
478 c.changeset_1 = EmptyChangeset(cs=diff1,
528 c.changeset_1 = EmptyChangeset(cs=diff1,
479 revision=c.changeset_1.revision,
529 revision=c.changeset_1.revision,
@@ -487,6 +537,9 b' class FilesController(BaseRepoController'
487 c.changeset_2 = c.rhodecode_repo.get_changeset(diff2)
537 c.changeset_2 = c.rhodecode_repo.get_changeset(diff2)
488 try:
538 try:
489 node2 = c.changeset_2.get_node(f_path)
539 node2 = c.changeset_2.get_node(f_path)
540 if node2.is_dir():
541 raise NodeError('%s path is a %s not a file'
542 % (node2, type(node2)))
490 except NodeDoesNotExistError:
543 except NodeDoesNotExistError:
491 c.changeset_2 = EmptyChangeset(cs=diff2,
544 c.changeset_2 = EmptyChangeset(cs=diff2,
492 revision=c.changeset_2.revision,
545 revision=c.changeset_2.revision,
@@ -38,10 +38,11 b' from rhodecode.lib.auth import LoginRequ'
38 NotAnonymous, HasRepoPermissionAny, HasPermissionAllDecorator,\
38 NotAnonymous, HasRepoPermissionAny, HasPermissionAllDecorator,\
39 HasPermissionAnyDecorator
39 HasPermissionAnyDecorator
40 from rhodecode.lib.base import BaseRepoController, render
40 from rhodecode.lib.base import BaseRepoController, render
41 from rhodecode.model.db import Repository, RepoGroup, UserFollowing, User
41 from rhodecode.model.db import Repository, RepoGroup, UserFollowing, User,\
42 RhodeCodeUi
42 from rhodecode.model.repo import RepoModel
43 from rhodecode.model.repo import RepoModel
43 from rhodecode.model.forms import RepoForkForm
44 from rhodecode.model.forms import RepoForkForm
44 from rhodecode.model.scm import ScmModel
45 from rhodecode.model.scm import ScmModel, GroupList
45 from rhodecode.lib.utils2 import safe_int
46 from rhodecode.lib.utils2 import safe_int
46
47
47 log = logging.getLogger(__name__)
48 log = logging.getLogger(__name__)
@@ -54,7 +55,9 b' class ForksController(BaseRepoController'
54 super(ForksController, self).__before__()
55 super(ForksController, self).__before__()
55
56
56 def __load_defaults(self):
57 def __load_defaults(self):
57 c.repo_groups = RepoGroup.groups_choices(check_perms=True)
58 acl_groups = GroupList(RepoGroup.query().all(),
59 perm_set=['group.write', 'group.admin'])
60 c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
58 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
61 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
59 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
62 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
60 c.landing_revs_choices = choices
63 c.landing_revs_choices = choices
@@ -93,9 +96,16 b' class ForksController(BaseRepoController'
93 c.stats_percentage = '%.2f' % ((float((last_rev)) /
96 c.stats_percentage = '%.2f' % ((float((last_rev)) /
94 c.repo_last_rev) * 100)
97 c.repo_last_rev) * 100)
95
98
99 c.can_update = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_UPDATE).ui_active
100
96 defaults = RepoModel()._get_defaults(repo_name)
101 defaults = RepoModel()._get_defaults(repo_name)
102 # alter the description to indicate a fork
103 defaults['description'] = ('fork of repository: %s \n%s'
104 % (defaults['repo_name'],
105 defaults['description']))
97 # add suffix to fork
106 # add suffix to fork
98 defaults['repo_name'] = '%s-fork' % defaults['repo_name']
107 defaults['repo_name'] = '%s-fork' % defaults['repo_name']
108
99 return defaults
109 return defaults
100
110
101 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
111 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
@@ -152,11 +162,18 b' class ForksController(BaseRepoController'
152 try:
162 try:
153 form_result = _form.to_python(dict(request.POST))
163 form_result = _form.to_python(dict(request.POST))
154
164
165 # an approximation that is better than nothing
166 if not RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_UPDATE).ui_active:
167 form_result['update_after_clone'] = False
168
155 # create fork is done sometimes async on celery, db transaction
169 # create fork is done sometimes async on celery, db transaction
156 # management is handled there.
170 # management is handled there.
157 RepoModel().create_fork(form_result, self.rhodecode_user.user_id)
171 RepoModel().create_fork(form_result, self.rhodecode_user.user_id)
158 h.flash(_('forked %s repository as %s') \
172 fork_url = h.link_to(form_result['repo_name_full'],
159 % (repo_name, form_result['repo_name']),
173 h.url('summary_home', repo_name=form_result['repo_name_full']))
174
175 h.flash(h.literal(_('Forked repository %s as %s') \
176 % (repo_name, fork_url)),
160 category='success')
177 category='success')
161 except formencode.Invalid, errors:
178 except formencode.Invalid, errors:
162 c.new_repo = errors.value['repo_name']
179 c.new_repo = errors.value['repo_name']
@@ -172,4 +189,4 b' class ForksController(BaseRepoController'
172 h.flash(_('An error occurred during repository forking %s') %
189 h.flash(_('An error occurred during repository forking %s') %
173 repo_name, category='error')
190 repo_name, category='error')
174
191
175 return redirect(url('home'))
192 return redirect(h.url('summary_home', repo_name=repo_name))
@@ -52,7 +52,7 b' class HomeController(BaseController):'
52 c.groups = self.scm_model.get_repos_groups()
52 c.groups = self.scm_model.get_repos_groups()
53 c.group = None
53 c.group = None
54
54
55 if c.visual.lightweight_dashboard is False:
55 if not c.visual.lightweight_dashboard:
56 c.repos_list = self.scm_model.get_repos()
56 c.repos_list = self.scm_model.get_repos()
57 ## lightweight version of dashboard
57 ## lightweight version of dashboard
58 else:
58 else:
@@ -81,7 +81,7 b' class HomeController(BaseController):'
81 def branch_tag_switcher(self, repo_name):
81 def branch_tag_switcher(self, repo_name):
82 if request.is_xhr:
82 if request.is_xhr:
83 c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
83 c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
84 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
84 if c.rhodecode_db_repo:
85 return render('/switch_to_list.html')
85 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
86 else:
86 return render('/switch_to_list.html')
87 raise HTTPBadRequest()
87 raise HTTPBadRequest()
@@ -207,7 +207,7 b' class JournalController(BaseController):'
207 #filter
207 #filter
208 try:
208 try:
209 journal = _journal_filter(journal, c.search_term)
209 journal = _journal_filter(journal, c.search_term)
210 except:
210 except Exception:
211 # we want this to crash for now
211 # we want this to crash for now
212 raise
212 raise
213 journal = journal.filter(filtering_criterion)\
213 journal = journal.filter(filtering_criterion)\
@@ -231,7 +231,7 b' class JournalController(BaseController):'
231 self.rhodecode_user.user_id)
231 self.rhodecode_user.user_id)
232 Session.commit()
232 Session.commit()
233 return 'ok'
233 return 'ok'
234 except:
234 except Exception:
235 raise HTTPBadRequest()
235 raise HTTPBadRequest()
236
236
237 repo_id = request.POST.get('follows_repo_id')
237 repo_id = request.POST.get('follows_repo_id')
@@ -241,7 +241,7 b' class JournalController(BaseController):'
241 self.rhodecode_user.user_id)
241 self.rhodecode_user.user_id)
242 Session.commit()
242 Session.commit()
243 return 'ok'
243 return 'ok'
244 except:
244 except Exception:
245 raise HTTPBadRequest()
245 raise HTTPBadRequest()
246
246
247 log.debug('token mismatch %s vs %s' % (cur_token, token))
247 log.debug('token mismatch %s vs %s' % (cur_token, token))
@@ -76,7 +76,7 b' class LoginController(BaseController):'
76 Session().commit()
76 Session().commit()
77
77
78 # If they want to be remembered, update the cookie
78 # If they want to be remembered, update the cookie
79 if c.form_result['remember'] is not False:
79 if c.form_result['remember']:
80 _year = (datetime.datetime.now() +
80 _year = (datetime.datetime.now() +
81 datetime.timedelta(seconds=60 * 60 * 24 * 365))
81 datetime.timedelta(seconds=60 * 60 * 24 * 365))
82 session._set_cookie_expires(_year)
82 session._set_cookie_expires(_year)
@@ -38,6 +38,7 b' from rhodecode.lib.compat import json'
38 from rhodecode.lib.base import BaseRepoController, render
38 from rhodecode.lib.base import BaseRepoController, render
39 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
39 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
40 NotAnonymous
40 NotAnonymous
41 from rhodecode.lib.helpers import Page
41 from rhodecode.lib import helpers as h
42 from rhodecode.lib import helpers as h
42 from rhodecode.lib import diffs
43 from rhodecode.lib import diffs
43 from rhodecode.lib.utils import action_logger, jsonify
44 from rhodecode.lib.utils import action_logger, jsonify
@@ -52,6 +53,8 b' from rhodecode.model.repo import RepoMod'
52 from rhodecode.model.comment import ChangesetCommentsModel
53 from rhodecode.model.comment import ChangesetCommentsModel
53 from rhodecode.model.changeset_status import ChangesetStatusModel
54 from rhodecode.model.changeset_status import ChangesetStatusModel
54 from rhodecode.model.forms import PullRequestForm
55 from rhodecode.model.forms import PullRequestForm
56 from mercurial import scmutil
57 from rhodecode.lib.utils2 import safe_int
55
58
56 log = logging.getLogger(__name__)
59 log = logging.getLogger(__name__)
57
60
@@ -67,34 +70,68 b' class PullrequestsController(BaseRepoCon'
67 c.users_array = repo_model.get_users_js()
70 c.users_array = repo_model.get_users_js()
68 c.users_groups_array = repo_model.get_users_groups_js()
71 c.users_groups_array = repo_model.get_users_groups_js()
69
72
70 def _get_repo_refs(self, repo):
73 def _get_repo_refs(self, repo, rev=None, branch_rev=None):
71 hist_l = []
74 """return a structure with repo's interesting changesets, suitable for
75 the selectors in pullrequest.html"""
72
76
73 branches_group = ([('branch:%s:%s' % (k, v), k) for
77 # list named branches that has been merged to this named branch - it should probably merge back
74 k, v in repo.branches.iteritems()], _("Branches"))
78 peers = []
75 bookmarks_group = ([('book:%s:%s' % (k, v), k) for
79 if branch_rev:
76 k, v in repo.bookmarks.iteritems()], _("Bookmarks"))
80 # not restricting to merge() would also get branch point and be better
77 tags_group = ([('tag:%s:%s' % (k, v), k) for
81 # (especially because it would get the branch point) ... but is currently too expensive
78 k, v in repo.tags.iteritems()], _("Tags"))
82 revs = ["sort(parents(branch(id('%s')) and merge()) - branch(id('%s')))" %
79
83 (branch_rev, branch_rev)]
80 hist_l.append(bookmarks_group)
84 otherbranches = {}
81 hist_l.append(branches_group)
85 for i in scmutil.revrange(repo._repo, revs):
82 hist_l.append(tags_group)
86 cs = repo.get_changeset(i)
87 otherbranches[cs.branch] = cs.raw_id
88 for branch, node in otherbranches.iteritems():
89 selected = 'branch:%s:%s' % (branch, node)
90 peers.append((selected, branch))
83
91
84 return hist_l
92 selected = None
93 branches = []
94 for branch, branchrev in repo.branches.iteritems():
95 n = 'branch:%s:%s' % (branch, branchrev)
96 branches.append((n, branch))
97 if rev == branchrev:
98 selected = n
99 bookmarks = []
100 for bookmark, bookmarkrev in repo.bookmarks.iteritems():
101 n = 'book:%s:%s' % (bookmark, bookmarkrev)
102 bookmarks.append((n, bookmark))
103 if rev == bookmarkrev:
104 selected = n
105 tags = []
106 for tag, tagrev in repo.tags.iteritems():
107 n = 'tag:%s:%s' % (tag, tagrev)
108 tags.append((n, tag))
109 if rev == tagrev and tag != 'tip': # tip is not a real tag - and its branch is better
110 selected = n
85
111
86 def _get_default_rev(self, repo):
112 # prio 1: rev was selected as existing entry above
87 """
88 Get's default revision to do compare on pull request
89
113
90 :param repo:
114 # prio 2: create special entry for rev; rev _must_ be used
91 """
115 specials = []
92 repo = repo.scm_instance
116 if rev and selected is None:
93 if 'default' in repo.branches:
117 selected = 'rev:%s:%s' % (rev, rev)
94 return 'default'
118 specials = [(selected, '%s: %s' % (_("Changeset"), rev[:12]))]
95 else:
119
96 #if repo doesn't have default branch return first found
120 # prio 3: most recent peer branch
97 return repo.branches.keys()[0]
121 if peers and not selected:
122 selected = peers[0][0][0]
123
124 # prio 4: tip revision
125 if not selected:
126 selected = 'tag:tip:%s' % repo.tags['tip']
127
128 groups = [(specials, _("Special")),
129 (peers, _("Peer branches")),
130 (bookmarks, _("Bookmarks")),
131 (branches, _("Branches")),
132 (tags, _("Tags")),
133 ]
134 return [g for g in groups if g[0]], selected
98
135
99 def _get_is_allowed_change_status(self, pull_request):
136 def _get_is_allowed_change_status(self, pull_request):
100 owner = self.rhodecode_user.user_id == pull_request.user_id
137 owner = self.rhodecode_user.user_id == pull_request.user_id
@@ -105,6 +142,15 b' class PullrequestsController(BaseRepoCon'
105 def show_all(self, repo_name):
142 def show_all(self, repo_name):
106 c.pull_requests = PullRequestModel().get_all(repo_name)
143 c.pull_requests = PullRequestModel().get_all(repo_name)
107 c.repo_name = repo_name
144 c.repo_name = repo_name
145 p = safe_int(request.params.get('page', 1), 1)
146
147 c.pullrequests_pager = Page(c.pull_requests, page=p, items_per_page=10)
148
149 c.pullrequest_data = render('/pullrequests/pullrequest_data.html')
150
151 if request.environ.get('HTTP_X_PARTIAL_XHR'):
152 return c.pullrequest_data
153
108 return render('/pullrequests/pullrequest_show_all.html')
154 return render('/pullrequests/pullrequest_show_all.html')
109
155
110 @NotAnonymous()
156 @NotAnonymous()
@@ -122,59 +168,51 b' class PullrequestsController(BaseRepoCon'
122 category='warning')
168 category='warning')
123 redirect(url('summary_home', repo_name=org_repo.repo_name))
169 redirect(url('summary_home', repo_name=org_repo.repo_name))
124
170
171 org_rev = request.GET.get('rev_end')
172 # rev_start is not directly useful - its parent could however be used
173 # as default for other and thus give a simple compare view
174 #other_rev = request.POST.get('rev_start')
175
176 c.org_repos = []
177 c.org_repos.append((org_repo.repo_name, org_repo.repo_name))
178 c.default_org_repo = org_repo.repo_name
179 c.org_refs, c.default_org_ref = self._get_repo_refs(org_repo.scm_instance, org_rev)
180
181 c.other_repos = []
125 other_repos_info = {}
182 other_repos_info = {}
126
183
127 c.org_refs = self._get_repo_refs(c.rhodecode_repo)
184 def add_other_repo(repo, branch_rev=None):
128 c.org_repos = []
185 if repo.repo_name in other_repos_info: # shouldn't happen
129 c.other_repos = []
186 return
130 c.org_repos.append((org_repo.repo_name, '%s/%s' % (
187 c.other_repos.append((repo.repo_name, repo.repo_name))
131 org_repo.user.username, c.repo_name))
188 other_refs, selected_other_ref = self._get_repo_refs(repo.scm_instance, branch_rev=branch_rev)
132 )
189 other_repos_info[repo.repo_name] = {
133
190 'user': dict(user_id=repo.user.user_id,
134 # add org repo to other so we can open pull request agains itself
191 username=repo.user.username,
135 c.other_repos.extend(c.org_repos)
192 firstname=repo.user.firstname,
136
193 lastname=repo.user.lastname,
137 c.default_pull_request = org_repo.repo_name # repo name pre-selected
194 gravatar_link=h.gravatar_url(repo.user.email, 14)),
138 c.default_pull_request_rev = self._get_default_rev(org_repo) # revision pre-selected
195 'description': repo.description.split('\n', 1)[0],
139 c.default_revs = self._get_repo_refs(org_repo.scm_instance)
196 'revs': h.select('other_ref', selected_other_ref, other_refs, class_='refs')
140 #add orginal repo
141 other_repos_info[org_repo.repo_name] = {
142 'gravatar': h.gravatar_url(org_repo.user.email, 24),
143 'description': org_repo.description,
144 'revs': h.select('other_ref', '', c.default_revs, class_='refs')
145 }
146
147 #gather forks and add to this list
148 for fork in org_repo.forks:
149 c.other_repos.append((fork.repo_name, '%s/%s' % (
150 fork.user.username, fork.repo_name))
151 )
152 other_repos_info[fork.repo_name] = {
153 'gravatar': h.gravatar_url(fork.user.email, 24),
154 'description': fork.description,
155 'revs': h.select('other_ref', '',
156 self._get_repo_refs(fork.scm_instance),
157 class_='refs')
158 }
159 #add parents of this fork also, but only if it's not empty
160 if org_repo.parent and org_repo.parent.scm_instance.revisions:
161 c.default_pull_request = org_repo.parent.repo_name
162 c.default_pull_request_rev = self._get_default_rev(org_repo.parent)
163 c.default_revs = self._get_repo_refs(org_repo.parent.scm_instance)
164 c.other_repos.append((org_repo.parent.repo_name, '%s/%s' % (
165 org_repo.parent.user.username,
166 org_repo.parent.repo_name))
167 )
168 other_repos_info[org_repo.parent.repo_name] = {
169 'gravatar': h.gravatar_url(org_repo.parent.user.email, 24),
170 'description': org_repo.parent.description,
171 'revs': h.select('other_ref', '',
172 self._get_repo_refs(org_repo.parent.scm_instance),
173 class_='refs')
174 }
197 }
175
198
199 # add org repo to other so we can open pull request against peer branches on itself
200 add_other_repo(org_repo, branch_rev=org_rev)
201 c.default_other_repo = org_repo.repo_name
202
203 # gather forks and add to this list ... even though it is rare to
204 # request forks to pull from their parent
205 for fork in org_repo.forks:
206 add_other_repo(fork)
207
208 # add parents of this fork also, but only if it's not empty
209 if org_repo.parent and org_repo.parent.scm_instance.revisions:
210 add_other_repo(org_repo.parent)
211 c.default_other_repo = org_repo.parent.repo_name
212
213 c.default_other_repo_info = other_repos_info[c.default_other_repo]
176 c.other_repos_info = json.dumps(other_repos_info)
214 c.other_repos_info = json.dumps(other_repos_info)
177 c.review_members = [org_repo.user]
215
178 return render('/pullrequests/pullrequest.html')
216 return render('/pullrequests/pullrequest.html')
179
217
180 @NotAnonymous()
218 @NotAnonymous()
@@ -189,29 +227,18 b' class PullrequestsController(BaseRepoCon'
189 elif errors.error_dict.get('pullrequest_title'):
227 elif errors.error_dict.get('pullrequest_title'):
190 msg = _('Pull request requires a title with min. 3 chars')
228 msg = _('Pull request requires a title with min. 3 chars')
191 else:
229 else:
192 msg = _('error during creation of pull request')
230 msg = _('Error creating pull request')
193
231
194 h.flash(msg, 'error')
232 h.flash(msg, 'error')
195 return redirect(url('pullrequest_home', repo_name=repo_name))
233 return redirect(url('pullrequest_home', repo_name=repo_name))
196
234
197 org_repo = _form['org_repo']
235 org_repo = _form['org_repo']
198 org_ref = _form['org_ref']
236 org_ref = 'rev:merge:%s' % _form['merge_rev']
199 other_repo = _form['other_repo']
237 other_repo = _form['other_repo']
200 other_ref = _form['other_ref']
238 other_ref = 'rev:ancestor:%s' % _form['ancestor_rev']
201 revisions = _form['revisions']
239 revisions = _form['revisions']
202 reviewers = _form['review_members']
240 reviewers = _form['review_members']
203
241
204 # if we have cherry picked pull request we don't care what is in
205 # org_ref/other_ref
206 rev_start = request.POST.get('rev_start')
207 rev_end = request.POST.get('rev_end')
208
209 if rev_start and rev_end:
210 # this is swapped to simulate that rev_end is a revision from
211 # parent of the fork
212 org_ref = 'rev:%s:%s' % (rev_end, rev_end)
213 other_ref = 'rev:%s:%s' % (rev_start, rev_start)
214
215 title = _form['pullrequest_title']
242 title = _form['pullrequest_title']
216 description = _form['pullrequest_desc']
243 description = _form['pullrequest_desc']
217
244
@@ -269,9 +296,6 b' class PullrequestsController(BaseRepoCon'
269 :param pull_request:
296 :param pull_request:
270 :type pull_request:
297 :type pull_request:
271 """
298 """
272 rev_start = request.GET.get('rev_start')
273 rev_end = request.GET.get('rev_end')
274
275 org_repo = pull_request.org_repo
299 org_repo = pull_request.org_repo
276 (org_ref_type,
300 (org_ref_type,
277 org_ref_name,
301 org_ref_name,
@@ -283,7 +307,7 b' class PullrequestsController(BaseRepoCon'
283 other_ref_rev) = pull_request.other_ref.split(':')
307 other_ref_rev) = pull_request.other_ref.split(':')
284
308
285 # despite opening revisions for bookmarks/branches/tags, we always
309 # despite opening revisions for bookmarks/branches/tags, we always
286 # convert this to rev to prevent changes after book or branch change
310 # convert this to rev to prevent changes after bookmark or branch change
287 org_ref = ('rev', org_ref_rev)
311 org_ref = ('rev', org_ref_rev)
288 other_ref = ('rev', other_ref_rev)
312 other_ref = ('rev', other_ref_rev)
289
313
@@ -294,17 +318,12 b' class PullrequestsController(BaseRepoCon'
294
318
295 c.cs_ranges = [org_repo.get_changeset(x) for x in pull_request.revisions]
319 c.cs_ranges = [org_repo.get_changeset(x) for x in pull_request.revisions]
296
320
297 other_ref = ('rev', getattr(c.cs_ranges[0].parents[0]
298 if c.cs_ranges[0].parents
299 else EmptyChangeset(), 'raw_id'))
300
301 c.statuses = org_repo.statuses([x.raw_id for x in c.cs_ranges])
321 c.statuses = org_repo.statuses([x.raw_id for x in c.cs_ranges])
302 c.target_repo = other_repo.repo_name
303 # defines that we need hidden inputs with changesets
304 c.as_form = request.GET.get('as_form', False)
305
322
306 c.org_ref = org_ref[1]
323 c.org_ref = org_ref[1]
324 c.org_ref_type = org_ref[0]
307 c.other_ref = other_ref[1]
325 c.other_ref = other_ref[1]
326 c.other_ref_type = other_ref[0]
308
327
309 diff_limit = self.cut_off_limit if not fulldiff else None
328 diff_limit = self.cut_off_limit if not fulldiff else None
310
329
@@ -386,7 +405,7 b' class PullrequestsController(BaseRepoCon'
386
405
387 try:
406 try:
388 cur_status = c.statuses[c.pull_request.revisions[0]][0]
407 cur_status = c.statuses[c.pull_request.revisions[0]][0]
389 except:
408 except Exception:
390 log.error(traceback.format_exc())
409 log.error(traceback.format_exc())
391 cur_status = 'undefined'
410 cur_status = 'undefined'
392 if c.pull_request.is_closed() and 0:
411 if c.pull_request.is_closed() and 0:
@@ -398,6 +417,8 b' class PullrequestsController(BaseRepoCon'
398 )
417 )
399 c.changeset_statuses = ChangesetStatus.STATUSES
418 c.changeset_statuses = ChangesetStatus.STATUSES
400
419
420 c.as_form = False
421 c.ancestor = None # there is one - but right here we don't know which
401 return render('/pullrequests/pullrequest_show.html')
422 return render('/pullrequests/pullrequest_show.html')
402
423
403 @NotAnonymous()
424 @NotAnonymous()
@@ -410,11 +431,15 b' class PullrequestsController(BaseRepoCon'
410 status = request.POST.get('changeset_status')
431 status = request.POST.get('changeset_status')
411 change_status = request.POST.get('change_changeset_status')
432 change_status = request.POST.get('change_changeset_status')
412 text = request.POST.get('text')
433 text = request.POST.get('text')
434 close_pr = request.POST.get('save_close')
413
435
414 allowed_to_change_status = self._get_is_allowed_change_status(pull_request)
436 allowed_to_change_status = self._get_is_allowed_change_status(pull_request)
415 if status and change_status and allowed_to_change_status:
437 if status and change_status and allowed_to_change_status:
416 text = text or (_('Status change -> %s')
438 _def = (_('Status change -> %s')
417 % ChangesetStatus.get_status_lbl(status))
439 % ChangesetStatus.get_status_lbl(status))
440 if close_pr:
441 _def = _('Closing with') + ' ' + _def
442 text = text or _def
418 comm = ChangesetCommentsModel().create(
443 comm = ChangesetCommentsModel().create(
419 text=text,
444 text=text,
420 repo=c.rhodecode_db_repo.repo_id,
445 repo=c.rhodecode_db_repo.repo_id,
@@ -423,7 +448,9 b' class PullrequestsController(BaseRepoCon'
423 f_path=request.POST.get('f_path'),
448 f_path=request.POST.get('f_path'),
424 line_no=request.POST.get('line'),
449 line_no=request.POST.get('line'),
425 status_change=(ChangesetStatus.get_status_lbl(status)
450 status_change=(ChangesetStatus.get_status_lbl(status)
426 if status and change_status and allowed_to_change_status else None)
451 if status and change_status
452 and allowed_to_change_status else None),
453 closing_pr=close_pr
427 )
454 )
428
455
429 action_logger(self.rhodecode_user,
456 action_logger(self.rhodecode_user,
@@ -441,7 +468,7 b' class PullrequestsController(BaseRepoCon'
441 pull_request=pull_request_id
468 pull_request=pull_request_id
442 )
469 )
443
470
444 if request.POST.get('save_close'):
471 if close_pr:
445 if status in ['rejected', 'approved']:
472 if status in ['rejected', 'approved']:
446 PullRequestModel().close_pull_request(pull_request_id)
473 PullRequestModel().close_pull_request(pull_request_id)
447 action_logger(self.rhodecode_user,
474 action_logger(self.rhodecode_user,
@@ -29,7 +29,7 b' from pylons.i18n.translation import _'
29 from pylons import request, config, tmpl_context as c
29 from pylons import request, config, tmpl_context as c
30
30
31 from rhodecode.lib.auth import LoginRequired
31 from rhodecode.lib.auth import LoginRequired
32 from rhodecode.lib.base import BaseController, render
32 from rhodecode.lib.base import BaseRepoController, render
33 from rhodecode.lib.indexers import CHGSETS_SCHEMA, SCHEMA, CHGSET_IDX_NAME, \
33 from rhodecode.lib.indexers import CHGSETS_SCHEMA, SCHEMA, CHGSET_IDX_NAME, \
34 IDX_NAME, WhooshResultWrapper
34 IDX_NAME, WhooshResultWrapper
35
35
@@ -46,14 +46,14 b' from rhodecode.lib.utils2 import safe_st'
46 log = logging.getLogger(__name__)
46 log = logging.getLogger(__name__)
47
47
48
48
49 class SearchController(BaseController):
49 class SearchController(BaseRepoController):
50
50
51 @LoginRequired()
51 @LoginRequired()
52 def __before__(self):
52 def __before__(self):
53 super(SearchController, self).__before__()
53 super(SearchController, self).__before__()
54
54
55 def index(self, search_repo=None):
55 def index(self, repo_name=None):
56 c.repo_name = search_repo
56 c.repo_name = repo_name
57 c.formated_results = []
57 c.formated_results = []
58 c.runtime = ''
58 c.runtime = ''
59 c.cur_query = request.GET.get('q', None)
59 c.cur_query = request.GET.get('q', None)
@@ -30,20 +30,23 b' import urllib'
30 from time import mktime
30 from time import mktime
31 from datetime import timedelta, date
31 from datetime import timedelta, date
32 from urlparse import urlparse
32 from urlparse import urlparse
33 from rhodecode.lib.compat import product
34
35 from rhodecode.lib.vcs.exceptions import ChangesetError, EmptyRepositoryError, \
36 NodeDoesNotExistError
37
33
38 from pylons import tmpl_context as c, request, url, config
34 from pylons import tmpl_context as c, request, url, config
39 from pylons.i18n.translation import _
35 from pylons.i18n.translation import _
36 from webob.exc import HTTPBadRequest
40
37
41 from beaker.cache import cache_region, region_invalidate
38 from beaker.cache import cache_region, region_invalidate
42
39
40 from rhodecode.lib import helpers as h
41 from rhodecode.lib.compat import product
42 from rhodecode.lib.vcs.exceptions import ChangesetError, EmptyRepositoryError, \
43 NodeDoesNotExistError
43 from rhodecode.config.conf import ALL_READMES, ALL_EXTS, LANGUAGES_EXTENSIONS_MAP
44 from rhodecode.config.conf import ALL_READMES, ALL_EXTS, LANGUAGES_EXTENSIONS_MAP
44 from rhodecode.model.db import Statistics, CacheInvalidation
45 from rhodecode.model.db import Statistics, CacheInvalidation
45 from rhodecode.lib.utils2 import safe_unicode
46 from rhodecode.lib.utils import jsonify
46 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
47 from rhodecode.lib.utils2 import safe_unicode, safe_str
48 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
49 NotAnonymous
47 from rhodecode.lib.base import BaseRepoController, render
50 from rhodecode.lib.base import BaseRepoController, render
48 from rhodecode.lib.vcs.backends.base import EmptyChangeset
51 from rhodecode.lib.vcs.backends.base import EmptyChangeset
49 from rhodecode.lib.markup_renderer import MarkupRenderer
52 from rhodecode.lib.markup_renderer import MarkupRenderer
@@ -70,8 +73,6 b' class SummaryController(BaseRepoControll'
70
73
71 def index(self, repo_name):
74 def index(self, repo_name):
72 c.dbrepo = dbrepo = c.rhodecode_db_repo
75 c.dbrepo = dbrepo = c.rhodecode_db_repo
73 c.following = self.scm_model.is_following_repo(repo_name,
74 self.rhodecode_user.user_id)
75
76
76 def url_generator(**kw):
77 def url_generator(**kw):
77 return url('shortlog_home', repo_name=repo_name, size=10, **kw)
78 return url('shortlog_home', repo_name=repo_name, size=10, **kw)
@@ -101,10 +102,10 b' class SummaryController(BaseRepoControll'
101 'pass': password,
102 'pass': password,
102 'scheme': parsed_url.scheme,
103 'scheme': parsed_url.scheme,
103 'netloc': parsed_url.netloc,
104 'netloc': parsed_url.netloc,
104 'path': decoded_path
105 'path': urllib.quote(safe_str(decoded_path))
105 }
106 }
106
107
107 uri = uri_tmpl % uri_dict
108 uri = (uri_tmpl % uri_dict)
108 # generate another clone url by id
109 # generate another clone url by id
109 uri_dict.update(
110 uri_dict.update(
110 {'path': decoded_path.replace(repo_name, '_%s' % c.dbrepo.repo_id)}
111 {'path': decoded_path.replace(repo_name, '_%s' % c.dbrepo.repo_id)}
@@ -138,7 +139,9 b' class SummaryController(BaseRepoControll'
138 if dbrepo.enable_statistics:
139 if dbrepo.enable_statistics:
139 c.show_stats = True
140 c.show_stats = True
140 c.no_data_msg = _('No data loaded yet')
141 c.no_data_msg = _('No data loaded yet')
141 run_task(get_commits_stats, c.dbrepo.repo_name, ts_min_y, ts_max_y)
142 recurse_limit = 500 # don't recurse more than 500 times when parsing
143 run_task(get_commits_stats, c.dbrepo.repo_name, ts_min_y,
144 ts_max_y, recurse_limit)
142 else:
145 else:
143 c.show_stats = False
146 c.show_stats = False
144 c.no_data_msg = _('Statistics are disabled for this repository')
147 c.no_data_msg = _('Statistics are disabled for this repository')
@@ -186,6 +189,14 b' class SummaryController(BaseRepoControll'
186 self.__get_readme_data(c.rhodecode_db_repo)
189 self.__get_readme_data(c.rhodecode_db_repo)
187 return render('summary/summary.html')
190 return render('summary/summary.html')
188
191
192 @NotAnonymous()
193 @jsonify
194 def repo_size(self, repo_name):
195 if request.is_xhr:
196 return c.rhodecode_db_repo._repo_size()
197 else:
198 raise HTTPBadRequest()
199
189 def __get_readme_data(self, db_repo):
200 def __get_readme_data(self, db_repo):
190 repo_name = db_repo.repo_name
201 repo_name = db_repo.repo_name
191
202
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
This diff has been collapsed as it changes many lines, (4015 lines changed) Show them Hide them
@@ -7,7 +7,7 b' msgid ""'
7 msgstr ""
7 msgstr ""
8 "Project-Id-Version: rhodecode 0.1\n"
8 "Project-Id-Version: rhodecode 0.1\n"
9 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
9 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10 "POT-Creation-Date: 2012-12-14 04:19+0100\n"
10 "POT-Creation-Date: 2013-04-05 10:19-0700\n"
11 "PO-Revision-Date: 2011-02-25 19:13+0100\n"
11 "PO-Revision-Date: 2011-02-25 19:13+0100\n"
12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Language-Team: en <LL@li.org>\n"
13 "Language-Team: en <LL@li.org>\n"
@@ -22,11 +22,11 b' msgid "All Branches"'
22 msgstr ""
22 msgstr ""
23
23
24 #: rhodecode/controllers/changeset.py:83
24 #: rhodecode/controllers/changeset.py:83
25 msgid "show white space"
25 msgid "Show white space"
26 msgstr ""
26 msgstr ""
27
27
28 #: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
28 #: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
29 msgid "ignore white space"
29 msgid "Ignore white space"
30 msgstr ""
30 msgstr ""
31
31
32 #: rhodecode/controllers/changeset.py:163
32 #: rhodecode/controllers/changeset.py:163
@@ -34,20 +34,20 b' msgstr ""'
34 msgid "%s line context"
34 msgid "%s line context"
35 msgstr ""
35 msgstr ""
36
36
37 #: rhodecode/controllers/changeset.py:314
37 #: rhodecode/controllers/changeset.py:329
38 #: rhodecode/controllers/pullrequests.py:417
38 #: rhodecode/controllers/pullrequests.py:438
39 #, python-format
39 #, python-format
40 msgid "Status change -> %s"
40 msgid "Status change -> %s"
41 msgstr ""
41 msgstr ""
42
42
43 #: rhodecode/controllers/changeset.py:345
43 #: rhodecode/controllers/changeset.py:360
44 msgid ""
44 msgid ""
45 "Changing status on a changeset associated witha closed pull request is "
45 "Changing status on a changeset associated with a closed pull request is "
46 "not allowed"
46 "not allowed"
47 msgstr ""
47 msgstr ""
48
48
49 #: rhodecode/controllers/compare.py:75
49 #: rhodecode/controllers/compare.py:74
50 #: rhodecode/controllers/pullrequests.py:121
50 #: rhodecode/controllers/pullrequests.py:167
51 #: rhodecode/controllers/shortlog.py:100
51 #: rhodecode/controllers/shortlog.py:100
52 msgid "There are no changesets yet"
52 msgid "There are no changesets yet"
53 msgstr ""
53 msgstr ""
@@ -89,156 +89,187 b' msgid "%s %s feed"'
89 msgstr ""
89 msgstr ""
90
90
91 #: rhodecode/controllers/feed.py:86
91 #: rhodecode/controllers/feed.py:86
92 #: rhodecode/templates/changeset/changeset.html:137
92 #: rhodecode/templates/changeset/changeset.html:134
93 #: rhodecode/templates/changeset/changeset.html:149
93 #: rhodecode/templates/changeset/changeset.html:146
94 #: rhodecode/templates/compare/compare_diff.html:62
94 #: rhodecode/templates/compare/compare_diff.html:58
95 #: rhodecode/templates/compare/compare_diff.html:73
95 #: rhodecode/templates/compare/compare_diff.html:69
96 #: rhodecode/templates/pullrequests/pullrequest_show.html:94
96 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
97 #: rhodecode/templates/pullrequests/pullrequest_show.html:153
97 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
98 msgid "Changeset was too big and was cut off..."
98 msgid "Changeset was too big and was cut off..."
99 msgstr ""
99 msgstr ""
100
100
101 #: rhodecode/controllers/feed.py:92
101 #: rhodecode/controllers/feed.py:91
102 msgid "commited on"
102 #, python-format
103 msgstr ""
103 msgid "%s committed on %s"
104
104 msgstr ""
105 #: rhodecode/controllers/files.py:86
105
106 msgid "click here to add new file"
106 #: rhodecode/controllers/files.py:88
107 msgstr ""
107 msgid "Click here to add new file"
108
108 msgstr ""
109 #: rhodecode/controllers/files.py:87
109
110 #: rhodecode/controllers/files.py:89
110 #, python-format
111 #, python-format
111 msgid "There are no files yet %s"
112 msgid "There are no files yet %s"
112 msgstr ""
113 msgstr ""
113
114
114 #: rhodecode/controllers/files.py:265 rhodecode/controllers/files.py:325
115 #: rhodecode/controllers/files.py:267 rhodecode/controllers/files.py:335
115 #, python-format
116 #, python-format
116 msgid "This repository is has been locked by %s on %s"
117 msgid "This repository is has been locked by %s on %s"
117 msgstr ""
118 msgstr ""
118
119
119 #: rhodecode/controllers/files.py:292
120 #: rhodecode/controllers/files.py:279
121 msgid "You can only edit files with revision being a valid branch "
122 msgstr ""
123
124 #: rhodecode/controllers/files.py:293
120 #, python-format
125 #, python-format
121 msgid "Edited %s via RhodeCode"
126 msgid "Edited file %s via RhodeCode"
122 msgstr ""
127 msgstr ""
123
128
124 #: rhodecode/controllers/files.py:297
129 #: rhodecode/controllers/files.py:309
125 msgid "No changes"
130 msgid "No changes"
126 msgstr ""
131 msgstr ""
127
132
128 #: rhodecode/controllers/files.py:308 rhodecode/controllers/files.py:372
133 #: rhodecode/controllers/files.py:318 rhodecode/controllers/files.py:388
129 #, python-format
134 #, python-format
130 msgid "Successfully committed to %s"
135 msgid "Successfully committed to %s"
131 msgstr ""
136 msgstr ""
132
137
133 #: rhodecode/controllers/files.py:313 rhodecode/controllers/files.py:378
138 #: rhodecode/controllers/files.py:323 rhodecode/controllers/files.py:394
134 msgid "Error occurred during commit"
139 msgid "Error occurred during commit"
135 msgstr ""
140 msgstr ""
136
141
137 #: rhodecode/controllers/files.py:344
142 #: rhodecode/controllers/files.py:347
138 #, python-format
143 msgid "Added file via RhodeCode"
139 msgid "Added %s via RhodeCode"
144 msgstr ""
140 msgstr ""
145
141
146 #: rhodecode/controllers/files.py:364
142 #: rhodecode/controllers/files.py:358
143 msgid "No content"
147 msgid "No content"
144 msgstr ""
148 msgstr ""
145
149
146 #: rhodecode/controllers/files.py:362
150 #: rhodecode/controllers/files.py:368
147 msgid "No filename"
151 msgid "No filename"
148 msgstr ""
152 msgstr ""
149
153
150 #: rhodecode/controllers/files.py:404
154 #: rhodecode/controllers/files.py:372
151 msgid "downloads disabled"
155 msgid "Location must be relative path and must not contain .. in path"
152 msgstr ""
156 msgstr ""
153
157
154 #: rhodecode/controllers/files.py:415
158 #: rhodecode/controllers/files.py:420
159 msgid "Downloads disabled"
160 msgstr ""
161
162 #: rhodecode/controllers/files.py:431
155 #, python-format
163 #, python-format
156 msgid "Unknown revision %s"
164 msgid "Unknown revision %s"
157 msgstr ""
165 msgstr ""
158
166
159 #: rhodecode/controllers/files.py:417
167 #: rhodecode/controllers/files.py:433
160 msgid "Empty repository"
168 msgid "Empty repository"
161 msgstr ""
169 msgstr ""
162
170
163 #: rhodecode/controllers/files.py:419
171 #: rhodecode/controllers/files.py:435
164 msgid "Unknown archive type"
172 msgid "Unknown archive type"
165 msgstr ""
173 msgstr ""
166
174
167 #: rhodecode/controllers/files.py:564
175 #: rhodecode/controllers/files.py:617
168 #: rhodecode/templates/changeset/changeset_range.html:13
176 #: rhodecode/templates/changeset/changeset_range.html:9
169 #: rhodecode/templates/changeset/changeset_range.html:31
170 msgid "Changesets"
177 msgid "Changesets"
171 msgstr ""
178 msgstr ""
172
179
173 #: rhodecode/controllers/files.py:565 rhodecode/controllers/pullrequests.py:74
180 #: rhodecode/controllers/files.py:618 rhodecode/controllers/pullrequests.py:131
174 #: rhodecode/controllers/summary.py:236 rhodecode/model/scm.py:550
181 #: rhodecode/controllers/summary.py:247 rhodecode/model/scm.py:606
182 #: rhodecode/templates/switch_to_list.html:3
183 #: rhodecode/templates/branches/branches.html:10
175 msgid "Branches"
184 msgid "Branches"
176 msgstr ""
185 msgstr ""
177
186
178 #: rhodecode/controllers/files.py:566 rhodecode/controllers/pullrequests.py:78
187 #: rhodecode/controllers/files.py:619 rhodecode/controllers/pullrequests.py:132
179 #: rhodecode/controllers/summary.py:237 rhodecode/model/scm.py:561
188 #: rhodecode/controllers/summary.py:248 rhodecode/model/scm.py:617
189 #: rhodecode/templates/switch_to_list.html:15
190 #: rhodecode/templates/shortlog/shortlog_data.html:10
191 #: rhodecode/templates/tags/tags.html:10
180 msgid "Tags"
192 msgid "Tags"
181 msgstr ""
193 msgstr ""
182
194
183 #: rhodecode/controllers/forks.py:158
195 #: rhodecode/controllers/forks.py:175
184 #, python-format
196 #, python-format
185 msgid "forked %s repository as %s"
197 msgid "Forked repository %s as %s"
186 msgstr ""
198 msgstr ""
187
199
188 #: rhodecode/controllers/forks.py:172
200 #: rhodecode/controllers/forks.py:189
189 #, python-format
201 #, python-format
190 msgid "An error occurred during repository forking %s"
202 msgid "An error occurred during repository forking %s"
191 msgstr ""
203 msgstr ""
192
204
193 #: rhodecode/controllers/journal.py:218 rhodecode/controllers/journal.py:261
205 #: rhodecode/controllers/journal.py:275 rhodecode/controllers/journal.py:318
194 msgid "public journal"
206 msgid "public journal"
195 msgstr ""
207 msgstr ""
196
208
197 #: rhodecode/controllers/journal.py:222 rhodecode/controllers/journal.py:265
209 #: rhodecode/controllers/journal.py:279 rhodecode/controllers/journal.py:322
198 #: rhodecode/templates/base/base.html:232
199 #: rhodecode/templates/journal/journal.html:12
210 #: rhodecode/templates/journal/journal.html:12
200 msgid "journal"
211 msgid "journal"
201 msgstr ""
212 msgstr ""
202
213
203 #: rhodecode/controllers/login.py:143
214 #: rhodecode/controllers/login.py:138
204 msgid "You have successfully registered into rhodecode"
215 msgid "You have successfully registered into RhodeCode"
205 msgstr ""
216 msgstr ""
206
217
207 #: rhodecode/controllers/login.py:164
218 #: rhodecode/controllers/login.py:159
208 msgid "Your password reset link was sent"
219 msgid "Your password reset link was sent"
209 msgstr ""
220 msgstr ""
210
221
211 #: rhodecode/controllers/login.py:184
222 #: rhodecode/controllers/login.py:179
212 msgid ""
223 msgid ""
213 "Your password reset was successful, new password has been sent to your "
224 "Your password reset was successful, new password has been sent to your "
214 "email"
225 "email"
215 msgstr ""
226 msgstr ""
216
227
217 #: rhodecode/controllers/pullrequests.py:76 rhodecode/model/scm.py:556
228 #: rhodecode/controllers/pullrequests.py:118
229 #: rhodecode/templates/changeset/changeset.html:10
230 #: rhodecode/templates/email_templates/changeset_comment.html:15
231 msgid "Changeset"
232 msgstr ""
233
234 #: rhodecode/controllers/pullrequests.py:128
235 msgid "Special"
236 msgstr ""
237
238 #: rhodecode/controllers/pullrequests.py:129
239 msgid "Peer branches"
240 msgstr ""
241
242 #: rhodecode/controllers/pullrequests.py:130 rhodecode/model/scm.py:612
243 #: rhodecode/templates/switch_to_list.html:28
244 #: rhodecode/templates/bookmarks/bookmarks.html:10
218 msgid "Bookmarks"
245 msgid "Bookmarks"
219 msgstr ""
246 msgstr ""
220
247
221 #: rhodecode/controllers/pullrequests.py:190
248 #: rhodecode/controllers/pullrequests.py:228
222 msgid "Pull request requires a title with min. 3 chars"
249 msgid "Pull request requires a title with min. 3 chars"
223 msgstr ""
250 msgstr ""
224
251
225 #: rhodecode/controllers/pullrequests.py:192
252 #: rhodecode/controllers/pullrequests.py:230
226 msgid "error during creation of pull request"
253 msgid "Error creating pull request"
227 msgstr ""
254 msgstr ""
228
255
229 #: rhodecode/controllers/pullrequests.py:224
256 #: rhodecode/controllers/pullrequests.py:251
230 msgid "Successfully opened new pull request"
257 msgid "Successfully opened new pull request"
231 msgstr ""
258 msgstr ""
232
259
233 #: rhodecode/controllers/pullrequests.py:227
260 #: rhodecode/controllers/pullrequests.py:254
234 msgid "Error occurred during sending pull request"
261 msgid "Error occurred during sending pull request"
235 msgstr ""
262 msgstr ""
236
263
237 #: rhodecode/controllers/pullrequests.py:260
264 #: rhodecode/controllers/pullrequests.py:287
238 msgid "Successfully deleted pull request"
265 msgid "Successfully deleted pull request"
239 msgstr ""
266 msgstr ""
240
267
241 #: rhodecode/controllers/pullrequests.py:452
268 #: rhodecode/controllers/pullrequests.py:441
269 msgid "Closing with"
270 msgstr ""
271
272 #: rhodecode/controllers/pullrequests.py:478
242 msgid "Closing pull request on other statuses than rejected or approved forbidden"
273 msgid "Closing pull request on other statuses than rejected or approved forbidden"
243 msgstr ""
274 msgstr ""
244
275
@@ -254,55 +285,12 b' msgstr ""'
254 msgid "An error occurred during this search operation"
285 msgid "An error occurred during this search operation"
255 msgstr ""
286 msgstr ""
256
287
257 #: rhodecode/controllers/settings.py:119
288 #: rhodecode/controllers/summary.py:141
258 #: rhodecode/controllers/admin/repos.py:272
259 #, python-format
260 msgid "Repository %s updated successfully"
261 msgstr ""
262
263 #: rhodecode/controllers/settings.py:137
264 #: rhodecode/controllers/admin/repos.py:290
265 #, python-format
266 msgid "error occurred during update of repository %s"
267 msgstr ""
268
269 #: rhodecode/controllers/settings.py:162
270 #: rhodecode/controllers/admin/repos.py:315
271 #, python-format
272 msgid "deleted repository %s"
273 msgstr ""
274
275 #: rhodecode/controllers/settings.py:166
276 #: rhodecode/controllers/admin/repos.py:325
277 #: rhodecode/controllers/admin/repos.py:331
278 #, python-format
279 msgid "An error occurred during deletion of %s"
280 msgstr ""
281
282 #: rhodecode/controllers/settings.py:185
283 msgid "unlocked"
284 msgstr ""
285
286 #: rhodecode/controllers/settings.py:188
287 msgid "locked"
288 msgstr ""
289
290 #: rhodecode/controllers/settings.py:190
291 #, python-format
292 msgid "Repository has been %s"
293 msgstr ""
294
295 #: rhodecode/controllers/settings.py:194
296 #: rhodecode/controllers/admin/repos.py:423
297 msgid "An error occurred during unlocking"
298 msgstr ""
299
300 #: rhodecode/controllers/summary.py:140
301 msgid "No data loaded yet"
289 msgid "No data loaded yet"
302 msgstr ""
290 msgstr ""
303
291
304 #: rhodecode/controllers/summary.py:144
292 #: rhodecode/controllers/summary.py:147
305 #: rhodecode/templates/summary/summary.html:157
293 #: rhodecode/templates/summary/summary.html:149
306 msgid "Statistics are disabled for this repository"
294 msgid "Statistics are disabled for this repository"
307 msgstr ""
295 msgstr ""
308
296
@@ -311,7 +299,7 b' msgid "Default settings updated successf'
311 msgstr ""
299 msgstr ""
312
300
313 #: rhodecode/controllers/admin/defaults.py:110
301 #: rhodecode/controllers/admin/defaults.py:110
314 msgid "error occurred during update of defaults"
302 msgid "Error occurred during update of defaults"
315 msgstr ""
303 msgstr ""
316
304
317 #: rhodecode/controllers/admin/ldap_settings.py:50
305 #: rhodecode/controllers/admin/ldap_settings.py:50
@@ -359,7 +347,7 b' msgid "START_TLS on LDAP connection"'
359 msgstr ""
347 msgstr ""
360
348
361 #: rhodecode/controllers/admin/ldap_settings.py:126
349 #: rhodecode/controllers/admin/ldap_settings.py:126
362 msgid "Ldap settings updated successfully"
350 msgid "LDAP settings updated successfully"
363 msgstr ""
351 msgstr ""
364
352
365 #: rhodecode/controllers/admin/ldap_settings.py:130
353 #: rhodecode/controllers/admin/ldap_settings.py:130
@@ -367,533 +355,616 b' msgid "Unable to activate ldap. The \\"py'
367 msgstr ""
355 msgstr ""
368
356
369 #: rhodecode/controllers/admin/ldap_settings.py:147
357 #: rhodecode/controllers/admin/ldap_settings.py:147
370 msgid "error occurred during update of ldap settings"
358 msgid "Error occurred during update of ldap settings"
371 msgstr ""
372
373 #: rhodecode/controllers/admin/permissions.py:59
374 #: rhodecode/controllers/admin/permissions.py:63
375 msgid "None"
376 msgstr ""
359 msgstr ""
377
360
378 #: rhodecode/controllers/admin/permissions.py:60
361 #: rhodecode/controllers/admin/permissions.py:60
379 #: rhodecode/controllers/admin/permissions.py:64
362 #: rhodecode/controllers/admin/permissions.py:64
380 msgid "Read"
363 msgid "None"
381 msgstr ""
364 msgstr ""
382
365
383 #: rhodecode/controllers/admin/permissions.py:61
366 #: rhodecode/controllers/admin/permissions.py:61
384 #: rhodecode/controllers/admin/permissions.py:65
367 #: rhodecode/controllers/admin/permissions.py:65
385 msgid "Write"
368 msgid "Read"
386 msgstr ""
369 msgstr ""
387
370
388 #: rhodecode/controllers/admin/permissions.py:62
371 #: rhodecode/controllers/admin/permissions.py:62
389 #: rhodecode/controllers/admin/permissions.py:66
372 #: rhodecode/controllers/admin/permissions.py:66
373 msgid "Write"
374 msgstr ""
375
376 #: rhodecode/controllers/admin/permissions.py:63
377 #: rhodecode/controllers/admin/permissions.py:67
390 #: rhodecode/templates/admin/defaults/defaults.html:9
378 #: rhodecode/templates/admin/defaults/defaults.html:9
391 #: rhodecode/templates/admin/ldap/ldap.html:9
379 #: rhodecode/templates/admin/ldap/ldap.html:9
392 #: rhodecode/templates/admin/permissions/permissions.html:9
380 #: rhodecode/templates/admin/permissions/permissions.html:9
393 #: rhodecode/templates/admin/repos/repo_add.html:9
381 #: rhodecode/templates/admin/repos/repo_add.html:10
394 #: rhodecode/templates/admin/repos/repo_edit.html:9
382 #: rhodecode/templates/admin/repos/repo_add.html:14
395 #: rhodecode/templates/admin/repos/repos.html:9
383 #: rhodecode/templates/admin/repos/repos.html:9
396 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:8
384 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:9
397 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:8
385 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:9
398 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
386 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:11
387 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:13
399 #: rhodecode/templates/admin/settings/hooks.html:9
388 #: rhodecode/templates/admin/settings/hooks.html:9
400 #: rhodecode/templates/admin/settings/settings.html:9
389 #: rhodecode/templates/admin/settings/settings.html:9
401 #: rhodecode/templates/admin/users/user_add.html:8
390 #: rhodecode/templates/admin/users/user_add.html:8
402 #: rhodecode/templates/admin/users/user_edit.html:9
391 #: rhodecode/templates/admin/users/user_edit.html:9
403 #: rhodecode/templates/admin/users/user_edit.html:126
392 #: rhodecode/templates/admin/users/user_edit.html:133
404 #: rhodecode/templates/admin/users/users.html:9
393 #: rhodecode/templates/admin/users/users.html:9
394 #: rhodecode/templates/admin/users/users.html:85
405 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
395 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
406 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
396 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
407 #: rhodecode/templates/admin/users_groups/users_groups.html:9
397 #: rhodecode/templates/admin/users_groups/users_groups.html:9
408 #: rhodecode/templates/base/base.html:197
398 #: rhodecode/templates/base/base.html:292
409 #: rhodecode/templates/base/base.html:350
399 #: rhodecode/templates/base/base.html:293
410 #: rhodecode/templates/base/base.html:352
400 #: rhodecode/templates/base/base.html:299
411 #: rhodecode/templates/base/base.html:354
401 #: rhodecode/templates/base/base.html:300
412 msgid "Admin"
402 msgid "Admin"
413 msgstr ""
403 msgstr ""
414
404
415 #: rhodecode/controllers/admin/permissions.py:69
405 #: rhodecode/controllers/admin/permissions.py:70
416 msgid "disabled"
417 msgstr ""
418
419 #: rhodecode/controllers/admin/permissions.py:71
420 msgid "allowed with manual account activation"
421 msgstr ""
422
423 #: rhodecode/controllers/admin/permissions.py:73
424 msgid "allowed with automatic account activation"
425 msgstr ""
426
427 #: rhodecode/controllers/admin/permissions.py:75
428 #: rhodecode/controllers/admin/permissions.py:78
429 msgid "Disabled"
430 msgstr ""
431
432 #: rhodecode/controllers/admin/permissions.py:76
406 #: rhodecode/controllers/admin/permissions.py:76
433 #: rhodecode/controllers/admin/permissions.py:79
407 #: rhodecode/controllers/admin/permissions.py:79
408 msgid "Disabled"
409 msgstr ""
410
411 #: rhodecode/controllers/admin/permissions.py:72
412 msgid "Allowed with manual account activation"
413 msgstr ""
414
415 #: rhodecode/controllers/admin/permissions.py:74
416 msgid "Allowed with automatic account activation"
417 msgstr ""
418
419 #: rhodecode/controllers/admin/permissions.py:77
420 #: rhodecode/controllers/admin/permissions.py:80
434 msgid "Enabled"
421 msgid "Enabled"
435 msgstr ""
422 msgstr ""
436
423
437 #: rhodecode/controllers/admin/permissions.py:122
424 #: rhodecode/controllers/admin/permissions.py:128
438 msgid "Default permissions updated successfully"
425 msgid "Default permissions updated successfully"
439 msgstr ""
426 msgstr ""
440
427
441 #: rhodecode/controllers/admin/permissions.py:136
428 #: rhodecode/controllers/admin/permissions.py:142
442 msgid "error occurred during update of permissions"
429 msgid "Error occurred during update of permissions"
443 msgstr ""
430 msgstr ""
444
431
445 #: rhodecode/controllers/admin/repos.py:121
432 #: rhodecode/controllers/admin/repos.py:127
446 msgid "--REMOVE FORK--"
433 msgid "--REMOVE FORK--"
447 msgstr ""
434 msgstr ""
448
435
449 #: rhodecode/controllers/admin/repos.py:190
436 #: rhodecode/controllers/admin/repos.py:168
437 #, python-format
438 msgid "Created repository %s from %s"
439 msgstr ""
440
441 #: rhodecode/controllers/admin/repos.py:174
450 #, python-format
442 #, python-format
451 msgid "created repository %s from %s"
443 msgid "Created repository %s"
452 msgstr ""
444 msgstr ""
453
445
454 #: rhodecode/controllers/admin/repos.py:194
446 #: rhodecode/controllers/admin/repos.py:197
447 #, python-format
448 msgid "Error creating repository %s"
449 msgstr ""
450
451 #: rhodecode/controllers/admin/repos.py:266
452 #, python-format
453 msgid "Repository %s updated successfully"
454 msgstr ""
455
456 #: rhodecode/controllers/admin/repos.py:284
455 #, python-format
457 #, python-format
456 msgid "created repository %s"
458 msgid "Error occurred during update of repository %s"
457 msgstr ""
459 msgstr ""
458
460
459 #: rhodecode/controllers/admin/repos.py:225
461 #: rhodecode/controllers/admin/repos.py:311
462 #: rhodecode/controllers/api/api.py:877
460 #, python-format
463 #, python-format
461 msgid "error occurred during creation of repository %s"
464 msgid "Detached %s forks"
462 msgstr ""
465 msgstr ""
463
466
464 #: rhodecode/controllers/admin/repos.py:320
467 #: rhodecode/controllers/admin/repos.py:314
468 #: rhodecode/controllers/api/api.py:879
469 #, python-format
470 msgid "Deleted %s forks"
471 msgstr ""
472
473 #: rhodecode/controllers/admin/repos.py:319
474 #, python-format
475 msgid "Deleted repository %s"
476 msgstr ""
477
478 #: rhodecode/controllers/admin/repos.py:322
465 #, python-format
479 #, python-format
466 msgid "Cannot delete %s it still contains attached forks"
480 msgid "Cannot delete %s it still contains attached forks"
467 msgstr ""
481 msgstr ""
468
482
469 #: rhodecode/controllers/admin/repos.py:349
483 #: rhodecode/controllers/admin/repos.py:327
484 #, python-format
485 msgid "An error occurred during deletion of %s"
486 msgstr ""
487
488 #: rhodecode/controllers/admin/repos.py:365
489 msgid "Repository permissions updated"
490 msgstr ""
491
492 #: rhodecode/controllers/admin/repos.py:384
470 msgid "An error occurred during deletion of repository user"
493 msgid "An error occurred during deletion of repository user"
471 msgstr ""
494 msgstr ""
472
495
473 #: rhodecode/controllers/admin/repos.py:368
474 msgid "An error occurred during deletion of repository users groups"
475 msgstr ""
476
477 #: rhodecode/controllers/admin/repos.py:386
478 msgid "An error occurred during deletion of repository stats"
479 msgstr ""
480
481 #: rhodecode/controllers/admin/repos.py:403
496 #: rhodecode/controllers/admin/repos.py:403
497 msgid "An error occurred during deletion of repository user groups"
498 msgstr ""
499
500 #: rhodecode/controllers/admin/repos.py:421
501 msgid "An error occurred during deletion of repository stats"
502 msgstr ""
503
504 #: rhodecode/controllers/admin/repos.py:438
482 msgid "An error occurred during cache invalidation"
505 msgid "An error occurred during cache invalidation"
483 msgstr ""
506 msgstr ""
484
507
485 #: rhodecode/controllers/admin/repos.py:443
508 #: rhodecode/controllers/admin/repos.py:458
509 #: rhodecode/controllers/admin/repos.py:485
510 msgid "An error occurred during unlocking"
511 msgstr ""
512
513 #: rhodecode/controllers/admin/repos.py:476
514 msgid "Unlocked"
515 msgstr ""
516
517 #: rhodecode/controllers/admin/repos.py:479
518 msgid "Locked"
519 msgstr ""
520
521 #: rhodecode/controllers/admin/repos.py:481
522 #, python-format
523 msgid "Repository has been %s"
524 msgstr ""
525
526 #: rhodecode/controllers/admin/repos.py:505
486 msgid "Updated repository visibility in public journal"
527 msgid "Updated repository visibility in public journal"
487 msgstr ""
528 msgstr ""
488
529
489 #: rhodecode/controllers/admin/repos.py:447
530 #: rhodecode/controllers/admin/repos.py:509
490 msgid "An error occurred during setting this repository in public journal"
531 msgid "An error occurred during setting this repository in public journal"
491 msgstr ""
532 msgstr ""
492
533
493 #: rhodecode/controllers/admin/repos.py:452 rhodecode/model/validators.py:300
534 #: rhodecode/controllers/admin/repos.py:514 rhodecode/model/validators.py:302
494 msgid "Token mismatch"
535 msgid "Token mismatch"
495 msgstr ""
536 msgstr ""
496
537
497 #: rhodecode/controllers/admin/repos.py:465
538 #: rhodecode/controllers/admin/repos.py:527
498 msgid "Pulled from remote location"
539 msgid "Pulled from remote location"
499 msgstr ""
540 msgstr ""
500
541
501 #: rhodecode/controllers/admin/repos.py:467
542 #: rhodecode/controllers/admin/repos.py:529
502 msgid "An error occurred during pull from remote location"
543 msgid "An error occurred during pull from remote location"
503 msgstr ""
544 msgstr ""
504
545
505 #: rhodecode/controllers/admin/repos.py:483
546 #: rhodecode/controllers/admin/repos.py:545
506 msgid "Nothing"
547 msgid "Nothing"
507 msgstr ""
548 msgstr ""
508
549
509 #: rhodecode/controllers/admin/repos.py:485
550 #: rhodecode/controllers/admin/repos.py:547
510 #, python-format
551 #, python-format
511 msgid "Marked repo %s as fork of %s"
552 msgid "Marked repo %s as fork of %s"
512 msgstr ""
553 msgstr ""
513
554
514 #: rhodecode/controllers/admin/repos.py:489
555 #: rhodecode/controllers/admin/repos.py:551
515 msgid "An error occurred during this operation"
556 msgid "An error occurred during this operation"
516 msgstr ""
557 msgstr ""
517
558
518 #: rhodecode/controllers/admin/repos_groups.py:120
559 #: rhodecode/controllers/admin/repos.py:590
560 msgid "An error occurred during creation of field"
561 msgstr ""
562
563 #: rhodecode/controllers/admin/repos.py:604
564 msgid "An error occurred during removal of field"
565 msgstr ""
566
567 #: rhodecode/controllers/admin/repos_groups.py:145
519 #, python-format
568 #, python-format
520 msgid "created repos group %s"
569 msgid "Created repository group %s"
521 msgstr ""
570 msgstr ""
522
571
523 #: rhodecode/controllers/admin/repos_groups.py:133
572 #: rhodecode/controllers/admin/repos_groups.py:157
524 #, python-format
573 #, python-format
525 msgid "error occurred during creation of repos group %s"
574 msgid "Error occurred during creation of repository group %s"
526 msgstr ""
575 msgstr ""
527
576
528 #: rhodecode/controllers/admin/repos_groups.py:167
577 #: rhodecode/controllers/admin/repos_groups.py:214
578 #: rhodecode/controllers/admin/repos_groups.py:286
579 msgid "Cannot revoke permission for yourself as admin"
580 msgstr ""
581
582 #: rhodecode/controllers/admin/repos_groups.py:220
529 #, python-format
583 #, python-format
530 msgid "updated repos group %s"
584 msgid "Updated repository group %s"
531 msgstr ""
585 msgstr ""
532
586
533 #: rhodecode/controllers/admin/repos_groups.py:180
587 #: rhodecode/controllers/admin/repos_groups.py:235
534 #, python-format
588 #, python-format
535 msgid "error occurred during update of repos group %s"
589 msgid "Error occurred during update of repository group %s"
536 msgstr ""
590 msgstr ""
537
591
538 #: rhodecode/controllers/admin/repos_groups.py:198
592 #: rhodecode/controllers/admin/repos_groups.py:253
539 #, python-format
593 #, python-format
540 msgid "This group contains %s repositores and cannot be deleted"
594 msgid "This group contains %s repositores and cannot be deleted"
541 msgstr ""
595 msgstr ""
542
596
543 #: rhodecode/controllers/admin/repos_groups.py:206
597 #: rhodecode/controllers/admin/repos_groups.py:260
598 #, python-format
599 msgid "This group contains %s subgroups and cannot be deleted"
600 msgstr ""
601
602 #: rhodecode/controllers/admin/repos_groups.py:266
544 #, python-format
603 #, python-format
545 msgid "removed repos group %s"
604 msgid "Removed repository group %s"
546 msgstr ""
605 msgstr ""
547
606
548 #: rhodecode/controllers/admin/repos_groups.py:212
607 #: rhodecode/controllers/admin/repos_groups.py:271
549 msgid "Cannot delete this group it still contains subgroups"
550 msgstr ""
551
552 #: rhodecode/controllers/admin/repos_groups.py:217
553 #: rhodecode/controllers/admin/repos_groups.py:222
554 #, python-format
608 #, python-format
555 msgid "error occurred during deletion of repos group %s"
609 msgid "Error occurred during deletion of repos group %s"
556 msgstr ""
610 msgstr ""
557
611
558 #: rhodecode/controllers/admin/repos_groups.py:243
612 #: rhodecode/controllers/admin/repos_groups.py:297
559 msgid "An error occurred during deletion of group user"
613 msgid "An error occurred during deletion of group user"
560 msgstr ""
614 msgstr ""
561
615
562 #: rhodecode/controllers/admin/repos_groups.py:264
616 #: rhodecode/controllers/admin/repos_groups.py:318
563 msgid "An error occurred during deletion of group users groups"
617 msgid "An error occurred during deletion of group user groups"
564 msgstr ""
618 msgstr ""
565
619
566 #: rhodecode/controllers/admin/settings.py:123
620 #: rhodecode/controllers/admin/settings.py:126
567 #, python-format
621 #, python-format
568 msgid "Repositories successfully rescanned added: %s,removed: %s"
622 msgid "Repositories successfully rescanned added: %s ; removed: %s"
569 msgstr ""
623 msgstr ""
570
624
571 #: rhodecode/controllers/admin/settings.py:131
625 #: rhodecode/controllers/admin/settings.py:135
572 msgid "Whoosh reindex task scheduled"
626 msgid "Whoosh reindex task scheduled"
573 msgstr ""
627 msgstr ""
574
628
575 #: rhodecode/controllers/admin/settings.py:162
576 msgid "Updated application settings"
577 msgstr ""
578
579 #: rhodecode/controllers/admin/settings.py:166
629 #: rhodecode/controllers/admin/settings.py:166
580 #: rhodecode/controllers/admin/settings.py:299
630 msgid "Updated application settings"
581 msgid "error occurred during updating application settings"
631 msgstr ""
582 msgstr ""
632
583
633 #: rhodecode/controllers/admin/settings.py:170
584 #: rhodecode/controllers/admin/settings.py:207
634 #: rhodecode/controllers/admin/settings.py:301
635 msgid "Error occurred during updating application settings"
636 msgstr ""
637
638 #: rhodecode/controllers/admin/settings.py:216
585 msgid "Updated visualisation settings"
639 msgid "Updated visualisation settings"
586 msgstr ""
640 msgstr ""
587
641
588 #: rhodecode/controllers/admin/settings.py:212
642 #: rhodecode/controllers/admin/settings.py:221
589 msgid "error occurred during updating visualisation settings"
643 msgid "Error occurred during updating visualisation settings"
590 msgstr ""
644 msgstr ""
591
645
592 #: rhodecode/controllers/admin/settings.py:295
646 #: rhodecode/controllers/admin/settings.py:297
593 msgid "Updated VCS settings"
647 msgid "Updated VCS settings"
594 msgstr ""
648 msgstr ""
595
649
596 #: rhodecode/controllers/admin/settings.py:309
650 #: rhodecode/controllers/admin/settings.py:311
597 msgid "Added new hook"
651 msgid "Added new hook"
598 msgstr ""
652 msgstr ""
599
653
600 #: rhodecode/controllers/admin/settings.py:321
654 #: rhodecode/controllers/admin/settings.py:323
601 msgid "Updated hooks"
655 msgid "Updated hooks"
602 msgstr ""
656 msgstr ""
603
657
604 #: rhodecode/controllers/admin/settings.py:325
658 #: rhodecode/controllers/admin/settings.py:327
605 msgid "error occurred during hook creation"
659 msgid "Error occurred during hook creation"
606 msgstr ""
660 msgstr ""
607
661
608 #: rhodecode/controllers/admin/settings.py:344
662 #: rhodecode/controllers/admin/settings.py:346
609 msgid "Email task created"
663 msgid "Email task created"
610 msgstr ""
664 msgstr ""
611
665
612 #: rhodecode/controllers/admin/settings.py:399
666 #: rhodecode/controllers/admin/settings.py:410
613 msgid "You can't edit this user since it's crucial for entire application"
667 msgid "You can't edit this user since it's crucial for entire application"
614 msgstr ""
668 msgstr ""
615
669
616 #: rhodecode/controllers/admin/settings.py:430
670 #: rhodecode/controllers/admin/settings.py:452
617 msgid "Your account was updated successfully"
671 msgid "Your account was updated successfully"
618 msgstr ""
672 msgstr ""
619
673
620 #: rhodecode/controllers/admin/settings.py:445
674 #: rhodecode/controllers/admin/settings.py:467
621 #: rhodecode/controllers/admin/users.py:196
675 #: rhodecode/controllers/admin/users.py:198
622 #, python-format
676 #, python-format
623 msgid "error occurred during update of user %s"
677 msgid "Error occurred during update of user %s"
624 msgstr ""
678 msgstr ""
625
679
626 #: rhodecode/controllers/admin/users.py:130
680 #: rhodecode/controllers/admin/users.py:130
627 #, python-format
681 #, python-format
628 msgid "created user %s"
682 msgid "Created user %s"
629 msgstr ""
683 msgstr ""
630
684
631 #: rhodecode/controllers/admin/users.py:142
685 #: rhodecode/controllers/admin/users.py:142
632 #, python-format
686 #, python-format
633 msgid "error occurred during creation of user %s"
687 msgid "Error occurred during creation of user %s"
634 msgstr ""
688 msgstr ""
635
689
636 #: rhodecode/controllers/admin/users.py:176
690 #: rhodecode/controllers/admin/users.py:176
637 msgid "User updated successfully"
691 msgid "User updated successfully"
638 msgstr ""
692 msgstr ""
639
693
640 #: rhodecode/controllers/admin/users.py:212
694 #: rhodecode/controllers/admin/users.py:214
641 msgid "successfully deleted user"
695 msgid "Successfully deleted user"
642 msgstr ""
696 msgstr ""
643
697
644 #: rhodecode/controllers/admin/users.py:217
698 #: rhodecode/controllers/admin/users.py:219
645 msgid "An error occurred during deletion of user"
699 msgid "An error occurred during deletion of user"
646 msgstr ""
700 msgstr ""
647
701
648 #: rhodecode/controllers/admin/users.py:231
702 #: rhodecode/controllers/admin/users.py:233
649 msgid "You can't edit this user"
703 msgid "You can't edit this user"
650 msgstr ""
704 msgstr ""
651
705
652 #: rhodecode/controllers/admin/users.py:272
706 #: rhodecode/controllers/admin/users.py:276
653 msgid "Granted 'repository create' permission to user"
707 msgid "Granted 'repository create' permission to user"
654 msgstr ""
708 msgstr ""
655
709
656 #: rhodecode/controllers/admin/users.py:277
710 #: rhodecode/controllers/admin/users.py:281
657 msgid "Revoked 'repository create' permission to user"
711 msgid "Revoked 'repository create' permission to user"
658 msgstr ""
712 msgstr ""
659
713
660 #: rhodecode/controllers/admin/users.py:283
714 #: rhodecode/controllers/admin/users.py:287
661 msgid "Granted 'repository fork' permission to user"
715 msgid "Granted 'repository fork' permission to user"
662 msgstr ""
716 msgstr ""
663
717
664 #: rhodecode/controllers/admin/users.py:288
718 #: rhodecode/controllers/admin/users.py:292
665 msgid "Revoked 'repository fork' permission to user"
719 msgid "Revoked 'repository fork' permission to user"
666 msgstr ""
720 msgstr ""
667
721
668 #: rhodecode/controllers/admin/users.py:294
722 #: rhodecode/controllers/admin/users.py:298
669 #: rhodecode/controllers/admin/users_groups.py:279
723 #: rhodecode/controllers/admin/users_groups.py:281
670 msgid "An error occurred during permissions saving"
724 msgid "An error occurred during permissions saving"
671 msgstr ""
725 msgstr ""
672
726
673 #: rhodecode/controllers/admin/users.py:309
727 #: rhodecode/controllers/admin/users.py:312
674 #, python-format
728 #, python-format
675 msgid "Added email %s to user"
729 msgid "Added email %s to user"
676 msgstr ""
730 msgstr ""
677
731
678 #: rhodecode/controllers/admin/users.py:315
732 #: rhodecode/controllers/admin/users.py:318
679 msgid "An error occurred during email saving"
733 msgid "An error occurred during email saving"
680 msgstr ""
734 msgstr ""
681
735
682 #: rhodecode/controllers/admin/users.py:325
736 #: rhodecode/controllers/admin/users.py:328
683 msgid "Removed email from user"
737 msgid "Removed email from user"
684 msgstr ""
738 msgstr ""
685
739
740 #: rhodecode/controllers/admin/users.py:341
741 #, python-format
742 msgid "Added ip %s to user"
743 msgstr ""
744
745 #: rhodecode/controllers/admin/users.py:347
746 msgid "An error occurred during ip saving"
747 msgstr ""
748
749 #: rhodecode/controllers/admin/users.py:359
750 msgid "Removed ip from user"
751 msgstr ""
752
686 #: rhodecode/controllers/admin/users_groups.py:86
753 #: rhodecode/controllers/admin/users_groups.py:86
687 #, python-format
754 #, python-format
688 msgid "created users group %s"
755 msgid "Created user group %s"
689 msgstr ""
756 msgstr ""
690
757
691 #: rhodecode/controllers/admin/users_groups.py:97
758 #: rhodecode/controllers/admin/users_groups.py:97
692 #, python-format
759 #, python-format
693 msgid "error occurred during creation of users group %s"
760 msgid "Error occurred during creation of user group %s"
694 msgstr ""
761 msgstr ""
695
762
696 #: rhodecode/controllers/admin/users_groups.py:164
763 #: rhodecode/controllers/admin/users_groups.py:166
697 #, python-format
764 #, python-format
698 msgid "updated users group %s"
765 msgid "Updated user group %s"
699 msgstr ""
766 msgstr ""
700
767
701 #: rhodecode/controllers/admin/users_groups.py:186
768 #: rhodecode/controllers/admin/users_groups.py:188
702 #, python-format
769 #, python-format
703 msgid "error occurred during update of users group %s"
770 msgid "Error occurred during update of user group %s"
704 msgstr ""
771 msgstr ""
705
772
706 #: rhodecode/controllers/admin/users_groups.py:203
773 #: rhodecode/controllers/admin/users_groups.py:205
707 msgid "successfully deleted users group"
774 msgid "Successfully deleted user group"
708 msgstr ""
775 msgstr ""
709
776
710 #: rhodecode/controllers/admin/users_groups.py:208
777 #: rhodecode/controllers/admin/users_groups.py:210
711 msgid "An error occurred during deletion of users group"
778 msgid "An error occurred during deletion of user group"
712 msgstr ""
779 msgstr ""
713
780
714 #: rhodecode/controllers/admin/users_groups.py:257
781 #: rhodecode/controllers/admin/users_groups.py:259
715 msgid "Granted 'repository create' permission to users group"
782 msgid "Granted 'repository create' permission to user group"
716 msgstr ""
783 msgstr ""
717
784
718 #: rhodecode/controllers/admin/users_groups.py:262
785 #: rhodecode/controllers/admin/users_groups.py:264
719 msgid "Revoked 'repository create' permission to users group"
786 msgid "Revoked 'repository create' permission to user group"
720 msgstr ""
787 msgstr ""
721
788
722 #: rhodecode/controllers/admin/users_groups.py:268
789 #: rhodecode/controllers/admin/users_groups.py:270
723 msgid "Granted 'repository fork' permission to users group"
790 msgid "Granted 'repository fork' permission to user group"
724 msgstr ""
791 msgstr ""
725
792
726 #: rhodecode/controllers/admin/users_groups.py:273
793 #: rhodecode/controllers/admin/users_groups.py:275
727 msgid "Revoked 'repository fork' permission to users group"
794 msgid "Revoked 'repository fork' permission to user group"
728 msgstr ""
795 msgstr ""
729
796
730 #: rhodecode/lib/auth.py:499
797 #: rhodecode/lib/auth.py:530
798 #, python-format
799 msgid "IP %s not allowed"
800 msgstr ""
801
802 #: rhodecode/lib/auth.py:579
731 msgid "You need to be a registered user to perform this action"
803 msgid "You need to be a registered user to perform this action"
732 msgstr ""
804 msgstr ""
733
805
734 #: rhodecode/lib/auth.py:540
806 #: rhodecode/lib/auth.py:620
735 msgid "You need to be a signed in to view this page"
807 msgid "You need to be a signed in to view this page"
736 msgstr ""
808 msgstr ""
737
809
738 #: rhodecode/lib/diffs.py:74
810 #: rhodecode/lib/diffs.py:66
739 msgid "binary file"
811 msgid "Binary file"
740 msgstr ""
812 msgstr ""
741
813
742 #: rhodecode/lib/diffs.py:90
814 #: rhodecode/lib/diffs.py:82
743 msgid "Changeset was too big and was cut off, use diff menu to display this diff"
815 msgid "Changeset was too big and was cut off, use diff menu to display this diff"
744 msgstr ""
816 msgstr ""
745
817
746 #: rhodecode/lib/diffs.py:100
818 #: rhodecode/lib/diffs.py:92
747 msgid "No changes detected"
819 msgid "No changes detected"
748 msgstr ""
820 msgstr ""
749
821
750 #: rhodecode/lib/helpers.py:374
822 #: rhodecode/lib/helpers.py:394
751 #, python-format
823 #, python-format
752 msgid "%a, %d %b %Y %H:%M:%S"
824 msgid "%a, %d %b %Y %H:%M:%S"
753 msgstr ""
825 msgstr ""
754
826
755 #: rhodecode/lib/helpers.py:486
827 #: rhodecode/lib/helpers.py:506
756 msgid "True"
828 msgid "True"
757 msgstr ""
829 msgstr ""
758
830
759 #: rhodecode/lib/helpers.py:490
831 #: rhodecode/lib/helpers.py:509
760 msgid "False"
832 msgid "False"
761 msgstr ""
833 msgstr ""
762
834
763 #: rhodecode/lib/helpers.py:530
835 #: rhodecode/lib/helpers.py:547
764 #, python-format
836 #, python-format
765 msgid "Deleted branch: %s"
837 msgid "Deleted branch: %s"
766 msgstr ""
838 msgstr ""
767
839
768 #: rhodecode/lib/helpers.py:533
840 #: rhodecode/lib/helpers.py:550
769 #, python-format
841 #, python-format
770 msgid "Created tag: %s"
842 msgid "Created tag: %s"
771 msgstr ""
843 msgstr ""
772
844
773 #: rhodecode/lib/helpers.py:546
845 #: rhodecode/lib/helpers.py:563
774 msgid "Changeset not found"
846 msgid "Changeset not found"
775 msgstr ""
847 msgstr ""
776
848
777 #: rhodecode/lib/helpers.py:589
778 #, python-format
779 msgid "Show all combined changesets %s->%s"
780 msgstr ""
781
782 #: rhodecode/lib/helpers.py:595
783 msgid "compare view"
784 msgstr ""
785
786 #: rhodecode/lib/helpers.py:615
849 #: rhodecode/lib/helpers.py:615
787 msgid "and"
788 msgstr ""
789
790 #: rhodecode/lib/helpers.py:616
791 #, python-format
850 #, python-format
792 msgid "%s more"
851 msgid "Show all combined changesets %s->%s"
793 msgstr ""
852 msgstr ""
794
853
795 #: rhodecode/lib/helpers.py:617 rhodecode/templates/changelog/changelog.html:51
854 #: rhodecode/lib/helpers.py:621
796 msgid "revisions"
855 msgid "compare view"
797 msgstr ""
856 msgstr ""
798
857
799 #: rhodecode/lib/helpers.py:641
858 #: rhodecode/lib/helpers.py:641
859 msgid "and"
860 msgstr ""
861
862 #: rhodecode/lib/helpers.py:642
863 #, python-format
864 msgid "%s more"
865 msgstr ""
866
867 #: rhodecode/lib/helpers.py:643 rhodecode/templates/changelog/changelog.html:44
868 msgid "revisions"
869 msgstr ""
870
871 #: rhodecode/lib/helpers.py:667
800 #, python-format
872 #, python-format
801 msgid "fork name %s"
873 msgid "fork name %s"
802 msgstr ""
874 msgstr ""
803
875
804 #: rhodecode/lib/helpers.py:658
805 #: rhodecode/templates/pullrequests/pullrequest_show.html:4
806 #: rhodecode/templates/pullrequests/pullrequest_show.html:12
807 #, python-format
808 msgid "Pull request #%s"
809 msgstr ""
810
811 #: rhodecode/lib/helpers.py:664
812 msgid "[deleted] repository"
813 msgstr ""
814
815 #: rhodecode/lib/helpers.py:666 rhodecode/lib/helpers.py:676
816 msgid "[created] repository"
817 msgstr ""
818
819 #: rhodecode/lib/helpers.py:668
820 msgid "[created] repository as fork"
821 msgstr ""
822
823 #: rhodecode/lib/helpers.py:670 rhodecode/lib/helpers.py:678
824 msgid "[forked] repository"
825 msgstr ""
826
827 #: rhodecode/lib/helpers.py:672 rhodecode/lib/helpers.py:680
828 msgid "[updated] repository"
829 msgstr ""
830
831 #: rhodecode/lib/helpers.py:674
832 msgid "[delete] repository"
833 msgstr ""
834
835 #: rhodecode/lib/helpers.py:682
836 msgid "[created] user"
837 msgstr ""
838
839 #: rhodecode/lib/helpers.py:684
876 #: rhodecode/lib/helpers.py:684
840 msgid "[updated] user"
877 #: rhodecode/templates/pullrequests/pullrequest_show.html:8
841 msgstr ""
878 #, python-format
842
879 msgid "Pull request #%s"
843 #: rhodecode/lib/helpers.py:686
844 msgid "[created] users group"
845 msgstr ""
846
847 #: rhodecode/lib/helpers.py:688
848 msgid "[updated] users group"
849 msgstr ""
880 msgstr ""
850
881
851 #: rhodecode/lib/helpers.py:690
882 #: rhodecode/lib/helpers.py:690
852 msgid "[commented] on revision in repository"
883 msgid "[deleted] repository"
853 msgstr ""
884 msgstr ""
854
885
855 #: rhodecode/lib/helpers.py:692
886 #: rhodecode/lib/helpers.py:692 rhodecode/lib/helpers.py:702
856 msgid "[commented] on pull request for"
887 msgid "[created] repository"
857 msgstr ""
888 msgstr ""
858
889
859 #: rhodecode/lib/helpers.py:694
890 #: rhodecode/lib/helpers.py:694
860 msgid "[closed] pull request for"
891 msgid "[created] repository as fork"
861 msgstr ""
892 msgstr ""
862
893
863 #: rhodecode/lib/helpers.py:696
894 #: rhodecode/lib/helpers.py:696 rhodecode/lib/helpers.py:704
864 msgid "[pushed] into"
895 msgid "[forked] repository"
865 msgstr ""
896 msgstr ""
866
897
867 #: rhodecode/lib/helpers.py:698
898 #: rhodecode/lib/helpers.py:698 rhodecode/lib/helpers.py:706
868 msgid "[committed via RhodeCode] into repository"
899 msgid "[updated] repository"
869 msgstr ""
900 msgstr ""
870
901
871 #: rhodecode/lib/helpers.py:700
902 #: rhodecode/lib/helpers.py:700
903 msgid "[delete] repository"
904 msgstr ""
905
906 #: rhodecode/lib/helpers.py:708
907 msgid "[created] user"
908 msgstr ""
909
910 #: rhodecode/lib/helpers.py:710
911 msgid "[updated] user"
912 msgstr ""
913
914 #: rhodecode/lib/helpers.py:712
915 msgid "[created] user group"
916 msgstr ""
917
918 #: rhodecode/lib/helpers.py:714
919 msgid "[updated] user group"
920 msgstr ""
921
922 #: rhodecode/lib/helpers.py:716
923 msgid "[commented] on revision in repository"
924 msgstr ""
925
926 #: rhodecode/lib/helpers.py:718
927 msgid "[commented] on pull request for"
928 msgstr ""
929
930 #: rhodecode/lib/helpers.py:720
931 msgid "[closed] pull request for"
932 msgstr ""
933
934 #: rhodecode/lib/helpers.py:722
935 msgid "[pushed] into"
936 msgstr ""
937
938 #: rhodecode/lib/helpers.py:724
939 msgid "[committed via RhodeCode] into repository"
940 msgstr ""
941
942 #: rhodecode/lib/helpers.py:726
872 msgid "[pulled from remote] into repository"
943 msgid "[pulled from remote] into repository"
873 msgstr ""
944 msgstr ""
874
945
875 #: rhodecode/lib/helpers.py:702
946 #: rhodecode/lib/helpers.py:728
876 msgid "[pulled] from"
947 msgid "[pulled] from"
877 msgstr ""
948 msgstr ""
878
949
879 #: rhodecode/lib/helpers.py:704
950 #: rhodecode/lib/helpers.py:730
880 msgid "[started following] repository"
951 msgid "[started following] repository"
881 msgstr ""
952 msgstr ""
882
953
883 #: rhodecode/lib/helpers.py:706
954 #: rhodecode/lib/helpers.py:732
884 msgid "[stopped following] repository"
955 msgid "[stopped following] repository"
885 msgstr ""
956 msgstr ""
886
957
887 #: rhodecode/lib/helpers.py:883
958 #: rhodecode/lib/helpers.py:910
888 #, python-format
959 #, python-format
889 msgid " and %s more"
960 msgid " and %s more"
890 msgstr ""
961 msgstr ""
891
962
892 #: rhodecode/lib/helpers.py:887
963 #: rhodecode/lib/helpers.py:914
893 msgid "No Files"
964 msgid "No Files"
894 msgstr ""
965 msgstr ""
895
966
896 #: rhodecode/lib/helpers.py:1163
967 #: rhodecode/lib/helpers.py:1198
897 #, python-format
968 #, python-format
898 msgid ""
969 msgid ""
899 "%s repository is not mapped to db perhaps it was created or renamed from "
970 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -901,165 +972,225 b' msgid ""'
901 "repositories"
972 "repositories"
902 msgstr ""
973 msgstr ""
903
974
904 #: rhodecode/lib/utils2.py:403
975 #: rhodecode/lib/unionrepo.py:193
976 msgid "cannot create new union repository"
977 msgstr ""
978
979 #: rhodecode/lib/utils2.py:411
905 #, python-format
980 #, python-format
906 msgid "%d year"
981 msgid "%d year"
907 msgid_plural "%d years"
982 msgid_plural "%d years"
908 msgstr[0] ""
983 msgstr[0] ""
909 msgstr[1] ""
984 msgstr[1] ""
910
985
911 #: rhodecode/lib/utils2.py:404
986 #: rhodecode/lib/utils2.py:412
912 #, python-format
987 #, python-format
913 msgid "%d month"
988 msgid "%d month"
914 msgid_plural "%d months"
989 msgid_plural "%d months"
915 msgstr[0] ""
990 msgstr[0] ""
916 msgstr[1] ""
991 msgstr[1] ""
917
992
918 #: rhodecode/lib/utils2.py:405
993 #: rhodecode/lib/utils2.py:413
919 #, python-format
994 #, python-format
920 msgid "%d day"
995 msgid "%d day"
921 msgid_plural "%d days"
996 msgid_plural "%d days"
922 msgstr[0] ""
997 msgstr[0] ""
923 msgstr[1] ""
998 msgstr[1] ""
924
999
925 #: rhodecode/lib/utils2.py:406
1000 #: rhodecode/lib/utils2.py:414
926 #, python-format
1001 #, python-format
927 msgid "%d hour"
1002 msgid "%d hour"
928 msgid_plural "%d hours"
1003 msgid_plural "%d hours"
929 msgstr[0] ""
1004 msgstr[0] ""
930 msgstr[1] ""
1005 msgstr[1] ""
931
1006
932 #: rhodecode/lib/utils2.py:407
1007 #: rhodecode/lib/utils2.py:415
933 #, python-format
1008 #, python-format
934 msgid "%d minute"
1009 msgid "%d minute"
935 msgid_plural "%d minutes"
1010 msgid_plural "%d minutes"
936 msgstr[0] ""
1011 msgstr[0] ""
937 msgstr[1] ""
1012 msgstr[1] ""
938
1013
939 #: rhodecode/lib/utils2.py:408
1014 #: rhodecode/lib/utils2.py:416
940 #, python-format
1015 #, python-format
941 msgid "%d second"
1016 msgid "%d second"
942 msgid_plural "%d seconds"
1017 msgid_plural "%d seconds"
943 msgstr[0] ""
1018 msgstr[0] ""
944 msgstr[1] ""
1019 msgstr[1] ""
945
1020
946 #: rhodecode/lib/utils2.py:424
1021 #: rhodecode/lib/utils2.py:432
947 #, python-format
1022 #, python-format
948 msgid "in %s"
1023 msgid "in %s"
949 msgstr ""
1024 msgstr ""
950
1025
951 #: rhodecode/lib/utils2.py:426
952 #, python-format
953 msgid "%s ago"
954 msgstr ""
955
956 #: rhodecode/lib/utils2.py:428
957 #, python-format
958 msgid "in %s and %s"
959 msgstr ""
960
961 #: rhodecode/lib/utils2.py:431
962 #, python-format
963 msgid "%s and %s ago"
964 msgstr ""
965
966 #: rhodecode/lib/utils2.py:434
1026 #: rhodecode/lib/utils2.py:434
1027 #, python-format
1028 msgid "%s ago"
1029 msgstr ""
1030
1031 #: rhodecode/lib/utils2.py:436
1032 #, python-format
1033 msgid "in %s and %s"
1034 msgstr ""
1035
1036 #: rhodecode/lib/utils2.py:439
1037 #, python-format
1038 msgid "%s and %s ago"
1039 msgstr ""
1040
1041 #: rhodecode/lib/utils2.py:442
967 msgid "just now"
1042 msgid "just now"
968 msgstr ""
1043 msgstr ""
969
1044
970 #: rhodecode/lib/celerylib/tasks.py:270
1045 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163
971 msgid "password reset link"
1046 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1183
972 msgstr ""
1047 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1289 rhodecode/model/db.py:1388
973
974 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163 rhodecode/model/db.py:1183
975 msgid "Repository no access"
1048 msgid "Repository no access"
976 msgstr ""
1049 msgstr ""
977
1050
978 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164 rhodecode/model/db.py:1184
1051 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164
1052 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1184
1053 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1290 rhodecode/model/db.py:1389
979 msgid "Repository read access"
1054 msgid "Repository read access"
980 msgstr ""
1055 msgstr ""
981
1056
982 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165 rhodecode/model/db.py:1185
1057 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165
1058 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1185
1059 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1291 rhodecode/model/db.py:1390
983 msgid "Repository write access"
1060 msgid "Repository write access"
984 msgstr ""
1061 msgstr ""
985
1062
986 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166 rhodecode/model/db.py:1186
1063 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166
1064 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1186
1065 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1292 rhodecode/model/db.py:1391
987 msgid "Repository admin access"
1066 msgid "Repository admin access"
988 msgstr ""
1067 msgstr ""
989
1068
990 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168 rhodecode/model/db.py:1188
1069 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168
1070 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1188
1071 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1294
991 msgid "Repositories Group no access"
1072 msgid "Repositories Group no access"
992 msgstr ""
1073 msgstr ""
993
1074
994 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169 rhodecode/model/db.py:1189
1075 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169
1076 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1189
1077 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1295
995 msgid "Repositories Group read access"
1078 msgid "Repositories Group read access"
996 msgstr ""
1079 msgstr ""
997
1080
998 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170 rhodecode/model/db.py:1190
1081 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170
1082 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1190
1083 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1296
999 msgid "Repositories Group write access"
1084 msgid "Repositories Group write access"
1000 msgstr ""
1085 msgstr ""
1001
1086
1002 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171 rhodecode/model/db.py:1191
1087 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171
1088 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1191
1089 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1297
1003 msgid "Repositories Group admin access"
1090 msgid "Repositories Group admin access"
1004 msgstr ""
1091 msgstr ""
1005
1092
1006 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173 rhodecode/model/db.py:1193
1093 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173
1094 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1193
1095 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1299 rhodecode/model/db.py:1398
1007 msgid "RhodeCode Administrator"
1096 msgid "RhodeCode Administrator"
1008 msgstr ""
1097 msgstr ""
1009
1098
1010 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174 rhodecode/model/db.py:1194
1099 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174
1100 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1194
1101 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1300 rhodecode/model/db.py:1399
1011 msgid "Repository creation disabled"
1102 msgid "Repository creation disabled"
1012 msgstr ""
1103 msgstr ""
1013
1104
1014 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175 rhodecode/model/db.py:1195
1105 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175
1106 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1195
1107 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1301 rhodecode/model/db.py:1400
1015 msgid "Repository creation enabled"
1108 msgid "Repository creation enabled"
1016 msgstr ""
1109 msgstr ""
1017
1110
1018 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176 rhodecode/model/db.py:1196
1111 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176
1112 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1196
1113 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1302 rhodecode/model/db.py:1401
1019 msgid "Repository forking disabled"
1114 msgid "Repository forking disabled"
1020 msgstr ""
1115 msgstr ""
1021
1116
1022 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177 rhodecode/model/db.py:1197
1117 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177
1118 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1197
1119 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303 rhodecode/model/db.py:1402
1023 msgid "Repository forking enabled"
1120 msgid "Repository forking enabled"
1024 msgstr ""
1121 msgstr ""
1025
1122
1026 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178 rhodecode/model/db.py:1198
1123 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178
1124 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1198
1125 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304 rhodecode/model/db.py:1403
1027 msgid "Register disabled"
1126 msgid "Register disabled"
1028 msgstr ""
1127 msgstr ""
1029
1128
1030 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179 rhodecode/model/db.py:1199
1129 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179
1130 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1199
1131 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305 rhodecode/model/db.py:1404
1031 msgid "Register new user with RhodeCode with manual activation"
1132 msgid "Register new user with RhodeCode with manual activation"
1032 msgstr ""
1133 msgstr ""
1033
1134
1034 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182 rhodecode/model/db.py:1202
1135 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182
1136 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1202
1137 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308 rhodecode/model/db.py:1407
1035 msgid "Register new user with RhodeCode with auto activation"
1138 msgid "Register new user with RhodeCode with auto activation"
1036 msgstr ""
1139 msgstr ""
1037
1140
1038 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623 rhodecode/model/db.py:1643
1141 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623
1142 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1643
1143 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1749 rhodecode/model/db.py:1838
1039 msgid "Not Reviewed"
1144 msgid "Not Reviewed"
1040 msgstr ""
1145 msgstr ""
1041
1146
1042 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624 rhodecode/model/db.py:1644
1147 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624
1148 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1644
1149 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1750 rhodecode/model/db.py:1839
1043 msgid "Approved"
1150 msgid "Approved"
1044 msgstr ""
1151 msgstr ""
1045
1152
1046 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625 rhodecode/model/db.py:1645
1153 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625
1154 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1645
1155 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1751 rhodecode/model/db.py:1840
1047 msgid "Rejected"
1156 msgid "Rejected"
1048 msgstr ""
1157 msgstr ""
1049
1158
1050 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626 rhodecode/model/db.py:1646
1159 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626
1160 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1646
1161 #: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1752 rhodecode/model/db.py:1841
1051 msgid "Under Review"
1162 msgid "Under Review"
1052 msgstr ""
1163 msgstr ""
1053
1164
1054 #: rhodecode/model/comment.py:110
1165 #: rhodecode/model/comment.py:75
1055 #, python-format
1166 #, python-format
1056 msgid "on line %s"
1167 msgid "on line %s"
1057 msgstr ""
1168 msgstr ""
1058
1169
1059 #: rhodecode/model/comment.py:173
1170 #: rhodecode/model/comment.py:219
1060 msgid "[Mention]"
1171 msgid "[Mention]"
1061 msgstr ""
1172 msgstr ""
1062
1173
1174 #: rhodecode/model/db.py:1252
1175 msgid "top level"
1176 msgstr ""
1177
1178 #: rhodecode/model/db.py:1393
1179 msgid "Repository group no access"
1180 msgstr ""
1181
1182 #: rhodecode/model/db.py:1394
1183 msgid "Repository group read access"
1184 msgstr ""
1185
1186 #: rhodecode/model/db.py:1395
1187 msgid "Repository group write access"
1188 msgstr ""
1189
1190 #: rhodecode/model/db.py:1396
1191 msgid "Repository group admin access"
1192 msgstr ""
1193
1063 #: rhodecode/model/forms.py:43
1194 #: rhodecode/model/forms.py:43
1064 msgid "Please enter a login"
1195 msgid "Please enter a login"
1065 msgstr ""
1196 msgstr ""
@@ -1078,204 +1209,237 b' msgstr ""'
1078 msgid "Enter %(min)i characters or more"
1209 msgid "Enter %(min)i characters or more"
1079 msgstr ""
1210 msgstr ""
1080
1211
1081 #: rhodecode/model/notification.py:220
1082 #, python-format
1083 msgid "commented on commit at %(when)s"
1084 msgstr ""
1085
1086 #: rhodecode/model/notification.py:221
1087 #, python-format
1088 msgid "sent message at %(when)s"
1089 msgstr ""
1090
1091 #: rhodecode/model/notification.py:222
1092 #, python-format
1093 msgid "mentioned you at %(when)s"
1094 msgstr ""
1095
1096 #: rhodecode/model/notification.py:223
1097 #, python-format
1098 msgid "registered in RhodeCode at %(when)s"
1099 msgstr ""
1100
1101 #: rhodecode/model/notification.py:224
1212 #: rhodecode/model/notification.py:224
1102 #, python-format
1213 #, python-format
1103 msgid "opened new pull request at %(when)s"
1214 msgid "%(user)s commented on changeset at %(when)s"
1104 msgstr ""
1215 msgstr ""
1105
1216
1106 #: rhodecode/model/notification.py:225
1217 #: rhodecode/model/notification.py:225
1107 #, python-format
1218 #, python-format
1108 msgid "commented on pull request at %(when)s"
1219 msgid "%(user)s sent message at %(when)s"
1109 msgstr ""
1220 msgstr ""
1110
1221
1111 #: rhodecode/model/pull_request.py:90
1222 #: rhodecode/model/notification.py:226
1223 #, python-format
1224 msgid "%(user)s mentioned you at %(when)s"
1225 msgstr ""
1226
1227 #: rhodecode/model/notification.py:227
1228 #, python-format
1229 msgid "%(user)s registered in RhodeCode at %(when)s"
1230 msgstr ""
1231
1232 #: rhodecode/model/notification.py:228
1112 #, python-format
1233 #, python-format
1113 msgid "%(user)s wants you to review pull request #%(pr_id)s"
1234 msgid "%(user)s opened new pull request at %(when)s"
1114 msgstr ""
1235 msgstr ""
1115
1236
1116 #: rhodecode/model/scm.py:542
1237 #: rhodecode/model/notification.py:229
1238 #, python-format
1239 msgid "%(user)s commented on pull request at %(when)s"
1240 msgstr ""
1241
1242 #: rhodecode/model/pull_request.py:104
1243 #, python-format
1244 msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
1245 msgstr ""
1246
1247 #: rhodecode/model/scm.py:598
1117 msgid "latest tip"
1248 msgid "latest tip"
1118 msgstr ""
1249 msgstr ""
1119
1250
1120 #: rhodecode/model/user.py:232
1251 #: rhodecode/model/user.py:232
1121 msgid "new user registration"
1252 msgid "New user registration"
1122 msgstr ""
1253 msgstr ""
1123
1254
1124 #: rhodecode/model/user.py:257 rhodecode/model/user.py:281
1255 #: rhodecode/model/user.py:257 rhodecode/model/user.py:281
1256 msgid "You can't Edit this user since it's crucial for entire application"
1257 msgstr ""
1258
1125 #: rhodecode/model/user.py:303
1259 #: rhodecode/model/user.py:303
1126 msgid "You can't Edit this user since it's crucial for entire application"
1127 msgstr ""
1128
1129 #: rhodecode/model/user.py:327
1130 msgid "You can't remove this user since it's crucial for entire application"
1260 msgid "You can't remove this user since it's crucial for entire application"
1131 msgstr ""
1261 msgstr ""
1132
1262
1133 #: rhodecode/model/user.py:333
1263 #: rhodecode/model/user.py:309
1134 #, python-format
1264 #, python-format
1135 msgid ""
1265 msgid ""
1136 "user \"%s\" still owns %s repositories and cannot be removed. Switch "
1266 "user \"%s\" still owns %s repositories and cannot be removed. Switch "
1137 "owners or remove those repositories. %s"
1267 "owners or remove those repositories. %s"
1138 msgstr ""
1268 msgstr ""
1139
1269
1140 #: rhodecode/model/validators.py:36 rhodecode/model/validators.py:37
1270 #: rhodecode/model/user.py:334
1271 msgid "Password reset link"
1272 msgstr ""
1273
1274 #: rhodecode/model/user.py:366
1275 msgid "Your new password"
1276 msgstr ""
1277
1278 #: rhodecode/model/user.py:367
1279 #, python-format
1280 msgid "Your new RhodeCode password:%s"
1281 msgstr ""
1282
1283 #: rhodecode/model/validators.py:38 rhodecode/model/validators.py:39
1141 msgid "Value cannot be an empty list"
1284 msgid "Value cannot be an empty list"
1142 msgstr ""
1285 msgstr ""
1143
1286
1144 #: rhodecode/model/validators.py:83
1145 #, python-format
1146 msgid "Username \"%(username)s\" already exists"
1147 msgstr ""
1148
1149 #: rhodecode/model/validators.py:85
1287 #: rhodecode/model/validators.py:85
1150 #, python-format
1288 #, python-format
1151 msgid "Username \"%(username)s\" is forbidden"
1289 msgid "Username \"%(username)s\" already exists"
1152 msgstr ""
1290 msgstr ""
1153
1291
1154 #: rhodecode/model/validators.py:87
1292 #: rhodecode/model/validators.py:87
1293 #, python-format
1294 msgid "Username \"%(username)s\" is forbidden"
1295 msgstr ""
1296
1297 #: rhodecode/model/validators.py:89
1155 msgid ""
1298 msgid ""
1156 "Username may only contain alphanumeric characters underscores, periods or"
1299 "Username may only contain alphanumeric characters underscores, periods or"
1157 " dashes and must begin with alphanumeric character"
1300 " dashes and must begin with alphanumeric character"
1158 msgstr ""
1301 msgstr ""
1159
1302
1160 #: rhodecode/model/validators.py:115
1303 #: rhodecode/model/validators.py:117
1161 #, python-format
1304 #, python-format
1162 msgid "Username %(username)s is not valid"
1305 msgid "Username %(username)s is not valid"
1163 msgstr ""
1306 msgstr ""
1164
1307
1165 #: rhodecode/model/validators.py:134
1308 #: rhodecode/model/validators.py:136
1166 msgid "Invalid users group name"
1309 msgid "Invalid user group name"
1167 msgstr ""
1168
1169 #: rhodecode/model/validators.py:135
1170 #, python-format
1171 msgid "Users group \"%(usersgroup)s\" already exists"
1172 msgstr ""
1310 msgstr ""
1173
1311
1174 #: rhodecode/model/validators.py:137
1312 #: rhodecode/model/validators.py:137
1313 #, python-format
1314 msgid "User group \"%(usergroup)s\" already exists"
1315 msgstr ""
1316
1317 #: rhodecode/model/validators.py:139
1175 msgid ""
1318 msgid ""
1176 "users group name may only contain alphanumeric characters underscores, "
1319 "user group name may only contain alphanumeric characters underscores, "
1177 "periods or dashes and must begin with alphanumeric character"
1320 "periods or dashes and must begin with alphanumeric character"
1178 msgstr ""
1321 msgstr ""
1179
1322
1180 #: rhodecode/model/validators.py:175
1323 #: rhodecode/model/validators.py:177
1181 msgid "Cannot assign this group as parent"
1324 msgid "Cannot assign this group as parent"
1182 msgstr ""
1325 msgstr ""
1183
1326
1184 #: rhodecode/model/validators.py:176
1185 #, python-format
1186 msgid "Group \"%(group_name)s\" already exists"
1187 msgstr ""
1188
1189 #: rhodecode/model/validators.py:178
1327 #: rhodecode/model/validators.py:178
1190 #, python-format
1328 #, python-format
1329 msgid "Group \"%(group_name)s\" already exists"
1330 msgstr ""
1331
1332 #: rhodecode/model/validators.py:180
1333 #, python-format
1191 msgid "Repository with name \"%(group_name)s\" already exists"
1334 msgid "Repository with name \"%(group_name)s\" already exists"
1192 msgstr ""
1335 msgstr ""
1193
1336
1194 #: rhodecode/model/validators.py:236
1337 #: rhodecode/model/validators.py:238
1195 msgid "Invalid characters (non-ascii) in password"
1338 msgid "Invalid characters (non-ascii) in password"
1196 msgstr ""
1339 msgstr ""
1197
1340
1198 #: rhodecode/model/validators.py:251
1341 #: rhodecode/model/validators.py:253
1199 msgid "Passwords do not match"
1342 msgid "Passwords do not match"
1200 msgstr ""
1343 msgstr ""
1201
1344
1202 #: rhodecode/model/validators.py:268
1203 msgid "invalid password"
1204 msgstr ""
1205
1206 #: rhodecode/model/validators.py:269
1207 msgid "invalid user name"
1208 msgstr ""
1209
1210 #: rhodecode/model/validators.py:270
1345 #: rhodecode/model/validators.py:270
1346 msgid "invalid password"
1347 msgstr ""
1348
1349 #: rhodecode/model/validators.py:271
1350 msgid "invalid user name"
1351 msgstr ""
1352
1353 #: rhodecode/model/validators.py:272
1211 msgid "Your account is disabled"
1354 msgid "Your account is disabled"
1212 msgstr ""
1355 msgstr ""
1213
1356
1214 #: rhodecode/model/validators.py:314
1215 #, python-format
1216 msgid "Repository name %(repo)s is disallowed"
1217 msgstr ""
1218
1219 #: rhodecode/model/validators.py:316
1357 #: rhodecode/model/validators.py:316
1220 #, python-format
1358 #, python-format
1359 msgid "Repository name %(repo)s is disallowed"
1360 msgstr ""
1361
1362 #: rhodecode/model/validators.py:318
1363 #, python-format
1221 msgid "Repository named %(repo)s already exists"
1364 msgid "Repository named %(repo)s already exists"
1222 msgstr ""
1365 msgstr ""
1223
1366
1224 #: rhodecode/model/validators.py:317
1225 #, python-format
1226 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
1227 msgstr ""
1228
1229 #: rhodecode/model/validators.py:319
1367 #: rhodecode/model/validators.py:319
1230 #, python-format
1368 #, python-format
1231 msgid "Repositories group with name \"%(repo)s\" already exists"
1369 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
1232 msgstr ""
1370 msgstr ""
1233
1371
1234 #: rhodecode/model/validators.py:432
1372 #: rhodecode/model/validators.py:321
1373 #, python-format
1374 msgid "Repository group with name \"%(repo)s\" already exists"
1375 msgstr ""
1376
1377 #: rhodecode/model/validators.py:438
1235 msgid "invalid clone url"
1378 msgid "invalid clone url"
1236 msgstr ""
1379 msgstr ""
1237
1380
1238 #: rhodecode/model/validators.py:433
1381 #: rhodecode/model/validators.py:439
1239 msgid "Invalid clone url, provide a valid clone http(s)/svn+http(s) url"
1382 msgid "Invalid clone url, provide a valid clone http(s)/svn+http(s) url"
1240 msgstr ""
1383 msgstr ""
1241
1384
1242 #: rhodecode/model/validators.py:458
1385 #: rhodecode/model/validators.py:464
1243 msgid "Fork have to be the same type as parent"
1386 msgid "Fork have to be the same type as parent"
1244 msgstr ""
1387 msgstr ""
1245
1388
1246 #: rhodecode/model/validators.py:473
1389 #: rhodecode/model/validators.py:479
1247 msgid "You don't have permissions to create repository in this group"
1390 msgid "You don't have permissions to create repository in this group"
1248 msgstr ""
1391 msgstr ""
1249
1392
1250 #: rhodecode/model/validators.py:498
1393 #: rhodecode/model/validators.py:481
1251 msgid "This username or users group name is not valid"
1394 msgid "no permission to create repository in root location"
1252 msgstr ""
1395 msgstr ""
1253
1396
1254 #: rhodecode/model/validators.py:591
1397 #: rhodecode/model/validators.py:518
1398 msgid "You don't have permissions to create a group in this location"
1399 msgstr ""
1400
1401 #: rhodecode/model/validators.py:557
1402 msgid "This username or user group name is not valid"
1403 msgstr ""
1404
1405 #: rhodecode/model/validators.py:650
1255 msgid "This is not a valid path"
1406 msgid "This is not a valid path"
1256 msgstr ""
1407 msgstr ""
1257
1408
1258 #: rhodecode/model/validators.py:606
1409 #: rhodecode/model/validators.py:665
1259 msgid "This e-mail address is already taken"
1410 msgid "This e-mail address is already taken"
1260 msgstr ""
1411 msgstr ""
1261
1412
1262 #: rhodecode/model/validators.py:626
1413 #: rhodecode/model/validators.py:685
1263 #, python-format
1414 #, python-format
1264 msgid "e-mail \"%(email)s\" does not exist."
1415 msgid "e-mail \"%(email)s\" does not exist."
1265 msgstr ""
1416 msgstr ""
1266
1417
1267 #: rhodecode/model/validators.py:663
1418 #: rhodecode/model/validators.py:722
1268 msgid ""
1419 msgid ""
1269 "The LDAP Login attribute of the CN must be specified - this is the name "
1420 "The LDAP Login attribute of the CN must be specified - this is the name "
1270 "of the attribute that is equivalent to \"username\""
1421 "of the attribute that is equivalent to \"username\""
1271 msgstr ""
1422 msgstr ""
1272
1423
1273 #: rhodecode/model/validators.py:682
1424 #: rhodecode/model/validators.py:735
1274 #, python-format
1425 #, python-format
1275 msgid "Revisions %(revs)s are already part of pull request or have set status"
1426 msgid "Revisions %(revs)s are already part of pull request or have set status"
1276 msgstr ""
1427 msgstr ""
1277
1428
1278 #: rhodecode/templates/index.html:3
1429 #: rhodecode/model/validators.py:767
1430 msgid "Please enter a valid IPv4 or IpV6 address"
1431 msgstr ""
1432
1433 #: rhodecode/model/validators.py:768
1434 #, python-format
1435 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
1436 msgstr ""
1437
1438 #: rhodecode/model/validators.py:800
1439 msgid "Key name can only consist of letters, underscore, dash or numbers"
1440 msgstr ""
1441
1442 #: rhodecode/templates/index.html:5
1279 msgid "Dashboard"
1443 msgid "Dashboard"
1280 msgstr ""
1444 msgstr ""
1281
1445
@@ -1284,205 +1448,226 b' msgstr ""'
1284 #: rhodecode/templates/admin/repos/repos.html:9
1448 #: rhodecode/templates/admin/repos/repos.html:9
1285 #: rhodecode/templates/admin/users/user_edit_my_account.html:31
1449 #: rhodecode/templates/admin/users/user_edit_my_account.html:31
1286 #: rhodecode/templates/admin/users/users.html:9
1450 #: rhodecode/templates/admin/users/users.html:9
1287 #: rhodecode/templates/bookmarks/bookmarks.html:10
1451 #: rhodecode/templates/bookmarks/bookmarks.html:9
1288 #: rhodecode/templates/branches/branches.html:9
1452 #: rhodecode/templates/branches/branches.html:9
1289 #: rhodecode/templates/journal/journal.html:9
1453 #: rhodecode/templates/journal/journal.html:9
1290 #: rhodecode/templates/journal/journal.html:48
1454 #: rhodecode/templates/journal/journal.html:46
1291 #: rhodecode/templates/tags/tags.html:10
1455 #: rhodecode/templates/journal/journal.html:47
1456 #: rhodecode/templates/tags/tags.html:9
1292 msgid "quick filter..."
1457 msgid "quick filter..."
1293 msgstr ""
1458 msgstr ""
1294
1459
1295 #: rhodecode/templates/index_base.html:6
1460 #: rhodecode/templates/index_base.html:6
1296 #: rhodecode/templates/admin/repos/repos.html:9
1461 #: rhodecode/templates/admin/repos/repos.html:9
1297 #: rhodecode/templates/base/base.html:233
1298 msgid "repositories"
1462 msgid "repositories"
1299 msgstr ""
1463 msgstr ""
1300
1464
1301 #: rhodecode/templates/index_base.html:13
1465 #: rhodecode/templates/index_base.html:13
1302 #: rhodecode/templates/index_base.html:15
1466 #: rhodecode/templates/index_base.html:18
1467 #: rhodecode/templates/admin/repos/repo_add.html:5
1303 #: rhodecode/templates/admin/repos/repos.html:21
1468 #: rhodecode/templates/admin/repos/repos.html:21
1304 msgid "ADD REPOSITORY"
1469 msgid "Add repository"
1305 msgstr ""
1470 msgstr ""
1306
1471
1307 #: rhodecode/templates/index_base.html:29
1472 #: rhodecode/templates/index_base.html:15
1308 #: rhodecode/templates/index_base.html:136
1473 #: rhodecode/templates/index_base.html:20
1309 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:32
1474 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:31
1310 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:32
1475 msgid "Add group"
1311 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:33
1476 msgstr ""
1312 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
1477
1313 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
1478 #: rhodecode/templates/index_base.html:27
1314 msgid "Group name"
1479 msgid "Edit group"
1315 msgstr ""
1480 msgstr ""
1316
1481
1317 #: rhodecode/templates/index_base.html:30
1482 #: rhodecode/templates/index_base.html:27
1318 #: rhodecode/templates/index_base.html:72
1483 msgid "You have admin right to this group, and can edit it"
1319 #: rhodecode/templates/index_base.html:138
1320 #: rhodecode/templates/index_base.html:176
1321 #: rhodecode/templates/index_base.html:266
1322 #: rhodecode/templates/admin/repos/repo_add_base.html:56
1323 #: rhodecode/templates/admin/repos/repo_edit.html:75
1324 #: rhodecode/templates/admin/repos/repos.html:72
1325 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:41
1326 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:41
1327 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:34
1328 #: rhodecode/templates/forks/fork.html:59
1329 #: rhodecode/templates/settings/repo_settings.html:66
1330 #: rhodecode/templates/summary/summary.html:114
1331 msgid "Description"
1332 msgstr ""
1484 msgstr ""
1333
1485
1334 #: rhodecode/templates/index_base.html:40
1486 #: rhodecode/templates/index_base.html:40
1335 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:47
1487 #: rhodecode/templates/index_base.html:140
1336 msgid "Repositories group"
1488 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:33
1337 msgstr ""
1489 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:38
1338
1490 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:43
1339 #: rhodecode/templates/index_base.html:71
1491 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
1340 #: rhodecode/templates/index_base.html:174
1492 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
1341 #: rhodecode/templates/index_base.html:264
1493 #: rhodecode/templates/admin/users_groups/users_groups.html:34
1494 msgid "Group name"
1495 msgstr ""
1496
1497 #: rhodecode/templates/index_base.html:41
1498 #: rhodecode/templates/index_base.html:83
1499 #: rhodecode/templates/index_base.html:142
1500 #: rhodecode/templates/index_base.html:180
1501 #: rhodecode/templates/index_base.html:270
1502 #: rhodecode/templates/admin/repos/repo_add_base.html:56
1503 #: rhodecode/templates/admin/repos/repo_edit.html:75
1504 #: rhodecode/templates/admin/repos/repos.html:73
1505 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:42
1506 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:47
1507 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:44
1508 #: rhodecode/templates/forks/fork.html:56
1509 #: rhodecode/templates/pullrequests/pullrequest.html:101
1510 #: rhodecode/templates/summary/summary.html:106
1511 msgid "Description"
1512 msgstr ""
1513
1514 #: rhodecode/templates/index_base.html:51
1515 #: rhodecode/templates/admin/permissions/permissions.html:55
1516 #: rhodecode/templates/admin/repos/repo_add_base.html:29
1517 #: rhodecode/templates/admin/repos/repo_edit.html:49
1518 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:57
1519 #: rhodecode/templates/forks/fork.html:47
1520 msgid "Repository group"
1521 msgstr ""
1522
1523 #: rhodecode/templates/index_base.html:82
1524 #: rhodecode/templates/index_base.html:178
1525 #: rhodecode/templates/index_base.html:268
1342 #: rhodecode/templates/admin/repos/repo_add_base.html:9
1526 #: rhodecode/templates/admin/repos/repo_add_base.html:9
1343 #: rhodecode/templates/admin/repos/repo_edit.html:32
1527 #: rhodecode/templates/admin/repos/repo_edit.html:32
1344 #: rhodecode/templates/admin/repos/repos.html:70
1528 #: rhodecode/templates/admin/repos/repos.html:71
1345 #: rhodecode/templates/admin/users/user_edit.html:196
1529 #: rhodecode/templates/admin/users/user_edit_my_account.html:172
1346 #: rhodecode/templates/admin/users/user_edit_my_account.html:59
1530 #: rhodecode/templates/base/perms_summary.html:14
1347 #: rhodecode/templates/admin/users/user_edit_my_account.html:180
1531 #: rhodecode/templates/bookmarks/bookmarks.html:34
1348 #: rhodecode/templates/admin/users/user_edit_my_account.html:216
1349 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:6
1350 #: rhodecode/templates/admin/users_groups/users_group_edit.html:184
1351 #: rhodecode/templates/bookmarks/bookmarks.html:36
1352 #: rhodecode/templates/bookmarks/bookmarks_data.html:6
1532 #: rhodecode/templates/bookmarks/bookmarks_data.html:6
1353 #: rhodecode/templates/branches/branches.html:50
1533 #: rhodecode/templates/branches/branches.html:47
1354 #: rhodecode/templates/branches/branches_data.html:6
1534 #: rhodecode/templates/branches/branches_data.html:6
1355 #: rhodecode/templates/files/files_browser.html:47
1535 #: rhodecode/templates/files/files_browser.html:47
1356 #: rhodecode/templates/journal/journal.html:70
1536 #: rhodecode/templates/journal/journal.html:193
1357 #: rhodecode/templates/journal/journal.html:196
1537 #: rhodecode/templates/journal/journal.html:296
1358 #: rhodecode/templates/journal/journal_page_repos.html:7
1538 #: rhodecode/templates/summary/summary.html:55
1359 #: rhodecode/templates/settings/repo_settings.html:31
1539 #: rhodecode/templates/summary/summary.html:124
1360 #: rhodecode/templates/summary/summary.html:43
1540 #: rhodecode/templates/tags/tags.html:48
1361 #: rhodecode/templates/summary/summary.html:132
1362 #: rhodecode/templates/tags/tags.html:51
1363 #: rhodecode/templates/tags/tags_data.html:6
1541 #: rhodecode/templates/tags/tags_data.html:6
1364 msgid "Name"
1542 msgid "Name"
1365 msgstr ""
1543 msgstr ""
1366
1544
1367 #: rhodecode/templates/index_base.html:73
1545 #: rhodecode/templates/index_base.html:84
1368 msgid "Last change"
1546 msgid "Last change"
1369 msgstr ""
1547 msgstr ""
1370
1548
1371 #: rhodecode/templates/index_base.html:74
1549 #: rhodecode/templates/index_base.html:85
1372 #: rhodecode/templates/index_base.html:179
1550 #: rhodecode/templates/index_base.html:183
1373 #: rhodecode/templates/admin/users/user_edit_my_account.html:182
1551 #: rhodecode/templates/index_base.html:273
1374 #: rhodecode/templates/journal/journal.html:198
1552 #: rhodecode/templates/admin/repos/repos.html:74
1553 #: rhodecode/templates/admin/users/user_edit_my_account.html:174
1554 #: rhodecode/templates/journal/journal.html:195
1555 #: rhodecode/templates/journal/journal.html:298
1375 msgid "Tip"
1556 msgid "Tip"
1376 msgstr ""
1557 msgstr ""
1377
1558
1378 #: rhodecode/templates/index_base.html:75
1559 #: rhodecode/templates/index_base.html:86
1379 #: rhodecode/templates/index_base.html:181
1560 #: rhodecode/templates/index_base.html:185
1380 #: rhodecode/templates/index_base.html:269
1561 #: rhodecode/templates/index_base.html:275
1381 #: rhodecode/templates/admin/repos/repo_edit.html:121
1562 #: rhodecode/templates/admin/repos/repo_edit.html:121
1382 #: rhodecode/templates/admin/repos/repos.html:73
1563 #: rhodecode/templates/admin/repos/repos.html:76
1383 msgid "Owner"
1564 msgid "Owner"
1384 msgstr ""
1565 msgstr ""
1385
1566
1386 #: rhodecode/templates/index_base.html:76
1567 #: rhodecode/templates/index_base.html:87
1387 #: rhodecode/templates/summary/summary.html:48
1388 #: rhodecode/templates/summary/summary.html:51
1389 msgid "RSS"
1390 msgstr ""
1391
1392 #: rhodecode/templates/index_base.html:77
1393 msgid "Atom"
1568 msgid "Atom"
1394 msgstr ""
1569 msgstr ""
1395
1570
1396 #: rhodecode/templates/index_base.html:167
1571 #: rhodecode/templates/index_base.html:171
1397 #: rhodecode/templates/index_base.html:207
1572 #: rhodecode/templates/index_base.html:209
1398 #: rhodecode/templates/index_base.html:291
1573 #: rhodecode/templates/index_base.html:296
1399 #: rhodecode/templates/admin/repos/repos.html:94
1574 #: rhodecode/templates/admin/repos/repos.html:97
1400 #: rhodecode/templates/admin/users/user_edit_my_account.html:202
1575 #: rhodecode/templates/admin/users/user_edit_my_account.html:196
1401 #: rhodecode/templates/admin/users/users.html:107
1576 #: rhodecode/templates/admin/users/users.html:107
1402 #: rhodecode/templates/bookmarks/bookmarks.html:60
1577 #: rhodecode/templates/bookmarks/bookmarks.html:58
1403 #: rhodecode/templates/branches/branches.html:76
1578 #: rhodecode/templates/branches/branches.html:73
1404 #: rhodecode/templates/journal/journal.html:221
1579 #: rhodecode/templates/journal/journal.html:217
1405 #: rhodecode/templates/tags/tags.html:77
1580 #: rhodecode/templates/journal/journal.html:320
1581 #: rhodecode/templates/tags/tags.html:74
1406 msgid "Click to sort ascending"
1582 msgid "Click to sort ascending"
1407 msgstr ""
1583 msgstr ""
1408
1584
1409 #: rhodecode/templates/index_base.html:168
1585 #: rhodecode/templates/index_base.html:172
1410 #: rhodecode/templates/index_base.html:208
1586 #: rhodecode/templates/index_base.html:210
1411 #: rhodecode/templates/index_base.html:292
1587 #: rhodecode/templates/index_base.html:297
1412 #: rhodecode/templates/admin/repos/repos.html:95
1588 #: rhodecode/templates/admin/repos/repos.html:98
1413 #: rhodecode/templates/admin/users/user_edit_my_account.html:203
1589 #: rhodecode/templates/admin/users/user_edit_my_account.html:197
1414 #: rhodecode/templates/admin/users/users.html:108
1590 #: rhodecode/templates/admin/users/users.html:108
1415 #: rhodecode/templates/bookmarks/bookmarks.html:61
1591 #: rhodecode/templates/bookmarks/bookmarks.html:59
1416 #: rhodecode/templates/branches/branches.html:77
1592 #: rhodecode/templates/branches/branches.html:74
1417 #: rhodecode/templates/journal/journal.html:222
1593 #: rhodecode/templates/journal/journal.html:218
1418 #: rhodecode/templates/tags/tags.html:78
1594 #: rhodecode/templates/journal/journal.html:321
1595 #: rhodecode/templates/tags/tags.html:75
1419 msgid "Click to sort descending"
1596 msgid "Click to sort descending"
1420 msgstr ""
1597 msgstr ""
1421
1598
1422 #: rhodecode/templates/index_base.html:177
1599 #: rhodecode/templates/index_base.html:181
1423 #: rhodecode/templates/index_base.html:267
1600 #: rhodecode/templates/index_base.html:271
1424 msgid "Last Change"
1601 msgid "Last Change"
1425 msgstr ""
1602 msgstr ""
1426
1603
1427 #: rhodecode/templates/index_base.html:209
1428 #: rhodecode/templates/index_base.html:293
1429 #: rhodecode/templates/admin/repos/repos.html:96
1430 #: rhodecode/templates/admin/users/user_edit_my_account.html:204
1431 #: rhodecode/templates/admin/users/users.html:109
1432 #: rhodecode/templates/bookmarks/bookmarks.html:62
1433 #: rhodecode/templates/branches/branches.html:78
1434 #: rhodecode/templates/journal/journal.html:223
1435 #: rhodecode/templates/tags/tags.html:79
1436 msgid "No records found."
1437 msgstr ""
1438
1439 #: rhodecode/templates/index_base.html:210
1440 #: rhodecode/templates/index_base.html:294
1441 #: rhodecode/templates/admin/repos/repos.html:97
1442 #: rhodecode/templates/admin/users/user_edit_my_account.html:205
1443 #: rhodecode/templates/admin/users/users.html:110
1444 #: rhodecode/templates/bookmarks/bookmarks.html:63
1445 #: rhodecode/templates/branches/branches.html:79
1446 #: rhodecode/templates/journal/journal.html:224
1447 #: rhodecode/templates/tags/tags.html:80
1448 msgid "Data error."
1449 msgstr ""
1450
1451 #: rhodecode/templates/index_base.html:211
1604 #: rhodecode/templates/index_base.html:211
1452 #: rhodecode/templates/index_base.html:295
1605 #: rhodecode/templates/admin/repos/repos.html:99
1453 #: rhodecode/templates/admin/repos/repos.html:98
1606 #: rhodecode/templates/admin/users/user_edit_my_account.html:198
1454 #: rhodecode/templates/admin/users/user_edit_my_account.html:206
1607 #: rhodecode/templates/admin/users/users.html:109
1608 #: rhodecode/templates/bookmarks/bookmarks.html:60
1609 #: rhodecode/templates/branches/branches.html:75
1610 #: rhodecode/templates/journal/journal.html:219
1611 #: rhodecode/templates/journal/journal.html:322
1612 #: rhodecode/templates/tags/tags.html:76
1613 msgid "No records found."
1614 msgstr ""
1615
1616 #: rhodecode/templates/index_base.html:212
1617 #: rhodecode/templates/index_base.html:299
1618 #: rhodecode/templates/admin/repos/repos.html:100
1619 #: rhodecode/templates/admin/users/user_edit_my_account.html:199
1620 #: rhodecode/templates/admin/users/users.html:110
1621 #: rhodecode/templates/bookmarks/bookmarks.html:61
1622 #: rhodecode/templates/branches/branches.html:76
1623 #: rhodecode/templates/journal/journal.html:220
1624 #: rhodecode/templates/journal/journal.html:323
1625 #: rhodecode/templates/tags/tags.html:77
1626 msgid "Data error."
1627 msgstr ""
1628
1629 #: rhodecode/templates/index_base.html:213
1630 #: rhodecode/templates/index_base.html:300
1631 #: rhodecode/templates/admin/repos/repos.html:101
1632 #: rhodecode/templates/admin/users/user_edit_my_account.html:58
1633 #: rhodecode/templates/admin/users/user_edit_my_account.html:200
1455 #: rhodecode/templates/admin/users/users.html:111
1634 #: rhodecode/templates/admin/users/users.html:111
1456 #: rhodecode/templates/bookmarks/bookmarks.html:64
1635 #: rhodecode/templates/bookmarks/bookmarks.html:62
1457 #: rhodecode/templates/branches/branches.html:80
1636 #: rhodecode/templates/branches/branches.html:77
1458 #: rhodecode/templates/journal/journal.html:62
1637 #: rhodecode/templates/journal/journal.html:221
1459 #: rhodecode/templates/journal/journal.html:225
1638 #: rhodecode/templates/journal/journal.html:324
1460 #: rhodecode/templates/tags/tags.html:81
1639 #: rhodecode/templates/tags/tags.html:78
1461 msgid "Loading..."
1640 msgid "Loading..."
1462 msgstr ""
1641 msgstr ""
1463
1642
1464 #: rhodecode/templates/login.html:5 rhodecode/templates/login.html:54
1643 #: rhodecode/templates/index_base.html:298
1465 msgid "Sign In"
1644 msgid "No repositories found."
1645 msgstr ""
1646
1647 #: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:227
1648 msgid "Log In"
1466 msgstr ""
1649 msgstr ""
1467
1650
1468 #: rhodecode/templates/login.html:21
1651 #: rhodecode/templates/login.html:21
1469 msgid "Sign In to"
1652 #, python-format
1653 msgid "Log In to %s"
1470 msgstr ""
1654 msgstr ""
1471
1655
1472 #: rhodecode/templates/login.html:31 rhodecode/templates/register.html:20
1656 #: rhodecode/templates/login.html:31 rhodecode/templates/register.html:20
1473 #: rhodecode/templates/admin/admin_log.html:5
1657 #: rhodecode/templates/admin/admin_log.html:5
1474 #: rhodecode/templates/admin/users/user_add.html:32
1658 #: rhodecode/templates/admin/users/user_add.html:32
1475 #: rhodecode/templates/admin/users/user_edit.html:50
1659 #: rhodecode/templates/admin/users/user_edit.html:57
1476 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:26
1660 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:31
1477 #: rhodecode/templates/base/base.html:83
1661 #: rhodecode/templates/admin/users/users.html:77
1478 #: rhodecode/templates/summary/summary.html:131
1662 #: rhodecode/templates/base/base.html:203
1663 #: rhodecode/templates/summary/summary.html:123
1479 msgid "Username"
1664 msgid "Username"
1480 msgstr ""
1665 msgstr ""
1481
1666
1482 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
1667 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
1483 #: rhodecode/templates/admin/ldap/ldap.html:46
1668 #: rhodecode/templates/admin/ldap/ldap.html:46
1484 #: rhodecode/templates/admin/users/user_add.html:41
1669 #: rhodecode/templates/admin/users/user_add.html:41
1485 #: rhodecode/templates/base/base.html:92
1670 #: rhodecode/templates/base/base.html:212
1486 msgid "Password"
1671 msgid "Password"
1487 msgstr ""
1672 msgstr ""
1488
1673
@@ -1490,16 +1675,20 b' msgstr ""'
1490 msgid "Remember me"
1675 msgid "Remember me"
1491 msgstr ""
1676 msgstr ""
1492
1677
1678 #: rhodecode/templates/login.html:54
1679 msgid "Sign In"
1680 msgstr ""
1681
1493 #: rhodecode/templates/login.html:60
1682 #: rhodecode/templates/login.html:60
1494 msgid "Forgot your password ?"
1683 msgid "Forgot your password ?"
1495 msgstr ""
1684 msgstr ""
1496
1685
1497 #: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:103
1686 #: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:223
1498 msgid "Don't have an account ?"
1687 msgid "Don't have an account ?"
1499 msgstr ""
1688 msgstr ""
1500
1689
1501 #: rhodecode/templates/password_reset.html:5
1690 #: rhodecode/templates/password_reset.html:5
1502 msgid "Reset your password"
1691 msgid "Password Reset"
1503 msgstr ""
1692 msgstr ""
1504
1693
1505 #: rhodecode/templates/password_reset.html:11
1694 #: rhodecode/templates/password_reset.html:11
@@ -1532,23 +1721,23 b' msgstr ""'
1532
1721
1533 #: rhodecode/templates/register.html:47
1722 #: rhodecode/templates/register.html:47
1534 #: rhodecode/templates/admin/users/user_add.html:59
1723 #: rhodecode/templates/admin/users/user_add.html:59
1535 #: rhodecode/templates/admin/users/user_edit.html:90
1724 #: rhodecode/templates/admin/users/user_edit.html:97
1536 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:53
1725 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:62
1537 msgid "First Name"
1726 msgid "First Name"
1538 msgstr ""
1727 msgstr ""
1539
1728
1540 #: rhodecode/templates/register.html:56
1729 #: rhodecode/templates/register.html:56
1541 #: rhodecode/templates/admin/users/user_add.html:68
1730 #: rhodecode/templates/admin/users/user_add.html:68
1542 #: rhodecode/templates/admin/users/user_edit.html:99
1731 #: rhodecode/templates/admin/users/user_edit.html:106
1543 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:62
1732 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:71
1544 msgid "Last Name"
1733 msgid "Last Name"
1545 msgstr ""
1734 msgstr ""
1546
1735
1547 #: rhodecode/templates/register.html:65
1736 #: rhodecode/templates/register.html:65
1548 #: rhodecode/templates/admin/users/user_add.html:77
1737 #: rhodecode/templates/admin/users/user_add.html:77
1549 #: rhodecode/templates/admin/users/user_edit.html:108
1738 #: rhodecode/templates/admin/users/user_edit.html:115
1550 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:71
1739 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:80
1551 #: rhodecode/templates/summary/summary.html:133
1740 #: rhodecode/templates/summary/summary.html:125
1552 msgid "Email"
1741 msgid "Email"
1553 msgstr ""
1742 msgstr ""
1554
1743
@@ -1560,44 +1749,31 b' msgstr ""'
1560 msgid "Your account must wait for activation by administrator"
1749 msgid "Your account must wait for activation by administrator"
1561 msgstr ""
1750 msgstr ""
1562
1751
1563 #: rhodecode/templates/repo_switcher_list.html:11
1752 #: rhodecode/templates/repo_switcher_list.html:10
1564 #: rhodecode/templates/admin/defaults/defaults.html:44
1753 #: rhodecode/templates/admin/defaults/defaults.html:44
1565 #: rhodecode/templates/admin/repos/repo_add_base.html:65
1754 #: rhodecode/templates/admin/repos/repo_add_base.html:65
1566 #: rhodecode/templates/admin/repos/repo_edit.html:85
1755 #: rhodecode/templates/admin/repos/repo_edit.html:85
1567 #: rhodecode/templates/settings/repo_settings.html:76
1756 #: rhodecode/templates/data_table/_dt_elements.html:61
1757 #: rhodecode/templates/summary/summary.html:77
1568 msgid "Private repository"
1758 msgid "Private repository"
1569 msgstr ""
1759 msgstr ""
1570
1760
1571 #: rhodecode/templates/repo_switcher_list.html:16
1761 #: rhodecode/templates/repo_switcher_list.html:12
1762 #: rhodecode/templates/data_table/_dt_elements.html:63
1763 #: rhodecode/templates/summary/summary.html:79
1572 msgid "Public repository"
1764 msgid "Public repository"
1573 msgstr ""
1765 msgstr ""
1574
1766
1575 #: rhodecode/templates/switch_to_list.html:3
1576 #: rhodecode/templates/branches/branches.html:14
1577 msgid "branches"
1578 msgstr ""
1579
1580 #: rhodecode/templates/switch_to_list.html:10
1767 #: rhodecode/templates/switch_to_list.html:10
1581 #: rhodecode/templates/branches/branches_data.html:57
1768 #: rhodecode/templates/branches/branches_data.html:57
1582 msgid "There are no branches yet"
1769 msgid "There are no branches yet"
1583 msgstr ""
1770 msgstr ""
1584
1771
1585 #: rhodecode/templates/switch_to_list.html:15
1586 #: rhodecode/templates/shortlog/shortlog_data.html:10
1587 #: rhodecode/templates/tags/tags.html:15
1588 msgid "tags"
1589 msgstr ""
1590
1591 #: rhodecode/templates/switch_to_list.html:22
1772 #: rhodecode/templates/switch_to_list.html:22
1592 #: rhodecode/templates/tags/tags_data.html:38
1773 #: rhodecode/templates/tags/tags_data.html:38
1593 msgid "There are no tags yet"
1774 msgid "There are no tags yet"
1594 msgstr ""
1775 msgstr ""
1595
1776
1596 #: rhodecode/templates/switch_to_list.html:28
1597 #: rhodecode/templates/bookmarks/bookmarks.html:15
1598 msgid "bookmarks"
1599 msgstr ""
1600
1601 #: rhodecode/templates/switch_to_list.html:35
1777 #: rhodecode/templates/switch_to_list.html:35
1602 #: rhodecode/templates/bookmarks/bookmarks_data.html:32
1778 #: rhodecode/templates/bookmarks/bookmarks_data.html:32
1603 msgid "There are no bookmarks yet"
1779 msgid "There are no bookmarks yet"
@@ -1605,6 +1781,7 b' msgstr ""'
1605
1781
1606 #: rhodecode/templates/admin/admin.html:5
1782 #: rhodecode/templates/admin/admin.html:5
1607 #: rhodecode/templates/admin/admin.html:13
1783 #: rhodecode/templates/admin/admin.html:13
1784 #: rhodecode/templates/base/base.html:68
1608 msgid "Admin journal"
1785 msgid "Admin journal"
1609 msgstr ""
1786 msgstr ""
1610
1787
@@ -1626,11 +1803,13 b' msgstr[0] ""'
1626 msgstr[1] ""
1803 msgstr[1] ""
1627
1804
1628 #: rhodecode/templates/admin/admin_log.html:6
1805 #: rhodecode/templates/admin/admin_log.html:6
1629 #: rhodecode/templates/admin/repos/repos.html:74
1806 #: rhodecode/templates/admin/repos/repos.html:77
1630 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:8
1807 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
1631 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:9
1808 #: rhodecode/templates/admin/users/user_edit_my_account.html:176
1632 #: rhodecode/templates/journal/journal_page_repos.html:9
1809 #: rhodecode/templates/admin/users/users.html:87
1633 #: rhodecode/templates/journal/journal_page_repos.html:10
1810 #: rhodecode/templates/admin/users_groups/users_groups.html:37
1811 #: rhodecode/templates/journal/journal.html:197
1812 #: rhodecode/templates/journal/journal.html:300
1634 msgid "Action"
1813 msgid "Action"
1635 msgstr ""
1814 msgstr ""
1636
1815
@@ -1640,11 +1819,11 b' msgid "Repository"'
1640 msgstr ""
1819 msgstr ""
1641
1820
1642 #: rhodecode/templates/admin/admin_log.html:8
1821 #: rhodecode/templates/admin/admin_log.html:8
1643 #: rhodecode/templates/bookmarks/bookmarks.html:37
1822 #: rhodecode/templates/bookmarks/bookmarks.html:35
1644 #: rhodecode/templates/bookmarks/bookmarks_data.html:7
1823 #: rhodecode/templates/bookmarks/bookmarks_data.html:7
1645 #: rhodecode/templates/branches/branches.html:51
1824 #: rhodecode/templates/branches/branches.html:48
1646 #: rhodecode/templates/branches/branches_data.html:7
1825 #: rhodecode/templates/branches/branches_data.html:7
1647 #: rhodecode/templates/tags/tags.html:52
1826 #: rhodecode/templates/tags/tags.html:49
1648 #: rhodecode/templates/tags/tags_data.html:7
1827 #: rhodecode/templates/tags/tags_data.html:7
1649 msgid "Date"
1828 msgid "Date"
1650 msgstr ""
1829 msgstr ""
@@ -1663,6 +1842,7 b' msgid "Repositories defaults"'
1663 msgstr ""
1842 msgstr ""
1664
1843
1665 #: rhodecode/templates/admin/defaults/defaults.html:11
1844 #: rhodecode/templates/admin/defaults/defaults.html:11
1845 #: rhodecode/templates/base/base.html:75
1666 msgid "Defaults"
1846 msgid "Defaults"
1667 msgstr ""
1847 msgstr ""
1668
1848
@@ -1675,8 +1855,7 b' msgstr ""'
1675 #: rhodecode/templates/admin/defaults/defaults.html:48
1855 #: rhodecode/templates/admin/defaults/defaults.html:48
1676 #: rhodecode/templates/admin/repos/repo_add_base.html:69
1856 #: rhodecode/templates/admin/repos/repo_add_base.html:69
1677 #: rhodecode/templates/admin/repos/repo_edit.html:89
1857 #: rhodecode/templates/admin/repos/repo_edit.html:89
1678 #: rhodecode/templates/forks/fork.html:72
1858 #: rhodecode/templates/forks/fork.html:69
1679 #: rhodecode/templates/settings/repo_settings.html:80
1680 msgid ""
1859 msgid ""
1681 "Private repositories are only visible to people explicitly added as "
1860 "Private repositories are only visible to people explicitly added as "
1682 "collaborators."
1861 "collaborators."
@@ -1704,7 +1883,7 b' msgstr ""'
1704
1883
1705 #: rhodecode/templates/admin/defaults/defaults.html:75
1884 #: rhodecode/templates/admin/defaults/defaults.html:75
1706 #: rhodecode/templates/admin/repos/repo_edit.html:112
1885 #: rhodecode/templates/admin/repos/repo_edit.html:112
1707 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:66
1886 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
1708 msgid "Enable locking"
1887 msgid "Enable locking"
1709 msgstr ""
1888 msgstr ""
1710
1889
@@ -1715,14 +1894,18 b' msgstr ""'
1715
1894
1716 #: rhodecode/templates/admin/defaults/defaults.html:84
1895 #: rhodecode/templates/admin/defaults/defaults.html:84
1717 #: rhodecode/templates/admin/ldap/ldap.html:89
1896 #: rhodecode/templates/admin/ldap/ldap.html:89
1718 #: rhodecode/templates/admin/repos/repo_edit.html:141
1897 #: rhodecode/templates/admin/permissions/permissions.html:92
1719 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:74
1898 #: rhodecode/templates/admin/repos/repo_edit.html:148
1899 #: rhodecode/templates/admin/repos/repo_edit.html:173
1900 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:80
1720 #: rhodecode/templates/admin/settings/hooks.html:73
1901 #: rhodecode/templates/admin/settings/hooks.html:73
1721 #: rhodecode/templates/admin/users/user_edit.html:133
1902 #: rhodecode/templates/admin/users/user_add.html:94
1722 #: rhodecode/templates/admin/users/user_edit.html:178
1903 #: rhodecode/templates/admin/users/user_edit.html:140
1723 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:79
1904 #: rhodecode/templates/admin/users/user_edit.html:185
1905 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:88
1906 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
1907 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
1724 #: rhodecode/templates/admin/users_groups/users_group_edit.html:135
1908 #: rhodecode/templates/admin/users_groups/users_group_edit.html:135
1725 #: rhodecode/templates/settings/repo_settings.html:94
1726 msgid "Save"
1909 msgid "Save"
1727 msgstr ""
1910 msgstr ""
1728
1911
@@ -1731,7 +1914,9 b' msgid "LDAP administration"'
1731 msgstr ""
1914 msgstr ""
1732
1915
1733 #: rhodecode/templates/admin/ldap/ldap.html:11
1916 #: rhodecode/templates/admin/ldap/ldap.html:11
1734 msgid "Ldap"
1917 #: rhodecode/templates/admin/users/users.html:86
1918 #: rhodecode/templates/base/base.html:74
1919 msgid "LDAP"
1735 msgstr ""
1920 msgstr ""
1736
1921
1737 #: rhodecode/templates/admin/ldap/ldap.html:28
1922 #: rhodecode/templates/admin/ldap/ldap.html:28
@@ -1813,8 +1998,7 b' msgid "Comments"'
1813 msgstr ""
1998 msgstr ""
1814
1999
1815 #: rhodecode/templates/admin/notifications/notifications.html:31
2000 #: rhodecode/templates/admin/notifications/notifications.html:31
1816 #: rhodecode/templates/base/base.html:267
2001 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:8
1817 #: rhodecode/templates/base/base.html:269
1818 msgid "Pull requests"
2002 msgid "Pull requests"
1819 msgstr ""
2003 msgstr ""
1820
2004
@@ -1832,6 +2016,7 b' msgid "Show notification"'
1832 msgstr ""
2016 msgstr ""
1833
2017
1834 #: rhodecode/templates/admin/notifications/show_notification.html:9
2018 #: rhodecode/templates/admin/notifications/show_notification.html:9
2019 #: rhodecode/templates/base/base.html:241
1835 msgid "Notifications"
2020 msgid "Notifications"
1836 msgstr ""
2021 msgstr ""
1837
2022
@@ -1840,11 +2025,12 b' msgid "Permissions administration"'
1840 msgstr ""
2025 msgstr ""
1841
2026
1842 #: rhodecode/templates/admin/permissions/permissions.html:11
2027 #: rhodecode/templates/admin/permissions/permissions.html:11
1843 #: rhodecode/templates/admin/repos/repo_edit.html:134
2028 #: rhodecode/templates/admin/repos/repo_edit.html:158
1844 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:58
2029 #: rhodecode/templates/admin/repos/repo_edit.html:165
1845 #: rhodecode/templates/admin/users/user_edit.html:143
2030 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
2031 #: rhodecode/templates/admin/users/user_edit.html:150
1846 #: rhodecode/templates/admin/users_groups/users_group_edit.html:100
2032 #: rhodecode/templates/admin/users_groups/users_group_edit.html:100
1847 #: rhodecode/templates/settings/repo_settings.html:86
2033 #: rhodecode/templates/base/base.html:73
1848 msgid "Permissions"
2034 msgid "Permissions"
1849 msgstr ""
2035 msgstr ""
1850
2036
@@ -1858,30 +2044,21 b' msgstr ""'
1858
2044
1859 #: rhodecode/templates/admin/permissions/permissions.html:49
2045 #: rhodecode/templates/admin/permissions/permissions.html:49
1860 msgid ""
2046 msgid ""
1861 "All default permissions on each repository will be reset to choosen "
2047 "All default permissions on each repository will be reset to chosen "
1862 "permission, note that all custom default permission on repositories will "
2048 "permission, note that all custom default permission on repositories will "
1863 "be lost"
2049 "be lost"
1864 msgstr ""
2050 msgstr ""
1865
2051
1866 #: rhodecode/templates/admin/permissions/permissions.html:50
2052 #: rhodecode/templates/admin/permissions/permissions.html:50
1867 #: rhodecode/templates/admin/permissions/permissions.html:63
2053 #: rhodecode/templates/admin/permissions/permissions.html:63
1868 msgid "overwrite existing settings"
2054 msgid "Overwrite existing settings"
1869 msgstr ""
1870
1871 #: rhodecode/templates/admin/permissions/permissions.html:55
1872 #: rhodecode/templates/admin/repos/repo_add_base.html:29
1873 #: rhodecode/templates/admin/repos/repo_edit.html:49
1874 #: rhodecode/templates/admin/repos_groups/repos_groups.html:4
1875 #: rhodecode/templates/forks/fork.html:50
1876 #: rhodecode/templates/settings/repo_settings.html:48
1877 msgid "Repository group"
1878 msgstr ""
2055 msgstr ""
1879
2056
1880 #: rhodecode/templates/admin/permissions/permissions.html:62
2057 #: rhodecode/templates/admin/permissions/permissions.html:62
1881 msgid ""
2058 msgid ""
1882 "All default permissions on each repository group will be reset to choosen"
2059 "All default permissions on each repository group will be reset to chosen "
1883 " permission, note that all custom default permission on repositories "
2060 "permission, note that all custom default permission on repository groups "
1884 "group will be lost"
2061 "will be lost"
1885 msgstr ""
2062 msgstr ""
1886
2063
1887 #: rhodecode/templates/admin/permissions/permissions.html:69
2064 #: rhodecode/templates/admin/permissions/permissions.html:69
@@ -1896,40 +2073,95 b' msgstr ""'
1896 msgid "Repository forking"
2073 msgid "Repository forking"
1897 msgstr ""
2074 msgstr ""
1898
2075
1899 #: rhodecode/templates/admin/permissions/permissions.html:92
2076 #: rhodecode/templates/admin/permissions/permissions.html:93
1900 #: rhodecode/templates/admin/repos/repo_edit.html:264
2077 #: rhodecode/templates/admin/permissions/permissions.html:154
1901 msgid "set"
2078 #: rhodecode/templates/admin/repos/repo_edit.html:149
1902 msgstr ""
2079 #: rhodecode/templates/admin/repos/repo_edit.html:174
1903
2080 #: rhodecode/templates/admin/repos/repo_edit.html:388
1904 #: rhodecode/templates/admin/repos/repo_add.html:5
2081 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
1905 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:5
2082 #: rhodecode/templates/admin/settings/settings.html:115
1906 msgid "Add repository"
2083 #: rhodecode/templates/admin/settings/settings.html:187
1907 msgstr ""
2084 #: rhodecode/templates/admin/settings/settings.html:278
1908
2085 #: rhodecode/templates/admin/users/user_edit.html:141
1909 #: rhodecode/templates/admin/repos/repo_add.html:11
2086 #: rhodecode/templates/admin/users/user_edit.html:186
1910 #: rhodecode/templates/admin/repos/repo_edit.html:11
2087 #: rhodecode/templates/admin/users/user_edit.html:235
1911 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
2088 #: rhodecode/templates/admin/users/user_edit.html:283
2089 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
2090 #: rhodecode/templates/admin/users_groups/users_group_edit.html:136
2091 #: rhodecode/templates/files/files_add.html:80
2092 #: rhodecode/templates/files/files_edit.html:66
2093 #: rhodecode/templates/pullrequests/pullrequest.html:110
2094 msgid "Reset"
2095 msgstr ""
2096
2097 #: rhodecode/templates/admin/permissions/permissions.html:103
2098 msgid "Default User Permissions"
2099 msgstr ""
2100
2101 #: rhodecode/templates/admin/permissions/permissions.html:113
2102 #: rhodecode/templates/admin/users/user_edit.html:244
2103 msgid "Allowed IP addresses"
2104 msgstr ""
2105
2106 #: rhodecode/templates/admin/permissions/permissions.html:127
2107 #: rhodecode/templates/admin/repos/repo_edit.html:347
2108 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
2109 #: rhodecode/templates/admin/users/user_edit.html:212
2110 #: rhodecode/templates/admin/users/user_edit.html:257
2111 #: rhodecode/templates/admin/users_groups/users_groups.html:46
2112 #: rhodecode/templates/data_table/_dt_elements.html:122
2113 #: rhodecode/templates/data_table/_dt_elements.html:130
2114 msgid "delete"
2115 msgstr ""
2116
2117 #: rhodecode/templates/admin/permissions/permissions.html:128
2118 #: rhodecode/templates/admin/users/user_edit.html:258
2119 #, fuzzy, python-format
2120 msgid "Confirm to delete this ip: %s"
2121 msgstr ""
2122
2123 #: rhodecode/templates/admin/permissions/permissions.html:134
2124 #: rhodecode/templates/admin/users/user_edit.html:264
2125 msgid "All IP addresses are allowed"
2126 msgstr ""
2127
2128 #: rhodecode/templates/admin/permissions/permissions.html:145
2129 #: rhodecode/templates/admin/users/user_edit.html:275
2130 msgid "New ip address"
2131 msgstr ""
2132
2133 #: rhodecode/templates/admin/permissions/permissions.html:153
2134 #: rhodecode/templates/admin/repos/repo_add_base.html:73
2135 #: rhodecode/templates/admin/repos/repo_edit.html:387
2136 #: rhodecode/templates/admin/users/user_edit.html:234
2137 #: rhodecode/templates/admin/users/user_edit.html:282
2138 msgid "Add"
2139 msgstr ""
2140
2141 #: rhodecode/templates/admin/repos/repo_add.html:12
2142 #: rhodecode/templates/admin/repos/repo_add.html:16
2143 #: rhodecode/templates/base/base.html:69 rhodecode/templates/base/base.html:103
2144 #: rhodecode/templates/base/base.html:263
1912 msgid "Repositories"
2145 msgid "Repositories"
1913 msgstr ""
2146 msgstr ""
1914
2147
1915 #: rhodecode/templates/admin/repos/repo_add.html:13
2148 #: rhodecode/templates/admin/repos/repo_add.html:19
1916 msgid "add new"
2149 msgid "Add new"
1917 msgstr ""
2150 msgstr ""
1918
2151
1919 #: rhodecode/templates/admin/repos/repo_add_base.html:20
2152 #: rhodecode/templates/admin/repos/repo_add_base.html:20
1920 #: rhodecode/templates/summary/summary.html:104
2153 #: rhodecode/templates/summary/summary.html:96
1921 #: rhodecode/templates/summary/summary.html:105
2154 #: rhodecode/templates/summary/summary.html:97
1922 msgid "Clone from"
2155 msgid "Clone from"
1923 msgstr ""
2156 msgstr ""
1924
2157
1925 #: rhodecode/templates/admin/repos/repo_add_base.html:24
2158 #: rhodecode/templates/admin/repos/repo_add_base.html:24
1926 #: rhodecode/templates/admin/repos/repo_edit.html:44
2159 #: rhodecode/templates/admin/repos/repo_edit.html:44
1927 #: rhodecode/templates/settings/repo_settings.html:43
1928 msgid "Optional http[s] url from which repository should be cloned."
2160 msgid "Optional http[s] url from which repository should be cloned."
1929 msgstr ""
2161 msgstr ""
1930
2162
1931 #: rhodecode/templates/admin/repos/repo_add_base.html:33
2163 #: rhodecode/templates/admin/repos/repo_add_base.html:33
1932 #: rhodecode/templates/forks/fork.html:54
2164 #: rhodecode/templates/forks/fork.html:51
1933 msgid "Optionaly select a group to put this repository into."
2165 msgid "Optionaly select a group to put this repository into."
1934 msgstr ""
2166 msgstr ""
1935
2167
@@ -1939,57 +2171,39 b' msgstr ""'
1939
2171
1940 #: rhodecode/templates/admin/repos/repo_add_base.html:47
2172 #: rhodecode/templates/admin/repos/repo_add_base.html:47
1941 #: rhodecode/templates/admin/repos/repo_edit.html:66
2173 #: rhodecode/templates/admin/repos/repo_edit.html:66
1942 #: rhodecode/templates/forks/fork.html:41
2174 #: rhodecode/templates/forks/fork.html:38
1943 #: rhodecode/templates/settings/repo_settings.html:57
1944 msgid "Landing revision"
2175 msgid "Landing revision"
1945 msgstr ""
2176 msgstr ""
1946
2177
1947 #: rhodecode/templates/admin/repos/repo_add_base.html:51
2178 #: rhodecode/templates/admin/repos/repo_add_base.html:51
1948 #: rhodecode/templates/admin/repos/repo_edit.html:70
2179 #: rhodecode/templates/admin/repos/repo_edit.html:70
1949 #: rhodecode/templates/forks/fork.html:45
2180 #: rhodecode/templates/forks/fork.html:42
1950 #: rhodecode/templates/settings/repo_settings.html:61
1951 msgid "Default revision for files page, downloads, whoosh and readme"
2181 msgid "Default revision for files page, downloads, whoosh and readme"
1952 msgstr ""
2182 msgstr ""
1953
2183
1954 #: rhodecode/templates/admin/repos/repo_add_base.html:60
2184 #: rhodecode/templates/admin/repos/repo_add_base.html:60
1955 #: rhodecode/templates/admin/repos/repo_edit.html:79
2185 #: rhodecode/templates/admin/repos/repo_edit.html:79
1956 #: rhodecode/templates/forks/fork.html:63
2186 #: rhodecode/templates/forks/fork.html:60
1957 #: rhodecode/templates/settings/repo_settings.html:70
1958 msgid "Keep it short and to the point. Use a README file for longer descriptions."
2187 msgid "Keep it short and to the point. Use a README file for longer descriptions."
1959 msgstr ""
2188 msgstr ""
1960
2189
1961 #: rhodecode/templates/admin/repos/repo_add_base.html:73
2190 #: rhodecode/templates/admin/repos/repo_edit.html:8
1962 msgid "add"
1963 msgstr ""
1964
1965 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:9
1966 msgid "add new repository"
1967 msgstr ""
1968
1969 #: rhodecode/templates/admin/repos/repo_edit.html:5
1970 msgid "Edit repository"
2191 msgid "Edit repository"
1971 msgstr ""
2192 msgstr ""
1972
2193
1973 #: rhodecode/templates/admin/repos/repo_edit.html:13
2194 #: rhodecode/templates/admin/repos/repo_edit.html:12
1974 #: rhodecode/templates/admin/users/user_edit.html:13
2195 #: rhodecode/templates/admin/settings/hooks.html:9
1975 #: rhodecode/templates/admin/users/user_edit.html:228
2196 #: rhodecode/templates/admin/settings/settings.html:11
1976 #: rhodecode/templates/admin/users/user_edit.html:230
2197 #: rhodecode/templates/base/base.html:76 rhodecode/templates/base/base.html:121
1977 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:28
2198 #: rhodecode/templates/summary/summary.html:212
1978 #: rhodecode/templates/admin/users_groups/users_group_edit.html:13
2199 msgid "Settings"
1979 #: rhodecode/templates/admin/users_groups/users_group_edit.html:207
1980 #: rhodecode/templates/admin/users_groups/users_group_edit.html:209
1981 #: rhodecode/templates/files/files_source.html:29
1982 #: rhodecode/templates/journal/journal_page_repos.html:29
1983 msgid "edit"
1984 msgstr ""
2200 msgstr ""
1985
2201
1986 #: rhodecode/templates/admin/repos/repo_edit.html:40
2202 #: rhodecode/templates/admin/repos/repo_edit.html:40
1987 #: rhodecode/templates/settings/repo_settings.html:39
1988 msgid "Clone uri"
2203 msgid "Clone uri"
1989 msgstr ""
2204 msgstr ""
1990
2205
1991 #: rhodecode/templates/admin/repos/repo_edit.html:53
2206 #: rhodecode/templates/admin/repos/repo_edit.html:53
1992 #: rhodecode/templates/settings/repo_settings.html:52
1993 msgid "Optional select a group to put this repository into."
2207 msgid "Optional select a group to put this repository into."
1994 msgstr ""
2208 msgstr ""
1995
2209
@@ -1997,175 +2211,204 b' msgstr ""'
1997 msgid "Change owner of this repository."
2211 msgid "Change owner of this repository."
1998 msgstr ""
2212 msgstr ""
1999
2213
2000 #: rhodecode/templates/admin/repos/repo_edit.html:142
2214 #: rhodecode/templates/admin/repos/repo_edit.html:184
2001 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:75
2215 msgid "Advanced settings"
2002 #: rhodecode/templates/admin/settings/settings.html:113
2216 msgstr ""
2003 #: rhodecode/templates/admin/settings/settings.html:179
2217
2004 #: rhodecode/templates/admin/settings/settings.html:269
2218 #: rhodecode/templates/admin/repos/repo_edit.html:187
2005 #: rhodecode/templates/admin/users/user_edit.html:134
2006 #: rhodecode/templates/admin/users/user_edit.html:179
2007 #: rhodecode/templates/admin/users/user_edit.html:282
2008 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:80
2009 #: rhodecode/templates/admin/users_groups/users_group_edit.html:136
2010 #: rhodecode/templates/files/files_add.html:82
2011 #: rhodecode/templates/files/files_edit.html:68
2012 #: rhodecode/templates/pullrequests/pullrequest.html:124
2013 #: rhodecode/templates/settings/repo_settings.html:95
2014 msgid "Reset"
2015 msgstr ""
2016
2017 #: rhodecode/templates/admin/repos/repo_edit.html:152
2018 msgid "Administration"
2019 msgstr ""
2020
2021 #: rhodecode/templates/admin/repos/repo_edit.html:155
2022 msgid "Statistics"
2219 msgid "Statistics"
2023 msgstr ""
2220 msgstr ""
2024
2221
2025 #: rhodecode/templates/admin/repos/repo_edit.html:159
2222 #: rhodecode/templates/admin/repos/repo_edit.html:191
2026 msgid "Reset current statistics"
2223 msgid "Reset current statistics"
2027 msgstr ""
2224 msgstr ""
2028
2225
2029 #: rhodecode/templates/admin/repos/repo_edit.html:159
2226 #: rhodecode/templates/admin/repos/repo_edit.html:191
2030 msgid "Confirm to remove current statistics"
2227 msgid "Confirm to remove current statistics"
2031 msgstr ""
2228 msgstr ""
2032
2229
2033 #: rhodecode/templates/admin/repos/repo_edit.html:162
2230 #: rhodecode/templates/admin/repos/repo_edit.html:194
2034 msgid "Fetched to rev"
2231 msgid "Fetched to rev"
2035 msgstr ""
2232 msgstr ""
2036
2233
2037 #: rhodecode/templates/admin/repos/repo_edit.html:163
2234 #: rhodecode/templates/admin/repos/repo_edit.html:195
2038 msgid "Stats gathered"
2235 msgid "Stats gathered"
2039 msgstr ""
2236 msgstr ""
2040
2237
2041 #: rhodecode/templates/admin/repos/repo_edit.html:171
2042 msgid "Remote"
2043 msgstr ""
2044
2045 #: rhodecode/templates/admin/repos/repo_edit.html:175
2046 msgid "Pull changes from remote location"
2047 msgstr ""
2048
2049 #: rhodecode/templates/admin/repos/repo_edit.html:175
2050 msgid "Confirm to pull changes from remote side"
2051 msgstr ""
2052
2053 #: rhodecode/templates/admin/repos/repo_edit.html:186
2054 msgid "Cache"
2055 msgstr ""
2056
2057 #: rhodecode/templates/admin/repos/repo_edit.html:190
2058 msgid "Invalidate repository cache"
2059 msgstr ""
2060
2061 #: rhodecode/templates/admin/repos/repo_edit.html:190
2062 msgid "Confirm to invalidate repository cache"
2063 msgstr ""
2064
2065 #: rhodecode/templates/admin/repos/repo_edit.html:193
2066 msgid ""
2067 "Manually invalidate cache for this repository. On first access repository"
2068 " will be cached again"
2069 msgstr ""
2070
2071 #: rhodecode/templates/admin/repos/repo_edit.html:198
2072 msgid "List of cached values"
2073 msgstr ""
2074
2075 #: rhodecode/templates/admin/repos/repo_edit.html:201
2076 msgid "Prefix"
2077 msgstr ""
2078
2079 #: rhodecode/templates/admin/repos/repo_edit.html:202
2080 msgid "Key"
2081 msgstr ""
2082
2083 #: rhodecode/templates/admin/repos/repo_edit.html:203
2238 #: rhodecode/templates/admin/repos/repo_edit.html:203
2084 #: rhodecode/templates/admin/users/user_add.html:86
2239 msgid "Remote"
2085 #: rhodecode/templates/admin/users/user_edit.html:117
2240 msgstr ""
2086 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
2241
2087 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
2242 #: rhodecode/templates/admin/repos/repo_edit.html:207
2088 msgid "Active"
2243 msgid "Pull changes from remote location"
2244 msgstr ""
2245
2246 #: rhodecode/templates/admin/repos/repo_edit.html:207
2247 msgid "Confirm to pull changes from remote side"
2089 msgstr ""
2248 msgstr ""
2090
2249
2091 #: rhodecode/templates/admin/repos/repo_edit.html:218
2250 #: rhodecode/templates/admin/repos/repo_edit.html:218
2092 #: rhodecode/templates/base/base.html:331
2251 msgid "Cache"
2093 #: rhodecode/templates/base/base.html:333
2252 msgstr ""
2094 #: rhodecode/templates/base/base.html:335
2253
2254 #: rhodecode/templates/admin/repos/repo_edit.html:222
2255 msgid "Invalidate repository cache"
2256 msgstr ""
2257
2258 #: rhodecode/templates/admin/repos/repo_edit.html:222
2259 msgid "Confirm to invalidate repository cache"
2260 msgstr ""
2261
2262 #: rhodecode/templates/admin/repos/repo_edit.html:225
2263 msgid ""
2264 "Manually invalidate cache for this repository. On first access repository"
2265 " will be cached again"
2266 msgstr ""
2267
2268 #: rhodecode/templates/admin/repos/repo_edit.html:230
2269 msgid "List of cached values"
2270 msgstr ""
2271
2272 #: rhodecode/templates/admin/repos/repo_edit.html:233
2273 msgid "Prefix"
2274 msgstr ""
2275
2276 #: rhodecode/templates/admin/repos/repo_edit.html:234
2277 msgid "Key"
2278 msgstr ""
2279
2280 #: rhodecode/templates/admin/repos/repo_edit.html:235
2281 #: rhodecode/templates/admin/users/user_add.html:86
2282 #: rhodecode/templates/admin/users/user_edit.html:124
2283 #: rhodecode/templates/admin/users/users.html:84
2284 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
2285 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
2286 #: rhodecode/templates/admin/users_groups/users_groups.html:36
2287 msgid "Active"
2288 msgstr ""
2289
2290 #: rhodecode/templates/admin/repos/repo_edit.html:250
2291 #: rhodecode/templates/base/base.html:280
2292 #: rhodecode/templates/base/base.html:281
2095 msgid "Public journal"
2293 msgid "Public journal"
2096 msgstr ""
2294 msgstr ""
2097
2295
2098 #: rhodecode/templates/admin/repos/repo_edit.html:224
2296 #: rhodecode/templates/admin/repos/repo_edit.html:256
2099 msgid "Remove from public journal"
2297 msgid "Remove from public journal"
2100 msgstr ""
2298 msgstr ""
2101
2299
2102 #: rhodecode/templates/admin/repos/repo_edit.html:226
2300 #: rhodecode/templates/admin/repos/repo_edit.html:258
2103 msgid "Add to public journal"
2301 msgid "Add to public journal"
2104 msgstr ""
2302 msgstr ""
2105
2303
2106 #: rhodecode/templates/admin/repos/repo_edit.html:231
2304 #: rhodecode/templates/admin/repos/repo_edit.html:263
2107 msgid ""
2305 msgid ""
2108 "All actions made on this repository will be accessible to everyone in "
2306 "All actions made on this repository will be accessible to everyone in "
2109 "public journal"
2307 "public journal"
2110 msgstr ""
2308 msgstr ""
2111
2309
2112 #: rhodecode/templates/admin/repos/repo_edit.html:238
2310 #: rhodecode/templates/admin/repos/repo_edit.html:270
2113 msgid "Locking"
2311 msgid "Locking"
2114 msgstr ""
2312 msgstr ""
2115
2313
2116 #: rhodecode/templates/admin/repos/repo_edit.html:243
2314 #: rhodecode/templates/admin/repos/repo_edit.html:275
2117 msgid "Unlock locked repo"
2315 msgid "Unlock locked repo"
2118 msgstr ""
2316 msgstr ""
2119
2317
2120 #: rhodecode/templates/admin/repos/repo_edit.html:243
2318 #: rhodecode/templates/admin/repos/repo_edit.html:275
2121 msgid "Confirm to unlock repository"
2319 msgid "Confirm to unlock repository"
2122 msgstr ""
2320 msgstr ""
2123
2321
2124 #: rhodecode/templates/admin/repos/repo_edit.html:246
2322 #: rhodecode/templates/admin/repos/repo_edit.html:278
2125 msgid "lock repo"
2323 msgid "lock repo"
2126 msgstr ""
2324 msgstr ""
2127
2325
2128 #: rhodecode/templates/admin/repos/repo_edit.html:246
2129 msgid "Confirm to lock repository"
2130 msgstr ""
2131
2132 #: rhodecode/templates/admin/repos/repo_edit.html:247
2133 msgid "Repository is not locked"
2134 msgstr ""
2135
2136 #: rhodecode/templates/admin/repos/repo_edit.html:252
2137 msgid "Force locking on repository. Works only when anonymous access is disabled"
2138 msgstr ""
2139
2140 #: rhodecode/templates/admin/repos/repo_edit.html:259
2141 msgid "Set as fork of"
2142 msgstr ""
2143
2144 #: rhodecode/templates/admin/repos/repo_edit.html:268
2145 msgid "Manually set this repository as a fork of another from the list"
2146 msgstr ""
2147
2148 #: rhodecode/templates/admin/repos/repo_edit.html:274
2149 #: rhodecode/templates/changeset/changeset_file_comment.html:26
2150 msgid "Delete"
2151 msgstr ""
2152
2153 #: rhodecode/templates/admin/repos/repo_edit.html:278
2326 #: rhodecode/templates/admin/repos/repo_edit.html:278
2154 #: rhodecode/templates/settings/repo_settings.html:115
2327 msgid "Confirm to lock repository"
2328 msgstr ""
2329
2330 #: rhodecode/templates/admin/repos/repo_edit.html:279
2331 msgid "Repository is not locked"
2332 msgstr ""
2333
2334 #: rhodecode/templates/admin/repos/repo_edit.html:284
2335 msgid "Force locking on repository. Works only when anonymous access is disabled"
2336 msgstr ""
2337
2338 #: rhodecode/templates/admin/repos/repo_edit.html:291
2339 msgid "Set as fork of"
2340 msgstr ""
2341
2342 #: rhodecode/templates/admin/repos/repo_edit.html:296
2343 msgid "set"
2344 msgstr ""
2345
2346 #: rhodecode/templates/admin/repos/repo_edit.html:300
2347 msgid "Manually set this repository as a fork of another from the list"
2348 msgstr ""
2349
2350 #: rhodecode/templates/admin/repos/repo_edit.html:306
2351 #: rhodecode/templates/changeset/changeset_file_comment.html:41
2352 msgid "Delete"
2353 msgstr ""
2354
2355 #: rhodecode/templates/admin/repos/repo_edit.html:315
2155 msgid "Remove this repository"
2356 msgid "Remove this repository"
2156 msgstr ""
2357 msgstr ""
2157
2358
2158 #: rhodecode/templates/admin/repos/repo_edit.html:278
2359 #: rhodecode/templates/admin/repos/repo_edit.html:315
2159 #: rhodecode/templates/settings/repo_settings.html:115
2160 msgid "Confirm to delete this repository"
2360 msgid "Confirm to delete this repository"
2161 msgstr ""
2361 msgstr ""
2162
2362
2163 #: rhodecode/templates/admin/repos/repo_edit.html:282
2363 #: rhodecode/templates/admin/repos/repo_edit.html:317
2164 #: rhodecode/templates/settings/repo_settings.html:119
2364 #, python-format
2365 msgid "this repository has %s fork"
2366 msgid_plural "this repository has %s forks"
2367 msgstr[0] ""
2368 msgstr[1] ""
2369
2370 #: rhodecode/templates/admin/repos/repo_edit.html:318
2371 msgid "Detach forks"
2372 msgstr ""
2373
2374 #: rhodecode/templates/admin/repos/repo_edit.html:319
2375 msgid "Delete forks"
2376 msgstr ""
2377
2378 #: rhodecode/templates/admin/repos/repo_edit.html:322
2165 msgid ""
2379 msgid ""
2166 "This repository will be renamed in a special way in order to be "
2380 "This repository will be renamed in a special way in order to be "
2167 "unaccesible for RhodeCode and VCS systems. If you need fully delete it "
2381 "unaccesible for RhodeCode and VCS systems. If you need to fully delete it"
2168 "from file system please do it manually"
2382 " from file system please do it manually"
2383 msgstr ""
2384
2385 #: rhodecode/templates/admin/repos/repo_edit.html:336
2386 msgid "Extra fields"
2387 msgstr ""
2388
2389 #: rhodecode/templates/admin/repos/repo_edit.html:348
2390 #, fuzzy, python-format
2391 msgid "Confirm to delete this field: %s"
2392 msgstr ""
2393
2394 #: rhodecode/templates/admin/repos/repo_edit.html:362
2395 msgid "New field key"
2396 msgstr ""
2397
2398 #: rhodecode/templates/admin/repos/repo_edit.html:370
2399 msgid "New field label"
2400 msgstr ""
2401
2402 #: rhodecode/templates/admin/repos/repo_edit.html:373
2403 msgid "Enter short label"
2404 msgstr ""
2405
2406 #: rhodecode/templates/admin/repos/repo_edit.html:379
2407 msgid "New field description"
2408 msgstr ""
2409
2410 #: rhodecode/templates/admin/repos/repo_edit.html:382
2411 msgid "Enter description of a field"
2169 msgstr ""
2412 msgstr ""
2170
2413
2171 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
2414 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
@@ -2185,8 +2428,6 b' msgstr ""'
2185
2428
2186 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
2429 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
2187 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
2430 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
2188 #: rhodecode/templates/admin/users/users.html:85
2189 #: rhodecode/templates/base/base.html:229
2190 msgid "admin"
2431 msgid "admin"
2191 msgstr ""
2432 msgstr ""
2192
2433
@@ -2196,78 +2437,58 b' msgid "member"'
2196 msgstr ""
2437 msgstr ""
2197
2438
2198 #: rhodecode/templates/admin/repos/repo_edit_perms.html:16
2439 #: rhodecode/templates/admin/repos/repo_edit_perms.html:16
2199 #: rhodecode/templates/data_table/_dt_elements.html:67
2200 #: rhodecode/templates/journal/journal.html:95
2201 #: rhodecode/templates/summary/summary.html:85
2202 msgid "private repository"
2440 msgid "private repository"
2203 msgstr ""
2441 msgstr ""
2204
2442
2205 #: rhodecode/templates/admin/repos/repo_edit_perms.html:19
2443 #: rhodecode/templates/admin/repos/repo_edit_perms.html:19
2206 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28
2444 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28
2207 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:18
2445 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:20
2446 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:35
2208 msgid "default"
2447 msgid "default"
2209 msgstr ""
2448 msgstr ""
2210
2449
2211 #: rhodecode/templates/admin/repos/repo_edit_perms.html:33
2450 #: rhodecode/templates/admin/repos/repo_edit_perms.html:33
2212 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
2451 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
2213 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:23
2452 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:25
2214 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:42
2453 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:55
2215 msgid "revoke"
2454 msgid "revoke"
2216 msgstr ""
2455 msgstr ""
2217
2456
2218 #: rhodecode/templates/admin/repos/repo_edit_perms.html:83
2457 #: rhodecode/templates/admin/repos/repo_edit_perms.html:83
2219 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:67
2458 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:80
2220 msgid "Add another member"
2459 msgid "Add another member"
2221 msgstr ""
2460 msgstr ""
2222
2461
2223 #: rhodecode/templates/admin/repos/repo_edit_perms.html:97
2462 #: rhodecode/templates/admin/repos/repo_edit_perms.html:97
2224 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
2463 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:100
2225 msgid "Failed to remove user"
2464 msgid "Failed to remove user"
2226 msgstr ""
2465 msgstr ""
2227
2466
2228 #: rhodecode/templates/admin/repos/repo_edit_perms.html:112
2467 #: rhodecode/templates/admin/repos/repo_edit_perms.html:112
2229 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:103
2468 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:116
2230 msgid "Failed to remove users group"
2469 msgid "Failed to remove user group"
2231 msgstr ""
2470 msgstr ""
2232
2471
2233 #: rhodecode/templates/admin/repos/repos.html:5
2472 #: rhodecode/templates/admin/repos/repos.html:5
2234 msgid "Repositories administration"
2473 msgid "Repositories administration"
2235 msgstr ""
2474 msgstr ""
2236
2475
2237 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:73
2476 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:86
2238 msgid "apply to children"
2477 msgid "apply to children"
2239 msgstr ""
2478 msgstr ""
2240
2479
2241 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:74
2480 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
2242 msgid ""
2481 msgid ""
2243 "Set or revoke permission to all children of that group, including "
2482 "Set or revoke permission to all children of that group, including non-"
2244 "repositories and other groups"
2483 "private repositories and other groups"
2484 msgstr ""
2485
2486 #: rhodecode/templates/admin/repos_groups/repos_groups.html:4
2487 #, python-format
2488 msgid "%s Group Dashboard"
2245 msgstr ""
2489 msgstr ""
2246
2490
2247 #: rhodecode/templates/admin/repos_groups/repos_groups.html:9
2491 #: rhodecode/templates/admin/repos_groups/repos_groups.html:9
2248 #: rhodecode/templates/base/base.html:122
2249 #: rhodecode/templates/base/base.html:313
2250 #: rhodecode/templates/base/base.html:315
2251 #: rhodecode/templates/base/base.html:317
2252 #: rhodecode/templates/bookmarks/bookmarks.html:11
2253 #: rhodecode/templates/branches/branches.html:10
2254 #: rhodecode/templates/changelog/changelog.html:10
2255 #: rhodecode/templates/changeset/changeset.html:10
2256 #: rhodecode/templates/changeset/changeset_range.html:9
2257 #: rhodecode/templates/compare/compare_diff.html:9
2258 #: rhodecode/templates/files/file_diff.html:8
2259 #: rhodecode/templates/files/files.html:8
2260 #: rhodecode/templates/files/files_add.html:15
2261 #: rhodecode/templates/files/files_edit.html:15
2262 #: rhodecode/templates/followers/followers.html:9
2263 #: rhodecode/templates/forks/fork.html:9 rhodecode/templates/forks/forks.html:9
2264 #: rhodecode/templates/pullrequests/pullrequest.html:8
2265 #: rhodecode/templates/pullrequests/pullrequest_show.html:8
2266 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:8
2267 #: rhodecode/templates/settings/repo_settings.html:9
2268 #: rhodecode/templates/shortlog/shortlog.html:10
2269 #: rhodecode/templates/summary/summary.html:8
2270 #: rhodecode/templates/tags/tags.html:11
2271 msgid "Home"
2492 msgid "Home"
2272 msgstr ""
2493 msgstr ""
2273
2494
@@ -2276,80 +2497,78 b' msgid "with"'
2276 msgstr ""
2497 msgstr ""
2277
2498
2278 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5
2499 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5
2279 msgid "Add repos group"
2500 msgid "Add repository group"
2280 msgstr ""
2501 msgstr ""
2281
2502
2282 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:10
2503 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:11
2283 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:10
2504 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:11
2284 msgid "Repos groups"
2505 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:16
2285 msgstr ""
2506 #: rhodecode/templates/base/base.html:70 rhodecode/templates/base/base.html:82
2286
2507 msgid "Repository groups"
2287 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:12
2508 msgstr ""
2288 msgid "add new repos group"
2509
2289 msgstr ""
2510 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:13
2290
2511 msgid "Add new repository group"
2291 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:50
2512 msgstr ""
2292 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:50
2513
2514 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:51
2515 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:56
2293 msgid "Group parent"
2516 msgid "Group parent"
2294 msgstr ""
2517 msgstr ""
2295
2518
2296 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:58
2519 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:59
2297 #: rhodecode/templates/admin/users/user_add.html:94
2298 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
2299 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
2300 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
2301 msgid "save"
2520 msgid "save"
2302 msgstr ""
2521 msgstr ""
2303
2522
2304 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:5
2523 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:5
2305 msgid "Edit repos group"
2524 msgid "Edit repository group"
2306 msgstr ""
2525 msgstr ""
2307
2526
2308 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:12
2527 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:13
2309 msgid "edit repos group"
2528 #, python-format
2310 msgstr ""
2529 msgid "Edit repository group %s"
2311
2530 msgstr ""
2312 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:70
2531
2532 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:27
2533 msgid "Add child group"
2534 msgstr ""
2535
2536 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:76
2313 msgid ""
2537 msgid ""
2314 "Enable lock-by-pulling on group. This option will be applied to all other"
2538 "Enable lock-by-pulling on group. This option will be applied to all other"
2315 " groups and repositories inside"
2539 " groups and repositories inside"
2316 msgstr ""
2540 msgstr ""
2317
2541
2318 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5
2542 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5
2319 msgid "Repositories groups administration"
2543 msgid "Repository groups administration"
2320 msgstr ""
2544 msgstr ""
2321
2545
2322 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:22
2546 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:45
2323 msgid "ADD NEW GROUP"
2324 msgstr ""
2325
2326 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:35
2327 msgid "Number of toplevel repositories"
2547 msgid "Number of toplevel repositories"
2328 msgstr ""
2548 msgstr ""
2329
2549
2330 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:36
2550 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:64
2331 #: rhodecode/templates/admin/users/users.html:87
2551 msgid "Edit"
2332 #: rhodecode/templates/admin/users_groups/users_groups.html:35
2552 msgstr ""
2333 msgid "action"
2553
2334 msgstr ""
2554 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:65
2335
2555 #: rhodecode/templates/base/perms_summary.html:29
2336 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:55
2556 #: rhodecode/templates/base/perms_summary.html:48
2337 #: rhodecode/templates/admin/users/user_edit.html:259
2557 #: rhodecode/templates/base/perms_summary.html:50
2338 #: rhodecode/templates/admin/users_groups/users_groups.html:44
2558 #: rhodecode/templates/data_table/_dt_elements.html:116
2339 #: rhodecode/templates/data_table/_dt_elements.html:7
2559 #: rhodecode/templates/data_table/_dt_elements.html:117
2340 #: rhodecode/templates/data_table/_dt_elements.html:121
2560 msgid "edit"
2341 msgid "delete"
2561 msgstr ""
2342 msgstr ""
2562
2343
2563 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
2344 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:55
2345 #, python-format
2564 #, python-format
2346 msgid "Confirm to delete this group: %s with %s repository"
2565 msgid "Confirm to delete this group: %s with %s repository"
2347 msgid_plural "Confirm to delete this group: %s with %s repositories"
2566 msgid_plural "Confirm to delete this group: %s with %s repositories"
2348 msgstr[0] ""
2567 msgstr[0] ""
2349 msgstr[1] ""
2568 msgstr[1] ""
2350
2569
2351 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:63
2570 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:78
2352 msgid "There are no repositories groups yet"
2571 msgid "There are no repository groups yet"
2353 msgstr ""
2572 msgstr ""
2354
2573
2355 #: rhodecode/templates/admin/settings/hooks.html:5
2574 #: rhodecode/templates/admin/settings/hooks.html:5
@@ -2357,12 +2576,6 b' msgstr ""'
2357 msgid "Settings administration"
2576 msgid "Settings administration"
2358 msgstr ""
2577 msgstr ""
2359
2578
2360 #: rhodecode/templates/admin/settings/hooks.html:9
2361 #: rhodecode/templates/admin/settings/settings.html:9
2362 #: rhodecode/templates/settings/repo_settings.html:13
2363 msgid "Settings"
2364 msgstr ""
2365
2366 #: rhodecode/templates/admin/settings/hooks.html:24
2579 #: rhodecode/templates/admin/settings/hooks.html:24
2367 msgid "Built in hooks - read only"
2580 msgid "Built in hooks - read only"
2368 msgstr ""
2581 msgstr ""
@@ -2379,205 +2592,210 b' msgstr ""'
2379 msgid "Failed to remove hook"
2592 msgid "Failed to remove hook"
2380 msgstr ""
2593 msgstr ""
2381
2594
2382 #: rhodecode/templates/admin/settings/settings.html:24
2595 #: rhodecode/templates/admin/settings/settings.html:26
2383 msgid "Remap and rescan repositories"
2596 msgid "Remap and rescan repositories"
2384 msgstr ""
2597 msgstr ""
2385
2598
2386 #: rhodecode/templates/admin/settings/settings.html:32
2599 #: rhodecode/templates/admin/settings/settings.html:34
2387 msgid "rescan option"
2600 msgid "Rescan option"
2388 msgstr ""
2601 msgstr ""
2389
2602
2390 #: rhodecode/templates/admin/settings/settings.html:38
2603 #: rhodecode/templates/admin/settings/settings.html:40
2391 msgid ""
2604 msgid ""
2392 "In case a repository was deleted from filesystem and there are leftovers "
2605 "In case a repository was deleted from filesystem and there are leftovers "
2393 "in the database check this option to scan obsolete data in database and "
2606 "in the database check this option to scan obsolete data in database and "
2394 "remove it."
2607 "remove it."
2395 msgstr ""
2608 msgstr ""
2396
2609
2397 #: rhodecode/templates/admin/settings/settings.html:39
2398 msgid "destroy old data"
2399 msgstr ""
2400
2401 #: rhodecode/templates/admin/settings/settings.html:41
2610 #: rhodecode/templates/admin/settings/settings.html:41
2611 msgid "Destroy old data"
2612 msgstr ""
2613
2614 #: rhodecode/templates/admin/settings/settings.html:43
2402 msgid ""
2615 msgid ""
2403 "Rescan repositories location for new repositories. Also deletes obsolete "
2616 "Rescan repositories location for new repositories. Also deletes obsolete "
2404 "if `destroy` flag is checked "
2617 "if `destroy` flag is checked "
2405 msgstr ""
2618 msgstr ""
2406
2619
2407 #: rhodecode/templates/admin/settings/settings.html:46
2620 #: rhodecode/templates/admin/settings/settings.html:48
2408 msgid "Rescan repositories"
2621 msgid "Rescan repositories"
2409 msgstr ""
2622 msgstr ""
2410
2623
2411 #: rhodecode/templates/admin/settings/settings.html:52
2624 #: rhodecode/templates/admin/settings/settings.html:54
2412 msgid "Whoosh indexing"
2625 msgid "Whoosh indexing"
2413 msgstr ""
2626 msgstr ""
2414
2627
2415 #: rhodecode/templates/admin/settings/settings.html:60
2628 #: rhodecode/templates/admin/settings/settings.html:62
2416 msgid "index build option"
2629 msgid "Index build option"
2417 msgstr ""
2630 msgstr ""
2418
2631
2419 #: rhodecode/templates/admin/settings/settings.html:65
2632 #: rhodecode/templates/admin/settings/settings.html:67
2420 msgid "build from scratch"
2633 msgid "Build from scratch"
2421 msgstr ""
2634 msgstr ""
2422
2635
2423 #: rhodecode/templates/admin/settings/settings.html:71
2636 #: rhodecode/templates/admin/settings/settings.html:73
2424 msgid "Reindex"
2637 msgid "Reindex"
2425 msgstr ""
2638 msgstr ""
2426
2639
2427 #: rhodecode/templates/admin/settings/settings.html:77
2640 #: rhodecode/templates/admin/settings/settings.html:79
2428 msgid "Global application settings"
2641 msgid "Global application settings"
2429 msgstr ""
2642 msgstr ""
2430
2643
2431 #: rhodecode/templates/admin/settings/settings.html:86
2644 #: rhodecode/templates/admin/settings/settings.html:88
2432 msgid "Application name"
2645 msgid "Site branding"
2433 msgstr ""
2646 msgstr ""
2434
2647
2435 #: rhodecode/templates/admin/settings/settings.html:95
2648 #: rhodecode/templates/admin/settings/settings.html:97
2436 msgid "Realm text"
2649 msgid "HTTP authentication realm"
2437 msgstr ""
2650 msgstr ""
2438
2651
2439 #: rhodecode/templates/admin/settings/settings.html:104
2652 #: rhodecode/templates/admin/settings/settings.html:106
2440 msgid "GA code"
2653 msgid "Google Analytics code"
2441 msgstr ""
2654 msgstr ""
2442
2655
2443 #: rhodecode/templates/admin/settings/settings.html:112
2656 #: rhodecode/templates/admin/settings/settings.html:114
2444 #: rhodecode/templates/admin/settings/settings.html:178
2657 #: rhodecode/templates/admin/settings/settings.html:186
2445 #: rhodecode/templates/admin/settings/settings.html:268
2658 #: rhodecode/templates/admin/settings/settings.html:277
2446 msgid "Save settings"
2659 msgid "Save settings"
2447 msgstr ""
2660 msgstr ""
2448
2661
2449 #: rhodecode/templates/admin/settings/settings.html:119
2662 #: rhodecode/templates/admin/settings/settings.html:121
2450 msgid "Visualisation settings"
2663 msgid "Visualisation settings"
2451 msgstr ""
2664 msgstr ""
2452
2665
2453 #: rhodecode/templates/admin/settings/settings.html:127
2666 #: rhodecode/templates/admin/settings/settings.html:129
2454 msgid "General"
2667 msgid "General"
2455 msgstr ""
2668 msgstr ""
2456
2669
2457 #: rhodecode/templates/admin/settings/settings.html:132
2670 #: rhodecode/templates/admin/settings/settings.html:134
2458 msgid "Use lightweight dashboard"
2671 msgid "Use lightweight dashboard"
2459 msgstr ""
2672 msgstr ""
2460
2673
2461 #: rhodecode/templates/admin/settings/settings.html:139
2674 #: rhodecode/templates/admin/settings/settings.html:140
2675 msgid "Use repository extra fields"
2676 msgstr ""
2677
2678 #: rhodecode/templates/admin/settings/settings.html:147
2462 msgid "Icons"
2679 msgid "Icons"
2463 msgstr ""
2680 msgstr ""
2464
2681
2465 #: rhodecode/templates/admin/settings/settings.html:144
2682 #: rhodecode/templates/admin/settings/settings.html:152
2466 msgid "Show public repo icon on repositories"
2683 msgid "Show public repo icon on repositories"
2467 msgstr ""
2684 msgstr ""
2468
2685
2469 #: rhodecode/templates/admin/settings/settings.html:148
2686 #: rhodecode/templates/admin/settings/settings.html:156
2470 msgid "Show private repo icon on repositories"
2687 msgid "Show private repo icon on repositories"
2471 msgstr ""
2688 msgstr ""
2472
2689
2473 #: rhodecode/templates/admin/settings/settings.html:155
2690 #: rhodecode/templates/admin/settings/settings.html:163
2474 msgid "Meta-Tagging"
2691 msgid "Meta-Tagging"
2475 msgstr ""
2692 msgstr ""
2476
2693
2477 #: rhodecode/templates/admin/settings/settings.html:160
2694 #: rhodecode/templates/admin/settings/settings.html:168
2478 msgid "Stylify recognised metatags:"
2695 msgid "Stylify recognised metatags:"
2479 msgstr ""
2696 msgstr ""
2480
2697
2481 #: rhodecode/templates/admin/settings/settings.html:187
2698 #: rhodecode/templates/admin/settings/settings.html:195
2482 msgid "VCS settings"
2699 msgid "VCS settings"
2483 msgstr ""
2700 msgstr ""
2484
2701
2485 #: rhodecode/templates/admin/settings/settings.html:196
2702 #: rhodecode/templates/admin/settings/settings.html:204
2486 msgid "Web"
2703 msgid "Web"
2487 msgstr ""
2704 msgstr ""
2488
2705
2489 #: rhodecode/templates/admin/settings/settings.html:201
2706 #: rhodecode/templates/admin/settings/settings.html:209
2490 msgid "require ssl for vcs operations"
2707 msgid "Require SSL for vcs operations"
2491 msgstr ""
2708 msgstr ""
2492
2709
2493 #: rhodecode/templates/admin/settings/settings.html:203
2710 #: rhodecode/templates/admin/settings/settings.html:211
2494 msgid ""
2711 msgid ""
2495 "RhodeCode will require SSL for pushing or pulling. If SSL is missing it "
2712 "RhodeCode will require SSL for pushing or pulling. If SSL is missing it "
2496 "will return HTTP Error 406: Not Acceptable"
2713 "will return HTTP Error 406: Not Acceptable"
2497 msgstr ""
2714 msgstr ""
2498
2715
2499 #: rhodecode/templates/admin/settings/settings.html:209
2716 #: rhodecode/templates/admin/settings/settings.html:217
2500 msgid "Hooks"
2717 msgid "Hooks"
2501 msgstr ""
2718 msgstr ""
2502
2719
2503 #: rhodecode/templates/admin/settings/settings.html:214
2504 msgid "Update repository after push (hg update)"
2505 msgstr ""
2506
2507 #: rhodecode/templates/admin/settings/settings.html:218
2508 msgid "Show repository size after push"
2509 msgstr ""
2510
2511 #: rhodecode/templates/admin/settings/settings.html:222
2720 #: rhodecode/templates/admin/settings/settings.html:222
2512 msgid "Log user push commands"
2721 msgid "Update repository after push (hg update)"
2513 msgstr ""
2722 msgstr ""
2514
2723
2515 #: rhodecode/templates/admin/settings/settings.html:226
2724 #: rhodecode/templates/admin/settings/settings.html:226
2516 msgid "Log user pull commands"
2725 msgid "Show repository size after push"
2517 msgstr ""
2726 msgstr ""
2518
2727
2519 #: rhodecode/templates/admin/settings/settings.html:230
2728 #: rhodecode/templates/admin/settings/settings.html:230
2520 msgid "advanced setup"
2729 msgid "Log user push commands"
2521 msgstr ""
2730 msgstr ""
2522
2731
2523 #: rhodecode/templates/admin/settings/settings.html:235
2732 #: rhodecode/templates/admin/settings/settings.html:234
2733 msgid "Log user pull commands"
2734 msgstr ""
2735
2736 #: rhodecode/templates/admin/settings/settings.html:238
2737 msgid "Advanced setup"
2738 msgstr ""
2739
2740 #: rhodecode/templates/admin/settings/settings.html:243
2524 msgid "Mercurial Extensions"
2741 msgid "Mercurial Extensions"
2525 msgstr ""
2742 msgstr ""
2526
2743
2527 #: rhodecode/templates/admin/settings/settings.html:240
2744 #: rhodecode/templates/admin/settings/settings.html:248
2528 msgid "largefiles extensions"
2745 msgid "Enable largefiles extension"
2529 msgstr ""
2746 msgstr ""
2530
2747
2531 #: rhodecode/templates/admin/settings/settings.html:244
2748 #: rhodecode/templates/admin/settings/settings.html:252
2532 msgid "hgsubversion extensions"
2749 msgid "Enable hgsubversion extension"
2533 msgstr ""
2750 msgstr ""
2534
2751
2535 #: rhodecode/templates/admin/settings/settings.html:246
2752 #: rhodecode/templates/admin/settings/settings.html:254
2536 msgid ""
2753 msgid ""
2537 "Requires hgsubversion library installed. Allows clonning from svn remote "
2754 "Requires hgsubversion library installed. Allows cloning from svn remote "
2538 "locations"
2755 "locations"
2539 msgstr ""
2756 msgstr ""
2540
2757
2541 #: rhodecode/templates/admin/settings/settings.html:256
2758 #: rhodecode/templates/admin/settings/settings.html:264
2542 msgid "Repositories location"
2759 msgid "Repositories location"
2543 msgstr ""
2760 msgstr ""
2544
2761
2545 #: rhodecode/templates/admin/settings/settings.html:261
2762 #: rhodecode/templates/admin/settings/settings.html:269
2546 msgid ""
2763 msgid ""
2547 "This a crucial application setting. If you are really sure you need to "
2764 "This a crucial application setting. If you are really sure you need to "
2548 "change this, you must restart application in order to make this setting "
2765 "change this, you must restart application in order to make this setting "
2549 "take effect. Click this label to unlock."
2766 "take effect. Click this label to unlock."
2550 msgstr ""
2767 msgstr ""
2551
2768
2552 #: rhodecode/templates/admin/settings/settings.html:262
2769 #: rhodecode/templates/admin/settings/settings.html:270
2553 #: rhodecode/templates/base/base.html:221
2770 #: rhodecode/templates/base/base.html:131
2554 msgid "unlock"
2771 msgid "Unlock"
2555 msgstr ""
2772 msgstr ""
2556
2773
2557 #: rhodecode/templates/admin/settings/settings.html:263
2774 #: rhodecode/templates/admin/settings/settings.html:272
2558 msgid ""
2775 msgid ""
2559 "Location where repositories are stored. After changing this value a "
2776 "Location where repositories are stored. After changing this value a "
2560 "restart, and rescan is required"
2777 "restart, and rescan is required"
2561 msgstr ""
2778 msgstr ""
2562
2779
2563 #: rhodecode/templates/admin/settings/settings.html:283
2780 #: rhodecode/templates/admin/settings/settings.html:292
2564 msgid "Test Email"
2781 msgid "Test Email"
2565 msgstr ""
2782 msgstr ""
2566
2783
2567 #: rhodecode/templates/admin/settings/settings.html:291
2784 #: rhodecode/templates/admin/settings/settings.html:300
2568 msgid "Email to"
2785 msgid "Email to"
2569 msgstr ""
2786 msgstr ""
2570
2787
2571 #: rhodecode/templates/admin/settings/settings.html:299
2572 msgid "Send"
2573 msgstr ""
2574
2575 #: rhodecode/templates/admin/settings/settings.html:305
2576 msgid "System Info and Packages"
2577 msgstr ""
2578
2579 #: rhodecode/templates/admin/settings/settings.html:308
2788 #: rhodecode/templates/admin/settings/settings.html:308
2580 msgid "show"
2789 msgid "Send"
2790 msgstr ""
2791
2792 #: rhodecode/templates/admin/settings/settings.html:314
2793 msgid "System Info and Packages"
2794 msgstr ""
2795
2796 #: rhodecode/templates/admin/settings/settings.html:317
2797 #: rhodecode/templates/changelog/changelog.html:42
2798 msgid "Show"
2581 msgstr ""
2799 msgstr ""
2582
2800
2583 #: rhodecode/templates/admin/users/user_add.html:5
2801 #: rhodecode/templates/admin/users/user_add.html:5
@@ -2586,11 +2804,13 b' msgstr ""'
2586
2804
2587 #: rhodecode/templates/admin/users/user_add.html:10
2805 #: rhodecode/templates/admin/users/user_add.html:10
2588 #: rhodecode/templates/admin/users/user_edit.html:11
2806 #: rhodecode/templates/admin/users/user_edit.html:11
2807 #: rhodecode/templates/base/base.html:71
2589 msgid "Users"
2808 msgid "Users"
2590 msgstr ""
2809 msgstr ""
2591
2810
2592 #: rhodecode/templates/admin/users/user_add.html:12
2811 #: rhodecode/templates/admin/users/user_add.html:12
2593 msgid "add new user"
2812 #: rhodecode/templates/admin/users/users.html:23
2813 msgid "Add new user"
2594 msgstr ""
2814 msgstr ""
2595
2815
2596 #: rhodecode/templates/admin/users/user_add.html:50
2816 #: rhodecode/templates/admin/users/user_add.html:50
@@ -2601,6 +2821,12 b' msgstr ""'
2601 msgid "Edit user"
2821 msgid "Edit user"
2602 msgstr ""
2822 msgstr ""
2603
2823
2824 #: rhodecode/templates/admin/users/user_edit.html:13
2825 #: rhodecode/templates/admin/users_groups/users_group_edit.html:13
2826 #, python-format
2827 msgid "Edit %s"
2828 msgstr ""
2829
2604 #: rhodecode/templates/admin/users/user_edit.html:34
2830 #: rhodecode/templates/admin/users/user_edit.html:34
2605 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:10
2831 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:10
2606 msgid "Change your avatar at"
2832 msgid "Change your avatar at"
@@ -2616,26 +2842,31 b' msgstr ""'
2616 msgid "API key"
2842 msgid "API key"
2617 msgstr ""
2843 msgstr ""
2618
2844
2619 #: rhodecode/templates/admin/users/user_edit.html:63
2845 #: rhodecode/templates/admin/users/user_edit.html:50
2846 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:25
2847 msgid "Current IP"
2848 msgstr ""
2849
2850 #: rhodecode/templates/admin/users/user_edit.html:70
2620 msgid "LDAP DN"
2851 msgid "LDAP DN"
2621 msgstr ""
2852 msgstr ""
2622
2853
2623 #: rhodecode/templates/admin/users/user_edit.html:72
2854 #: rhodecode/templates/admin/users/user_edit.html:79
2624 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:35
2855 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:44
2625 msgid "New password"
2856 msgid "New password"
2626 msgstr ""
2857 msgstr ""
2627
2858
2628 #: rhodecode/templates/admin/users/user_edit.html:81
2859 #: rhodecode/templates/admin/users/user_edit.html:88
2629 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:44
2860 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:53
2630 msgid "New password confirmation"
2861 msgid "New password confirmation"
2631 msgstr ""
2862 msgstr ""
2632
2863
2633 #: rhodecode/templates/admin/users/user_edit.html:151
2864 #: rhodecode/templates/admin/users/user_edit.html:158
2634 #: rhodecode/templates/admin/users_groups/users_group_edit.html:108
2865 #: rhodecode/templates/admin/users_groups/users_group_edit.html:108
2635 msgid "Inherit default permissions"
2866 msgid "Inherit default permissions"
2636 msgstr ""
2867 msgstr ""
2637
2868
2638 #: rhodecode/templates/admin/users/user_edit.html:156
2869 #: rhodecode/templates/admin/users/user_edit.html:163
2639 #: rhodecode/templates/admin/users_groups/users_group_edit.html:113
2870 #: rhodecode/templates/admin/users_groups/users_group_edit.html:113
2640 #, python-format
2871 #, python-format
2641 msgid ""
2872 msgid ""
@@ -2643,53 +2874,31 b' msgid ""'
2643 "options does not have any action"
2874 "options does not have any action"
2644 msgstr ""
2875 msgstr ""
2645
2876
2646 #: rhodecode/templates/admin/users/user_edit.html:162
2877 #: rhodecode/templates/admin/users/user_edit.html:169
2647 #: rhodecode/templates/admin/users_groups/users_group_edit.html:119
2878 #: rhodecode/templates/admin/users_groups/users_group_edit.html:119
2648 msgid "Create repositories"
2879 msgid "Create repositories"
2649 msgstr ""
2880 msgstr ""
2650
2881
2651 #: rhodecode/templates/admin/users/user_edit.html:170
2882 #: rhodecode/templates/admin/users/user_edit.html:177
2652 #: rhodecode/templates/admin/users_groups/users_group_edit.html:127
2883 #: rhodecode/templates/admin/users_groups/users_group_edit.html:127
2653 msgid "Fork repositories"
2884 msgid "Fork repositories"
2654 msgstr ""
2885 msgstr ""
2655
2886
2656 #: rhodecode/templates/admin/users/user_edit.html:190
2887 #: rhodecode/templates/admin/users/user_edit.html:200
2657 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:22
2658 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:39
2659 msgid "Nothing here yet"
2660 msgstr ""
2661
2662 #: rhodecode/templates/admin/users/user_edit.html:197
2663 #: rhodecode/templates/admin/users/user_edit_my_account.html:60
2664 #: rhodecode/templates/admin/users/user_edit_my_account.html:217
2665 #: rhodecode/templates/admin/users_groups/users_group_edit.html:185
2666 msgid "Permission"
2667 msgstr ""
2668
2669 #: rhodecode/templates/admin/users/user_edit.html:198
2670 #: rhodecode/templates/admin/users_groups/users_group_edit.html:186
2671 msgid "Edit Permission"
2672 msgstr ""
2673
2674 #: rhodecode/templates/admin/users/user_edit.html:247
2675 msgid "Email addresses"
2888 msgid "Email addresses"
2676 msgstr ""
2889 msgstr ""
2677
2890
2678 #: rhodecode/templates/admin/users/user_edit.html:260
2891 #: rhodecode/templates/admin/users/user_edit.html:213
2679 #, python-format
2892 #, python-format
2680 msgid "Confirm to delete this email: %s"
2893 msgid "Confirm to delete this email: %s"
2681 msgstr ""
2894 msgstr ""
2682
2895
2683 #: rhodecode/templates/admin/users/user_edit.html:274
2896 #: rhodecode/templates/admin/users/user_edit.html:227
2684 msgid "New email address"
2897 msgid "New email address"
2685 msgstr ""
2898 msgstr ""
2686
2899
2687 #: rhodecode/templates/admin/users/user_edit.html:281
2688 msgid "Add"
2689 msgstr ""
2690
2691 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
2900 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
2692 #: rhodecode/templates/base/base.html:124
2901 #: rhodecode/templates/base/base.html:242
2693 msgid "My account"
2902 msgid "My account"
2694 msgstr ""
2903 msgstr ""
2695
2904
@@ -2702,7 +2911,7 b' msgid "My permissions"'
2702 msgstr ""
2911 msgstr ""
2703
2912
2704 #: rhodecode/templates/admin/users/user_edit_my_account.html:38
2913 #: rhodecode/templates/admin/users/user_edit_my_account.html:38
2705 #: rhodecode/templates/journal/journal.html:49
2914 #: rhodecode/templates/journal/journal.html:54
2706 msgid "My repos"
2915 msgid "My repos"
2707 msgstr ""
2916 msgstr ""
2708
2917
@@ -2710,132 +2919,97 b' msgstr ""'
2710 msgid "My pull requests"
2919 msgid "My pull requests"
2711 msgstr ""
2920 msgstr ""
2712
2921
2713 #: rhodecode/templates/admin/users/user_edit_my_account.html:45
2714 msgid "Add repo"
2715 msgstr ""
2716
2717 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:2
2922 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:2
2923 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:4
2924 msgid "Show closed pull requests"
2925 msgstr ""
2926
2927 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:6
2718 msgid "Opened by me"
2928 msgid "Opened by me"
2719 msgstr ""
2929 msgstr ""
2720
2930
2721 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:10
2722 #, python-format
2723 msgid "Pull request #%s opened on %s"
2724 msgstr ""
2725
2726 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:15
2931 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:15
2932 #, python-format
2933 msgid "Pull request #%s opened on %s"
2934 msgstr ""
2935
2936 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:17
2937 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:45
2938 #: rhodecode/templates/pullrequests/pullrequest_data.html:7
2939 #: rhodecode/templates/pullrequests/pullrequest_show.html:27
2940 #: rhodecode/templates/pullrequests/pullrequest_show.html:42
2941 msgid "Closed"
2942 msgstr ""
2943
2944 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:23
2727 msgid "Confirm to delete this pull request"
2945 msgid "Confirm to delete this pull request"
2728 msgstr ""
2946 msgstr ""
2729
2947
2730 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:26
2948 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:30
2949 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:51
2950 msgid "Nothing here yet"
2951 msgstr ""
2952
2953 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:34
2731 msgid "I participate in"
2954 msgid "I participate in"
2732 msgstr ""
2955 msgstr ""
2733
2956
2734 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:33
2957 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:42
2735 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:30
2958 #: rhodecode/templates/pullrequests/pullrequest_data.html:11
2736 #, python-format
2959 #, python-format
2737 msgid "Pull request #%s opened by %s on %s"
2960 msgid "Pull request #%s opened by %s on %s"
2738 msgstr ""
2961 msgstr ""
2739
2962
2740 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:7
2741 #: rhodecode/templates/bookmarks/bookmarks.html:40
2742 #: rhodecode/templates/bookmarks/bookmarks_data.html:9
2743 #: rhodecode/templates/branches/branches.html:54
2744 #: rhodecode/templates/branches/branches_data.html:9
2745 #: rhodecode/templates/journal/journal_page_repos.html:8
2746 #: rhodecode/templates/tags/tags.html:55
2747 #: rhodecode/templates/tags/tags_data.html:9
2748 msgid "Revision"
2749 msgstr ""
2750
2751 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:28
2752 #: rhodecode/templates/journal/journal_page_repos.html:29
2753 msgid "private"
2754 msgstr ""
2755
2756 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:31
2757 #: rhodecode/templates/data_table/_dt_elements.html:7
2758 #: rhodecode/templates/journal/journal_page_repos.html:32
2759 #, python-format
2760 msgid "Confirm to delete this repository: %s"
2761 msgstr ""
2762
2763 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:38
2764 #: rhodecode/templates/journal/journal_page_repos.html:42
2765 msgid "No repositories yet"
2766 msgstr ""
2767
2768 #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:40
2769 #: rhodecode/templates/journal/journal_page_repos.html:44
2770 msgid "create one now"
2771 msgstr ""
2772
2773 #: rhodecode/templates/admin/users/users.html:5
2963 #: rhodecode/templates/admin/users/users.html:5
2774 msgid "Users administration"
2964 msgid "Users administration"
2775 msgstr ""
2965 msgstr ""
2776
2966
2777 #: rhodecode/templates/admin/users/users.html:9
2967 #: rhodecode/templates/admin/users/users.html:9
2778 #: rhodecode/templates/base/base.html:235
2779 msgid "users"
2968 msgid "users"
2780 msgstr ""
2969 msgstr ""
2781
2970
2782 #: rhodecode/templates/admin/users/users.html:23
2783 msgid "ADD NEW USER"
2784 msgstr ""
2785
2786 #: rhodecode/templates/admin/users/users.html:77
2787 msgid "username"
2788 msgstr ""
2789
2790 #: rhodecode/templates/admin/users/users.html:80
2971 #: rhodecode/templates/admin/users/users.html:80
2791 msgid "firstname"
2972 msgid "Firstname"
2792 msgstr ""
2973 msgstr ""
2793
2974
2794 #: rhodecode/templates/admin/users/users.html:81
2975 #: rhodecode/templates/admin/users/users.html:81
2795 msgid "lastname"
2976 msgid "Lastname"
2796 msgstr ""
2977 msgstr ""
2797
2978
2798 #: rhodecode/templates/admin/users/users.html:82
2979 #: rhodecode/templates/admin/users/users.html:82
2799 msgid "last login"
2980 msgid "Last login"
2800 msgstr ""
2801
2802 #: rhodecode/templates/admin/users/users.html:84
2803 #: rhodecode/templates/admin/users_groups/users_groups.html:34
2804 msgid "active"
2805 msgstr ""
2806
2807 #: rhodecode/templates/admin/users/users.html:86
2808 #: rhodecode/templates/base/base.html:238
2809 msgid "ldap"
2810 msgstr ""
2981 msgstr ""
2811
2982
2812 #: rhodecode/templates/admin/users_groups/users_group_add.html:5
2983 #: rhodecode/templates/admin/users_groups/users_group_add.html:5
2813 msgid "Add users group"
2984 msgid "Add user group"
2814 msgstr ""
2985 msgstr ""
2815
2986
2816 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
2987 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
2817 #: rhodecode/templates/admin/users_groups/users_groups.html:9
2988 #: rhodecode/templates/admin/users_groups/users_groups.html:11
2818 msgid "Users groups"
2989 #: rhodecode/templates/base/base.html:72
2990 msgid "User groups"
2819 msgstr ""
2991 msgstr ""
2820
2992
2821 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
2993 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
2822 msgid "add new users group"
2994 #: rhodecode/templates/admin/users_groups/users_groups.html:25
2995 msgid "Add new user group"
2823 msgstr ""
2996 msgstr ""
2824
2997
2825 #: rhodecode/templates/admin/users_groups/users_group_edit.html:5
2998 #: rhodecode/templates/admin/users_groups/users_group_edit.html:5
2826 msgid "Edit users group"
2999 msgid "Edit user group"
2827 msgstr ""
3000 msgstr ""
2828
3001
2829 #: rhodecode/templates/admin/users_groups/users_group_edit.html:11
3002 #: rhodecode/templates/admin/users_groups/users_group_edit.html:11
2830 msgid "UsersGroups"
3003 msgid "UserGroups"
2831 msgstr ""
3004 msgstr ""
2832
3005
2833 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
3006 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
3007 #: rhodecode/templates/admin/users_groups/users_groups.html:35
2834 msgid "Members"
3008 msgid "Members"
2835 msgstr ""
3009 msgstr ""
2836
3010
2837 #: rhodecode/templates/admin/users_groups/users_group_edit.html:58
3011 #: rhodecode/templates/admin/users_groups/users_group_edit.html:58
2838 msgid "Choosen group members"
3012 msgid "Chosen group members"
2839 msgstr ""
3013 msgstr ""
2840
3014
2841 #: rhodecode/templates/admin/users_groups/users_group_edit.html:61
3015 #: rhodecode/templates/admin/users_groups/users_group_edit.html:61
@@ -2850,262 +3024,261 b' msgstr ""'
2850 msgid "Add all elements"
3024 msgid "Add all elements"
2851 msgstr ""
3025 msgstr ""
2852
3026
2853 #: rhodecode/templates/admin/users_groups/users_group_edit.html:146
3027 #: rhodecode/templates/admin/users_groups/users_group_edit.html:150
2854 msgid "Group members"
3028 msgid "Group members"
2855 msgstr ""
3029 msgstr ""
2856
3030
2857 #: rhodecode/templates/admin/users_groups/users_group_edit.html:163
3031 #: rhodecode/templates/admin/users_groups/users_group_edit.html:167
2858 msgid "No members yet"
3032 msgid "No members yet"
2859 msgstr ""
3033 msgstr ""
2860
3034
2861 #: rhodecode/templates/admin/users_groups/users_group_edit.html:171
2862 msgid "Permissions defined for this group"
2863 msgstr ""
2864
2865 #: rhodecode/templates/admin/users_groups/users_group_edit.html:178
2866 msgid "No permissions set yet"
2867 msgstr ""
2868
2869 #: rhodecode/templates/admin/users_groups/users_groups.html:5
3035 #: rhodecode/templates/admin/users_groups/users_groups.html:5
2870 msgid "Users groups administration"
3036 msgid "User groups administration"
2871 msgstr ""
3037 msgstr ""
2872
3038
2873 #: rhodecode/templates/admin/users_groups/users_groups.html:23
3039 #: rhodecode/templates/admin/users_groups/users_groups.html:47
2874 msgid "ADD NEW USER GROUP"
3040 #, fuzzy, python-format
2875 msgstr ""
3041 msgid "Confirm to delete this user group: %s"
2876
3042 msgstr ""
2877 #: rhodecode/templates/admin/users_groups/users_groups.html:32
3043
2878 msgid "group name"
3044 #: rhodecode/templates/base/base.html:42
2879 msgstr ""
2880
2881 #: rhodecode/templates/admin/users_groups/users_groups.html:33
2882 #: rhodecode/templates/base/root.html:46
2883 msgid "members"
2884 msgstr ""
2885
2886 #: rhodecode/templates/admin/users_groups/users_groups.html:45
2887 #, python-format
2888 msgid "Confirm to delete this users group: %s"
2889 msgstr ""
2890
2891 #: rhodecode/templates/base/base.html:41
2892 msgid "Submit a bug"
3045 msgid "Submit a bug"
2893 msgstr ""
3046 msgstr ""
2894
3047
2895 #: rhodecode/templates/base/base.html:77
3048 #: rhodecode/templates/base/base.html:108
2896 msgid "Login to your account"
3049 #: rhodecode/templates/data_table/_dt_elements.html:9
2897 msgstr ""
3050 #: rhodecode/templates/data_table/_dt_elements.html:11
2898
3051 #: rhodecode/templates/data_table/_dt_elements.html:13
2899 #: rhodecode/templates/base/base.html:100
3052 #: rhodecode/templates/pullrequests/pullrequest_show.html:81
2900 msgid "Forgot password ?"
3053 #: rhodecode/templates/summary/summary.html:8
2901 msgstr ""
3054 msgid "Summary"
2902
3055 msgstr ""
2903 #: rhodecode/templates/base/base.html:107
3056
2904 msgid "Log In"
3057 #: rhodecode/templates/base/base.html:109
3058 #: rhodecode/templates/changelog/changelog.html:11
3059 #: rhodecode/templates/data_table/_dt_elements.html:17
3060 #: rhodecode/templates/data_table/_dt_elements.html:19
3061 #: rhodecode/templates/data_table/_dt_elements.html:21
3062 msgid "Changelog"
3063 msgstr ""
3064
3065 #: rhodecode/templates/base/base.html:110
3066 #: rhodecode/templates/data_table/_dt_elements.html:25
3067 #: rhodecode/templates/data_table/_dt_elements.html:27
3068 #: rhodecode/templates/data_table/_dt_elements.html:29
3069 #: rhodecode/templates/files/files.html:12
3070 msgid "Files"
3071 msgstr ""
3072
3073 #: rhodecode/templates/base/base.html:112
3074 msgid "Switch To"
3075 msgstr ""
3076
3077 #: rhodecode/templates/base/base.html:114
3078 #: rhodecode/templates/base/base.html:267
3079 msgid "loading..."
2905 msgstr ""
3080 msgstr ""
2906
3081
2907 #: rhodecode/templates/base/base.html:118
3082 #: rhodecode/templates/base/base.html:118
2908 msgid "Inbox"
3083 msgid "Options"
2909 msgstr ""
3084 msgstr ""
2910
3085
2911 #: rhodecode/templates/base/base.html:123
3086 #: rhodecode/templates/base/base.html:124
2912 #: rhodecode/templates/base/base.html:322
3087 #: rhodecode/templates/forks/forks_data.html:21
2913 #: rhodecode/templates/base/base.html:324
3088 msgid "Compare fork"
2914 #: rhodecode/templates/base/base.html:326
3089 msgstr ""
2915 #: rhodecode/templates/journal/journal.html:4
3090
2916 #: rhodecode/templates/journal/public_journal.html:4
3091 #: rhodecode/templates/base/base.html:126
2917 msgid "Journal"
3092 msgid "Lightweight changelog"
2918 msgstr ""
3093 msgstr ""
2919
3094
2920 #: rhodecode/templates/base/base.html:125
3095 #: rhodecode/templates/base/base.html:127
2921 msgid "Log Out"
3096 #: rhodecode/templates/base/base.html:287
2922 msgstr ""
3097 #: rhodecode/templates/search/search.html:14
2923
3098 #: rhodecode/templates/search/search.html:54
2924 #: rhodecode/templates/base/base.html:144
3099 msgid "Search"
2925 msgid "Switch repository"
3100 msgstr ""
2926 msgstr ""
3101
2927
3102 #: rhodecode/templates/base/base.html:133
2928 #: rhodecode/templates/base/base.html:146
3103 msgid "Lock"
2929 msgid "Products"
3104 msgstr ""
2930 msgstr ""
3105
2931
3106 #: rhodecode/templates/base/base.html:141
2932 #: rhodecode/templates/base/base.html:152
3107 msgid "Follow"
2933 #: rhodecode/templates/base/base.html:182 rhodecode/templates/base/root.html:47
3108 msgstr ""
2934 msgid "loading..."
3109
2935 msgstr ""
3110 #: rhodecode/templates/base/base.html:142
2936
3111 msgid "Unfollow"
2937 #: rhodecode/templates/base/base.html:158
3112 msgstr ""
2938 #: rhodecode/templates/base/base.html:160
3113
2939 #: rhodecode/templates/base/base.html:162
3114 #: rhodecode/templates/base/base.html:145
2940 #: rhodecode/templates/data_table/_dt_elements.html:15
2941 #: rhodecode/templates/data_table/_dt_elements.html:17
2942 #: rhodecode/templates/data_table/_dt_elements.html:19
2943 msgid "Summary"
2944 msgstr ""
2945
2946 #: rhodecode/templates/base/base.html:166
2947 #: rhodecode/templates/base/base.html:168
2948 #: rhodecode/templates/base/base.html:170
2949 #: rhodecode/templates/changelog/changelog.html:15
2950 #: rhodecode/templates/data_table/_dt_elements.html:23
2951 #: rhodecode/templates/data_table/_dt_elements.html:25
2952 #: rhodecode/templates/data_table/_dt_elements.html:27
2953 msgid "Changelog"
2954 msgstr ""
2955
2956 #: rhodecode/templates/base/base.html:175
2957 #: rhodecode/templates/base/base.html:177
2958 #: rhodecode/templates/base/base.html:179
2959 msgid "Switch to"
2960 msgstr ""
2961
2962 #: rhodecode/templates/base/base.html:186
2963 #: rhodecode/templates/base/base.html:188
2964 #: rhodecode/templates/base/base.html:190
2965 #: rhodecode/templates/data_table/_dt_elements.html:31
2966 #: rhodecode/templates/data_table/_dt_elements.html:33
3115 #: rhodecode/templates/data_table/_dt_elements.html:33
2967 #: rhodecode/templates/data_table/_dt_elements.html:35
3116 #: rhodecode/templates/data_table/_dt_elements.html:35
2968 msgid "Files"
3117 #: rhodecode/templates/data_table/_dt_elements.html:37
2969 msgstr ""
3118 #: rhodecode/templates/data_table/_dt_elements.html:74
2970
3119 #: rhodecode/templates/forks/fork.html:9
2971 #: rhodecode/templates/base/base.html:195
3120 msgid "Fork"
2972 #: rhodecode/templates/base/base.html:199
3121 msgstr ""
2973 msgid "Options"
3122
2974 msgstr ""
3123 #: rhodecode/templates/base/base.html:147
2975
3124 msgid "Create Pull Request"
2976 #: rhodecode/templates/base/base.html:204
3125 msgstr ""
2977 #: rhodecode/templates/base/base.html:206
3126
2978 msgid "repository settings"
3127 #: rhodecode/templates/base/base.html:153
2979 msgstr ""
3128 msgid "Show Pull Requests"
2980
3129 msgstr ""
2981 #: rhodecode/templates/base/base.html:210
3130
2982 #: rhodecode/templates/data_table/_dt_elements.html:80
3131 #: rhodecode/templates/base/base.html:153
2983 #: rhodecode/templates/forks/fork.html:13
3132 msgid "Pull Requests"
2984 msgid "fork"
3133 msgstr ""
2985 msgstr ""
3134
2986
3135 #: rhodecode/templates/base/base.html:190
2987 #: rhodecode/templates/base/base.html:212 rhodecode/templates/base/root.html:50
3136 msgid "Not logged in"
2988 #: rhodecode/templates/changelog/changelog.html:43
3137 msgstr ""
2989 msgid "Open new pull request"
3138
2990 msgstr ""
3139 #: rhodecode/templates/base/base.html:197
2991
3140 msgid "Login to your account"
2992 #: rhodecode/templates/base/base.html:215
3141 msgstr ""
2993 #: rhodecode/templates/forks/forks_data.html:21
3142
2994 msgid "Compare fork"
3143 #: rhodecode/templates/base/base.html:220
2995 msgstr ""
3144 msgid "Forgot password ?"
2996
3145 msgstr ""
2997 #: rhodecode/templates/base/base.html:217
3146
2998 msgid "search"
3147 #: rhodecode/templates/base/base.html:243
2999 msgstr ""
3148 msgid "Log Out"
3000
3149 msgstr ""
3001 #: rhodecode/templates/base/base.html:223
3150
3002 msgid "lock"
3151 #: rhodecode/templates/base/base.html:262
3003 msgstr ""
3152 msgid "Switch repository"
3004
3153 msgstr ""
3005 #: rhodecode/templates/base/base.html:234
3154
3006 msgid "repositories groups"
3155 #: rhodecode/templates/base/base.html:274
3007 msgstr ""
3156 msgid "Show recent activity"
3008
3157 msgstr ""
3009 #: rhodecode/templates/base/base.html:236
3158
3010 msgid "users groups"
3159 #: rhodecode/templates/base/base.html:275
3011 msgstr ""
3160 #: rhodecode/templates/journal/journal.html:4
3012
3161 msgid "Journal"
3013 #: rhodecode/templates/base/base.html:237
3162 msgstr ""
3014 msgid "permissions"
3163
3015 msgstr ""
3164 #: rhodecode/templates/base/base.html:286
3016
3165 msgid "Search in repositories"
3017 #: rhodecode/templates/base/base.html:239
3166 msgstr ""
3018 msgid "defaults"
3167
3019 msgstr ""
3168 #: rhodecode/templates/base/perms_summary.html:8
3020
3169 msgid "No permissions defined yet"
3021 #: rhodecode/templates/base/base.html:240
3170 msgstr ""
3022 msgid "settings"
3171
3023 msgstr ""
3172 #: rhodecode/templates/base/perms_summary.html:15
3024
3173 msgid "Permission"
3025 #: rhodecode/templates/base/base.html:251
3174 msgstr ""
3026 #: rhodecode/templates/base/base.html:253
3175
3027 msgid "Followers"
3176 #: rhodecode/templates/base/perms_summary.html:16
3028 msgstr ""
3177 msgid "Edit Permission"
3029
3030 #: rhodecode/templates/base/base.html:259
3031 #: rhodecode/templates/base/base.html:261
3032 msgid "Forks"
3033 msgstr ""
3034
3035 #: rhodecode/templates/base/base.html:340
3036 #: rhodecode/templates/base/base.html:342
3037 #: rhodecode/templates/base/base.html:344
3038 #: rhodecode/templates/search/search.html:52
3039 msgid "Search"
3040 msgstr ""
3041
3042 #: rhodecode/templates/base/root.html:42
3043 msgid "add another comment"
3044 msgstr ""
3178 msgstr ""
3045
3179
3046 #: rhodecode/templates/base/root.html:43
3180 #: rhodecode/templates/base/root.html:43
3047 #: rhodecode/templates/journal/journal.html:83
3181 #, fuzzy
3048 #: rhodecode/templates/summary/summary.html:57
3182 msgid "Add another comment"
3049 msgid "Stop following this repository"
3050 msgstr ""
3183 msgstr ""
3051
3184
3052 #: rhodecode/templates/base/root.html:44
3185 #: rhodecode/templates/base/root.html:44
3053 #: rhodecode/templates/summary/summary.html:61
3186 #: rhodecode/templates/data_table/_dt_elements.html:140
3054 msgid "Start following this repository"
3187 msgid "Stop following this repository"
3055 msgstr ""
3188 msgstr ""
3056
3189
3057 #: rhodecode/templates/base/root.html:45
3190 #: rhodecode/templates/base/root.html:45
3191 msgid "Start following this repository"
3192 msgstr ""
3193
3194 #: rhodecode/templates/base/root.html:46
3058 msgid "Group"
3195 msgid "Group"
3059 msgstr ""
3196 msgstr ""
3060
3197
3198 #: rhodecode/templates/base/root.html:47
3199 msgid "members"
3200 msgstr ""
3201
3061 #: rhodecode/templates/base/root.html:48
3202 #: rhodecode/templates/base/root.html:48
3062 msgid "search truncated"
3203 #: rhodecode/templates/pullrequests/pullrequest.html:181
3204 msgid "Loading ..."
3063 msgstr ""
3205 msgstr ""
3064
3206
3065 #: rhodecode/templates/base/root.html:49
3207 #: rhodecode/templates/base/root.html:49
3066 msgid "no matching files"
3208 msgid "Search truncated"
3209 msgstr ""
3210
3211 #: rhodecode/templates/base/root.html:50
3212 msgid "No matching files"
3067 msgstr ""
3213 msgstr ""
3068
3214
3069 #: rhodecode/templates/base/root.html:51
3215 #: rhodecode/templates/base/root.html:51
3070 msgid "Open new pull request for selected changesets"
3216 #: rhodecode/templates/changelog/changelog.html:36
3217 msgid "Open new pull request"
3071 msgstr ""
3218 msgstr ""
3072
3219
3073 #: rhodecode/templates/base/root.html:52
3220 #: rhodecode/templates/base/root.html:52
3074 msgid "Show selected changes __S -> __E"
3221 msgid "Open new pull request for selected changesets"
3075 msgstr ""
3222 msgstr ""
3076
3223
3077 #: rhodecode/templates/base/root.html:53
3224 #: rhodecode/templates/base/root.html:53
3225 msgid "Show selected changesets __S -> __E"
3226 msgstr ""
3227
3228 #: rhodecode/templates/base/root.html:54
3229 msgid "Show selected changeset __S"
3230 msgstr ""
3231
3232 #: rhodecode/templates/base/root.html:55
3078 msgid "Selection link"
3233 msgid "Selection link"
3079 msgstr ""
3234 msgstr ""
3080
3235
3236 #: rhodecode/templates/base/root.html:56
3237 #: rhodecode/templates/changeset/diff_block.html:8
3238 msgid "Collapse diff"
3239 msgstr ""
3240
3241 #: rhodecode/templates/base/root.html:57
3242 msgid "Expand diff"
3243 msgstr ""
3244
3081 #: rhodecode/templates/bookmarks/bookmarks.html:5
3245 #: rhodecode/templates/bookmarks/bookmarks.html:5
3082 #, python-format
3246 #, python-format
3083 msgid "%s Bookmarks"
3247 msgid "%s Bookmarks"
3084 msgstr ""
3248 msgstr ""
3085
3249
3086 #: rhodecode/templates/bookmarks/bookmarks.html:39
3250 #: rhodecode/templates/bookmarks/bookmarks.html:37
3087 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
3251 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
3088 #: rhodecode/templates/branches/branches.html:53
3252 #: rhodecode/templates/branches/branches.html:50
3089 #: rhodecode/templates/branches/branches_data.html:8
3253 #: rhodecode/templates/branches/branches_data.html:8
3090 #: rhodecode/templates/tags/tags.html:54
3254 #: rhodecode/templates/shortlog/shortlog_data.html:8
3255 #: rhodecode/templates/tags/tags.html:51
3091 #: rhodecode/templates/tags/tags_data.html:8
3256 #: rhodecode/templates/tags/tags_data.html:8
3092 msgid "Author"
3257 msgid "Author"
3093 msgstr ""
3258 msgstr ""
3094
3259
3260 #: rhodecode/templates/bookmarks/bookmarks.html:38
3261 #: rhodecode/templates/bookmarks/bookmarks_data.html:9
3262 #: rhodecode/templates/branches/branches.html:51
3263 #: rhodecode/templates/branches/branches_data.html:9
3264 #: rhodecode/templates/shortlog/shortlog_data.html:5
3265 #: rhodecode/templates/tags/tags.html:52
3266 #: rhodecode/templates/tags/tags_data.html:9
3267 msgid "Revision"
3268 msgstr ""
3269
3095 #: rhodecode/templates/branches/branches.html:5
3270 #: rhodecode/templates/branches/branches.html:5
3096 #, python-format
3271 #, python-format
3097 msgid "%s Branches"
3272 msgid "%s Branches"
3098 msgstr ""
3273 msgstr ""
3099
3274
3100 #: rhodecode/templates/branches/branches.html:29
3275 #: rhodecode/templates/branches/branches.html:26
3101 msgid "Compare branches"
3276 msgid "Compare branches"
3102 msgstr ""
3277 msgstr ""
3103
3278
3104 #: rhodecode/templates/branches/branches.html:56
3279 #: rhodecode/templates/branches/branches.html:53
3105 #: rhodecode/templates/branches/branches_data.html:10
3280 #: rhodecode/templates/branches/branches_data.html:10
3106 #: rhodecode/templates/compare/compare_diff.html:5
3281 #: rhodecode/templates/tags/tags.html:54
3107 #: rhodecode/templates/compare/compare_diff.html:13
3108 #: rhodecode/templates/tags/tags.html:57
3109 #: rhodecode/templates/tags/tags_data.html:10
3282 #: rhodecode/templates/tags/tags_data.html:10
3110 msgid "Compare"
3283 msgid "Compare"
3111 msgstr ""
3284 msgstr ""
@@ -3115,115 +3288,80 b' msgstr ""'
3115 msgid "%s Changelog"
3288 msgid "%s Changelog"
3116 msgstr ""
3289 msgstr ""
3117
3290
3118 #: rhodecode/templates/changelog/changelog.html:15
3291 #: rhodecode/templates/changelog/changelog.html:11
3119 #, python-format
3292 #, python-format
3120 msgid "showing %d out of %d revision"
3293 msgid "showing %d out of %d revision"
3121 msgid_plural "showing %d out of %d revisions"
3294 msgid_plural "showing %d out of %d revisions"
3122 msgstr[0] ""
3295 msgstr[0] ""
3123 msgstr[1] ""
3296 msgstr[1] ""
3124
3297
3125 #: rhodecode/templates/changelog/changelog.html:37
3298 #: rhodecode/templates/changelog/changelog.html:30
3126 msgid "Clear selection"
3299 msgid "Clear selection"
3127 msgstr ""
3300 msgstr ""
3128
3301
3129 #: rhodecode/templates/changelog/changelog.html:40
3302 #: rhodecode/templates/changelog/changelog.html:33
3130 #: rhodecode/templates/forks/forks_data.html:19
3303 #: rhodecode/templates/forks/forks_data.html:19
3131 #, python-format
3304 #, python-format
3132 msgid "compare fork with %s"
3305 msgid "Compare fork with %s"
3133 msgstr ""
3306 msgstr ""
3134
3307
3135 #: rhodecode/templates/changelog/changelog.html:40
3308 #: rhodecode/templates/changelog/changelog.html:33
3136 msgid "Compare fork with parent"
3309 msgid "Compare fork with parent"
3137 msgstr ""
3310 msgstr ""
3138
3311
3139 #: rhodecode/templates/changelog/changelog.html:49
3312 #: rhodecode/templates/changelog/changelog.html:76
3140 msgid "Show"
3313 #: rhodecode/templates/summary/summary.html:404
3141 msgstr ""
3314 msgid "Show more"
3142
3315 msgstr ""
3143 #: rhodecode/templates/changelog/changelog.html:74
3316
3144 #: rhodecode/templates/summary/summary.html:375
3317 #: rhodecode/templates/changelog/changelog.html:89
3145 msgid "show more"
3318 #: rhodecode/templates/changeset/changeset_range.html:86
3146 msgstr ""
3319 #, python-format
3147
3320 msgid "Bookmark %s"
3148 #: rhodecode/templates/changelog/changelog.html:78
3321 msgstr ""
3149 msgid "Affected number of files, click to show more details"
3322
3150 msgstr ""
3323 #: rhodecode/templates/changelog/changelog.html:95
3151
3324 #: rhodecode/templates/changeset/changeset.html:111
3152 #: rhodecode/templates/changelog/changelog.html:91
3325 #: rhodecode/templates/changeset/changeset_range.html:92
3153 #: rhodecode/templates/changeset/changeset.html:65
3326 #, python-format
3154 #: rhodecode/templates/changeset/changeset_file_comment.html:20
3327 msgid "Tag %s"
3155 #: rhodecode/templates/changeset/changeset_range.html:46
3328 msgstr ""
3156 msgid "Changeset status"
3329
3157 msgstr ""
3330 #: rhodecode/templates/changelog/changelog.html:100
3158
3159 #: rhodecode/templates/changelog/changelog.html:94
3160 #: rhodecode/templates/shortlog/shortlog_data.html:20
3161 msgid "Click to open associated pull request"
3162 msgstr ""
3163
3164 #: rhodecode/templates/changelog/changelog.html:104
3165 msgid "Parent"
3166 msgstr ""
3167
3168 #: rhodecode/templates/changelog/changelog.html:110
3169 #: rhodecode/templates/changeset/changeset.html:42
3170 msgid "No parents"
3171 msgstr ""
3172
3173 #: rhodecode/templates/changelog/changelog.html:115
3174 #: rhodecode/templates/changeset/changeset.html:106
3331 #: rhodecode/templates/changeset/changeset.html:106
3175 #: rhodecode/templates/changeset/changeset_range.html:79
3332 #: rhodecode/templates/changeset/changeset_range.html:80
3176 msgid "merge"
3333 #, python-format
3177 msgstr ""
3334 msgid "Branch %s"
3178
3335 msgstr ""
3179 #: rhodecode/templates/changelog/changelog.html:118
3336
3180 #: rhodecode/templates/changeset/changeset.html:109
3337 #: rhodecode/templates/changelog/changelog.html:258
3181 #: rhodecode/templates/changeset/changeset_range.html:82
3182 #: rhodecode/templates/files/files.html:29
3183 #: rhodecode/templates/files/files_add.html:33
3184 #: rhodecode/templates/files/files_edit.html:33
3185 #: rhodecode/templates/shortlog/shortlog_data.html:9
3186 msgid "branch"
3187 msgstr ""
3188
3189 #: rhodecode/templates/changelog/changelog.html:124
3190 #: rhodecode/templates/changeset/changeset_range.html:88
3191 msgid "bookmark"
3192 msgstr ""
3193
3194 #: rhodecode/templates/changelog/changelog.html:130
3195 #: rhodecode/templates/changeset/changeset.html:114
3196 #: rhodecode/templates/changeset/changeset_range.html:94
3197 msgid "tag"
3198 msgstr ""
3199
3200 #: rhodecode/templates/changelog/changelog.html:301
3201 msgid "There are no changes yet"
3338 msgid "There are no changes yet"
3202 msgstr ""
3339 msgstr ""
3203
3340
3204 #: rhodecode/templates/changelog/changelog_details.html:4
3341 #: rhodecode/templates/changelog/changelog_details.html:4
3205 #: rhodecode/templates/changeset/changeset.html:94
3342 #: rhodecode/templates/changeset/changeset.html:91
3206 msgid "removed"
3343 msgid "Removed"
3207 msgstr ""
3344 msgstr ""
3208
3345
3209 #: rhodecode/templates/changelog/changelog_details.html:5
3346 #: rhodecode/templates/changelog/changelog_details.html:5
3210 #: rhodecode/templates/changeset/changeset.html:95
3347 #: rhodecode/templates/changeset/changeset.html:92
3211 msgid "changed"
3348 #, fuzzy
3349 msgid "Changed"
3212 msgstr ""
3350 msgstr ""
3213
3351
3214 #: rhodecode/templates/changelog/changelog_details.html:6
3352 #: rhodecode/templates/changelog/changelog_details.html:6
3215 #: rhodecode/templates/changeset/changeset.html:96
3353 #: rhodecode/templates/changeset/changeset.html:93
3216 msgid "added"
3354 msgid "Added"
3217 msgstr ""
3355 msgstr ""
3218
3356
3219 #: rhodecode/templates/changelog/changelog_details.html:8
3357 #: rhodecode/templates/changelog/changelog_details.html:8
3220 #: rhodecode/templates/changelog/changelog_details.html:9
3358 #: rhodecode/templates/changelog/changelog_details.html:9
3221 #: rhodecode/templates/changelog/changelog_details.html:10
3359 #: rhodecode/templates/changelog/changelog_details.html:10
3222 #: rhodecode/templates/changeset/changeset.html:98
3360 #: rhodecode/templates/changeset/changeset.html:95
3223 #: rhodecode/templates/changeset/changeset.html:99
3361 #: rhodecode/templates/changeset/changeset.html:96
3224 #: rhodecode/templates/changeset/changeset.html:100
3362 #: rhodecode/templates/changeset/changeset.html:97
3225 #, python-format
3363 #, python-format
3226 msgid "affected %s files"
3364 msgid "Affected %s files"
3227 msgstr ""
3365 msgstr ""
3228
3366
3229 #: rhodecode/templates/changeset/changeset.html:6
3367 #: rhodecode/templates/changeset/changeset.html:6
@@ -3231,112 +3369,144 b' msgstr ""'
3231 msgid "%s Changeset"
3369 msgid "%s Changeset"
3232 msgstr ""
3370 msgstr ""
3233
3371
3234 #: rhodecode/templates/changeset/changeset.html:14
3372 #: rhodecode/templates/changeset/changeset.html:39
3235 msgid "Changeset"
3373 msgid "No parents"
3236 msgstr ""
3374 msgstr ""
3237
3375
3238 #: rhodecode/templates/changeset/changeset.html:52
3376 #: rhodecode/templates/changeset/changeset.html:49
3239 msgid "No children"
3377 msgid "No children"
3240 msgstr ""
3378 msgstr ""
3241
3379
3242 #: rhodecode/templates/changeset/changeset.html:70
3380 #: rhodecode/templates/changeset/changeset.html:62
3243 #: rhodecode/templates/changeset/diff_block.html:20
3381 #: rhodecode/templates/changeset/changeset_file_comment.html:20
3244 msgid "raw diff"
3382 #: rhodecode/templates/changeset/changeset_range.html:44
3245 msgstr ""
3383 msgid "Changeset status"
3246
3384 msgstr ""
3247 #: rhodecode/templates/changeset/changeset.html:71
3385
3248 msgid "patch diff"
3386 #: rhodecode/templates/changeset/changeset.html:67
3249 msgstr ""
3387 #: rhodecode/templates/changeset/diff_block.html:23
3250
3388 msgid "Raw diff"
3251 #: rhodecode/templates/changeset/changeset.html:72
3389 msgstr ""
3252 #: rhodecode/templates/changeset/diff_block.html:21
3390
3253 msgid "download diff"
3391 #: rhodecode/templates/changeset/changeset.html:68
3254 msgstr ""
3392 msgid "Patch diff"
3255
3393 msgstr ""
3256 #: rhodecode/templates/changeset/changeset.html:76
3394
3257 #: rhodecode/templates/changeset/changeset_file_comment.html:82
3395 #: rhodecode/templates/changeset/changeset.html:69
3396 #: rhodecode/templates/changeset/diff_block.html:24
3397 msgid "Download diff"
3398 msgstr ""
3399
3400 #: rhodecode/templates/changeset/changeset.html:73
3401 #: rhodecode/templates/changeset/changeset_file_comment.html:97
3258 #, python-format
3402 #, python-format
3259 msgid "%d comment"
3403 msgid "%d comment"
3260 msgid_plural "%d comments"
3404 msgid_plural "%d comments"
3261 msgstr[0] ""
3405 msgstr[0] ""
3262 msgstr[1] ""
3406 msgstr[1] ""
3263
3407
3264 #: rhodecode/templates/changeset/changeset.html:76
3408 #: rhodecode/templates/changeset/changeset.html:73
3265 #: rhodecode/templates/changeset/changeset_file_comment.html:82
3409 #: rhodecode/templates/changeset/changeset_file_comment.html:97
3266 #, python-format
3410 #, python-format
3267 msgid "(%d inline)"
3411 msgid "(%d inline)"
3268 msgid_plural "(%d inline)"
3412 msgid_plural "(%d inline)"
3269 msgstr[0] ""
3413 msgstr[0] ""
3270 msgstr[1] ""
3414 msgstr[1] ""
3271
3415
3272 #: rhodecode/templates/changeset/changeset.html:122
3416 #: rhodecode/templates/changeset/changeset.html:103
3273 #: rhodecode/templates/compare/compare_diff.html:44
3417 #: rhodecode/templates/changeset/changeset_range.html:77
3274 #: rhodecode/templates/pullrequests/pullrequest_show.html:76
3418 msgid "merge"
3419 msgstr ""
3420
3421 #: rhodecode/templates/changeset/changeset.html:119
3422 #: rhodecode/templates/compare/compare_diff.html:40
3423 #: rhodecode/templates/pullrequests/pullrequest_show.html:113
3275 #, python-format
3424 #, python-format
3276 msgid "%s file changed"
3425 msgid "%s file changed"
3277 msgid_plural "%s files changed"
3426 msgid_plural "%s files changed"
3278 msgstr[0] ""
3427 msgstr[0] ""
3279 msgstr[1] ""
3428 msgstr[1] ""
3280
3429
3281 #: rhodecode/templates/changeset/changeset.html:124
3430 #: rhodecode/templates/changeset/changeset.html:121
3282 #: rhodecode/templates/compare/compare_diff.html:46
3431 #: rhodecode/templates/compare/compare_diff.html:42
3283 #: rhodecode/templates/pullrequests/pullrequest_show.html:78
3432 #: rhodecode/templates/pullrequests/pullrequest_show.html:115
3284 #, python-format
3433 #, python-format
3285 msgid "%s file changed with %s insertions and %s deletions"
3434 msgid "%s file changed with %s insertions and %s deletions"
3286 msgid_plural "%s files changed with %s insertions and %s deletions"
3435 msgid_plural "%s files changed with %s insertions and %s deletions"
3287 msgstr[0] ""
3436 msgstr[0] ""
3288 msgstr[1] ""
3437 msgstr[1] ""
3289
3438
3290 #: rhodecode/templates/changeset/changeset_file_comment.html:42
3439 #: rhodecode/templates/changeset/changeset.html:134
3291 msgid "Submitting..."
3440 #: rhodecode/templates/changeset/changeset.html:146
3292 msgstr ""
3441 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
3293
3442 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
3294 #: rhodecode/templates/changeset/changeset_file_comment.html:45
3443 msgid "Showing a huge diff might take some time and resources"
3295 msgid "Commenting on line {1}."
3444 msgstr ""
3296 msgstr ""
3445
3297
3446 #: rhodecode/templates/changeset/changeset.html:134
3298 #: rhodecode/templates/changeset/changeset_file_comment.html:46
3447 #: rhodecode/templates/changeset/changeset.html:146
3299 #: rhodecode/templates/changeset/changeset_file_comment.html:121
3448 #: rhodecode/templates/compare/compare_diff.html:58
3449 #: rhodecode/templates/compare/compare_diff.html:69
3450 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
3451 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
3452 msgid "Show full diff"
3453 msgstr ""
3454
3455 #: rhodecode/templates/changeset/changeset_file_comment.html:30
3300 #, python-format
3456 #, python-format
3301 msgid "Comments parsed using %s syntax with %s support."
3457 msgid "Status change on pull request #%s"
3302 msgstr ""
3458 msgstr ""
3303
3459
3304 #: rhodecode/templates/changeset/changeset_file_comment.html:48
3460 #: rhodecode/templates/changeset/changeset_file_comment.html:32
3305 #: rhodecode/templates/changeset/changeset_file_comment.html:123
3461 #, python-format
3306 msgid "Use @username inside this text to send notification to this RhodeCode user"
3462 msgid "Comment on pull request #%s"
3307 msgstr ""
3463 msgstr ""
3308
3464
3309 #: rhodecode/templates/changeset/changeset_file_comment.html:59
3465 #: rhodecode/templates/changeset/changeset_file_comment.html:57
3310 #: rhodecode/templates/changeset/changeset_file_comment.html:143
3466 msgid "Submitting..."
3311 msgid "Comment"
3312 msgstr ""
3467 msgstr ""
3313
3468
3314 #: rhodecode/templates/changeset/changeset_file_comment.html:60
3469 #: rhodecode/templates/changeset/changeset_file_comment.html:60
3315 #: rhodecode/templates/changeset/changeset_file_comment.html:71
3470 msgid "Commenting on line {1}."
3316 msgid "Hide"
3471 msgstr ""
3317 msgstr ""
3472
3318
3473 #: rhodecode/templates/changeset/changeset_file_comment.html:61
3319 #: rhodecode/templates/changeset/changeset_file_comment.html:67
3474 #: rhodecode/templates/changeset/changeset_file_comment.html:139
3475 #, python-format
3476 msgid "Comments parsed using %s syntax with %s support."
3477 msgstr ""
3478
3479 #: rhodecode/templates/changeset/changeset_file_comment.html:63
3480 #: rhodecode/templates/changeset/changeset_file_comment.html:141
3481 msgid "Use @username inside this text to send notification to this RhodeCode user"
3482 msgstr ""
3483
3484 #: rhodecode/templates/changeset/changeset_file_comment.html:74
3485 #: rhodecode/templates/changeset/changeset_file_comment.html:161
3486 msgid "Comment"
3487 msgstr ""
3488
3489 #: rhodecode/templates/changeset/changeset_file_comment.html:75
3490 msgid "Cancel"
3491 msgstr ""
3492
3493 #: rhodecode/templates/changeset/changeset_file_comment.html:82
3320 msgid "You need to be logged in to comment."
3494 msgid "You need to be logged in to comment."
3321 msgstr ""
3495 msgstr ""
3322
3496
3323 #: rhodecode/templates/changeset/changeset_file_comment.html:67
3497 #: rhodecode/templates/changeset/changeset_file_comment.html:82
3324 msgid "Login now"
3498 msgid "Login now"
3325 msgstr ""
3499 msgstr ""
3326
3500
3327 #: rhodecode/templates/changeset/changeset_file_comment.html:118
3501 #: rhodecode/templates/changeset/changeset_file_comment.html:86
3328 msgid "Leave a comment"
3502 msgid "Hide"
3329 msgstr ""
3503 msgstr ""
3330
3504
3331 #: rhodecode/templates/changeset/changeset_file_comment.html:125
3505 #: rhodecode/templates/changeset/changeset_file_comment.html:143
3332 msgid "Check this to change current status of code-review for this changeset"
3506 msgid "Change status"
3333 msgstr ""
3507 msgstr ""
3334
3508
3335 #: rhodecode/templates/changeset/changeset_file_comment.html:125
3509 #: rhodecode/templates/changeset/changeset_file_comment.html:163
3336 msgid "change status"
3337 msgstr ""
3338
3339 #: rhodecode/templates/changeset/changeset_file_comment.html:145
3340 msgid "Comment and close"
3510 msgid "Comment and close"
3341 msgstr ""
3511 msgstr ""
3342
3512
@@ -3345,97 +3515,118 b' msgstr ""'
3345 msgid "%s Changesets"
3515 msgid "%s Changesets"
3346 msgstr ""
3516 msgstr ""
3347
3517
3348 #: rhodecode/templates/changeset/changeset_range.html:29
3518 #: rhodecode/templates/changeset/changeset_range.html:52
3349 #: rhodecode/templates/compare/compare_diff.html:29
3350 msgid "Compare View"
3351 msgstr ""
3352
3353 #: rhodecode/templates/changeset/changeset_range.html:29
3354 msgid "Show combined compare"
3355 msgstr ""
3356
3357 #: rhodecode/templates/changeset/changeset_range.html:54
3358 msgid "Files affected"
3519 msgid "Files affected"
3359 msgstr ""
3520 msgstr ""
3360
3521
3361 #: rhodecode/templates/changeset/diff_block.html:19
3522 #: rhodecode/templates/changeset/diff_block.html:22
3362 msgid "show full diff for this file"
3523 msgid "Show full diff for this file"
3363 msgstr ""
3524 msgstr ""
3364
3525
3365 #: rhodecode/templates/changeset/diff_block.html:27
3526 #: rhodecode/templates/changeset/diff_block.html:30
3366 msgid "show inline comments"
3527 msgid "Show inline comments"
3367 msgstr ""
3528 msgstr ""
3368
3529
3369 #: rhodecode/templates/compare/compare_cs.html:5
3530 #: rhodecode/templates/changeset/diff_block.html:55
3531 msgid "Show file at latest version in this repo"
3532 msgstr ""
3533
3534 #: rhodecode/templates/changeset/diff_block.html:56
3535 msgid "Show file at initial version in this repo"
3536 msgstr ""
3537
3538 #: rhodecode/templates/compare/compare_cs.html:4
3370 msgid "No changesets"
3539 msgid "No changesets"
3371 msgstr ""
3540 msgstr ""
3372
3541
3373 #: rhodecode/templates/compare/compare_diff.html:37
3542 #: rhodecode/templates/compare/compare_cs.html:32
3374 #: rhodecode/templates/pullrequests/pullrequest_show.html:69
3543 msgid "Ancestor"
3544 msgstr ""
3545
3546 #: rhodecode/templates/compare/compare_diff.html:5
3547 #, fuzzy, python-format
3548 msgid "%s Compare"
3549 msgstr ""
3550
3551 #: rhodecode/templates/compare/compare_diff.html:9
3552 msgid "Compare revisions"
3553 msgstr ""
3554
3555 #: rhodecode/templates/compare/compare_diff.html:33
3556 #: rhodecode/templates/pullrequests/pullrequest_show.html:106
3375 #, python-format
3557 #, python-format
3376 msgid "Showing %s commit"
3558 msgid "Showing %s commit"
3377 msgid_plural "Showing %s commits"
3559 msgid_plural "Showing %s commits"
3378 msgstr[0] ""
3560 msgstr[0] ""
3379 msgstr[1] ""
3561 msgstr[1] ""
3380
3562
3381 #: rhodecode/templates/compare/compare_diff.html:52
3563 #: rhodecode/templates/compare/compare_diff.html:48
3382 #: rhodecode/templates/pullrequests/pullrequest_show.html:84
3564 #: rhodecode/templates/pullrequests/pullrequest_show.html:121
3383 msgid "No files"
3565 msgid "No files"
3384 msgstr ""
3566 msgstr ""
3385
3567
3386 #: rhodecode/templates/data_table/_dt_elements.html:39
3568 #: rhodecode/templates/compare/compare_diff.html:58
3387 #: rhodecode/templates/data_table/_dt_elements.html:41
3569 #: rhodecode/templates/compare/compare_diff.html:69
3388 #: rhodecode/templates/data_table/_dt_elements.html:43
3570 msgid "confirm to show potentially huge diff"
3389 msgid "Fork"
3571 msgstr ""
3390 msgstr ""
3572
3391
3573 #: rhodecode/templates/data_table/_dt_elements.html:54
3392 #: rhodecode/templates/data_table/_dt_elements.html:60
3574 #: rhodecode/templates/summary/summary.html:69
3393 #: rhodecode/templates/journal/journal.html:89
3394 #: rhodecode/templates/summary/summary.html:77
3395 msgid "Mercurial repository"
3575 msgid "Mercurial repository"
3396 msgstr ""
3576 msgstr ""
3397
3577
3398 #: rhodecode/templates/data_table/_dt_elements.html:62
3578 #: rhodecode/templates/data_table/_dt_elements.html:56
3399 #: rhodecode/templates/journal/journal.html:91
3579 #: rhodecode/templates/summary/summary.html:72
3400 #: rhodecode/templates/summary/summary.html:80
3401 msgid "Git repository"
3580 msgid "Git repository"
3402 msgstr ""
3581 msgstr ""
3403
3582
3404 #: rhodecode/templates/data_table/_dt_elements.html:69
3583 #: rhodecode/templates/data_table/_dt_elements.html:74
3405 #: rhodecode/templates/journal/journal.html:97
3584 #, python-format
3406 #: rhodecode/templates/summary/summary.html:87
3585 msgid "Fork of %s"
3407 msgid "public repository"
3586 msgstr ""
3408 msgstr ""
3587
3409
3588 #: rhodecode/templates/data_table/_dt_elements.html:88
3410 #: rhodecode/templates/data_table/_dt_elements.html:80
3411 #: rhodecode/templates/summary/summary.html:96
3412 #: rhodecode/templates/summary/summary.html:97
3413 msgid "Fork of"
3414 msgstr ""
3415
3416 #: rhodecode/templates/data_table/_dt_elements.html:94
3417 msgid "No changesets yet"
3589 msgid "No changesets yet"
3418 msgstr ""
3590 msgstr ""
3419
3591
3420 #: rhodecode/templates/data_table/_dt_elements.html:101
3592 #: rhodecode/templates/data_table/_dt_elements.html:95
3421 #: rhodecode/templates/data_table/_dt_elements.html:103
3593 #: rhodecode/templates/data_table/_dt_elements.html:97
3422 #, python-format
3594 #, python-format
3423 msgid "Subscribe to %s rss feed"
3595 msgid "Subscribe to %s rss feed"
3424 msgstr ""
3596 msgstr ""
3425
3597
3426 #: rhodecode/templates/data_table/_dt_elements.html:109
3598 #: rhodecode/templates/data_table/_dt_elements.html:103
3427 #: rhodecode/templates/data_table/_dt_elements.html:111
3599 #: rhodecode/templates/data_table/_dt_elements.html:105
3428 #, python-format
3600 #, python-format
3429 msgid "Subscribe to %s atom feed"
3601 msgid "Subscribe to %s atom feed"
3430 msgstr ""
3602 msgstr ""
3431
3603
3432 #: rhodecode/templates/data_table/_dt_elements.html:122
3604 #: rhodecode/templates/data_table/_dt_elements.html:122
3433 #, python-format
3605 #, python-format
3606 msgid "Confirm to delete this repository: %s"
3607 msgstr ""
3608
3609 #: rhodecode/templates/data_table/_dt_elements.html:131
3610 #, python-format
3434 msgid "Confirm to delete this user: %s"
3611 msgid "Confirm to delete this user: %s"
3435 msgstr ""
3612 msgstr ""
3436
3613
3437 #: rhodecode/templates/email_templates/changeset_comment.html:10
3614 #: rhodecode/templates/email_templates/changeset_comment.html:9
3438 msgid "New status$"
3615 #: rhodecode/templates/email_templates/pull_request_comment.html:15
3616 msgid "New status"
3617 msgstr ""
3618
3619 #: rhodecode/templates/email_templates/changeset_comment.html:11
3620 #: rhodecode/templates/email_templates/pull_request_comment.html:9
3621 msgid "View this comment here"
3622 msgstr ""
3623
3624 #: rhodecode/templates/email_templates/changeset_comment.html:14
3625 msgid "Repo"
3626 msgstr ""
3627
3628 #: rhodecode/templates/email_templates/changeset_comment.html:16
3629 msgid "desc"
3439 msgstr ""
3630 msgstr ""
3440
3631
3441 #: rhodecode/templates/email_templates/main.html:8
3632 #: rhodecode/templates/email_templates/main.html:8
@@ -3443,19 +3634,20 b' msgid "This is a notification from Rhode'
3443 msgstr ""
3634 msgstr ""
3444
3635
3445 #: rhodecode/templates/email_templates/password_reset.html:4
3636 #: rhodecode/templates/email_templates/password_reset.html:4
3446 msgid "Hello"
3637 #, python-format
3638 msgid "Hello %s"
3639 msgstr ""
3640
3641 #: rhodecode/templates/email_templates/password_reset.html:5
3642 msgid "We received a request to create a new password for your account."
3447 msgstr ""
3643 msgstr ""
3448
3644
3449 #: rhodecode/templates/email_templates/password_reset.html:6
3645 #: rhodecode/templates/email_templates/password_reset.html:6
3450 msgid "We received a request to create a new password for your account."
3451 msgstr ""
3452
3453 #: rhodecode/templates/email_templates/password_reset.html:8
3454 msgid "You can generate it by clicking following URL"
3646 msgid "You can generate it by clicking following URL"
3455 msgstr ""
3647 msgstr ""
3456
3648
3457 #: rhodecode/templates/email_templates/password_reset.html:12
3649 #: rhodecode/templates/email_templates/password_reset.html:11
3458 msgid "If you didn't request new password please ignore this email."
3650 msgid "If you did not request new password please ignore this email."
3459 msgstr ""
3651 msgstr ""
3460
3652
3461 #: rhodecode/templates/email_templates/pull_request.html:4
3653 #: rhodecode/templates/email_templates/pull_request.html:4
@@ -3466,33 +3658,28 b' msgid ""'
3466 msgstr ""
3658 msgstr ""
3467
3659
3468 #: rhodecode/templates/email_templates/pull_request.html:5
3660 #: rhodecode/templates/email_templates/pull_request.html:5
3469 msgid "title"
3661 msgid "View this pull request here"
3470 msgstr ""
3662 msgstr ""
3471
3663
3472 #: rhodecode/templates/email_templates/pull_request.html:6
3664 #: rhodecode/templates/email_templates/pull_request.html:6
3473 #: rhodecode/templates/pullrequests/pullrequest.html:115
3665 msgid "title"
3666 msgstr ""
3667
3668 #: rhodecode/templates/email_templates/pull_request.html:7
3474 msgid "description"
3669 msgid "description"
3475 msgstr ""
3670 msgstr ""
3476
3671
3477 #: rhodecode/templates/email_templates/pull_request.html:11
3672 #: rhodecode/templates/email_templates/pull_request.html:12
3478 msgid "revisions for reviewing"
3673 msgid "revisions for reviewing"
3479 msgstr ""
3674 msgstr ""
3480
3675
3481 #: rhodecode/templates/email_templates/pull_request.html:18
3676 #: rhodecode/templates/email_templates/pull_request_comment.html:3
3482 msgid "View this pull request here"
3483 msgstr ""
3484
3485 #: rhodecode/templates/email_templates/pull_request_comment.html:4
3486 #, python-format
3677 #, python-format
3487 msgid "User %s commented on pull request #%s for repository %s"
3678 msgid "Pull request #%s for repository %s"
3488 msgstr ""
3679 msgstr ""
3489
3680
3490 #: rhodecode/templates/email_templates/pull_request_comment.html:10
3681 #: rhodecode/templates/email_templates/pull_request_comment.html:13
3491 msgid "New status"
3682 msgid "Closing pull request with status"
3492 msgstr ""
3493
3494 #: rhodecode/templates/email_templates/pull_request_comment.html:14
3495 msgid "View this comment here"
3496 msgstr ""
3683 msgstr ""
3497
3684
3498 #: rhodecode/templates/email_templates/registration.html:4
3685 #: rhodecode/templates/email_templates/registration.html:4
@@ -3503,107 +3690,105 b' msgstr ""'
3503 msgid "View this user here"
3690 msgid "View this user here"
3504 msgstr ""
3691 msgstr ""
3505
3692
3506 #: rhodecode/templates/errors/error_document.html:46
3693 #: rhodecode/templates/errors/error_document.html:55
3507 #, python-format
3694 #, python-format
3508 msgid "You will be redirected to %s in %s seconds"
3695 msgid "You will be redirected to %s in %s seconds"
3509 msgstr ""
3696 msgstr ""
3510
3697
3511 #: rhodecode/templates/files/file_diff.html:4
3698 #: rhodecode/templates/files/file_diff.html:4
3512 #, python-format
3699 #, fuzzy, python-format
3513 msgid "%s File diff"
3700 msgid "%s File Diff"
3514 msgstr ""
3701 msgstr ""
3515
3702
3516 #: rhodecode/templates/files/file_diff.html:12
3703 #: rhodecode/templates/files/file_diff.html:8
3517 msgid "File diff"
3704 msgid "File diff"
3518 msgstr ""
3705 msgstr ""
3519
3706
3520 #: rhodecode/templates/files/files.html:4
3707 #: rhodecode/templates/files/files.html:4
3521 #: rhodecode/templates/files/files.html:74
3708 #: rhodecode/templates/files/files.html:76
3522 #, python-format
3709 #, fuzzy, python-format
3523 msgid "%s files"
3710 msgid "%s Files"
3524 msgstr ""
3711 msgstr ""
3525
3712
3526 #: rhodecode/templates/files/files.html:12
3713 #: rhodecode/templates/files/files.html:30
3527 #: rhodecode/templates/summary/summary.html:351
3714 #: rhodecode/templates/files/files_add.html:31
3528 msgid "files"
3715 #: rhodecode/templates/files/files_edit.html:31
3716 #: rhodecode/templates/shortlog/shortlog_data.html:9
3717 msgid "Branch"
3529 msgstr ""
3718 msgstr ""
3530
3719
3531 #: rhodecode/templates/files/files_add.html:4
3720 #: rhodecode/templates/files/files_add.html:4
3532 #: rhodecode/templates/files/files_edit.html:4
3721 #, fuzzy, python-format
3533 #, python-format
3722 msgid "%s Files Add"
3534 msgid "%s Edit file"
3535 msgstr ""
3723 msgstr ""
3536
3724
3537 #: rhodecode/templates/files/files_add.html:19
3725 #: rhodecode/templates/files/files_add.html:19
3538 msgid "add file"
3726 msgid "Add file"
3539 msgstr ""
3727 msgstr ""
3540
3728
3541 #: rhodecode/templates/files/files_add.html:40
3729 #: rhodecode/templates/files/files_add.html:38
3730 #: rhodecode/templates/files/files_browser.html:31
3731 #: rhodecode/templates/shortlog/shortlog_data.html:78
3542 msgid "Add new file"
3732 msgid "Add new file"
3543 msgstr ""
3733 msgstr ""
3544
3734
3545 #: rhodecode/templates/files/files_add.html:45
3735 #: rhodecode/templates/files/files_add.html:43
3546 msgid "File Name"
3736 msgid "File Name"
3547 msgstr ""
3737 msgstr ""
3548
3738
3549 #: rhodecode/templates/files/files_add.html:49
3739 #: rhodecode/templates/files/files_add.html:47
3550 #: rhodecode/templates/files/files_add.html:58
3740 #: rhodecode/templates/files/files_add.html:56
3551 msgid "or"
3741 msgid "or"
3552 msgstr ""
3742 msgstr ""
3553
3743
3554 #: rhodecode/templates/files/files_add.html:49
3744 #: rhodecode/templates/files/files_add.html:47
3555 #: rhodecode/templates/files/files_add.html:54
3745 #: rhodecode/templates/files/files_add.html:52
3556 msgid "Upload file"
3746 msgid "Upload file"
3557 msgstr ""
3747 msgstr ""
3558
3748
3559 #: rhodecode/templates/files/files_add.html:58
3749 #: rhodecode/templates/files/files_add.html:56
3560 msgid "Create new file"
3750 msgid "Create new file"
3561 msgstr ""
3751 msgstr ""
3562
3752
3563 #: rhodecode/templates/files/files_add.html:63
3753 #: rhodecode/templates/files/files_add.html:61
3564 #: rhodecode/templates/files/files_edit.html:39
3754 #: rhodecode/templates/files/files_edit.html:37
3565 #: rhodecode/templates/files/files_ypjax.html:3
3755 #: rhodecode/templates/files/files_ypjax.html:3
3566 msgid "Location"
3756 msgid "Location"
3567 msgstr ""
3757 msgstr ""
3568
3758
3569 #: rhodecode/templates/files/files_add.html:67
3759 #: rhodecode/templates/files/files_add.html:65
3570 msgid "use / to separate directories"
3760 msgid "use / to separate directories"
3571 msgstr ""
3761 msgstr ""
3572
3762
3573 #: rhodecode/templates/files/files_add.html:77
3763 #: rhodecode/templates/files/files_add.html:75
3574 #: rhodecode/templates/files/files_edit.html:63
3764 #: rhodecode/templates/files/files_edit.html:61
3575 #: rhodecode/templates/shortlog/shortlog_data.html:6
3765 #: rhodecode/templates/shortlog/shortlog_data.html:6
3576 msgid "commit message"
3766 msgid "Commit message"
3577 msgstr ""
3767 msgstr ""
3578
3768
3579 #: rhodecode/templates/files/files_add.html:81
3769 #: rhodecode/templates/files/files_add.html:79
3580 #: rhodecode/templates/files/files_edit.html:67
3770 #: rhodecode/templates/files/files_edit.html:65
3581 msgid "Commit changes"
3771 msgid "Commit changes"
3582 msgstr ""
3772 msgstr ""
3583
3773
3584 #: rhodecode/templates/files/files_browser.html:13
3774 #: rhodecode/templates/files/files_browser.html:13
3585 msgid "view"
3775 msgid "View"
3586 msgstr ""
3776 msgstr ""
3587
3777
3588 #: rhodecode/templates/files/files_browser.html:14
3778 #: rhodecode/templates/files/files_browser.html:14
3589 msgid "previous revision"
3779 msgid "Previous revision"
3590 msgstr ""
3780 msgstr ""
3591
3781
3592 #: rhodecode/templates/files/files_browser.html:16
3782 #: rhodecode/templates/files/files_browser.html:16
3593 msgid "next revision"
3783 msgid "Next revision"
3594 msgstr ""
3784 msgstr ""
3595
3785
3596 #: rhodecode/templates/files/files_browser.html:23
3786 #: rhodecode/templates/files/files_browser.html:23
3597 msgid "follow current branch"
3787 msgid "Follow current branch"
3598 msgstr ""
3788 msgstr ""
3599
3789
3600 #: rhodecode/templates/files/files_browser.html:27
3790 #: rhodecode/templates/files/files_browser.html:27
3601 msgid "search file list"
3791 msgid "Search file list"
3602 msgstr ""
3603
3604 #: rhodecode/templates/files/files_browser.html:31
3605 #: rhodecode/templates/shortlog/shortlog_data.html:78
3606 msgid "add new file"
3607 msgstr ""
3792 msgstr ""
3608
3793
3609 #: rhodecode/templates/files/files_browser.html:35
3794 #: rhodecode/templates/files/files_browser.html:35
@@ -3627,34 +3812,39 b' msgid "Last modified"'
3627 msgstr ""
3812 msgstr ""
3628
3813
3629 #: rhodecode/templates/files/files_browser.html:52
3814 #: rhodecode/templates/files/files_browser.html:52
3630 msgid "Last commiter"
3815 msgid "Last committer"
3816 msgstr ""
3817
3818 #: rhodecode/templates/files/files_edit.html:4
3819 #, fuzzy, python-format
3820 msgid "%s Files Edit"
3631 msgstr ""
3821 msgstr ""
3632
3822
3633 #: rhodecode/templates/files/files_edit.html:19
3823 #: rhodecode/templates/files/files_edit.html:19
3634 msgid "edit file"
3824 msgid "Edit file"
3825 msgstr ""
3826
3827 #: rhodecode/templates/files/files_edit.html:47
3828 #: rhodecode/templates/files/files_source.html:23
3829 msgid "Show annotation"
3830 msgstr ""
3831
3832 #: rhodecode/templates/files/files_edit.html:48
3833 #: rhodecode/templates/files/files_source.html:25
3834 #: rhodecode/templates/files/files_source.html:55
3835 msgid "Show as raw"
3635 msgstr ""
3836 msgstr ""
3636
3837
3637 #: rhodecode/templates/files/files_edit.html:49
3838 #: rhodecode/templates/files/files_edit.html:49
3638 #: rhodecode/templates/files/files_source.html:23
3639 msgid "show annotation"
3640 msgstr ""
3641
3642 #: rhodecode/templates/files/files_edit.html:50
3643 #: rhodecode/templates/files/files_source.html:25
3644 #: rhodecode/templates/files/files_source.html:53
3645 msgid "show as raw"
3646 msgstr ""
3647
3648 #: rhodecode/templates/files/files_edit.html:51
3649 #: rhodecode/templates/files/files_source.html:26
3839 #: rhodecode/templates/files/files_source.html:26
3650 msgid "download as raw"
3840 msgid "Download as raw"
3651 msgstr ""
3841 msgstr ""
3652
3842
3653 #: rhodecode/templates/files/files_edit.html:54
3843 #: rhodecode/templates/files/files_edit.html:52
3654 msgid "source"
3844 msgid "Source"
3655 msgstr ""
3845 msgstr ""
3656
3846
3657 #: rhodecode/templates/files/files_edit.html:59
3847 #: rhodecode/templates/files/files_edit.html:57
3658 msgid "Editing file"
3848 msgid "Editing file"
3659 msgstr ""
3849 msgstr ""
3660
3850
@@ -3663,16 +3853,16 b' msgid "History"'
3663 msgstr ""
3853 msgstr ""
3664
3854
3665 #: rhodecode/templates/files/files_history_box.html:9
3855 #: rhodecode/templates/files/files_history_box.html:9
3666 msgid "diff to revision"
3856 msgid "Diff to revision"
3667 msgstr ""
3857 msgstr ""
3668
3858
3669 #: rhodecode/templates/files/files_history_box.html:10
3859 #: rhodecode/templates/files/files_history_box.html:10
3670 #, fuzzy
3860 #, fuzzy
3671 msgid "show at revision"
3861 msgid "Show at revision"
3672 msgstr ""
3862 msgstr ""
3673
3863
3674 #: rhodecode/templates/files/files_history_box.html:11
3864 #: rhodecode/templates/files/files_history_box.html:11
3675 msgid "show full history"
3865 msgid "Show full history"
3676 msgstr ""
3866 msgstr ""
3677
3867
3678 #: rhodecode/templates/files/files_history_box.html:16
3868 #: rhodecode/templates/files/files_history_box.html:16
@@ -3687,15 +3877,28 b' msgid "Load file history"'
3687 msgstr ""
3877 msgstr ""
3688
3878
3689 #: rhodecode/templates/files/files_source.html:21
3879 #: rhodecode/templates/files/files_source.html:21
3690 msgid "show source"
3880 msgid "Show source"
3691 msgstr ""
3881 msgstr ""
3692
3882
3693 #: rhodecode/templates/files/files_source.html:44
3883 #: rhodecode/templates/files/files_source.html:29
3884 #, python-format
3885 msgid "Edit on branch:%s"
3886 msgstr ""
3887
3888 #: rhodecode/templates/files/files_source.html:31
3889 msgid "Edit on branch:?"
3890 msgstr ""
3891
3892 #: rhodecode/templates/files/files_source.html:31
3893 msgid "Editing files allowed only when on branch head revision"
3894 msgstr ""
3895
3896 #: rhodecode/templates/files/files_source.html:46
3694 #, python-format
3897 #, python-format
3695 msgid "Binary file (%s)"
3898 msgid "Binary file (%s)"
3696 msgstr ""
3899 msgstr ""
3697
3900
3698 #: rhodecode/templates/files/files_source.html:53
3901 #: rhodecode/templates/files/files_source.html:55
3699 msgid "File is too big to display"
3902 msgid "File is too big to display"
3700 msgstr ""
3903 msgstr ""
3701
3904
@@ -3716,8 +3919,10 b' msgstr ""'
3716 msgid "%s Followers"
3919 msgid "%s Followers"
3717 msgstr ""
3920 msgstr ""
3718
3921
3719 #: rhodecode/templates/followers/followers.html:13
3922 #: rhodecode/templates/followers/followers.html:9
3720 msgid "followers"
3923 #: rhodecode/templates/summary/summary.html:183
3924 #: rhodecode/templates/summary/summary.html:184
3925 msgid "Followers"
3721 msgstr ""
3926 msgstr ""
3722
3927
3723 #: rhodecode/templates/followers/followers_data.html:12
3928 #: rhodecode/templates/followers/followers_data.html:12
@@ -3729,32 +3934,32 b' msgstr ""'
3729 msgid "%s Fork"
3934 msgid "%s Fork"
3730 msgstr ""
3935 msgstr ""
3731
3936
3732 #: rhodecode/templates/forks/fork.html:31
3937 #: rhodecode/templates/forks/fork.html:28
3733 msgid "Fork name"
3938 msgid "Fork name"
3734 msgstr ""
3939 msgstr ""
3735
3940
3736 #: rhodecode/templates/forks/fork.html:68
3941 #: rhodecode/templates/forks/fork.html:65
3737 msgid "Private"
3942 msgid "Private"
3738 msgstr ""
3943 msgstr ""
3739
3944
3740 #: rhodecode/templates/forks/fork.html:77
3945 #: rhodecode/templates/forks/fork.html:74
3741 msgid "Copy permissions"
3946 msgid "Copy permissions"
3742 msgstr ""
3947 msgstr ""
3743
3948
3744 #: rhodecode/templates/forks/fork.html:81
3949 #: rhodecode/templates/forks/fork.html:78
3745 msgid "Copy permissions from forked repository"
3950 msgid "Copy permissions from forked repository"
3746 msgstr ""
3951 msgstr ""
3747
3952
3748 #: rhodecode/templates/forks/fork.html:86
3953 #: rhodecode/templates/forks/fork.html:84
3749 msgid "Update after clone"
3954 msgid "Update after clone"
3750 msgstr ""
3955 msgstr ""
3751
3956
3752 #: rhodecode/templates/forks/fork.html:90
3957 #: rhodecode/templates/forks/fork.html:88
3753 msgid "Checkout source after making a clone"
3958 msgid "Checkout source after making a clone"
3754 msgstr ""
3959 msgstr ""
3755
3960
3756 #: rhodecode/templates/forks/fork.html:94
3961 #: rhodecode/templates/forks/fork.html:93
3757 msgid "fork this repository"
3962 msgid "Fork this repository"
3758 msgstr ""
3963 msgstr ""
3759
3964
3760 #: rhodecode/templates/forks/forks.html:5
3965 #: rhodecode/templates/forks/forks.html:5
@@ -3762,12 +3967,14 b' msgstr ""'
3762 msgid "%s Forks"
3967 msgid "%s Forks"
3763 msgstr ""
3968 msgstr ""
3764
3969
3765 #: rhodecode/templates/forks/forks.html:13
3970 #: rhodecode/templates/forks/forks.html:9
3766 msgid "forks"
3971 #: rhodecode/templates/summary/summary.html:189
3972 #: rhodecode/templates/summary/summary.html:190
3973 msgid "Forks"
3767 msgstr ""
3974 msgstr ""
3768
3975
3769 #: rhodecode/templates/forks/forks_data.html:17
3976 #: rhodecode/templates/forks/forks_data.html:17
3770 msgid "forked"
3977 msgid "Forked"
3771 msgstr ""
3978 msgstr ""
3772
3979
3773 #: rhodecode/templates/forks/forks_data.html:42
3980 #: rhodecode/templates/forks/forks_data.html:42
@@ -3783,44 +3990,27 b' msgid "RSS journal feed"'
3783 msgstr ""
3990 msgstr ""
3784
3991
3785 #: rhodecode/templates/journal/journal.html:32
3992 #: rhodecode/templates/journal/journal.html:32
3786 #: rhodecode/templates/pullrequests/pullrequest.html:55
3787 msgid "Refresh"
3993 msgid "Refresh"
3788 msgstr ""
3994 msgstr ""
3789
3995
3790 #: rhodecode/templates/journal/journal.html:35
3996 #: rhodecode/templates/journal/journal.html:35
3791 #: rhodecode/templates/journal/public_journal.html:24
3997 #: rhodecode/templates/journal/public_journal.html:24
3792 msgid "RSS feed"
3793 msgstr ""
3794
3795 #: rhodecode/templates/journal/journal.html:38
3796 #: rhodecode/templates/journal/public_journal.html:27
3797 msgid "ATOM feed"
3998 msgid "ATOM feed"
3798 msgstr ""
3999 msgstr ""
3799
4000
3800 #: rhodecode/templates/journal/journal.html:49
4001 #: rhodecode/templates/journal/journal.html:51
3801 msgid "Watched"
4002 msgid "Watched"
3802 msgstr ""
4003 msgstr ""
3803
4004
3804 #: rhodecode/templates/journal/journal.html:54
3805 msgid "ADD"
3806 msgstr ""
3807
3808 #: rhodecode/templates/journal/journal.html:77
3809 msgid "following user"
3810 msgstr ""
3811
3812 #: rhodecode/templates/journal/journal.html:77
3813 msgid "user"
3814 msgstr ""
3815
3816 #: rhodecode/templates/journal/journal.html:110
3817 msgid "You are not following any users or repositories"
3818 msgstr ""
3819
3820 #: rhodecode/templates/journal/journal_data.html:55
4005 #: rhodecode/templates/journal/journal_data.html:55
3821 msgid "No entries yet"
4006 msgid "No entries yet"
3822 msgstr ""
4007 msgstr ""
3823
4008
4009 #: rhodecode/templates/journal/public_journal.html:4
4010 #: rhodecode/templates/journal/public_journal.html:21
4011 msgid "Public Journal"
4012 msgstr ""
4013
3824 #: rhodecode/templates/journal/public_journal.html:13
4014 #: rhodecode/templates/journal/public_journal.html:13
3825 msgid "ATOM public journal feed"
4015 msgid "ATOM public journal feed"
3826 msgstr ""
4016 msgstr ""
@@ -3829,148 +4019,128 b' msgstr ""'
3829 msgid "RSS public journal feed"
4019 msgid "RSS public journal feed"
3830 msgstr ""
4020 msgstr ""
3831
4021
3832 #: rhodecode/templates/journal/public_journal.html:21
3833 msgid "Public Journal"
3834 msgstr ""
3835
3836 #: rhodecode/templates/pullrequests/pullrequest.html:4
4022 #: rhodecode/templates/pullrequests/pullrequest.html:4
3837 #: rhodecode/templates/pullrequests/pullrequest.html:12
4023 #: rhodecode/templates/pullrequests/pullrequest.html:8
3838 msgid "New pull request"
4024 msgid "New pull request"
3839 msgstr ""
4025 msgstr ""
3840
4026
3841 #: rhodecode/templates/pullrequests/pullrequest.html:54
4027 #: rhodecode/templates/pullrequests/pullrequest.html:52
3842 msgid "refresh overview"
3843 msgstr ""
3844
3845 #: rhodecode/templates/pullrequests/pullrequest.html:66
3846 msgid "Detailed compare view"
4028 msgid "Detailed compare view"
3847 msgstr ""
4029 msgstr ""
3848
4030
3849 #: rhodecode/templates/pullrequests/pullrequest.html:70
4031 #: rhodecode/templates/pullrequests/pullrequest.html:56
3850 #: rhodecode/templates/pullrequests/pullrequest_show.html:100
4032 #: rhodecode/templates/pullrequests/pullrequest_show.html:137
3851 msgid "Pull request reviewers"
4033 msgid "Pull request reviewers"
3852 msgstr ""
4034 msgstr ""
3853
4035
3854 #: rhodecode/templates/pullrequests/pullrequest.html:79
4036 #: rhodecode/templates/pullrequests/pullrequest.html:65
3855 #: rhodecode/templates/pullrequests/pullrequest_show.html:112
4037 #: rhodecode/templates/pullrequests/pullrequest_show.html:149
3856 msgid "owner"
4038 msgid "owner"
3857 msgstr ""
4039 msgstr ""
3858
4040
3859 #: rhodecode/templates/pullrequests/pullrequest.html:91
4041 #: rhodecode/templates/pullrequests/pullrequest.html:77
3860 #: rhodecode/templates/pullrequests/pullrequest_show.html:127
3861 msgid "Add reviewer to this pull request."
4042 msgid "Add reviewer to this pull request."
3862 msgstr ""
4043 msgstr ""
3863
4044
3864 #: rhodecode/templates/pullrequests/pullrequest.html:97
4045 #: rhodecode/templates/pullrequests/pullrequest.html:83
3865 msgid "Create new pull request"
4046 msgid "Create new pull request"
3866 msgstr ""
4047 msgstr ""
3867
4048
3868 #: rhodecode/templates/pullrequests/pullrequest.html:106
4049 #: rhodecode/templates/pullrequests/pullrequest.html:92
4050 #: rhodecode/templates/pullrequests/pullrequest_data.html:14
3869 #: rhodecode/templates/pullrequests/pullrequest_show.html:25
4051 #: rhodecode/templates/pullrequests/pullrequest_show.html:25
3870 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:33
3871 msgid "Title"
4052 msgid "Title"
3872 msgstr ""
4053 msgstr ""
3873
4054
3874 #: rhodecode/templates/pullrequests/pullrequest.html:123
4055 #: rhodecode/templates/pullrequests/pullrequest.html:109
3875 msgid "Send pull request"
4056 msgid "Send pull request"
3876 msgstr ""
4057 msgstr ""
3877
4058
3878 #: rhodecode/templates/pullrequests/pullrequest_show.html:23
4059 #: rhodecode/templates/pullrequests/pullrequest_show.html:4
3879 #, python-format
3880 msgid "Closed %s"
3881 msgstr ""
3882
3883 #: rhodecode/templates/pullrequests/pullrequest_show.html:23
3884 #, python-format
4060 #, python-format
3885 msgid "with status %s"
4061 msgid "%s Pull Request #%s"
3886 msgstr ""
4062 msgstr ""
3887
4063
3888 #: rhodecode/templates/pullrequests/pullrequest_show.html:31
4064 #: rhodecode/templates/pullrequests/pullrequest_show.html:35
3889 msgid "Status"
4065 msgid "Review status"
3890 msgstr ""
4066 msgstr ""
3891
4067
3892 #: rhodecode/templates/pullrequests/pullrequest_show.html:36
4068 #: rhodecode/templates/pullrequests/pullrequest_show.html:40
3893 msgid "Pull request status"
4069 msgid "Pull request status"
3894 msgstr ""
4070 msgstr ""
3895
4071
3896 #: rhodecode/templates/pullrequests/pullrequest_show.html:44
4072 #: rhodecode/templates/pullrequests/pullrequest_show.html:53
3897 msgid "Still not reviewed by"
4073 msgid "Still not reviewed by"
3898 msgstr ""
4074 msgstr ""
3899
4075
3900 #: rhodecode/templates/pullrequests/pullrequest_show.html:48
4076 #: rhodecode/templates/pullrequests/pullrequest_show.html:57
3901 #, python-format
4077 #, python-format
3902 msgid "%d reviewer"
4078 msgid "%d reviewer"
3903 msgid_plural "%d reviewers"
4079 msgid_plural "%d reviewers"
3904 msgstr[0] ""
4080 msgstr[0] ""
3905 msgstr[1] ""
4081 msgstr[1] ""
3906
4082
3907 #: rhodecode/templates/pullrequests/pullrequest_show.html:50
4083 #: rhodecode/templates/pullrequests/pullrequest_show.html:59
3908 msgid "pull request was reviewed by all reviewers"
4084 msgid "Pull request was reviewed by all reviewers"
3909 msgstr ""
3910
3911 #: rhodecode/templates/pullrequests/pullrequest_show.html:58
3912 msgid "Created on"
3913 msgstr ""
4085 msgstr ""
3914
4086
3915 #: rhodecode/templates/pullrequests/pullrequest_show.html:65
4087 #: rhodecode/templates/pullrequests/pullrequest_show.html:65
4088 msgid "Origin repository"
4089 msgstr ""
4090
4091 #: rhodecode/templates/pullrequests/pullrequest_show.html:89
4092 msgid "Created on"
4093 msgstr ""
4094
4095 #: rhodecode/templates/pullrequests/pullrequest_show.html:102
3916 msgid "Compare view"
4096 msgid "Compare view"
3917 msgstr ""
4097 msgstr ""
3918
4098
3919 #: rhodecode/templates/pullrequests/pullrequest_show.html:112
4099 #: rhodecode/templates/pullrequests/pullrequest_show.html:149
3920 #, fuzzy
4100 #, fuzzy
3921 msgid "reviewer"
4101 msgid "reviewer"
3922 msgstr ""
4102 msgstr ""
3923
4103
4104 #: rhodecode/templates/pullrequests/pullrequest_show.html:164
4105 msgid "Add or remove reviewer to this pull request."
4106 msgstr ""
4107
4108 #: rhodecode/templates/pullrequests/pullrequest_show.html:168
4109 #, fuzzy
4110 msgid "Save changes"
4111 msgstr ""
4112
3924 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:4
4113 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:4
3925 msgid "all pull requests"
4114 #, python-format
3926 msgstr ""
4115 msgid "%s Pull Requests"
3927
3928 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:12
3929 msgid "All pull requests"
3930 msgstr ""
3931
3932 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:27
3933 msgid "Closed"
3934 msgstr ""
4116 msgstr ""
3935
4117
3936 #: rhodecode/templates/search/search.html:6
4118 #: rhodecode/templates/search/search.html:6
3937 #, python-format
4119 msgid "Search repository"
3938 msgid "Search \"%s\" in repository: %s"
3939 msgstr ""
4120 msgstr ""
3940
4121
3941 #: rhodecode/templates/search/search.html:8
4122 #: rhodecode/templates/search/search.html:8
3942 #, python-format
4123 #: rhodecode/templates/search/search.html:16
3943 msgid "Search \"%s\" in all repositories"
3944 msgstr ""
3945
3946 #: rhodecode/templates/search/search.html:12
3947 #: rhodecode/templates/search/search.html:32
3948 #, python-format
3949 msgid "Search in repository: %s"
3950 msgstr ""
3951
3952 #: rhodecode/templates/search/search.html:14
3953 #: rhodecode/templates/search/search.html:34
3954 msgid "Search in all repositories"
4124 msgid "Search in all repositories"
3955 msgstr ""
4125 msgstr ""
3956
4126
3957 #: rhodecode/templates/search/search.html:48
4127 #: rhodecode/templates/search/search.html:50
3958 msgid "Search term"
4128 msgid "Search term"
3959 msgstr ""
4129 msgstr ""
3960
4130
3961 #: rhodecode/templates/search/search.html:60
4131 #: rhodecode/templates/search/search.html:62
3962 msgid "Search in"
4132 msgid "Search in"
3963 msgstr ""
4133 msgstr ""
3964
4134
3965 #: rhodecode/templates/search/search.html:63
3966 msgid "File contents"
3967 msgstr ""
3968
3969 #: rhodecode/templates/search/search.html:64
3970 msgid "Commit messages"
3971 msgstr ""
3972
3973 #: rhodecode/templates/search/search.html:65
4135 #: rhodecode/templates/search/search.html:65
4136 msgid "File contents"
4137 msgstr ""
4138
4139 #: rhodecode/templates/search/search.html:66
4140 msgid "Commit messages"
4141 msgstr ""
4142
4143 #: rhodecode/templates/search/search.html:67
3974 msgid "File names"
4144 msgid "File names"
3975 msgstr ""
4145 msgstr ""
3976
4146
@@ -3980,39 +4150,23 b' msgstr ""'
3980 msgid "Permission denied"
4150 msgid "Permission denied"
3981 msgstr ""
4151 msgstr ""
3982
4152
3983 #: rhodecode/templates/settings/repo_settings.html:5
3984 #, python-format
3985 msgid "%s Settings"
3986 msgstr ""
3987
3988 #: rhodecode/templates/settings/repo_settings.html:102
3989 msgid "Delete repository"
3990 msgstr ""
3991
3992 #: rhodecode/templates/settings/repo_settings.html:109
3993 msgid "Remove repo"
3994 msgstr ""
3995
3996 #: rhodecode/templates/shortlog/shortlog.html:5
4153 #: rhodecode/templates/shortlog/shortlog.html:5
3997 #, python-format
4154 #, fuzzy, python-format
3998 msgid "%s Shortlog"
4155 msgid "%s Lightweight Changelog"
3999 msgstr ""
4156 msgstr ""
4000
4157
4158 #: rhodecode/templates/shortlog/shortlog.html:11
4001 #: rhodecode/templates/shortlog/shortlog.html:15
4159 #: rhodecode/templates/shortlog/shortlog.html:15
4002 #: rhodecode/templates/shortlog/shortlog.html:19
4160 msgid "Lightweight Changelog"
4003 msgid "shortlog"
4004 msgstr ""
4005
4006 #: rhodecode/templates/shortlog/shortlog_data.html:5
4007 msgid "revision"
4008 msgstr ""
4161 msgstr ""
4009
4162
4010 #: rhodecode/templates/shortlog/shortlog_data.html:7
4163 #: rhodecode/templates/shortlog/shortlog_data.html:7
4011 msgid "age"
4164 msgid "Age"
4012 msgstr ""
4165 msgstr ""
4013
4166
4014 #: rhodecode/templates/shortlog/shortlog_data.html:8
4167 #: rhodecode/templates/shortlog/shortlog_data.html:20
4015 msgid "author"
4168 #, python-format
4169 msgid "Click to open associated pull request #%s"
4016 msgstr ""
4170 msgstr ""
4017
4171
4018 #: rhodecode/templates/shortlog/shortlog_data.html:75
4172 #: rhodecode/templates/shortlog/shortlog_data.html:75
@@ -4032,156 +4186,165 b' msgstr ""'
4032 msgid "%s Summary"
4186 msgid "%s Summary"
4033 msgstr ""
4187 msgstr ""
4034
4188
4035 #: rhodecode/templates/summary/summary.html:12
4189 #: rhodecode/templates/summary/summary.html:16
4036 msgid "summary"
4037 msgstr ""
4038
4039 #: rhodecode/templates/summary/summary.html:20
4040 #, python-format
4190 #, python-format
4041 msgid "repo %s ATOM feed"
4191 msgid "%s ATOM feed"
4042 msgstr ""
4192 msgstr ""
4043
4193
4044 #: rhodecode/templates/summary/summary.html:21
4194 #: rhodecode/templates/summary/summary.html:17
4045 #, python-format
4195 #, python-format
4046 msgid "repo %s RSS feed"
4196 msgid "%s RSS feed"
4047 msgstr ""
4197 msgstr ""
4048
4198
4049 #: rhodecode/templates/summary/summary.html:49
4199 #: rhodecode/templates/summary/summary.html:62
4050 #: rhodecode/templates/summary/summary.html:52
4051 msgid "ATOM"
4052 msgstr ""
4053
4054 #: rhodecode/templates/summary/summary.html:70
4055 #, python-format
4200 #, python-format
4056 msgid "Repository locked by %s"
4201 msgid "Repository locked by %s"
4057 msgstr ""
4202 msgstr ""
4058
4203
4059 #: rhodecode/templates/summary/summary.html:72
4204 #: rhodecode/templates/summary/summary.html:64
4060 msgid "Repository unlocked"
4205 msgid "Repository unlocked"
4061 msgstr ""
4206 msgstr ""
4062
4207
4063 #: rhodecode/templates/summary/summary.html:91
4208 #: rhodecode/templates/summary/summary.html:83
4064 #, python-format
4209 #, python-format
4065 msgid "Non changable ID %s"
4210 msgid "Non changable ID %s"
4066 msgstr ""
4211 msgstr ""
4067
4212
4213 #: rhodecode/templates/summary/summary.html:88
4214 msgid "Public"
4215 msgstr ""
4216
4217 #: rhodecode/templates/summary/summary.html:88
4218 #: rhodecode/templates/summary/summary.html:89
4219 msgid "Fork of"
4220 msgstr ""
4221
4068 #: rhodecode/templates/summary/summary.html:96
4222 #: rhodecode/templates/summary/summary.html:96
4069 msgid "public"
4223 msgid "Remote clone"
4070 msgstr ""
4224 msgstr ""
4071
4225
4072 #: rhodecode/templates/summary/summary.html:104
4226 #: rhodecode/templates/summary/summary.html:117
4073 msgid "remote clone"
4074 msgstr ""
4075
4076 #: rhodecode/templates/summary/summary.html:125
4077 msgid "Contact"
4227 msgid "Contact"
4078 msgstr ""
4228 msgstr ""
4079
4229
4080 #: rhodecode/templates/summary/summary.html:139
4230 #: rhodecode/templates/summary/summary.html:131
4081 msgid "Clone url"
4231 msgid "Clone url"
4082 msgstr ""
4232 msgstr ""
4083
4233
4084 #: rhodecode/templates/summary/summary.html:142
4234 #: rhodecode/templates/summary/summary.html:136
4085 msgid "Show by Name"
4235 msgid "Show by Name"
4086 msgstr ""
4236 msgstr ""
4087
4237
4238 #: rhodecode/templates/summary/summary.html:137
4239 msgid "Show by ID"
4240 msgstr ""
4241
4088 #: rhodecode/templates/summary/summary.html:143
4242 #: rhodecode/templates/summary/summary.html:143
4089 msgid "Show by ID"
4243 msgid "Trending files"
4090 msgstr ""
4244 msgstr ""
4091
4245
4092 #: rhodecode/templates/summary/summary.html:151
4246 #: rhodecode/templates/summary/summary.html:151
4093 msgid "Trending files"
4247 #: rhodecode/templates/summary/summary.html:167
4248 #: rhodecode/templates/summary/summary.html:232
4249 msgid "enable"
4094 msgstr ""
4250 msgstr ""
4095
4251
4096 #: rhodecode/templates/summary/summary.html:159
4252 #: rhodecode/templates/summary/summary.html:159
4097 #: rhodecode/templates/summary/summary.html:175
4098 #: rhodecode/templates/summary/summary.html:203
4099 msgid "enable"
4100 msgstr ""
4101
4102 #: rhodecode/templates/summary/summary.html:167
4103 msgid "Download"
4253 msgid "Download"
4104 msgstr ""
4254 msgstr ""
4105
4255
4256 #: rhodecode/templates/summary/summary.html:163
4257 msgid "There are no downloads yet"
4258 msgstr ""
4259
4260 #: rhodecode/templates/summary/summary.html:165
4261 msgid "Downloads are disabled for this repository"
4262 msgstr ""
4263
4106 #: rhodecode/templates/summary/summary.html:171
4264 #: rhodecode/templates/summary/summary.html:171
4107 msgid "There are no downloads yet"
4108 msgstr ""
4109
4110 #: rhodecode/templates/summary/summary.html:173
4111 msgid "Downloads are disabled for this repository"
4112 msgstr ""
4113
4114 #: rhodecode/templates/summary/summary.html:179
4115 msgid "Download as zip"
4265 msgid "Download as zip"
4116 msgstr ""
4266 msgstr ""
4117
4267
4118 #: rhodecode/templates/summary/summary.html:182
4268 #: rhodecode/templates/summary/summary.html:174
4119 msgid "Check this to download archive with subrepos"
4269 msgid "Check this to download archive with subrepos"
4120 msgstr ""
4270 msgstr ""
4121
4271
4122 #: rhodecode/templates/summary/summary.html:182
4272 #: rhodecode/templates/summary/summary.html:174
4123 msgid "with subrepos"
4273 msgid "with subrepos"
4124 msgstr ""
4274 msgstr ""
4125
4275
4126 #: rhodecode/templates/summary/summary.html:195
4276 #: rhodecode/templates/summary/summary.html:197
4277 msgid "Repository Size"
4278 msgstr ""
4279
4280 #: rhodecode/templates/summary/summary.html:204
4281 #: rhodecode/templates/summary/summary.html:206
4282 msgid "Feed"
4283 msgstr ""
4284
4285 #: rhodecode/templates/summary/summary.html:224
4127 msgid "Commit activity by day / author"
4286 msgid "Commit activity by day / author"
4128 msgstr ""
4287 msgstr ""
4129
4288
4130 #: rhodecode/templates/summary/summary.html:206
4289 #: rhodecode/templates/summary/summary.html:235
4131 msgid "Stats gathered: "
4290 msgid "Stats gathered: "
4132 msgstr ""
4291 msgstr ""
4133
4292
4134 #: rhodecode/templates/summary/summary.html:227
4293 #: rhodecode/templates/summary/summary.html:256
4135 msgid "Shortlog"
4294 msgid "Latest changes"
4136 msgstr ""
4295 msgstr ""
4137
4296
4138 #: rhodecode/templates/summary/summary.html:229
4297 #: rhodecode/templates/summary/summary.html:258
4139 msgid "Quick start"
4298 msgid "Quick start"
4140 msgstr ""
4299 msgstr ""
4141
4300
4142 #: rhodecode/templates/summary/summary.html:243
4301 #: rhodecode/templates/summary/summary.html:272
4143 #, python-format
4302 #, python-format
4144 msgid "Readme file at revision '%s'"
4303 msgid "Readme file at revision '%s'"
4145 msgstr ""
4304 msgstr ""
4146
4305
4147 #: rhodecode/templates/summary/summary.html:246
4306 #: rhodecode/templates/summary/summary.html:275
4148 msgid "Permalink to this readme"
4307 msgid "Permalink to this readme"
4149 msgstr ""
4308 msgstr ""
4150
4309
4151 #: rhodecode/templates/summary/summary.html:304
4310 #: rhodecode/templates/summary/summary.html:333
4152 #, python-format
4311 #, python-format
4153 msgid "Download %s as %s"
4312 msgid "Download %s as %s"
4154 msgstr ""
4313 msgstr ""
4155
4314
4156 #: rhodecode/templates/summary/summary.html:661
4315 #: rhodecode/templates/summary/summary.html:380
4316 msgid "files"
4317 msgstr ""
4318
4319 #: rhodecode/templates/summary/summary.html:690
4157 msgid "commits"
4320 msgid "commits"
4158 msgstr ""
4321 msgstr ""
4159
4322
4160 #: rhodecode/templates/summary/summary.html:662
4323 #: rhodecode/templates/summary/summary.html:691
4161 msgid "files added"
4324 msgid "files added"
4162 msgstr ""
4325 msgstr ""
4163
4326
4164 #: rhodecode/templates/summary/summary.html:663
4327 #: rhodecode/templates/summary/summary.html:692
4165 msgid "files changed"
4328 msgid "files changed"
4166 msgstr ""
4329 msgstr ""
4167
4330
4168 #: rhodecode/templates/summary/summary.html:664
4331 #: rhodecode/templates/summary/summary.html:693
4169 msgid "files removed"
4332 msgid "files removed"
4170 msgstr ""
4333 msgstr ""
4171
4334
4172 #: rhodecode/templates/summary/summary.html:667
4335 #: rhodecode/templates/summary/summary.html:695
4173 msgid "commit"
4336 msgid "commit"
4174 msgstr ""
4337 msgstr ""
4175
4338
4176 #: rhodecode/templates/summary/summary.html:668
4339 #: rhodecode/templates/summary/summary.html:696
4177 msgid "file added"
4340 msgid "file added"
4178 msgstr ""
4341 msgstr ""
4179
4342
4180 #: rhodecode/templates/summary/summary.html:669
4343 #: rhodecode/templates/summary/summary.html:697
4181 msgid "file changed"
4344 msgid "file changed"
4182 msgstr ""
4345 msgstr ""
4183
4346
4184 #: rhodecode/templates/summary/summary.html:670
4347 #: rhodecode/templates/summary/summary.html:698
4185 msgid "file removed"
4348 msgid "file removed"
4186 msgstr ""
4349 msgstr ""
4187
4350
@@ -4190,23 +4353,7 b' msgstr ""'
4190 msgid "%s Tags"
4353 msgid "%s Tags"
4191 msgstr ""
4354 msgstr ""
4192
4355
4193 #: rhodecode/templates/tags/tags.html:29
4356 #: rhodecode/templates/tags/tags.html:26
4194 msgid "Compare tags"
4357 msgid "Compare tags"
4195 msgstr ""
4358 msgstr ""
4196
4359
4197 #~ msgid ""
4198 #~ "%s repository is not mapped to db"
4199 #~ " perhaps it was created or renamed"
4200 #~ " from the file system please run "
4201 #~ "the application again in order to "
4202 #~ "rescan repositories"
4203 #~ msgstr ""
4204
4205 #~ msgid ""
4206 #~ "%s repository is not mapped to db"
4207 #~ " perhaps it was moved or renamed "
4208 #~ "from the filesystem please run the "
4209 #~ "application again in order to rescan "
4210 #~ "repositories"
4211 #~ msgstr ""
4212
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/lib/cleanup.py to rhodecode/lib/paster_commands/cleanup.py
NO CONTENT: file renamed from rhodecode/lib/cleanup.py to rhodecode/lib/paster_commands/cleanup.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/config/rcextensions/make_rcextensions.py to rhodecode/lib/paster_commands/make_rcextensions.py
NO CONTENT: file renamed from rhodecode/config/rcextensions/make_rcextensions.py to rhodecode/lib/paster_commands/make_rcextensions.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/config/setup_rhodecode.py to rhodecode/lib/paster_commands/setup_rhodecode.py
NO CONTENT: file renamed from rhodecode/config/setup_rhodecode.py to rhodecode/lib/paster_commands/setup_rhodecode.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/lib/update_repoinfo.py to rhodecode/lib/paster_commands/update_repoinfo.py
NO CONTENT: file renamed from rhodecode/lib/update_repoinfo.py to rhodecode/lib/paster_commands/update_repoinfo.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file chmod 100644 => 100755
NO CONTENT: modified file chmod 100644 => 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file chmod 100644 => 100755
NO CONTENT: modified file chmod 100644 => 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file chmod 100644 => 100755
NO CONTENT: modified file chmod 100644 => 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now