##// END OF EJS Templates
merge beta in stable branch
marcink -
r1512:bf263968 merge default
parent child Browse files
Show More

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

@@ -0,0 +1,111 b''
1 .. _api:
2
3
4 API
5 ===
6
7
8 Starting from RhodeCode version 1.2 a simple API was implemented.
9 There's a single schema for calling all api methods. API is implemented
10 with JSON protocol both ways. An url to send API request in RhodeCode is
11 <your_server>/_admin/api
12
13
14 All clients need to send JSON data in such format::
15
16 {
17 "api_key":"<api_key>",
18 "method":"<method_name>",
19 "args":{"<arg_key>":"<arg_val>"}
20 }
21
22 Example call for autopulling remotes repos using curl::
23 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repo":"CPython"}}'
24
25 Simply provide
26 - *api_key* for access and permission validation.
27 - *method* is name of method to call
28 - *args* is an key:value list of arguments to pass to method
29
30 .. note::
31
32 api_key can be found in your user account page
33
34
35 RhodeCode API will return always a JSON formatted answer::
36
37 {
38 "result": "<result>",
39 "error": null
40 }
41
42 All responses from API will be `HTTP/1.0 200 OK`, if there's an error while
43 calling api *error* key from response will contain failure description
44 and result will be null.
45
46 API METHODS
47 +++++++++++
48
49
50 pull
51 ----
52
53 Pulls given repo from remote location. Can be used to automatically keep
54 remote repos up to date. This command can be executed only using api_key
55 belonging to user with admin rights
56
57 INPUT::
58
59 api_key:"<api_key>"
60 method: "pull"
61 args: {"repo":<repo_name>}
62
63 OUTPUT::
64
65 result:"Pulled from <repo_name>"
66 error:null
67
68
69 create_user
70 -----------
71
72 Creates new user in RhodeCode. This command can be executed only using api_key
73 belonging to user with admin rights
74
75 INPUT::
76
77 api_key:"<api_key>"
78 method: "create_user"
79 args: {"username": "<username>",
80 "password": "<password>",
81 "active": "<bool>",
82 "admin": "<bool>",
83 "name": "<firstname>",
84 "lastname": "<lastname>",
85 "email": "<useremail>"}
86
87 OUTPUT::
88
89 result:{"id": <newuserid>,
90 "msg":"created new user <username>"}
91 error:null
92
93
94 create_users_group
95 ------------------
96
97 creates new users group. This command can be executed only using api_key
98 belonging to user with admin rights
99
100 INPUT::
101
102 api_key:"<api_key>"
103 method: "create_user"
104 args: {"name": "<groupname>",
105 "active":"<bool>"}
106
107 OUTPUT::
108
109 result:{"id": <newusersgroupid>,
110 "msg":"created new users group <groupname>"}
111 error:null
@@ -0,0 +1,11 b''
1 .. _api_key_access:
2
3 Access to RhodeCode via API KEY
4 ===============================
5
6 Starting from version 1.2 rss/atom feeds and journal feeds
7 can be accessed via **api_key**. This unique key is automatically generated for
8 each user in RhodeCode application. Using this key it is possible to access
9 feeds without having to log in. When user changes his password a new API KEY
10 is generated for him automatically. You can check your API KEY in account
11 settings page. No newline at end of file
@@ -0,0 +1,25 b''
1 .. _backup:
2
3 Backing up RhodeCode
4 ====================
5
6
7 Settings
8 --------
9
10 Just copy your .ini file, it contains all RhodeCode settings.
11
12 Whoosh index
13 ------------
14
15 Whoosh index is located in **/data/index** directory where you installed
16 RhodeCode ie. the same place where the ini file is located
17
18
19 Database
20 --------
21
22 When using sqlite just copy rhodecode.db.
23 Any other database engine requires a manual backup operation.
24
25 Database backup will contain all gathered statistics No newline at end of file
@@ -0,0 +1,54 b''
1 .. _general:
2
3 General RhodeCode usage
4 =======================
5
6
7 Repository deleting
8 -------------------
9
10 Currently when admin/owner deletes a repository, RhodeCode does not physically
11 delete a repository from filesystem, it renames it in a special way so it's
12 not possible to push,clone or access repository. It's worth a notice that,
13 even if someone will be given administrative access to RhodeCode and will
14 delete a repository You can easy restore such action by restoring `rm__<date>`
15 from the repository name, and internal repository storage (.hg/.git)
16
17 Follow current branch in file view
18 ----------------------------------
19
20 In file view when this checkbox is checked the << and >> arrows will jump
21 to changesets within the same branch currently viewing. So for example
22 if someone is viewing files at 'beta' branch and marks `follow current branch`
23 checkbox the << and >> buttons will only show him revisions for 'beta' branch
24
25
26 Compare view from changelog
27 ---------------------------
28
29 Checkboxes in compare view allow users to view combined compare view. You can
30 only show the range between the first and last checkbox (no cherry pick).
31 Clicking more than one checkbox will activate a link in top saying
32 `Show selected changes <from-rev> -> <to-rev>` clicking this will bring
33 compare view
34
35 Compare view is also available from the journal on pushes having more than
36 one changeset
37
38
39
40 Mailing
41 -------
42
43 When administrator will fill up the mailing settings in .ini files
44 RhodeCode will send mails on user registration, or when RhodeCode errors occur
45 on errors the mails will have a detailed traceback of error.
46
47
48 Trending source files
49 ---------------------
50
51 Trending source files are calculated based on pre defined dict of known
52 types and extensions. If You miss some extension or Would like to scan some
53 custom files it's possible to add new types in `LANGUAGES_EXTENSIONS_MAP` dict
54 located in `/rhodecode/lib/celerylib/tasks.py` No newline at end of file
@@ -0,0 +1,223 b''
1 import logging
2 import traceback
3 import formencode
4
5 from formencode import htmlfill
6 from operator import itemgetter
7
8 from pylons import request, response, session, tmpl_context as c, url
9 from pylons.controllers.util import abort, redirect
10 from pylons.i18n.translation import _
11
12 from rhodecode.lib import helpers as h
13 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
14 HasPermissionAnyDecorator
15 from rhodecode.lib.base import BaseController, render
16 from rhodecode.model.db import Group
17 from rhodecode.model.repos_group import ReposGroupModel
18 from rhodecode.model.forms import ReposGroupForm
19
20 log = logging.getLogger(__name__)
21
22
23 class ReposGroupsController(BaseController):
24 """REST Controller styled on the Atom Publishing Protocol"""
25 # To properly map this controller, ensure your config/routing.py
26 # file has a resource setup:
27 # map.resource('repos_group', 'repos_groups')
28
29 @LoginRequired()
30 def __before__(self):
31 super(ReposGroupsController, self).__before__()
32
33 def __load_defaults(self):
34
35 c.repo_groups = [('', '')]
36 parents_link = lambda k: h.literal('&raquo;'.join(
37 map(lambda k: k.group_name,
38 k.parents + [k])
39 )
40 )
41
42 c.repo_groups.extend([(x.group_id, parents_link(x)) for \
43 x in self.sa.query(Group).all()])
44
45 c.repo_groups = sorted(c.repo_groups,
46 key=lambda t: t[1].split('&raquo;')[0])
47 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
48
49 def __load_data(self, group_id):
50 """
51 Load defaults settings for edit, and update
52
53 :param group_id:
54 """
55 self.__load_defaults()
56
57 repo_group = Group.get(group_id)
58
59 data = repo_group.get_dict()
60
61 return data
62
63 @HasPermissionAnyDecorator('hg.admin')
64 def index(self, format='html'):
65 """GET /repos_groups: All items in the collection"""
66 # url('repos_groups')
67
68 sk = lambda g:g.parents[0].group_name if g.parents else g.group_name
69 c.groups = sorted(Group.query().all(), key=sk)
70 return render('admin/repos_groups/repos_groups_show.html')
71
72 @HasPermissionAnyDecorator('hg.admin')
73 def create(self):
74 """POST /repos_groups: Create a new item"""
75 # url('repos_groups')
76 self.__load_defaults()
77 repos_group_model = ReposGroupModel()
78 repos_group_form = ReposGroupForm(available_groups=
79 c.repo_groups_choices)()
80 try:
81 form_result = repos_group_form.to_python(dict(request.POST))
82 repos_group_model.create(form_result)
83 h.flash(_('created repos group %s') \
84 % form_result['group_name'], category='success')
85 #TODO: in futureaction_logger(, '', '', '', self.sa)
86 except formencode.Invalid, errors:
87
88 return htmlfill.render(
89 render('admin/repos_groups/repos_groups_add.html'),
90 defaults=errors.value,
91 errors=errors.error_dict or {},
92 prefix_error=False,
93 encoding="UTF-8")
94 except Exception:
95 log.error(traceback.format_exc())
96 h.flash(_('error occurred during creation of repos group %s') \
97 % request.POST.get('group_name'), category='error')
98
99 return redirect(url('repos_groups'))
100
101
102 @HasPermissionAnyDecorator('hg.admin')
103 def new(self, format='html'):
104 """GET /repos_groups/new: Form to create a new item"""
105 # url('new_repos_group')
106 self.__load_defaults()
107 return render('admin/repos_groups/repos_groups_add.html')
108
109 @HasPermissionAnyDecorator('hg.admin')
110 def update(self, id):
111 """PUT /repos_groups/id: Update an existing item"""
112 # Forms posted to this method should contain a hidden field:
113 # <input type="hidden" name="_method" value="PUT" />
114 # Or using helpers:
115 # h.form(url('repos_group', id=ID),
116 # method='put')
117 # url('repos_group', id=ID)
118
119 self.__load_defaults()
120 c.repos_group = Group.get(id)
121
122 repos_group_model = ReposGroupModel()
123 repos_group_form = ReposGroupForm(edit=True,
124 old_data=c.repos_group.get_dict(),
125 available_groups=
126 c.repo_groups_choices)()
127 try:
128 form_result = repos_group_form.to_python(dict(request.POST))
129 repos_group_model.update(id, form_result)
130 h.flash(_('updated repos group %s') \
131 % form_result['group_name'], category='success')
132 #TODO: in futureaction_logger(, '', '', '', self.sa)
133 except formencode.Invalid, errors:
134
135 return htmlfill.render(
136 render('admin/repos_groups/repos_groups_edit.html'),
137 defaults=errors.value,
138 errors=errors.error_dict or {},
139 prefix_error=False,
140 encoding="UTF-8")
141 except Exception:
142 log.error(traceback.format_exc())
143 h.flash(_('error occurred during update of repos group %s') \
144 % request.POST.get('group_name'), category='error')
145
146 return redirect(url('repos_groups'))
147
148
149 @HasPermissionAnyDecorator('hg.admin')
150 def delete(self, id):
151 """DELETE /repos_groups/id: Delete an existing item"""
152 # Forms posted to this method should contain a hidden field:
153 # <input type="hidden" name="_method" value="DELETE" />
154 # Or using helpers:
155 # h.form(url('repos_group', id=ID),
156 # method='delete')
157 # url('repos_group', id=ID)
158
159 repos_group_model = ReposGroupModel()
160 gr = Group.get(id)
161 repos = gr.repositories.all()
162 if repos:
163 h.flash(_('This group contains %s repositores and cannot be '
164 'deleted' % len(repos)),
165 category='error')
166 return redirect(url('repos_groups'))
167
168 try:
169 repos_group_model.delete(id)
170 h.flash(_('removed repos group %s' % gr.group_name), category='success')
171 #TODO: in future action_logger(, '', '', '', self.sa)
172 except Exception:
173 log.error(traceback.format_exc())
174 h.flash(_('error occurred during deletion of repos group %s' % gr.group_name),
175 category='error')
176
177 return redirect(url('repos_groups'))
178
179 def show(self, id, format='html'):
180 """GET /repos_groups/id: Show a specific item"""
181 # url('repos_group', id=ID)
182
183 c.group = Group.get(id)
184
185 if c.group:
186 c.group_repos = c.group.repositories.all()
187 else:
188 return redirect(url('home'))
189
190 #overwrite our cached list with current filter
191 gr_filter = c.group_repos
192 c.cached_repo_list = self.scm_model.get_repos(all_repos=gr_filter)
193
194 c.repos_list = c.cached_repo_list
195
196 c.repo_cnt = 0
197
198 c.groups = self.sa.query(Group).order_by(Group.group_name)\
199 .filter(Group.group_parent_id == id).all()
200
201 return render('admin/repos_groups/repos_groups.html')
202
203 @HasPermissionAnyDecorator('hg.admin')
204 def edit(self, id, format='html'):
205 """GET /repos_groups/id/edit: Form to edit an existing item"""
206 # url('edit_repos_group', id=ID)
207
208 id_ = int(id)
209
210 c.repos_group = Group.get(id_)
211 defaults = self.__load_data(id_)
212
213 # we need to exclude this group from the group list for editing
214 c.repo_groups = filter(lambda x:x[0] != id_, c.repo_groups)
215
216 return htmlfill.render(
217 render('admin/repos_groups/repos_groups_edit.html'),
218 defaults=defaults,
219 encoding="UTF-8",
220 force_defaults=False
221 )
222
223
@@ -0,0 +1,214 b''
1 # -*- coding: utf-8 -*-
2 """
3 rhodecode.controllers.admin.users_groups
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
6 Users Groups crud controller for pylons
7
8 :created_on: Jan 25, 2011
9 :author: marcink
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
12 """
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
17 #
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
26 import logging
27 import traceback
28 import formencode
29
30 from formencode import htmlfill
31 from pylons import request, session, tmpl_context as c, url, config
32 from pylons.controllers.util import abort, redirect
33 from pylons.i18n.translation import _
34
35 from rhodecode.lib.exceptions import UsersGroupsAssignedException
36 from rhodecode.lib import helpers as h
37 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
38 from rhodecode.lib.base import BaseController, render
39
40 from rhodecode.model.db import User, UsersGroup, Permission, UsersGroupToPerm
41 from rhodecode.model.forms import UserForm, UsersGroupForm
42
43 log = logging.getLogger(__name__)
44
45
46 class UsersGroupsController(BaseController):
47 """REST Controller styled on the Atom Publishing Protocol"""
48 # To properly map this controller, ensure your config/routing.py
49 # file has a resource setup:
50 # map.resource('users_group', 'users_groups')
51
52 @LoginRequired()
53 @HasPermissionAllDecorator('hg.admin')
54 def __before__(self):
55 c.admin_user = session.get('admin_user')
56 c.admin_username = session.get('admin_username')
57 super(UsersGroupsController, self).__before__()
58 c.available_permissions = config['available_permissions']
59
60 def index(self, format='html'):
61 """GET /users_groups: All items in the collection"""
62 # url('users_groups')
63 c.users_groups_list = self.sa.query(UsersGroup).all()
64 return render('admin/users_groups/users_groups.html')
65
66 def create(self):
67 """POST /users_groups: Create a new item"""
68 # url('users_groups')
69
70 users_group_form = UsersGroupForm()()
71 try:
72 form_result = users_group_form.to_python(dict(request.POST))
73 UsersGroup.create(form_result)
74 h.flash(_('created users group %s') \
75 % form_result['users_group_name'], category='success')
76 #action_logger(self.rhodecode_user, 'new_user', '', '', self.sa)
77 except formencode.Invalid, errors:
78 return htmlfill.render(
79 render('admin/users_groups/users_group_add.html'),
80 defaults=errors.value,
81 errors=errors.error_dict or {},
82 prefix_error=False,
83 encoding="UTF-8")
84 except Exception:
85 log.error(traceback.format_exc())
86 h.flash(_('error occurred during creation of users group %s') \
87 % request.POST.get('users_group_name'), category='error')
88
89 return redirect(url('users_groups'))
90
91 def new(self, format='html'):
92 """GET /users_groups/new: Form to create a new item"""
93 # url('new_users_group')
94 return render('admin/users_groups/users_group_add.html')
95
96 def update(self, id):
97 """PUT /users_groups/id: Update an existing item"""
98 # Forms posted to this method should contain a hidden field:
99 # <input type="hidden" name="_method" value="PUT" />
100 # Or using helpers:
101 # h.form(url('users_group', id=ID),
102 # method='put')
103 # url('users_group', id=ID)
104
105 c.users_group = UsersGroup.get(id)
106 c.group_members = [(x.user_id, x.user.username) for x in
107 c.users_group.members]
108
109 c.available_members = [(x.user_id, x.username) for x in
110 self.sa.query(User).all()]
111 users_group_form = UsersGroupForm(edit=True,
112 old_data=c.users_group.get_dict(),
113 available_members=[str(x[0]) for x
114 in c.available_members])()
115
116 try:
117 form_result = users_group_form.to_python(request.POST)
118 UsersGroup.update(id, form_result)
119 h.flash(_('updated users group %s') \
120 % form_result['users_group_name'],
121 category='success')
122 #action_logger(self.rhodecode_user, 'new_user', '', '', self.sa)
123 except formencode.Invalid, errors:
124 e = errors.error_dict or {}
125
126 perm = Permission.get_by_key('hg.create.repository')
127 e.update({'create_repo_perm':
128 UsersGroupToPerm.has_perm(id, perm)})
129
130 return htmlfill.render(
131 render('admin/users_groups/users_group_edit.html'),
132 defaults=errors.value,
133 errors=e,
134 prefix_error=False,
135 encoding="UTF-8")
136 except Exception:
137 log.error(traceback.format_exc())
138 h.flash(_('error occurred during update of users group %s') \
139 % request.POST.get('users_group_name'), category='error')
140
141 return redirect(url('users_groups'))
142
143 def delete(self, id):
144 """DELETE /users_groups/id: Delete an existing item"""
145 # Forms posted to this method should contain a hidden field:
146 # <input type="hidden" name="_method" value="DELETE" />
147 # Or using helpers:
148 # h.form(url('users_group', id=ID),
149 # method='delete')
150 # url('users_group', id=ID)
151
152 try:
153 UsersGroup.delete(id)
154 h.flash(_('successfully deleted users group'), category='success')
155 except UsersGroupsAssignedException, e:
156 h.flash(e, category='error')
157 except Exception:
158 h.flash(_('An error occurred during deletion of users group'),
159 category='error')
160 return redirect(url('users_groups'))
161
162 def show(self, id, format='html'):
163 """GET /users_groups/id: Show a specific item"""
164 # url('users_group', id=ID)
165
166 def edit(self, id, format='html'):
167 """GET /users_groups/id/edit: Form to edit an existing item"""
168 # url('edit_users_group', id=ID)
169
170 c.users_group = self.sa.query(UsersGroup).get(id)
171 if not c.users_group:
172 return redirect(url('users_groups'))
173
174 c.users_group.permissions = {}
175 c.group_members = [(x.user_id, x.user.username) for x in
176 c.users_group.members]
177 c.available_members = [(x.user_id, x.username) for x in
178 self.sa.query(User).all()]
179 defaults = c.users_group.get_dict()
180 perm = Permission.get_by_key('hg.create.repository')
181 defaults.update({'create_repo_perm':
182 UsersGroupToPerm.has_perm(id, perm)})
183 return htmlfill.render(
184 render('admin/users_groups/users_group_edit.html'),
185 defaults=defaults,
186 encoding="UTF-8",
187 force_defaults=False
188 )
189
190 def update_perm(self, id):
191 """PUT /users_perm/id: Update an existing item"""
192 # url('users_group_perm', id=ID, method='put')
193
194 grant_perm = request.POST.get('create_repo_perm', False)
195
196 if grant_perm:
197 perm = Permission.get_by_key('hg.create.none')
198 UsersGroupToPerm.revoke_perm(id, perm)
199
200 perm = Permission.get_by_key('hg.create.repository')
201 UsersGroupToPerm.grant_perm(id, perm)
202 h.flash(_("Granted 'repository create' permission to user"),
203 category='success')
204
205 else:
206 perm = Permission.get_by_key('hg.create.repository')
207 UsersGroupToPerm.revoke_perm(id, perm)
208
209 perm = Permission.get_by_key('hg.create.none')
210 UsersGroupToPerm.grant_perm(id, perm)
211 h.flash(_("Revoked 'repository create' permission to user"),
212 category='success')
213
214 return redirect(url('edit_users_group', id=id))
@@ -0,0 +1,241 b''
1 # -*- coding: utf-8 -*-
2 """
3 rhodecode.controllers.api
4 ~~~~~~~~~~~~~~~~~~~~~~~~~
5
6 JSON RPC controller
7
8 :created_on: Aug 20, 2011
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
12 """
13 # This program is free software; you can redistribute it and/or
14 # modify it under the terms of the GNU General Public License
15 # as published by the Free Software Foundation; version 2
16 # of the License or (at your opinion) any later version of the license.
17 #
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program; if not, write to the Free Software
25 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
26 # MA 02110-1301, USA.
27
28 import inspect
29 import json
30 import logging
31 import types
32 import urllib
33 import traceback
34 from itertools import izip_longest
35
36 from paste.response import replace_header
37
38 from pylons.controllers import WSGIController
39 from pylons.controllers.util import Response
40
41 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError, \
42 HTTPBadRequest, HTTPError
43
44 from rhodecode.model.db import User
45 from rhodecode.lib.auth import AuthUser
46
47 log = logging.getLogger('JSONRPC')
48
49 class JSONRPCError(BaseException):
50
51 def __init__(self, message):
52 self.message = message
53
54 def __str__(self):
55 return str(self.message)
56
57
58 def jsonrpc_error(message, code=None):
59 """Generate a Response object with a JSON-RPC error body"""
60 return Response(body=json.dumps(dict(result=None,
61 error=message)))
62
63
64 class JSONRPCController(WSGIController):
65 """
66 A WSGI-speaking JSON-RPC controller class
67
68 See the specification:
69 <http://json-rpc.org/wiki/specification>`.
70
71 Valid controller return values should be json-serializable objects.
72
73 Sub-classes should catch their exceptions and raise JSONRPCError
74 if they want to pass meaningful errors to the client.
75
76 """
77
78 def _get_method_args(self):
79 """
80 Return `self._rpc_args` to dispatched controller method
81 chosen by __call__
82 """
83 return self._rpc_args
84
85 def __call__(self, environ, start_response):
86 """
87 Parse the request body as JSON, look up the method on the
88 controller and if it exists, dispatch to it.
89 """
90 if 'CONTENT_LENGTH' not in environ:
91 log.debug("No Content-Length")
92 return jsonrpc_error(message="No Content-Length in request")
93 else:
94 length = environ['CONTENT_LENGTH'] or 0
95 length = int(environ['CONTENT_LENGTH'])
96 log.debug('Content-Length: %s', length)
97
98 if length == 0:
99 log.debug("Content-Length is 0")
100 return jsonrpc_error(message="Content-Length is 0")
101
102 raw_body = environ['wsgi.input'].read(length)
103
104 try:
105 json_body = json.loads(urllib.unquote_plus(raw_body))
106 except ValueError as e:
107 #catch JSON errors Here
108 return jsonrpc_error(message="JSON parse error ERR:%s RAW:%r" \
109 % (e, urllib.unquote_plus(raw_body)))
110
111 #check AUTH based on API KEY
112 try:
113 self._req_api_key = json_body['api_key']
114 self._req_method = json_body['method']
115 self._req_params = json_body['args']
116 log.debug('method: %s, params: %s',
117 self._req_method,
118 self._req_params)
119 except KeyError as e:
120 return jsonrpc_error(message='Incorrect JSON query missing %s' % e)
121
122 #check if we can find this session using api_key
123 try:
124 u = User.get_by_api_key(self._req_api_key)
125 auth_u = AuthUser(u.user_id, self._req_api_key)
126 except Exception as e:
127 return jsonrpc_error(message='Invalid API KEY')
128
129 self._error = None
130 try:
131 self._func = self._find_method()
132 except AttributeError, e:
133 return jsonrpc_error(message=str(e))
134
135 # now that we have a method, add self._req_params to
136 # self.kargs and dispatch control to WGIController
137 argspec = inspect.getargspec(self._func)
138 arglist = argspec[0][1:]
139 defaults = argspec[3] or []
140 default_empty = types.NotImplementedType
141
142 kwarglist = list(izip_longest(reversed(arglist),reversed(defaults),
143 fillvalue=default_empty))
144
145 # this is little trick to inject logged in user for
146 # perms decorators to work they expect the controller class to have
147 # rhodecode_user attribute set
148 self.rhodecode_user = auth_u
149
150 # This attribute will need to be first param of a method that uses
151 # api_key, which is translated to instance of user at that name
152 USER_SESSION_ATTR = 'apiuser'
153
154 if USER_SESSION_ATTR not in arglist:
155 return jsonrpc_error(message='This method [%s] does not support '
156 'authentication (missing %s param)' %
157 (self._func.__name__, USER_SESSION_ATTR))
158
159 # get our arglist and check if we provided them as args
160 for arg,default in kwarglist:
161 if arg == USER_SESSION_ATTR:
162 # USER_SESSION_ATTR is something translated from api key and
163 # this is checked before so we don't need validate it
164 continue
165
166 # skip the required param check if it's default value is
167 # NotImplementedType (default_empty)
168 if not self._req_params or (type(default) == default_empty
169 and arg not in self._req_params):
170 return jsonrpc_error(message=('Missing non optional %s arg '
171 'in JSON DATA') % arg)
172
173 self._rpc_args = {USER_SESSION_ATTR:u}
174 self._rpc_args.update(self._req_params)
175
176 self._rpc_args['action'] = self._req_method
177 self._rpc_args['environ'] = environ
178 self._rpc_args['start_response'] = start_response
179
180 status = []
181 headers = []
182 exc_info = []
183 def change_content(new_status, new_headers, new_exc_info=None):
184 status.append(new_status)
185 headers.extend(new_headers)
186 exc_info.append(new_exc_info)
187
188 output = WSGIController.__call__(self, environ, change_content)
189 output = list(output)
190 headers.append(('Content-Length', str(len(output[0]))))
191 replace_header(headers, 'Content-Type', 'application/json')
192 start_response(status[0], headers, exc_info[0])
193
194 return output
195
196 def _dispatch_call(self):
197 """
198 Implement dispatch interface specified by WSGIController
199 """
200 try:
201 raw_response = self._inspect_call(self._func)
202 if isinstance(raw_response, HTTPError):
203 self._error = str(raw_response)
204 except JSONRPCError as e:
205 self._error = str(e)
206 except Exception as e:
207 log.error('Encountered unhandled exception: %s' % traceback.format_exc())
208 json_exc = JSONRPCError('Internal server error')
209 self._error = str(json_exc)
210
211 if self._error is not None:
212 raw_response = None
213
214 response = dict(result=raw_response, error=self._error)
215
216 try:
217 return json.dumps(response)
218 except TypeError, e:
219 log.debug('Error encoding response: %s', e)
220 return json.dumps(dict(result=None,
221 error="Error encoding response"))
222
223 def _find_method(self):
224 """
225 Return method named by `self._req_method` in controller if able
226 """
227 log.debug('Trying to find JSON-RPC method: %s', self._req_method)
228 if self._req_method.startswith('_'):
229 raise AttributeError("Method not allowed")
230
231 try:
232 func = getattr(self, self._req_method, None)
233 except UnicodeEncodeError:
234 raise AttributeError("Problem decoding unicode in requested "
235 "method name.")
236
237 if isinstance(func, types.MethodType):
238 return func
239 else:
240 raise AttributeError("No such method: %s" % self._req_method)
241
@@ -0,0 +1,98 b''
1 import traceback
2 import logging
3
4 from rhodecode.controllers.api import JSONRPCController, JSONRPCError
5 from rhodecode.lib.auth import HasPermissionAllDecorator
6 from rhodecode.model.scm import ScmModel
7
8 from rhodecode.model.db import User, UsersGroup, Repository
9
10 log = logging.getLogger(__name__)
11
12
13 class ApiController(JSONRPCController):
14 """
15 API Controller
16
17
18 Each method needs to have USER as argument this is then based on given
19 API_KEY propagated as instance of user object
20
21 Preferably this should be first argument also
22
23
24 Each function should also **raise** JSONRPCError for any
25 errors that happens
26
27 """
28
29 @HasPermissionAllDecorator('hg.admin')
30 def pull(self, apiuser, repo):
31 """
32 Dispatch pull action on given repo
33
34
35 :param user:
36 :param repo:
37 """
38
39 if Repository.is_valid(repo) is False:
40 raise JSONRPCError('Unknown repo "%s"' % repo)
41
42 try:
43 ScmModel().pull_changes(repo, self.rhodecode_user.username)
44 return 'Pulled from %s' % repo
45 except Exception:
46 raise JSONRPCError('Unable to pull changes from "%s"' % repo)
47
48
49 @HasPermissionAllDecorator('hg.admin')
50 def create_user(self, apiuser, username, password, active, admin, name,
51 lastname, email):
52 """
53 Creates new user
54
55 :param apiuser:
56 :param username:
57 :param password:
58 :param active:
59 :param admin:
60 :param name:
61 :param lastname:
62 :param email:
63 """
64
65 form_data = dict(username=username,
66 password=password,
67 active=active,
68 admin=admin,
69 name=name,
70 lastname=lastname,
71 email=email)
72 try:
73 u = User.create(form_data)
74 return {'id':u.user_id,
75 'msg':'created new user %s' % name}
76 except Exception:
77 log.error(traceback.format_exc())
78 raise JSONRPCError('failed to create user %s' % name)
79
80
81 @HasPermissionAllDecorator('hg.admin')
82 def create_users_group(self, apiuser, name, active):
83 """
84 Creates an new usergroup
85
86 :param name:
87 :param active:
88 """
89 form_data = {'users_group_name':name,
90 'users_group_active':active}
91 try:
92 ug = UsersGroup.create(form_data)
93 return {'id':ug.users_group_id,
94 'msg':'created new users group %s' % name}
95 except Exception:
96 log.error(traceback.format_exc())
97 raise JSONRPCError('failed to create group %s' % name)
98 No newline at end of file
@@ -0,0 +1,57 b''
1 # -*- coding: utf-8 -*-
2 """
3 rhodecode.controllers.followers
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
6 Followers controller for rhodecode
7
8 :created_on: Apr 23, 2011
9 :author: marcink
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
12 """
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
17 #
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 import logging
26
27 from pylons import tmpl_context as c, request
28
29 from rhodecode.lib.helpers import Page
30 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
31 from rhodecode.lib.base import BaseRepoController, render
32 from rhodecode.model.db import Repository, User, UserFollowing
33
34 log = logging.getLogger(__name__)
35
36
37 class FollowersController(BaseRepoController):
38
39 @LoginRequired()
40 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
41 'repository.admin')
42 def __before__(self):
43 super(FollowersController, self).__before__()
44
45 def followers(self, repo_name):
46 p = int(request.params.get('page', 1))
47 repo_id = c.rhodecode_db_repo.repo_id
48 d = UserFollowing.get_repo_followers(repo_id)\
49 .order_by(UserFollowing.follows_from)
50 c.followers_pager = Page(d, page=p, items_per_page=20)
51
52 c.followers_data = render('/followers/followers_data.html')
53
54 if request.environ.get('HTTP_X_PARTIAL_XHR'):
55 return c.followers_data
56
57 return render('/followers/followers.html')
@@ -0,0 +1,56 b''
1 # -*- coding: utf-8 -*-
2 """
3 rhodecode.controllers.forks
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
6 forks controller for rhodecode
7
8 :created_on: Apr 23, 2011
9 :author: marcink
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
12 """
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
17 #
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 import logging
26
27 from pylons import tmpl_context as c, request
28
29 from rhodecode.lib.helpers import Page
30 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
31 from rhodecode.lib.base import BaseRepoController, render
32 from rhodecode.model.db import Repository, User, UserFollowing
33
34 log = logging.getLogger(__name__)
35
36
37 class ForksController(BaseRepoController):
38
39 @LoginRequired()
40 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
41 'repository.admin')
42 def __before__(self):
43 super(ForksController, self).__before__()
44
45 def forks(self, repo_name):
46 p = int(request.params.get('page', 1))
47 repo_id = c.rhodecode_db_repo.repo_id
48 d = Repository.get_repo_forks(repo_id)
49 c.forks_pager = Page(d, page=p, items_per_page=20)
50
51 c.forks_data = render('/forks/forks_data.html')
52
53 if request.environ.get('HTTP_X_PARTIAL_XHR'):
54 return c.forks_data
55
56 return render('/forks/forks.html')
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
This diff has been collapsed as it changes many lines, (2530 lines changed) Show them Hide them
@@ -0,0 +1,2530 b''
1 # Portuguese (Brazil) translations for RhodeCode.
2 # Copyright (C) 2011 Augusto Herrmann
3 # This file is distributed under the same license as the RhodeCode project.
4 # Augusto Herrmann <augusto.herrmann@gmail.com>, 2011.
5 #
6 msgid ""
7 msgstr ""
8 "Project-Id-Version: RhodeCode 1.2.0\n"
9 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10 "POT-Creation-Date: 2011-09-14 15:50-0300\n"
11 "PO-Revision-Date: 2011-09-14 15:53-0300\n"
12 "Last-Translator: Augusto Herrmann <augusto.herrmann@gmail.com>\n"
13 "Language-Team: pt_BR <LL@li.org>\n"
14 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
15 "MIME-Version: 1.0\n"
16 "Content-Type: text/plain; charset=utf-8\n"
17 "Content-Transfer-Encoding: 8bit\n"
18 "Generated-By: Babel 0.9.6\n"
19
20 #: rhodecode/controllers/changeset.py:108
21 #: rhodecode/controllers/changeset.py:149
22 #: rhodecode/controllers/changeset.py:216
23 #: rhodecode/controllers/changeset.py:229
24 msgid "binary file"
25 msgstr "arquivo binário"
26
27 #: rhodecode/controllers/changeset.py:123
28 #: rhodecode/controllers/changeset.py:168
29 msgid "Changeset is to big and was cut off, see raw changeset instead"
30 msgstr "Conjunto de mudanças é grande demais e foi cortado, em vez disso veja o conjunto de mudanças bruto"
31
32 #: rhodecode/controllers/changeset.py:159
33 msgid "Diff is to big and was cut off, see raw diff instead"
34 msgstr "Diff é grande demais e foi cortado, em vez disso veja diff bruto"
35
36 #: rhodecode/controllers/error.py:69
37 msgid "Home page"
38 msgstr "Página inicial"
39
40 #: rhodecode/controllers/error.py:98
41 msgid "The request could not be understood by the server due to malformed syntax."
42 msgstr "A requisição não pôde ser compreendida pelo servidor devido à sintaxe mal formada"
43
44 #: rhodecode/controllers/error.py:101
45 msgid "Unauthorized access to resource"
46 msgstr "Acesso não autorizado ao recurso"
47
48 #: rhodecode/controllers/error.py:103
49 msgid "You don't have permission to view this page"
50 msgstr "Você não tem permissão para ver esta página"
51
52 #: rhodecode/controllers/error.py:105
53 msgid "The resource could not be found"
54 msgstr "O recurso não pôde ser encontrado"
55
56 #: rhodecode/controllers/error.py:107
57 msgid "The server encountered an unexpected condition which prevented it from fulfilling the request."
58 msgstr "O servidor encontrou uma condição inesperada que o impediu de satisfazer a requisição"
59
60 #: rhodecode/controllers/feed.py:48
61 #, python-format
62 msgid "Changes on %s repository"
63 msgstr "Alterações no repositório %s"
64
65 #: rhodecode/controllers/feed.py:49
66 #, python-format
67 msgid "%s %s feed"
68 msgstr "%s - feed %s"
69
70 #: rhodecode/controllers/files.py:72
71 msgid "There are no files yet"
72 msgstr "Ainda não há arquivos"
73
74 #: rhodecode/controllers/files.py:262
75 #, python-format
76 msgid "Edited %s via RhodeCode"
77 msgstr "Editado %s via RhodeCode"
78
79 #: rhodecode/controllers/files.py:267
80 #: rhodecode/templates/files/file_diff.html:40
81 msgid "No changes"
82 msgstr "Sem alterações"
83
84 #: rhodecode/controllers/files.py:278
85 #, python-format
86 msgid "Successfully committed to %s"
87 msgstr "Commit realizado com sucesso para %s"
88
89 #: rhodecode/controllers/files.py:283
90 msgid "Error occurred during commit"
91 msgstr "Ocorreu um erro ao realizar commit"
92
93 #: rhodecode/controllers/files.py:308
94 msgid "downloads disabled"
95 msgstr "downloads desabilitados"
96
97 #: rhodecode/controllers/files.py:313
98 #, python-format
99 msgid "Unknown revision %s"
100 msgstr "Revisão desconhecida %s"
101
102 #: rhodecode/controllers/files.py:315
103 msgid "Empty repository"
104 msgstr "Repositório vazio"
105
106 #: rhodecode/controllers/files.py:317
107 msgid "Unknown archive type"
108 msgstr "Arquivo de tipo desconhecido"
109
110 #: rhodecode/controllers/files.py:385
111 #: rhodecode/controllers/files.py:398
112 msgid "Binary file"
113 msgstr "Arquivo binário"
114
115 #: rhodecode/controllers/files.py:417
116 #: rhodecode/templates/changeset/changeset_range.html:4
117 #: rhodecode/templates/changeset/changeset_range.html:12
118 #: rhodecode/templates/changeset/changeset_range.html:29
119 msgid "Changesets"
120 msgstr "Conjuntos de mudanças"
121
122 #: rhodecode/controllers/files.py:418
123 #: rhodecode/controllers/summary.py:175
124 #: rhodecode/templates/branches/branches.html:5
125 #: rhodecode/templates/summary/summary.html:690
126 msgid "Branches"
127 msgstr "Ramos"
128
129 #: rhodecode/controllers/files.py:419
130 #: rhodecode/controllers/summary.py:176
131 #: rhodecode/templates/summary/summary.html:679
132 #: rhodecode/templates/tags/tags.html:5
133 msgid "Tags"
134 msgstr "Etiquetas"
135
136 #: rhodecode/controllers/journal.py:50
137 #, python-format
138 msgid "%s public journal %s feed"
139 msgstr "diário público de %s - feed %s"
140
141 #: rhodecode/controllers/journal.py:178
142 #: rhodecode/controllers/journal.py:212
143 #: rhodecode/templates/admin/repos/repo_edit.html:171
144 #: rhodecode/templates/base/base.html:50
145 msgid "Public journal"
146 msgstr "Diário público"
147
148 #: rhodecode/controllers/login.py:111
149 msgid "You have successfully registered into rhodecode"
150 msgstr "Você se registrou com sucesso no rhodecode"
151
152 #: rhodecode/controllers/login.py:133
153 msgid "Your password reset link was sent"
154 msgstr "Seu link de reinicialização de senha foi enviado"
155
156 #: rhodecode/controllers/login.py:155
157 msgid "Your password reset was successful, new password has been sent to your email"
158 msgstr "Sua reinicialização de senha foi bem sucedida, sua senha foi enviada ao seu e-mail"
159
160 #: rhodecode/controllers/search.py:109
161 msgid "Invalid search query. Try quoting it."
162 msgstr "Consulta de busca inválida. Tente usar aspas."
163
164 #: rhodecode/controllers/search.py:114
165 msgid "There is no index to search in. Please run whoosh indexer"
166 msgstr "Não há índice onde pesquisa. Por favor execute o indexador whoosh"
167
168 #: rhodecode/controllers/search.py:118
169 msgid "An error occurred during this search operation"
170 msgstr "Ocorreu um erro durante essa operação de busca"
171
172 #: rhodecode/controllers/settings.py:61
173 #: rhodecode/controllers/settings.py:171
174 #, python-format
175 msgid "%s repository is not mapped to db perhaps it was created or renamed from the file system please run the application again in order to rescan repositories"
176 msgstr "repositório %s não está mapeado ao bd. Talvez ele tenha sido criado ou renomeado a partir do sistema de arquivos. Por favor execute a aplicação outra vez para varrer novamente por repositórios"
177
178 #: rhodecode/controllers/settings.py:109
179 #: rhodecode/controllers/admin/repos.py:239
180 #, python-format
181 msgid "Repository %s updated successfully"
182 msgstr "Repositório %s atualizado com sucesso"
183
184 #: rhodecode/controllers/settings.py:126
185 #: rhodecode/controllers/admin/repos.py:257
186 #, python-format
187 msgid "error occurred during update of repository %s"
188 msgstr "ocorreu um erro ao atualizar o repositório %s"
189
190 #: rhodecode/controllers/settings.py:144
191 #: rhodecode/controllers/admin/repos.py:275
192 #, python-format
193 msgid "%s repository is not mapped to db perhaps it was moved or renamed from the filesystem please run the application again in order to rescan repositories"
194 msgstr "repositório %s não está mapeado ao bd. Talvez ele tenha sido movido ou renomeado a partir do sistema de arquivos. Por favor execute a aplicação outra vez para varrer novamente por repositórios"
195
196 #: rhodecode/controllers/settings.py:156
197 #: rhodecode/controllers/admin/repos.py:287
198 #, python-format
199 msgid "deleted repository %s"
200 msgstr "excluído o repositório %s"
201
202 #: rhodecode/controllers/settings.py:159
203 #: rhodecode/controllers/admin/repos.py:297
204 #: rhodecode/controllers/admin/repos.py:303
205 #, python-format
206 msgid "An error occurred during deletion of %s"
207 msgstr "Ocorreu um erro durante a exclusão de %s"
208
209 #: rhodecode/controllers/settings.py:193
210 #, python-format
211 msgid "forked %s repository as %s"
212 msgstr "bifurcado repositório %s como %s"
213
214 #: rhodecode/controllers/settings.py:211
215 #, python-format
216 msgid "An error occurred during repository forking %s"
217 msgstr "Ocorreu um erro ao bifurcar o repositório %s"
218
219 #: rhodecode/controllers/summary.py:123
220 msgid "No data loaded yet"
221 msgstr "Ainda não há dados carregados"
222
223 #: rhodecode/controllers/summary.py:126
224 msgid "Statistics are disabled for this repository"
225 msgstr "As estatísticas estão desabillitadas para este repositório"
226
227 #: rhodecode/controllers/admin/ldap_settings.py:49
228 msgid "BASE"
229 msgstr "BASE"
230
231 #: rhodecode/controllers/admin/ldap_settings.py:50
232 msgid "ONELEVEL"
233 msgstr "UMNÍVEL"
234
235 #: rhodecode/controllers/admin/ldap_settings.py:51
236 msgid "SUBTREE"
237 msgstr "SUBÁRVORE"
238
239 #: rhodecode/controllers/admin/ldap_settings.py:55
240 msgid "NEVER"
241 msgstr "NUNCA"
242
243 #: rhodecode/controllers/admin/ldap_settings.py:56
244 msgid "ALLOW"
245 msgstr "PERMITIR"
246
247 #: rhodecode/controllers/admin/ldap_settings.py:57
248 msgid "TRY"
249 msgstr "TENTAR"
250
251 #: rhodecode/controllers/admin/ldap_settings.py:58
252 msgid "DEMAND"
253 msgstr "EXIGIR"
254
255 #: rhodecode/controllers/admin/ldap_settings.py:59
256 msgid "HARD"
257 msgstr "DIFÍCIL"
258
259 #: rhodecode/controllers/admin/ldap_settings.py:63
260 msgid "No encryption"
261 msgstr "Sem criptografia"
262
263 #: rhodecode/controllers/admin/ldap_settings.py:64
264 msgid "LDAPS connection"
265 msgstr "Conexão LDAPS"
266
267 #: rhodecode/controllers/admin/ldap_settings.py:65
268 msgid "START_TLS on LDAP connection"
269 msgstr "START_TLS na conexão LDAP"
270
271 #: rhodecode/controllers/admin/ldap_settings.py:115
272 msgid "Ldap settings updated successfully"
273 msgstr "Configurações de LDAP atualizadas com sucesso"
274
275 #: rhodecode/controllers/admin/ldap_settings.py:120
276 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
277 msgstr "Não foi possível ativar LDAP. A biblioteca \"python-ldap\" está faltando."
278
279 #: rhodecode/controllers/admin/ldap_settings.py:134
280 msgid "error occurred during update of ldap settings"
281 msgstr "ocorreu um erro ao atualizar as configurações de LDAP"
282
283 #: rhodecode/controllers/admin/permissions.py:56
284 msgid "None"
285 msgstr "Nenhum"
286
287 #: rhodecode/controllers/admin/permissions.py:57
288 msgid "Read"
289 msgstr "Ler"
290
291 #: rhodecode/controllers/admin/permissions.py:58
292 msgid "Write"
293 msgstr "Gravar"
294
295 #: rhodecode/controllers/admin/permissions.py:59
296 #: rhodecode/templates/admin/ldap/ldap.html:9
297 #: rhodecode/templates/admin/permissions/permissions.html:9
298 #: rhodecode/templates/admin/repos/repo_add.html:9
299 #: rhodecode/templates/admin/repos/repo_edit.html:9
300 #: rhodecode/templates/admin/repos/repos.html:10
301 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:8
302 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:8
303 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
304 #: rhodecode/templates/admin/settings/hooks.html:9
305 #: rhodecode/templates/admin/settings/settings.html:9
306 #: rhodecode/templates/admin/users/user_add.html:8
307 #: rhodecode/templates/admin/users/user_edit.html:9
308 #: rhodecode/templates/admin/users/user_edit.html:110
309 #: rhodecode/templates/admin/users/users.html:9
310 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
311 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
312 #: rhodecode/templates/admin/users_groups/users_groups.html:9
313 #: rhodecode/templates/base/base.html:279
314 #: rhodecode/templates/base/base.html:366
315 #: rhodecode/templates/base/base.html:368
316 #: rhodecode/templates/base/base.html:370
317 msgid "Admin"
318 msgstr "Administrador"
319
320 #: rhodecode/controllers/admin/permissions.py:62
321 msgid "disabled"
322 msgstr "desabilitado"
323
324 #: rhodecode/controllers/admin/permissions.py:64
325 msgid "allowed with manual account activation"
326 msgstr "permitido com ativação manual de conta"
327
328 #: rhodecode/controllers/admin/permissions.py:66
329 msgid "allowed with automatic account activation"
330 msgstr "permitido com ativação automática de conta"
331
332 #: rhodecode/controllers/admin/permissions.py:68
333 msgid "Disabled"
334 msgstr "Desabilitado"
335
336 #: rhodecode/controllers/admin/permissions.py:69
337 msgid "Enabled"
338 msgstr "Habilitado"
339
340 #: rhodecode/controllers/admin/permissions.py:102
341 msgid "Default permissions updated successfully"
342 msgstr "Permissões padrões atualizadas com sucesso"
343
344 #: rhodecode/controllers/admin/permissions.py:119
345 msgid "error occurred during update of permissions"
346 msgstr "ocorreu um erro ao atualizar as permissões"
347
348 #: rhodecode/controllers/admin/repos.py:96
349 #, python-format
350 msgid "%s repository is not mapped to db perhaps it was created or renamed from the filesystem please run the application again in order to rescan repositories"
351 msgstr "repositório %s não está mapeado ao bd. Talvez ele tenha sido criado ou renomeado a partir do sistema de arquivos. Por favor execute a aplicação outra vez para varrer novamente por repositórios"
352
353 #: rhodecode/controllers/admin/repos.py:172
354 #, python-format
355 msgid "created repository %s from %s"
356 msgstr "repositório %s criado a partir de %s"
357
358 #: rhodecode/controllers/admin/repos.py:176
359 #, python-format
360 msgid "created repository %s"
361 msgstr "repositório %s criado"
362
363 #: rhodecode/controllers/admin/repos.py:205
364 #, python-format
365 msgid "error occurred during creation of repository %s"
366 msgstr "ocorreu um erro ao criar o repositório %s"
367
368 #: rhodecode/controllers/admin/repos.py:292
369 #, python-format
370 msgid "Cannot delete %s it still contains attached forks"
371 msgstr "Nao é possível excluir %s pois ele ainda contém bifurcações vinculadas"
372
373 #: rhodecode/controllers/admin/repos.py:320
374 msgid "An error occurred during deletion of repository user"
375 msgstr "Ocorreu um erro ao excluir usuário de repositório"
376
377 #: rhodecode/controllers/admin/repos.py:335
378 msgid "An error occurred during deletion of repository users groups"
379 msgstr "Ocorreu um erro ao excluir grupo de usuário de repositório"
380
381 #: rhodecode/controllers/admin/repos.py:352
382 msgid "An error occurred during deletion of repository stats"
383 msgstr "Ocorreu um erro ao excluir estatísticas de repositório"
384
385 #: rhodecode/controllers/admin/repos.py:367
386 msgid "An error occurred during cache invalidation"
387 msgstr "Ocorreu um erro ao invalidar o cache"
388
389 #: rhodecode/controllers/admin/repos.py:387
390 msgid "Updated repository visibility in public journal"
391 msgstr "Atualizada a visibilidade do repositório no diário público"
392
393 #: rhodecode/controllers/admin/repos.py:390
394 msgid "An error occurred during setting this repository in public journal"
395 msgstr "Ocorreu um erro ao ajustar esse repositório no diário público"
396
397 #: rhodecode/controllers/admin/repos.py:395
398 #: rhodecode/model/forms.py:53
399 msgid "Token mismatch"
400 msgstr "Descompasso de Token"
401
402 #: rhodecode/controllers/admin/repos.py:408
403 msgid "Pulled from remote location"
404 msgstr "Realizado pull de localização remota"
405
406 #: rhodecode/controllers/admin/repos.py:410
407 msgid "An error occurred during pull from remote location"
408 msgstr "Ocorreu um erro ao realizar pull de localização remota"
409
410 #: rhodecode/controllers/admin/repos_groups.py:83
411 #, python-format
412 msgid "created repos group %s"
413 msgstr "criado grupo de repositórios %s"
414
415 #: rhodecode/controllers/admin/repos_groups.py:96
416 #, python-format
417 msgid "error occurred during creation of repos group %s"
418 msgstr "ccorreu um erro ao criar grupo de repositório %s"
419
420 #: rhodecode/controllers/admin/repos_groups.py:130
421 #, python-format
422 msgid "updated repos group %s"
423 msgstr "atualizado grupo de repositórios %s"
424
425 #: rhodecode/controllers/admin/repos_groups.py:143
426 #, python-format
427 msgid "error occurred during update of repos group %s"
428 msgstr "ocorreu um erro ao atualizar grupo de repositórios %s"
429
430 #: rhodecode/controllers/admin/repos_groups.py:164
431 #, python-format
432 msgid "This group contains %s repositores and cannot be deleted"
433 msgstr "Esse grupo contém %s repositórios e não pode ser excluído"
434
435 #: rhodecode/controllers/admin/repos_groups.py:171
436 #, python-format
437 msgid "removed repos group %s"
438 msgstr "removido grupo de repositórios %s"
439
440 #: rhodecode/controllers/admin/repos_groups.py:175
441 #, python-format
442 msgid "error occurred during deletion of repos group %s"
443 msgstr "ccorreu um erro ao excluir grupo de repositórios %s"
444
445 #: rhodecode/controllers/admin/settings.py:109
446 #, python-format
447 msgid "Repositories successfully rescanned added: %s,removed: %s"
448 msgstr "Repositórios varridos com sucesso adicionados: %s, removidos: %s"
449
450 #: rhodecode/controllers/admin/settings.py:118
451 msgid "Whoosh reindex task scheduled"
452 msgstr "Tarefa de reindexação do whoosh agendada"
453
454 #: rhodecode/controllers/admin/settings.py:143
455 msgid "Updated application settings"
456 msgstr "Configurações da aplicação atualizadas"
457
458 #: rhodecode/controllers/admin/settings.py:148
459 #: rhodecode/controllers/admin/settings.py:215
460 msgid "error occurred during updating application settings"
461 msgstr "ocorreu um erro ao atualizar as configurações da aplicação"
462
463 #: rhodecode/controllers/admin/settings.py:210
464 msgid "Updated mercurial settings"
465 msgstr "Atualizadas as configurações do mercurial"
466
467 #: rhodecode/controllers/admin/settings.py:236
468 msgid "Added new hook"
469 msgstr "Adicionado novo gancho"
470
471 #: rhodecode/controllers/admin/settings.py:247
472 msgid "Updated hooks"
473 msgstr "Atualizados os ganchos"
474
475 #: rhodecode/controllers/admin/settings.py:251
476 msgid "error occurred during hook creation"
477 msgstr "ocorreu um erro ao criar gancho"
478
479 #: rhodecode/controllers/admin/settings.py:310
480 msgid "You can't edit this user since it's crucial for entire application"
481 msgstr "Você não pode editar esse usuário pois ele é crucial para toda a aplicação"
482
483 #: rhodecode/controllers/admin/settings.py:339
484 msgid "Your account was updated successfully"
485 msgstr "Sua conta foi atualizada com sucesso"
486
487 #: rhodecode/controllers/admin/settings.py:359
488 #: rhodecode/controllers/admin/users.py:130
489 #, python-format
490 msgid "error occurred during update of user %s"
491 msgstr "ocorreu um erro ao atualizar o usuário %s"
492
493 #: rhodecode/controllers/admin/users.py:78
494 #, python-format
495 msgid "created user %s"
496 msgstr "usuário %s criado"
497
498 #: rhodecode/controllers/admin/users.py:90
499 #, python-format
500 msgid "error occurred during creation of user %s"
501 msgstr "ocorreu um erro ao criar o usuário %s"
502
503 #: rhodecode/controllers/admin/users.py:116
504 msgid "User updated successfully"
505 msgstr "Usuário atualizado com sucesso"
506
507 #: rhodecode/controllers/admin/users.py:146
508 msgid "successfully deleted user"
509 msgstr "usuário excluído com sucesso"
510
511 #: rhodecode/controllers/admin/users.py:150
512 msgid "An error occurred during deletion of user"
513 msgstr "Ocorreu um erro ao excluir o usuário"
514
515 #: rhodecode/controllers/admin/users.py:166
516 msgid "You can't edit this user"
517 msgstr "Você não pode editar esse usuário"
518
519 #: rhodecode/controllers/admin/users.py:195
520 #: rhodecode/controllers/admin/users_groups.py:202
521 msgid "Granted 'repository create' permission to user"
522 msgstr "Concedida permissão de 'criar repositório' ao usuário"
523
524 #: rhodecode/controllers/admin/users.py:204
525 #: rhodecode/controllers/admin/users_groups.py:211
526 msgid "Revoked 'repository create' permission to user"
527 msgstr "Revogada permissão de 'criar repositório' ao usuário"
528
529 #: rhodecode/controllers/admin/users_groups.py:74
530 #, python-format
531 msgid "created users group %s"
532 msgstr "criado grupo de usuários %s"
533
534 #: rhodecode/controllers/admin/users_groups.py:86
535 #, python-format
536 msgid "error occurred during creation of users group %s"
537 msgstr "ocorreu um erro ao criar o grupo de usuários %s"
538
539 #: rhodecode/controllers/admin/users_groups.py:119
540 #, python-format
541 msgid "updated users group %s"
542 msgstr "grupo de usuários %s atualizado"
543
544 #: rhodecode/controllers/admin/users_groups.py:138
545 #, python-format
546 msgid "error occurred during update of users group %s"
547 msgstr "ocorreu um erro ao atualizar o grupo de usuários %s"
548
549 #: rhodecode/controllers/admin/users_groups.py:154
550 msgid "successfully deleted users group"
551 msgstr "grupo de usuários excluído com sucesso"
552
553 #: rhodecode/controllers/admin/users_groups.py:158
554 msgid "An error occurred during deletion of users group"
555 msgstr "Ocorreu um erro ao excluir o grupo de usuários"
556
557 #: rhodecode/lib/__init__.py:279
558 msgid "year"
559 msgstr "ano"
560
561 #: rhodecode/lib/__init__.py:280
562 msgid "month"
563 msgstr "mês"
564
565 #: rhodecode/lib/__init__.py:281
566 msgid "day"
567 msgstr "dia"
568
569 #: rhodecode/lib/__init__.py:282
570 msgid "hour"
571 msgstr "hora"
572
573 #: rhodecode/lib/__init__.py:283
574 msgid "minute"
575 msgstr "minuto"
576
577 #: rhodecode/lib/__init__.py:284
578 msgid "second"
579 msgstr "segundo"
580
581 #: rhodecode/lib/__init__.py:293
582 msgid "ago"
583 msgstr "atrás"
584
585 #: rhodecode/lib/__init__.py:296
586 msgid "just now"
587 msgstr "agora há pouco"
588
589 #: rhodecode/lib/auth.py:377
590 msgid "You need to be a registered user to perform this action"
591 msgstr "Você precisa ser um usuário registrado para realizar essa ação"
592
593 #: rhodecode/lib/auth.py:421
594 msgid "You need to be a signed in to view this page"
595 msgstr "Você precisa estar logado para ver essa página"
596
597 #: rhodecode/lib/helpers.py:307
598 msgid "True"
599 msgstr "Verdadeiro"
600
601 #: rhodecode/lib/helpers.py:311
602 msgid "False"
603 msgstr "Falso"
604
605 #: rhodecode/lib/helpers.py:352
606 #, python-format
607 msgid "Show all combined changesets %s->%s"
608 msgstr "Ver todos os conjuntos de mudanças combinados %s->%s"
609
610 #: rhodecode/lib/helpers.py:356
611 msgid "compare view"
612 msgstr "comparar exibir"
613
614 #: rhodecode/lib/helpers.py:365
615 msgid "and"
616 msgstr "e"
617
618 #: rhodecode/lib/helpers.py:365
619 #, python-format
620 msgid "%s more"
621 msgstr "%s mais"
622
623 #: rhodecode/lib/helpers.py:367
624 #: rhodecode/templates/changelog/changelog.html:14
625 #: rhodecode/templates/changelog/changelog.html:39
626 msgid "revisions"
627 msgstr "revisões"
628
629 #: rhodecode/lib/helpers.py:385
630 msgid "fork name "
631 msgstr "nome da bifurcação"
632
633 #: rhodecode/lib/helpers.py:388
634 msgid "[deleted] repository"
635 msgstr "repositório [excluído]"
636
637 #: rhodecode/lib/helpers.py:389
638 #: rhodecode/lib/helpers.py:393
639 msgid "[created] repository"
640 msgstr "repositório [criado]"
641
642 #: rhodecode/lib/helpers.py:390
643 #: rhodecode/lib/helpers.py:394
644 msgid "[forked] repository"
645 msgstr "repositório [bifurcado]"
646
647 #: rhodecode/lib/helpers.py:391
648 #: rhodecode/lib/helpers.py:395
649 msgid "[updated] repository"
650 msgstr "repositório [atualizado]"
651
652 #: rhodecode/lib/helpers.py:392
653 msgid "[delete] repository"
654 msgstr "[excluir] repositório"
655
656 #: rhodecode/lib/helpers.py:396
657 msgid "[pushed] into"
658 msgstr "[realizado push] para"
659
660 #: rhodecode/lib/helpers.py:397
661 msgid "[committed via RhodeCode] into"
662 msgstr "[realizado commit via RhodeCode] para"
663
664 #: rhodecode/lib/helpers.py:398
665 msgid "[pulled from remote] into"
666 msgstr "[realizado pull remoto] para"
667
668 #: rhodecode/lib/helpers.py:399
669 msgid "[pulled] from"
670 msgstr "[realizado pull] a partir de"
671
672 #: rhodecode/lib/helpers.py:400
673 msgid "[started following] repository"
674 msgstr "[passou a seguir] o repositório"
675
676 #: rhodecode/lib/helpers.py:401
677 msgid "[stopped following] repository"
678 msgstr "[parou de seguir] o repositório"
679
680 #: rhodecode/lib/helpers.py:577
681 #, python-format
682 msgid " and %s more"
683 msgstr " e mais %s"
684
685 #: rhodecode/lib/helpers.py:581
686 msgid "No Files"
687 msgstr "Nenhum Arquivo"
688
689 #: rhodecode/model/forms.py:66
690 msgid "Invalid username"
691 msgstr "Nome de usuário inválido"
692
693 #: rhodecode/model/forms.py:75
694 msgid "This username already exists"
695 msgstr "Esse nome de usuário já existe"
696
697 #: rhodecode/model/forms.py:79
698 msgid "Username may only contain alphanumeric characters underscores, periods or dashes and must begin with alphanumeric character"
699 msgstr "Nome de usuário pode conter somente caracteres alfanuméricos, sublinha, pontos e hífens e deve iniciar com caractere alfanumérico"
700
701 #: rhodecode/model/forms.py:94
702 msgid "Invalid group name"
703 msgstr "Nome de grupo inválido"
704
705 #: rhodecode/model/forms.py:104
706 msgid "This users group already exists"
707 msgstr "Esse grupo de usuários já existe"
708
709 #: rhodecode/model/forms.py:110
710 msgid "Group name may only contain alphanumeric characters underscores, periods or dashes and must begin with alphanumeric character"
711 msgstr "Nome de grupo pode conter somente caracteres alfanuméricos, sublinha, pontos e hífens e deve iniciar com caractere alfanumérico"
712
713 #: rhodecode/model/forms.py:132
714 msgid "Cannot assign this group as parent"
715 msgstr "Não é possível associar esse grupo como progenitor"
716
717 #: rhodecode/model/forms.py:148
718 msgid "This group already exists"
719 msgstr "Esse grupo já existe"
720
721 #: rhodecode/model/forms.py:164
722 #: rhodecode/model/forms.py:172
723 #: rhodecode/model/forms.py:180
724 msgid "Invalid characters in password"
725 msgstr "Caracteres inválidos na senha"
726
727 #: rhodecode/model/forms.py:191
728 msgid "Passwords do not match"
729 msgstr "Senhas não conferem"
730
731 #: rhodecode/model/forms.py:196
732 msgid "invalid password"
733 msgstr "senha inválida"
734
735 #: rhodecode/model/forms.py:197
736 msgid "invalid user name"
737 msgstr "nome de usuário inválido"
738
739 #: rhodecode/model/forms.py:198
740 msgid "Your account is disabled"
741 msgstr "Sua conta está desabilitada"
742
743 #: rhodecode/model/forms.py:233
744 msgid "This username is not valid"
745 msgstr "Esse nome de usuário não é válido"
746
747 #: rhodecode/model/forms.py:245
748 msgid "This repository name is disallowed"
749 msgstr "Esse nome de repositório não é permitido"
750
751 #: rhodecode/model/forms.py:266
752 #, python-format
753 msgid "This repository already exists in group \"%s\""
754 msgstr "Esse repositório já existe no grupo \"%s\""
755
756 #: rhodecode/model/forms.py:274
757 msgid "This repository already exists"
758 msgstr "Esse repositório já existe"
759
760 #: rhodecode/model/forms.py:312
761 #: rhodecode/model/forms.py:319
762 msgid "invalid clone url"
763 msgstr "URL de clonagem inválida"
764
765 #: rhodecode/model/forms.py:322
766 msgid "Invalid clone url, provide a valid clone http\\s url"
767 msgstr "URL de clonagem inválida, forneça uma URL válida de clonagem http\\s"
768
769 #: rhodecode/model/forms.py:334
770 msgid "Fork have to be the same type as original"
771 msgstr "Bifurcação precisa ser do mesmo tipo que o original"
772
773 #: rhodecode/model/forms.py:341
774 msgid "This username or users group name is not valid"
775 msgstr "Esse nome de usuário ou nome de grupo de usuários não é válido"
776
777 #: rhodecode/model/forms.py:403
778 msgid "This is not a valid path"
779 msgstr "Esse não é um caminho válido"
780
781 #: rhodecode/model/forms.py:416
782 msgid "This e-mail address is already taken"
783 msgstr "Esse endereço de e-mail já está tomado"
784
785 #: rhodecode/model/forms.py:427
786 msgid "This e-mail address doesn't exist."
787 msgstr "Esse endereço de e-mail não existe."
788
789 #: rhodecode/model/forms.py:447
790 msgid "The LDAP Login attribute of the CN must be specified - this is the name of the attribute that is equivalent to 'username'"
791 msgstr "O atributo de login LDAP do CN deve ser especificado - isto é o nome do atributo que é equivalente ao 'nome de usuário'"
792
793 #: rhodecode/model/forms.py:466
794 msgid "Please enter a login"
795 msgstr "Por favor entre um login"
796
797 #: rhodecode/model/forms.py:467
798 #, python-format
799 msgid "Enter a value %(min)i characters long or more"
800 msgstr "Entre um valor com %(min)i caracteres ou mais"
801
802 #: rhodecode/model/forms.py:475
803 msgid "Please enter a password"
804 msgstr "Por favor entre com uma senha"
805
806 #: rhodecode/model/forms.py:476
807 #, python-format
808 msgid "Enter %(min)i characters or more"
809 msgstr "Entre com %(min)i caracteres ou mais"
810
811 #: rhodecode/model/user.py:145
812 msgid "[RhodeCode] New User registration"
813 msgstr "[RhodeCode] Registro de Novo Usuário"
814
815 #: rhodecode/model/user.py:157
816 #: rhodecode/model/user.py:179
817 msgid "You can't Edit this user since it's crucial for entire application"
818 msgstr "Você não pode Editar esse usuário, pois ele é crucial para toda a aplicação"
819
820 #: rhodecode/model/user.py:201
821 msgid "You can't remove this user since it's crucial for entire application"
822 msgstr "Você não pode remover esse usuário, pois ele é crucial para toda a aplicação"
823
824 #: rhodecode/model/user.py:204
825 #, python-format
826 msgid "This user still owns %s repositories and cannot be removed. Switch owners or remove those repositories"
827 msgstr "Esse usuário ainda é dono de %s repositórios e não pode ser removido. Troque os donos ou remova esses repositórios"
828
829 #: rhodecode/templates/index.html:4
830 msgid "Dashboard"
831 msgstr "Painel de Controle"
832
833 #: rhodecode/templates/index_base.html:22
834 #: rhodecode/templates/admin/users/user_edit_my_account.html:102
835 msgid "quick filter..."
836 msgstr "filtro rápido..."
837
838 #: rhodecode/templates/index_base.html:23
839 #: rhodecode/templates/base/base.html:300
840 msgid "repositories"
841 msgstr "repositórios"
842
843 #: rhodecode/templates/index_base.html:29
844 #: rhodecode/templates/admin/repos/repos.html:22
845 msgid "ADD NEW REPOSITORY"
846 msgstr "ADICIONAR NOVO REPOSITÓRIO"
847
848 #: rhodecode/templates/index_base.html:41
849 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:32
850 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:32
851 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:33
852 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
853 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
854 msgid "Group name"
855 msgstr "Nome do grupo"
856
857 #: rhodecode/templates/index_base.html:42
858 #: rhodecode/templates/index_base.html:73
859 #: rhodecode/templates/admin/repos/repo_add_base.html:44
860 #: rhodecode/templates/admin/repos/repo_edit.html:64
861 #: rhodecode/templates/admin/repos/repos.html:31
862 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:41
863 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:41
864 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:34
865 #: rhodecode/templates/settings/repo_fork.html:40
866 #: rhodecode/templates/settings/repo_settings.html:40
867 #: rhodecode/templates/summary/summary.html:92
868 msgid "Description"
869 msgstr "Descrição"
870
871 #: rhodecode/templates/index_base.html:53
872 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
873 msgid "Repositories group"
874 msgstr "Grupo de repositórios"
875
876 #: rhodecode/templates/index_base.html:72
877 #: rhodecode/templates/admin/repos/repo_add_base.html:9
878 #: rhodecode/templates/admin/repos/repo_edit.html:32
879 #: rhodecode/templates/admin/repos/repos.html:30
880 #: rhodecode/templates/admin/users/user_edit_my_account.html:117
881 #: rhodecode/templates/files/files_browser.html:157
882 #: rhodecode/templates/settings/repo_settings.html:31
883 #: rhodecode/templates/summary/summary.html:31
884 #: rhodecode/templates/summary/summary.html:107
885 msgid "Name"
886 msgstr "Nome"
887
888 #: rhodecode/templates/index_base.html:74
889 #: rhodecode/templates/admin/repos/repos.html:32
890 #: rhodecode/templates/summary/summary.html:114
891 msgid "Last change"
892 msgstr "Última alteração"
893
894 #: rhodecode/templates/index_base.html:75
895 #: rhodecode/templates/admin/repos/repos.html:33
896 msgid "Tip"
897 msgstr "Ponta"
898
899 #: rhodecode/templates/index_base.html:76
900 #: rhodecode/templates/admin/repos/repo_edit.html:97
901 msgid "Owner"
902 msgstr "Dono"
903
904 #: rhodecode/templates/index_base.html:77
905 #: rhodecode/templates/journal/public_journal.html:20
906 #: rhodecode/templates/summary/summary.html:180
907 #: rhodecode/templates/summary/summary.html:183
908 msgid "RSS"
909 msgstr "RSS"
910
911 #: rhodecode/templates/index_base.html:78
912 #: rhodecode/templates/journal/public_journal.html:23
913 #: rhodecode/templates/summary/summary.html:181
914 #: rhodecode/templates/summary/summary.html:184
915 msgid "Atom"
916 msgstr "Atom"
917
918 #: rhodecode/templates/index_base.html:87
919 #: rhodecode/templates/index_base.html:89
920 #: rhodecode/templates/index_base.html:91
921 #: rhodecode/templates/base/base.html:209
922 #: rhodecode/templates/base/base.html:211
923 #: rhodecode/templates/base/base.html:213
924 #: rhodecode/templates/summary/summary.html:4
925 msgid "Summary"
926 msgstr "Sumário"
927
928 #: rhodecode/templates/index_base.html:95
929 #: rhodecode/templates/index_base.html:97
930 #: rhodecode/templates/index_base.html:99
931 #: rhodecode/templates/base/base.html:225
932 #: rhodecode/templates/base/base.html:227
933 #: rhodecode/templates/base/base.html:229
934 #: rhodecode/templates/changelog/changelog.html:6
935 #: rhodecode/templates/changelog/changelog.html:14
936 msgid "Changelog"
937 msgstr "Registro de alterações"
938
939 #: rhodecode/templates/index_base.html:103
940 #: rhodecode/templates/index_base.html:105
941 #: rhodecode/templates/index_base.html:107
942 #: rhodecode/templates/base/base.html:268
943 #: rhodecode/templates/base/base.html:270
944 #: rhodecode/templates/base/base.html:272
945 #: rhodecode/templates/files/files.html:4
946 msgid "Files"
947 msgstr "Arquivos"
948
949 #: rhodecode/templates/index_base.html:116
950 #: rhodecode/templates/admin/repos/repos.html:42
951 #: rhodecode/templates/admin/users/user_edit_my_account.html:127
952 #: rhodecode/templates/summary/summary.html:48
953 msgid "Mercurial repository"
954 msgstr "Repositório Mercurial"
955
956 #: rhodecode/templates/index_base.html:118
957 #: rhodecode/templates/admin/repos/repos.html:44
958 #: rhodecode/templates/admin/users/user_edit_my_account.html:129
959 #: rhodecode/templates/summary/summary.html:51
960 msgid "Git repository"
961 msgstr "Repositório Git"
962
963 #: rhodecode/templates/index_base.html:123
964 #: rhodecode/templates/admin/repos/repo_edit_perms.html:16
965 #: rhodecode/templates/journal/journal.html:53
966 #: rhodecode/templates/summary/summary.html:56
967 msgid "private repository"
968 msgstr "repositório privado"
969
970 #: rhodecode/templates/index_base.html:125
971 #: rhodecode/templates/journal/journal.html:55
972 #: rhodecode/templates/summary/summary.html:58
973 msgid "public repository"
974 msgstr "repositório público"
975
976 #: rhodecode/templates/index_base.html:133
977 #: rhodecode/templates/base/base.html:291
978 #: rhodecode/templates/settings/repo_fork.html:13
979 msgid "fork"
980 msgstr "bifurcação"
981
982 #: rhodecode/templates/index_base.html:134
983 #: rhodecode/templates/admin/repos/repos.html:60
984 #: rhodecode/templates/admin/users/user_edit_my_account.html:143
985 #: rhodecode/templates/summary/summary.html:69
986 #: rhodecode/templates/summary/summary.html:71
987 msgid "Fork of"
988 msgstr "Bifurcação de"
989
990 #: rhodecode/templates/index_base.html:155
991 #: rhodecode/templates/admin/repos/repos.html:73
992 msgid "No changesets yet"
993 msgstr "Ainda não há conjuntos de mudanças"
994
995 #: rhodecode/templates/index_base.html:161
996 #: rhodecode/templates/index_base.html:163
997 #, python-format
998 msgid "Subscribe to %s rss feed"
999 msgstr "Assinar o feed rss de %s"
1000
1001 #: rhodecode/templates/index_base.html:168
1002 #: rhodecode/templates/index_base.html:170
1003 #, python-format
1004 msgid "Subscribe to %s atom feed"
1005 msgstr "Assinar o feed atom de %s"
1006
1007 #: rhodecode/templates/login.html:5
1008 #: rhodecode/templates/login.html:54
1009 #: rhodecode/templates/base/base.html:38
1010 msgid "Sign In"
1011 msgstr "Entrar"
1012
1013 #: rhodecode/templates/login.html:21
1014 msgid "Sign In to"
1015 msgstr "Entrar em"
1016
1017 #: rhodecode/templates/login.html:31
1018 #: rhodecode/templates/register.html:20
1019 #: rhodecode/templates/admin/admin_log.html:5
1020 #: rhodecode/templates/admin/users/user_add.html:32
1021 #: rhodecode/templates/admin/users/user_edit.html:47
1022 #: rhodecode/templates/admin/users/user_edit_my_account.html:45
1023 #: rhodecode/templates/base/base.html:15
1024 #: rhodecode/templates/summary/summary.html:106
1025 msgid "Username"
1026 msgstr "Nome de usuário"
1027
1028 #: rhodecode/templates/login.html:40
1029 #: rhodecode/templates/register.html:29
1030 #: rhodecode/templates/admin/ldap/ldap.html:46
1031 #: rhodecode/templates/admin/users/user_add.html:41
1032 #: rhodecode/templates/base/base.html:24
1033 msgid "Password"
1034 msgstr "Senha"
1035
1036 #: rhodecode/templates/login.html:60
1037 msgid "Forgot your password ?"
1038 msgstr "Esqueceu sua senha ?"
1039
1040 #: rhodecode/templates/login.html:63
1041 #: rhodecode/templates/base/base.html:35
1042 msgid "Don't have an account ?"
1043 msgstr "Não possui uma conta ?"
1044
1045 #: rhodecode/templates/password_reset.html:5
1046 msgid "Reset your password"
1047 msgstr "Reinicializar sua senha"
1048
1049 #: rhodecode/templates/password_reset.html:11
1050 msgid "Reset your password to"
1051 msgstr "Reinicializar sua senha para"
1052
1053 #: rhodecode/templates/password_reset.html:21
1054 msgid "Email address"
1055 msgstr "Endereço de e-mail"
1056
1057 #: rhodecode/templates/password_reset.html:30
1058 msgid "Reset my password"
1059 msgstr "Reinicializar minha senha"
1060
1061 #: rhodecode/templates/password_reset.html:31
1062 msgid "Password reset link will be send to matching email address"
1063 msgstr "Link de reinicialização de senha será enviado ao endereço de e-mail correspondente"
1064
1065 #: rhodecode/templates/register.html:5
1066 #: rhodecode/templates/register.html:74
1067 msgid "Sign Up"
1068 msgstr "Inscrever-se"
1069
1070 #: rhodecode/templates/register.html:11
1071 msgid "Sign Up to"
1072 msgstr "Inscrever-se em"
1073
1074 #: rhodecode/templates/register.html:38
1075 msgid "Re-enter password"
1076 msgstr "Repita a senha"
1077
1078 #: rhodecode/templates/register.html:47
1079 #: rhodecode/templates/admin/users/user_add.html:50
1080 #: rhodecode/templates/admin/users/user_edit.html:74
1081 #: rhodecode/templates/admin/users/user_edit_my_account.html:63
1082 msgid "First Name"
1083 msgstr "Primeiro Nome"
1084
1085 #: rhodecode/templates/register.html:56
1086 #: rhodecode/templates/admin/users/user_add.html:59
1087 #: rhodecode/templates/admin/users/user_edit.html:83
1088 #: rhodecode/templates/admin/users/user_edit_my_account.html:72
1089 msgid "Last Name"
1090 msgstr "Último Nome"
1091
1092 #: rhodecode/templates/register.html:65
1093 #: rhodecode/templates/admin/users/user_add.html:68
1094 #: rhodecode/templates/admin/users/user_edit.html:92
1095 #: rhodecode/templates/admin/users/user_edit_my_account.html:81
1096 #: rhodecode/templates/summary/summary.html:108
1097 msgid "Email"
1098 msgstr "E-mail"
1099
1100 #: rhodecode/templates/register.html:76
1101 msgid "Your account will be activated right after registration"
1102 msgstr "Sua conta será ativada logo após o registro ser concluído"
1103
1104 #: rhodecode/templates/register.html:78
1105 msgid "Your account must wait for activation by administrator"
1106 msgstr "Sua conta precisa esperar ativação por um administrador"
1107
1108 #: rhodecode/templates/repo_switcher_list.html:14
1109 msgid "Private repository"
1110 msgstr "Repositório privado"
1111
1112 #: rhodecode/templates/repo_switcher_list.html:19
1113 msgid "Public repository"
1114 msgstr "Repositório público"
1115
1116 #: rhodecode/templates/admin/admin.html:5
1117 #: rhodecode/templates/admin/admin.html:9
1118 msgid "Admin journal"
1119 msgstr "Diário do administrador"
1120
1121 #: rhodecode/templates/admin/admin_log.html:6
1122 msgid "Action"
1123 msgstr "Ação"
1124
1125 #: rhodecode/templates/admin/admin_log.html:7
1126 msgid "Repository"
1127 msgstr "Repositório"
1128
1129 #: rhodecode/templates/admin/admin_log.html:8
1130 msgid "Date"
1131 msgstr "Data"
1132
1133 #: rhodecode/templates/admin/admin_log.html:9
1134 msgid "From IP"
1135 msgstr "A partir do IP"
1136
1137 #: rhodecode/templates/admin/admin_log.html:52
1138 msgid "No actions yet"
1139 msgstr "Ainda não há ações"
1140
1141 #: rhodecode/templates/admin/ldap/ldap.html:5
1142 msgid "LDAP administration"
1143 msgstr "Administração de LDAP"
1144
1145 #: rhodecode/templates/admin/ldap/ldap.html:11
1146 msgid "Ldap"
1147 msgstr "LDAP"
1148
1149 #: rhodecode/templates/admin/ldap/ldap.html:28
1150 msgid "Connection settings"
1151 msgstr "Configurações de conexão"
1152
1153 #: rhodecode/templates/admin/ldap/ldap.html:30
1154 msgid "Enable LDAP"
1155 msgstr "Habilitar LDAP"
1156
1157 #: rhodecode/templates/admin/ldap/ldap.html:34
1158 msgid "Host"
1159 msgstr "Host"
1160
1161 #: rhodecode/templates/admin/ldap/ldap.html:38
1162 msgid "Port"
1163 msgstr "Porta"
1164
1165 #: rhodecode/templates/admin/ldap/ldap.html:42
1166 msgid "Account"
1167 msgstr "Conta"
1168
1169 #: rhodecode/templates/admin/ldap/ldap.html:50
1170 msgid "Connection security"
1171 msgstr "Segurança da conexão"
1172
1173 #: rhodecode/templates/admin/ldap/ldap.html:54
1174 msgid "Certificate Checks"
1175 msgstr "Verificações de Certificados"
1176
1177 #: rhodecode/templates/admin/ldap/ldap.html:57
1178 msgid "Search settings"
1179 msgstr "Configurações de busca"
1180
1181 #: rhodecode/templates/admin/ldap/ldap.html:59
1182 msgid "Base DN"
1183 msgstr "DN Base"
1184
1185 #: rhodecode/templates/admin/ldap/ldap.html:63
1186 msgid "LDAP Filter"
1187 msgstr "Filtro LDAP"
1188
1189 #: rhodecode/templates/admin/ldap/ldap.html:67
1190 msgid "LDAP Search Scope"
1191 msgstr "Escopo de Buscas LDAP"
1192
1193 #: rhodecode/templates/admin/ldap/ldap.html:70
1194 msgid "Attribute mappings"
1195 msgstr "Mapeamento de atributos"
1196
1197 #: rhodecode/templates/admin/ldap/ldap.html:72
1198 msgid "Login Attribute"
1199 msgstr "Atributo de Login"
1200
1201 #: rhodecode/templates/admin/ldap/ldap.html:76
1202 msgid "First Name Attribute"
1203 msgstr "Atributo do Primeiro Nome"
1204
1205 #: rhodecode/templates/admin/ldap/ldap.html:80
1206 msgid "Last Name Attribute"
1207 msgstr "Atributo do Último Nome"
1208
1209 #: rhodecode/templates/admin/ldap/ldap.html:84
1210 msgid "E-mail Attribute"
1211 msgstr "Atributo de E-mail"
1212
1213 #: rhodecode/templates/admin/ldap/ldap.html:89
1214 #: rhodecode/templates/admin/settings/hooks.html:73
1215 #: rhodecode/templates/admin/users/user_edit.html:117
1216 #: rhodecode/templates/admin/users/user_edit.html:142
1217 #: rhodecode/templates/admin/users/user_edit_my_account.html:89
1218 #: rhodecode/templates/admin/users_groups/users_group_edit.html:263
1219 msgid "Save"
1220 msgstr "Salvar"
1221
1222 #: rhodecode/templates/admin/permissions/permissions.html:5
1223 msgid "Permissions administration"
1224 msgstr "Administração de permissões"
1225
1226 #: rhodecode/templates/admin/permissions/permissions.html:11
1227 #: rhodecode/templates/admin/repos/repo_edit.html:109
1228 #: rhodecode/templates/admin/users/user_edit.html:127
1229 #: rhodecode/templates/admin/users_groups/users_group_edit.html:248
1230 #: rhodecode/templates/settings/repo_settings.html:58
1231 msgid "Permissions"
1232 msgstr "Permissões"
1233
1234 #: rhodecode/templates/admin/permissions/permissions.html:24
1235 msgid "Default permissions"
1236 msgstr "Permissões padrão"
1237
1238 #: rhodecode/templates/admin/permissions/permissions.html:31
1239 msgid "Anonymous access"
1240 msgstr "Acesso anônimo"
1241
1242 #: rhodecode/templates/admin/permissions/permissions.html:41
1243 msgid "Repository permission"
1244 msgstr "Permissão de repositório"
1245
1246 #: rhodecode/templates/admin/permissions/permissions.html:49
1247 msgid "All default permissions on each repository will be reset to choosen permission, note that all custom default permission on repositories will be lost"
1248 msgstr "Todas as permissões padrão em cada repositório serão reinicializadas para as permissões escolhidas. Note que todas as permissões padrão customizadas nos repositórios serão perdidas"
1249
1250 #: rhodecode/templates/admin/permissions/permissions.html:50
1251 msgid "overwrite existing settings"
1252 msgstr "sobrescrever configurações existentes"
1253
1254 #: rhodecode/templates/admin/permissions/permissions.html:55
1255 msgid "Registration"
1256 msgstr "Registro"
1257
1258 #: rhodecode/templates/admin/permissions/permissions.html:63
1259 msgid "Repository creation"
1260 msgstr "Criação de repositório"
1261
1262 #: rhodecode/templates/admin/permissions/permissions.html:71
1263 msgid "set"
1264 msgstr "ajustar"
1265
1266 #: rhodecode/templates/admin/repos/repo_add.html:5
1267 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:5
1268 msgid "Add repository"
1269 msgstr "Adicionar repositório"
1270
1271 #: rhodecode/templates/admin/repos/repo_add.html:11
1272 #: rhodecode/templates/admin/repos/repo_edit.html:11
1273 #: rhodecode/templates/admin/repos/repos.html:10
1274 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
1275 msgid "Repositories"
1276 msgstr "Repositórios"
1277
1278 #: rhodecode/templates/admin/repos/repo_add.html:13
1279 msgid "add new"
1280 msgstr "adicionar novo"
1281
1282 #: rhodecode/templates/admin/repos/repo_add_base.html:20
1283 #: rhodecode/templates/summary/summary.html:80
1284 #: rhodecode/templates/summary/summary.html:82
1285 msgid "Clone from"
1286 msgstr "Clonar de"
1287
1288 #: rhodecode/templates/admin/repos/repo_add_base.html:28
1289 #: rhodecode/templates/admin/repos/repo_edit.html:48
1290 #: rhodecode/templates/admin/repos_groups/repos_groups.html:4
1291 msgid "Repository group"
1292 msgstr "Grupo de repositórios"
1293
1294 #: rhodecode/templates/admin/repos/repo_add_base.html:36
1295 #: rhodecode/templates/admin/repos/repo_edit.html:56
1296 msgid "Type"
1297 msgstr "Tipo"
1298
1299 #: rhodecode/templates/admin/repos/repo_add_base.html:52
1300 #: rhodecode/templates/admin/repos/repo_edit.html:73
1301 #: rhodecode/templates/settings/repo_fork.html:48
1302 #: rhodecode/templates/settings/repo_settings.html:49
1303 msgid "Private"
1304 msgstr "Privado"
1305
1306 #: rhodecode/templates/admin/repos/repo_add_base.html:59
1307 msgid "add"
1308 msgstr "adicionar"
1309
1310 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:9
1311 msgid "add new repository"
1312 msgstr "adicionar novo repositório"
1313
1314 #: rhodecode/templates/admin/repos/repo_edit.html:5
1315 msgid "Edit repository"
1316 msgstr "Editar repositório"
1317
1318 #: rhodecode/templates/admin/repos/repo_edit.html:13
1319 #: rhodecode/templates/admin/users/user_edit.html:13
1320 #: rhodecode/templates/admin/users/user_edit_my_account.html:148
1321 #: rhodecode/templates/admin/users_groups/users_group_edit.html:13
1322 #: rhodecode/templates/files/files_annotate.html:49
1323 #: rhodecode/templates/files/files_source.html:20
1324 msgid "edit"
1325 msgstr "editar"
1326
1327 #: rhodecode/templates/admin/repos/repo_edit.html:40
1328 msgid "Clone uri"
1329 msgstr "URI de clonagem"
1330
1331 #: rhodecode/templates/admin/repos/repo_edit.html:81
1332 msgid "Enable statistics"
1333 msgstr "Habilitar estatísticas"
1334
1335 #: rhodecode/templates/admin/repos/repo_edit.html:89
1336 msgid "Enable downloads"
1337 msgstr "Habilitar downloads"
1338
1339 #: rhodecode/templates/admin/repos/repo_edit.html:127
1340 msgid "Administration"
1341 msgstr "Administração"
1342
1343 #: rhodecode/templates/admin/repos/repo_edit.html:130
1344 msgid "Statistics"
1345 msgstr "Estatísticas"
1346
1347 #: rhodecode/templates/admin/repos/repo_edit.html:134
1348 msgid "Reset current statistics"
1349 msgstr "Reinicializar estatísticas atuais"
1350
1351 #: rhodecode/templates/admin/repos/repo_edit.html:134
1352 msgid "Confirm to remove current statistics"
1353 msgstr "Confirma remover atuais estatísticas"
1354
1355 #: rhodecode/templates/admin/repos/repo_edit.html:137
1356 msgid "Fetched to rev"
1357 msgstr "Trazida à rev"
1358
1359 #: rhodecode/templates/admin/repos/repo_edit.html:138
1360 msgid "Percentage of stats gathered"
1361 msgstr "Porcentagem das estatísticas totalizadas"
1362
1363 #: rhodecode/templates/admin/repos/repo_edit.html:147
1364 msgid "Remote"
1365 msgstr "Remoto"
1366
1367 #: rhodecode/templates/admin/repos/repo_edit.html:151
1368 msgid "Pull changes from remote location"
1369 msgstr "Realizar pull de alterações a partir de localização remota"
1370
1371 #: rhodecode/templates/admin/repos/repo_edit.html:151
1372 msgid "Confirm to pull changes from remote side"
1373 msgstr "Confirma realizar pull de alterações a partir de lado remoto"
1374
1375 #: rhodecode/templates/admin/repos/repo_edit.html:162
1376 msgid "Cache"
1377 msgstr "Cache"
1378
1379 #: rhodecode/templates/admin/repos/repo_edit.html:166
1380 msgid "Invalidate repository cache"
1381 msgstr "Invalidar cache do repositório"
1382
1383 #: rhodecode/templates/admin/repos/repo_edit.html:166
1384 msgid "Confirm to invalidate repository cache"
1385 msgstr "Confirma invalidar cache do repositório"
1386
1387 #: rhodecode/templates/admin/repos/repo_edit.html:177
1388 msgid "Remove from public journal"
1389 msgstr "Remover do diário público"
1390
1391 #: rhodecode/templates/admin/repos/repo_edit.html:179
1392 msgid "Add to public journal"
1393 msgstr "Adicionar ao diário público"
1394
1395 #: rhodecode/templates/admin/repos/repo_edit.html:185
1396 msgid "Delete"
1397 msgstr "Excluir"
1398
1399 #: rhodecode/templates/admin/repos/repo_edit.html:189
1400 msgid "Remove this repository"
1401 msgstr "Remover deste repositório"
1402
1403 #: rhodecode/templates/admin/repos/repo_edit.html:189
1404 #: rhodecode/templates/admin/repos/repos.html:79
1405 msgid "Confirm to delete this repository"
1406 msgstr "Confirma excluir este repositório"
1407
1408 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
1409 msgid "none"
1410 msgstr "nenhum"
1411
1412 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
1413 msgid "read"
1414 msgstr "ler"
1415
1416 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
1417 msgid "write"
1418 msgstr "escrever"
1419
1420 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
1421 #: rhodecode/templates/admin/users/users.html:38
1422 #: rhodecode/templates/base/base.html:296
1423 msgid "admin"
1424 msgstr "administrador"
1425
1426 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
1427 msgid "member"
1428 msgstr "membro"
1429
1430 #: rhodecode/templates/admin/repos/repo_edit_perms.html:33
1431 #: rhodecode/templates/admin/repos/repo_edit_perms.html:53
1432 msgid "revoke"
1433 msgstr "revogar"
1434
1435 #: rhodecode/templates/admin/repos/repo_edit_perms.html:75
1436 msgid "Add another member"
1437 msgstr "Adicionar outro membro"
1438
1439 #: rhodecode/templates/admin/repos/repo_edit_perms.html:89
1440 msgid "Failed to remove user"
1441 msgstr "Falha ao reomver usuário"
1442
1443 #: rhodecode/templates/admin/repos/repo_edit_perms.html:104
1444 msgid "Failed to remove users group"
1445 msgstr "Falha ao remover grupo de usuários"
1446
1447 #: rhodecode/templates/admin/repos/repo_edit_perms.html:205
1448 msgid "Group"
1449 msgstr "Grupo"
1450
1451 #: rhodecode/templates/admin/repos/repo_edit_perms.html:206
1452 #: rhodecode/templates/admin/users_groups/users_groups.html:33
1453 msgid "members"
1454 msgstr "membros"
1455
1456 #: rhodecode/templates/admin/repos/repos.html:5
1457 msgid "Repositories administration"
1458 msgstr "Administração de repositórios"
1459
1460 #: rhodecode/templates/admin/repos/repos.html:34
1461 #: rhodecode/templates/summary/summary.html:100
1462 msgid "Contact"
1463 msgstr "Contato"
1464
1465 #: rhodecode/templates/admin/repos/repos.html:35
1466 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:36
1467 #: rhodecode/templates/admin/users/user_edit_my_account.html:119
1468 #: rhodecode/templates/admin/users/users.html:40
1469 #: rhodecode/templates/admin/users_groups/users_groups.html:35
1470 msgid "action"
1471 msgstr "ação"
1472
1473 #: rhodecode/templates/admin/repos/repos.html:51
1474 #: rhodecode/templates/admin/users/user_edit_my_account.html:134
1475 #: rhodecode/templates/admin/users/user_edit_my_account.html:148
1476 msgid "private"
1477 msgstr "privado"
1478
1479 #: rhodecode/templates/admin/repos/repos.html:53
1480 #: rhodecode/templates/admin/repos/repos.html:59
1481 #: rhodecode/templates/admin/users/user_edit_my_account.html:136
1482 #: rhodecode/templates/admin/users/user_edit_my_account.html:142
1483 #: rhodecode/templates/summary/summary.html:68
1484 msgid "public"
1485 msgstr "público"
1486
1487 #: rhodecode/templates/admin/repos/repos.html:79
1488 #: rhodecode/templates/admin/users/users.html:55
1489 msgid "delete"
1490 msgstr "excluir"
1491
1492 #: rhodecode/templates/admin/repos_groups/repos_groups.html:8
1493 msgid "Groups"
1494 msgstr "Grupos"
1495
1496 #: rhodecode/templates/admin/repos_groups/repos_groups.html:13
1497 msgid "with"
1498 msgstr "com"
1499
1500 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5
1501 msgid "Add repos group"
1502 msgstr "Adicionar grupo de repositórios"
1503
1504 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:10
1505 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:10
1506 msgid "Repos groups"
1507 msgstr "Grupo de repositórios"
1508
1509 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:12
1510 msgid "add new repos group"
1511 msgstr "adicionar novo grupo de repositórios"
1512
1513 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:50
1514 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:50
1515 msgid "Group parent"
1516 msgstr "Progenitor do grupo"
1517
1518 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:58
1519 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:58
1520 #: rhodecode/templates/admin/users/user_add.html:85
1521 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
1522 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
1523 msgid "save"
1524 msgstr "salvar"
1525
1526 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:5
1527 msgid "Edit repos group"
1528 msgstr "Editar grupo de repositórios"
1529
1530 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:12
1531 msgid "edit repos group"
1532 msgstr "editar grupo de repositórios"
1533
1534 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5
1535 msgid "Repositories groups administration"
1536 msgstr "Administração de grupos de repositórios"
1537
1538 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:22
1539 msgid "ADD NEW GROUP"
1540 msgstr "ADICIONAR NOVO GRUPO"
1541
1542 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:35
1543 msgid "Number of repositories"
1544 msgstr "Número de repositórios"
1545
1546 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:54
1547 msgid "Confirm to delete this group"
1548 msgstr "Confirme para excluir este grupo"
1549
1550 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:62
1551 msgid "There are no repositories groups yet"
1552 msgstr "Ainda não há grupos de repositórios"
1553
1554 #: rhodecode/templates/admin/settings/hooks.html:5
1555 #: rhodecode/templates/admin/settings/settings.html:5
1556 msgid "Settings administration"
1557 msgstr "Administração de configurações"
1558
1559 #: rhodecode/templates/admin/settings/hooks.html:9
1560 #: rhodecode/templates/admin/settings/settings.html:9
1561 #: rhodecode/templates/settings/repo_settings.html:5
1562 #: rhodecode/templates/settings/repo_settings.html:13
1563 msgid "Settings"
1564 msgstr "Configurações"
1565
1566 #: rhodecode/templates/admin/settings/hooks.html:24
1567 msgid "Built in hooks - read only"
1568 msgstr "Ganchos pré-definidos - somente leitura"
1569
1570 #: rhodecode/templates/admin/settings/hooks.html:40
1571 msgid "Custom hooks"
1572 msgstr "Ganchos customizados"
1573
1574 #: rhodecode/templates/admin/settings/hooks.html:56
1575 msgid "remove"
1576 msgstr "remover"
1577
1578 #: rhodecode/templates/admin/settings/hooks.html:88
1579 msgid "Failed to remove hook"
1580 msgstr "Falha ao remover gancho"
1581
1582 #: rhodecode/templates/admin/settings/settings.html:24
1583 msgid "Remap and rescan repositories"
1584 msgstr "Remapear e varrer novamente repositórios"
1585
1586 #: rhodecode/templates/admin/settings/settings.html:32
1587 msgid "rescan option"
1588 msgstr "opção de varredura"
1589
1590 #: rhodecode/templates/admin/settings/settings.html:38
1591 msgid "In case a repository was deleted from filesystem and there are leftovers in the database check this option to scan obsolete data in database and remove it."
1592 msgstr "Caso um repositório tenha sido excluído do sistema de arquivos e haja restos no banco de dados, marque esta opção para varrer dados obsoletos no banco e removê-los."
1593
1594 #: rhodecode/templates/admin/settings/settings.html:39
1595 msgid "destroy old data"
1596 msgstr "destruir dados antigos"
1597
1598 #: rhodecode/templates/admin/settings/settings.html:45
1599 msgid "Rescan repositories"
1600 msgstr "Varrer repositórios"
1601
1602 #: rhodecode/templates/admin/settings/settings.html:51
1603 msgid "Whoosh indexing"
1604 msgstr "Indexação do Whoosh"
1605
1606 #: rhodecode/templates/admin/settings/settings.html:59
1607 msgid "index build option"
1608 msgstr "opção de construção de índice"
1609
1610 #: rhodecode/templates/admin/settings/settings.html:64
1611 msgid "build from scratch"
1612 msgstr "construir do início"
1613
1614 #: rhodecode/templates/admin/settings/settings.html:70
1615 msgid "Reindex"
1616 msgstr "Reindexar"
1617
1618 #: rhodecode/templates/admin/settings/settings.html:76
1619 msgid "Global application settings"
1620 msgstr "Configurações globais da aplicação"
1621
1622 #: rhodecode/templates/admin/settings/settings.html:85
1623 msgid "Application name"
1624 msgstr "Nome da aplicação"
1625
1626 #: rhodecode/templates/admin/settings/settings.html:94
1627 msgid "Realm text"
1628 msgstr "Texto de esfera"
1629
1630 #: rhodecode/templates/admin/settings/settings.html:103
1631 msgid "GA code"
1632 msgstr "Código GA"
1633
1634 #: rhodecode/templates/admin/settings/settings.html:111
1635 #: rhodecode/templates/admin/settings/settings.html:177
1636 msgid "Save settings"
1637 msgstr "Salvar configurações"
1638
1639 #: rhodecode/templates/admin/settings/settings.html:112
1640 #: rhodecode/templates/admin/settings/settings.html:178
1641 #: rhodecode/templates/admin/users/user_edit.html:118
1642 #: rhodecode/templates/admin/users/user_edit.html:143
1643 #: rhodecode/templates/admin/users/user_edit_my_account.html:90
1644 #: rhodecode/templates/admin/users_groups/users_group_edit.html:264
1645 #: rhodecode/templates/files/files_edit.html:50
1646 msgid "Reset"
1647 msgstr "Limpar"
1648
1649 #: rhodecode/templates/admin/settings/settings.html:118
1650 msgid "Mercurial settings"
1651 msgstr "Configurações do Mercurial"
1652
1653 #: rhodecode/templates/admin/settings/settings.html:127
1654 msgid "Web"
1655 msgstr "Web"
1656
1657 #: rhodecode/templates/admin/settings/settings.html:132
1658 msgid "require ssl for pushing"
1659 msgstr "exigir ssl para realizar push"
1660
1661 #: rhodecode/templates/admin/settings/settings.html:139
1662 msgid "Hooks"
1663 msgstr "Ganchos"
1664
1665 #: rhodecode/templates/admin/settings/settings.html:142
1666 msgid "advanced setup"
1667 msgstr "confirguações avançadas"
1668
1669 #: rhodecode/templates/admin/settings/settings.html:147
1670 msgid "Update repository after push (hg update)"
1671 msgstr "Atualizar repositório após realizar push (hg update)"
1672
1673 #: rhodecode/templates/admin/settings/settings.html:151
1674 msgid "Show repository size after push"
1675 msgstr "Mostrar tamanho do repositório após o push"
1676
1677 #: rhodecode/templates/admin/settings/settings.html:155
1678 msgid "Log user push commands"
1679 msgstr "Armazenar registro de comandos de push dos usuários"
1680
1681 #: rhodecode/templates/admin/settings/settings.html:159
1682 msgid "Log user pull commands"
1683 msgstr "Armazenar registro de comandos de pull dos usuários"
1684
1685 #: rhodecode/templates/admin/settings/settings.html:166
1686 msgid "Repositories location"
1687 msgstr "Localização dos repositórios"
1688
1689 #: rhodecode/templates/admin/settings/settings.html:171
1690 msgid "This a crucial application setting. If you are really sure you need to change this, you must restart application in order to make this setting take effect. Click this label to unlock."
1691 msgstr "Essa é uma configuração crucial da aplicação. Se você realmente tem certeza de que quer mudar isto, você precisa reiniciar a aplicação para que essa configuração tenha efeito. Clique este rótulo para destravar."
1692
1693 #: rhodecode/templates/admin/settings/settings.html:172
1694 msgid "unlock"
1695 msgstr "destravar"
1696
1697 #: rhodecode/templates/admin/users/user_add.html:5
1698 msgid "Add user"
1699 msgstr "Adicionar usuário"
1700
1701 #: rhodecode/templates/admin/users/user_add.html:10
1702 #: rhodecode/templates/admin/users/user_edit.html:11
1703 #: rhodecode/templates/admin/users/users.html:9
1704 msgid "Users"
1705 msgstr "Usuários"
1706
1707 #: rhodecode/templates/admin/users/user_add.html:12
1708 msgid "add new user"
1709 msgstr "adicionar novo usuário"
1710
1711 #: rhodecode/templates/admin/users/user_add.html:77
1712 #: rhodecode/templates/admin/users/user_edit.html:101
1713 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
1714 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
1715 msgid "Active"
1716 msgstr "Ativo"
1717
1718 #: rhodecode/templates/admin/users/user_edit.html:5
1719 msgid "Edit user"
1720 msgstr "Editar usuário"
1721
1722 #: rhodecode/templates/admin/users/user_edit.html:33
1723 #: rhodecode/templates/admin/users/user_edit_my_account.html:32
1724 msgid "Change your avatar at"
1725 msgstr "Altere o seu avatar em"
1726
1727 #: rhodecode/templates/admin/users/user_edit.html:34
1728 #: rhodecode/templates/admin/users/user_edit_my_account.html:33
1729 msgid "Using"
1730 msgstr "Usando"
1731
1732 #: rhodecode/templates/admin/users/user_edit.html:40
1733 #: rhodecode/templates/admin/users/user_edit_my_account.html:39
1734 msgid "API key"
1735 msgstr "Chave de API"
1736
1737 #: rhodecode/templates/admin/users/user_edit.html:56
1738 msgid "LDAP DN"
1739 msgstr "DN LDAP"
1740
1741 #: rhodecode/templates/admin/users/user_edit.html:65
1742 #: rhodecode/templates/admin/users/user_edit_my_account.html:54
1743 msgid "New password"
1744 msgstr "Nova senha"
1745
1746 #: rhodecode/templates/admin/users/user_edit.html:135
1747 #: rhodecode/templates/admin/users_groups/users_group_edit.html:256
1748 msgid "Create repositories"
1749 msgstr "Criar repositórios"
1750
1751 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
1752 msgid "My account"
1753 msgstr "Minha conta"
1754
1755 #: rhodecode/templates/admin/users/user_edit_my_account.html:9
1756 msgid "My Account"
1757 msgstr "Minha Conta"
1758
1759 #: rhodecode/templates/admin/users/user_edit_my_account.html:101
1760 msgid "My repositories"
1761 msgstr "Meus repositórios"
1762
1763 #: rhodecode/templates/admin/users/user_edit_my_account.html:107
1764 msgid "ADD REPOSITORY"
1765 msgstr "ADICIONAR REPOSITÓRIO"
1766
1767 #: rhodecode/templates/admin/users/user_edit_my_account.html:118
1768 #: rhodecode/templates/branches/branches_data.html:7
1769 #: rhodecode/templates/shortlog/shortlog_data.html:8
1770 #: rhodecode/templates/tags/tags_data.html:7
1771 msgid "revision"
1772 msgstr "revisão"
1773
1774 #: rhodecode/templates/admin/users/user_edit_my_account.html:157
1775 msgid "No repositories yet"
1776 msgstr "Ainda não há repositórios"
1777
1778 #: rhodecode/templates/admin/users/user_edit_my_account.html:159
1779 msgid "create one now"
1780 msgstr "criar um agora"
1781
1782 #: rhodecode/templates/admin/users/users.html:5
1783 msgid "Users administration"
1784 msgstr "Administração de usuários"
1785
1786 #: rhodecode/templates/admin/users/users.html:23
1787 msgid "ADD NEW USER"
1788 msgstr "ADICIONAR NOVO USUÁRIO"
1789
1790 #: rhodecode/templates/admin/users/users.html:33
1791 msgid "username"
1792 msgstr "nome de usuário"
1793
1794 #: rhodecode/templates/admin/users/users.html:34
1795 #: rhodecode/templates/branches/branches_data.html:5
1796 #: rhodecode/templates/tags/tags_data.html:5
1797 msgid "name"
1798 msgstr "nome"
1799
1800 #: rhodecode/templates/admin/users/users.html:35
1801 msgid "lastname"
1802 msgstr "sobrenome"
1803
1804 #: rhodecode/templates/admin/users/users.html:36
1805 msgid "last login"
1806 msgstr "último login"
1807
1808 #: rhodecode/templates/admin/users/users.html:37
1809 #: rhodecode/templates/admin/users_groups/users_groups.html:34
1810 msgid "active"
1811 msgstr "ativo"
1812
1813 #: rhodecode/templates/admin/users/users.html:39
1814 #: rhodecode/templates/base/base.html:305
1815 msgid "ldap"
1816 msgstr "ldap"
1817
1818 #: rhodecode/templates/admin/users/users.html:56
1819 msgid "Confirm to delete this user"
1820 msgstr "Conforma excluir este usuário"
1821
1822 #: rhodecode/templates/admin/users_groups/users_group_add.html:5
1823 msgid "Add users group"
1824 msgstr "Adicionar grupo de usuários"
1825
1826 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
1827 #: rhodecode/templates/admin/users_groups/users_groups.html:9
1828 msgid "Users groups"
1829 msgstr "Grupos de usuários"
1830
1831 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
1832 msgid "add new users group"
1833 msgstr "Adicionar novo grupo de usuários"
1834
1835 #: rhodecode/templates/admin/users_groups/users_group_edit.html:5
1836 msgid "Edit users group"
1837 msgstr "Editar grupo de usuários"
1838
1839 #: rhodecode/templates/admin/users_groups/users_group_edit.html:11
1840 msgid "UsersGroups"
1841 msgstr "Grupos de Usuários"
1842
1843 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
1844 msgid "Members"
1845 msgstr "Membros"
1846
1847 #: rhodecode/templates/admin/users_groups/users_group_edit.html:58
1848 msgid "Choosen group members"
1849 msgstr "Membros escolhidos do grupo"
1850
1851 #: rhodecode/templates/admin/users_groups/users_group_edit.html:61
1852 msgid "Remove all elements"
1853 msgstr "Remover todos os elementos"
1854
1855 #: rhodecode/templates/admin/users_groups/users_group_edit.html:75
1856 msgid "Available members"
1857 msgstr "Membros disponíveis"
1858
1859 #: rhodecode/templates/admin/users_groups/users_group_edit.html:79
1860 msgid "Add all elements"
1861 msgstr "Adicionar todos os elementos"
1862
1863 #: rhodecode/templates/admin/users_groups/users_groups.html:5
1864 msgid "Users groups administration"
1865 msgstr "Administração de grupos de usuários"
1866
1867 #: rhodecode/templates/admin/users_groups/users_groups.html:23
1868 msgid "ADD NEW USER GROUP"
1869 msgstr "ADICIONAR NOVO GRUPO DE USUÁRIOS"
1870
1871 #: rhodecode/templates/admin/users_groups/users_groups.html:32
1872 msgid "group name"
1873 msgstr "nome do grupo"
1874
1875 #: rhodecode/templates/base/base.html:32
1876 msgid "Forgot password ?"
1877 msgstr "Esqueceu a senha ?"
1878
1879 #: rhodecode/templates/base/base.html:57
1880 #: rhodecode/templates/base/base.html:338
1881 #: rhodecode/templates/base/base.html:340
1882 #: rhodecode/templates/base/base.html:342
1883 msgid "Home"
1884 msgstr "Início"
1885
1886 #: rhodecode/templates/base/base.html:61
1887 #: rhodecode/templates/base/base.html:347
1888 #: rhodecode/templates/base/base.html:349
1889 #: rhodecode/templates/base/base.html:351
1890 #: rhodecode/templates/journal/journal.html:4
1891 #: rhodecode/templates/journal/journal.html:17
1892 #: rhodecode/templates/journal/public_journal.html:4
1893 msgid "Journal"
1894 msgstr "Diário"
1895
1896 #: rhodecode/templates/base/base.html:66
1897 msgid "Login"
1898 msgstr "Entrar"
1899
1900 #: rhodecode/templates/base/base.html:68
1901 msgid "Log Out"
1902 msgstr "Sair"
1903
1904 #: rhodecode/templates/base/base.html:107
1905 msgid "Submit a bug"
1906 msgstr "Encaminhe um bug"
1907
1908 #: rhodecode/templates/base/base.html:141
1909 msgid "Switch repository"
1910 msgstr "Trocar repositório"
1911
1912 #: rhodecode/templates/base/base.html:143
1913 msgid "Products"
1914 msgstr "Produtos"
1915
1916 #: rhodecode/templates/base/base.html:149
1917 msgid "loading..."
1918 msgstr "carregando..."
1919
1920 #: rhodecode/templates/base/base.html:234
1921 #: rhodecode/templates/base/base.html:236
1922 #: rhodecode/templates/base/base.html:238
1923 msgid "Switch to"
1924 msgstr "Trocar para"
1925
1926 #: rhodecode/templates/base/base.html:242
1927 #: rhodecode/templates/branches/branches.html:13
1928 msgid "branches"
1929 msgstr "ramos"
1930
1931 #: rhodecode/templates/base/base.html:249
1932 #: rhodecode/templates/branches/branches_data.html:52
1933 msgid "There are no branches yet"
1934 msgstr "Ainda não há ramos"
1935
1936 #: rhodecode/templates/base/base.html:254
1937 #: rhodecode/templates/shortlog/shortlog_data.html:10
1938 #: rhodecode/templates/tags/tags.html:14
1939 msgid "tags"
1940 msgstr "etiquetas"
1941
1942 #: rhodecode/templates/base/base.html:261
1943 #: rhodecode/templates/tags/tags_data.html:32
1944 msgid "There are no tags yet"
1945 msgstr "Ainda não há etiquetas"
1946
1947 #: rhodecode/templates/base/base.html:277
1948 #: rhodecode/templates/base/base.html:281
1949 #: rhodecode/templates/files/files_annotate.html:40
1950 #: rhodecode/templates/files/files_source.html:11
1951 msgid "Options"
1952 msgstr "Opções"
1953
1954 #: rhodecode/templates/base/base.html:286
1955 #: rhodecode/templates/base/base.html:288
1956 #: rhodecode/templates/base/base.html:306
1957 msgid "settings"
1958 msgstr "configurações"
1959
1960 #: rhodecode/templates/base/base.html:292
1961 msgid "search"
1962 msgstr "pesquisar"
1963
1964 #: rhodecode/templates/base/base.html:299
1965 msgid "journal"
1966 msgstr "diário"
1967
1968 #: rhodecode/templates/base/base.html:301
1969 msgid "repositories groups"
1970 msgstr "grupos de repositórios"
1971
1972 #: rhodecode/templates/base/base.html:302
1973 msgid "users"
1974 msgstr "usuários"
1975
1976 #: rhodecode/templates/base/base.html:303
1977 msgid "users groups"
1978 msgstr "grupos de usuários"
1979
1980 #: rhodecode/templates/base/base.html:304
1981 msgid "permissions"
1982 msgstr "permissões"
1983
1984 #: rhodecode/templates/base/base.html:317
1985 #: rhodecode/templates/base/base.html:319
1986 #: rhodecode/templates/followers/followers.html:5
1987 msgid "Followers"
1988 msgstr "Seguidores"
1989
1990 #: rhodecode/templates/base/base.html:325
1991 #: rhodecode/templates/base/base.html:327
1992 #: rhodecode/templates/forks/forks.html:5
1993 msgid "Forks"
1994 msgstr "Bifurcações"
1995
1996 #: rhodecode/templates/base/base.html:356
1997 #: rhodecode/templates/base/base.html:358
1998 #: rhodecode/templates/base/base.html:360
1999 #: rhodecode/templates/search/search.html:4
2000 #: rhodecode/templates/search/search.html:24
2001 #: rhodecode/templates/search/search.html:46
2002 msgid "Search"
2003 msgstr "Pesquisar"
2004
2005 #: rhodecode/templates/base/root.html:57
2006 #: rhodecode/templates/journal/journal.html:48
2007 #: rhodecode/templates/summary/summary.html:36
2008 msgid "Stop following this repository"
2009 msgstr "Parar de seguir este repositório"
2010
2011 #: rhodecode/templates/base/root.html:66
2012 #: rhodecode/templates/summary/summary.html:40
2013 msgid "Start following this repository"
2014 msgstr "Passar a seguir este repositório"
2015
2016 #: rhodecode/templates/branches/branches_data.html:4
2017 #: rhodecode/templates/tags/tags_data.html:4
2018 msgid "date"
2019 msgstr "data"
2020
2021 #: rhodecode/templates/branches/branches_data.html:6
2022 #: rhodecode/templates/shortlog/shortlog_data.html:7
2023 #: rhodecode/templates/tags/tags_data.html:6
2024 msgid "author"
2025 msgstr "autor"
2026
2027 #: rhodecode/templates/branches/branches_data.html:8
2028 #: rhodecode/templates/shortlog/shortlog_data.html:11
2029 #: rhodecode/templates/tags/tags_data.html:8
2030 msgid "links"
2031 msgstr "inks"
2032
2033 #: rhodecode/templates/branches/branches_data.html:23
2034 #: rhodecode/templates/branches/branches_data.html:43
2035 #: rhodecode/templates/shortlog/shortlog_data.html:39
2036 #: rhodecode/templates/tags/tags_data.html:24
2037 msgid "changeset"
2038 msgstr "conjunto de mudanças"
2039
2040 #: rhodecode/templates/branches/branches_data.html:25
2041 #: rhodecode/templates/branches/branches_data.html:45
2042 #: rhodecode/templates/files/files.html:12
2043 #: rhodecode/templates/shortlog/shortlog_data.html:41
2044 #: rhodecode/templates/summary/summary.html:233
2045 #: rhodecode/templates/tags/tags_data.html:26
2046 msgid "files"
2047 msgstr "arquivos"
2048
2049 #: rhodecode/templates/changelog/changelog.html:14
2050 msgid "showing "
2051 msgstr "mostrando "
2052
2053 #: rhodecode/templates/changelog/changelog.html:14
2054 msgid "out of"
2055 msgstr "de"
2056
2057 #: rhodecode/templates/changelog/changelog.html:37
2058 msgid "Show"
2059 msgstr "Mostrar"
2060
2061 #: rhodecode/templates/changelog/changelog.html:50
2062 #: rhodecode/templates/changeset/changeset.html:42
2063 #: rhodecode/templates/summary/summary.html:609
2064 msgid "commit"
2065 msgstr "commit"
2066
2067 #: rhodecode/templates/changelog/changelog.html:63
2068 msgid "Affected number of files, click to show more details"
2069 msgstr "Número de arquivos afetados, clique para mostrar mais detalhes"
2070
2071 #: rhodecode/templates/changelog/changelog.html:67
2072 #: rhodecode/templates/changeset/changeset.html:66
2073 msgid "merge"
2074 msgstr "mesclar"
2075
2076 #: rhodecode/templates/changelog/changelog.html:72
2077 #: rhodecode/templates/changeset/changeset.html:72
2078 msgid "Parent"
2079 msgstr "Progenitor"
2080
2081 #: rhodecode/templates/changelog/changelog.html:77
2082 #: rhodecode/templates/changeset/changeset.html:77
2083 msgid "No parents"
2084 msgstr "Sem progenitores"
2085
2086 #: rhodecode/templates/changelog/changelog.html:82
2087 #: rhodecode/templates/changeset/changeset.html:80
2088 #: rhodecode/templates/files/files.html:29
2089 #: rhodecode/templates/files/files_annotate.html:25
2090 #: rhodecode/templates/files/files_edit.html:33
2091 #: rhodecode/templates/shortlog/shortlog_data.html:9
2092 msgid "branch"
2093 msgstr "ramo"
2094
2095 #: rhodecode/templates/changelog/changelog.html:86
2096 #: rhodecode/templates/changeset/changeset.html:83
2097 msgid "tag"
2098 msgstr "etiqueta"
2099
2100 #: rhodecode/templates/changelog/changelog.html:122
2101 msgid "Show selected changes __S -> __E"
2102 msgstr "Mostrar alterações selecionadas __S -> __E"
2103
2104 #: rhodecode/templates/changelog/changelog.html:172
2105 #: rhodecode/templates/shortlog/shortlog_data.html:61
2106 msgid "There are no changes yet"
2107 msgstr "Ainda não há alteações"
2108
2109 #: rhodecode/templates/changelog/changelog_details.html:2
2110 #: rhodecode/templates/changeset/changeset.html:55
2111 msgid "removed"
2112 msgstr "removidos"
2113
2114 #: rhodecode/templates/changelog/changelog_details.html:3
2115 #: rhodecode/templates/changeset/changeset.html:56
2116 msgid "changed"
2117 msgstr "alterados"
2118
2119 #: rhodecode/templates/changelog/changelog_details.html:4
2120 #: rhodecode/templates/changeset/changeset.html:57
2121 msgid "added"
2122 msgstr "adicionados"
2123
2124 #: rhodecode/templates/changelog/changelog_details.html:6
2125 #: rhodecode/templates/changelog/changelog_details.html:7
2126 #: rhodecode/templates/changelog/changelog_details.html:8
2127 #: rhodecode/templates/changeset/changeset.html:59
2128 #: rhodecode/templates/changeset/changeset.html:60
2129 #: rhodecode/templates/changeset/changeset.html:61
2130 #, python-format
2131 msgid "affected %s files"
2132 msgstr "%s arquivos afetados"
2133
2134 #: rhodecode/templates/changeset/changeset.html:6
2135 #: rhodecode/templates/changeset/changeset.html:14
2136 #: rhodecode/templates/changeset/changeset.html:31
2137 msgid "Changeset"
2138 msgstr "Conjunto de Mudanças"
2139
2140 #: rhodecode/templates/changeset/changeset.html:32
2141 #: rhodecode/templates/changeset/changeset.html:121
2142 #: rhodecode/templates/changeset/changeset_range.html:78
2143 #: rhodecode/templates/files/file_diff.html:32
2144 #: rhodecode/templates/files/file_diff.html:42
2145 msgid "raw diff"
2146 msgstr "diff bruto"
2147
2148 #: rhodecode/templates/changeset/changeset.html:34
2149 #: rhodecode/templates/changeset/changeset.html:123
2150 #: rhodecode/templates/changeset/changeset_range.html:80
2151 #: rhodecode/templates/files/file_diff.html:34
2152 msgid "download diff"
2153 msgstr "descarregar diff"
2154
2155 #: rhodecode/templates/changeset/changeset.html:90
2156 #, python-format
2157 msgid "%s files affected with %s additions and %s deletions."
2158 msgstr "%s arquivos afetados com %s adições e %s exclusões"
2159
2160 #: rhodecode/templates/changeset/changeset.html:101
2161 msgid "Changeset was too big and was cut off..."
2162 msgstr "Conjunto de mudanças era grande demais e foi cortado..."
2163
2164 #: rhodecode/templates/changeset/changeset.html:119
2165 #: rhodecode/templates/changeset/changeset_range.html:76
2166 #: rhodecode/templates/files/file_diff.html:30
2167 msgid "diff"
2168 msgstr "diff"
2169
2170 #: rhodecode/templates/changeset/changeset.html:132
2171 #: rhodecode/templates/changeset/changeset_range.html:89
2172 msgid "No changes in this file"
2173 msgstr "Nenhuma alteração nesse arquivo"
2174
2175 #: rhodecode/templates/changeset/changeset_range.html:30
2176 msgid "Compare View"
2177 msgstr "Exibir Comparação"
2178
2179 #: rhodecode/templates/changeset/changeset_range.html:52
2180 msgid "Files affected"
2181 msgstr "Arquivos afetados"
2182
2183 #: rhodecode/templates/errors/error_document.html:44
2184 #, python-format
2185 msgid "You will be redirected to %s in %s seconds"
2186 msgstr "Você será redirecionado para %s em %s segundos"
2187
2188 #: rhodecode/templates/files/file_diff.html:4
2189 #: rhodecode/templates/files/file_diff.html:12
2190 msgid "File diff"
2191 msgstr "Diff do arquivo"
2192
2193 #: rhodecode/templates/files/file_diff.html:42
2194 msgid "Diff is to big to display"
2195 msgstr "Diff é grande demais para exibir"
2196
2197 #: rhodecode/templates/files/files.html:37
2198 #: rhodecode/templates/files/files_annotate.html:31
2199 #: rhodecode/templates/files/files_edit.html:39
2200 msgid "Location"
2201 msgstr "Local"
2202
2203 #: rhodecode/templates/files/files.html:46
2204 msgid "Go back"
2205 msgstr "Voltar"
2206
2207 #: rhodecode/templates/files/files.html:47
2208 msgid "No files at given path"
2209 msgstr "Nenhum arquivo no caminho especificado"
2210
2211 #: rhodecode/templates/files/files_annotate.html:4
2212 msgid "File annotate"
2213 msgstr "Anotar arquivo"
2214
2215 #: rhodecode/templates/files/files_annotate.html:12
2216 msgid "annotate"
2217 msgstr "anotar"
2218
2219 #: rhodecode/templates/files/files_annotate.html:33
2220 #: rhodecode/templates/files/files_browser.html:160
2221 #: rhodecode/templates/files/files_source.html:2
2222 msgid "Revision"
2223 msgstr "Revisão"
2224
2225 #: rhodecode/templates/files/files_annotate.html:36
2226 #: rhodecode/templates/files/files_browser.html:158
2227 #: rhodecode/templates/files/files_source.html:7
2228 msgid "Size"
2229 msgstr "Tamanho"
2230
2231 #: rhodecode/templates/files/files_annotate.html:38
2232 #: rhodecode/templates/files/files_browser.html:159
2233 #: rhodecode/templates/files/files_source.html:9
2234 msgid "Mimetype"
2235 msgstr "Mimetype"
2236
2237 #: rhodecode/templates/files/files_annotate.html:41
2238 msgid "show source"
2239 msgstr "mostrar fonte"
2240
2241 #: rhodecode/templates/files/files_annotate.html:43
2242 #: rhodecode/templates/files/files_annotate.html:78
2243 #: rhodecode/templates/files/files_source.html:14
2244 #: rhodecode/templates/files/files_source.html:51
2245 msgid "show as raw"
2246 msgstr "mostrar como bruto"
2247
2248 #: rhodecode/templates/files/files_annotate.html:45
2249 #: rhodecode/templates/files/files_source.html:16
2250 msgid "download as raw"
2251 msgstr "descarregar como bruto"
2252
2253 #: rhodecode/templates/files/files_annotate.html:54
2254 #: rhodecode/templates/files/files_source.html:25
2255 msgid "History"
2256 msgstr "Histórico"
2257
2258 #: rhodecode/templates/files/files_annotate.html:73
2259 #: rhodecode/templates/files/files_source.html:46
2260 #, python-format
2261 msgid "Binary file (%s)"
2262 msgstr "Arquivo binário (%s)"
2263
2264 #: rhodecode/templates/files/files_annotate.html:78
2265 #: rhodecode/templates/files/files_source.html:51
2266 msgid "File is too big to display"
2267 msgstr "Arquivo é grande demais para exibir"
2268
2269 #: rhodecode/templates/files/files_browser.html:13
2270 msgid "view"
2271 msgstr "ver"
2272
2273 #: rhodecode/templates/files/files_browser.html:14
2274 msgid "previous revision"
2275 msgstr "revisão anterior"
2276
2277 #: rhodecode/templates/files/files_browser.html:16
2278 msgid "next revision"
2279 msgstr "próxima revisão"
2280
2281 #: rhodecode/templates/files/files_browser.html:23
2282 msgid "follow current branch"
2283 msgstr "seguir ramo atual"
2284
2285 #: rhodecode/templates/files/files_browser.html:27
2286 msgid "search file list"
2287 msgstr "pesquisar lista de arquivos"
2288
2289 #: rhodecode/templates/files/files_browser.html:32
2290 msgid "Loading file list..."
2291 msgstr "Carregando lista de arquivos..."
2292
2293 #: rhodecode/templates/files/files_browser.html:111
2294 msgid "search truncated"
2295 msgstr "pesquisa truncada"
2296
2297 #: rhodecode/templates/files/files_browser.html:122
2298 msgid "no matching files"
2299 msgstr "nenhum arquivo corresponde"
2300
2301 #: rhodecode/templates/files/files_browser.html:161
2302 msgid "Last modified"
2303 msgstr "Última alteração"
2304
2305 #: rhodecode/templates/files/files_browser.html:162
2306 msgid "Last commiter"
2307 msgstr "Último commiter"
2308
2309 #: rhodecode/templates/files/files_edit.html:4
2310 msgid "Edit file"
2311 msgstr "Editar arquivo"
2312
2313 #: rhodecode/templates/files/files_edit.html:19
2314 msgid "edit file"
2315 msgstr "editar arquivo"
2316
2317 #: rhodecode/templates/files/files_edit.html:45
2318 #: rhodecode/templates/shortlog/shortlog_data.html:5
2319 msgid "commit message"
2320 msgstr "mensagem de commit"
2321
2322 #: rhodecode/templates/files/files_edit.html:51
2323 msgid "Commit changes"
2324 msgstr "Realizar commit das alterações"
2325
2326 #: rhodecode/templates/files/files_source.html:12
2327 msgid "show annotation"
2328 msgstr "mostrar anotação"
2329
2330 #: rhodecode/templates/files/files_source.html:153
2331 msgid "Selection link"
2332 msgstr "Link da seleção"
2333
2334 #: rhodecode/templates/followers/followers.html:13
2335 msgid "followers"
2336 msgstr "seguidores"
2337
2338 #: rhodecode/templates/followers/followers_data.html:12
2339 msgid "Started following"
2340 msgstr "Passou a seguir"
2341
2342 #: rhodecode/templates/forks/forks.html:13
2343 msgid "forks"
2344 msgstr "bifurcações"
2345
2346 #: rhodecode/templates/forks/forks_data.html:17
2347 msgid "forked"
2348 msgstr "bifurcado"
2349
2350 #: rhodecode/templates/forks/forks_data.html:34
2351 msgid "There are no forks yet"
2352 msgstr "Ainda não há bifurcações"
2353
2354 #: rhodecode/templates/journal/journal.html:34
2355 msgid "Following"
2356 msgstr "Seguindo"
2357
2358 #: rhodecode/templates/journal/journal.html:41
2359 msgid "following user"
2360 msgstr "seguindo usuário"
2361
2362 #: rhodecode/templates/journal/journal.html:41
2363 msgid "user"
2364 msgstr "usuário"
2365
2366 #: rhodecode/templates/journal/journal.html:65
2367 msgid "You are not following any users or repositories"
2368 msgstr "Você não está seguindo quaisquer usuários ou repositórios"
2369
2370 #: rhodecode/templates/journal/journal_data.html:46
2371 msgid "No entries yet"
2372 msgstr "Ainda não há entradas"
2373
2374 #: rhodecode/templates/journal/public_journal.html:17
2375 msgid "Public Journal"
2376 msgstr "Diário Público"
2377
2378 #: rhodecode/templates/search/search.html:7
2379 #: rhodecode/templates/search/search.html:26
2380 msgid "in repository: "
2381 msgstr "no repositório"
2382
2383 #: rhodecode/templates/search/search.html:9
2384 #: rhodecode/templates/search/search.html:28
2385 msgid "in all repositories"
2386 msgstr "em todos os repositórios"
2387
2388 #: rhodecode/templates/search/search.html:42
2389 msgid "Search term"
2390 msgstr "Termo de pesquisa"
2391
2392 #: rhodecode/templates/search/search.html:54
2393 msgid "Search in"
2394 msgstr "Pesquisando em"
2395
2396 #: rhodecode/templates/search/search.html:57
2397 msgid "File contents"
2398 msgstr "Conteúdo dos arquivos"
2399
2400 #: rhodecode/templates/search/search.html:59
2401 msgid "File names"
2402 msgstr "Nomes dos arquivos"
2403
2404 #: rhodecode/templates/search/search_content.html:20
2405 #: rhodecode/templates/search/search_path.html:15
2406 msgid "Permission denied"
2407 msgstr "Permissão negada"
2408
2409 #: rhodecode/templates/settings/repo_fork.html:5
2410 msgid "Fork"
2411 msgstr "Bifurcação"
2412
2413 #: rhodecode/templates/settings/repo_fork.html:31
2414 msgid "Fork name"
2415 msgstr "Nome da bifurcação"
2416
2417 #: rhodecode/templates/settings/repo_fork.html:55
2418 msgid "fork this repository"
2419 msgstr "bifurcar este repositório"
2420
2421 #: rhodecode/templates/shortlog/shortlog.html:5
2422 #: rhodecode/templates/summary/summary.html:666
2423 msgid "Shortlog"
2424 msgstr "Log resumido"
2425
2426 #: rhodecode/templates/shortlog/shortlog.html:14
2427 msgid "shortlog"
2428 msgstr "log resumido"
2429
2430 #: rhodecode/templates/shortlog/shortlog_data.html:6
2431 msgid "age"
2432 msgstr "idade"
2433
2434 #: rhodecode/templates/summary/summary.html:12
2435 msgid "summary"
2436 msgstr "sumário"
2437
2438 #: rhodecode/templates/summary/summary.html:79
2439 msgid "remote clone"
2440 msgstr "clone remoto"
2441
2442 #: rhodecode/templates/summary/summary.html:121
2443 msgid "by"
2444 msgstr "por"
2445
2446 #: rhodecode/templates/summary/summary.html:128
2447 msgid "Clone url"
2448 msgstr "URL de clonagem"
2449
2450 #: rhodecode/templates/summary/summary.html:137
2451 msgid "Trending source files"
2452 msgstr "Tendências nos arquivos fonte"
2453
2454 #: rhodecode/templates/summary/summary.html:146
2455 msgid "Download"
2456 msgstr "Download"
2457
2458 #: rhodecode/templates/summary/summary.html:150
2459 msgid "There are no downloads yet"
2460 msgstr "Ainda não há downloads"
2461
2462 #: rhodecode/templates/summary/summary.html:152
2463 msgid "Downloads are disabled for this repository"
2464 msgstr "Downloads estão desabilitados para este repositório"
2465
2466 #: rhodecode/templates/summary/summary.html:154
2467 #: rhodecode/templates/summary/summary.html:320
2468 msgid "enable"
2469 msgstr "habilitar"
2470
2471 #: rhodecode/templates/summary/summary.html:162
2472 #: rhodecode/templates/summary/summary.html:297
2473 #, python-format
2474 msgid "Download %s as %s"
2475 msgstr "Descarregar %s como %s"
2476
2477 #: rhodecode/templates/summary/summary.html:168
2478 msgid "Check this to download archive with subrepos"
2479 msgstr "Marque isto para descarregar arquivo com subrepositórios"
2480
2481 #: rhodecode/templates/summary/summary.html:168
2482 msgid "with subrepos"
2483 msgstr "com subrepositórios"
2484
2485 #: rhodecode/templates/summary/summary.html:176
2486 msgid "Feeds"
2487 msgstr "Feeds"
2488
2489 #: rhodecode/templates/summary/summary.html:257
2490 #: rhodecode/templates/summary/summary.html:684
2491 #: rhodecode/templates/summary/summary.html:695
2492 msgid "show more"
2493 msgstr "mostrar mais"
2494
2495 #: rhodecode/templates/summary/summary.html:312
2496 msgid "Commit activity by day / author"
2497 msgstr "Atividade de commit por dia / autor"
2498
2499 #: rhodecode/templates/summary/summary.html:324
2500 msgid "Loaded in"
2501 msgstr "Carregado em"
2502
2503 #: rhodecode/templates/summary/summary.html:603
2504 msgid "commits"
2505 msgstr "commits"
2506
2507 #: rhodecode/templates/summary/summary.html:604
2508 msgid "files added"
2509 msgstr "arquivos adicionados"
2510
2511 #: rhodecode/templates/summary/summary.html:605
2512 msgid "files changed"
2513 msgstr "arquivos alterados"
2514
2515 #: rhodecode/templates/summary/summary.html:606
2516 msgid "files removed"
2517 msgstr "arquivos removidos"
2518
2519 #: rhodecode/templates/summary/summary.html:610
2520 msgid "file added"
2521 msgstr "arquivo adicionado"
2522
2523 #: rhodecode/templates/summary/summary.html:611
2524 msgid "file changed"
2525 msgstr "arquivo alterado"
2526
2527 #: rhodecode/templates/summary/summary.html:612
2528 msgid "file removed"
2529 msgstr "arquivo removido"
2530
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, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
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
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
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
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 100755
NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
NO CONTENT: new file 100755
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
@@ -4,4 +4,12 b' List of contributors to RhodeCode projec'
4 Jason Harris <jason@jasonfharris.com>
4 Jason Harris <jason@jasonfharris.com>
5 Thayne Harbaugh <thayne@fusionio.com>
5 Thayne Harbaugh <thayne@fusionio.com>
6 cejones
6 cejones
7 Thomas Waldmann <tw-public@gmx.de> No newline at end of file
7 Thomas Waldmann <tw-public@gmx.de>
8 Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it>
9 Dmitri Kuznetsov
10 Jared Bunting <jared.bunting@peachjean.com>
11 Steve Romanow <slestak989@gmail.com>
12 Augosto Hermann <augusto.herrmann@planejamento.gov.br>
13 Ankit Solanki <ankit.solanki@gmail.com>
14 Liad Shani <liadff@gmail.com>
15 No newline at end of file
@@ -14,9 +14,6 b' recursive-include init.d *'
14 recursive-include rhodecode/public/css *
14 recursive-include rhodecode/public/css *
15 recursive-include rhodecode/public/images *
15 recursive-include rhodecode/public/images *
16 #js
16 #js
17 include rhodecode/public/js/yui2a.js
17 recursive-include rhodecode/public/js *
18 include rhodecode/public/js/excanvas.min.js
19 include rhodecode/public/js/yui.flot.js
20 include rhodecode/public/js/graph.js
21 #templates
18 #templates
22 recursive-include rhodecode/templates *
19 recursive-include rhodecode/templates *
@@ -1,4 +1,3 b''
1
2 =================================================
1 =================================================
3 Welcome to RhodeCode (RhodiumCode) documentation!
2 Welcome to RhodeCode (RhodiumCode) documentation!
4 =================================================
3 =================================================
@@ -26,13 +25,13 b' The default access is anonymous but you '
26 using the following credentials:
25 using the following credentials:
27
26
28 - username: demo
27 - username: demo
29 - password: demo
28 - password: demo12
30
29
31 Source code
30 Source code
32 -----------
31 -----------
33
32
34 The latest sources can be obtained from official RhodeCode instance
33 The latest sources can be obtained from official RhodeCode instance
35 https://hg.rhodecode.org
34 https://secure.rhodecode.org
36
35
37
36
38 MIRRORS:
37 MIRRORS:
@@ -60,20 +59,28 b' RhodeCode Features'
60 Supports http/https and LDAP
59 Supports http/https and LDAP
61 - Full permissions (private/read/write/admin) and authentication per project.
60 - Full permissions (private/read/write/admin) and authentication per project.
62 One account for web interface and mercurial_ push/pull/clone operations.
61 One account for web interface and mercurial_ push/pull/clone operations.
62 - Have built in users groups for easier permission management
63 - Repository groups let you group repos and manage them easier.
64 - Users can fork other users repo. RhodeCode have also compare view to see
65 combined changeset for all changeset made within single push.
66 - Build in commit-api let's you add, edit and commit files right from RhodeCode
67 interface using simple editor or upload form for binaries.
63 - Mako templates let's you customize the look and feel of the application.
68 - Mako templates let's you customize the look and feel of the application.
64 - Beautiful diffs, annotations and source code browsing all colored by pygments.
69 - Beautiful diffs, annotations and source code browsing all colored by pygments.
70 Raw diffs are made in git-diff format, including git_ binary-patches
65 - Mercurial_ branch graph and yui-flot powered graphs with zooming and statistics
71 - Mercurial_ branch graph and yui-flot powered graphs with zooming and statistics
66 - Admin interface with user/permission management. Admin activity journal, logs
72 - Admin interface with user/permission management. Admin activity journal, logs
67 pulls, pushes, forks, registrations and other actions made by all users.
73 pulls, pushes, forks, registrations and other actions made by all users.
68 - Server side forks. It is possible to fork a project and modify it freely without
74 - Server side forks. It is possible to fork a project and modify it freely
69 breaking the main repository.
75 without breaking the main repository. You can even write Your own hooks
76 and install them
70 - Full text search powered by Whoosh on the source files, and file names.
77 - Full text search powered by Whoosh on the source files, and file names.
71 Build in indexing daemons, with optional incremental index build
78 Build in indexing daemons, with optional incremental index build
72 (no external search servers required all in one application)
79 (no external search servers required all in one application)
73 - Setup project descriptions and info inside built in db for easy, non
80 - Setup project descriptions and info inside built in db for easy, non
74 file-system operations
81 file-system operations
75 - Intelligent cache with invalidation after push or project change, provides high
82 - Intelligent cache with invalidation after push or project change, provides
76 performance and always up to date data.
83 high performance and always up to date data.
77 - Rss / atom feeds, gravatar support, download sources as zip/tar/gz
84 - Rss / atom feeds, gravatar support, download sources as zip/tar/gz
78 - Async tasks for speed and performance using celery_ (works without them too)
85 - Async tasks for speed and performance using celery_ (works without them too)
79 - Backup scripts can do backup of whole app and send it over scp to desired
86 - Backup scripts can do backup of whole app and send it over scp to desired
@@ -87,17 +94,17 b' RhodeCode Features'
87 Incoming / Plans
94 Incoming / Plans
88 ----------------
95 ----------------
89
96
90 - Project grouping
97 - Finer granular permissions per branch, repo group or subrepo
91 - User groups/teams
98 - pull requests and web based merges
99 - notification and message system
92 - SSH based authentication with server side key management
100 - SSH based authentication with server side key management
93 - Code review (probably based on hg-review)
101 - Code review (probably based on hg-review)
94 - Full git_ support, with push/pull server (currently in beta tests)
102 - Full git_ support, with push/pull server (currently in beta tests)
95 - Redmine integration
103 - Redmine and other bugtrackers integration
96 - Public accessible activity feeds
97 - Commit based built in wiki system
104 - Commit based built in wiki system
98 - Clone points and cloning from remote repositories into RhodeCode
99 - More statistics and graph (global annotation + some more statistics)
105 - More statistics and graph (global annotation + some more statistics)
100 - Other advancements as development continues (or you can of course make additions and or requests)
106 - Other advancements as development continues (or you can of course make
107 additions and or requests)
101
108
102 License
109 License
103 -------
110 -------
@@ -7,6 +7,7 b''
7
7
8 [DEFAULT]
8 [DEFAULT]
9 debug = true
9 debug = true
10 pdebug = false
10 ################################################################################
11 ################################################################################
11 ## Uncomment and replace with the address which should receive ##
12 ## Uncomment and replace with the address which should receive ##
12 ## any error reports after application crash ##
13 ## any error reports after application crash ##
@@ -48,6 +49,8 b' index_dir = %(here)s/data/index'
48 app_instance_uuid = develop
49 app_instance_uuid = develop
49 cut_off_limit = 256000
50 cut_off_limit = 256000
50 force_https = false
51 force_https = false
52 commit_parse_limit = 25
53 use_gravatar = true
51
54
52 ####################################
55 ####################################
53 ### CELERY CONFIG ####
56 ### CELERY CONFIG ####
@@ -139,8 +142,9 b' logview.pylons.util = #eee'
139 #########################################################
142 #########################################################
140 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
143 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
141 #########################################################
144 #########################################################
142 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
145 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
143 sqlalchemy.db1.echo = True
146 sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode
147 sqlalchemy.db1.echo = false
144 sqlalchemy.db1.pool_recycle = 3600
148 sqlalchemy.db1.pool_recycle = 3600
145 sqlalchemy.convert_unicode = true
149 sqlalchemy.convert_unicode = true
146
150
@@ -201,13 +205,13 b' propagate = 0'
201 [handler_console]
205 [handler_console]
202 class = StreamHandler
206 class = StreamHandler
203 args = (sys.stderr,)
207 args = (sys.stderr,)
204 level = NOTSET
208 level = DEBUG
205 formatter = color_formatter
209 formatter = color_formatter
206
210
207 [handler_console_sql]
211 [handler_console_sql]
208 class = StreamHandler
212 class = StreamHandler
209 args = (sys.stderr,)
213 args = (sys.stderr,)
210 level = NOTSET
214 level = DEBUG
211 formatter = color_formatter_sql
215 formatter = color_formatter_sql
212
216
213 ################
217 ################
@@ -226,4 +230,4 b' datefmt = %Y-%m-%d %H:%M:%S'
226 [formatter_color_formatter_sql]
230 [formatter_color_formatter_sql]
227 class=rhodecode.lib.colored_formatter.ColorFormatterSql
231 class=rhodecode.lib.colored_formatter.ColorFormatterSql
228 format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
232 format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
229 datefmt = %Y-%m-%d %H:%M:%S No newline at end of file
233 datefmt = %Y-%m-%d %H:%M:%S
@@ -7,4 +7,4 b' API Reference'
7 :maxdepth: 3
7 :maxdepth: 3
8
8
9 models
9 models
10 No newline at end of file
10 api No newline at end of file
@@ -3,7 +3,79 b''
3 Changelog
3 Changelog
4 =========
4 =========
5
5
6 1.2.0 (**2011-10-07**)
7 ======================
6
8
9
10 news
11 ----
12
13 - implemented #47 repository groups
14 - implemented #89 Can setup google analytics code from settings menu
15 - implemented #91 added nicer looking archive urls with more download options
16 like tags, branches
17 - implemented #44 into file browsing, and added follow branch option
18 - implemented #84 downloads can be enabled/disabled for each repository
19 - anonymous repository can be cloned without having to pass default:default
20 into clone url
21 - fixed #90 whoosh indexer can index chooses repositories passed in command
22 line
23 - extended journal with day aggregates and paging
24 - implemented #107 source code lines highlight ranges
25 - implemented #93 customizable changelog on combined revision ranges -
26 equivalent of githubs compare view
27 - implemented #108 extended and more powerful LDAP configuration
28 - implemented #56 users groups
29 - major code rewrites optimized codes for speed and memory usage
30 - raw and diff downloads are now in git format
31 - setup command checks for write access to given path
32 - fixed many issues with international characters and unicode. It uses utf8
33 decode with replace to provide less errors even with non utf8 encoded strings
34 - #125 added API KEY access to feeds
35 - #109 Repository can be created from external Mercurial link (aka. remote
36 repository, and manually updated (via pull) from admin panel
37 - beta git support - push/pull server + basic view for git repos
38 - added followers page and forks page
39 - server side file creation (with binary file upload interface)
40 and edition with commits powered by codemirror
41 - #111 file browser file finder, quick lookup files on whole file tree
42 - added quick login sliding menu into main page
43 - changelog uses lazy loading of affected files details, in some scenarios
44 this can improve speed of changelog page dramatically especially for
45 larger repositories.
46 - implements #214 added support for downloading subrepos in download menu.
47 - Added basic API for direct operations on rhodecode via JSON
48 - Implemented advanced hook management
49
50 fixes
51 -----
52
53 - fixed file browser bug, when switching into given form revision the url was
54 not changing
55 - fixed propagation to error controller on simplehg and simplegit middlewares
56 - fixed error when trying to make a download on empty repository
57 - fixed problem with '[' chars in commit messages in journal
58 - fixed #99 Unicode errors, on file node paths with non utf-8 characters
59 - journal fork fixes
60 - removed issue with space inside renamed repository after deletion
61 - fixed strange issue on formencode imports
62 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
63 - #150 fixes for errors on repositories mapped in db but corrupted in
64 filesystem
65 - fixed problem with ascendant characters in realm #181
66 - fixed problem with sqlite file based database connection pool
67 - whoosh indexer and code stats share the same dynamic extensions map
68 - fixes #188 - relationship delete of repo_to_perm entry on user removal
69 - fixes issue #189 Trending source files shows "show more" when no more exist
70 - fixes issue #197 Relative paths for pidlocks
71 - fixes issue #198 password will require only 3 chars now for login form
72 - fixes issue #199 wrong redirection for non admin users after creating a repository
73 - fixes issues #202, bad db constraint made impossible to attach same group
74 more than one time. Affects only mysql/postgres
75 - fixes #218 os.kill patch for windows was missing sig param
76 - improved rendering of dag (they are not trimmed anymore when number of
77 heads exceeds 5)
78
7 1.1.8 (**2011-04-12**)
79 1.1.8 (**2011-04-12**)
8 ======================
80 ======================
9
81
@@ -34,6 +106,7 b' fixes'
34 Thomas Waldmann
106 Thomas Waldmann
35 - fixed issue #166 summary pager was skipping 10 revisions on second page
107 - fixed issue #166 summary pager was skipping 10 revisions on second page
36
108
109
37 1.1.7 (**2011-03-23**)
110 1.1.7 (**2011-03-23**)
38 ======================
111 ======================
39
112
@@ -93,7 +166,6 b' fixes'
93 - journal fixes
166 - journal fixes
94 - fixed option to access repository just by entering http://server/<repo_name>
167 - fixed option to access repository just by entering http://server/<repo_name>
95
168
96
97 1.1.3 (**2011-02-16**)
169 1.1.3 (**2011-02-16**)
98 ======================
170 ======================
99
171
@@ -19,8 +19,11 b' Documentation'
19 .. toctree::
19 .. toctree::
20 :maxdepth: 1
20 :maxdepth: 1
21
21
22 enable_git
22 usage/general
23 statistics
23 usage/enable_git
24 usage/statistics
25 usage/backup
26 usage/api_key_access
24
27
25 **Develop**
28 **Develop**
26
29
@@ -3,19 +3,12 b''
3 Installation
3 Installation
4 ============
4 ============
5
5
6 ``RhodeCode`` is written entirely in Python. In order to gain maximum performance
6 ``RhodeCode`` is written entirely in Python. Before posting any issues make
7 there are some third-party you must install. When RhodeCode is used
7 sure, your not missing any system libraries and using right version of
8 together with celery you have to install some kind of message broker,
8 libraries required by RhodeCode. There's also restriction in terms of mercurial
9 recommended one is rabbitmq_ to make the async tasks work.
9 clients. Minimal version of hg client known working fine with RhodeCode is
10 **1.6**. If you're using older client, please upgrade.
10
11
11 Of course RhodeCode works in sync mode also and then you do not have to install
12 any third party applications. However, using Celery_ will give you a large
13 speed improvement when using many big repositories. If you plan to use
14 RhodeCode for say 7 to 10 small repositories, RhodeCode will perform perfectly
15 well without celery running.
16
17 If you make the decision to run RhodeCode with celery make sure you run
18 celeryd using paster and message broker together with the application.
19
12
20 Installing RhodeCode from Cheese Shop
13 Installing RhodeCode from Cheese Shop
21 -------------------------------------
14 -------------------------------------
@@ -40,7 +33,12 b' Step by step installation example'
40 ---------------------------------
33 ---------------------------------
41
34
42
35
43 - Assuming you have installed virtualenv_ create a new virtual environment using virtualenv::
36 For installing RhodeCode i highly recommend using separate virtualenv_. This
37 way many required by RhodeCode libraries will remain sandboxed from your main
38 python and making things less problematic when doing system python updates.
39
40 - Assuming you have installed virtualenv_ create a new virtual environment
41 using virtualenv command::
44
42
45 virtualenv --no-site-packages /var/www/rhodecode-venv
43 virtualenv --no-site-packages /var/www/rhodecode-venv
46
44
@@ -64,21 +62,40 b' Step by step installation example'
64 ``virtualenv`` script. It's perfectly acceptable (and desirable)
62 ``virtualenv`` script. It's perfectly acceptable (and desirable)
65 to create a virtualenv as a normal user.
63 to create a virtualenv as a normal user.
66
64
67 - Make a folder for rhodecode somewhere on the filesystem for example::
65 - Make a folder for rhodecode data files, and configuration somewhere on the
66 filesystem. For example::
68
67
69 mkdir /var/www/rhodecode
68 mkdir /var/www/rhodecode
70
69
71
70
72 - Run this command to install rhodecode::
71 - Go into the created directory run this command to install rhodecode::
73
72
74 easy_install rhodecode
73 easy_install rhodecode
74
75 or::
76
77 pip install rhodecode
75
78
76 - This will install rhodecode together with pylons and all other required python
79 - This will install rhodecode together with pylons and all other required
77 libraries
80 python libraries into activated virtualenv
78
81
79 Requirements for Celery (optional)
82 Requirements for Celery (optional)
80 ----------------------------------
83 ----------------------------------
81
84
85 In order to gain maximum performance
86 there are some third-party you must install. When RhodeCode is used
87 together with celery you have to install some kind of message broker,
88 recommended one is rabbitmq_ to make the async tasks work.
89
90 Of course RhodeCode works in sync mode also and then you do not have to install
91 any third party applications. However, using Celery_ will give you a large
92 speed improvement when using many big repositories. If you plan to use
93 RhodeCode for say 7 to 10 repositories, RhodeCode will perform perfectly well
94 without celery running.
95
96 If you make the decision to run RhodeCode with celery make sure you run
97 celeryd using paster and message broker together with the application.
98
82 .. note::
99 .. note::
83 Installing message broker and using celery is optional, RhodeCode will
100 Installing message broker and using celery is optional, RhodeCode will
84 work perfectly fine without them.
101 work perfectly fine without them.
@@ -5,16 +5,17 b' Setup'
5
5
6
6
7 Setting up RhodeCode
7 Setting up RhodeCode
8 --------------------------
8 --------------------
9
9
10 First, you will need to create a RhodeCode configuration file. Run the following
10 First, you will need to create a RhodeCode configuration file. Run the
11 command to do this::
11 following command to do this::
12
12
13 paster make-config RhodeCode production.ini
13 paster make-config RhodeCode production.ini
14
14
15 - This will create the file `production.ini` in the current directory. This
15 - This will create the file `production.ini` in the current directory. This
16 configuration file contains the various settings for RhodeCode, e.g proxy port,
16 configuration file contains the various settings for RhodeCode, e.g proxy
17 email settings, usage of static files, cache, celery settings and logging.
17 port, email settings, usage of static files, cache, celery settings and
18 logging.
18
19
19
20
20 Next, you need to create the databases used by RhodeCode. I recommend that you
21 Next, you need to create the databases used by RhodeCode. I recommend that you
@@ -27,19 +28,19 b' the following command::'
27
28
28 This will prompt you for a "root" path. This "root" path is the location where
29 This will prompt you for a "root" path. This "root" path is the location where
29 RhodeCode will store all of its repositories on the current machine. After
30 RhodeCode will store all of its repositories on the current machine. After
30 entering this "root" path ``setup-app`` will also prompt you for a username and password
31 entering this "root" path ``setup-app`` will also prompt you for a username
31 for the initial admin account which ``setup-app`` sets up for you.
32 and password for the initial admin account which ``setup-app`` sets up for you.
32
33
33 - The ``setup-app`` command will create all of the needed tables and an admin
34 - The ``setup-app`` command will create all of the needed tables and an admin
34 account. When choosing a root path you can either use a new empty location, or a
35 account. When choosing a root path you can either use a new empty location,
35 location which already contains existing repositories. If you choose a location
36 or a location which already contains existing repositories. If you choose a
36 which contains existing repositories RhodeCode will simply add all of the
37 location which contains existing repositories RhodeCode will simply add all
37 repositories at the chosen location to it's database. (Note: make sure you
38 of the repositories at the chosen location to it's database. (Note: make
38 specify the correct path to the root).
39 sure you specify the correct path to the root).
39 - Note: the given path for mercurial_ repositories **must** be write accessible
40 - Note: the given path for mercurial_ repositories **must** be write accessible
40 for the application. It's very important since the RhodeCode web interface will
41 for the application. It's very important since the RhodeCode web interface
41 work without write access, but when trying to do a push it will eventually fail
42 will work without write access, but when trying to do a push it will
42 with permission denied errors unless it has write access.
43 eventually fail with permission denied errors unless it has write access.
43
44
44 You are now ready to use RhodeCode, to run it simply execute::
45 You are now ready to use RhodeCode, to run it simply execute::
45
46
@@ -48,7 +49,8 b' You are now ready to use RhodeCode, to r'
48 - This command runs the RhodeCode server. The web app should be available at the
49 - This command runs the RhodeCode server. The web app should be available at the
49 127.0.0.1:5000. This ip and port is configurable via the production.ini
50 127.0.0.1:5000. This ip and port is configurable via the production.ini
50 file created in previous step
51 file created in previous step
51 - Use the admin account you created above when running ``setup-app`` to login to the web app.
52 - Use the admin account you created above when running ``setup-app`` to login
53 to the web app.
52 - The default permissions on each repository is read, and the owner is admin.
54 - The default permissions on each repository is read, and the owner is admin.
53 Remember to update these if needed.
55 Remember to update these if needed.
54 - In the admin panel you can toggle ldap, anonymous, permissions settings. As
56 - In the admin panel you can toggle ldap, anonymous, permissions settings. As
@@ -56,9 +58,9 b' You are now ready to use RhodeCode, to r'
56
58
57 Try copying your own mercurial repository into the "root" directory you are
59 Try copying your own mercurial repository into the "root" directory you are
58 using, then from within the RhodeCode web application choose Admin >
60 using, then from within the RhodeCode web application choose Admin >
59 repositories. Then choose Add New Repository. Add the repository you copied into
61 repositories. Then choose Add New Repository. Add the repository you copied
60 the root. Test that you can browse your repository from within RhodeCode and then
62 into the root. Test that you can browse your repository from within RhodeCode
61 try cloning your repository from RhodeCode with::
63 and then try cloning your repository from RhodeCode with::
62
64
63 hg clone http://127.0.0.1:5000/<repository name>
65 hg clone http://127.0.0.1:5000/<repository name>
64
66
@@ -67,8 +69,8 b' where *repository name* is replaced by t'
67 Using RhodeCode with SSH
69 Using RhodeCode with SSH
68 ------------------------
70 ------------------------
69
71
70 RhodeCode currently only hosts repositories using http and https. (The addition of
72 RhodeCode currently only hosts repositories using http and https. (The addition
71 ssh hosting is a planned future feature.) However you can easily use ssh in
73 of ssh hosting is a planned future feature.) However you can easily use ssh in
72 parallel with RhodeCode. (Repository access via ssh is a standard "out of
74 parallel with RhodeCode. (Repository access via ssh is a standard "out of
73 the box" feature of mercurial_ and you can use this to access any of the
75 the box" feature of mercurial_ and you can use this to access any of the
74 repositories that RhodeCode is hosting. See PublishingRepositories_)
76 repositories that RhodeCode is hosting. See PublishingRepositories_)
@@ -77,10 +79,10 b' RhodeCode repository structures are kept'
77 as the project. When using repository groups, each group is a subdirectory.
79 as the project. When using repository groups, each group is a subdirectory.
78 This allows you to easily use ssh for accessing repositories.
80 This allows you to easily use ssh for accessing repositories.
79
81
80 In order to use ssh you need to make sure that your web-server and the users login
82 In order to use ssh you need to make sure that your web-server and the users
81 accounts have the correct permissions set on the appropriate directories. (Note
83 login accounts have the correct permissions set on the appropriate directories.
82 that these permissions are independent of any permissions you have set up using
84 (Note that these permissions are independent of any permissions you have set up
83 the RhodeCode web interface.)
85 using the RhodeCode web interface.)
84
86
85 If your main directory (the same as set in RhodeCode settings) is for example
87 If your main directory (the same as set in RhodeCode settings) is for example
86 set to **/home/hg** and the repository you are using is named `rhodecode`, then
88 set to **/home/hg** and the repository you are using is named `rhodecode`, then
@@ -95,35 +97,41 b' Note: In an advanced setup, in order for'
95 permissions as set up via the RhodeCode web interface, you can create an
97 permissions as set up via the RhodeCode web interface, you can create an
96 authentication hook to connect to the rhodecode db and runs check functions for
98 authentication hook to connect to the rhodecode db and runs check functions for
97 permissions against that.
99 permissions against that.
98
99
100
100
101 Setting up Whoosh full text search
101 Setting up Whoosh full text search
102 ----------------------------------
102 ----------------------------------
103
103
104 Starting from version 1.1 the whoosh index can be build by using the paster
104 Starting from version 1.1 the whoosh index can be build by using the paster
105 command ``make-index``. To use ``make-index`` you must specify the configuration
105 command ``make-index``. To use ``make-index`` you must specify the configuration
106 file that stores the location of the index, and the location of the repositories
106 file that stores the location of the index. You may specify the location of the
107 (`--repo-location`).
107 repositories (`--repo-location`). If not specified, this value is retrieved
108 from the RhodeCode database. This was required prior to 1.2. Starting from
109 version 1.2 it is also possible to specify a comma separated list of
110 repositories (`--index-only`) to build index only on chooses repositories
111 skipping any other found in repos location
108
112
109 You may optionally pass the option `-f` to enable a full index rebuild. Without
113 You may optionally pass the option `-f` to enable a full index rebuild. Without
110 the `-f` option, indexing will run always in "incremental" mode.
114 the `-f` option, indexing will run always in "incremental" mode.
111
115
112 For an incremental index build use::
116 For an incremental index build use::
113
117
114 paster make-index production.ini --repo-location=<location for repos>
118 paster make-index production.ini
115
119
116 For a full index rebuild use::
120 For a full index rebuild use::
117
121
118 paster make-index production.ini -f --repo-location=<location for repos>
122 paster make-index production.ini -f
123
119
124
120 - For full text search you can either put crontab entry for
125 building index just for chosen repositories is possible with such command::
126
127 paster make-index production.ini --index-only=vcs,rhodecode
128
121
129
122 In order to do periodical index builds and keep your index always up to date.
130 In order to do periodical index builds and keep your index always up to date.
123 It's recommended to do a crontab entry for incremental indexing.
131 It's recommended to do a crontab entry for incremental indexing.
124 An example entry might look like this::
132 An example entry might look like this::
125
133
126 /path/to/python/bin/paster /path/to/rhodecode/production.ini --repo-location=<location for repos>
134 /path/to/python/bin/paster make-index /path/to/rhodecode/production.ini
127
135
128 When using incremental mode (the default) whoosh will check the last
136 When using incremental mode (the default) whoosh will check the last
129 modification date of each file and add it to be reindexed if a newer file is
137 modification date of each file and add it to be reindexed if a newer file is
@@ -138,55 +146,221 b' Setting up LDAP support'
138 -----------------------
146 -----------------------
139
147
140 RhodeCode starting from version 1.1 supports ldap authentication. In order
148 RhodeCode starting from version 1.1 supports ldap authentication. In order
141 to use LDAP, you have to install the python-ldap_ package. This package is available
149 to use LDAP, you have to install the python-ldap_ package. This package is
142 via pypi, so you can install it by running
150 available via pypi, so you can install it by running
143
151
144 ::
152 using easy_install::
145
153
146 easy_install python-ldap
154 easy_install python-ldap
147
155
148 ::
156 using pip::
149
157
150 pip install python-ldap
158 pip install python-ldap
151
159
152 .. note::
160 .. note::
153 python-ldap requires some certain libs on your system, so before installing
161 python-ldap requires some certain libs on your system, so before installing
154 it check that you have at least `openldap`, and `sasl` libraries.
162 it check that you have at least `openldap`, and `sasl` libraries.
155
163
156 ldap settings are located in admin->ldap section,
164 LDAP settings are located in admin->ldap section,
157
165
158 Here's a typical ldap setup::
166 Here's a typical ldap setup::
159
167
160 Enable ldap = checked #controls if ldap access is enabled
168 Connection settings
161 Host = host.domain.org #actual ldap server to connect
169 Enable LDAP = checked
162 Port = 389 or 689 for ldaps #ldap server ports
170 Host = host.example.org
163 Enable LDAPS = unchecked #enable disable ldaps
171 Port = 389
164 Account = <account> #access for ldap server(if required)
172 Account = <account>
165 Password = <password> #password for ldap server(if required)
173 Password = <password>
166 Base DN = uid=%(user)s,CN=users,DC=host,DC=domain,DC=org
174 Connection Security = LDAPS connection
167
175 Certificate Checks = DEMAND
176
177 Search settings
178 Base DN = CN=users,DC=host,DC=example,DC=org
179 LDAP Filter = (&(objectClass=user)(!(objectClass=computer)))
180 LDAP Search Scope = SUBTREE
181
182 Attribute mappings
183 Login Attribute = uid
184 First Name Attribute = firstName
185 Last Name Attribute = lastName
186 E-mail Attribute = mail
187
188 .. _enable_ldap:
189
190 Enable LDAP : required
191 Whether to use LDAP for authenticating users.
192
193 .. _ldap_host:
194
195 Host : required
196 LDAP server hostname or IP address.
197
198 .. _Port:
199
200 Port : required
201 389 for un-encrypted LDAP, 636 for SSL-encrypted LDAP.
202
203 .. _ldap_account:
204
205 Account : optional
206 Only required if the LDAP server does not allow anonymous browsing of
207 records. This should be a special account for record browsing. This
208 will require `LDAP Password`_ below.
209
210 .. _LDAP Password:
211
212 Password : optional
213 Only required if the LDAP server does not allow anonymous browsing of
214 records.
168
215
169 `Account` and `Password` are optional, and used for two-phase ldap
216 .. _Enable LDAPS:
170 authentication so those are credentials to access your ldap, if it doesn't
217
171 support anonymous search/user lookups.
218 Connection Security : required
219 Defines the connection to LDAP server
220
221 No encryption
222 Plain non encrypted connection
223
224 LDAPS connection
225 Enable ldaps connection. It will likely require `Port`_ to be set to
226 a different value (standard LDAPS port is 636). When LDAPS is enabled
227 then `Certificate Checks`_ is required.
228
229 START_TLS on LDAP connection
230 START TLS connection
231
232 .. _Certificate Checks:
233
234 Certificate Checks : optional
235 How SSL certificates verification is handled - this is only useful when
236 `Enable LDAPS`_ is enabled. Only DEMAND or HARD offer full SSL security
237 while the other options are susceptible to man-in-the-middle attacks. SSL
238 certificates can be installed to /etc/openldap/cacerts so that the
239 DEMAND or HARD options can be used with self-signed certificates or
240 certificates that do not have traceable certificates of authority.
241
242 NEVER
243 A serve certificate will never be requested or checked.
244
245 ALLOW
246 A server certificate is requested. Failure to provide a
247 certificate or providing a bad certificate will not terminate the
248 session.
249
250 TRY
251 A server certificate is requested. Failure to provide a
252 certificate does not halt the session; providing a bad certificate
253 halts the session.
254
255 DEMAND
256 A server certificate is requested and must be provided and
257 authenticated for the session to proceed.
258
259 HARD
260 The same as DEMAND.
261
262 .. _Base DN:
172
263
173 Base DN must have the %(user)s template inside, it's a place holder where your uid
264 Base DN : required
174 used to login would go. It allows admins to specify non-standard schema for the
265 The Distinguished Name (DN) where searches for users will be performed.
175 uid variable.
266 Searches can be controlled by `LDAP Filter`_ and `LDAP Search Scope`_.
267
268 .. _LDAP Filter:
269
270 LDAP Filter : optional
271 A LDAP filter defined by RFC 2254. This is more useful when `LDAP
272 Search Scope`_ is set to SUBTREE. The filter is useful for limiting
273 which LDAP objects are identified as representing Users for
274 authentication. The filter is augmented by `Login Attribute`_ below.
275 This can commonly be left blank.
276
277 .. _LDAP Search Scope:
278
279 LDAP Search Scope : required
280 This limits how far LDAP will search for a matching object.
281
282 BASE
283 Only allows searching of `Base DN`_ and is usually not what you
284 want.
285
286 ONELEVEL
287 Searches all entries under `Base DN`_, but not Base DN itself.
288
289 SUBTREE
290 Searches all entries below `Base DN`_, but not Base DN itself.
291 When using SUBTREE `LDAP Filter`_ is useful to limit object
292 location.
293
294 .. _Login Attribute:
295
296 Login Attribute : required
297 The LDAP record attribute that will be matched as the USERNAME or
298 ACCOUNT used to connect to RhodeCode. This will be added to `LDAP
299 Filter`_ for locating the User object. If `LDAP Filter`_ is specified as
300 "LDAPFILTER", `Login Attribute`_ is specified as "uid" and the user has
301 connected as "jsmith" then the `LDAP Filter`_ will be augmented as below
302 ::
303
304 (&(LDAPFILTER)(uid=jsmith))
305
306 .. _ldap_attr_firstname:
307
308 First Name Attribute : required
309 The LDAP record attribute which represents the user's first name.
310
311 .. _ldap_attr_lastname:
176
312
177 If all of the data is correctly entered, and `python-ldap` is properly
313 Last Name Attribute : required
178 installed, then users should be granted access to RhodeCode with ldap accounts.
314 The LDAP record attribute which represents the user's last name.
179 When logging in the first time a special ldap account is created inside
315
180 RhodeCode, so you can control the permissions even on ldap users. If such users
316 .. _ldap_attr_email:
181 already exist in the RhodeCode database, then the ldap user with the same
317
182 username would be not be able to access RhodeCode.
318 Email Attribute : required
319 The LDAP record attribute which represents the user's email address.
320
321 If all data are entered correctly, and python-ldap_ is properly installed
322 users should be granted access to RhodeCode with ldap accounts. At this
323 time user information is copied from LDAP into the RhodeCode user database.
324 This means that updates of an LDAP user object may not be reflected as a
325 user update in RhodeCode.
326
327 If You have problems with LDAP access and believe You entered correct
328 information check out the RhodeCode logs, any error messages sent from LDAP
329 will be saved there.
330
331 Active Directory
332 ''''''''''''''''
183
333
184 If you have problems with ldap access and believe you have correctly entered the
334 RhodeCode can use Microsoft Active Directory for user authentication. This
185 required information then proceed by investigating the RhodeCode logs. Any
335 is done through an LDAP or LDAPS connection to Active Directory. The
186 error messages sent from ldap will be saved there.
336 following LDAP configuration settings are typical for using Active
337 Directory ::
338
339 Base DN = OU=SBSUsers,OU=Users,OU=MyBusiness,DC=v3sys,DC=local
340 Login Attribute = sAMAccountName
341 First Name Attribute = givenName
342 Last Name Attribute = sn
343 E-mail Attribute = mail
344
345 All other LDAP settings will likely be site-specific and should be
346 appropriately configured.
187
347
188
348
189
349
350 Hook management
351 ---------------
352
353 Hooks can be managed in similar way to this used in .hgrc files.
354 To access hooks setting click `advanced setup` on Hooks section of Mercurial
355 Settings in Admin.
356
357 There are 4 built in hooks that cannot be changed (only enable/disable by
358 checkboxes on previos section).
359 To add another custom hook simply fill in first section with
360 <name>.<hook_type> and the second one with hook path. Example hooks
361 can be found at *rhodecode.lib.hooks*.
362
363
190 Setting Up Celery
364 Setting Up Celery
191 -----------------
365 -----------------
192
366
@@ -204,8 +378,8 b' In order to start using celery run::'
204
378
205
379
206 .. note::
380 .. note::
207 Make sure you run this command from the same virtualenv, and with the same user
381 Make sure you run this command from the same virtualenv, and with the same
208 that rhodecode runs.
382 user that rhodecode runs.
209
383
210 HTTPS support
384 HTTPS support
211 -------------
385 -------------
@@ -214,8 +388,8 b' There are two ways to enable https:'
214
388
215 - Set HTTP_X_URL_SCHEME in your http server headers, than rhodecode will
389 - Set HTTP_X_URL_SCHEME in your http server headers, than rhodecode will
216 recognize this headers and make proper https redirections
390 recognize this headers and make proper https redirections
217 - Alternatively, set `force_https = true` in the ini configuration to force using
391 - Alternatively, change the `force_https = true` flag in the ini configuration
218 https, no headers are needed than to enable https
392 to force using https, no headers are needed than to enable https
219
393
220
394
221 Nginx virtual host example
395 Nginx virtual host example
@@ -251,13 +425,10 b' pushes or large pushes::'
251 client_max_body_size 400m;
425 client_max_body_size 400m;
252 client_body_buffer_size 128k;
426 client_body_buffer_size 128k;
253 proxy_buffering off;
427 proxy_buffering off;
254 proxy_connect_timeout 3600;
428 proxy_connect_timeout 7200;
255 proxy_send_timeout 3600;
429 proxy_send_timeout 7200;
256 proxy_read_timeout 3600;
430 proxy_read_timeout 7200;
257 proxy_buffer_size 16k;
431 proxy_buffers 8 32k;
258 proxy_buffers 4 16k;
259 proxy_busy_buffers_size 64k;
260 proxy_temp_file_write_size 64k;
261
432
262 Also, when using root path with nginx you might set the static files to false
433 Also, when using root path with nginx you might set the static files to false
263 in the production.ini file::
434 in the production.ini file::
@@ -315,7 +486,8 b' Apache subdirectory part::'
315 SetEnvIf X-Url-Scheme https HTTPS=1
486 SetEnvIf X-Url-Scheme https HTTPS=1
316 </Location>
487 </Location>
317
488
318 Besides the regular apache setup you will need to add the following to your .ini file::
489 Besides the regular apache setup you will need to add the following line
490 into [app:main] section of your .ini file::
319
491
320 filter-with = proxy-prefix
492 filter-with = proxy-prefix
321
493
@@ -328,59 +500,24 b' Add the following at the end of the .ini'
328
500
329 then change <someprefix> into your choosen prefix
501 then change <someprefix> into your choosen prefix
330
502
331 Apache's example WSGI+SSL config
503 Apache's WSGI config
332 --------------------------------
504 --------------------
333
334 virtual host example::
335
336 <VirtualHost *:443>
337 ServerName hg.domain.eu:443
338 DocumentRoot /var/www
339
340 SSLEngine on
341 SSLCertificateFile /etc/apache2/ssl/hg.domain.eu.cert
342 SSLCertificateKeyFile /etc/apache2/ssl/hg.domain.eu.key
343 SSLCertificateChainFile /etc/apache2/ssl/ca.cert
344 SetEnv HTTP_X_URL_SCHEME https
345
346 Alias /css /home/web/virtualenvs/hg/lib/python2.6/site-packages/rhodecode/public/css
347 Alias /images /home/web/virtualenvs/hg/lib/python2.6/site-packages/rhodecode/public/images
348 Alias /js /home/web/virtualenvs/hg/lib/python2.6/site-packages/rhodecode/public/js
349
350 WSGIDaemonProcess hg user=web group=web processes=1 threads=10 display-name=%{GROUP} python-path=/home/web/virtualenvs/hg/lib/python2.6/site-packages
351
352 WSGIPassAuthorization On
353 WSGIProcessGroup hg
354 WSGIApplicationGroup hg
355 WSGIScriptAlias / /home/web/apache/conf/hg.wsgi
356
357 <Directory /home/web/apache/conf>
358 Order deny,allow
359 Allow from all
360 </Directory>
361 <Directory /var/www>
362 Order deny,allow
363 Allow from all
364 </Directory>
365
366 </VirtualHost>
367
368 <VirtualHost *:80>
369 ServerName hg.domain.eu
370 Redirect permanent / https://hg.domain.eu/
371 </VirtualHost>
372
505
373
506
374 HG.WSGI::
507 Example wsgi dispatch script::
375
508
376 import os
509 import os
377 os.environ["HGENCODING"] = "UTF-8"
510 os.environ["HGENCODING"] = "UTF-8"
511 os.environ['PYTHON_EGG_CACHE'] = '/home/web/rhodecode/.egg-cache'
512
513 # sometimes it's needed to set the curent dir
514 os.chdir('/home/web/rhodecode/')
378
515
379 from paste.deploy import loadapp
516 from paste.deploy import loadapp
380 from paste.script.util.logging_config import fileConfig
517 from paste.script.util.logging_config import fileConfig
381
518
382 fileConfig('/home/web/virtualenvs/hg/config/production.ini')
519 fileConfig('/home/web/rhodecode/production.ini')
383 application = loadapp('config:/home/web/virtualenvs/hg/config/production.ini'
520 application = loadapp('config:/home/web/rhodecode/production.ini')
384
521
385
522
386 Other configuration files
523 Other configuration files
@@ -421,7 +558,8 b' Troubleshooting'
421 :Q: **Apache doesn't pass basicAuth on pull/push?**
558 :Q: **Apache doesn't pass basicAuth on pull/push?**
422 :A: Make sure you added `WSGIPassAuthorization true`.
559 :A: Make sure you added `WSGIPassAuthorization true`.
423
560
424 For further questions search the `Issues tracker`_, or post a message in the `google group rhodecode`_
561 For further questions search the `Issues tracker`_, or post a message in the
562 `google group rhodecode`_
425
563
426 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
564 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
427 .. _python: http://www.python.org/
565 .. _python: http://www.python.org/
@@ -4,9 +4,10 b' Enabling GIT support (beta)'
4 ===========================
4 ===========================
5
5
6
6
7 Git support in RhodeCode 1.1 was disabled due to current instability issues. However,
7 Git support in RhodeCode 1.1 was disabled due to current instability issues.
8 if you would like to test git support please feel free to re-enable it. To re-enable GIT support just
8 However,if you would like to test git support please feel free to re-enable it.
9 uncomment the git line in the file rhodecode/__init__.py
9 To re-enable GIT support just uncomment the git line in the
10 file **rhodecode/__init__.py**
10
11
11 .. code-block:: python
12 .. code-block:: python
12
13
@@ -19,4 +20,5 b' uncomment the git line in the file rhode'
19 Please note that the git support provided by RhodeCode is not yet fully
20 Please note that the git support provided by RhodeCode is not yet fully
20 stable and RhodeCode might crash while using git repositories. (That is why
21 stable and RhodeCode might crash while using git repositories. (That is why
21 it is currently disabled.) Thus be careful about enabling git support, and
22 it is currently disabled.) Thus be careful about enabling git support, and
22 certainly don't use it in a production setting! No newline at end of file
23 certainly don't use it in a production setting!
24 No newline at end of file
@@ -10,7 +10,7 b' cached inside db and are gathered increm'
10 this:
10 this:
11
11
12 With Celery disabled
12 With Celery disabled
13 ++++++++++++++++++++
13 --------------------
14
14
15 - On each first visit to the summary page a set of 250 commits are parsed and
15 - On each first visit to the summary page a set of 250 commits are parsed and
16 updates statistics cache.
16 updates statistics cache.
@@ -21,7 +21,7 b' With Celery disabled'
21
21
22
22
23 With Celery enabled
23 With Celery enabled
24 +++++++++++++++++++
24 -------------------
25
25
26 - On the first visit to the summary page RhodeCode will create tasks that will
26 - On the first visit to the summary page RhodeCode will create tasks that will
27 execute on celery workers. This task will gather all of the stats until all
27 execute on celery workers. This task will gather all of the stats until all
@@ -30,4 +30,4 b' With Celery enabled'
30
30
31 .. note::
31 .. note::
32 At any time you can disable statistics on each repository via the repository
32 At any time you can disable statistics on each repository via the repository
33 edit form in the admin panel. To do this just uncheck the statistics checkbox. No newline at end of file
33 edit form in the admin panel. To do this just uncheck the statistics checkbox.
@@ -202,14 +202,13 b' def main(argv, version=DEFAULT_VERSION):'
202 except ImportError:
202 except ImportError:
203 from easy_install import main
203 from easy_install import main
204 main(list(argv) + [download_setuptools(delay=0)])
204 main(list(argv) + [download_setuptools(delay=0)])
205 sys.exit(0) # try to force an exit
205 sys.exit(0) # try to force an exit
206 else:
206 else:
207 if argv:
207 if argv:
208 from setuptools.command.easy_install import main
208 from setuptools.command.easy_install import main
209 main(argv)
209 main(argv)
210 else:
210 else:
211 print "Setuptools version", version, ("or greater has "
211 print "Setuptools version", version, "or greater has been installed."
212 "been installed.")
213 print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
212 print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
214
213
215
214
@@ -1,6 +1,6 b''
1 #!/bin/sh -e
1 #!/bin/sh -e
2 ########################################
2 ########################################
3 #### THIS IS AN DEBIAN INIT.D SCRIPT####
3 #### THIS IS A DEBIAN INIT.D SCRIPT ####
4 ########################################
4 ########################################
5
5
6 ### BEGIN INIT INFO
6 ### BEGIN INIT INFO
@@ -29,49 +29,48 b' RUN_AS="marcink"'
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
38 start() {
39 echo "Starting $APP_NAME"
40 PYTHON_EGG_CACHE="/tmp" start-stop-daemon -d $APP_PATH \
41 --start --quiet \
42 --pidfile $PID_PATH \
43 --user $RUN_AS \
44 --exec $DAEMON -- $DAEMON_OPTS
45 }
46
47 stop() {
48 echo "Stopping $APP_NAME"
49 start-stop-daemon -d $APP_PATH \
50 --stop --quiet \
51 --pidfile $PID_PATH || echo "$APP_NAME - Not running!"
52
53 if [ -f $PID_PATH ]; then
54 rm $PID_PATH
55 fi
56 }
37
57
38 case "$1" in
58 case "$1" in
39 start)
59 start)
40 echo "Starting $APP_NAME"
60 start
41 start-stop-daemon -d $APP_PATH -e PYTHON_EGG_CACHE="/tmp" \
42 --start --quiet \
43 --pidfile $PID_PATH \
44 --user $RUN_AS \
45 --exec $DAEMON -- $DAEMON_OPTS
46 ;;
61 ;;
47 stop)
62 stop)
48 echo "Stopping $APP_NAME"
63 stop
49 start-stop-daemon -d $APP_PATH \
50 --stop --quiet \
51 --pidfile $PID_PATH || echo "$APP_NAME - Not running!"
52 if [ -f $PID_PATH ]; then
53 rm $PID_PATH
54 fi
55 ;;
64 ;;
56 restart)
65 restart)
57 echo "Restarting $APP_NAME"
66 echo "Restarting $APP_NAME"
58 ### stop ###
67 ### stop ###
59 echo "Stopping $APP_NAME"
68 stop
60 start-stop-daemon -d $APP_PATH \
69 wait
61 --stop --quiet \
62 --pidfile $PID_PATH || echo "$APP_NAME - Not running!"
63 if [ -f $PID_PATH ]; then
64 rm $PID_PATH
65 fi
66 ### start ###
70 ### start ###
67 echo "Starting $APP_NAME"
71 start
68 start-stop-daemon -d $APP_PATH -e PYTHON_EGG_CACHE="/tmp" \
69 --start --quiet \
70 --pidfile $PID_PATH \
71 --user $RUN_AS \
72 --exec $DAEMON -- $DAEMON_OPTS
73 ;;
72 ;;
74 *)
73 *)
75 echo "Usage: $0 {start|stop|restart}"
74 echo "Usage: $0 {start|stop|restart}"
76 exit 1
75 exit 1
77 esac No newline at end of file
76 esac
@@ -7,6 +7,7 b''
7
7
8 [DEFAULT]
8 [DEFAULT]
9 debug = true
9 debug = true
10 pdebug = false
10 ################################################################################
11 ################################################################################
11 ## Uncomment and replace with the address which should receive ##
12 ## Uncomment and replace with the address which should receive ##
12 ## any error reports after application crash ##
13 ## any error reports after application crash ##
@@ -29,7 +30,7 b' debug = true'
29 threadpool_workers = 5
30 threadpool_workers = 5
30
31
31 ##max request before thread respawn
32 ##max request before thread respawn
32 threadpool_max_requests = 2
33 threadpool_max_requests = 10
33
34
34 ##option to use threads of process
35 ##option to use threads of process
35 use_threadpool = true
36 use_threadpool = true
@@ -41,12 +42,15 b' port = 8001'
41 [app:main]
42 [app:main]
42 use = egg:rhodecode
43 use = egg:rhodecode
43 full_stack = true
44 full_stack = true
44 static_files = false
45 static_files = true
45 lang=en
46 lang=en
46 cache_dir = %(here)s/data
47 cache_dir = %(here)s/data
47 index_dir = %(here)s/data/index
48 index_dir = %(here)s/data/index
49 app_instance_uuid = prod1234
48 cut_off_limit = 256000
50 cut_off_limit = 256000
49 force_https = false
51 force_https = false
52 commit_parse_limit = 50
53 use_gravatar = true
50
54
51 ####################################
55 ####################################
52 ### CELERY CONFIG ####
56 ### CELERY CONFIG ####
@@ -70,7 +74,7 b' celery.result.serialier = json'
70 celeryd.concurrency = 2
74 celeryd.concurrency = 2
71 #celeryd.log.file = celeryd.log
75 #celeryd.log.file = celeryd.log
72 celeryd.log.level = debug
76 celeryd.log.level = debug
73 celeryd.max.tasks.per.child = 3
77 celeryd.max.tasks.per.child = 1
74
78
75 #tasks will never be sent to the queue, but executed locally instead.
79 #tasks will never be sent to the queue, but executed locally instead.
76 celery.always.eager = false
80 celery.always.eager = false
@@ -92,9 +96,8 b' beaker.cache.short_term.expire=60'
92 beaker.cache.long_term.type=memory
96 beaker.cache.long_term.type=memory
93 beaker.cache.long_term.expire=36000
97 beaker.cache.long_term.expire=36000
94
98
95
96 beaker.cache.sql_cache_short.type=memory
99 beaker.cache.sql_cache_short.type=memory
97 beaker.cache.sql_cache_short.expire=5
100 beaker.cache.sql_cache_short.expire=10
98
101
99 beaker.cache.sql_cache_med.type=memory
102 beaker.cache.sql_cache_med.type=memory
100 beaker.cache.sql_cache_med.expire=360
103 beaker.cache.sql_cache_med.expire=360
@@ -139,9 +142,10 b' logview.pylons.util = #eee'
139 #########################################################
142 #########################################################
140 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
143 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
141 #########################################################
144 #########################################################
142 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
145 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
143 #sqlalchemy.db1.echo = False
146 sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode
144 #sqlalchemy.db1.pool_recycle = 3600
147 sqlalchemy.db1.echo = false
148 sqlalchemy.db1.pool_recycle = 3600
145 sqlalchemy.convert_unicode = true
149 sqlalchemy.convert_unicode = true
146
150
147 ################################
151 ################################
@@ -202,13 +206,13 b' propagate = 0'
202 class = StreamHandler
206 class = StreamHandler
203 args = (sys.stderr,)
207 args = (sys.stderr,)
204 level = INFO
208 level = INFO
205 formatter = color_formatter
209 formatter = generic
206
210
207 [handler_console_sql]
211 [handler_console_sql]
208 class = StreamHandler
212 class = StreamHandler
209 args = (sys.stderr,)
213 args = (sys.stderr,)
210 level = WARN
214 level = WARN
211 formatter = color_formatter_sql
215 formatter = generic
212
216
213 ################
217 ################
214 ## FORMATTERS ##
218 ## FORMATTERS ##
@@ -25,14 +25,14 b''
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
26 import platform
26 import platform
27
27
28 VERSION = (1, 1, 8)
28 VERSION = (1, 2, 0)
29 __version__ = '.'.join((str(each) for each in VERSION[:4]))
29 __version__ = '.'.join((str(each) for each in VERSION[:4]))
30 __dbversion__ = 2 # defines current db version for migrations
30 __dbversion__ = 3 #defines current db version for migrations
31 __platform__ = platform.system()
31 __platform__ = platform.system()
32 __license__ = 'GPLv3'
32 __license__ = 'GPLv3'
33
33
34 PLATFORM_WIN = ('Windows')
34 PLATFORM_WIN = ('Windows')
35 PLATFORM_OTHERS = ('Linux', 'Darwin', 'FreeBSD', 'OpenBSD')
35 PLATFORM_OTHERS = ('Linux', 'Darwin', 'FreeBSD', 'OpenBSD', 'SunOS')
36
36
37 try:
37 try:
38 from rhodecode.lib.utils import get_current_revision
38 from rhodecode.lib.utils import get_current_revision
@@ -7,6 +7,7 b''
7
7
8 [DEFAULT]
8 [DEFAULT]
9 debug = true
9 debug = true
10 pdebug = false
10 ################################################################################
11 ################################################################################
11 ## Uncomment and replace with the address which should receive ##
12 ## Uncomment and replace with the address which should receive ##
12 ## any error reports after application crash ##
13 ## any error reports after application crash ##
@@ -48,6 +49,8 b' index_dir = %(here)s/data/index'
48 app_instance_uuid = ${app_instance_uuid}
49 app_instance_uuid = ${app_instance_uuid}
49 cut_off_limit = 256000
50 cut_off_limit = 256000
50 force_https = false
51 force_https = false
52 commit_parse_limit = 50
53 use_gravatar = true
51
54
52 ####################################
55 ####################################
53 ### CELERY CONFIG ####
56 ### CELERY CONFIG ####
@@ -139,58 +142,68 b' logview.pylons.util = #eee'
139 #########################################################
142 #########################################################
140 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
143 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
141 #########################################################
144 #########################################################
145
146 # SQLITE [default]
142 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
147 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
143 #sqlalchemy.db1.echo = False
148
144 #sqlalchemy.db1.pool_recycle = 3600
149 # POSTGRES
150 # sqlalchemy.db1.url = postgresql://user:pass@localhost/rhodecode
151
152 # MySQL
153 # sqlalchemy.db1.url = mysql://user:pass@localhost/rhodecode
154
155
156 sqlalchemy.db1.echo = false
157 sqlalchemy.db1.pool_recycle = 3600
145 sqlalchemy.convert_unicode = true
158 sqlalchemy.convert_unicode = true
146
159
147 ################################
160 ################################
148 ### LOGGING CONFIGURATION ####
161 ### LOGGING CONFIGURATION ####
149 ################################
162 ################################
150 [loggers]
163 [loggers]
151 keys = root, routes, rhodecode, sqlalchemy,beaker,templates
164 keys = root, routes, rhodecode, sqlalchemy, beaker, templates
152
165
153 [handlers]
166 [handlers]
154 keys = console
167 keys = console, console_sql
155
168
156 [formatters]
169 [formatters]
157 keys = generic,color_formatter
170 keys = generic, color_formatter, color_formatter_sql
158
171
159 #############
172 #############
160 ## LOGGERS ##
173 ## LOGGERS ##
161 #############
174 #############
162 [logger_root]
175 [logger_root]
163 level = INFO
176 level = NOTSET
164 handlers = console
177 handlers = console
165
178
166 [logger_routes]
179 [logger_routes]
167 level = INFO
180 level = DEBUG
168 handlers = console
181 handlers =
169 qualname = routes.middleware
182 qualname = routes.middleware
170 # "level = DEBUG" logs the route matched and routing variables.
183 # "level = DEBUG" logs the route matched and routing variables.
171 propagate = 0
184 propagate = 1
172
185
173 [logger_beaker]
186 [logger_beaker]
174 level = ERROR
187 level = DEBUG
175 handlers = console
188 handlers =
176 qualname = beaker.container
189 qualname = beaker.container
177 propagate = 0
190 propagate = 1
178
191
179 [logger_templates]
192 [logger_templates]
180 level = INFO
193 level = INFO
181 handlers = console
194 handlers =
182 qualname = pylons.templating
195 qualname = pylons.templating
183 propagate = 0
196 propagate = 1
184
197
185 [logger_rhodecode]
198 [logger_rhodecode]
186 level = DEBUG
199 level = DEBUG
187 handlers = console
200 handlers =
188 qualname = rhodecode
201 qualname = rhodecode
189 propagate = 0
202 propagate = 1
190
203
191 [logger_sqlalchemy]
204 [logger_sqlalchemy]
192 level = ERROR
205 level = INFO
193 handlers = console
206 handlers = console_sql
194 qualname = sqlalchemy.engine
207 qualname = sqlalchemy.engine
195 propagate = 0
208 propagate = 0
196
209
@@ -201,9 +214,15 b' propagate = 0'
201 [handler_console]
214 [handler_console]
202 class = StreamHandler
215 class = StreamHandler
203 args = (sys.stderr,)
216 args = (sys.stderr,)
204 level = NOTSET
217 level = INFO
205 formatter = color_formatter
218 formatter = color_formatter
206
219
220 [handler_console_sql]
221 class = StreamHandler
222 args = (sys.stderr,)
223 level = WARN
224 formatter = color_formatter_sql
225
207 ################
226 ################
208 ## FORMATTERS ##
227 ## FORMATTERS ##
209 ################
228 ################
@@ -215,4 +234,9 b' datefmt = %Y-%m-%d %H:%M:%S'
215 [formatter_color_formatter]
234 [formatter_color_formatter]
216 class=rhodecode.lib.colored_formatter.ColorFormatter
235 class=rhodecode.lib.colored_formatter.ColorFormatter
217 format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
236 format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
237 datefmt = %Y-%m-%d %H:%M:%S
238
239 [formatter_color_formatter_sql]
240 class=rhodecode.lib.colored_formatter.ColorFormatterSql
241 format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
218 datefmt = %Y-%m-%d %H:%M:%S No newline at end of file
242 datefmt = %Y-%m-%d %H:%M:%S
@@ -6,18 +6,18 b' import logging'
6 from mako.lookup import TemplateLookup
6 from mako.lookup import TemplateLookup
7 from pylons.configuration import PylonsConfig
7 from pylons.configuration import PylonsConfig
8 from pylons.error import handle_mako_error
8 from pylons.error import handle_mako_error
9 from sqlalchemy import engine_from_config
10
9
11 import rhodecode.lib.app_globals as app_globals
10 import rhodecode.lib.app_globals as app_globals
12 import rhodecode.lib.helpers
11 import rhodecode.lib.helpers
13
12
14 from rhodecode.config.routing import make_map
13 from rhodecode.config.routing import make_map
15 from rhodecode.lib import celerypylons
14 from rhodecode.lib import celerypylons
16 from rhodecode.lib.auth import set_available_permissions, set_base_path
15 from rhodecode.lib import engine_from_config
16 from rhodecode.lib.timerproxy import TimerProxy
17 from rhodecode.lib.auth import set_available_permissions
17 from rhodecode.lib.utils import repo2db_mapper, make_ui, set_rhodecode_config
18 from rhodecode.lib.utils import repo2db_mapper, make_ui, set_rhodecode_config
18 from rhodecode.model import init_model
19 from rhodecode.model import init_model
19 from rhodecode.model.scm import ScmModel
20 from rhodecode.model.scm import ScmModel
20 from rhodecode.lib.timerproxy import TimerProxy
21
21
22 log = logging.getLogger(__name__)
22 log = logging.getLogger(__name__)
23
23
@@ -61,25 +61,18 b' def load_environment(global_conf, app_co'
61 from rhodecode.lib.utils import create_test_env, create_test_index
61 from rhodecode.lib.utils import create_test_env, create_test_index
62 from rhodecode.tests import TESTS_TMP_PATH
62 from rhodecode.tests import TESTS_TMP_PATH
63 create_test_env(TESTS_TMP_PATH, config)
63 create_test_env(TESTS_TMP_PATH, config)
64 create_test_index(TESTS_TMP_PATH, True)
64 create_test_index(TESTS_TMP_PATH, config, True)
65
65
66 #MULTIPLE DB configs
66 #MULTIPLE DB configs
67 # Setup the SQLAlchemy database engine
67 # Setup the SQLAlchemy database engine
68 if config['debug'] and not test:
68 sa_engine_db1 = engine_from_config(config, 'sqlalchemy.db1.')
69 #use query time debugging.
70 sa_engine_db1 = engine_from_config(config, 'sqlalchemy.db1.',
71 proxy=TimerProxy())
72 else:
73 sa_engine_db1 = engine_from_config(config, 'sqlalchemy.db1.')
74
69
75 init_model(sa_engine_db1)
70 init_model(sa_engine_db1)
76 #init baseui
77 config['pylons.app_globals'].baseui = make_ui('db')
78
71
79 g = config['pylons.app_globals']
72 repos_path = make_ui('db').configitems('paths')[0][1]
80 repo2db_mapper(ScmModel().repo_scan(g.paths[0][1], g.baseui))
73 repo2db_mapper(ScmModel().repo_scan(repos_path))
81 set_available_permissions(config)
74 set_available_permissions(config)
82 set_base_path(config)
75 config['base_path'] = repos_path
83 set_rhodecode_config(config)
76 set_rhodecode_config(config)
84 # CONFIGURATION OPTIONS HERE (note: all config options will override
77 # CONFIGURATION OPTIONS HERE (note: all config options will override
85 # any Pylons config options)
78 # any Pylons config options)
@@ -47,9 +47,9 b' def make_app(global_conf, full_stack=Tru'
47 app = SessionMiddleware(app, config)
47 app = SessionMiddleware(app, config)
48
48
49 # CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares)
49 # CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares)
50
50 if asbool(config['pdebug']):
51 app = SimpleHg(app, config)
51 from rhodecode.lib.profiler import ProfilingMiddleware
52 app = SimpleGit(app, config)
52 app = ProfilingMiddleware(app)
53
53
54 if asbool(full_stack):
54 if asbool(full_stack):
55 # Handle Python exceptions
55 # Handle Python exceptions
@@ -74,6 +74,11 b' def make_app(global_conf, full_stack=Tru'
74 app = Cascade([static_app, app])
74 app = Cascade([static_app, app])
75 app = make_gzip_middleware(app, global_conf, compress_level=1)
75 app = make_gzip_middleware(app, global_conf, compress_level=1)
76
76
77 # we want our low level middleware to get to the request ASAP. We don't
78 # need any pylons stack middleware in them
79 app = SimpleHg(app, config)
80 app = SimpleGit(app, config)
81
77 app.config = config
82 app.config = config
78
83
79 return app
84 return app
@@ -7,7 +7,10 b' refer to the routes manual at http://rou'
7 """
7 """
8 from __future__ import with_statement
8 from __future__ import with_statement
9 from routes import Mapper
9 from routes import Mapper
10 from rhodecode.lib.utils import check_repo_fast as cr
10
11
12 # prefix for non repository related links needs to be prefixed with `/`
13 ADMIN_PREFIX = '/_admin'
11
14
12
15
13 def make_map(config):
16 def make_map(config):
@@ -16,15 +19,35 b' def make_map(config):'
16 always_scan=config['debug'])
19 always_scan=config['debug'])
17 rmap.minimization = False
20 rmap.minimization = False
18 rmap.explicit = False
21 rmap.explicit = False
19
22
23 from rhodecode.lib.utils import is_valid_repo
24 from rhodecode.lib.utils import is_valid_repos_group
25
20 def check_repo(environ, match_dict):
26 def check_repo(environ, match_dict):
21 """
27 """
22 check for valid repository for proper 404 handling
28 check for valid repository for proper 404 handling
29
23 :param environ:
30 :param environ:
24 :param match_dict:
31 :param match_dict:
25 """
32 """
33
26 repo_name = match_dict.get('repo_name')
34 repo_name = match_dict.get('repo_name')
27 return not cr(repo_name, config['base_path'])
35 return is_valid_repo(repo_name, config['base_path'])
36
37 def check_group(environ, match_dict):
38 """
39 check for valid repositories group for proper 404 handling
40
41 :param environ:
42 :param match_dict:
43 """
44 repos_group_name = match_dict.get('group_name')
45
46 return is_valid_repos_group(repos_group_name, config['base_path'])
47
48
49 def check_int(environ, match_dict):
50 return match_dict.get('id').isdigit()
28
51
29 # The ErrorController route (handles 404/500 error pages); it should
52 # The ErrorController route (handles 404/500 error pages); it should
30 # likely stay at the top, ensuring it can always be resolved
53 # likely stay at the top, ensuring it can always be resolved
@@ -37,13 +60,16 b' def make_map(config):'
37
60
38 #MAIN PAGE
61 #MAIN PAGE
39 rmap.connect('home', '/', controller='home', action='index')
62 rmap.connect('home', '/', controller='home', action='index')
63 rmap.connect('repo_switcher', '/repos', controller='home',
64 action='repo_switcher')
40 rmap.connect('bugtracker',
65 rmap.connect('bugtracker',
41 "http://bitbucket.org/marcinkuzminski/rhodecode/issues",
66 "http://bitbucket.org/marcinkuzminski/rhodecode/issues",
42 _static=True)
67 _static=True)
43 rmap.connect('rhodecode_official', "http://rhodecode.org", _static=True)
68 rmap.connect('rhodecode_official', "http://rhodecode.org", _static=True)
44
69
45 #ADMIN REPOSITORY REST ROUTES
70 #ADMIN REPOSITORY REST ROUTES
46 with rmap.submapper(path_prefix='/_admin', controller='admin/repos') as m:
71 with rmap.submapper(path_prefix=ADMIN_PREFIX,
72 controller='admin/repos') as m:
47 m.connect("repos", "/repos",
73 m.connect("repos", "/repos",
48 action="create", conditions=dict(method=["POST"]))
74 action="create", conditions=dict(method=["POST"]))
49 m.connect("repos", "/repos",
75 m.connect("repos", "/repos",
@@ -77,6 +103,12 b' def make_map(config):'
77 m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*}",
103 m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*}",
78 action="delete_perm_user", conditions=dict(method=["DELETE"],
104 action="delete_perm_user", conditions=dict(method=["DELETE"],
79 function=check_repo))
105 function=check_repo))
106 #ajax delete repo perm users_group
107 m.connect('delete_repo_users_group',
108 "/repos_delete_users_group/{repo_name:.*}",
109 action="delete_perm_users_group",
110 conditions=dict(method=["DELETE"], function=check_repo))
111
80 #settings actions
112 #settings actions
81 m.connect('repo_stats', "/repos_stats/{repo_name:.*}",
113 m.connect('repo_stats', "/repos_stats/{repo_name:.*}",
82 action="repo_stats", conditions=dict(method=["DELETE"],
114 action="repo_stats", conditions=dict(method=["DELETE"],
@@ -84,23 +116,126 b' def make_map(config):'
84 m.connect('repo_cache', "/repos_cache/{repo_name:.*}",
116 m.connect('repo_cache', "/repos_cache/{repo_name:.*}",
85 action="repo_cache", conditions=dict(method=["DELETE"],
117 action="repo_cache", conditions=dict(method=["DELETE"],
86 function=check_repo))
118 function=check_repo))
119 m.connect('repo_public_journal',
120 "/repos_public_journal/{repo_name:.*}",
121 action="repo_public_journal", conditions=dict(method=["PUT"],
122 function=check_repo))
123 m.connect('repo_pull', "/repo_pull/{repo_name:.*}",
124 action="repo_pull", conditions=dict(method=["PUT"],
125 function=check_repo))
126
127 with rmap.submapper(path_prefix=ADMIN_PREFIX,
128 controller='admin/repos_groups') as m:
129 m.connect("repos_groups", "/repos_groups",
130 action="create", conditions=dict(method=["POST"]))
131 m.connect("repos_groups", "/repos_groups",
132 action="index", conditions=dict(method=["GET"]))
133 m.connect("formatted_repos_groups", "/repos_groups.{format}",
134 action="index", conditions=dict(method=["GET"]))
135 m.connect("new_repos_group", "/repos_groups/new",
136 action="new", conditions=dict(method=["GET"]))
137 m.connect("formatted_new_repos_group", "/repos_groups/new.{format}",
138 action="new", conditions=dict(method=["GET"]))
139 m.connect("update_repos_group", "/repos_groups/{id}",
140 action="update", conditions=dict(method=["PUT"],
141 function=check_int))
142 m.connect("delete_repos_group", "/repos_groups/{id}",
143 action="delete", conditions=dict(method=["DELETE"],
144 function=check_int))
145 m.connect("edit_repos_group", "/repos_groups/{id}/edit",
146 action="edit", conditions=dict(method=["GET"],
147 function=check_int))
148 m.connect("formatted_edit_repos_group",
149 "/repos_groups/{id}.{format}/edit",
150 action="edit", conditions=dict(method=["GET"],
151 function=check_int))
152 m.connect("repos_group", "/repos_groups/{id}",
153 action="show", conditions=dict(method=["GET"],
154 function=check_int))
155 m.connect("formatted_repos_group", "/repos_groups/{id}.{format}",
156 action="show", conditions=dict(method=["GET"],
157 function=check_int))
158
87 #ADMIN USER REST ROUTES
159 #ADMIN USER REST ROUTES
88 rmap.resource('user', 'users', controller='admin/users',
160 with rmap.submapper(path_prefix=ADMIN_PREFIX,
89 path_prefix='/_admin')
161 controller='admin/users') as m:
162 m.connect("users", "/users",
163 action="create", conditions=dict(method=["POST"]))
164 m.connect("users", "/users",
165 action="index", conditions=dict(method=["GET"]))
166 m.connect("formatted_users", "/users.{format}",
167 action="index", conditions=dict(method=["GET"]))
168 m.connect("new_user", "/users/new",
169 action="new", conditions=dict(method=["GET"]))
170 m.connect("formatted_new_user", "/users/new.{format}",
171 action="new", conditions=dict(method=["GET"]))
172 m.connect("update_user", "/users/{id}",
173 action="update", conditions=dict(method=["PUT"]))
174 m.connect("delete_user", "/users/{id}",
175 action="delete", conditions=dict(method=["DELETE"]))
176 m.connect("edit_user", "/users/{id}/edit",
177 action="edit", conditions=dict(method=["GET"]))
178 m.connect("formatted_edit_user",
179 "/users/{id}.{format}/edit",
180 action="edit", conditions=dict(method=["GET"]))
181 m.connect("user", "/users/{id}",
182 action="show", conditions=dict(method=["GET"]))
183 m.connect("formatted_user", "/users/{id}.{format}",
184 action="show", conditions=dict(method=["GET"]))
185
186 #EXTRAS USER ROUTES
187 m.connect("user_perm", "/users_perm/{id}",
188 action="update_perm", conditions=dict(method=["PUT"]))
189
190 #ADMIN USERS REST ROUTES
191 with rmap.submapper(path_prefix=ADMIN_PREFIX,
192 controller='admin/users_groups') as m:
193 m.connect("users_groups", "/users_groups",
194 action="create", conditions=dict(method=["POST"]))
195 m.connect("users_groups", "/users_groups",
196 action="index", conditions=dict(method=["GET"]))
197 m.connect("formatted_users_groups", "/users_groups.{format}",
198 action="index", conditions=dict(method=["GET"]))
199 m.connect("new_users_group", "/users_groups/new",
200 action="new", conditions=dict(method=["GET"]))
201 m.connect("formatted_new_users_group", "/users_groups/new.{format}",
202 action="new", conditions=dict(method=["GET"]))
203 m.connect("update_users_group", "/users_groups/{id}",
204 action="update", conditions=dict(method=["PUT"]))
205 m.connect("delete_users_group", "/users_groups/{id}",
206 action="delete", conditions=dict(method=["DELETE"]))
207 m.connect("edit_users_group", "/users_groups/{id}/edit",
208 action="edit", conditions=dict(method=["GET"]))
209 m.connect("formatted_edit_users_group",
210 "/users_groups/{id}.{format}/edit",
211 action="edit", conditions=dict(method=["GET"]))
212 m.connect("users_group", "/users_groups/{id}",
213 action="show", conditions=dict(method=["GET"]))
214 m.connect("formatted_users_group", "/users_groups/{id}.{format}",
215 action="show", conditions=dict(method=["GET"]))
216
217 #EXTRAS USER ROUTES
218 m.connect("users_group_perm", "/users_groups_perm/{id}",
219 action="update_perm", conditions=dict(method=["PUT"]))
220
221 #ADMIN GROUP REST ROUTES
222 rmap.resource('group', 'groups',
223 controller='admin/groups', path_prefix=ADMIN_PREFIX)
90
224
91 #ADMIN PERMISSIONS REST ROUTES
225 #ADMIN PERMISSIONS REST ROUTES
92 rmap.resource('permission', 'permissions', controller='admin/permissions',
226 rmap.resource('permission', 'permissions',
93 path_prefix='/_admin')
227 controller='admin/permissions', path_prefix=ADMIN_PREFIX)
94
228
95 ##ADMIN LDAP SETTINGS
229 ##ADMIN LDAP SETTINGS
96 rmap.connect('ldap_settings', '/_admin/ldap',
230 rmap.connect('ldap_settings', '%s/ldap' % ADMIN_PREFIX,
97 controller='admin/ldap_settings', action='ldap_settings',
231 controller='admin/ldap_settings', action='ldap_settings',
98 conditions=dict(method=["POST"]))
232 conditions=dict(method=["POST"]))
99 rmap.connect('ldap_home', '/_admin/ldap',
233
100 controller='admin/ldap_settings',)
234 rmap.connect('ldap_home', '%s/ldap' % ADMIN_PREFIX,
235 controller='admin/ldap_settings')
101
236
102 #ADMIN SETTINGS REST ROUTES
237 #ADMIN SETTINGS REST ROUTES
103 with rmap.submapper(path_prefix='/_admin',
238 with rmap.submapper(path_prefix=ADMIN_PREFIX,
104 controller='admin/settings') as m:
239 controller='admin/settings') as m:
105 m.connect("admin_settings", "/settings",
240 m.connect("admin_settings", "/settings",
106 action="create", conditions=dict(method=["POST"]))
241 action="create", conditions=dict(method=["POST"]))
@@ -132,41 +267,79 b' def make_map(config):'
132 m.connect("admin_settings_create_repository", "/create_repository",
267 m.connect("admin_settings_create_repository", "/create_repository",
133 action="create_repository", conditions=dict(method=["GET"]))
268 action="create_repository", conditions=dict(method=["GET"]))
134
269
270
135 #ADMIN MAIN PAGES
271 #ADMIN MAIN PAGES
136 with rmap.submapper(path_prefix='/_admin', controller='admin/admin') as m:
272 with rmap.submapper(path_prefix=ADMIN_PREFIX,
273 controller='admin/admin') as m:
137 m.connect('admin_home', '', action='index')
274 m.connect('admin_home', '', action='index')
138 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
275 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
139 action='add_repo')
276 action='add_repo')
140
277
278 #==========================================================================
279 # API V1
280 #==========================================================================
281 with rmap.submapper(path_prefix=ADMIN_PREFIX,
282 controller='api/api') as m:
283 m.connect('api', '/api')
284
285
141 #USER JOURNAL
286 #USER JOURNAL
142 rmap.connect('journal', '/_admin/journal', controller='journal',)
287 rmap.connect('journal', '%s/journal' % ADMIN_PREFIX, controller='journal')
143 rmap.connect('toggle_following', '/_admin/toggle_following',
288
289 rmap.connect('public_journal', '%s/public_journal' % ADMIN_PREFIX,
290 controller='journal', action="public_journal")
291
292 rmap.connect('public_journal_rss', '%s/public_journal_rss' % ADMIN_PREFIX,
293 controller='journal', action="public_journal_rss")
294
295 rmap.connect('public_journal_atom',
296 '%s/public_journal_atom' % ADMIN_PREFIX, controller='journal',
297 action="public_journal_atom")
298
299 rmap.connect('toggle_following', '%s/toggle_following' % ADMIN_PREFIX,
144 controller='journal', action='toggle_following',
300 controller='journal', action='toggle_following',
145 conditions=dict(method=["POST"]))
301 conditions=dict(method=["POST"]))
146
302
147 #SEARCH
303 #SEARCH
148 rmap.connect('search', '/_admin/search', controller='search',)
304 rmap.connect('search', '%s/search' % ADMIN_PREFIX, controller='search',)
149 rmap.connect('search_repo', '/_admin/search/{search_repo:.*}',
305 rmap.connect('search_repo', '%s/search/{search_repo:.*}' % ADMIN_PREFIX,
150 controller='search')
306 controller='search')
151
307
152 #LOGIN/LOGOUT/REGISTER/SIGN IN
308 #LOGIN/LOGOUT/REGISTER/SIGN IN
153 rmap.connect('login_home', '/_admin/login', controller='login')
309 rmap.connect('login_home', '%s/login' % ADMIN_PREFIX, controller='login')
154 rmap.connect('logout_home', '/_admin/logout', controller='login',
310 rmap.connect('logout_home', '%s/logout' % ADMIN_PREFIX, controller='login',
155 action='logout')
311 action='logout')
156 rmap.connect('register', '/_admin/register', controller='login',
312
313 rmap.connect('register', '%s/register' % ADMIN_PREFIX, controller='login',
157 action='register')
314 action='register')
158 rmap.connect('reset_password', '/_admin/password_reset',
315
316 rmap.connect('reset_password', '%s/password_reset' % ADMIN_PREFIX,
159 controller='login', action='password_reset')
317 controller='login', action='password_reset')
160
318
319 rmap.connect('reset_password_confirmation',
320 '%s/password_reset_confirmation' % ADMIN_PREFIX,
321 controller='login', action='password_reset_confirmation')
322
161 #FEEDS
323 #FEEDS
162 rmap.connect('rss_feed_home', '/{repo_name:.*}/feed/rss',
324 rmap.connect('rss_feed_home', '/{repo_name:.*}/feed/rss',
163 controller='feed', action='rss',
325 controller='feed', action='rss',
164 conditions=dict(function=check_repo))
326 conditions=dict(function=check_repo))
327
165 rmap.connect('atom_feed_home', '/{repo_name:.*}/feed/atom',
328 rmap.connect('atom_feed_home', '/{repo_name:.*}/feed/atom',
166 controller='feed', action='atom',
329 controller='feed', action='atom',
167 conditions=dict(function=check_repo))
330 conditions=dict(function=check_repo))
168
331
169 #REPOSITORY ROUTES
332 #==========================================================================
333 # REPOSITORY ROUTES
334 #==========================================================================
335 rmap.connect('summary_home', '/{repo_name:.*}',
336 controller='summary',
337 conditions=dict(function=check_repo))
338
339 # rmap.connect('repo_group_home', '/{group_name:.*}',
340 # controller='admin/repos_groups',action="show_by_name",
341 # conditions=dict(function=check_group))
342
170 rmap.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}',
343 rmap.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}',
171 controller='changeset', revision='tip',
344 controller='changeset', revision='tip',
172 conditions=dict(function=check_repo))
345 conditions=dict(function=check_repo))
@@ -176,9 +349,6 b' def make_map(config):'
176 controller='changeset', action='raw_changeset',
349 controller='changeset', action='raw_changeset',
177 revision='tip', conditions=dict(function=check_repo))
350 revision='tip', conditions=dict(function=check_repo))
178
351
179 rmap.connect('summary_home_', '/{repo_name:.*}',
180 controller='summary', conditions=dict(function=check_repo))
181
182 rmap.connect('summary_home', '/{repo_name:.*}/summary',
352 rmap.connect('summary_home', '/{repo_name:.*}/summary',
183 controller='summary', conditions=dict(function=check_repo))
353 controller='summary', conditions=dict(function=check_repo))
184
354
@@ -194,6 +364,10 b' def make_map(config):'
194 rmap.connect('changelog_home', '/{repo_name:.*}/changelog',
364 rmap.connect('changelog_home', '/{repo_name:.*}/changelog',
195 controller='changelog', conditions=dict(function=check_repo))
365 controller='changelog', conditions=dict(function=check_repo))
196
366
367 rmap.connect('changelog_details', '/{repo_name:.*}/changelog_details/{cs}',
368 controller='changelog', action='changelog_details',
369 conditions=dict(function=check_repo))
370
197 rmap.connect('files_home', '/{repo_name:.*}/files/{revision}/{f_path:.*}',
371 rmap.connect('files_home', '/{repo_name:.*}/files/{revision}/{f_path:.*}',
198 controller='files', revision='tip', f_path='',
372 controller='files', revision='tip', f_path='',
199 conditions=dict(function=check_repo))
373 conditions=dict(function=check_repo))
@@ -217,28 +391,51 b' def make_map(config):'
217 controller='files', action='annotate', revision='tip',
391 controller='files', action='annotate', revision='tip',
218 f_path='', conditions=dict(function=check_repo))
392 f_path='', conditions=dict(function=check_repo))
219
393
220 rmap.connect('files_archive_home',
394 rmap.connect('files_edit_home',
221 '/{repo_name:.*}/archive/{revision}/{fileformat}',
395 '/{repo_name:.*}/edit/{revision}/{f_path:.*}',
222 controller='files', action='archivefile', revision='tip',
396 controller='files', action='edit', revision='tip',
223 conditions=dict(function=check_repo))
397 f_path='', conditions=dict(function=check_repo))
398
399 rmap.connect('files_add_home',
400 '/{repo_name:.*}/add/{revision}/{f_path:.*}',
401 controller='files', action='add', revision='tip',
402 f_path='', conditions=dict(function=check_repo))
403
404 rmap.connect('files_archive_home', '/{repo_name:.*}/archive/{fname}',
405 controller='files', action='archivefile',
406 conditions=dict(function=check_repo))
407
408 rmap.connect('files_nodelist_home',
409 '/{repo_name:.*}/nodelist/{revision}/{f_path:.*}',
410 controller='files', action='nodelist',
411 conditions=dict(function=check_repo))
224
412
225 rmap.connect('repo_settings_delete', '/{repo_name:.*}/settings',
413 rmap.connect('repo_settings_delete', '/{repo_name:.*}/settings',
226 controller='settings', action="delete",
414 controller='settings', action="delete",
227 conditions=dict(method=["DELETE"], function=check_repo))
415 conditions=dict(method=["DELETE"], function=check_repo))
228
416
229 rmap.connect('repo_settings_update', '/{repo_name:.*}/settings',
417 rmap.connect('repo_settings_update', '/{repo_name:.*}/settings',
230 controller='settings', action="update",
418 controller='settings', action="update",
231 conditions=dict(method=["PUT"], function=check_repo))
419 conditions=dict(method=["PUT"], function=check_repo))
232
420
233 rmap.connect('repo_settings_home', '/{repo_name:.*}/settings',
421 rmap.connect('repo_settings_home', '/{repo_name:.*}/settings',
234 controller='settings', action='index',
422 controller='settings', action='index',
235 conditions=dict(function=check_repo))
423 conditions=dict(function=check_repo))
236
424
237 rmap.connect('repo_fork_create_home', '/{repo_name:.*}/fork',
425 rmap.connect('repo_fork_create_home', '/{repo_name:.*}/fork',
238 controller='settings', action='fork_create',
426 controller='settings', action='fork_create',
239 conditions=dict(function=check_repo, method=["POST"]))
427 conditions=dict(function=check_repo, method=["POST"]))
428
240 rmap.connect('repo_fork_home', '/{repo_name:.*}/fork',
429 rmap.connect('repo_fork_home', '/{repo_name:.*}/fork',
241 controller='settings', action='fork',
430 controller='settings', action='fork',
242 conditions=dict(function=check_repo))
431 conditions=dict(function=check_repo))
243
432
433 rmap.connect('repo_followers_home', '/{repo_name:.*}/followers',
434 controller='followers', action='followers',
435 conditions=dict(function=check_repo))
436
437 rmap.connect('repo_forks_home', '/{repo_name:.*}/forks',
438 controller='forks', action='forks',
439 conditions=dict(function=check_repo))
440
244 return rmap
441 return rmap
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Controller for Admin panel of Rhodecode
6 Controller for Admin panel of Rhodecode
7
7
8 :created_on: Apr 7, 2010
8 :created_on: Apr 7, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -24,14 +24,18 b''
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25
26 import logging
26 import logging
27
27 from pylons import request, tmpl_context as c
28 from pylons import request, tmpl_context as c
29 from sqlalchemy.orm import joinedload
30 from webhelpers.paginate import Page
31
32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
28 from rhodecode.lib.base import BaseController, render
33 from rhodecode.lib.base import BaseController, render
29 from rhodecode.model.db import UserLog
34 from rhodecode.model.db import UserLog
30 from webhelpers.paginate import Page
31 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
32
35
33 log = logging.getLogger(__name__)
36 log = logging.getLogger(__name__)
34
37
38
35 class AdminController(BaseController):
39 class AdminController(BaseController):
36
40
37 @LoginRequired()
41 @LoginRequired()
@@ -41,11 +45,15 b' class AdminController(BaseController):'
41 @HasPermissionAllDecorator('hg.admin')
45 @HasPermissionAllDecorator('hg.admin')
42 def index(self):
46 def index(self):
43
47
44 users_log = self.sa.query(UserLog).order_by(UserLog.action_date.desc())
48 users_log = self.sa.query(UserLog)\
49 .options(joinedload(UserLog.user))\
50 .options(joinedload(UserLog.repository))\
51 .order_by(UserLog.action_date.desc())
52
45 p = int(request.params.get('page', 1))
53 p = int(request.params.get('page', 1))
46 c.users_log = Page(users_log, page=p, items_per_page=10)
54 c.users_log = Page(users_log, page=p, items_per_page=10)
47 c.log_data = render('admin/admin_log.html')
55 c.log_data = render('admin/admin_log.html')
48 if request.params.get('partial'):
56
57 if request.environ.get('HTTP_X_PARTIAL_XHR'):
49 return c.log_data
58 return c.log_data
50 return render('admin/admin.html')
59 return render('admin/admin.html')
51
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 ldap controller for RhodeCode
6 ldap controller for RhodeCode
7
7
8 :created_on: Nov 26, 2010
8 :created_on: Nov 26, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -32,29 +32,61 b' from pylons import request, response, se'
32 from pylons.controllers.util import abort, redirect
32 from pylons.controllers.util import abort, redirect
33 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
34
34
35 from sqlalchemy.exc import DatabaseError
36
35 from rhodecode.lib.base import BaseController, render
37 from rhodecode.lib.base import BaseController, render
36 from rhodecode.lib import helpers as h
38 from rhodecode.lib import helpers as h
37 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
39 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
38 from rhodecode.lib.auth_ldap import LdapImportError
40 from rhodecode.lib.exceptions import LdapImportError
39 from rhodecode.model.settings import SettingsModel
40 from rhodecode.model.forms import LdapSettingsForm
41 from rhodecode.model.forms import LdapSettingsForm
41 from sqlalchemy.exc import DatabaseError
42 from rhodecode.model.db import RhodeCodeSettings
42
43
43 log = logging.getLogger(__name__)
44 log = logging.getLogger(__name__)
44
45
45
46
47 class LdapSettingsController(BaseController):
46
48
47 class LdapSettingsController(BaseController):
49 search_scope_choices = [('BASE', _('BASE'),),
50 ('ONELEVEL', _('ONELEVEL'),),
51 ('SUBTREE', _('SUBTREE'),),
52 ]
53 search_scope_default = 'SUBTREE'
54
55 tls_reqcert_choices = [('NEVER', _('NEVER'),),
56 ('ALLOW', _('ALLOW'),),
57 ('TRY', _('TRY'),),
58 ('DEMAND', _('DEMAND'),),
59 ('HARD', _('HARD'),),
60 ]
61 tls_reqcert_default = 'DEMAND'
62
63 tls_kind_choices = [('PLAIN', _('No encryption'),),
64 ('LDAPS', _('LDAPS connection'),),
65 ('START_TLS', _('START_TLS on LDAP connection'),)
66 ]
67
68 tls_kind_default = 'PLAIN'
48
69
49 @LoginRequired()
70 @LoginRequired()
50 @HasPermissionAllDecorator('hg.admin')
71 @HasPermissionAllDecorator('hg.admin')
51 def __before__(self):
72 def __before__(self):
52 c.admin_user = session.get('admin_user')
73 c.admin_user = session.get('admin_user')
53 c.admin_username = session.get('admin_username')
74 c.admin_username = session.get('admin_username')
75 c.search_scope_choices = self.search_scope_choices
76 c.tls_reqcert_choices = self.tls_reqcert_choices
77 c.tls_kind_choices = self.tls_kind_choices
78
79 c.search_scope_cur = self.search_scope_default
80 c.tls_reqcert_cur = self.tls_reqcert_default
81 c.tls_kind_cur = self.tls_kind_default
82
54 super(LdapSettingsController, self).__before__()
83 super(LdapSettingsController, self).__before__()
55
84
56 def index(self):
85 def index(self):
57 defaults = SettingsModel().get_ldap_settings()
86 defaults = RhodeCodeSettings.get_ldap_settings()
87 c.search_scope_cur = defaults.get('ldap_search_scope')
88 c.tls_reqcert_cur = defaults.get('ldap_tls_reqcert')
89 c.tls_kind_cur = defaults.get('ldap_tls_kind')
58
90
59 return htmlfill.render(
91 return htmlfill.render(
60 render('admin/ldap/ldap.html'),
92 render('admin/ldap/ldap.html'),
@@ -65,17 +97,17 b' class LdapSettingsController(BaseControl'
65 def ldap_settings(self):
97 def ldap_settings(self):
66 """POST ldap create and store ldap settings"""
98 """POST ldap create and store ldap settings"""
67
99
68 settings_model = SettingsModel()
100 _form = LdapSettingsForm([x[0] for x in self.tls_reqcert_choices],
69 post_data = dict(request.POST)
101 [x[0] for x in self.search_scope_choices],
70 _form = LdapSettingsForm(post_data.get('ldap_active'))()
102 [x[0] for x in self.tls_kind_choices])()
71
103
72 try:
104 try:
73 form_result = _form.to_python(post_data)
105 form_result = _form.to_python(dict(request.POST))
74 try:
106 try:
75
107
76 for k, v in form_result.items():
108 for k, v in form_result.items():
77 if k.startswith('ldap_'):
109 if k.startswith('ldap_'):
78 setting = settings_model.get(k)
110 setting = RhodeCodeSettings.get_by_name(k)
79 setting.app_settings_value = v
111 setting.app_settings_value = v
80 self.sa.add(setting)
112 self.sa.add(setting)
81
113
@@ -89,11 +121,12 b' class LdapSettingsController(BaseControl'
89 'is missing.'), category='warning')
121 'is missing.'), category='warning')
90
122
91 except formencode.Invalid, errors:
123 except formencode.Invalid, errors:
124 e = errors.error_dict or {}
92
125
93 return htmlfill.render(
126 return htmlfill.render(
94 render('admin/ldap/ldap.html'),
127 render('admin/ldap/ldap.html'),
95 defaults=errors.value,
128 defaults=errors.value,
96 errors=errors.error_dict or {},
129 errors=e,
97 prefix_error=False,
130 prefix_error=False,
98 encoding="UTF-8")
131 encoding="UTF-8")
99 except Exception:
132 except Exception:
@@ -2,12 +2,12 b''
2 """
2 """
3 rhodecode.controllers.admin.permissions
3 rhodecode.controllers.admin.permissions
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 permissions controller for Rhodecode
6 permissions controller for Rhodecode
7
7
8 :created_on: Apr 27, 2010
8 :created_on: Apr 27, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -23,24 +23,25 b''
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25
26 import logging
27 import traceback
28 import formencode
26 from formencode import htmlfill
29 from formencode import htmlfill
30
27 from pylons import request, session, tmpl_context as c, url
31 from pylons import request, session, tmpl_context as c, url
28 from pylons.controllers.util import abort, redirect
32 from pylons.controllers.util import abort, redirect
29 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
34
30 from rhodecode.lib import helpers as h
35 from rhodecode.lib import helpers as h
31 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
36 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
32 from rhodecode.lib.auth_ldap import LdapImportError
33 from rhodecode.lib.base import BaseController, render
37 from rhodecode.lib.base import BaseController, render
34 from rhodecode.model.forms import LdapSettingsForm, DefaultPermissionsForm
38 from rhodecode.model.forms import DefaultPermissionsForm
35 from rhodecode.model.permission import PermissionModel
39 from rhodecode.model.permission import PermissionModel
36 from rhodecode.model.settings import SettingsModel
40 from rhodecode.model.db import User
37 from rhodecode.model.user import UserModel
38 import formencode
39 import logging
40 import traceback
41
41
42 log = logging.getLogger(__name__)
42 log = logging.getLogger(__name__)
43
43
44
44 class PermissionsController(BaseController):
45 class PermissionsController(BaseController):
45 """REST Controller styled on the Atom Publishing Protocol"""
46 """REST Controller styled on the Atom Publishing Protocol"""
46 # To properly map this controller, ensure your config/routing.py
47 # To properly map this controller, ensure your config/routing.py
@@ -69,7 +70,6 b' class PermissionsController(BaseControll'
69 self.create_choices = [('hg.create.none', _('Disabled')),
70 self.create_choices = [('hg.create.none', _('Disabled')),
70 ('hg.create.repository', _('Enabled'))]
71 ('hg.create.repository', _('Enabled'))]
71
72
72
73 def index(self, format='html'):
73 def index(self, format='html'):
74 """GET /permissions: All items in the collection"""
74 """GET /permissions: All items in the collection"""
75 # url('permissions')
75 # url('permissions')
@@ -99,7 +99,7 b' class PermissionsController(BaseControll'
99
99
100 try:
100 try:
101 form_result = _form.to_python(dict(request.POST))
101 form_result = _form.to_python(dict(request.POST))
102 form_result.update({'perm_user_name':id})
102 form_result.update({'perm_user_name': id})
103 permission_model.update(form_result)
103 permission_model.update(form_result)
104 h.flash(_('Default permissions updated successfully'),
104 h.flash(_('Default permissions updated successfully'),
105 category='success')
105 category='success')
@@ -123,8 +123,6 b' class PermissionsController(BaseControll'
123
123
124 return redirect(url('edit_permission', id=id))
124 return redirect(url('edit_permission', id=id))
125
125
126
127
128 def delete(self, id):
126 def delete(self, id):
129 """DELETE /permissions/id: Delete an existing item"""
127 """DELETE /permissions/id: Delete an existing item"""
130 # Forms posted to this method should contain a hidden field:
128 # Forms posted to this method should contain a hidden field:
@@ -146,9 +144,9 b' class PermissionsController(BaseControll'
146 c.create_choices = self.create_choices
144 c.create_choices = self.create_choices
147
145
148 if id == 'default':
146 if id == 'default':
149 default_user = UserModel().get_by_username('default')
147 default_user = User.by_username('default')
150 defaults = {'_method':'put',
148 defaults = {'_method': 'put',
151 'anonymous':default_user.active}
149 'anonymous': default_user.active}
152
150
153 for p in default_user.user_perms:
151 for p in default_user.user_perms:
154 if p.permission.permission_name.startswith('repository.'):
152 if p.permission.permission_name.startswith('repository.'):
@@ -2,12 +2,12 b''
2 """
2 """
3 rhodecode.controllers.admin.repos
3 rhodecode.controllers.admin.repos
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Admin controller for RhodeCode
6 Admin controller for RhodeCode
7
7
8 :created_on: Apr 7, 2010
8 :created_on: Apr 7, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -38,17 +38,20 b' from rhodecode.lib import helpers as h'
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
39 HasPermissionAnyDecorator
39 HasPermissionAnyDecorator
40 from rhodecode.lib.base import BaseController, render
40 from rhodecode.lib.base import BaseController, render
41 from rhodecode.lib.utils import invalidate_cache, action_logger
41 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
42 from rhodecode.model.db import User
42 from rhodecode.lib.helpers import get_token
43 from rhodecode.model.db import User, Repository, UserFollowing, Group
43 from rhodecode.model.forms import RepoForm
44 from rhodecode.model.forms import RepoForm
44 from rhodecode.model.scm import ScmModel
45 from rhodecode.model.scm import ScmModel
45 from rhodecode.model.repo import RepoModel
46 from rhodecode.model.repo import RepoModel
46
47 from sqlalchemy.exc import IntegrityError
47
48
48 log = logging.getLogger(__name__)
49 log = logging.getLogger(__name__)
49
50
51
50 class ReposController(BaseController):
52 class ReposController(BaseController):
51 """REST Controller styled on the Atom Publishing Protocol"""
53 """
54 REST Controller styled on the Atom Publishing Protocol"""
52 # To properly map this controller, ensure your config/routing.py
55 # To properly map this controller, ensure your config/routing.py
53 # file has a resource setup:
56 # file has a resource setup:
54 # map.resource('repo', 'repos')
57 # map.resource('repo', 'repos')
@@ -60,35 +63,129 b' class ReposController(BaseController):'
60 c.admin_username = session.get('admin_username')
63 c.admin_username = session.get('admin_username')
61 super(ReposController, self).__before__()
64 super(ReposController, self).__before__()
62
65
66 def __load_defaults(self):
67 repo_model = RepoModel()
68
69 c.repo_groups = [('', '')]
70 parents_link = lambda k: h.literal('&raquo;'.join(
71 map(lambda k: k.group_name,
72 k.parents + [k])
73 )
74 )
75
76 c.repo_groups.extend([(x.group_id, parents_link(x)) for \
77 x in self.sa.query(Group).all()])
78 c.repo_groups = sorted(c.repo_groups,
79 key=lambda t: t[1].split('&raquo;')[0])
80 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
81 c.users_array = repo_model.get_users_js()
82 c.users_groups_array = repo_model.get_users_groups_js()
83
84 def __load_data(self, repo_name=None):
85 """
86 Load defaults settings for edit, and update
87
88 :param repo_name:
89 """
90 self.__load_defaults()
91
92 c.repo_info = db_repo = Repository.by_repo_name(repo_name)
93 repo = scm_repo = db_repo.scm_instance
94
95 if c.repo_info is None:
96 h.flash(_('%s repository is not mapped to db perhaps'
97 ' it was created or renamed from the filesystem'
98 ' please run the application again'
99 ' in order to rescan repositories') % repo_name,
100 category='error')
101
102 return redirect(url('repos'))
103
104 c.default_user_id = User.by_username('default').user_id
105 c.in_public_journal = self.sa.query(UserFollowing)\
106 .filter(UserFollowing.user_id == c.default_user_id)\
107 .filter(UserFollowing.follows_repository == c.repo_info).scalar()
108
109 if c.repo_info.stats:
110 last_rev = c.repo_info.stats.stat_on_revision
111 else:
112 last_rev = 0
113 c.stats_revision = last_rev
114
115 c.repo_last_rev = repo.count() - 1 if repo.revisions else 0
116
117 if last_rev == 0 or c.repo_last_rev == 0:
118 c.stats_percentage = 0
119 else:
120 c.stats_percentage = '%.2f' % ((float((last_rev)) /
121 c.repo_last_rev) * 100)
122
123 defaults = c.repo_info.get_dict()
124 group, repo_name = c.repo_info.groups_and_repo
125 defaults['repo_name'] = repo_name
126 defaults['repo_group'] = getattr(group[-1] if group else None,
127 'group_id', None)
128
129 #fill owner
130 if c.repo_info.user:
131 defaults.update({'user': c.repo_info.user.username})
132 else:
133 replacement_user = self.sa.query(User)\
134 .filter(User.admin == True).first().username
135 defaults.update({'user': replacement_user})
136
137 #fill repository users
138 for p in c.repo_info.repo_to_perm:
139 defaults.update({'u_perm_%s' % p.user.username:
140 p.permission.permission_name})
141
142 #fill repository groups
143 for p in c.repo_info.users_group_to_perm:
144 defaults.update({'g_perm_%s' % p.users_group.users_group_name:
145 p.permission.permission_name})
146
147 return defaults
148
63 @HasPermissionAllDecorator('hg.admin')
149 @HasPermissionAllDecorator('hg.admin')
64 def index(self, format='html'):
150 def index(self, format='html'):
65 """GET /repos: All items in the collection"""
151 """GET /repos: All items in the collection"""
66 # url('repos')
152 # url('repos')
67 cached_repo_list = ScmModel().get_repos()
153
68 c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort'))
154 c.repos_list = ScmModel().get_repos(Repository.query()
155 .order_by(Repository.repo_name)
156 .all(), sort_key='name_sort')
69 return render('admin/repos/repos.html')
157 return render('admin/repos/repos.html')
70
158
71 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
159 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
72 def create(self):
160 def create(self):
73 """POST /repos: Create a new item"""
161 """
162 POST /repos: Create a new item"""
74 # url('repos')
163 # url('repos')
75 repo_model = RepoModel()
164 repo_model = RepoModel()
76 _form = RepoForm()()
165 self.__load_defaults()
77 form_result = {}
166 form_result = {}
78 try:
167 try:
79 form_result = _form.to_python(dict(request.POST))
168 form_result = RepoForm(repo_groups=c.repo_groups_choices)()\
80 repo_model.create(form_result, c.rhodecode_user)
169 .to_python(dict(request.POST))
81 h.flash(_('created repository %s') % form_result['repo_name'],
170 repo_model.create(form_result, self.rhodecode_user)
171 if form_result['clone_uri']:
172 h.flash(_('created repository %s from %s') \
173 % (form_result['repo_name'], form_result['clone_uri']),
174 category='success')
175 else:
176 h.flash(_('created repository %s') % form_result['repo_name'],
82 category='success')
177 category='success')
83
178
84 if request.POST.get('user_created'):
179 if request.POST.get('user_created'):
180 #created by regular non admin user
85 action_logger(self.rhodecode_user, 'user_created_repo',
181 action_logger(self.rhodecode_user, 'user_created_repo',
86 form_result['repo_name'], '', self.sa)
182 form_result['repo_name_full'], '', self.sa)
87 else:
183 else:
88 action_logger(self.rhodecode_user, 'admin_created_repo',
184 action_logger(self.rhodecode_user, 'admin_created_repo',
89 form_result['repo_name'], '', self.sa)
185 form_result['repo_name_full'], '', self.sa)
90
186
91 except formencode.Invalid, errors:
187 except formencode.Invalid, errors:
188
92 c.new_repo = errors.value['repo_name']
189 c.new_repo = errors.value['repo_name']
93
190
94 if request.POST.get('user_created'):
191 if request.POST.get('user_created'):
@@ -116,54 +213,41 b' class ReposController(BaseController):'
116 def new(self, format='html'):
213 def new(self, format='html'):
117 """GET /repos/new: Form to create a new item"""
214 """GET /repos/new: Form to create a new item"""
118 new_repo = request.GET.get('repo', '')
215 new_repo = request.GET.get('repo', '')
119 c.new_repo = h.repo_name_slug(new_repo)
216 c.new_repo = repo_name_slug(new_repo)
120
217 self.__load_defaults()
121 return render('admin/repos/repo_add.html')
218 return render('admin/repos/repo_add.html')
122
219
123 @HasPermissionAllDecorator('hg.admin')
220 @HasPermissionAllDecorator('hg.admin')
124 def update(self, repo_name):
221 def update(self, repo_name):
125 """PUT /repos/repo_name: Update an existing item"""
222 """
223 PUT /repos/repo_name: Update an existing item"""
126 # Forms posted to this method should contain a hidden field:
224 # Forms posted to this method should contain a hidden field:
127 # <input type="hidden" name="_method" value="PUT" />
225 # <input type="hidden" name="_method" value="PUT" />
128 # Or using helpers:
226 # Or using helpers:
129 # h.form(url('repo', repo_name=ID),
227 # h.form(url('repo', repo_name=ID),
130 # method='put')
228 # method='put')
131 # url('repo', repo_name=ID)
229 # url('repo', repo_name=ID)
230 self.__load_defaults()
132 repo_model = RepoModel()
231 repo_model = RepoModel()
133 changed_name = repo_name
232 changed_name = repo_name
134 _form = RepoForm(edit=True, old_data={'repo_name':repo_name})()
233 _form = RepoForm(edit=True, old_data={'repo_name': repo_name},
135
234 repo_groups=c.repo_groups_choices)()
136 try:
235 try:
137 form_result = _form.to_python(dict(request.POST))
236 form_result = _form.to_python(dict(request.POST))
138 repo_model.update(repo_name, form_result)
237 repo_model.update(repo_name, form_result)
139 invalidate_cache('get_repo_cached_%s' % repo_name)
238 invalidate_cache('get_repo_cached_%s' % repo_name)
140 h.flash(_('Repository %s updated successfully' % repo_name),
239 h.flash(_('Repository %s updated successfully' % repo_name),
141 category='success')
240 category='success')
142 changed_name = form_result['repo_name']
241 changed_name = form_result['repo_name_full']
143 action_logger(self.rhodecode_user, 'admin_updated_repo',
242 action_logger(self.rhodecode_user, 'admin_updated_repo',
144 changed_name, '', self.sa)
243 changed_name, '', self.sa)
145
244
146 except formencode.Invalid, errors:
245 except formencode.Invalid, errors:
147 c.repo_info = repo_model.get_by_repo_name(repo_name)
246 defaults = self.__load_data(repo_name)
148 if c.repo_info.stats:
247 defaults.update(errors.value)
149 last_rev = c.repo_info.stats.stat_on_revision
150 else:
151 last_rev = 0
152 c.stats_revision = last_rev
153 r = ScmModel().get(repo_name)
154 c.repo_last_rev = r.revisions[-1] if r.revisions else 0
155
156 if last_rev == 0:
157 c.stats_percentage = 0
158 else:
159 c.stats_percentage = '%.2f' % ((float((last_rev)) /
160 c.repo_last_rev) * 100)
161
162 c.users_array = repo_model.get_users_js()
163 errors.value.update({'user':c.repo_info.user.username})
164 return htmlfill.render(
248 return htmlfill.render(
165 render('admin/repos/repo_edit.html'),
249 render('admin/repos/repo_edit.html'),
166 defaults=errors.value,
250 defaults=defaults,
167 errors=errors.error_dict or {},
251 errors=errors.error_dict or {},
168 prefix_error=False,
252 prefix_error=False,
169 encoding="UTF-8")
253 encoding="UTF-8")
@@ -172,12 +256,12 b' class ReposController(BaseController):'
172 log.error(traceback.format_exc())
256 log.error(traceback.format_exc())
173 h.flash(_('error occurred during update of repository %s') \
257 h.flash(_('error occurred during update of repository %s') \
174 % repo_name, category='error')
258 % repo_name, category='error')
175
176 return redirect(url('edit_repo', repo_name=changed_name))
259 return redirect(url('edit_repo', repo_name=changed_name))
177
260
178 @HasPermissionAllDecorator('hg.admin')
261 @HasPermissionAllDecorator('hg.admin')
179 def delete(self, repo_name):
262 def delete(self, repo_name):
180 """DELETE /repos/repo_name: Delete an existing item"""
263 """
264 DELETE /repos/repo_name: Delete an existing item"""
181 # Forms posted to this method should contain a hidden field:
265 # Forms posted to this method should contain a hidden field:
182 # <input type="hidden" name="_method" value="DELETE" />
266 # <input type="hidden" name="_method" value="DELETE" />
183 # Or using helpers:
267 # Or using helpers:
@@ -202,6 +286,18 b' class ReposController(BaseController):'
202 invalidate_cache('get_repo_cached_%s' % repo_name)
286 invalidate_cache('get_repo_cached_%s' % repo_name)
203 h.flash(_('deleted repository %s') % repo_name, category='success')
287 h.flash(_('deleted repository %s') % repo_name, category='success')
204
288
289 except IntegrityError, e:
290 if e.message.find('repositories_fork_id_fkey'):
291 log.error(traceback.format_exc())
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
205 except Exception, e:
301 except Exception, e:
206 log.error(traceback.format_exc())
302 log.error(traceback.format_exc())
207 h.flash(_('An error occurred during deletion of %s') % repo_name,
303 h.flash(_('An error occurred during deletion of %s') % repo_name,
@@ -213,6 +309,7 b' class ReposController(BaseController):'
213 def delete_perm_user(self, repo_name):
309 def delete_perm_user(self, repo_name):
214 """
310 """
215 DELETE an existing repository permission user
311 DELETE an existing repository permission user
312
216 :param repo_name:
313 :param repo_name:
217 """
314 """
218
315
@@ -225,9 +322,26 b' class ReposController(BaseController):'
225 raise HTTPInternalServerError()
322 raise HTTPInternalServerError()
226
323
227 @HasPermissionAllDecorator('hg.admin')
324 @HasPermissionAllDecorator('hg.admin')
325 def delete_perm_users_group(self, repo_name):
326 """
327 DELETE an existing repository permission users group
328
329 :param repo_name:
330 """
331 try:
332 repo_model = RepoModel()
333 repo_model.delete_perm_users_group(request.POST, repo_name)
334 except Exception, e:
335 h.flash(_('An error occurred during deletion of repository'
336 ' users groups'),
337 category='error')
338 raise HTTPInternalServerError()
339
340 @HasPermissionAllDecorator('hg.admin')
228 def repo_stats(self, repo_name):
341 def repo_stats(self, repo_name):
229 """
342 """
230 DELETE an existing repository statistics
343 DELETE an existing repository statistics
344
231 :param repo_name:
345 :param repo_name:
232 """
346 """
233
347
@@ -243,6 +357,7 b' class ReposController(BaseController):'
243 def repo_cache(self, repo_name):
357 def repo_cache(self, repo_name):
244 """
358 """
245 INVALIDATE existing repository cache
359 INVALIDATE existing repository cache
360
246 :param repo_name:
361 :param repo_name:
247 """
362 """
248
363
@@ -254,6 +369,50 b' class ReposController(BaseController):'
254 return redirect(url('edit_repo', repo_name=repo_name))
369 return redirect(url('edit_repo', repo_name=repo_name))
255
370
256 @HasPermissionAllDecorator('hg.admin')
371 @HasPermissionAllDecorator('hg.admin')
372 def repo_public_journal(self, repo_name):
373 """
374 Set's this repository to be visible in public journal,
375 in other words assing default user to follow this repo
376
377 :param repo_name:
378 """
379
380 cur_token = request.POST.get('auth_token')
381 token = get_token()
382 if cur_token == token:
383 try:
384 repo_id = Repository.by_repo_name(repo_name).repo_id
385 user_id = User.by_username('default').user_id
386 self.scm_model.toggle_following_repo(repo_id, user_id)
387 h.flash(_('Updated repository visibility in public journal'),
388 category='success')
389 except:
390 h.flash(_('An error occurred during setting this'
391 ' repository in public journal'),
392 category='error')
393
394 else:
395 h.flash(_('Token mismatch'), category='error')
396 return redirect(url('edit_repo', repo_name=repo_name))
397
398 @HasPermissionAllDecorator('hg.admin')
399 def repo_pull(self, repo_name):
400 """
401 Runs task to update given repository with remote changes,
402 ie. make pull on remote location
403
404 :param repo_name:
405 """
406 try:
407 ScmModel().pull_changes(repo_name, self.rhodecode_user.username)
408 h.flash(_('Pulled from remote location'), category='success')
409 except Exception, e:
410 h.flash(_('An error occurred during pull from remote location'),
411 category='error')
412
413 return redirect(url('edit_repo', repo_name=repo_name))
414
415 @HasPermissionAllDecorator('hg.admin')
257 def show(self, repo_name, format='html'):
416 def show(self, repo_name, format='html'):
258 """GET /repos/repo_name: Show a specific item"""
417 """GET /repos/repo_name: Show a specific item"""
259 # url('repo', repo_name=ID)
418 # url('repo', repo_name=ID)
@@ -262,46 +421,7 b' class ReposController(BaseController):'
262 def edit(self, repo_name, format='html'):
421 def edit(self, repo_name, format='html'):
263 """GET /repos/repo_name/edit: Form to edit an existing item"""
422 """GET /repos/repo_name/edit: Form to edit an existing item"""
264 # url('edit_repo', repo_name=ID)
423 # url('edit_repo', repo_name=ID)
265 repo_model = RepoModel()
424 defaults = self.__load_data(repo_name)
266 r = ScmModel().get(repo_name)
267 c.repo_info = repo_model.get_by_repo_name(repo_name)
268
269 if c.repo_info is None:
270 h.flash(_('%s repository is not mapped to db perhaps'
271 ' it was created or renamed from the filesystem'
272 ' please run the application again'
273 ' in order to rescan repositories') % repo_name,
274 category='error')
275
276 return redirect(url('repos'))
277
278 if c.repo_info.stats:
279 last_rev = c.repo_info.stats.stat_on_revision
280 else:
281 last_rev = 0
282 c.stats_revision = last_rev
283
284 c.repo_last_rev = r.revisions[-1] if r.revisions else 0
285
286 if last_rev == 0 or c.repo_last_rev == 0:
287 c.stats_percentage = 0
288 else:
289 c.stats_percentage = '%.2f' % ((float((last_rev)) /
290 c.repo_last_rev) * 100)
291
292 defaults = c.repo_info.get_dict()
293 if c.repo_info.user:
294 defaults.update({'user':c.repo_info.user.username})
295 else:
296 replacement_user = self.sa.query(User)\
297 .filter(User.admin == True).first().username
298 defaults.update({'user':replacement_user})
299
300 c.users_array = repo_model.get_users_js()
301
302 for p in c.repo_info.repo_to_perm:
303 defaults.update({'perm_%s' % p.user.username:
304 p.permission.permission_name})
305
425
306 return htmlfill.render(
426 return htmlfill.render(
307 render('admin/repos/repo_edit.html'),
427 render('admin/repos/repo_edit.html'),
@@ -2,12 +2,12 b''
2 """
2 """
3 rhodecode.controllers.admin.settings
3 rhodecode.controllers.admin.settings
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 settings controller for rhodecode admin
6 settings controller for rhodecode admin
7
7
8 :created_on: Jul 14, 2010
8 :created_on: Jul 14, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -23,28 +23,30 b''
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25
26 import logging
27 import traceback
28 import formencode
29
30 from sqlalchemy import func
26 from formencode import htmlfill
31 from formencode import htmlfill
27 from pylons import request, session, tmpl_context as c, url, app_globals as g, \
32 from pylons import request, session, tmpl_context as c, url, config
28 config
29 from pylons.controllers.util import abort, redirect
33 from pylons.controllers.util import abort, redirect
30 from pylons.i18n.translation import _
34 from pylons.i18n.translation import _
35
31 from rhodecode.lib import helpers as h
36 from rhodecode.lib import helpers as h
32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
37 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
33 HasPermissionAnyDecorator, NotAnonymous
38 HasPermissionAnyDecorator, NotAnonymous
34 from rhodecode.lib.base import BaseController, render
39 from rhodecode.lib.base import BaseController, render
35 from rhodecode.lib.celerylib import tasks, run_task
40 from rhodecode.lib.celerylib import tasks, run_task
36 from rhodecode.lib.utils import repo2db_mapper, invalidate_cache, \
41 from rhodecode.lib.utils import repo2db_mapper, invalidate_cache, \
37 set_rhodecode_config
42 set_rhodecode_config, repo_name_slug
38 from rhodecode.model.db import RhodeCodeUi, Repository
43 from rhodecode.model.db import RhodeCodeUi, Repository, Group, \
44 RhodeCodeSettings
39 from rhodecode.model.forms import UserForm, ApplicationSettingsForm, \
45 from rhodecode.model.forms import UserForm, ApplicationSettingsForm, \
40 ApplicationUiSettingsForm
46 ApplicationUiSettingsForm
41 from rhodecode.model.scm import ScmModel
47 from rhodecode.model.scm import ScmModel
42 from rhodecode.model.settings import SettingsModel
43 from rhodecode.model.user import UserModel
48 from rhodecode.model.user import UserModel
44 from sqlalchemy import func
49 from rhodecode.model.db import User
45 import formencode
46 import logging
47 import traceback
48
50
49 log = logging.getLogger(__name__)
51 log = logging.getLogger(__name__)
50
52
@@ -53,23 +55,21 b' class SettingsController(BaseController)'
53 """REST Controller styled on the Atom Publishing Protocol"""
55 """REST Controller styled on the Atom Publishing Protocol"""
54 # To properly map this controller, ensure your config/routing.py
56 # To properly map this controller, ensure your config/routing.py
55 # file has a resource setup:
57 # file has a resource setup:
56 # map.resource('setting', 'settings', controller='admin/settings',
58 # map.resource('setting', 'settings', controller='admin/settings',
57 # path_prefix='/admin', name_prefix='admin_')
59 # path_prefix='/admin', name_prefix='admin_')
58
60
59
60 @LoginRequired()
61 @LoginRequired()
61 def __before__(self):
62 def __before__(self):
62 c.admin_user = session.get('admin_user')
63 c.admin_user = session.get('admin_user')
63 c.admin_username = session.get('admin_username')
64 c.admin_username = session.get('admin_username')
64 super(SettingsController, self).__before__()
65 super(SettingsController, self).__before__()
65
66
66
67 @HasPermissionAllDecorator('hg.admin')
67 @HasPermissionAllDecorator('hg.admin')
68 def index(self, format='html'):
68 def index(self, format='html'):
69 """GET /admin/settings: All items in the collection"""
69 """GET /admin/settings: All items in the collection"""
70 # url('admin_settings')
70 # url('admin_settings')
71
71
72 defaults = SettingsModel().get_app_settings()
72 defaults = RhodeCodeSettings.get_app_settings()
73 defaults.update(self.get_hg_ui_settings())
73 defaults.update(self.get_hg_ui_settings())
74 return htmlfill.render(
74 return htmlfill.render(
75 render('admin/settings/settings.html'),
75 render('admin/settings/settings.html'),
@@ -100,19 +100,21 b' class SettingsController(BaseController)'
100 if setting_id == 'mapping':
100 if setting_id == 'mapping':
101 rm_obsolete = request.POST.get('destroy', False)
101 rm_obsolete = request.POST.get('destroy', False)
102 log.debug('Rescanning directories with destroy=%s', rm_obsolete)
102 log.debug('Rescanning directories with destroy=%s', rm_obsolete)
103
103 initial = ScmModel().repo_scan()
104 initial = ScmModel().repo_scan(g.paths[0][1], g.baseui)
104 log.debug('invalidating all repositories')
105 for repo_name in initial.keys():
105 for repo_name in initial.keys():
106 invalidate_cache('get_repo_cached_%s' % repo_name)
106 invalidate_cache('get_repo_cached_%s' % repo_name)
107
107
108 repo2db_mapper(initial, rm_obsolete)
108 added, removed = repo2db_mapper(initial, rm_obsolete)
109
109
110 h.flash(_('Repositories successfully rescanned'), category='success')
110 h.flash(_('Repositories successfully'
111 ' rescanned added: %s,removed: %s') % (added, removed),
112 category='success')
111
113
112 if setting_id == 'whoosh':
114 if setting_id == 'whoosh':
113 repo_location = self.get_hg_ui_settings()['paths_root_path']
115 repo_location = self.get_hg_ui_settings()['paths_root_path']
114 full_index = request.POST.get('full_index', False)
116 full_index = request.POST.get('full_index', False)
115 task = run_task(tasks.whoosh_index, repo_location, full_index)
117 run_task(tasks.whoosh_index, repo_location, full_index)
116
118
117 h.flash(_('Whoosh reindex task scheduled'), category='success')
119 h.flash(_('Whoosh reindex task scheduled'), category='success')
118 if setting_id == 'global':
120 if setting_id == 'global':
@@ -120,30 +122,36 b' class SettingsController(BaseController)'
120 application_form = ApplicationSettingsForm()()
122 application_form = ApplicationSettingsForm()()
121 try:
123 try:
122 form_result = application_form.to_python(dict(request.POST))
124 form_result = application_form.to_python(dict(request.POST))
123 settings_model = SettingsModel()
125
124 try:
126 try:
125 hgsettings1 = settings_model.get('title')
127 hgsettings1 = RhodeCodeSettings.get_by_name('title')
126 hgsettings1.app_settings_value = form_result['rhodecode_title']
128 hgsettings1.app_settings_value = \
129 form_result['rhodecode_title']
127
130
128 hgsettings2 = settings_model.get('realm')
131 hgsettings2 = RhodeCodeSettings.get_by_name('realm')
129 hgsettings2.app_settings_value = form_result['rhodecode_realm']
132 hgsettings2.app_settings_value = \
133 form_result['rhodecode_realm']
130
134
135 hgsettings3 = RhodeCodeSettings.get_by_name('ga_code')
136 hgsettings3.app_settings_value = \
137 form_result['rhodecode_ga_code']
131
138
132 self.sa.add(hgsettings1)
139 self.sa.add(hgsettings1)
133 self.sa.add(hgsettings2)
140 self.sa.add(hgsettings2)
141 self.sa.add(hgsettings3)
134 self.sa.commit()
142 self.sa.commit()
135 set_rhodecode_config(config)
143 set_rhodecode_config(config)
136 h.flash(_('Updated application settings'),
144 h.flash(_('Updated application settings'),
137 category='success')
145 category='success')
138
146
139 except:
147 except Exception:
140 log.error(traceback.format_exc())
148 log.error(traceback.format_exc())
141 h.flash(_('error occurred during updating'
149 h.flash(_('error occurred during updating '
142 ' application settings'), category='error')
150 'application settings'),
151 category='error')
143
152
144 self.sa.rollback()
153 self.sa.rollback()
145
154
146
147 except formencode.Invalid, errors:
155 except formencode.Invalid, errors:
148 return htmlfill.render(
156 return htmlfill.render(
149 render('admin/settings/settings.html'),
157 render('admin/settings/settings.html'),
@@ -167,24 +175,30 b' class SettingsController(BaseController)'
167 .filter(RhodeCodeUi.ui_key == '/').one()
175 .filter(RhodeCodeUi.ui_key == '/').one()
168 hgsettings2.ui_value = form_result['paths_root_path']
176 hgsettings2.ui_value = form_result['paths_root_path']
169
177
170
171 #HOOKS
178 #HOOKS
172 hgsettings3 = self.sa.query(RhodeCodeUi)\
179 hgsettings3 = self.sa.query(RhodeCodeUi)\
173 .filter(RhodeCodeUi.ui_key == 'changegroup.update').one()
180 .filter(RhodeCodeUi.ui_key == 'changegroup.update').one()
174 hgsettings3.ui_active = bool(form_result['hooks_changegroup_update'])
181 hgsettings3.ui_active = \
182 bool(form_result['hooks_changegroup_update'])
175
183
176 hgsettings4 = self.sa.query(RhodeCodeUi)\
184 hgsettings4 = self.sa.query(RhodeCodeUi)\
177 .filter(RhodeCodeUi.ui_key == 'changegroup.repo_size').one()
185 .filter(RhodeCodeUi.ui_key ==
178 hgsettings4.ui_active = bool(form_result['hooks_changegroup_repo_size'])
186 'changegroup.repo_size').one()
187 hgsettings4.ui_active = \
188 bool(form_result['hooks_changegroup_repo_size'])
179
189
180 hgsettings5 = self.sa.query(RhodeCodeUi)\
190 hgsettings5 = self.sa.query(RhodeCodeUi)\
181 .filter(RhodeCodeUi.ui_key == 'pretxnchangegroup.push_logger').one()
191 .filter(RhodeCodeUi.ui_key ==
182 hgsettings5.ui_active = bool(form_result['hooks_pretxnchangegroup_push_logger'])
192 'pretxnchangegroup.push_logger').one()
193 hgsettings5.ui_active = \
194 bool(form_result['hooks_pretxnchangegroup'
195 '_push_logger'])
183
196
184 hgsettings6 = self.sa.query(RhodeCodeUi)\
197 hgsettings6 = self.sa.query(RhodeCodeUi)\
185 .filter(RhodeCodeUi.ui_key == 'preoutgoing.pull_logger').one()
198 .filter(RhodeCodeUi.ui_key ==
186 hgsettings6.ui_active = bool(form_result['hooks_preoutgoing_pull_logger'])
199 'preoutgoing.pull_logger').one()
187
200 hgsettings6.ui_active = \
201 bool(form_result['hooks_preoutgoing_pull_logger'])
188
202
189 self.sa.add(hgsettings1)
203 self.sa.add(hgsettings1)
190 self.sa.add(hgsettings2)
204 self.sa.add(hgsettings2)
@@ -199,12 +213,11 b' class SettingsController(BaseController)'
199
213
200 except:
214 except:
201 log.error(traceback.format_exc())
215 log.error(traceback.format_exc())
202 h.flash(_('error occurred during updating application settings'),
216 h.flash(_('error occurred during updating '
203 category='error')
217 'application settings'), category='error')
204
218
205 self.sa.rollback()
219 self.sa.rollback()
206
220
207
208 except formencode.Invalid, errors:
221 except formencode.Invalid, errors:
209 return htmlfill.render(
222 return htmlfill.render(
210 render('admin/settings/settings.html'),
223 render('admin/settings/settings.html'),
@@ -214,6 +227,32 b' class SettingsController(BaseController)'
214 encoding="UTF-8")
227 encoding="UTF-8")
215
228
216
229
230 if setting_id == 'hooks':
231 ui_key = request.POST.get('new_hook_ui_key')
232 ui_value = request.POST.get('new_hook_ui_value')
233 try:
234
235 if ui_value and ui_key:
236 RhodeCodeUi.create_or_update_hook(ui_key, ui_value)
237 h.flash(_('Added new hook'),
238 category='success')
239
240 # check for edits
241 update = False
242 _d = request.POST.dict_of_lists()
243 for k, v in zip(_d.get('hook_ui_key',[]), _d.get('hook_ui_value_new',[])):
244 RhodeCodeUi.create_or_update_hook(k, v)
245 update = True
246
247 if update:
248 h.flash(_('Updated hooks'), category='success')
249
250 except:
251 log.error(traceback.format_exc())
252 h.flash(_('error occurred during hook creation'),
253 category='error')
254
255 return redirect(url('admin_edit_setting', setting_id='hooks'))
217
256
218 return redirect(url('admin_settings'))
257 return redirect(url('admin_settings'))
219
258
@@ -226,29 +265,45 b' class SettingsController(BaseController)'
226 # h.form(url('admin_setting', setting_id=ID),
265 # h.form(url('admin_setting', setting_id=ID),
227 # method='delete')
266 # method='delete')
228 # url('admin_setting', setting_id=ID)
267 # url('admin_setting', setting_id=ID)
229
268 if setting_id == 'hooks':
269 hook_id = request.POST.get('hook_id')
270 RhodeCodeUi.delete(hook_id)
271
272
230 @HasPermissionAllDecorator('hg.admin')
273 @HasPermissionAllDecorator('hg.admin')
231 def show(self, setting_id, format='html'):
274 def show(self, setting_id, format='html'):
232 """GET /admin/settings/setting_id: Show a specific item"""
275 """
276 GET /admin/settings/setting_id: Show a specific item"""
233 # url('admin_setting', setting_id=ID)
277 # url('admin_setting', setting_id=ID)
234
278
235 @HasPermissionAllDecorator('hg.admin')
279 @HasPermissionAllDecorator('hg.admin')
236 def edit(self, setting_id, format='html'):
280 def edit(self, setting_id, format='html'):
237 """GET /admin/settings/setting_id/edit: Form to edit an existing item"""
281 """
282 GET /admin/settings/setting_id/edit: Form to
283 edit an existing item"""
238 # url('admin_edit_setting', setting_id=ID)
284 # url('admin_edit_setting', setting_id=ID)
239
285
286 c.hooks = RhodeCodeUi.get_builtin_hooks()
287 c.custom_hooks = RhodeCodeUi.get_custom_hooks()
288
289 return htmlfill.render(
290 render('admin/settings/hooks.html'),
291 defaults={},
292 encoding="UTF-8",
293 force_defaults=False
294 )
295
240 @NotAnonymous()
296 @NotAnonymous()
241 def my_account(self):
297 def my_account(self):
242 """
298 """
243 GET /_admin/my_account Displays info about my account
299 GET /_admin/my_account Displays info about my account
244 """
300 """
245 # url('admin_settings_my_account')
301 # url('admin_settings_my_account')
246
302
247 c.user = UserModel().get(c.rhodecode_user.user_id, cache=False)
303 c.user = User.get(self.rhodecode_user.user_id)
248 all_repos = self.sa.query(Repository)\
304 all_repos = self.sa.query(Repository)\
249 .filter(Repository.user_id == c.user.user_id)\
305 .filter(Repository.user_id == c.user.user_id)\
250 .order_by(func.lower(Repository.repo_name))\
306 .order_by(func.lower(Repository.repo_name)).all()
251 .all()
252
307
253 c.user_repos = ScmModel().get_repos(all_repos)
308 c.user_repos = ScmModel().get_repos(all_repos)
254
309
@@ -274,9 +329,10 b' class SettingsController(BaseController)'
274 # method='put')
329 # method='put')
275 # url('admin_settings_my_account_update', id=ID)
330 # url('admin_settings_my_account_update', id=ID)
276 user_model = UserModel()
331 user_model = UserModel()
277 uid = c.rhodecode_user.user_id
332 uid = self.rhodecode_user.user_id
278 _form = UserForm(edit=True, old_data={'user_id':uid,
333 _form = UserForm(edit=True,
279 'email':c.rhodecode_user.email})()
334 old_data={'user_id': uid,
335 'email': self.rhodecode_user.email})()
280 form_result = {}
336 form_result = {}
281 try:
337 try:
282 form_result = _form.to_python(dict(request.POST))
338 form_result = _form.to_python(dict(request.POST))
@@ -285,8 +341,7 b' class SettingsController(BaseController)'
285 category='success')
341 category='success')
286
342
287 except formencode.Invalid, errors:
343 except formencode.Invalid, errors:
288 c.user = user_model.get(c.rhodecode_user.user_id, cache=False)
344 c.user = User.get(self.rhodecode_user.user_id)
289 c.user = UserModel().get(c.rhodecode_user.user_id, cache=False)
290 all_repos = self.sa.query(Repository)\
345 all_repos = self.sa.query(Repository)\
291 .filter(Repository.user_id == c.user.user_id)\
346 .filter(Repository.user_id == c.user.user_id)\
292 .order_by(func.lower(Repository.repo_name))\
347 .order_by(func.lower(Repository.repo_name))\
@@ -310,8 +365,22 b' class SettingsController(BaseController)'
310 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
365 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
311 def create_repository(self):
366 def create_repository(self):
312 """GET /_admin/create_repository: Form to create a new item"""
367 """GET /_admin/create_repository: Form to create a new item"""
368
369 c.repo_groups = [('', '')]
370 parents_link = lambda k: h.literal('&raquo;'.join(
371 map(lambda k: k.group_name,
372 k.parents + [k])
373 )
374 )
375
376 c.repo_groups.extend([(x.group_id, parents_link(x)) for \
377 x in self.sa.query(Group).all()])
378 c.repo_groups = sorted(c.repo_groups,
379 key=lambda t: t[1].split('&raquo;')[0])
380 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
381
313 new_repo = request.GET.get('repo', '')
382 new_repo = request.GET.get('repo', '')
314 c.new_repo = h.repo_name_slug(new_repo)
383 c.new_repo = repo_name_slug(new_repo)
315
384
316 return render('admin/repos/repo_add_create_repository.html')
385 return render('admin/repos/repo_add_create_repository.html')
317
386
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Users crud controller for pylons
6 Users crud controller for pylons
7
7
8 :created_on: Apr 4, 2010
8 :created_on: Apr 4, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -28,21 +28,23 b' import traceback'
28 import formencode
28 import formencode
29
29
30 from formencode import htmlfill
30 from formencode import htmlfill
31 from pylons import request, session, tmpl_context as c, url
31 from pylons import request, session, tmpl_context as c, url, config
32 from pylons.controllers.util import abort, redirect
32 from pylons.controllers.util import abort, redirect
33 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
34
34
35 from rhodecode.lib.exceptions import *
35 from rhodecode.lib.exceptions import DefaultUserException, \
36 UserOwnsReposException
36 from rhodecode.lib import helpers as h
37 from rhodecode.lib import helpers as h
37 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
38 from rhodecode.lib.base import BaseController, render
39 from rhodecode.lib.base import BaseController, render
39
40
40 from rhodecode.model.db import User
41 from rhodecode.model.db import User, RepoToPerm, UserToPerm, Permission
41 from rhodecode.model.forms import UserForm
42 from rhodecode.model.forms import UserForm
42 from rhodecode.model.user import UserModel
43 from rhodecode.model.user import UserModel
43
44
44 log = logging.getLogger(__name__)
45 log = logging.getLogger(__name__)
45
46
47
46 class UsersController(BaseController):
48 class UsersController(BaseController):
47 """REST Controller styled on the Atom Publishing Protocol"""
49 """REST Controller styled on the Atom Publishing Protocol"""
48 # To properly map this controller, ensure your config/routing.py
50 # To properly map this controller, ensure your config/routing.py
@@ -55,7 +57,7 b' class UsersController(BaseController):'
55 c.admin_user = session.get('admin_user')
57 c.admin_user = session.get('admin_user')
56 c.admin_username = session.get('admin_username')
58 c.admin_username = session.get('admin_username')
57 super(UsersController, self).__before__()
59 super(UsersController, self).__before__()
58
60 c.available_permissions = config['available_permissions']
59
61
60 def index(self, format='html'):
62 def index(self, format='html'):
61 """GET /users: All items in the collection"""
63 """GET /users: All items in the collection"""
@@ -99,25 +101,28 b' class UsersController(BaseController):'
99 # Forms posted to this method should contain a hidden field:
101 # Forms posted to this method should contain a hidden field:
100 # <input type="hidden" name="_method" value="PUT" />
102 # <input type="hidden" name="_method" value="PUT" />
101 # Or using helpers:
103 # Or using helpers:
102 # h.form(url('user', id=ID),
104 # h.form(url('update_user', id=ID),
103 # method='put')
105 # method='put')
104 # url('user', id=ID)
106 # url('user', id=ID)
105 user_model = UserModel()
107 user_model = UserModel()
106 c.user = user_model.get(id)
108 c.user = user_model.get(id)
107
109
108 _form = UserForm(edit=True, old_data={'user_id':id,
110 _form = UserForm(edit=True, old_data={'user_id': id,
109 'email':c.user.email})()
111 'email': c.user.email})()
110 form_result = {}
112 form_result = {}
111 try:
113 try:
112 form_result = _form.to_python(dict(request.POST))
114 form_result = _form.to_python(dict(request.POST))
113 user_model.update(id, form_result)
115 user_model.update(id, form_result)
114 h.flash(_('User updated succesfully'), category='success')
116 h.flash(_('User updated successfully'), category='success')
115
117
116 except formencode.Invalid, errors:
118 except formencode.Invalid, errors:
119 e = errors.error_dict or {}
120 perm = Permission.get_by_key('hg.create.repository')
121 e.update({'create_repo_perm': UserToPerm.has_perm(id, perm)})
117 return htmlfill.render(
122 return htmlfill.render(
118 render('admin/users/user_edit.html'),
123 render('admin/users/user_edit.html'),
119 defaults=errors.value,
124 defaults=errors.value,
120 errors=errors.error_dict or {},
125 errors=e,
121 prefix_error=False,
126 prefix_error=False,
122 encoding="UTF-8")
127 encoding="UTF-8")
123 except Exception:
128 except Exception:
@@ -132,13 +137,13 b' class UsersController(BaseController):'
132 # Forms posted to this method should contain a hidden field:
137 # Forms posted to this method should contain a hidden field:
133 # <input type="hidden" name="_method" value="DELETE" />
138 # <input type="hidden" name="_method" value="DELETE" />
134 # Or using helpers:
139 # Or using helpers:
135 # h.form(url('user', id=ID),
140 # h.form(url('delete_user', id=ID),
136 # method='delete')
141 # method='delete')
137 # url('user', id=ID)
142 # url('user', id=ID)
138 user_model = UserModel()
143 user_model = UserModel()
139 try:
144 try:
140 user_model.delete(id)
145 user_model.delete(id)
141 h.flash(_('sucessfully deleted user'), category='success')
146 h.flash(_('successfully deleted user'), category='success')
142 except (UserOwnsReposException, DefaultUserException), e:
147 except (UserOwnsReposException, DefaultUserException), e:
143 h.flash(str(e), category='warning')
148 h.flash(str(e), category='warning')
144 except Exception:
149 except Exception:
@@ -150,21 +155,53 b' class UsersController(BaseController):'
150 """GET /users/id: Show a specific item"""
155 """GET /users/id: Show a specific item"""
151 # url('user', id=ID)
156 # url('user', id=ID)
152
157
153
154 def edit(self, id, format='html'):
158 def edit(self, id, format='html'):
155 """GET /users/id/edit: Form to edit an existing item"""
159 """GET /users/id/edit: Form to edit an existing item"""
156 # url('edit_user', id=ID)
160 # url('edit_user', id=ID)
157 c.user = self.sa.query(User).get(id)
161 user_model = UserModel()
162 c.user = user_model.get(id)
158 if not c.user:
163 if not c.user:
159 return redirect(url('users'))
164 return redirect(url('users'))
160 if c.user.username == 'default':
165 if c.user.username == 'default':
161 h.flash(_("You can't edit this user"), category='warning')
166 h.flash(_("You can't edit this user"), category='warning')
162 return redirect(url('users'))
167 return redirect(url('users'))
168 c.user.permissions = {}
169 c.granted_permissions = user_model.fill_perms(c.user)\
170 .permissions['global']
163
171
164 defaults = c.user.get_dict()
172 defaults = c.user.get_dict()
173 perm = Permission.get_by_key('hg.create.repository')
174 defaults.update({'create_repo_perm': UserToPerm.has_perm(id, perm)})
175
165 return htmlfill.render(
176 return htmlfill.render(
166 render('admin/users/user_edit.html'),
177 render('admin/users/user_edit.html'),
167 defaults=defaults,
178 defaults=defaults,
168 encoding="UTF-8",
179 encoding="UTF-8",
169 force_defaults=False
180 force_defaults=False
170 )
181 )
182
183 def update_perm(self, id):
184 """PUT /users_perm/id: Update an existing item"""
185 # url('user_perm', id=ID, method='put')
186
187 grant_perm = request.POST.get('create_repo_perm', False)
188
189 if grant_perm:
190 perm = Permission.get_by_key('hg.create.none')
191 UserToPerm.revoke_perm(id, perm)
192
193 perm = Permission.get_by_key('hg.create.repository')
194 UserToPerm.grant_perm(id, perm)
195 h.flash(_("Granted 'repository create' permission to user"),
196 category='success')
197
198 else:
199 perm = Permission.get_by_key('hg.create.repository')
200 UserToPerm.revoke_perm(id, perm)
201
202 perm = Permission.get_by_key('hg.create.none')
203 UserToPerm.grant_perm(id, perm)
204 h.flash(_("Revoked 'repository create' permission to user"),
205 category='success')
206
207 return redirect(url('edit_user', id=id))
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 branches controller for rhodecode
6 branches controller for rhodecode
7
7
8 :created_on: Apr 21, 2010
8 :created_on: Apr 21, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -26,15 +26,16 b''
26 import logging
26 import logging
27
27
28 from pylons import tmpl_context as c
28 from pylons import tmpl_context as c
29 import binascii
29
30
30 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
31 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
31 from rhodecode.lib.base import BaseController, render
32 from rhodecode.lib.base import BaseRepoController, render
32 from rhodecode.lib.utils import OrderedDict
33 from rhodecode.lib.odict import OrderedDict
33 from rhodecode.model.scm import ScmModel
34 from rhodecode.lib import safe_unicode
34
35 log = logging.getLogger(__name__)
35 log = logging.getLogger(__name__)
36
36
37 class BranchesController(BaseController):
37
38 class BranchesController(BaseRepoController):
38
39
39 @LoginRequired()
40 @LoginRequired()
40 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
41 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
@@ -43,10 +44,35 b' class BranchesController(BaseController)'
43 super(BranchesController, self).__before__()
44 super(BranchesController, self).__before__()
44
45
45 def index(self):
46 def index(self):
46 hg_model = ScmModel()
47
47 c.repo_info = hg_model.get_repo(c.repo_name)
48 def _branchtags(localrepo):
48 c.repo_branches = OrderedDict()
49
49 for name, hash_ in c.repo_info.branches.items():
50 bt = {}
50 c.repo_branches[name] = c.repo_info.get_changeset(hash_)
51 bt_closed = {}
52
53 for bn, heads in localrepo.branchmap().iteritems():
54 tip = heads[-1]
55 if 'close' not in localrepo.changelog.read(tip)[5]:
56 bt[bn] = tip
57 else:
58 bt_closed[bn] = tip
59 return bt, bt_closed
60
61
62 bt, bt_closed = _branchtags(c.rhodecode_repo._repo)
63 cs_g = c.rhodecode_repo.get_changeset
64 _branches = [(safe_unicode(n), cs_g(binascii.hexlify(h)),) for n, h in
65 bt.items()]
66
67 _closed_branches = [(safe_unicode(n), cs_g(binascii.hexlify(h)),) for n, h in
68 bt_closed.items()]
69
70 c.repo_branches = OrderedDict(sorted(_branches,
71 key=lambda ctx: ctx[0],
72 reverse=False))
73 c.repo_closed_branches = OrderedDict(sorted(_closed_branches,
74 key=lambda ctx: ctx[0],
75 reverse=False))
76
51
77
52 return render('branches/branches.html')
78 return render('branches/branches.html')
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 changelog controller for rhodecode
6 changelog controller for rhodecode
7
7
8 :created_on: Apr 21, 2010
8 :created_on: Apr 21, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -31,24 +31,24 b' except ImportError:'
31 #python 2.5 compatibility
31 #python 2.5 compatibility
32 import simplejson as json
32 import simplejson as json
33
33
34 from mercurial.graphmod import colored, CHANGESET, revisions as graph_rev
34 from mercurial import graphmod
35 from pylons import request, session, tmpl_context as c
35 from pylons import request, session, tmpl_context as c
36
36
37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
38 from rhodecode.lib.base import BaseController, render
38 from rhodecode.lib.base import BaseRepoController, render
39 from rhodecode.model.scm import ScmModel
39 from rhodecode.lib.helpers import RepoPage
40
41 from webhelpers.paginate import Page
42
40
43 log = logging.getLogger(__name__)
41 log = logging.getLogger(__name__)
44
42
45 class ChangelogController(BaseController):
43
44 class ChangelogController(BaseRepoController):
46
45
47 @LoginRequired()
46 @LoginRequired()
48 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
47 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
49 'repository.admin')
48 'repository.admin')
50 def __before__(self):
49 def __before__(self):
51 super(ChangelogController, self).__before__()
50 super(ChangelogController, self).__before__()
51 c.affected_files_cut_off = 60
52
52
53 def index(self):
53 def index(self):
54 limit = 100
54 limit = 100
@@ -65,40 +65,57 b' class ChangelogController(BaseController'
65 else:
65 else:
66 c.size = int(session.get('changelog_size', default))
66 c.size = int(session.get('changelog_size', default))
67
67
68 changesets = ScmModel().get_repo(c.repo_name)
68 p = int(request.params.get('page', 1))
69 branch_name = request.params.get('branch', None)
70 c.total_cs = len(c.rhodecode_repo)
71 c.pagination = RepoPage(c.rhodecode_repo, page=p,
72 item_count=c.total_cs, items_per_page=c.size,
73 branch_name=branch_name)
69
74
70 p = int(request.params.get('page', 1))
75 self._graph(c.rhodecode_repo, c.total_cs, c.size, p)
71 c.total_cs = len(changesets)
72 c.pagination = Page(changesets, page=p, item_count=c.total_cs,
73 items_per_page=c.size)
74
75 self._graph(changesets, c.size, p)
76
76
77 return render('changelog/changelog.html')
77 return render('changelog/changelog.html')
78
78
79 def changelog_details(self, cs):
80 if request.environ.get('HTTP_X_PARTIAL_XHR'):
81 c.cs = c.rhodecode_repo.get_changeset(cs)
82 return render('changelog/changelog_details.html')
79
83
80 def _graph(self, repo, size, p):
84 def _graph(self, repo, repo_size, size, p):
81 revcount = size
85 """
82 if not repo.revisions or repo.alias == 'git':
86 Generates a DAG graph for mercurial
87
88 :param repo: repo instance
89 :param size: number of commits to show
90 :param p: page number
91 """
92 if not repo.revisions:
83 c.jsdata = json.dumps([])
93 c.jsdata = json.dumps([])
84 return
94 return
85
95
86 max_rev = repo.revisions[-1]
96 revcount = min(repo_size, size)
87
88 offset = 1 if p == 1 else ((p - 1) * revcount + 1)
97 offset = 1 if p == 1 else ((p - 1) * revcount + 1)
98 try:
99 rev_end = repo.revisions.index(repo.revisions[(-1 * offset)])
100 except IndexError:
101 rev_end = repo.revisions.index(repo.revisions[-1])
102 rev_start = max(0, rev_end - revcount)
89
103
90 rev_start = repo.revisions[(-1 * offset)]
104 data = []
105 rev_end += 1
91
106
92 revcount = min(max_rev, revcount)
107 if repo.alias == 'git':
93 rev_end = max(0, rev_start - revcount)
108 for _ in xrange(rev_start, rev_end):
94 dag = graph_rev(repo.repo, rev_start, rev_end)
109 vtx = [0, 1]
110 edges = [[0, 0, 1]]
111 data.append(['', vtx, edges])
95
112
96 c.dag = tree = list(colored(dag))
113 elif repo.alias == 'hg':
97 data = []
114 revs = list(reversed(xrange(rev_start, rev_end)))
98 for (id, type, ctx, vtx, edges) in tree:
115 c.dag = graphmod.colored(graphmod.dagwalker(repo._repo, revs))
99 if type != CHANGESET:
116 for (id, type, ctx, vtx, edges) in c.dag:
100 continue
117 if type != graphmod.CHANGESET:
101 data.append(('', vtx, edges))
118 continue
119 data.append(['', vtx, edges])
102
120
103 c.jsdata = json.dumps(data)
121 c.jsdata = json.dumps(data)
104
@@ -3,11 +3,12 b''
3 rhodecode.controllers.changeset
3 rhodecode.controllers.changeset
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 changeset controller for pylons
6 changeset controller for pylons showoing changes beetween
7
7 revisions
8
8 :created_on: Apr 25, 2010
9 :created_on: Apr 25, 2010
9 :author: marcink
10 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
11 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
12 :license: GPLv3, see COPYING for more details.
12 """
13 """
13 # This program is free software: you can redistribute it and/or modify
14 # This program is free software: you can redistribute it and/or modify
@@ -31,26 +32,28 b' from pylons.controllers.util import redi'
31
32
32 import rhodecode.lib.helpers as h
33 import rhodecode.lib.helpers as h
33 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
34 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
34 from rhodecode.lib.base import BaseController, render
35 from rhodecode.lib.base import BaseRepoController, render
35 from rhodecode.lib.utils import EmptyChangeset
36 from rhodecode.lib.utils import EmptyChangeset
36 from rhodecode.model.scm import ScmModel
37 from rhodecode.lib.odict import OrderedDict
37
38
38 from vcs.exceptions import RepositoryError, ChangesetError
39 from vcs.exceptions import RepositoryError, ChangesetError, \
40 ChangesetDoesNotExistError
39 from vcs.nodes import FileNode
41 from vcs.nodes import FileNode
40 from vcs.utils import diffs as differ
42 from vcs.utils import diffs as differ
41
43
42 log = logging.getLogger(__name__)
44 log = logging.getLogger(__name__)
43
45
44 class ChangesetController(BaseController):
46
47 class ChangesetController(BaseRepoController):
45
48
46 @LoginRequired()
49 @LoginRequired()
47 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
50 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
48 'repository.admin')
51 'repository.admin')
49 def __before__(self):
52 def __before__(self):
50 super(ChangesetController, self).__before__()
53 super(ChangesetController, self).__before__()
54 c.affected_files_cut_off = 60
51
55
52 def index(self, revision):
56 def index(self, revision):
53 hg_model = ScmModel()
54
57
55 def wrap_to_table(str):
58 def wrap_to_table(str):
56
59
@@ -61,94 +64,150 b' class ChangesetController(BaseController'
61 </tr>
64 </tr>
62 </table>''' % str
65 </table>''' % str
63
66
67 #get ranges of revisions if preset
68 rev_range = revision.split('...')[:2]
69
64 try:
70 try:
65 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
71 if len(rev_range) == 2:
66 except RepositoryError, e:
72 rev_start = rev_range[0]
73 rev_end = rev_range[1]
74 rev_ranges = c.rhodecode_repo.get_changesets(start=rev_start,
75 end=rev_end)
76 else:
77 rev_ranges = [c.rhodecode_repo.get_changeset(revision)]
78
79 c.cs_ranges = list(rev_ranges)
80
81 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
67 log.error(traceback.format_exc())
82 log.error(traceback.format_exc())
68 h.flash(str(e), category='warning')
83 h.flash(str(e), category='warning')
69 return redirect(url('home'))
84 return redirect(url('home'))
70 else:
85
86 c.changes = OrderedDict()
87 c.sum_added = 0
88 c.sum_removed = 0
89 c.lines_added = 0
90 c.lines_deleted = 0
91 c.cut_off = False # defines if cut off limit is reached
92
93 # Iterate over ranges (default changeset view is always one changeset)
94 for changeset in c.cs_ranges:
95 c.changes[changeset.raw_id] = []
71 try:
96 try:
72 c.changeset_old = c.changeset.parents[0]
97 changeset_parent = changeset.parents[0]
73 except IndexError:
98 except IndexError:
74 c.changeset_old = None
99 changeset_parent = None
75 c.changes = []
76
100
77 #===================================================================
101 #==================================================================
78 # ADDED FILES
102 # ADDED FILES
79 #===================================================================
103 #==================================================================
80 c.sum_added = 0
104 for node in changeset.added:
81 for node in c.changeset.added:
82
105
83 filenode_old = FileNode(node.path, '', EmptyChangeset())
106 filenode_old = FileNode(node.path, '', EmptyChangeset())
84 if filenode_old.is_binary or node.is_binary:
107 if filenode_old.is_binary or node.is_binary:
85 diff = wrap_to_table(_('binary file'))
108 diff = wrap_to_table(_('binary file'))
109 st = (0, 0)
86 else:
110 else:
111 # in this case node.size is good parameter since those are
112 # added nodes and their size defines how many changes were
113 # made
87 c.sum_added += node.size
114 c.sum_added += node.size
88 if c.sum_added < self.cut_off_limit:
115 if c.sum_added < self.cut_off_limit:
89 f_udiff = differ.get_udiff(filenode_old, node)
116 f_gitdiff = differ.get_gitdiff(filenode_old, node)
90 diff = differ.DiffProcessor(f_udiff).as_html()
117 d = differ.DiffProcessor(f_gitdiff, format='gitdiff')
118
119 st = d.stat()
120 diff = d.as_html()
91
121
92 else:
122 else:
93 diff = wrap_to_table(_('Changeset is to big and was cut'
123 diff = wrap_to_table(_('Changeset is to big and '
94 ' off, see raw changeset instead'))
124 'was cut off, see raw '
125 'changeset instead'))
126 c.cut_off = True
127 break
95
128
96 cs1 = None
129 cs1 = None
97 cs2 = node.last_changeset.raw_id
130 cs2 = node.last_changeset.raw_id
98 c.changes.append(('added', node, diff, cs1, cs2))
131 c.lines_added += st[0]
132 c.lines_deleted += st[1]
133 c.changes[changeset.raw_id].append(('added', node, diff,
134 cs1, cs2, st))
99
135
100 #===================================================================
136 #==================================================================
101 # CHANGED FILES
137 # CHANGED FILES
102 #===================================================================
138 #==================================================================
103 c.sum_removed = 0
139 if not c.cut_off:
104 for node in c.changeset.changed:
140 for node in changeset.changed:
105 try:
141 try:
106 filenode_old = c.changeset_old.get_node(node.path)
142 filenode_old = changeset_parent.get_node(node.path)
107 except ChangesetError:
143 except ChangesetError:
108 filenode_old = FileNode(node.path, '', EmptyChangeset())
144 log.warning('Unable to fetch parent node for diff')
145 filenode_old = FileNode(node.path, '',
146 EmptyChangeset())
109
147
110 if filenode_old.is_binary or node.is_binary:
148 if filenode_old.is_binary or node.is_binary:
111 diff = wrap_to_table(_('binary file'))
149 diff = wrap_to_table(_('binary file'))
112 else:
150 st = (0, 0)
151 else:
113
152
114 if c.sum_removed < self.cut_off_limit:
153 if c.sum_removed < self.cut_off_limit:
115 f_udiff = differ.get_udiff(filenode_old, node)
154 f_gitdiff = differ.get_gitdiff(filenode_old, node)
116 diff = differ.DiffProcessor(f_udiff).as_html()
155 d = differ.DiffProcessor(f_gitdiff,
117 if diff:
156 format='gitdiff')
118 c.sum_removed += len(diff)
157 st = d.stat()
119 else:
158 if (st[0] + st[1]) * 256 > self.cut_off_limit:
120 diff = wrap_to_table(_('Changeset is to big and was cut'
159 diff = wrap_to_table(_('Diff is to big '
121 ' off, see raw changeset instead'))
160 'and was cut off, see '
161 'raw diff instead'))
162 else:
163 diff = d.as_html()
122
164
165 if diff:
166 c.sum_removed += len(diff)
167 else:
168 diff = wrap_to_table(_('Changeset is to big and '
169 'was cut off, see raw '
170 'changeset instead'))
171 c.cut_off = True
172 break
123
173
124 cs1 = filenode_old.last_changeset.raw_id
174 cs1 = filenode_old.last_changeset.raw_id
125 cs2 = node.last_changeset.raw_id
175 cs2 = node.last_changeset.raw_id
126 c.changes.append(('changed', node, diff, cs1, cs2))
176 c.lines_added += st[0]
177 c.lines_deleted += st[1]
178 c.changes[changeset.raw_id].append(('changed', node, diff,
179 cs1, cs2, st))
127
180
128 #===================================================================
181 #==================================================================
129 # REMOVED FILES
182 # REMOVED FILES
130 #===================================================================
183 #==================================================================
131 for node in c.changeset.removed:
184 if not c.cut_off:
132 c.changes.append(('removed', node, None, None, None))
185 for node in changeset.removed:
186 c.changes[changeset.raw_id].append(('removed', node, None,
187 None, None, (0, 0)))
133
188
134 return render('changeset/changeset.html')
189 if len(c.cs_ranges) == 1:
190 c.changeset = c.cs_ranges[0]
191 c.changes = c.changes[c.changeset.raw_id]
192
193 return render('changeset/changeset.html')
194 else:
195 return render('changeset/changeset_range.html')
135
196
136 def raw_changeset(self, revision):
197 def raw_changeset(self, revision):
137
198
138 hg_model = ScmModel()
139 method = request.GET.get('diff', 'show')
199 method = request.GET.get('diff', 'show')
140 try:
200 try:
141 r = hg_model.get_repo(c.repo_name)
201 c.scm_type = c.rhodecode_repo.alias
142 c.scm_type = r.alias
202 c.changeset = c.rhodecode_repo.get_changeset(revision)
143 c.changeset = r.get_changeset(revision)
144 except RepositoryError:
203 except RepositoryError:
145 log.error(traceback.format_exc())
204 log.error(traceback.format_exc())
146 return redirect(url('home'))
205 return redirect(url('home'))
147 else:
206 else:
148 try:
207 try:
149 c.changeset_old = c.changeset.parents[0]
208 c.changeset_parent = c.changeset.parents[0]
150 except IndexError:
209 except IndexError:
151 c.changeset_old = None
210 c.changeset_parent = None
152 c.changes = []
211 c.changes = []
153
212
154 for node in c.changeset.added:
213 for node in c.changeset.added:
@@ -156,20 +215,22 b' class ChangesetController(BaseController'
156 if filenode_old.is_binary or node.is_binary:
215 if filenode_old.is_binary or node.is_binary:
157 diff = _('binary file') + '\n'
216 diff = _('binary file') + '\n'
158 else:
217 else:
159 f_udiff = differ.get_udiff(filenode_old, node)
218 f_gitdiff = differ.get_gitdiff(filenode_old, node)
160 diff = differ.DiffProcessor(f_udiff).raw_diff()
219 diff = differ.DiffProcessor(f_gitdiff,
220 format='gitdiff').raw_diff()
161
221
162 cs1 = None
222 cs1 = None
163 cs2 = node.last_changeset.raw_id
223 cs2 = node.last_changeset.raw_id
164 c.changes.append(('added', node, diff, cs1, cs2))
224 c.changes.append(('added', node, diff, cs1, cs2))
165
225
166 for node in c.changeset.changed:
226 for node in c.changeset.changed:
167 filenode_old = c.changeset_old.get_node(node.path)
227 filenode_old = c.changeset_parent.get_node(node.path)
168 if filenode_old.is_binary or node.is_binary:
228 if filenode_old.is_binary or node.is_binary:
169 diff = _('binary file')
229 diff = _('binary file')
170 else:
230 else:
171 f_udiff = differ.get_udiff(filenode_old, node)
231 f_gitdiff = differ.get_gitdiff(filenode_old, node)
172 diff = differ.DiffProcessor(f_udiff).raw_diff()
232 diff = differ.DiffProcessor(f_gitdiff,
233 format='gitdiff').raw_diff()
173
234
174 cs1 = filenode_old.last_changeset.raw_id
235 cs1 = filenode_old.last_changeset.raw_id
175 cs2 = node.last_changeset.raw_id
236 cs2 = node.last_changeset.raw_id
@@ -178,10 +239,11 b' class ChangesetController(BaseController'
178 response.content_type = 'text/plain'
239 response.content_type = 'text/plain'
179
240
180 if method == 'download':
241 if method == 'download':
181 response.content_disposition = 'attachment; filename=%s.patch' % revision
242 response.content_disposition = 'attachment; filename=%s.patch' \
243 % revision
182
244
183 parent = True if len(c.changeset.parents) > 0 else False
245 c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id for x in
184 c.parent_tmpl = 'Parent %s' % c.changeset.parents[0].raw_id if parent else ''
246 c.changeset.parents])
185
247
186 c.diffs = ''
248 c.diffs = ''
187 for x in c.changes:
249 for x in c.changes:
@@ -1,13 +1,13 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 package.rhodecode.controllers.error
3 rhodecode.controllers.error
4 ~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 RhodeCode error controller
6 RhodeCode error controller
7
7
8 :created_on: Dec 8, 2010
8 :created_on: Dec 8, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -27,7 +27,7 b' import cgi'
27 import logging
27 import logging
28 import paste.fileapp
28 import paste.fileapp
29
29
30 from pylons import tmpl_context as c, request, config
30 from pylons import tmpl_context as c, request, config, url
31 from pylons.i18n.translation import _
31 from pylons.i18n.translation import _
32 from pylons.middleware import media_path
32 from pylons.middleware import media_path
33
33
@@ -35,6 +35,7 b' from rhodecode.lib.base import BaseContr'
35
35
36 log = logging.getLogger(__name__)
36 log = logging.getLogger(__name__)
37
37
38
38 class ErrorController(BaseController):
39 class ErrorController(BaseController):
39 """Generates error documents as and when they are required.
40 """Generates error documents as and when they are required.
40
41
@@ -46,31 +47,30 b' class ErrorController(BaseController):'
46 """
47 """
47
48
48 def __before__(self):
49 def __before__(self):
49 c.rhodecode_name = config.get('rhodecode_title')
50 #disable all base actions since we don't need them here
51 pass
50
52
51 def document(self):
53 def document(self):
52 resp = request.environ.get('pylons.original_response')
54 resp = request.environ.get('pylons.original_response')
55 c.rhodecode_name = config.get('rhodecode_title')
53
56
54 log.debug('### %s ###', resp.status)
57 log.debug('### %s ###', resp.status)
55
58
56 e = request.environ
59 e = request.environ
57 c.serv_p = r'%(protocol)s://%(host)s/' % {
60 c.serv_p = r'%(protocol)s://%(host)s/' \
58 'protocol': e.get('wsgi.url_scheme'),
61 % {'protocol': e.get('wsgi.url_scheme'),
59 'host':e.get('HTTP_HOST'),
62 'host': e.get('HTTP_HOST'), }
60 }
61
62
63
63 c.error_message = cgi.escape(request.GET.get('code', str(resp.status)))
64 c.error_message = cgi.escape(request.GET.get('code', str(resp.status)))
64 c.error_explanation = self.get_error_explanation(resp.status_int)
65 c.error_explanation = self.get_error_explanation(resp.status_int)
65
66
66 #redirect to when error with given seconds
67 # redirect to when error with given seconds
67 c.redirect_time = 0
68 c.redirect_time = 0
68 c.redirect_module = _('Home page')# name to what your going to be redirected
69 c.redirect_module = _('Home page')
69 c.url_redirect = "/"
70 c.url_redirect = "/"
70
71
71 return render('/errors/error_document.html')
72 return render('/errors/error_document.html')
72
73
73
74 def img(self, id):
74 def img(self, id):
75 """Serve Pylons' stock images"""
75 """Serve Pylons' stock images"""
76 return self._serve_file(os.path.join(media_path, 'img', id))
76 return self._serve_file(os.path.join(media_path, 'img', id))
@@ -95,7 +95,8 b' class ErrorController(BaseController):'
95 code = 500
95 code = 500
96
96
97 if code == 400:
97 if code == 400:
98 return _('The request could not be understood by the server due to malformed syntax.')
98 return _('The request could not be understood by the server'
99 ' due to malformed syntax.')
99 if code == 401:
100 if code == 401:
100 return _('Unauthorized access to resource')
101 return _('Unauthorized access to resource')
101 if code == 403:
102 if code == 403:
@@ -103,6 +104,5 b' class ErrorController(BaseController):'
103 if code == 404:
104 if code == 404:
104 return _('The resource could not be found')
105 return _('The resource could not be found')
105 if code == 500:
106 if code == 500:
106 return _('The server encountered an unexpected condition which prevented it from fulfilling the request.')
107 return _('The server encountered an unexpected condition'
107
108 ' which prevented it from fulfilling the request.')
108
@@ -25,64 +25,92 b''
25
25
26 import logging
26 import logging
27
27
28 from pylons import url, response
28 from pylons import url, response, tmpl_context as c
29 from pylons.i18n.translation import _
29
30
31 from rhodecode.lib import safe_unicode
30 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
32 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
31 from rhodecode.lib.base import BaseController
33 from rhodecode.lib.base import BaseRepoController
32 from rhodecode.model.scm import ScmModel
33
34
34 from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed
35 from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed
35
36
36 log = logging.getLogger(__name__)
37 log = logging.getLogger(__name__)
37
38
38 class FeedController(BaseController):
39
39
40 @LoginRequired()
40 class FeedController(BaseRepoController):
41
42 @LoginRequired(api_access=True)
41 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
43 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
42 'repository.admin')
44 'repository.admin')
43 def __before__(self):
45 def __before__(self):
44 super(FeedController, self).__before__()
46 super(FeedController, self).__before__()
45 #common values for feeds
47 #common values for feeds
46 self.description = 'Changes on %s repository'
48 self.description = _('Changes on %s repository')
47 self.title = "%s feed"
49 self.title = self.title = _('%s %s feed') % (c.rhodecode_name, '%s')
48 self.language = 'en-us'
50 self.language = 'en-us'
49 self.ttl = "5"
51 self.ttl = "5"
50 self.feed_nr = 10
52 self.feed_nr = 10
51
53
54 def __changes(self, cs):
55 changes = []
56
57 a = [safe_unicode(n.path) for n in cs.added]
58 if a:
59 changes.append('\nA ' + '\nA '.join(a))
60
61 m = [safe_unicode(n.path) for n in cs.changed]
62 if m:
63 changes.append('\nM ' + '\nM '.join(m))
64
65 d = [safe_unicode(n.path) for n in cs.removed]
66 if d:
67 changes.append('\nD ' + '\nD '.join(d))
68
69 changes.append('</pre>')
70
71 return ''.join(changes)
72
52 def atom(self, repo_name):
73 def atom(self, repo_name):
53 """Produce an atom-1.0 feed via feedgenerator module"""
74 """Produce an atom-1.0 feed via feedgenerator module"""
54 feed = Atom1Feed(title=self.title % repo_name,
75 feed = Atom1Feed(title=self.title % repo_name,
55 link=url('summary_home', repo_name=repo_name, qualified=True),
76 link=url('summary_home', repo_name=repo_name,
77 qualified=True),
56 description=self.description % repo_name,
78 description=self.description % repo_name,
57 language=self.language,
79 language=self.language,
58 ttl=self.ttl)
80 ttl=self.ttl)
81 desc_msg = []
82 for cs in reversed(list(c.rhodecode_repo[-self.feed_nr:])):
83 desc_msg.append('%s - %s<br/><pre>' % (cs.author, cs.date))
84 desc_msg.append(self.__changes(cs))
59
85
60 changesets = ScmModel().get_repo(repo_name)
61
62 for cs in changesets[:self.feed_nr]:
63 feed.add_item(title=cs.message,
86 feed.add_item(title=cs.message,
64 link=url('changeset_home', repo_name=repo_name,
87 link=url('changeset_home', repo_name=repo_name,
65 revision=cs.raw_id, qualified=True),
88 revision=cs.raw_id, qualified=True),
66 description=str(cs.date))
89 author_name=cs.author,
90 description=''.join(desc_msg))
67
91
68 response.content_type = feed.mime_type
92 response.content_type = feed.mime_type
69 return feed.writeString('utf-8')
93 return feed.writeString('utf-8')
70
94
71
72 def rss(self, repo_name):
95 def rss(self, repo_name):
73 """Produce an rss2 feed via feedgenerator module"""
96 """Produce an rss2 feed via feedgenerator module"""
74 feed = Rss201rev2Feed(title=self.title % repo_name,
97 feed = Rss201rev2Feed(title=self.title % repo_name,
75 link=url('summary_home', repo_name=repo_name, qualified=True),
98 link=url('summary_home', repo_name=repo_name,
99 qualified=True),
76 description=self.description % repo_name,
100 description=self.description % repo_name,
77 language=self.language,
101 language=self.language,
78 ttl=self.ttl)
102 ttl=self.ttl)
103 desc_msg = []
104 for cs in reversed(list(c.rhodecode_repo[-self.feed_nr:])):
105 desc_msg.append('%s - %s<br/><pre>' % (cs.author, cs.date))
106 desc_msg.append(self.__changes(cs))
79
107
80 changesets = ScmModel().get_repo(repo_name)
81 for cs in changesets[:self.feed_nr]:
82 feed.add_item(title=cs.message,
108 feed.add_item(title=cs.message,
83 link=url('changeset_home', repo_name=repo_name,
109 link=url('changeset_home', repo_name=repo_name,
84 revision=cs.raw_id, qualified=True),
110 revision=cs.raw_id, qualified=True),
85 description=str(cs.date))
111 author_name=cs.author,
112 description=''.join(desc_msg),
113 )
86
114
87 response.content_type = feed.mime_type
115 response.content_type = feed.mime_type
88 return feed.writeString('utf-8')
116 return feed.writeString('utf-8')
@@ -22,40 +22,42 b''
22 #
22 #
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25 import os
26 import os
26 import tempfile
27 import logging
27 import logging
28 import rhodecode.lib.helpers as h
28 import traceback
29
29
30 from mercurial import archival
30 from os.path import join as jn
31
31
32 from pylons import request, response, session, tmpl_context as c, url
32 from pylons import request, response, session, tmpl_context as c, url
33 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
34 from pylons.controllers.util import redirect
34 from pylons.controllers.util import redirect
35 from pylons.decorators import jsonify
35
36
37 from vcs.conf import settings
38 from vcs.exceptions import RepositoryError, ChangesetDoesNotExistError, \
39 EmptyRepositoryError, ImproperArchiveTypeError, VCSError, NodeAlreadyExistsError
40 from vcs.nodes import FileNode, NodeKind
41 from vcs.utils import diffs as differ
42
43 from rhodecode.lib import convert_line_endings, detect_mode, safe_str
36 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
44 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
37 from rhodecode.lib.base import BaseController, render
45 from rhodecode.lib.base import BaseRepoController, render
38 from rhodecode.lib.utils import EmptyChangeset
46 from rhodecode.lib.utils import EmptyChangeset
39 from rhodecode.model.scm import ScmModel
47 import rhodecode.lib.helpers as h
40
48 from rhodecode.model.repo import RepoModel
41 from vcs.exceptions import RepositoryError, ChangesetError, \
42 ChangesetDoesNotExistError, EmptyRepositoryError
43 from vcs.nodes import FileNode
44 from vcs.utils import diffs as differ
45
49
46 log = logging.getLogger(__name__)
50 log = logging.getLogger(__name__)
47
51
48
52
49 class FilesController(BaseController):
53 class FilesController(BaseRepoController):
50
54
51 @LoginRequired()
55 @LoginRequired()
52 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
53 'repository.admin')
54 def __before__(self):
56 def __before__(self):
55 super(FilesController, self).__before__()
57 super(FilesController, self).__before__()
56 c.cut_off_limit = self.cut_off_limit
58 c.cut_off_limit = self.cut_off_limit
57
59
58 def __get_cs_or_redirect(self, rev, repo_name):
60 def __get_cs_or_redirect(self, rev, repo_name, redirect_after=True):
59 """
61 """
60 Safe way to get changeset if error occur it redirects to tip with
62 Safe way to get changeset if error occur it redirects to tip with
61 proper message
63 proper message
@@ -64,196 +66,412 b' class FilesController(BaseController):'
64 :param repo_name: repo name to redirect after
66 :param repo_name: repo name to redirect after
65 """
67 """
66
68
67 _repo = ScmModel().get_repo(c.repo_name)
68 try:
69 try:
69 return _repo.get_changeset(rev)
70 return c.rhodecode_repo.get_changeset(rev)
70 except EmptyRepositoryError, e:
71 except EmptyRepositoryError, e:
71 h.flash(_('There are no files yet'), category='warning')
72 if not redirect_after:
73 return None
74 url_ = url('files_add_home',
75 repo_name=c.repo_name,
76 revision=0, f_path='')
77 add_new = '<a href="%s">[%s]</a>' % (url_, _('add new'))
78 h.flash(h.literal(_('There are no files yet %s' % add_new)),
79 category='warning')
72 redirect(h.url('summary_home', repo_name=repo_name))
80 redirect(h.url('summary_home', repo_name=repo_name))
73
81
74 except RepositoryError, e:
82 except RepositoryError, e:
75 h.flash(str(e), category='warning')
83 h.flash(str(e), category='warning')
76 redirect(h.url('files_home', repo_name=repo_name, revision='tip'))
84 redirect(h.url('files_home', repo_name=repo_name, revision='tip'))
77
85
78 def index(self, repo_name, revision, f_path):
86 def __get_filenode_or_redirect(self, repo_name, cs, path):
79 cs = self.__get_cs_or_redirect(revision, repo_name)
87 """
80 c.repo = ScmModel().get_repo(c.repo_name)
88 Returns file_node, if error occurs or given path is directory,
81
89 it'll redirect to top level path
82 revision = request.POST.get('at_rev', None) or revision
83
84 def get_next_rev(cur):
85 max_rev = len(c.repo.revisions) - 1
86 r = cur + 1
87 if r > max_rev:
88 r = max_rev
89 return r
90
90
91 def get_prev_rev(cur):
91 :param repo_name: repo_name
92 r = cur - 1
92 :param cs: given changeset
93 return r
93 :param path: path to lookup
94
94 """
95 c.f_path = f_path
96 c.changeset = cs
97 cur_rev = c.changeset.revision
98 prev_rev = c.repo.get_changeset(get_prev_rev(cur_rev)).raw_id
99 next_rev = c.repo.get_changeset(get_next_rev(cur_rev)).raw_id
100
101 c.url_prev = url('files_home', repo_name=c.repo_name,
102 revision=prev_rev, f_path=f_path)
103 c.url_next = url('files_home', repo_name=c.repo_name,
104 revision=next_rev, f_path=f_path)
105
95
106 try:
96 try:
107 c.files_list = c.changeset.get_node(f_path)
97 file_node = cs.get_node(path)
108 c.file_history = self._get_history(c.repo, c.files_list, f_path)
98 if file_node.is_dir():
109 except RepositoryError, e:
99 raise RepositoryError('given path is a directory')
110 h.flash(str(e), category='warning')
111 redirect(h.url('files_home', repo_name=repo_name,
112 revision=revision))
113
114
115 return render('files/files.html')
116
117 def rawfile(self, repo_name, revision, f_path):
118 cs = self.__get_cs_or_redirect(revision, repo_name)
119 try:
120 file_node = cs.get_node(f_path)
121 except RepositoryError, e:
122 h.flash(str(e), category='warning')
123 redirect(h.url('files_home', repo_name=repo_name,
124 revision=cs.raw_id))
125
126 fname = f_path.split(os.sep)[-1].encode('utf8', 'replace')
127
128 response.content_disposition = 'attachment; filename=%s' % fname
129 response.content_type = file_node.mimetype
130 return file_node.content
131
132 def raw(self, repo_name, revision, f_path):
133 cs = self.__get_cs_or_redirect(revision, repo_name)
134 try:
135 file_node = cs.get_node(f_path)
136 except RepositoryError, e:
100 except RepositoryError, e:
137 h.flash(str(e), category='warning')
101 h.flash(str(e), category='warning')
138 redirect(h.url('files_home', repo_name=repo_name,
102 redirect(h.url('files_home', repo_name=repo_name,
139 revision=cs.raw_id))
103 revision=cs.raw_id))
140
104
141 response.content_type = 'text/plain'
105 return file_node
142 return file_node.content
106
143
107
144 def annotate(self, repo_name, revision, f_path):
108 def __get_paths(self, changeset, starting_path):
145 cs = self.__get_cs_or_redirect(revision, repo_name)
109 """recursive walk in root dir and return a set of all path in that dir
110 based on repository walk function
111 """
112 _files = list()
113 _dirs = list()
114
146 try:
115 try:
147 c.file = cs.get_node(f_path)
116 tip = changeset
117 for topnode, dirs, files in tip.walk(starting_path):
118 for f in files:
119 _files.append(f.path)
120 for d in dirs:
121 _dirs.append(d.path)
148 except RepositoryError, e:
122 except RepositoryError, e:
149 h.flash(str(e), category='warning')
123 log.debug(traceback.format_exc())
150 redirect(h.url('files_home', repo_name=repo_name, revision=cs.raw_id))
124 pass
125 return _dirs, _files
151
126
152 c.file_history = self._get_history(ScmModel().get_repo(c.repo_name), c.file, f_path)
127 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
153 c.cs = cs
128 'repository.admin')
129 def index(self, repo_name, revision, f_path):
130 #reditect to given revision from form if given
131 post_revision = request.POST.get('at_rev', None)
132 if post_revision:
133 cs = self.__get_cs_or_redirect(post_revision, repo_name)
134 redirect(url('files_home', repo_name=c.repo_name,
135 revision=cs.raw_id, f_path=f_path))
136
137 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
138 c.branch = request.GET.get('branch', None)
154 c.f_path = f_path
139 c.f_path = f_path
155
140
141 cur_rev = c.changeset.revision
142
143 #prev link
144 try:
145 prev_rev = c.rhodecode_repo.get_changeset(cur_rev).prev(c.branch)
146 c.url_prev = url('files_home', repo_name=c.repo_name,
147 revision=prev_rev.raw_id, f_path=f_path)
148 if c.branch:
149 c.url_prev += '?branch=%s' % c.branch
150 except (ChangesetDoesNotExistError, VCSError):
151 c.url_prev = '#'
152
153 #next link
154 try:
155 next_rev = c.rhodecode_repo.get_changeset(cur_rev).next(c.branch)
156 c.url_next = url('files_home', repo_name=c.repo_name,
157 revision=next_rev.raw_id, f_path=f_path)
158 if c.branch:
159 c.url_next += '?branch=%s' % c.branch
160 except (ChangesetDoesNotExistError, VCSError):
161 c.url_next = '#'
162
163 #files or dirs
164 try:
165 c.files_list = c.changeset.get_node(f_path)
166
167 if c.files_list.is_file():
168 c.file_history = self._get_node_history(c.changeset, f_path)
169 else:
170 c.file_history = []
171 except RepositoryError, e:
172 h.flash(str(e), category='warning')
173 redirect(h.url('files_home', repo_name=repo_name,
174 revision=revision))
175
176 return render('files/files.html')
177
178 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
179 'repository.admin')
180 def rawfile(self, repo_name, revision, f_path):
181 cs = self.__get_cs_or_redirect(revision, repo_name)
182 file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path)
183
184 response.content_disposition = 'attachment; filename=%s' % \
185 safe_str(f_path.split(os.sep)[-1])
186
187 response.content_type = file_node.mimetype
188 return file_node.content
189
190 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
191 'repository.admin')
192 def raw(self, repo_name, revision, f_path):
193 cs = self.__get_cs_or_redirect(revision, repo_name)
194 file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path)
195
196 raw_mimetype_mapping = {
197 # map original mimetype to a mimetype used for "show as raw"
198 # you can also provide a content-disposition to override the
199 # default "attachment" disposition.
200 # orig_type: (new_type, new_dispo)
201
202 # show images inline:
203 'image/x-icon': ('image/x-icon', 'inline'),
204 'image/png': ('image/png', 'inline'),
205 'image/gif': ('image/gif', 'inline'),
206 'image/jpeg': ('image/jpeg', 'inline'),
207 'image/svg+xml': ('image/svg+xml', 'inline'),
208 }
209
210 mimetype = file_node.mimetype
211 try:
212 mimetype, dispo = raw_mimetype_mapping[mimetype]
213 except KeyError:
214 # we don't know anything special about this, handle it safely
215 if file_node.is_binary:
216 # do same as download raw for binary files
217 mimetype, dispo = 'application/octet-stream', 'attachment'
218 else:
219 # do not just use the original mimetype, but force text/plain,
220 # otherwise it would serve text/html and that might be unsafe.
221 # Note: underlying vcs library fakes text/plain mimetype if the
222 # mimetype can not be determined and it thinks it is not
223 # binary.This might lead to erroneous text display in some
224 # cases, but helps in other cases, like with text files
225 # without extension.
226 mimetype, dispo = 'text/plain', 'inline'
227
228 if dispo == 'attachment':
229 dispo = 'attachment; filename=%s' % \
230 safe_str(f_path.split(os.sep)[-1])
231
232 response.content_disposition = dispo
233 response.content_type = mimetype
234 return file_node.content
235
236 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
237 'repository.admin')
238 def annotate(self, repo_name, revision, f_path):
239 c.cs = self.__get_cs_or_redirect(revision, repo_name)
240 c.file = self.__get_filenode_or_redirect(repo_name, c.cs, f_path)
241
242 c.file_history = self._get_node_history(c.cs, f_path)
243 c.f_path = f_path
156 return render('files/files_annotate.html')
244 return render('files/files_annotate.html')
157
245
158 def archivefile(self, repo_name, revision, fileformat):
246 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
159 archive_specs = {
247 def edit(self, repo_name, revision, f_path):
160 '.tar.bz2': ('application/x-bzip2', 'tbz2'),
248 r_post = request.POST
161 '.tar.gz': ('application/x-gzip', 'tgz'),
249
162 '.zip': ('application/zip', 'zip'),
250 c.cs = self.__get_cs_or_redirect(revision, repo_name)
163 }
251 c.file = self.__get_filenode_or_redirect(repo_name, c.cs, f_path)
164 if not archive_specs.has_key(fileformat):
252
165 return 'Unknown archive type %s' % fileformat
253 if c.file.is_binary:
254 return redirect(url('files_home', repo_name=c.repo_name,
255 revision=c.cs.raw_id, f_path=f_path))
256
257 c.f_path = f_path
258
259 if r_post:
260
261 old_content = c.file.content
262 sl = old_content.splitlines(1)
263 first_line = sl[0] if sl else ''
264 # modes: 0 - Unix, 1 - Mac, 2 - DOS
265 mode = detect_mode(first_line, 0)
266 content = convert_line_endings(r_post.get('content'), mode)
267
268 message = r_post.get('message') or (_('Edited %s via RhodeCode')
269 % (f_path))
270 author = self.rhodecode_user.full_contact
271
272 if content == old_content:
273 h.flash(_('No changes'),
274 category='warning')
275 return redirect(url('changeset_home', repo_name=c.repo_name,
276 revision='tip'))
277
278 try:
279 self.scm_model.commit_change(repo=c.rhodecode_repo,
280 repo_name=repo_name, cs=c.cs,
281 user=self.rhodecode_user,
282 author=author, message=message,
283 content=content, f_path=f_path)
284 h.flash(_('Successfully committed to %s' % f_path),
285 category='success')
286
287 except Exception:
288 log.error(traceback.format_exc())
289 h.flash(_('Error occurred during commit'), category='error')
290 return redirect(url('changeset_home',
291 repo_name=c.repo_name, revision='tip'))
292
293 return render('files/files_edit.html')
294
295 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
296 def add(self, repo_name, revision, f_path):
297 r_post = request.POST
298 c.cs = self.__get_cs_or_redirect(revision, repo_name,
299 redirect_after=False)
300 if c.cs is None:
301 c.cs = EmptyChangeset(alias=c.rhodecode_repo.alias)
302
303 c.f_path = f_path
304
305 if r_post:
306 unix_mode = 0
307 content = convert_line_endings(r_post.get('content'), unix_mode)
308
309 message = r_post.get('message') or (_('Added %s via RhodeCode')
310 % (f_path))
311 location = r_post.get('location')
312 filename = r_post.get('filename')
313 file_obj = r_post.get('upload_file', None)
314
315 if file_obj is not None and hasattr(file_obj, 'filename'):
316 filename = file_obj.filename
317 content = file_obj.file
166
318
167 def read_in_chunks(file_object, chunk_size=1024 * 40):
319 node_path = os.path.join(location, filename)
168 """Lazy function (generator) to read a file piece by piece.
320 author = self.rhodecode_user.full_contact
169 Default chunk size: 40k."""
321
322 if not content:
323 h.flash(_('No content'), category='warning')
324 return redirect(url('changeset_home', repo_name=c.repo_name,
325 revision='tip'))
326 if not filename:
327 h.flash(_('No filename'), category='warning')
328 return redirect(url('changeset_home', repo_name=c.repo_name,
329 revision='tip'))
330
331 try:
332 self.scm_model.create_node(repo=c.rhodecode_repo,
333 repo_name=repo_name, cs=c.cs,
334 user=self.rhodecode_user,
335 author=author, message=message,
336 content=content, f_path=node_path)
337 h.flash(_('Successfully committed to %s' % node_path),
338 category='success')
339 except NodeAlreadyExistsError, e:
340 h.flash(_(e), category='error')
341 except Exception:
342 log.error(traceback.format_exc())
343 h.flash(_('Error occurred during commit'), category='error')
344 return redirect(url('changeset_home',
345 repo_name=c.repo_name, revision='tip'))
346
347 return render('files/files_add.html')
348
349 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
350 'repository.admin')
351 def archivefile(self, repo_name, fname):
352
353 fileformat = None
354 revision = None
355 ext = None
356 subrepos = request.GET.get('subrepos') == 'true'
357
358 for a_type, ext_data in settings.ARCHIVE_SPECS.items():
359 archive_spec = fname.split(ext_data[1])
360 if len(archive_spec) == 2 and archive_spec[1] == '':
361 fileformat = a_type or ext_data[1]
362 revision = archive_spec[0]
363 ext = ext_data[1]
364
365 try:
366 dbrepo = RepoModel().get_by_repo_name(repo_name)
367 if dbrepo.enable_downloads is False:
368 return _('downloads disabled')
369
370 cs = c.rhodecode_repo.get_changeset(revision)
371 content_type = settings.ARCHIVE_SPECS[fileformat][0]
372 except ChangesetDoesNotExistError:
373 return _('Unknown revision %s') % revision
374 except EmptyRepositoryError:
375 return _('Empty repository')
376 except (ImproperArchiveTypeError, KeyError):
377 return _('Unknown archive type')
378
379 response.content_type = content_type
380 response.content_disposition = 'attachment; filename=%s-%s%s' \
381 % (repo_name, revision, ext)
382
383 import tempfile
384 archive = tempfile.mkstemp()[1]
385 t = open(archive, 'wb')
386 cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos)
387
388 def get_chunked_archive(archive):
389 stream = open(archive, 'rb')
170 while True:
390 while True:
171 data = file_object.read(chunk_size)
391 data = stream.read(4096)
172 if not data:
392 if not data:
393 os.remove(archive)
173 break
394 break
174 yield data
395 yield data
175
396
176 archive = tempfile.TemporaryFile()
397 return get_chunked_archive(archive)
177 repo = ScmModel().get_repo(repo_name).repo
178 fname = '%s-%s%s' % (repo_name, revision, fileformat)
179 archival.archive(repo, archive, revision, archive_specs[fileformat][1],
180 prefix='%s-%s' % (repo_name, revision))
181 response.content_type = archive_specs[fileformat][0]
182 response.content_disposition = 'attachment; filename=%s' % fname
183 archive.seek(0)
184 return read_in_chunks(archive)
185
398
399 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
400 'repository.admin')
186 def diff(self, repo_name, f_path):
401 def diff(self, repo_name, f_path):
187 hg_model = ScmModel()
188 diff1 = request.GET.get('diff1')
402 diff1 = request.GET.get('diff1')
189 diff2 = request.GET.get('diff2')
403 diff2 = request.GET.get('diff2')
190 c.action = request.GET.get('diff')
404 c.action = request.GET.get('diff')
191 c.no_changes = diff1 == diff2
405 c.no_changes = diff1 == diff2
192 c.f_path = f_path
406 c.f_path = f_path
193 c.repo = hg_model.get_repo(c.repo_name)
407 c.big_diff = False
194
408
195 try:
409 try:
196 if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
410 if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
197 c.changeset_1 = c.repo.get_changeset(diff1)
411 c.changeset_1 = c.rhodecode_repo.get_changeset(diff1)
198 node1 = c.changeset_1.get_node(f_path)
412 node1 = c.changeset_1.get_node(f_path)
199 else:
413 else:
200 c.changeset_1 = EmptyChangeset()
414 c.changeset_1 = EmptyChangeset(repo=c.rhodecode_repo)
201 node1 = FileNode('.', '', changeset=c.changeset_1)
415 node1 = FileNode('.', '', changeset=c.changeset_1)
202
416
203 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
417 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
204 c.changeset_2 = c.repo.get_changeset(diff2)
418 c.changeset_2 = c.rhodecode_repo.get_changeset(diff2)
205 node2 = c.changeset_2.get_node(f_path)
419 node2 = c.changeset_2.get_node(f_path)
206 else:
420 else:
207 c.changeset_2 = EmptyChangeset()
421 c.changeset_2 = EmptyChangeset(repo=c.rhodecode_repo)
208 node2 = FileNode('.', '', changeset=c.changeset_2)
422 node2 = FileNode('.', '', changeset=c.changeset_2)
209 except RepositoryError:
423 except RepositoryError:
210 return redirect(url('files_home',
424 return redirect(url('files_home',
211 repo_name=c.repo_name, f_path=f_path))
425 repo_name=c.repo_name, f_path=f_path))
212
426
213 f_udiff = differ.get_udiff(node1, node2)
427 if c.action == 'download':
214 diff = differ.DiffProcessor(f_udiff)
428 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
429 format='gitdiff')
215
430
216 if c.action == 'download':
217 diff_name = '%s_vs_%s.diff' % (diff1, diff2)
431 diff_name = '%s_vs_%s.diff' % (diff1, diff2)
218 response.content_type = 'text/plain'
432 response.content_type = 'text/plain'
219 response.content_disposition = 'attachment; filename=%s' \
433 response.content_disposition = 'attachment; filename=%s' \
220 % diff_name
434 % diff_name
221 if node1.is_binary or node2.is_binary:
222 return _('binary file changed')
223 return diff.raw_diff()
435 return diff.raw_diff()
224
436
225 elif c.action == 'raw':
437 elif c.action == 'raw':
438 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
439 format='gitdiff')
226 response.content_type = 'text/plain'
440 response.content_type = 'text/plain'
227 if node1.is_binary or node2.is_binary:
228 return _('binary file changed')
229 return diff.raw_diff()
441 return diff.raw_diff()
230
442
231 elif c.action == 'diff':
443 elif c.action == 'diff':
232 if node1.is_binary or node2.is_binary:
444 if node1.is_binary or node2.is_binary:
233 c.cur_diff = _('Binary file')
445 c.cur_diff = _('Binary file')
234 elif node1.size > self.cut_off_limit or \
446 elif node1.size > self.cut_off_limit or \
235 node2.size > self.cut_off_limit:
447 node2.size > self.cut_off_limit:
236 c.cur_diff = _('Diff is too big to display')
448 c.cur_diff = ''
449 c.big_diff = True
237 else:
450 else:
451 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
452 format='gitdiff')
238 c.cur_diff = diff.as_html()
453 c.cur_diff = diff.as_html()
239 else:
454 else:
455
240 #default option
456 #default option
241 if node1.size > self.cut_off_limit or node2.size > self.cut_off_limit:
457 if node1.is_binary or node2.is_binary:
242 c.cur_diff = _('Diff is to big to display')
243 elif node1.is_binary or node2.is_binary:
244 c.cur_diff = _('Binary file')
458 c.cur_diff = _('Binary file')
459 elif node1.size > self.cut_off_limit or \
460 node2.size > self.cut_off_limit:
461 c.cur_diff = ''
462 c.big_diff = True
463
245 else:
464 else:
465 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
466 format='gitdiff')
246 c.cur_diff = diff.as_html()
467 c.cur_diff = diff.as_html()
247
468
248 if not c.cur_diff:
469 if not c.cur_diff and not c.big_diff:
249 c.no_changes = True
470 c.no_changes = True
250 return render('files/file_diff.html')
471 return render('files/file_diff.html')
251
472
252 def _get_history(self, repo, node, f_path):
473 def _get_node_history(self, cs, f_path):
253 from vcs.nodes import NodeKind
474 changesets = cs.get_file_history(f_path)
254 if not node.kind is NodeKind.FILE:
255 return []
256 changesets = node.history
257 hist_l = []
475 hist_l = []
258
476
259 changesets_group = ([], _("Changesets"))
477 changesets_group = ([], _("Changesets"))
@@ -266,14 +484,24 b' class FilesController(BaseController):'
266
484
267 hist_l.append(changesets_group)
485 hist_l.append(changesets_group)
268
486
269 for name, chs in c.repository_branches.items():
487 for name, chs in c.rhodecode_repo.branches.items():
270 #chs = chs.split(':')[-1]
488 #chs = chs.split(':')[-1]
271 branches_group[0].append((chs, name),)
489 branches_group[0].append((chs, name),)
272 hist_l.append(branches_group)
490 hist_l.append(branches_group)
273
491
274 for name, chs in c.repository_tags.items():
492 for name, chs in c.rhodecode_repo.tags.items():
275 #chs = chs.split(':')[-1]
493 #chs = chs.split(':')[-1]
276 tags_group[0].append((chs, name),)
494 tags_group[0].append((chs, name),)
277 hist_l.append(tags_group)
495 hist_l.append(tags_group)
278
496
279 return hist_l
497 return hist_l
498
499 @jsonify
500 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
501 'repository.admin')
502 def nodelist(self, repo_name, revision, f_path):
503 if request.environ.get('HTTP_X_PARTIAL_XHR'):
504 cs = self.__get_cs_or_redirect(revision, repo_name)
505 _d, _f = self.__get_paths(cs, f_path)
506 return _d + _f
507
@@ -27,13 +27,15 b' import logging'
27 from operator import itemgetter
27 from operator import itemgetter
28
28
29 from pylons import tmpl_context as c, request
29 from pylons import tmpl_context as c, request
30 from paste.httpexceptions import HTTPBadRequest
30
31
31 from rhodecode.lib.auth import LoginRequired
32 from rhodecode.lib.auth import LoginRequired
32 from rhodecode.lib.base import BaseController, render
33 from rhodecode.lib.base import BaseController, render
33 from rhodecode.model.scm import ScmModel
34 from rhodecode.model.db import Group, Repository
34
35
35 log = logging.getLogger(__name__)
36 log = logging.getLogger(__name__)
36
37
38
37 class HomeController(BaseController):
39 class HomeController(BaseController):
38
40
39 @LoginRequired()
41 @LoginRequired()
@@ -41,24 +43,18 b' class HomeController(BaseController):'
41 super(HomeController, self).__before__()
43 super(HomeController, self).__before__()
42
44
43 def index(self):
45 def index(self):
44 sortables = ['name', 'description', 'last_change', 'tip', 'owner']
45 current_sort = request.GET.get('sort', 'name')
46 current_sort_slug = current_sort.replace('-', '')
47
46
48 if current_sort_slug not in sortables:
47 c.repos_list = self.scm_model.get_repos()
49 c.sort_by = 'name'
50 current_sort_slug = c.sort_by
51 else:
52 c.sort_by = current_sort
53 c.sort_slug = current_sort_slug
54 cached_repo_list = ScmModel().get_repos()
55
48
56 sort_key = current_sort_slug + '_sort'
49 c.groups = Group.query().filter(Group.group_parent_id == None).all()
57 if c.sort_by.startswith('-'):
58 c.repos_list = sorted(cached_repo_list, key=itemgetter(sort_key),
59 reverse=True)
60 else:
61 c.repos_list = sorted(cached_repo_list, key=itemgetter(sort_key),
62 reverse=False)
63
50
64 return render('/index.html')
51 return render('/index.html')
52
53 def repo_switcher(self):
54 if request.is_xhr:
55 all_repos = Repository.query().order_by(Repository.repo_name).all()
56 c.repos_list = self.scm_model.get_repos(all_repos,
57 sort_key='name_sort')
58 return render('/repo_switcher_list.html')
59 else:
60 return HTTPBadRequest()
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Journal controller for pylons
6 Journal controller for pylons
7
7
8 :created_on: Nov 21, 2010
8 :created_on: Nov 21, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -22,77 +22,209 b''
22 #
22 #
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
26 import logging
25 import logging
27 import traceback
28
29 from pylons import request, response, session, tmpl_context as c, url
30 from paste.httpexceptions import HTTPInternalServerError, HTTPBadRequest
31
26
32 from sqlalchemy import or_
27 from sqlalchemy import or_
28 from sqlalchemy.orm import joinedload, make_transient
29 from webhelpers.paginate import Page
30 from itertools import groupby
33
31
32 from paste.httpexceptions import HTTPBadRequest
33 from pylons import request, tmpl_context as c, response, url
34 from pylons.i18n.translation import _
35 from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed
36
37 import rhodecode.lib.helpers as h
34 from rhodecode.lib.auth import LoginRequired, NotAnonymous
38 from rhodecode.lib.auth import LoginRequired, NotAnonymous
35 from rhodecode.lib.base import BaseController, render
39 from rhodecode.lib.base import BaseController, render
36 from rhodecode.lib.helpers import get_token
37 from rhodecode.model.db import UserLog, UserFollowing
40 from rhodecode.model.db import UserLog, UserFollowing
38 from rhodecode.model.scm import ScmModel
39
41
40 log = logging.getLogger(__name__)
42 log = logging.getLogger(__name__)
41
43
44
42 class JournalController(BaseController):
45 class JournalController(BaseController):
43
46
47 def __before__(self):
48 super(JournalController, self).__before__()
49 self.rhodecode_user = self.rhodecode_user
50 self.title = _('%s public journal %s feed') % (c.rhodecode_name, '%s')
51 self.language = 'en-us'
52 self.ttl = "5"
53 self.feed_nr = 20
44
54
45 @LoginRequired()
55 @LoginRequired()
46 @NotAnonymous()
56 @NotAnonymous()
47 def __before__(self):
48 super(JournalController, self).__before__()
49
50 def index(self):
57 def index(self):
51 # Return a rendered template
58 # Return a rendered template
59 p = int(request.params.get('page', 1))
52
60
53 c.following = self.sa.query(UserFollowing)\
61 c.following = self.sa.query(UserFollowing)\
54 .filter(UserFollowing.user_id == c.rhodecode_user.user_id).all()
62 .filter(UserFollowing.user_id == self.rhodecode_user.user_id)\
63 .options(joinedload(UserFollowing.follows_repository))\
64 .all()
65
66 journal = self._get_journal_data(c.following)
67
68 c.journal_pager = Page(journal, page=p, items_per_page=20)
69
70 c.journal_day_aggreagate = self._get_daily_aggregate(c.journal_pager)
71
72 c.journal_data = render('journal/journal_data.html')
73 if request.environ.get('HTTP_X_PARTIAL_XHR'):
74 return c.journal_data
75 return render('journal/journal.html')
55
76
56 repo_ids = [x.follows_repository.repo_id for x in c.following
77 def _get_daily_aggregate(self, journal):
78 groups = []
79 for k, g in groupby(journal, lambda x: x.action_as_day):
80 user_group = []
81 for k2, g2 in groupby(list(g), lambda x: x.user.email):
82 l = list(g2)
83 user_group.append((l[0].user, l))
84
85 groups.append((k, user_group,))
86
87 return groups
88
89 def _get_journal_data(self, following_repos):
90 repo_ids = [x.follows_repository.repo_id for x in following_repos
57 if x.follows_repository is not None]
91 if x.follows_repository is not None]
58 user_ids = [x.follows_user.user_id for x in c.following
92 user_ids = [x.follows_user.user_id for x in following_repos
59 if x.follows_user is not None]
93 if x.follows_user is not None]
60
94
61 c.journal = self.sa.query(UserLog)\
95 filtering_criterion = None
62 .filter(or_(
63 UserLog.repository_id.in_(repo_ids),
64 UserLog.user_id.in_(user_ids),
65 ))\
66 .order_by(UserLog.action_date.desc())\
67 .limit(20)\
68 .all()
69 return render('/journal.html')
70
96
71 def toggle_following(self):
97 if repo_ids and user_ids:
98 filtering_criterion = or_(UserLog.repository_id.in_(repo_ids),
99 UserLog.user_id.in_(user_ids))
100 if repo_ids and not user_ids:
101 filtering_criterion = UserLog.repository_id.in_(repo_ids)
102 if not repo_ids and user_ids:
103 filtering_criterion = UserLog.user_id.in_(user_ids)
104 if filtering_criterion is not None:
105 journal = self.sa.query(UserLog)\
106 .options(joinedload(UserLog.user))\
107 .options(joinedload(UserLog.repository))\
108 .filter(filtering_criterion)\
109 .order_by(UserLog.action_date.desc())
110 else:
111 journal = []
72
112
73 if request.POST.get('auth_token') == get_token():
113 return journal
74 scm_model = ScmModel()
114
115 @LoginRequired()
116 @NotAnonymous()
117 def toggle_following(self):
118 cur_token = request.POST.get('auth_token')
119 token = h.get_token()
120 if cur_token == token:
75
121
76 user_id = request.POST.get('follows_user_id')
122 user_id = request.POST.get('follows_user_id')
77 if user_id:
123 if user_id:
78 try:
124 try:
79 scm_model.toggle_following_user(user_id,
125 self.scm_model.toggle_following_user(user_id,
80 c.rhodecode_user.user_id)
126 self.rhodecode_user.user_id)
81 return 'ok'
127 return 'ok'
82 except:
128 except:
83 log.error(traceback.format_exc())
129 raise HTTPBadRequest()
84 raise HTTPInternalServerError()
85
130
86 repo_id = request.POST.get('follows_repo_id')
131 repo_id = request.POST.get('follows_repo_id')
87 if repo_id:
132 if repo_id:
88 try:
133 try:
89 scm_model.toggle_following_repo(repo_id,
134 self.scm_model.toggle_following_repo(repo_id,
90 c.rhodecode_user.user_id)
135 self.rhodecode_user.user_id)
91 return 'ok'
136 return 'ok'
92 except:
137 except:
93 log.error(traceback.format_exc())
138 raise HTTPBadRequest()
94 raise HTTPInternalServerError()
139
140 log.debug('token mismatch %s vs %s', cur_token, token)
141 raise HTTPBadRequest()
142
143 @LoginRequired()
144 def public_journal(self):
145 # Return a rendered template
146 p = int(request.params.get('page', 1))
147
148 c.following = self.sa.query(UserFollowing)\
149 .filter(UserFollowing.user_id == self.rhodecode_user.user_id)\
150 .options(joinedload(UserFollowing.follows_repository))\
151 .all()
152
153 journal = self._get_journal_data(c.following)
154
155 c.journal_pager = Page(journal, page=p, items_per_page=20)
156
157 c.journal_day_aggreagate = self._get_daily_aggregate(c.journal_pager)
158
159 c.journal_data = render('journal/journal_data.html')
160 if request.environ.get('HTTP_X_PARTIAL_XHR'):
161 return c.journal_data
162 return render('journal/public_journal.html')
163
164 @LoginRequired(api_access=True)
165 def public_journal_atom(self):
166 """
167 Produce an atom-1.0 feed via feedgenerator module
168 """
169 c.following = self.sa.query(UserFollowing)\
170 .filter(UserFollowing.user_id == self.rhodecode_user.user_id)\
171 .options(joinedload(UserFollowing.follows_repository))\
172 .all()
173
174 journal = self._get_journal_data(c.following)
175
176 feed = Atom1Feed(title=self.title % 'atom',
177 link=url('public_journal_atom', qualified=True),
178 description=_('Public journal'),
179 language=self.language,
180 ttl=self.ttl)
95
181
182 for entry in journal[:self.feed_nr]:
183 #tmpl = h.action_parser(entry)[0]
184 action, action_extra = h.action_parser(entry, feed=True)
185 title = "%s - %s %s" % (entry.user.short_contact, action,
186 entry.repository.repo_name)
187 desc = action_extra()
188 feed.add_item(title=title,
189 pubdate=entry.action_date,
190 link=url('', qualified=True),
191 author_email=entry.user.email,
192 author_name=entry.user.full_contact,
193 description=desc)
96
194
195 response.content_type = feed.mime_type
196 return feed.writeString('utf-8')
97
197
98 raise HTTPBadRequest()
198 @LoginRequired(api_access=True)
199 def public_journal_rss(self):
200 """
201 Produce an rss2 feed via feedgenerator module
202 """
203 c.following = self.sa.query(UserFollowing)\
204 .filter(UserFollowing.user_id == self.rhodecode_user.user_id)\
205 .options(joinedload(UserFollowing.follows_repository))\
206 .all()
207
208 journal = self._get_journal_data(c.following)
209
210 feed = Rss201rev2Feed(title=self.title % 'rss',
211 link=url('public_journal_rss', qualified=True),
212 description=_('Public journal'),
213 language=self.language,
214 ttl=self.ttl)
215
216 for entry in journal[:self.feed_nr]:
217 #tmpl = h.action_parser(entry)[0]
218 action, action_extra = h.action_parser(entry, feed=True)
219 title = "%s - %s %s" % (entry.user.short_contact, action,
220 entry.repository.repo_name)
221 desc = action_extra()
222 feed.add_item(title=title,
223 pubdate=entry.action_date,
224 link=url('', qualified=True),
225 author_email=entry.user.email,
226 author_name=entry.user.full_contact,
227 description=desc)
228
229 response.content_type = feed.mime_type
230 return feed.writeString('utf-8')
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Login controller for rhodeocode
6 Login controller for rhodeocode
7
7
8 :created_on: Apr 22, 2010
8 :created_on: Apr 22, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -35,12 +35,14 b' from pylons import request, response, se'
35 import rhodecode.lib.helpers as h
35 import rhodecode.lib.helpers as h
36 from rhodecode.lib.auth import AuthUser, HasPermissionAnyDecorator
36 from rhodecode.lib.auth import AuthUser, HasPermissionAnyDecorator
37 from rhodecode.lib.base import BaseController, render
37 from rhodecode.lib.base import BaseController, render
38 from rhodecode.model.db import User
38 from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
39 from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
39 from rhodecode.model.user import UserModel
40 from rhodecode.model.user import UserModel
40
41
41
42
42 log = logging.getLogger(__name__)
43 log = logging.getLogger(__name__)
43
44
45
44 class LoginController(BaseController):
46 class LoginController(BaseController):
45
47
46 def __before__(self):
48 def __before__(self):
@@ -50,8 +52,8 b' class LoginController(BaseController):'
50 #redirect if already logged in
52 #redirect if already logged in
51 c.came_from = request.GET.get('came_from', None)
53 c.came_from = request.GET.get('came_from', None)
52
54
53 if c.rhodecode_user.is_authenticated \
55 if self.rhodecode_user.is_authenticated \
54 and c.rhodecode_user.username != 'default':
56 and self.rhodecode_user.username != 'default':
55
57
56 return redirect(url('home'))
58 return redirect(url('home'))
57
59
@@ -60,19 +62,17 b' class LoginController(BaseController):'
60 login_form = LoginForm()
62 login_form = LoginForm()
61 try:
63 try:
62 c.form_result = login_form.to_python(dict(request.POST))
64 c.form_result = login_form.to_python(dict(request.POST))
65 #form checks for username/password, now we're authenticated
63 username = c.form_result['username']
66 username = c.form_result['username']
64 user = UserModel().get_by_username(username, case_insensitive=True)
67 user = User.by_username(username,
65 auth_user = AuthUser()
68 case_insensitive=True)
66 auth_user.username = user.username
69 auth_user = AuthUser(user.user_id)
67 auth_user.is_authenticated = True
70 auth_user.set_authenticated()
68 auth_user.is_admin = user.admin
69 auth_user.user_id = user.user_id
70 auth_user.name = user.name
71 auth_user.lastname = user.lastname
72 session['rhodecode_user'] = auth_user
71 session['rhodecode_user'] = auth_user
73 session.save()
72 session.save()
74 log.info('user %s is now authenticated', username)
75
73
74 log.info('user %s is now authenticated and stored in session',
75 username)
76 user.update_lastlogin()
76 user.update_lastlogin()
77
77
78 if c.came_from:
78 if c.came_from:
@@ -95,7 +95,8 b' class LoginController(BaseController):'
95 def register(self):
95 def register(self):
96 user_model = UserModel()
96 user_model = UserModel()
97 c.auto_active = False
97 c.auto_active = False
98 for perm in user_model.get_by_username('default', cache=False).user_perms:
98 for perm in user_model.get_by_username('default',
99 cache=False).user_perms:
99 if perm.permission.permission_name == 'hg.register.auto_activate':
100 if perm.permission.permission_name == 'hg.register.auto_activate':
100 c.auto_active = True
101 c.auto_active = True
101 break
102 break
@@ -128,8 +129,8 b' class LoginController(BaseController):'
128 password_reset_form = PasswordResetForm()()
129 password_reset_form = PasswordResetForm()()
129 try:
130 try:
130 form_result = password_reset_form.to_python(dict(request.POST))
131 form_result = password_reset_form.to_python(dict(request.POST))
131 user_model.reset_password(form_result)
132 user_model.reset_password_link(form_result)
132 h.flash(_('Your new password was sent'),
133 h.flash(_('Your password reset link was sent'),
133 category='success')
134 category='success')
134 return redirect(url('login_home'))
135 return redirect(url('login_home'))
135
136
@@ -143,8 +144,25 b' class LoginController(BaseController):'
143
144
144 return render('/password_reset.html')
145 return render('/password_reset.html')
145
146
147 def password_reset_confirmation(self):
148
149 if request.GET and request.GET.get('key'):
150 try:
151 user_model = UserModel()
152 user = User.get_by_api_key(request.GET.get('key'))
153 data = dict(email=user.email)
154 user_model.reset_password(data)
155 h.flash(_('Your password reset was successful, '
156 'new password has been sent to your email'),
157 category='success')
158 except Exception, e:
159 log.error(e)
160 return redirect(url('reset_password'))
161
162 return redirect(url('login_home'))
163
146 def logout(self):
164 def logout(self):
147 session['rhodecode_user'] = AuthUser()
165 del session['rhodecode_user']
148 session.save()
166 session.save()
149 log.info('Logging out and setting user as Empty')
167 log.info('Logging out and setting user as Empty')
150 redirect(url('home'))
168 redirect(url('home'))
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Search controller for rhodecode
6 Search controller for rhodecode
7
7
8 :created_on: Aug 7, 2010
8 :created_on: Aug 7, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -26,8 +26,7 b' import logging'
26 import traceback
26 import traceback
27
27
28 from pylons.i18n.translation import _
28 from pylons.i18n.translation import _
29 from pylons import request, response, config, session, tmpl_context as c, url
29 from pylons import request, config, session, tmpl_context as c
30 from pylons.controllers.util import abort, redirect
31
30
32 from rhodecode.lib.auth import LoginRequired
31 from rhodecode.lib.auth import LoginRequired
33 from rhodecode.lib.base import BaseController, render
32 from rhodecode.lib.base import BaseController, render
@@ -38,10 +37,11 b' from webhelpers.util import update_param'
38
37
39 from whoosh.index import open_dir, EmptyIndexError
38 from whoosh.index import open_dir, EmptyIndexError
40 from whoosh.qparser import QueryParser, QueryParserError
39 from whoosh.qparser import QueryParser, QueryParserError
41 from whoosh.query import Phrase
40 from whoosh.query import Phrase, Wildcard, Term, Prefix
42
41
43 log = logging.getLogger(__name__)
42 log = logging.getLogger(__name__)
44
43
44
45 class SearchController(BaseController):
45 class SearchController(BaseController):
46
46
47 @LoginRequired()
47 @LoginRequired()
@@ -54,13 +54,12 b' class SearchController(BaseController):'
54 c.runtime = ''
54 c.runtime = ''
55 c.cur_query = request.GET.get('q', None)
55 c.cur_query = request.GET.get('q', None)
56 c.cur_type = request.GET.get('type', 'source')
56 c.cur_type = request.GET.get('type', 'source')
57 c.cur_search = search_type = {'content':'content',
57 c.cur_search = search_type = {'content': 'content',
58 'commit':'content',
58 'commit': 'content',
59 'path':'path',
59 'path': 'path',
60 'repository':'repository'}\
60 'repository': 'repository'}\
61 .get(c.cur_type, 'content')
61 .get(c.cur_type, 'content')
62
62
63
64 if c.cur_query:
63 if c.cur_query:
65 cur_query = c.cur_query.lower()
64 cur_query = c.cur_query.lower()
66
65
@@ -68,8 +67,8 b' class SearchController(BaseController):'
68 p = int(request.params.get('page', 1))
67 p = int(request.params.get('page', 1))
69 highlight_items = set()
68 highlight_items = set()
70 try:
69 try:
71 idx = open_dir(config['app_conf']['index_dir']
70 idx = open_dir(config['app_conf']['index_dir'],
72 , indexname=IDX_NAME)
71 indexname=IDX_NAME)
73 searcher = idx.searcher()
72 searcher = idx.searcher()
74
73
75 qp = QueryParser(search_type, schema=SCHEMA)
74 qp = QueryParser(search_type, schema=SCHEMA)
@@ -80,6 +79,8 b' class SearchController(BaseController):'
80
79
81 if isinstance(query, Phrase):
80 if isinstance(query, Phrase):
82 highlight_items.update(query.words)
81 highlight_items.update(query.words)
82 elif isinstance(query, Prefix):
83 highlight_items.add(query.text)
83 else:
84 else:
84 for i in query.all_terms():
85 for i in query.all_terms():
85 if i[0] == 'content':
86 if i[0] == 'content':
@@ -104,7 +105,6 b' class SearchController(BaseController):'
104 page=p, item_count=res_ln,
105 page=p, item_count=res_ln,
105 items_per_page=10, url=url_generator)
106 items_per_page=10, url=url_generator)
106
107
107
108 except QueryParserError:
108 except QueryParserError:
109 c.runtime = _('Invalid search query. Try quoting it.')
109 c.runtime = _('Invalid search query. Try quoting it.')
110 searcher.close()
110 searcher.close()
@@ -113,6 +113,9 b' class SearchController(BaseController):'
113 log.error('Empty Index data')
113 log.error('Empty Index data')
114 c.runtime = _('There is no index to search in. '
114 c.runtime = _('There is no index to search in. '
115 'Please run whoosh indexer')
115 'Please run whoosh indexer')
116 except (Exception):
117 log.error(traceback.format_exc())
118 c.runtime = _('An error occurred during this search operation')
116
119
117 # Return a rendered template
120 # Return a rendered template
118 return render('/search/search.html')
121 return render('/search/search.html')
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Settings controller for rhodecode
6 Settings controller for rhodecode
7
7
8 :created_on: Jun 30, 2010
8 :created_on: Jun 30, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -34,16 +34,20 b' from pylons.controllers.util import redi'
34 from pylons.i18n.translation import _
34 from pylons.i18n.translation import _
35
35
36 import rhodecode.lib.helpers as h
36 import rhodecode.lib.helpers as h
37
37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAllDecorator, \
38 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAllDecorator, \
38 HasRepoPermissionAnyDecorator, NotAnonymous
39 HasRepoPermissionAnyDecorator, NotAnonymous
39 from rhodecode.lib.base import BaseController, render
40 from rhodecode.lib.base import BaseRepoController, render
40 from rhodecode.lib.utils import invalidate_cache, action_logger
41 from rhodecode.lib.utils import invalidate_cache, action_logger
42
41 from rhodecode.model.forms import RepoSettingsForm, RepoForkForm
43 from rhodecode.model.forms import RepoSettingsForm, RepoForkForm
42 from rhodecode.model.repo import RepoModel
44 from rhodecode.model.repo import RepoModel
45 from rhodecode.model.db import User
43
46
44 log = logging.getLogger(__name__)
47 log = logging.getLogger(__name__)
45
48
46 class SettingsController(BaseController):
49
50 class SettingsController(BaseRepoController):
47
51
48 @LoginRequired()
52 @LoginRequired()
49 def __before__(self):
53 def __before__(self):
@@ -61,12 +65,28 b' class SettingsController(BaseController)'
61 category='error')
65 category='error')
62
66
63 return redirect(url('home'))
67 return redirect(url('home'))
64 defaults = c.repo_info.get_dict()
68
65 defaults.update({'user':c.repo_info.user.username})
66 c.users_array = repo_model.get_users_js()
69 c.users_array = repo_model.get_users_js()
70 c.users_groups_array = repo_model.get_users_groups_js()
67
71
72 defaults = c.repo_info.get_dict()
73
74 #fill owner
75 if c.repo_info.user:
76 defaults.update({'user': c.repo_info.user.username})
77 else:
78 replacement_user = self.sa.query(User)\
79 .filter(User.admin == True).first().username
80 defaults.update({'user': replacement_user})
81
82 #fill repository users
68 for p in c.repo_info.repo_to_perm:
83 for p in c.repo_info.repo_to_perm:
69 defaults.update({'perm_%s' % p.user.username:
84 defaults.update({'u_perm_%s' % p.user.username:
85 p.permission.permission_name})
86
87 #fill repository groups
88 for p in c.repo_info.users_group_to_perm:
89 defaults.update({'g_perm_%s' % p.users_group.users_group_name:
70 p.permission.permission_name})
90 p.permission.permission_name})
71
91
72 return htmlfill.render(
92 return htmlfill.render(
@@ -80,7 +100,8 b' class SettingsController(BaseController)'
80 def update(self, repo_name):
100 def update(self, repo_name):
81 repo_model = RepoModel()
101 repo_model = RepoModel()
82 changed_name = repo_name
102 changed_name = repo_name
83 _form = RepoSettingsForm(edit=True, old_data={'repo_name':repo_name})()
103 _form = RepoSettingsForm(edit=True,
104 old_data={'repo_name': repo_name})()
84 try:
105 try:
85 form_result = _form.to_python(dict(request.POST))
106 form_result = _form.to_python(dict(request.POST))
86 repo_model.update(repo_name, form_result)
107 repo_model.update(repo_name, form_result)
@@ -93,7 +114,7 b' class SettingsController(BaseController)'
93 except formencode.Invalid, errors:
114 except formencode.Invalid, errors:
94 c.repo_info = repo_model.get_by_repo_name(repo_name)
115 c.repo_info = repo_model.get_by_repo_name(repo_name)
95 c.users_array = repo_model.get_users_js()
116 c.users_array = repo_model.get_users_js()
96 errors.value.update({'user':c.repo_info.user.username})
117 errors.value.update({'user': c.repo_info.user.username})
97 return htmlfill.render(
118 return htmlfill.render(
98 render('settings/repo_settings.html'),
119 render('settings/repo_settings.html'),
99 defaults=errors.value,
120 defaults=errors.value,
@@ -107,7 +128,6 b' class SettingsController(BaseController)'
107
128
108 return redirect(url('repo_settings_home', repo_name=changed_name))
129 return redirect(url('repo_settings_home', repo_name=changed_name))
109
130
110
111 @HasRepoPermissionAllDecorator('repository.admin')
131 @HasRepoPermissionAllDecorator('repository.admin')
112 def delete(self, repo_name):
132 def delete(self, repo_name):
113 """DELETE /repos/repo_name: Delete an existing item"""
133 """DELETE /repos/repo_name: Delete an existing item"""
@@ -135,6 +155,7 b' class SettingsController(BaseController)'
135 invalidate_cache('get_repo_cached_%s' % repo_name)
155 invalidate_cache('get_repo_cached_%s' % repo_name)
136 h.flash(_('deleted repository %s') % repo_name, category='success')
156 h.flash(_('deleted repository %s') % repo_name, category='success')
137 except Exception:
157 except Exception:
158 log.error(traceback.format_exc())
138 h.flash(_('An error occurred during deletion of %s') % repo_name,
159 h.flash(_('An error occurred during deletion of %s') % repo_name,
139 category='error')
160 category='error')
140
161
@@ -163,12 +184,12 b' class SettingsController(BaseController)'
163 def fork_create(self, repo_name):
184 def fork_create(self, repo_name):
164 repo_model = RepoModel()
185 repo_model = RepoModel()
165 c.repo_info = repo_model.get_by_repo_name(repo_name)
186 c.repo_info = repo_model.get_by_repo_name(repo_name)
166 _form = RepoForkForm(old_data={'repo_type':c.repo_info.repo_type})()
187 _form = RepoForkForm(old_data={'repo_type': c.repo_info.repo_type})()
167 form_result = {}
188 form_result = {}
168 try:
189 try:
169 form_result = _form.to_python(dict(request.POST))
190 form_result = _form.to_python(dict(request.POST))
170 form_result.update({'repo_name':repo_name})
191 form_result.update({'repo_name': repo_name})
171 repo_model.create_fork(form_result, c.rhodecode_user)
192 repo_model.create_fork(form_result, self.rhodecode_user)
172 h.flash(_('forked %s repository as %s') \
193 h.flash(_('forked %s repository as %s') \
173 % (repo_name, form_result['fork_name']),
194 % (repo_name, form_result['fork_name']),
174 category='success')
195 category='success')
@@ -185,4 +206,9 b' class SettingsController(BaseController)'
185 errors=errors.error_dict or {},
206 errors=errors.error_dict or {},
186 prefix_error=False,
207 prefix_error=False,
187 encoding="UTF-8")
208 encoding="UTF-8")
209 except Exception:
210 log.error(traceback.format_exc())
211 h.flash(_('An error occurred during repository forking %s') %
212 repo_name, category='error')
213
188 return redirect(url('home'))
214 return redirect(url('home'))
@@ -27,15 +27,14 b' import logging'
27
27
28 from pylons import tmpl_context as c, request, url
28 from pylons import tmpl_context as c, request, url
29
29
30 from webhelpers.paginate import Page
31
32 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
30 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
33 from rhodecode.lib.base import BaseController, render
31 from rhodecode.lib.base import BaseRepoController, render
34 from rhodecode.model.scm import ScmModel
32 from rhodecode.lib.helpers import RepoPage
35
33
36 log = logging.getLogger(__name__)
34 log = logging.getLogger(__name__)
37
35
38 class ShortlogController(BaseController):
36
37 class ShortlogController(BaseRepoController):
39
38
40 @LoginRequired()
39 @LoginRequired()
41 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
40 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
@@ -47,15 +46,14 b' class ShortlogController(BaseController)'
47 p = int(request.params.get('page', 1))
46 p = int(request.params.get('page', 1))
48 size = int(request.params.get('size', 20))
47 size = int(request.params.get('size', 20))
49
48
50 print repo_name
51 def url_generator(**kw):
49 def url_generator(**kw):
52 return url('shortlog_home', repo_name=repo_name, size=size, **kw)
50 return url('shortlog_home', repo_name=repo_name, size=size, **kw)
53
51
54 repo = ScmModel().get_repo(c.repo_name)
52 c.repo_changesets = RepoPage(c.rhodecode_repo, page=p,
55 c.repo_changesets = Page(repo, page=p, items_per_page=size,
53 items_per_page=size,
56 url=url_generator)
54 url=url_generator)
57 c.shortlog_data = render('shortlog/shortlog_data.html')
55 c.shortlog_data = render('shortlog/shortlog_data.html')
58 if request.params.get('partial'):
56 if request.environ.get('HTTP_X_PARTIAL_XHR'):
59 return c.shortlog_data
57 return c.shortlog_data
60 r = render('shortlog/shortlog.html')
58 r = render('shortlog/shortlog.html')
61 return r
59 return r
@@ -7,7 +7,7 b''
7
7
8 :created_on: Apr 18, 2010
8 :created_on: Apr 18, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -33,26 +33,29 b' from vcs.exceptions import ChangesetErro'
33 from pylons import tmpl_context as c, request, url
33 from pylons import tmpl_context as c, request, url
34 from pylons.i18n.translation import _
34 from pylons.i18n.translation import _
35
35
36 from rhodecode.model.scm import ScmModel
36 from rhodecode.model.db import Statistics, Repository
37 from rhodecode.model.db import Statistics
37 from rhodecode.model.repo import RepoModel
38
38
39 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
39 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
40 from rhodecode.lib.base import BaseController, render
40 from rhodecode.lib.base import BaseRepoController, render
41 from rhodecode.lib.utils import OrderedDict, EmptyChangeset
41 from rhodecode.lib.utils import EmptyChangeset
42 from rhodecode.lib.odict import OrderedDict
42
43
43 from rhodecode.lib.celerylib import run_task
44 from rhodecode.lib.celerylib import run_task
44 from rhodecode.lib.celerylib.tasks import get_commits_stats
45 from rhodecode.lib.celerylib.tasks import get_commits_stats, \
45
46 LANGUAGES_EXTENSIONS_MAP
46 from webhelpers.paginate import Page
47 from rhodecode.lib.helpers import RepoPage
47
48
48 try:
49 try:
49 import json
50 import json
50 except ImportError:
51 except ImportError:
51 #python 2.5 compatibility
52 #python 2.5 compatibility
52 import simplejson as json
53 import simplejson as json
54
53 log = logging.getLogger(__name__)
55 log = logging.getLogger(__name__)
54
56
55 class SummaryController(BaseController):
57
58 class SummaryController(BaseRepoController):
56
59
57 @LoginRequired()
60 @LoginRequired()
58 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
61 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
@@ -61,42 +64,51 b' class SummaryController(BaseController):'
61 super(SummaryController, self).__before__()
64 super(SummaryController, self).__before__()
62
65
63 def index(self, repo_name):
66 def index(self, repo_name):
64 scm_model = ScmModel()
67
65 c.repo_info = scm_model.get_repo(c.repo_name)
68 e = request.environ
66 c.following = scm_model.is_following_repo(c.repo_name,
69 c.dbrepo = dbrepo = c.rhodecode_db_repo
67 c.rhodecode_user.user_id)
70
71 c.following = self.scm_model.is_following_repo(repo_name,
72 self.rhodecode_user.user_id)
73
68 def url_generator(**kw):
74 def url_generator(**kw):
69 return url('shortlog_home', repo_name=repo_name, size=10, **kw)
75 return url('shortlog_home', repo_name=repo_name, size=10, **kw)
70
76
71 c.repo_changesets = Page(c.repo_info, page=1,
77 c.repo_changesets = RepoPage(c.rhodecode_repo, page=1,
72 items_per_page=10, url=url_generator)
78 items_per_page=10, url=url_generator)
73
74 e = request.environ
75
79
76 if self.rhodecode_user.username == 'default':
80 if self.rhodecode_user.username == 'default':
77 password = ':default'
81 #for default(anonymous) user we don't need to pass credentials
82 username = ''
83 password = ''
78 else:
84 else:
79 password = ''
85 username = str(self.rhodecode_user.username)
86 password = '@'
80
87
81 uri = u'%(protocol)s://%(user)s%(password)s@%(host)s%(prefix)s/%(repo_name)s' % {
88 if e.get('wsgi.url_scheme') == 'https':
82 'protocol': e.get('wsgi.url_scheme'),
89 split_s = 'https://'
83 'user':str(c.rhodecode_user.username),
90 else:
84 'password':password,
91 split_s = 'http://'
85 'host':e.get('HTTP_HOST'),
92
86 'prefix':e.get('SCRIPT_NAME'),
93 qualified_uri = [split_s] + [url.current(qualified=True)\
87 'repo_name':c.repo_name, }
94 .split(split_s)[-1]]
95 uri = u'%(proto)s%(user)s%(pass)s%(rest)s' \
96 % {'user': username,
97 'pass': password,
98 'proto': qualified_uri[0],
99 'rest': qualified_uri[1]}
88 c.clone_repo_url = uri
100 c.clone_repo_url = uri
89 c.repo_tags = OrderedDict()
101 c.repo_tags = OrderedDict()
90 for name, hash in c.repo_info.tags.items()[:10]:
102 for name, hash in c.rhodecode_repo.tags.items()[:10]:
91 try:
103 try:
92 c.repo_tags[name] = c.repo_info.get_changeset(hash)
104 c.repo_tags[name] = c.rhodecode_repo.get_changeset(hash)
93 except ChangesetError:
105 except ChangesetError:
94 c.repo_tags[name] = EmptyChangeset(hash)
106 c.repo_tags[name] = EmptyChangeset(hash)
95
107
96 c.repo_branches = OrderedDict()
108 c.repo_branches = OrderedDict()
97 for name, hash in c.repo_info.branches.items()[:10]:
109 for name, hash in c.rhodecode_repo.branches.items()[:10]:
98 try:
110 try:
99 c.repo_branches[name] = c.repo_info.get_changeset(hash)
111 c.repo_branches[name] = c.rhodecode_repo.get_changeset(hash)
100 except ChangesetError:
112 except ChangesetError:
101 c.repo_branches[name] = EmptyChangeset(hash)
113 c.repo_branches[name] = EmptyChangeset(hash)
102
114
@@ -108,34 +120,70 b' class SummaryController(BaseController):'
108 ts_min_y = mktime(td_1y.timetuple())
120 ts_min_y = mktime(td_1y.timetuple())
109 ts_max_y = mktime(td.timetuple())
121 ts_max_y = mktime(td.timetuple())
110
122
111 if c.repo_info.dbrepo.enable_statistics:
123 if dbrepo.enable_statistics:
112 c.no_data_msg = _('No data loaded yet')
124 c.no_data_msg = _('No data loaded yet')
113 run_task(get_commits_stats, c.repo_info.name, ts_min_y, ts_max_y)
125 run_task(get_commits_stats, c.dbrepo.repo_name, ts_min_y, ts_max_y)
114 else:
126 else:
115 c.no_data_msg = _('Statistics update are disabled for this repository')
127 c.no_data_msg = _('Statistics are disabled for this repository')
116 c.ts_min = ts_min_m
128 c.ts_min = ts_min_m
117 c.ts_max = ts_max_y
129 c.ts_max = ts_max_y
118
130
119 stats = self.sa.query(Statistics)\
131 stats = self.sa.query(Statistics)\
120 .filter(Statistics.repository == c.repo_info.dbrepo)\
132 .filter(Statistics.repository == dbrepo)\
121 .scalar()
133 .scalar()
122
134
135 c.stats_percentage = 0
123
136
124 if stats and stats.languages:
137 if stats and stats.languages:
125 c.no_data = False is c.repo_info.dbrepo.enable_statistics
138 c.no_data = False is dbrepo.enable_statistics
126 lang_stats = json.loads(stats.languages)
139 lang_stats_d = json.loads(stats.languages)
127 c.commit_data = stats.commit_activity
140 c.commit_data = stats.commit_activity
128 c.overview_data = stats.commit_activity_combined
141 c.overview_data = stats.commit_activity_combined
142
143 lang_stats = ((x, {"count": y,
144 "desc": LANGUAGES_EXTENSIONS_MAP.get(x)})
145 for x, y in lang_stats_d.items())
146
129 c.trending_languages = json.dumps(OrderedDict(
147 c.trending_languages = json.dumps(OrderedDict(
130 sorted(lang_stats.items(), reverse=True,
148 sorted(lang_stats, reverse=True,
131 key=lambda k: k[1])[:10]
149 key=lambda k: k[1])[:10]
132 )
150 )
133 )
151 )
152 last_rev = stats.stat_on_revision
153 c.repo_last_rev = c.rhodecode_repo.count() - 1 \
154 if c.rhodecode_repo.revisions else 0
155 if last_rev == 0 or c.repo_last_rev == 0:
156 pass
157 else:
158 c.stats_percentage = '%.2f' % ((float((last_rev)) /
159 c.repo_last_rev) * 100)
134 else:
160 else:
135 c.commit_data = json.dumps({})
161 c.commit_data = json.dumps({})
136 c.overview_data = json.dumps([[ts_min_y, 0], [ts_max_y, 10] ])
162 c.overview_data = json.dumps([[ts_min_y, 0], [ts_max_y, 10]])
137 c.trending_languages = json.dumps({})
163 c.trending_languages = json.dumps({})
138 c.no_data = True
164 c.no_data = True
165
166 c.enable_downloads = dbrepo.enable_downloads
167 if c.enable_downloads:
168 c.download_options = self._get_download_links(c.rhodecode_repo)
139
169
140 return render('summary/summary.html')
170 return render('summary/summary.html')
141
171
172 def _get_download_links(self, repo):
173
174 download_l = []
175
176 branches_group = ([], _("Branches"))
177 tags_group = ([], _("Tags"))
178
179 for name, chs in c.rhodecode_repo.branches.items():
180 #chs = chs.split(':')[-1]
181 branches_group[0].append((chs, name),)
182 download_l.append(branches_group)
183
184 for name, chs in c.rhodecode_repo.tags.items():
185 #chs = chs.split(':')[-1]
186 tags_group[0].append((chs, name),)
187 download_l.append(tags_group)
188
189 return download_l
@@ -4,10 +4,10 b''
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Tags controller for rhodecode
6 Tags controller for rhodecode
7
7
8 :created_on: Apr 21, 2010
8 :created_on: Apr 21, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
@@ -27,13 +27,13 b' import logging'
27 from pylons import tmpl_context as c
27 from pylons import tmpl_context as c
28
28
29 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
29 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
30 from rhodecode.lib.base import BaseController, render
30 from rhodecode.lib.base import BaseRepoController, render
31 from rhodecode.lib.utils import OrderedDict
31 from rhodecode.lib.odict import OrderedDict
32 from rhodecode.model.scm import ScmModel
33
32
34 log = logging.getLogger(__name__)
33 log = logging.getLogger(__name__)
35
34
36 class TagsController(BaseController):
35
36 class TagsController(BaseRepoController):
37
37
38 @LoginRequired()
38 @LoginRequired()
39 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
39 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
@@ -42,10 +42,12 b' class TagsController(BaseController):'
42 super(TagsController, self).__before__()
42 super(TagsController, self).__before__()
43
43
44 def index(self):
44 def index(self):
45 hg_model = ScmModel()
46 c.repo_info = hg_model.get_repo(c.repo_name)
47 c.repo_tags = OrderedDict()
45 c.repo_tags = OrderedDict()
48 for name, hash_ in c.repo_info.tags.items():
46
49 c.repo_tags[name] = c.repo_info.get_changeset(hash_)
47 tags = [(name, c.rhodecode_repo.get_changeset(hash_)) for \
48 name, hash_ in c.rhodecode_repo.tags.items()]
49 ordered_tags = sorted(tags, key=lambda x: x[1].date, reverse=True)
50 for name, cs_tag in ordered_tags:
51 c.repo_tags[name] = cs_tag
50
52
51 return render('tags/tags.html')
53 return render('tags/tags.html')
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, (2523 lines changed) Show them Hide them
@@ -7,47 +7,2534 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: 2010-02-06 22:54+0100\n"
10 "POT-Creation-Date: 2011-09-14 15:50-0300\n"
11 "PO-Revision-Date: 2010-02-06 23:16+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"
14 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
14 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
15 "MIME-Version: 1.0\n"
15 "MIME-Version: 1.0\n"
16 "Content-Type: text/plain; charset=utf-8\n"
16 "Content-Type: text/plain; charset=utf-8\n"
17 "Content-Transfer-Encoding: 8bit\n"
17 "Content-Transfer-Encoding: 8bit\n"
18 "Generated-By: Babel 0.9.4\n"
18 "Generated-By: Babel 0.9.6\n"
19
19
20 #: rhodecode/controllers/error.py:34
20 #: rhodecode/controllers/changeset.py:108
21 #: rhodecode/controllers/changeset.py:149
22 #: rhodecode/controllers/changeset.py:216
23 #: rhodecode/controllers/changeset.py:229
24 msgid "binary file"
25 msgstr ""
26
27 #: rhodecode/controllers/changeset.py:123
28 #: rhodecode/controllers/changeset.py:168
29 msgid "Changeset is to big and was cut off, see raw changeset instead"
30 msgstr ""
31
32 #: rhodecode/controllers/changeset.py:159
33 msgid "Diff is to big and was cut off, see raw diff instead"
34 msgstr ""
35
36 #: rhodecode/controllers/error.py:69
21 msgid "Home page"
37 msgid "Home page"
22 msgstr ""
38 msgstr ""
23
39
24 #: rhodecode/controllers/error.py:55
40 #: rhodecode/controllers/error.py:98
25 msgid "The request could not be understood by the server due to malformed syntax."
41 msgid "The request could not be understood by the server due to malformed syntax."
26 msgstr ""
42 msgstr ""
27
43
28 #: rhodecode/controllers/error.py:57
44 #: rhodecode/controllers/error.py:101
29 msgid "Unathorized access to resource"
45 msgid "Unauthorized access to resource"
30 msgstr ""
46 msgstr ""
31
47
32 #: rhodecode/controllers/error.py:59
48 #: rhodecode/controllers/error.py:103
33 msgid "You don't have permission to view this page"
49 msgid "You don't have permission to view this page"
34 msgstr ""
50 msgstr ""
35
51
36 #: rhodecode/controllers/error.py:61
52 #: rhodecode/controllers/error.py:105
37 msgid "The resource could not be found"
53 msgid "The resource could not be found"
38 msgstr ""
54 msgstr ""
39
55
40 #: rhodecode/controllers/error.py:63
56 #: rhodecode/controllers/error.py:107
41 msgid ""
57 msgid ""
42 "The server encountered an unexpected condition which prevented it from "
58 "The server encountered an unexpected condition which prevented it from "
43 "fulfilling the request."
59 "fulfilling the request."
44 msgstr ""
60 msgstr ""
45
61
46 #: rhodecode/model/forms.py:29
62 #: rhodecode/controllers/feed.py:48
63 #, python-format
64 msgid "Changes on %s repository"
65 msgstr ""
66
67 #: rhodecode/controllers/feed.py:49
68 #, python-format
69 msgid "%s %s feed"
70 msgstr ""
71
72 #: rhodecode/controllers/files.py:72
73 msgid "There are no files yet"
74 msgstr ""
75
76 #: rhodecode/controllers/files.py:262
77 #, python-format
78 msgid "Edited %s via RhodeCode"
79 msgstr ""
80
81 #: rhodecode/controllers/files.py:267
82 #: rhodecode/templates/files/file_diff.html:40
83 msgid "No changes"
84 msgstr ""
85
86 #: rhodecode/controllers/files.py:278
87 #, python-format
88 msgid "Successfully committed to %s"
89 msgstr ""
90
91 #: rhodecode/controllers/files.py:283
92 msgid "Error occurred during commit"
93 msgstr ""
94
95 #: rhodecode/controllers/files.py:308
96 msgid "downloads disabled"
97 msgstr ""
98
99 #: rhodecode/controllers/files.py:313
100 #, python-format
101 msgid "Unknown revision %s"
102 msgstr ""
103
104 #: rhodecode/controllers/files.py:315
105 msgid "Empty repository"
106 msgstr ""
107
108 #: rhodecode/controllers/files.py:317
109 msgid "Unknown archive type"
110 msgstr ""
111
112 #: rhodecode/controllers/files.py:385 rhodecode/controllers/files.py:398
113 msgid "Binary file"
114 msgstr ""
115
116 #: rhodecode/controllers/files.py:417
117 #: rhodecode/templates/changeset/changeset_range.html:4
118 #: rhodecode/templates/changeset/changeset_range.html:12
119 #: rhodecode/templates/changeset/changeset_range.html:29
120 msgid "Changesets"
121 msgstr ""
122
123 #: rhodecode/controllers/files.py:418 rhodecode/controllers/summary.py:175
124 #: rhodecode/templates/branches/branches.html:5
125 #: rhodecode/templates/summary/summary.html:690
126 msgid "Branches"
127 msgstr ""
128
129 #: rhodecode/controllers/files.py:419 rhodecode/controllers/summary.py:176
130 #: rhodecode/templates/summary/summary.html:679
131 #: rhodecode/templates/tags/tags.html:5
132 msgid "Tags"
133 msgstr ""
134
135 #: rhodecode/controllers/journal.py:50
136 #, python-format
137 msgid "%s public journal %s feed"
138 msgstr ""
139
140 #: rhodecode/controllers/journal.py:178 rhodecode/controllers/journal.py:212
141 #: rhodecode/templates/admin/repos/repo_edit.html:171
142 #: rhodecode/templates/base/base.html:50
143 msgid "Public journal"
144 msgstr ""
145
146 #: rhodecode/controllers/login.py:111
147 msgid "You have successfully registered into rhodecode"
148 msgstr ""
149
150 #: rhodecode/controllers/login.py:133
151 msgid "Your password reset link was sent"
152 msgstr ""
153
154 #: rhodecode/controllers/login.py:155
155 msgid ""
156 "Your password reset was successful, new password has been sent to your "
157 "email"
158 msgstr ""
159
160 #: rhodecode/controllers/search.py:109
161 msgid "Invalid search query. Try quoting it."
162 msgstr ""
163
164 #: rhodecode/controllers/search.py:114
165 msgid "There is no index to search in. Please run whoosh indexer"
166 msgstr ""
167
168 #: rhodecode/controllers/search.py:118
169 msgid "An error occurred during this search operation"
170 msgstr ""
171
172 #: rhodecode/controllers/settings.py:61 rhodecode/controllers/settings.py:171
173 #, python-format
174 msgid ""
175 "%s repository is not mapped to db perhaps it was created or renamed from "
176 "the file system please run the application again in order to rescan "
177 "repositories"
178 msgstr ""
179
180 #: rhodecode/controllers/settings.py:109
181 #: rhodecode/controllers/admin/repos.py:239
182 #, python-format
183 msgid "Repository %s updated successfully"
184 msgstr ""
185
186 #: rhodecode/controllers/settings.py:126
187 #: rhodecode/controllers/admin/repos.py:257
188 #, python-format
189 msgid "error occurred during update of repository %s"
190 msgstr ""
191
192 #: rhodecode/controllers/settings.py:144
193 #: rhodecode/controllers/admin/repos.py:275
194 #, python-format
195 msgid ""
196 "%s repository is not mapped to db perhaps it was moved or renamed from "
197 "the filesystem please run the application again in order to rescan "
198 "repositories"
199 msgstr ""
200
201 #: rhodecode/controllers/settings.py:156
202 #: rhodecode/controllers/admin/repos.py:287
203 #, python-format
204 msgid "deleted repository %s"
205 msgstr ""
206
207 #: rhodecode/controllers/settings.py:159
208 #: rhodecode/controllers/admin/repos.py:297
209 #: rhodecode/controllers/admin/repos.py:303
210 #, python-format
211 msgid "An error occurred during deletion of %s"
212 msgstr ""
213
214 #: rhodecode/controllers/settings.py:193
215 #, python-format
216 msgid "forked %s repository as %s"
217 msgstr ""
218
219 #: rhodecode/controllers/settings.py:211
220 #, python-format
221 msgid "An error occurred during repository forking %s"
222 msgstr ""
223
224 #: rhodecode/controllers/summary.py:123
225 msgid "No data loaded yet"
226 msgstr ""
227
228 #: rhodecode/controllers/summary.py:126
229 msgid "Statistics are disabled for this repository"
230 msgstr ""
231
232 #: rhodecode/controllers/admin/ldap_settings.py:49
233 msgid "BASE"
234 msgstr ""
235
236 #: rhodecode/controllers/admin/ldap_settings.py:50
237 msgid "ONELEVEL"
238 msgstr ""
239
240 #: rhodecode/controllers/admin/ldap_settings.py:51
241 msgid "SUBTREE"
242 msgstr ""
243
244 #: rhodecode/controllers/admin/ldap_settings.py:55
245 msgid "NEVER"
246 msgstr ""
247
248 #: rhodecode/controllers/admin/ldap_settings.py:56
249 msgid "ALLOW"
250 msgstr ""
251
252 #: rhodecode/controllers/admin/ldap_settings.py:57
253 msgid "TRY"
254 msgstr ""
255
256 #: rhodecode/controllers/admin/ldap_settings.py:58
257 msgid "DEMAND"
258 msgstr ""
259
260 #: rhodecode/controllers/admin/ldap_settings.py:59
261 msgid "HARD"
262 msgstr ""
263
264 #: rhodecode/controllers/admin/ldap_settings.py:63
265 msgid "No encryption"
266 msgstr ""
267
268 #: rhodecode/controllers/admin/ldap_settings.py:64
269 msgid "LDAPS connection"
270 msgstr ""
271
272 #: rhodecode/controllers/admin/ldap_settings.py:65
273 msgid "START_TLS on LDAP connection"
274 msgstr ""
275
276 #: rhodecode/controllers/admin/ldap_settings.py:115
277 msgid "Ldap settings updated successfully"
278 msgstr ""
279
280 #: rhodecode/controllers/admin/ldap_settings.py:120
281 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
282 msgstr ""
283
284 #: rhodecode/controllers/admin/ldap_settings.py:134
285 msgid "error occurred during update of ldap settings"
286 msgstr ""
287
288 #: rhodecode/controllers/admin/permissions.py:56
289 msgid "None"
290 msgstr ""
291
292 #: rhodecode/controllers/admin/permissions.py:57
293 msgid "Read"
294 msgstr ""
295
296 #: rhodecode/controllers/admin/permissions.py:58
297 msgid "Write"
298 msgstr ""
299
300 #: rhodecode/controllers/admin/permissions.py:59
301 #: rhodecode/templates/admin/ldap/ldap.html:9
302 #: rhodecode/templates/admin/permissions/permissions.html:9
303 #: rhodecode/templates/admin/repos/repo_add.html:9
304 #: rhodecode/templates/admin/repos/repo_edit.html:9
305 #: rhodecode/templates/admin/repos/repos.html:10
306 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:8
307 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:8
308 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
309 #: rhodecode/templates/admin/settings/hooks.html:9
310 #: rhodecode/templates/admin/settings/settings.html:9
311 #: rhodecode/templates/admin/users/user_add.html:8
312 #: rhodecode/templates/admin/users/user_edit.html:9
313 #: rhodecode/templates/admin/users/user_edit.html:110
314 #: rhodecode/templates/admin/users/users.html:9
315 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
316 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
317 #: rhodecode/templates/admin/users_groups/users_groups.html:9
318 #: rhodecode/templates/base/base.html:279
319 #: rhodecode/templates/base/base.html:366
320 #: rhodecode/templates/base/base.html:368
321 #: rhodecode/templates/base/base.html:370
322 msgid "Admin"
323 msgstr ""
324
325 #: rhodecode/controllers/admin/permissions.py:62
326 msgid "disabled"
327 msgstr ""
328
329 #: rhodecode/controllers/admin/permissions.py:64
330 msgid "allowed with manual account activation"
331 msgstr ""
332
333 #: rhodecode/controllers/admin/permissions.py:66
334 msgid "allowed with automatic account activation"
335 msgstr ""
336
337 #: rhodecode/controllers/admin/permissions.py:68
338 msgid "Disabled"
339 msgstr ""
340
341 #: rhodecode/controllers/admin/permissions.py:69
342 msgid "Enabled"
343 msgstr ""
344
345 #: rhodecode/controllers/admin/permissions.py:102
346 msgid "Default permissions updated successfully"
347 msgstr ""
348
349 #: rhodecode/controllers/admin/permissions.py:119
350 msgid "error occurred during update of permissions"
351 msgstr ""
352
353 #: rhodecode/controllers/admin/repos.py:96
354 #, python-format
355 msgid ""
356 "%s repository is not mapped to db perhaps it was created or renamed from "
357 "the filesystem please run the application again in order to rescan "
358 "repositories"
359 msgstr ""
360
361 #: rhodecode/controllers/admin/repos.py:172
362 #, python-format
363 msgid "created repository %s from %s"
364 msgstr ""
365
366 #: rhodecode/controllers/admin/repos.py:176
367 #, python-format
368 msgid "created repository %s"
369 msgstr ""
370
371 #: rhodecode/controllers/admin/repos.py:205
372 #, python-format
373 msgid "error occurred during creation of repository %s"
374 msgstr ""
375
376 #: rhodecode/controllers/admin/repos.py:292
377 #, python-format
378 msgid "Cannot delete %s it still contains attached forks"
379 msgstr ""
380
381 #: rhodecode/controllers/admin/repos.py:320
382 msgid "An error occurred during deletion of repository user"
383 msgstr ""
384
385 #: rhodecode/controllers/admin/repos.py:335
386 msgid "An error occurred during deletion of repository users groups"
387 msgstr ""
388
389 #: rhodecode/controllers/admin/repos.py:352
390 msgid "An error occurred during deletion of repository stats"
391 msgstr ""
392
393 #: rhodecode/controllers/admin/repos.py:367
394 msgid "An error occurred during cache invalidation"
395 msgstr ""
396
397 #: rhodecode/controllers/admin/repos.py:387
398 msgid "Updated repository visibility in public journal"
399 msgstr ""
400
401 #: rhodecode/controllers/admin/repos.py:390
402 msgid "An error occurred during setting this repository in public journal"
403 msgstr ""
404
405 #: rhodecode/controllers/admin/repos.py:395 rhodecode/model/forms.py:53
47 msgid "Token mismatch"
406 msgid "Token mismatch"
48 msgstr ""
407 msgstr ""
49
408
50 #: rhodecode/model/forms.py:52
409 #: rhodecode/controllers/admin/repos.py:408
51 msgid "Account number is invalid, it must be 26 digits"
410 msgid "Pulled from remote location"
52 msgstr ""
411 msgstr ""
53
412
413 #: rhodecode/controllers/admin/repos.py:410
414 msgid "An error occurred during pull from remote location"
415 msgstr ""
416
417 #: rhodecode/controllers/admin/repos_groups.py:83
418 #, python-format
419 msgid "created repos group %s"
420 msgstr ""
421
422 #: rhodecode/controllers/admin/repos_groups.py:96
423 #, python-format
424 msgid "error occurred during creation of repos group %s"
425 msgstr ""
426
427 #: rhodecode/controllers/admin/repos_groups.py:130
428 #, python-format
429 msgid "updated repos group %s"
430 msgstr ""
431
432 #: rhodecode/controllers/admin/repos_groups.py:143
433 #, python-format
434 msgid "error occurred during update of repos group %s"
435 msgstr ""
436
437 #: rhodecode/controllers/admin/repos_groups.py:164
438 #, python-format
439 msgid "This group contains %s repositores and cannot be deleted"
440 msgstr ""
441
442 #: rhodecode/controllers/admin/repos_groups.py:171
443 #, python-format
444 msgid "removed repos group %s"
445 msgstr ""
446
447 #: rhodecode/controllers/admin/repos_groups.py:175
448 #, python-format
449 msgid "error occurred during deletion of repos group %s"
450 msgstr ""
451
452 #: rhodecode/controllers/admin/settings.py:109
453 #, python-format
454 msgid "Repositories successfully rescanned added: %s,removed: %s"
455 msgstr ""
456
457 #: rhodecode/controllers/admin/settings.py:118
458 msgid "Whoosh reindex task scheduled"
459 msgstr ""
460
461 #: rhodecode/controllers/admin/settings.py:143
462 msgid "Updated application settings"
463 msgstr ""
464
465 #: rhodecode/controllers/admin/settings.py:148
466 #: rhodecode/controllers/admin/settings.py:215
467 msgid "error occurred during updating application settings"
468 msgstr ""
469
470 #: rhodecode/controllers/admin/settings.py:210
471 msgid "Updated mercurial settings"
472 msgstr ""
473
474 #: rhodecode/controllers/admin/settings.py:236
475 msgid "Added new hook"
476 msgstr ""
477
478 #: rhodecode/controllers/admin/settings.py:247
479 msgid "Updated hooks"
480 msgstr ""
481
482 #: rhodecode/controllers/admin/settings.py:251
483 msgid "error occurred during hook creation"
484 msgstr ""
485
486 #: rhodecode/controllers/admin/settings.py:310
487 msgid "You can't edit this user since it's crucial for entire application"
488 msgstr ""
489
490 #: rhodecode/controllers/admin/settings.py:339
491 msgid "Your account was updated successfully"
492 msgstr ""
493
494 #: rhodecode/controllers/admin/settings.py:359
495 #: rhodecode/controllers/admin/users.py:130
496 #, python-format
497 msgid "error occurred during update of user %s"
498 msgstr ""
499
500 #: rhodecode/controllers/admin/users.py:78
501 #, python-format
502 msgid "created user %s"
503 msgstr ""
504
505 #: rhodecode/controllers/admin/users.py:90
506 #, python-format
507 msgid "error occurred during creation of user %s"
508 msgstr ""
509
510 #: rhodecode/controllers/admin/users.py:116
511 msgid "User updated successfully"
512 msgstr ""
513
514 #: rhodecode/controllers/admin/users.py:146
515 msgid "successfully deleted user"
516 msgstr ""
517
518 #: rhodecode/controllers/admin/users.py:150
519 msgid "An error occurred during deletion of user"
520 msgstr ""
521
522 #: rhodecode/controllers/admin/users.py:166
523 msgid "You can't edit this user"
524 msgstr ""
525
526 #: rhodecode/controllers/admin/users.py:195
527 #: rhodecode/controllers/admin/users_groups.py:202
528 msgid "Granted 'repository create' permission to user"
529 msgstr ""
530
531 #: rhodecode/controllers/admin/users.py:204
532 #: rhodecode/controllers/admin/users_groups.py:211
533 msgid "Revoked 'repository create' permission to user"
534 msgstr ""
535
536 #: rhodecode/controllers/admin/users_groups.py:74
537 #, python-format
538 msgid "created users group %s"
539 msgstr ""
540
541 #: rhodecode/controllers/admin/users_groups.py:86
542 #, python-format
543 msgid "error occurred during creation of users group %s"
544 msgstr ""
545
546 #: rhodecode/controllers/admin/users_groups.py:119
547 #, python-format
548 msgid "updated users group %s"
549 msgstr ""
550
551 #: rhodecode/controllers/admin/users_groups.py:138
552 #, python-format
553 msgid "error occurred during update of users group %s"
554 msgstr ""
555
556 #: rhodecode/controllers/admin/users_groups.py:154
557 msgid "successfully deleted users group"
558 msgstr ""
559
560 #: rhodecode/controllers/admin/users_groups.py:158
561 msgid "An error occurred during deletion of users group"
562 msgstr ""
563
564 #: rhodecode/lib/__init__.py:279
565 msgid "year"
566 msgstr ""
567
568 #: rhodecode/lib/__init__.py:280
569 msgid "month"
570 msgstr ""
571
572 #: rhodecode/lib/__init__.py:281
573 msgid "day"
574 msgstr ""
575
576 #: rhodecode/lib/__init__.py:282
577 msgid "hour"
578 msgstr ""
579
580 #: rhodecode/lib/__init__.py:283
581 msgid "minute"
582 msgstr ""
583
584 #: rhodecode/lib/__init__.py:284
585 msgid "second"
586 msgstr ""
587
588 #: rhodecode/lib/__init__.py:293
589 msgid "ago"
590 msgstr ""
591
592 #: rhodecode/lib/__init__.py:296
593 msgid "just now"
594 msgstr ""
595
596 #: rhodecode/lib/auth.py:377
597 msgid "You need to be a registered user to perform this action"
598 msgstr ""
599
600 #: rhodecode/lib/auth.py:421
601 msgid "You need to be a signed in to view this page"
602 msgstr ""
603
604 #: rhodecode/lib/helpers.py:307
605 msgid "True"
606 msgstr ""
607
608 #: rhodecode/lib/helpers.py:311
609 msgid "False"
610 msgstr ""
611
612 #: rhodecode/lib/helpers.py:352
613 #, python-format
614 msgid "Show all combined changesets %s->%s"
615 msgstr ""
616
617 #: rhodecode/lib/helpers.py:356
618 msgid "compare view"
619 msgstr ""
620
621 #: rhodecode/lib/helpers.py:365
622 msgid "and"
623 msgstr ""
624
625 #: rhodecode/lib/helpers.py:365
626 #, python-format
627 msgid "%s more"
628 msgstr ""
629
630 #: rhodecode/lib/helpers.py:367 rhodecode/templates/changelog/changelog.html:14
631 #: rhodecode/templates/changelog/changelog.html:39
632 msgid "revisions"
633 msgstr ""
634
635 #: rhodecode/lib/helpers.py:385
636 msgid "fork name "
637 msgstr ""
638
639 #: rhodecode/lib/helpers.py:388
640 msgid "[deleted] repository"
641 msgstr ""
642
643 #: rhodecode/lib/helpers.py:389 rhodecode/lib/helpers.py:393
644 msgid "[created] repository"
645 msgstr ""
646
647 #: rhodecode/lib/helpers.py:390 rhodecode/lib/helpers.py:394
648 msgid "[forked] repository"
649 msgstr ""
650
651 #: rhodecode/lib/helpers.py:391 rhodecode/lib/helpers.py:395
652 msgid "[updated] repository"
653 msgstr ""
654
655 #: rhodecode/lib/helpers.py:392
656 msgid "[delete] repository"
657 msgstr ""
658
659 #: rhodecode/lib/helpers.py:396
660 msgid "[pushed] into"
661 msgstr ""
662
663 #: rhodecode/lib/helpers.py:397
664 msgid "[committed via RhodeCode] into"
665 msgstr ""
666
667 #: rhodecode/lib/helpers.py:398
668 msgid "[pulled from remote] into"
669 msgstr ""
670
671 #: rhodecode/lib/helpers.py:399
672 msgid "[pulled] from"
673 msgstr ""
674
675 #: rhodecode/lib/helpers.py:400
676 msgid "[started following] repository"
677 msgstr ""
678
679 #: rhodecode/lib/helpers.py:401
680 msgid "[stopped following] repository"
681 msgstr ""
682
683 #: rhodecode/lib/helpers.py:577
684 #, python-format
685 msgid " and %s more"
686 msgstr ""
687
688 #: rhodecode/lib/helpers.py:581
689 msgid "No Files"
690 msgstr ""
691
692 #: rhodecode/model/forms.py:66
693 msgid "Invalid username"
694 msgstr ""
695
696 #: rhodecode/model/forms.py:75
697 msgid "This username already exists"
698 msgstr ""
699
700 #: rhodecode/model/forms.py:79
701 msgid ""
702 "Username may only contain alphanumeric characters underscores, periods or"
703 " dashes and must begin with alphanumeric character"
704 msgstr ""
705
706 #: rhodecode/model/forms.py:94
707 msgid "Invalid group name"
708 msgstr ""
709
710 #: rhodecode/model/forms.py:104
711 msgid "This users group already exists"
712 msgstr ""
713
714 #: rhodecode/model/forms.py:110
715 msgid ""
716 "Group name may only contain alphanumeric characters underscores, periods "
717 "or dashes and must begin with alphanumeric character"
718 msgstr ""
719
720 #: rhodecode/model/forms.py:132
721 msgid "Cannot assign this group as parent"
722 msgstr ""
723
724 #: rhodecode/model/forms.py:148
725 msgid "This group already exists"
726 msgstr ""
727
728 #: rhodecode/model/forms.py:164 rhodecode/model/forms.py:172
729 #: rhodecode/model/forms.py:180
730 msgid "Invalid characters in password"
731 msgstr ""
732
733 #: rhodecode/model/forms.py:191
734 msgid "Passwords do not match"
735 msgstr ""
736
737 #: rhodecode/model/forms.py:196
738 msgid "invalid password"
739 msgstr ""
740
741 #: rhodecode/model/forms.py:197
742 msgid "invalid user name"
743 msgstr ""
744
745 #: rhodecode/model/forms.py:198
746 msgid "Your account is disabled"
747 msgstr ""
748
749 #: rhodecode/model/forms.py:233
750 msgid "This username is not valid"
751 msgstr ""
752
753 #: rhodecode/model/forms.py:245
754 msgid "This repository name is disallowed"
755 msgstr ""
756
757 #: rhodecode/model/forms.py:266
758 #, python-format
759 msgid "This repository already exists in group \"%s\""
760 msgstr ""
761
762 #: rhodecode/model/forms.py:274
763 msgid "This repository already exists"
764 msgstr ""
765
766 #: rhodecode/model/forms.py:312 rhodecode/model/forms.py:319
767 msgid "invalid clone url"
768 msgstr ""
769
770 #: rhodecode/model/forms.py:322
771 msgid "Invalid clone url, provide a valid clone http\\s url"
772 msgstr ""
773
774 #: rhodecode/model/forms.py:334
775 msgid "Fork have to be the same type as original"
776 msgstr ""
777
778 #: rhodecode/model/forms.py:341
779 msgid "This username or users group name is not valid"
780 msgstr ""
781
782 #: rhodecode/model/forms.py:403
783 msgid "This is not a valid path"
784 msgstr ""
785
786 #: rhodecode/model/forms.py:416
787 msgid "This e-mail address is already taken"
788 msgstr ""
789
790 #: rhodecode/model/forms.py:427
791 msgid "This e-mail address doesn't exist."
792 msgstr ""
793
794 #: rhodecode/model/forms.py:447
795 msgid ""
796 "The LDAP Login attribute of the CN must be specified - this is the name "
797 "of the attribute that is equivalent to 'username'"
798 msgstr ""
799
800 #: rhodecode/model/forms.py:466
801 msgid "Please enter a login"
802 msgstr ""
803
804 #: rhodecode/model/forms.py:467
805 #, python-format
806 msgid "Enter a value %(min)i characters long or more"
807 msgstr ""
808
809 #: rhodecode/model/forms.py:475
810 msgid "Please enter a password"
811 msgstr ""
812
813 #: rhodecode/model/forms.py:476
814 #, python-format
815 msgid "Enter %(min)i characters or more"
816 msgstr ""
817
818 #: rhodecode/model/user.py:145
819 msgid "[RhodeCode] New User registration"
820 msgstr ""
821
822 #: rhodecode/model/user.py:157 rhodecode/model/user.py:179
823 msgid "You can't Edit this user since it's crucial for entire application"
824 msgstr ""
825
826 #: rhodecode/model/user.py:201
827 msgid "You can't remove this user since it's crucial for entire application"
828 msgstr ""
829
830 #: rhodecode/model/user.py:204
831 #, python-format
832 msgid ""
833 "This user still owns %s repositories and cannot be removed. Switch owners"
834 " or remove those repositories"
835 msgstr ""
836
837 #: rhodecode/templates/index.html:4
838 msgid "Dashboard"
839 msgstr ""
840
841 #: rhodecode/templates/index_base.html:22
842 #: rhodecode/templates/admin/users/user_edit_my_account.html:102
843 msgid "quick filter..."
844 msgstr ""
845
846 #: rhodecode/templates/index_base.html:23
847 #: rhodecode/templates/base/base.html:300
848 msgid "repositories"
849 msgstr ""
850
851 #: rhodecode/templates/index_base.html:29
852 #: rhodecode/templates/admin/repos/repos.html:22
853 msgid "ADD NEW REPOSITORY"
854 msgstr ""
855
856 #: rhodecode/templates/index_base.html:41
857 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:32
858 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:32
859 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:33
860 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
861 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
862 msgid "Group name"
863 msgstr ""
864
865 #: rhodecode/templates/index_base.html:42
866 #: rhodecode/templates/index_base.html:73
867 #: rhodecode/templates/admin/repos/repo_add_base.html:44
868 #: rhodecode/templates/admin/repos/repo_edit.html:64
869 #: rhodecode/templates/admin/repos/repos.html:31
870 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:41
871 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:41
872 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:34
873 #: rhodecode/templates/settings/repo_fork.html:40
874 #: rhodecode/templates/settings/repo_settings.html:40
875 #: rhodecode/templates/summary/summary.html:92
876 msgid "Description"
877 msgstr ""
878
879 #: rhodecode/templates/index_base.html:53
880 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
881 msgid "Repositories group"
882 msgstr ""
883
884 #: rhodecode/templates/index_base.html:72
885 #: rhodecode/templates/admin/repos/repo_add_base.html:9
886 #: rhodecode/templates/admin/repos/repo_edit.html:32
887 #: rhodecode/templates/admin/repos/repos.html:30
888 #: rhodecode/templates/admin/users/user_edit_my_account.html:117
889 #: rhodecode/templates/files/files_browser.html:157
890 #: rhodecode/templates/settings/repo_settings.html:31
891 #: rhodecode/templates/summary/summary.html:31
892 #: rhodecode/templates/summary/summary.html:107
893 msgid "Name"
894 msgstr ""
895
896 #: rhodecode/templates/index_base.html:74
897 #: rhodecode/templates/admin/repos/repos.html:32
898 #: rhodecode/templates/summary/summary.html:114
899 msgid "Last change"
900 msgstr ""
901
902 #: rhodecode/templates/index_base.html:75
903 #: rhodecode/templates/admin/repos/repos.html:33
904 msgid "Tip"
905 msgstr ""
906
907 #: rhodecode/templates/index_base.html:76
908 #: rhodecode/templates/admin/repos/repo_edit.html:97
909 msgid "Owner"
910 msgstr ""
911
912 #: rhodecode/templates/index_base.html:77
913 #: rhodecode/templates/journal/public_journal.html:20
914 #: rhodecode/templates/summary/summary.html:180
915 #: rhodecode/templates/summary/summary.html:183
916 msgid "RSS"
917 msgstr ""
918
919 #: rhodecode/templates/index_base.html:78
920 #: rhodecode/templates/journal/public_journal.html:23
921 #: rhodecode/templates/summary/summary.html:181
922 #: rhodecode/templates/summary/summary.html:184
923 msgid "Atom"
924 msgstr ""
925
926 #: rhodecode/templates/index_base.html:87
927 #: rhodecode/templates/index_base.html:89
928 #: rhodecode/templates/index_base.html:91
929 #: rhodecode/templates/base/base.html:209
930 #: rhodecode/templates/base/base.html:211
931 #: rhodecode/templates/base/base.html:213
932 #: rhodecode/templates/summary/summary.html:4
933 msgid "Summary"
934 msgstr ""
935
936 #: rhodecode/templates/index_base.html:95
937 #: rhodecode/templates/index_base.html:97
938 #: rhodecode/templates/index_base.html:99
939 #: rhodecode/templates/base/base.html:225
940 #: rhodecode/templates/base/base.html:227
941 #: rhodecode/templates/base/base.html:229
942 #: rhodecode/templates/changelog/changelog.html:6
943 #: rhodecode/templates/changelog/changelog.html:14
944 msgid "Changelog"
945 msgstr ""
946
947 #: rhodecode/templates/index_base.html:103
948 #: rhodecode/templates/index_base.html:105
949 #: rhodecode/templates/index_base.html:107
950 #: rhodecode/templates/base/base.html:268
951 #: rhodecode/templates/base/base.html:270
952 #: rhodecode/templates/base/base.html:272
953 #: rhodecode/templates/files/files.html:4
954 msgid "Files"
955 msgstr ""
956
957 #: rhodecode/templates/index_base.html:116
958 #: rhodecode/templates/admin/repos/repos.html:42
959 #: rhodecode/templates/admin/users/user_edit_my_account.html:127
960 #: rhodecode/templates/summary/summary.html:48
961 msgid "Mercurial repository"
962 msgstr ""
963
964 #: rhodecode/templates/index_base.html:118
965 #: rhodecode/templates/admin/repos/repos.html:44
966 #: rhodecode/templates/admin/users/user_edit_my_account.html:129
967 #: rhodecode/templates/summary/summary.html:51
968 msgid "Git repository"
969 msgstr ""
970
971 #: rhodecode/templates/index_base.html:123
972 #: rhodecode/templates/admin/repos/repo_edit_perms.html:16
973 #: rhodecode/templates/journal/journal.html:53
974 #: rhodecode/templates/summary/summary.html:56
975 msgid "private repository"
976 msgstr ""
977
978 #: rhodecode/templates/index_base.html:125
979 #: rhodecode/templates/journal/journal.html:55
980 #: rhodecode/templates/summary/summary.html:58
981 msgid "public repository"
982 msgstr ""
983
984 #: rhodecode/templates/index_base.html:133
985 #: rhodecode/templates/base/base.html:291
986 #: rhodecode/templates/settings/repo_fork.html:13
987 msgid "fork"
988 msgstr ""
989
990 #: rhodecode/templates/index_base.html:134
991 #: rhodecode/templates/admin/repos/repos.html:60
992 #: rhodecode/templates/admin/users/user_edit_my_account.html:143
993 #: rhodecode/templates/summary/summary.html:69
994 #: rhodecode/templates/summary/summary.html:71
995 msgid "Fork of"
996 msgstr ""
997
998 #: rhodecode/templates/index_base.html:155
999 #: rhodecode/templates/admin/repos/repos.html:73
1000 msgid "No changesets yet"
1001 msgstr ""
1002
1003 #: rhodecode/templates/index_base.html:161
1004 #: rhodecode/templates/index_base.html:163
1005 #, python-format
1006 msgid "Subscribe to %s rss feed"
1007 msgstr ""
1008
1009 #: rhodecode/templates/index_base.html:168
1010 #: rhodecode/templates/index_base.html:170
1011 #, python-format
1012 msgid "Subscribe to %s atom feed"
1013 msgstr ""
1014
1015 #: rhodecode/templates/login.html:5 rhodecode/templates/login.html:54
1016 #: rhodecode/templates/base/base.html:38
1017 msgid "Sign In"
1018 msgstr ""
1019
1020 #: rhodecode/templates/login.html:21
1021 msgid "Sign In to"
1022 msgstr ""
1023
1024 #: rhodecode/templates/login.html:31 rhodecode/templates/register.html:20
1025 #: rhodecode/templates/admin/admin_log.html:5
1026 #: rhodecode/templates/admin/users/user_add.html:32
1027 #: rhodecode/templates/admin/users/user_edit.html:47
1028 #: rhodecode/templates/admin/users/user_edit_my_account.html:45
1029 #: rhodecode/templates/base/base.html:15
1030 #: rhodecode/templates/summary/summary.html:106
1031 msgid "Username"
1032 msgstr ""
1033
1034 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
1035 #: rhodecode/templates/admin/ldap/ldap.html:46
1036 #: rhodecode/templates/admin/users/user_add.html:41
1037 #: rhodecode/templates/base/base.html:24
1038 msgid "Password"
1039 msgstr ""
1040
1041 #: rhodecode/templates/login.html:60
1042 msgid "Forgot your password ?"
1043 msgstr ""
1044
1045 #: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:35
1046 msgid "Don't have an account ?"
1047 msgstr ""
1048
1049 #: rhodecode/templates/password_reset.html:5
1050 msgid "Reset your password"
1051 msgstr ""
1052
1053 #: rhodecode/templates/password_reset.html:11
1054 msgid "Reset your password to"
1055 msgstr ""
1056
1057 #: rhodecode/templates/password_reset.html:21
1058 msgid "Email address"
1059 msgstr ""
1060
1061 #: rhodecode/templates/password_reset.html:30
1062 msgid "Reset my password"
1063 msgstr ""
1064
1065 #: rhodecode/templates/password_reset.html:31
1066 msgid "Password reset link will be send to matching email address"
1067 msgstr ""
1068
1069 #: rhodecode/templates/register.html:5 rhodecode/templates/register.html:74
1070 msgid "Sign Up"
1071 msgstr ""
1072
1073 #: rhodecode/templates/register.html:11
1074 msgid "Sign Up to"
1075 msgstr ""
1076
1077 #: rhodecode/templates/register.html:38
1078 msgid "Re-enter password"
1079 msgstr ""
1080
1081 #: rhodecode/templates/register.html:47
1082 #: rhodecode/templates/admin/users/user_add.html:50
1083 #: rhodecode/templates/admin/users/user_edit.html:74
1084 #: rhodecode/templates/admin/users/user_edit_my_account.html:63
1085 msgid "First Name"
1086 msgstr ""
1087
1088 #: rhodecode/templates/register.html:56
1089 #: rhodecode/templates/admin/users/user_add.html:59
1090 #: rhodecode/templates/admin/users/user_edit.html:83
1091 #: rhodecode/templates/admin/users/user_edit_my_account.html:72
1092 msgid "Last Name"
1093 msgstr ""
1094
1095 #: rhodecode/templates/register.html:65
1096 #: rhodecode/templates/admin/users/user_add.html:68
1097 #: rhodecode/templates/admin/users/user_edit.html:92
1098 #: rhodecode/templates/admin/users/user_edit_my_account.html:81
1099 #: rhodecode/templates/summary/summary.html:108
1100 msgid "Email"
1101 msgstr ""
1102
1103 #: rhodecode/templates/register.html:76
1104 msgid "Your account will be activated right after registration"
1105 msgstr ""
1106
1107 #: rhodecode/templates/register.html:78
1108 msgid "Your account must wait for activation by administrator"
1109 msgstr ""
1110
1111 #: rhodecode/templates/repo_switcher_list.html:14
1112 msgid "Private repository"
1113 msgstr ""
1114
1115 #: rhodecode/templates/repo_switcher_list.html:19
1116 msgid "Public repository"
1117 msgstr ""
1118
1119 #: rhodecode/templates/admin/admin.html:5
1120 #: rhodecode/templates/admin/admin.html:9
1121 msgid "Admin journal"
1122 msgstr ""
1123
1124 #: rhodecode/templates/admin/admin_log.html:6
1125 msgid "Action"
1126 msgstr ""
1127
1128 #: rhodecode/templates/admin/admin_log.html:7
1129 msgid "Repository"
1130 msgstr ""
1131
1132 #: rhodecode/templates/admin/admin_log.html:8
1133 msgid "Date"
1134 msgstr ""
1135
1136 #: rhodecode/templates/admin/admin_log.html:9
1137 msgid "From IP"
1138 msgstr ""
1139
1140 #: rhodecode/templates/admin/admin_log.html:52
1141 msgid "No actions yet"
1142 msgstr ""
1143
1144 #: rhodecode/templates/admin/ldap/ldap.html:5
1145 msgid "LDAP administration"
1146 msgstr ""
1147
1148 #: rhodecode/templates/admin/ldap/ldap.html:11
1149 msgid "Ldap"
1150 msgstr ""
1151
1152 #: rhodecode/templates/admin/ldap/ldap.html:28
1153 msgid "Connection settings"
1154 msgstr ""
1155
1156 #: rhodecode/templates/admin/ldap/ldap.html:30
1157 msgid "Enable LDAP"
1158 msgstr ""
1159
1160 #: rhodecode/templates/admin/ldap/ldap.html:34
1161 msgid "Host"
1162 msgstr ""
1163
1164 #: rhodecode/templates/admin/ldap/ldap.html:38
1165 msgid "Port"
1166 msgstr ""
1167
1168 #: rhodecode/templates/admin/ldap/ldap.html:42
1169 msgid "Account"
1170 msgstr ""
1171
1172 #: rhodecode/templates/admin/ldap/ldap.html:50
1173 msgid "Connection security"
1174 msgstr ""
1175
1176 #: rhodecode/templates/admin/ldap/ldap.html:54
1177 msgid "Certificate Checks"
1178 msgstr ""
1179
1180 #: rhodecode/templates/admin/ldap/ldap.html:57
1181 msgid "Search settings"
1182 msgstr ""
1183
1184 #: rhodecode/templates/admin/ldap/ldap.html:59
1185 msgid "Base DN"
1186 msgstr ""
1187
1188 #: rhodecode/templates/admin/ldap/ldap.html:63
1189 msgid "LDAP Filter"
1190 msgstr ""
1191
1192 #: rhodecode/templates/admin/ldap/ldap.html:67
1193 msgid "LDAP Search Scope"
1194 msgstr ""
1195
1196 #: rhodecode/templates/admin/ldap/ldap.html:70
1197 msgid "Attribute mappings"
1198 msgstr ""
1199
1200 #: rhodecode/templates/admin/ldap/ldap.html:72
1201 msgid "Login Attribute"
1202 msgstr ""
1203
1204 #: rhodecode/templates/admin/ldap/ldap.html:76
1205 msgid "First Name Attribute"
1206 msgstr ""
1207
1208 #: rhodecode/templates/admin/ldap/ldap.html:80
1209 msgid "Last Name Attribute"
1210 msgstr ""
1211
1212 #: rhodecode/templates/admin/ldap/ldap.html:84
1213 msgid "E-mail Attribute"
1214 msgstr ""
1215
1216 #: rhodecode/templates/admin/ldap/ldap.html:89
1217 #: rhodecode/templates/admin/settings/hooks.html:73
1218 #: rhodecode/templates/admin/users/user_edit.html:117
1219 #: rhodecode/templates/admin/users/user_edit.html:142
1220 #: rhodecode/templates/admin/users/user_edit_my_account.html:89
1221 #: rhodecode/templates/admin/users_groups/users_group_edit.html:263
1222 msgid "Save"
1223 msgstr ""
1224
1225 #: rhodecode/templates/admin/permissions/permissions.html:5
1226 msgid "Permissions administration"
1227 msgstr ""
1228
1229 #: rhodecode/templates/admin/permissions/permissions.html:11
1230 #: rhodecode/templates/admin/repos/repo_edit.html:109
1231 #: rhodecode/templates/admin/users/user_edit.html:127
1232 #: rhodecode/templates/admin/users_groups/users_group_edit.html:248
1233 #: rhodecode/templates/settings/repo_settings.html:58
1234 msgid "Permissions"
1235 msgstr ""
1236
1237 #: rhodecode/templates/admin/permissions/permissions.html:24
1238 msgid "Default permissions"
1239 msgstr ""
1240
1241 #: rhodecode/templates/admin/permissions/permissions.html:31
1242 msgid "Anonymous access"
1243 msgstr ""
1244
1245 #: rhodecode/templates/admin/permissions/permissions.html:41
1246 msgid "Repository permission"
1247 msgstr ""
1248
1249 #: rhodecode/templates/admin/permissions/permissions.html:49
1250 msgid ""
1251 "All default permissions on each repository will be reset to choosen "
1252 "permission, note that all custom default permission on repositories will "
1253 "be lost"
1254 msgstr ""
1255
1256 #: rhodecode/templates/admin/permissions/permissions.html:50
1257 msgid "overwrite existing settings"
1258 msgstr ""
1259
1260 #: rhodecode/templates/admin/permissions/permissions.html:55
1261 msgid "Registration"
1262 msgstr ""
1263
1264 #: rhodecode/templates/admin/permissions/permissions.html:63
1265 msgid "Repository creation"
1266 msgstr ""
1267
1268 #: rhodecode/templates/admin/permissions/permissions.html:71
1269 msgid "set"
1270 msgstr ""
1271
1272 #: rhodecode/templates/admin/repos/repo_add.html:5
1273 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:5
1274 msgid "Add repository"
1275 msgstr ""
1276
1277 #: rhodecode/templates/admin/repos/repo_add.html:11
1278 #: rhodecode/templates/admin/repos/repo_edit.html:11
1279 #: rhodecode/templates/admin/repos/repos.html:10
1280 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
1281 msgid "Repositories"
1282 msgstr ""
1283
1284 #: rhodecode/templates/admin/repos/repo_add.html:13
1285 msgid "add new"
1286 msgstr ""
1287
1288 #: rhodecode/templates/admin/repos/repo_add_base.html:20
1289 #: rhodecode/templates/summary/summary.html:80
1290 #: rhodecode/templates/summary/summary.html:82
1291 msgid "Clone from"
1292 msgstr ""
1293
1294 #: rhodecode/templates/admin/repos/repo_add_base.html:28
1295 #: rhodecode/templates/admin/repos/repo_edit.html:48
1296 #: rhodecode/templates/admin/repos_groups/repos_groups.html:4
1297 msgid "Repository group"
1298 msgstr ""
1299
1300 #: rhodecode/templates/admin/repos/repo_add_base.html:36
1301 #: rhodecode/templates/admin/repos/repo_edit.html:56
1302 msgid "Type"
1303 msgstr ""
1304
1305 #: rhodecode/templates/admin/repos/repo_add_base.html:52
1306 #: rhodecode/templates/admin/repos/repo_edit.html:73
1307 #: rhodecode/templates/settings/repo_fork.html:48
1308 #: rhodecode/templates/settings/repo_settings.html:49
1309 msgid "Private"
1310 msgstr ""
1311
1312 #: rhodecode/templates/admin/repos/repo_add_base.html:59
1313 msgid "add"
1314 msgstr ""
1315
1316 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:9
1317 msgid "add new repository"
1318 msgstr ""
1319
1320 #: rhodecode/templates/admin/repos/repo_edit.html:5
1321 msgid "Edit repository"
1322 msgstr ""
1323
1324 #: rhodecode/templates/admin/repos/repo_edit.html:13
1325 #: rhodecode/templates/admin/users/user_edit.html:13
1326 #: rhodecode/templates/admin/users/user_edit_my_account.html:148
1327 #: rhodecode/templates/admin/users_groups/users_group_edit.html:13
1328 #: rhodecode/templates/files/files_annotate.html:49
1329 #: rhodecode/templates/files/files_source.html:20
1330 msgid "edit"
1331 msgstr ""
1332
1333 #: rhodecode/templates/admin/repos/repo_edit.html:40
1334 msgid "Clone uri"
1335 msgstr ""
1336
1337 #: rhodecode/templates/admin/repos/repo_edit.html:81
1338 msgid "Enable statistics"
1339 msgstr ""
1340
1341 #: rhodecode/templates/admin/repos/repo_edit.html:89
1342 msgid "Enable downloads"
1343 msgstr ""
1344
1345 #: rhodecode/templates/admin/repos/repo_edit.html:127
1346 msgid "Administration"
1347 msgstr ""
1348
1349 #: rhodecode/templates/admin/repos/repo_edit.html:130
1350 msgid "Statistics"
1351 msgstr ""
1352
1353 #: rhodecode/templates/admin/repos/repo_edit.html:134
1354 msgid "Reset current statistics"
1355 msgstr ""
1356
1357 #: rhodecode/templates/admin/repos/repo_edit.html:134
1358 msgid "Confirm to remove current statistics"
1359 msgstr ""
1360
1361 #: rhodecode/templates/admin/repos/repo_edit.html:137
1362 msgid "Fetched to rev"
1363 msgstr ""
1364
1365 #: rhodecode/templates/admin/repos/repo_edit.html:138
1366 msgid "Percentage of stats gathered"
1367 msgstr ""
1368
1369 #: rhodecode/templates/admin/repos/repo_edit.html:147
1370 msgid "Remote"
1371 msgstr ""
1372
1373 #: rhodecode/templates/admin/repos/repo_edit.html:151
1374 msgid "Pull changes from remote location"
1375 msgstr ""
1376
1377 #: rhodecode/templates/admin/repos/repo_edit.html:151
1378 msgid "Confirm to pull changes from remote side"
1379 msgstr ""
1380
1381 #: rhodecode/templates/admin/repos/repo_edit.html:162
1382 msgid "Cache"
1383 msgstr ""
1384
1385 #: rhodecode/templates/admin/repos/repo_edit.html:166
1386 msgid "Invalidate repository cache"
1387 msgstr ""
1388
1389 #: rhodecode/templates/admin/repos/repo_edit.html:166
1390 msgid "Confirm to invalidate repository cache"
1391 msgstr ""
1392
1393 #: rhodecode/templates/admin/repos/repo_edit.html:177
1394 msgid "Remove from public journal"
1395 msgstr ""
1396
1397 #: rhodecode/templates/admin/repos/repo_edit.html:179
1398 msgid "Add to public journal"
1399 msgstr ""
1400
1401 #: rhodecode/templates/admin/repos/repo_edit.html:185
1402 msgid "Delete"
1403 msgstr ""
1404
1405 #: rhodecode/templates/admin/repos/repo_edit.html:189
1406 msgid "Remove this repository"
1407 msgstr ""
1408
1409 #: rhodecode/templates/admin/repos/repo_edit.html:189
1410 #: rhodecode/templates/admin/repos/repos.html:79
1411 msgid "Confirm to delete this repository"
1412 msgstr ""
1413
1414 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
1415 msgid "none"
1416 msgstr ""
1417
1418 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
1419 msgid "read"
1420 msgstr ""
1421
1422 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
1423 msgid "write"
1424 msgstr ""
1425
1426 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
1427 #: rhodecode/templates/admin/users/users.html:38
1428 #: rhodecode/templates/base/base.html:296
1429 msgid "admin"
1430 msgstr ""
1431
1432 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
1433 msgid "member"
1434 msgstr ""
1435
1436 #: rhodecode/templates/admin/repos/repo_edit_perms.html:33
1437 #: rhodecode/templates/admin/repos/repo_edit_perms.html:53
1438 msgid "revoke"
1439 msgstr ""
1440
1441 #: rhodecode/templates/admin/repos/repo_edit_perms.html:75
1442 msgid "Add another member"
1443 msgstr ""
1444
1445 #: rhodecode/templates/admin/repos/repo_edit_perms.html:89
1446 msgid "Failed to remove user"
1447 msgstr ""
1448
1449 #: rhodecode/templates/admin/repos/repo_edit_perms.html:104
1450 msgid "Failed to remove users group"
1451 msgstr ""
1452
1453 #: rhodecode/templates/admin/repos/repo_edit_perms.html:205
1454 msgid "Group"
1455 msgstr ""
1456
1457 #: rhodecode/templates/admin/repos/repo_edit_perms.html:206
1458 #: rhodecode/templates/admin/users_groups/users_groups.html:33
1459 msgid "members"
1460 msgstr ""
1461
1462 #: rhodecode/templates/admin/repos/repos.html:5
1463 msgid "Repositories administration"
1464 msgstr ""
1465
1466 #: rhodecode/templates/admin/repos/repos.html:34
1467 #: rhodecode/templates/summary/summary.html:100
1468 msgid "Contact"
1469 msgstr ""
1470
1471 #: rhodecode/templates/admin/repos/repos.html:35
1472 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:36
1473 #: rhodecode/templates/admin/users/user_edit_my_account.html:119
1474 #: rhodecode/templates/admin/users/users.html:40
1475 #: rhodecode/templates/admin/users_groups/users_groups.html:35
1476 msgid "action"
1477 msgstr ""
1478
1479 #: rhodecode/templates/admin/repos/repos.html:51
1480 #: rhodecode/templates/admin/users/user_edit_my_account.html:134
1481 #: rhodecode/templates/admin/users/user_edit_my_account.html:148
1482 msgid "private"
1483 msgstr ""
1484
1485 #: rhodecode/templates/admin/repos/repos.html:53
1486 #: rhodecode/templates/admin/repos/repos.html:59
1487 #: rhodecode/templates/admin/users/user_edit_my_account.html:136
1488 #: rhodecode/templates/admin/users/user_edit_my_account.html:142
1489 #: rhodecode/templates/summary/summary.html:68
1490 msgid "public"
1491 msgstr ""
1492
1493 #: rhodecode/templates/admin/repos/repos.html:79
1494 #: rhodecode/templates/admin/users/users.html:55
1495 msgid "delete"
1496 msgstr ""
1497
1498 #: rhodecode/templates/admin/repos_groups/repos_groups.html:8
1499 msgid "Groups"
1500 msgstr ""
1501
1502 #: rhodecode/templates/admin/repos_groups/repos_groups.html:13
1503 msgid "with"
1504 msgstr ""
1505
1506 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5
1507 msgid "Add repos group"
1508 msgstr ""
1509
1510 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:10
1511 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:10
1512 msgid "Repos groups"
1513 msgstr ""
1514
1515 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:12
1516 msgid "add new repos group"
1517 msgstr ""
1518
1519 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:50
1520 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:50
1521 msgid "Group parent"
1522 msgstr ""
1523
1524 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:58
1525 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:58
1526 #: rhodecode/templates/admin/users/user_add.html:85
1527 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
1528 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
1529 msgid "save"
1530 msgstr ""
1531
1532 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:5
1533 msgid "Edit repos group"
1534 msgstr ""
1535
1536 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:12
1537 msgid "edit repos group"
1538 msgstr ""
1539
1540 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5
1541 msgid "Repositories groups administration"
1542 msgstr ""
1543
1544 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:22
1545 msgid "ADD NEW GROUP"
1546 msgstr ""
1547
1548 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:35
1549 msgid "Number of repositories"
1550 msgstr ""
1551
1552 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:54
1553 msgid "Confirm to delete this group"
1554 msgstr ""
1555
1556 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:62
1557 msgid "There are no repositories groups yet"
1558 msgstr ""
1559
1560 #: rhodecode/templates/admin/settings/hooks.html:5
1561 #: rhodecode/templates/admin/settings/settings.html:5
1562 msgid "Settings administration"
1563 msgstr ""
1564
1565 #: rhodecode/templates/admin/settings/hooks.html:9
1566 #: rhodecode/templates/admin/settings/settings.html:9
1567 #: rhodecode/templates/settings/repo_settings.html:5
1568 #: rhodecode/templates/settings/repo_settings.html:13
1569 msgid "Settings"
1570 msgstr ""
1571
1572 #: rhodecode/templates/admin/settings/hooks.html:24
1573 msgid "Built in hooks - read only"
1574 msgstr ""
1575
1576 #: rhodecode/templates/admin/settings/hooks.html:40
1577 msgid "Custom hooks"
1578 msgstr ""
1579
1580 #: rhodecode/templates/admin/settings/hooks.html:56
1581 msgid "remove"
1582 msgstr ""
1583
1584 #: rhodecode/templates/admin/settings/hooks.html:88
1585 msgid "Failed to remove hook"
1586 msgstr ""
1587
1588 #: rhodecode/templates/admin/settings/settings.html:24
1589 msgid "Remap and rescan repositories"
1590 msgstr ""
1591
1592 #: rhodecode/templates/admin/settings/settings.html:32
1593 msgid "rescan option"
1594 msgstr ""
1595
1596 #: rhodecode/templates/admin/settings/settings.html:38
1597 msgid ""
1598 "In case a repository was deleted from filesystem and there are leftovers "
1599 "in the database check this option to scan obsolete data in database and "
1600 "remove it."
1601 msgstr ""
1602
1603 #: rhodecode/templates/admin/settings/settings.html:39
1604 msgid "destroy old data"
1605 msgstr ""
1606
1607 #: rhodecode/templates/admin/settings/settings.html:45
1608 msgid "Rescan repositories"
1609 msgstr ""
1610
1611 #: rhodecode/templates/admin/settings/settings.html:51
1612 msgid "Whoosh indexing"
1613 msgstr ""
1614
1615 #: rhodecode/templates/admin/settings/settings.html:59
1616 msgid "index build option"
1617 msgstr ""
1618
1619 #: rhodecode/templates/admin/settings/settings.html:64
1620 msgid "build from scratch"
1621 msgstr ""
1622
1623 #: rhodecode/templates/admin/settings/settings.html:70
1624 msgid "Reindex"
1625 msgstr ""
1626
1627 #: rhodecode/templates/admin/settings/settings.html:76
1628 msgid "Global application settings"
1629 msgstr ""
1630
1631 #: rhodecode/templates/admin/settings/settings.html:85
1632 msgid "Application name"
1633 msgstr ""
1634
1635 #: rhodecode/templates/admin/settings/settings.html:94
1636 msgid "Realm text"
1637 msgstr ""
1638
1639 #: rhodecode/templates/admin/settings/settings.html:103
1640 msgid "GA code"
1641 msgstr ""
1642
1643 #: rhodecode/templates/admin/settings/settings.html:111
1644 #: rhodecode/templates/admin/settings/settings.html:177
1645 msgid "Save settings"
1646 msgstr ""
1647
1648 #: rhodecode/templates/admin/settings/settings.html:112
1649 #: rhodecode/templates/admin/settings/settings.html:178
1650 #: rhodecode/templates/admin/users/user_edit.html:118
1651 #: rhodecode/templates/admin/users/user_edit.html:143
1652 #: rhodecode/templates/admin/users/user_edit_my_account.html:90
1653 #: rhodecode/templates/admin/users_groups/users_group_edit.html:264
1654 #: rhodecode/templates/files/files_edit.html:50
1655 msgid "Reset"
1656 msgstr ""
1657
1658 #: rhodecode/templates/admin/settings/settings.html:118
1659 msgid "Mercurial settings"
1660 msgstr ""
1661
1662 #: rhodecode/templates/admin/settings/settings.html:127
1663 msgid "Web"
1664 msgstr ""
1665
1666 #: rhodecode/templates/admin/settings/settings.html:132
1667 msgid "require ssl for pushing"
1668 msgstr ""
1669
1670 #: rhodecode/templates/admin/settings/settings.html:139
1671 msgid "Hooks"
1672 msgstr ""
1673
1674 #: rhodecode/templates/admin/settings/settings.html:142
1675 msgid "advanced setup"
1676 msgstr ""
1677
1678 #: rhodecode/templates/admin/settings/settings.html:147
1679 msgid "Update repository after push (hg update)"
1680 msgstr ""
1681
1682 #: rhodecode/templates/admin/settings/settings.html:151
1683 msgid "Show repository size after push"
1684 msgstr ""
1685
1686 #: rhodecode/templates/admin/settings/settings.html:155
1687 msgid "Log user push commands"
1688 msgstr ""
1689
1690 #: rhodecode/templates/admin/settings/settings.html:159
1691 msgid "Log user pull commands"
1692 msgstr ""
1693
1694 #: rhodecode/templates/admin/settings/settings.html:166
1695 msgid "Repositories location"
1696 msgstr ""
1697
1698 #: rhodecode/templates/admin/settings/settings.html:171
1699 msgid ""
1700 "This a crucial application setting. If you are really sure you need to "
1701 "change this, you must restart application in order to make this setting "
1702 "take effect. Click this label to unlock."
1703 msgstr ""
1704
1705 #: rhodecode/templates/admin/settings/settings.html:172
1706 msgid "unlock"
1707 msgstr ""
1708
1709 #: rhodecode/templates/admin/users/user_add.html:5
1710 msgid "Add user"
1711 msgstr ""
1712
1713 #: rhodecode/templates/admin/users/user_add.html:10
1714 #: rhodecode/templates/admin/users/user_edit.html:11
1715 #: rhodecode/templates/admin/users/users.html:9
1716 msgid "Users"
1717 msgstr ""
1718
1719 #: rhodecode/templates/admin/users/user_add.html:12
1720 msgid "add new user"
1721 msgstr ""
1722
1723 #: rhodecode/templates/admin/users/user_add.html:77
1724 #: rhodecode/templates/admin/users/user_edit.html:101
1725 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
1726 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
1727 msgid "Active"
1728 msgstr ""
1729
1730 #: rhodecode/templates/admin/users/user_edit.html:5
1731 msgid "Edit user"
1732 msgstr ""
1733
1734 #: rhodecode/templates/admin/users/user_edit.html:33
1735 #: rhodecode/templates/admin/users/user_edit_my_account.html:32
1736 msgid "Change your avatar at"
1737 msgstr ""
1738
1739 #: rhodecode/templates/admin/users/user_edit.html:34
1740 #: rhodecode/templates/admin/users/user_edit_my_account.html:33
1741 msgid "Using"
1742 msgstr ""
1743
1744 #: rhodecode/templates/admin/users/user_edit.html:40
1745 #: rhodecode/templates/admin/users/user_edit_my_account.html:39
1746 msgid "API key"
1747 msgstr ""
1748
1749 #: rhodecode/templates/admin/users/user_edit.html:56
1750 msgid "LDAP DN"
1751 msgstr ""
1752
1753 #: rhodecode/templates/admin/users/user_edit.html:65
1754 #: rhodecode/templates/admin/users/user_edit_my_account.html:54
1755 msgid "New password"
1756 msgstr ""
1757
1758 #: rhodecode/templates/admin/users/user_edit.html:135
1759 #: rhodecode/templates/admin/users_groups/users_group_edit.html:256
1760 msgid "Create repositories"
1761 msgstr ""
1762
1763 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
1764 msgid "My account"
1765 msgstr ""
1766
1767 #: rhodecode/templates/admin/users/user_edit_my_account.html:9
1768 msgid "My Account"
1769 msgstr ""
1770
1771 #: rhodecode/templates/admin/users/user_edit_my_account.html:101
1772 msgid "My repositories"
1773 msgstr ""
1774
1775 #: rhodecode/templates/admin/users/user_edit_my_account.html:107
1776 msgid "ADD REPOSITORY"
1777 msgstr ""
1778
1779 #: rhodecode/templates/admin/users/user_edit_my_account.html:118
1780 #: rhodecode/templates/branches/branches_data.html:7
1781 #: rhodecode/templates/shortlog/shortlog_data.html:8
1782 #: rhodecode/templates/tags/tags_data.html:7
1783 msgid "revision"
1784 msgstr ""
1785
1786 #: rhodecode/templates/admin/users/user_edit_my_account.html:157
1787 msgid "No repositories yet"
1788 msgstr ""
1789
1790 #: rhodecode/templates/admin/users/user_edit_my_account.html:159
1791 msgid "create one now"
1792 msgstr ""
1793
1794 #: rhodecode/templates/admin/users/users.html:5
1795 msgid "Users administration"
1796 msgstr ""
1797
1798 #: rhodecode/templates/admin/users/users.html:23
1799 msgid "ADD NEW USER"
1800 msgstr ""
1801
1802 #: rhodecode/templates/admin/users/users.html:33
1803 msgid "username"
1804 msgstr ""
1805
1806 #: rhodecode/templates/admin/users/users.html:34
1807 #: rhodecode/templates/branches/branches_data.html:5
1808 #: rhodecode/templates/tags/tags_data.html:5
1809 msgid "name"
1810 msgstr ""
1811
1812 #: rhodecode/templates/admin/users/users.html:35
1813 msgid "lastname"
1814 msgstr ""
1815
1816 #: rhodecode/templates/admin/users/users.html:36
1817 msgid "last login"
1818 msgstr ""
1819
1820 #: rhodecode/templates/admin/users/users.html:37
1821 #: rhodecode/templates/admin/users_groups/users_groups.html:34
1822 msgid "active"
1823 msgstr ""
1824
1825 #: rhodecode/templates/admin/users/users.html:39
1826 #: rhodecode/templates/base/base.html:305
1827 msgid "ldap"
1828 msgstr ""
1829
1830 #: rhodecode/templates/admin/users/users.html:56
1831 msgid "Confirm to delete this user"
1832 msgstr ""
1833
1834 #: rhodecode/templates/admin/users_groups/users_group_add.html:5
1835 msgid "Add users group"
1836 msgstr ""
1837
1838 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
1839 #: rhodecode/templates/admin/users_groups/users_groups.html:9
1840 msgid "Users groups"
1841 msgstr ""
1842
1843 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
1844 msgid "add new users group"
1845 msgstr ""
1846
1847 #: rhodecode/templates/admin/users_groups/users_group_edit.html:5
1848 msgid "Edit users group"
1849 msgstr ""
1850
1851 #: rhodecode/templates/admin/users_groups/users_group_edit.html:11
1852 msgid "UsersGroups"
1853 msgstr ""
1854
1855 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
1856 msgid "Members"
1857 msgstr ""
1858
1859 #: rhodecode/templates/admin/users_groups/users_group_edit.html:58
1860 msgid "Choosen group members"
1861 msgstr ""
1862
1863 #: rhodecode/templates/admin/users_groups/users_group_edit.html:61
1864 msgid "Remove all elements"
1865 msgstr ""
1866
1867 #: rhodecode/templates/admin/users_groups/users_group_edit.html:75
1868 msgid "Available members"
1869 msgstr ""
1870
1871 #: rhodecode/templates/admin/users_groups/users_group_edit.html:79
1872 msgid "Add all elements"
1873 msgstr ""
1874
1875 #: rhodecode/templates/admin/users_groups/users_groups.html:5
1876 msgid "Users groups administration"
1877 msgstr ""
1878
1879 #: rhodecode/templates/admin/users_groups/users_groups.html:23
1880 msgid "ADD NEW USER GROUP"
1881 msgstr ""
1882
1883 #: rhodecode/templates/admin/users_groups/users_groups.html:32
1884 msgid "group name"
1885 msgstr ""
1886
1887 #: rhodecode/templates/base/base.html:32
1888 msgid "Forgot password ?"
1889 msgstr ""
1890
1891 #: rhodecode/templates/base/base.html:57 rhodecode/templates/base/base.html:338
1892 #: rhodecode/templates/base/base.html:340
1893 #: rhodecode/templates/base/base.html:342
1894 msgid "Home"
1895 msgstr ""
1896
1897 #: rhodecode/templates/base/base.html:61 rhodecode/templates/base/base.html:347
1898 #: rhodecode/templates/base/base.html:349
1899 #: rhodecode/templates/base/base.html:351
1900 #: rhodecode/templates/journal/journal.html:4
1901 #: rhodecode/templates/journal/journal.html:17
1902 #: rhodecode/templates/journal/public_journal.html:4
1903 msgid "Journal"
1904 msgstr ""
1905
1906 #: rhodecode/templates/base/base.html:66
1907 msgid "Login"
1908 msgstr ""
1909
1910 #: rhodecode/templates/base/base.html:68
1911 msgid "Log Out"
1912 msgstr ""
1913
1914 #: rhodecode/templates/base/base.html:107
1915 msgid "Submit a bug"
1916 msgstr ""
1917
1918 #: rhodecode/templates/base/base.html:141
1919 msgid "Switch repository"
1920 msgstr ""
1921
1922 #: rhodecode/templates/base/base.html:143
1923 msgid "Products"
1924 msgstr ""
1925
1926 #: rhodecode/templates/base/base.html:149
1927 msgid "loading..."
1928 msgstr ""
1929
1930 #: rhodecode/templates/base/base.html:234
1931 #: rhodecode/templates/base/base.html:236
1932 #: rhodecode/templates/base/base.html:238
1933 msgid "Switch to"
1934 msgstr ""
1935
1936 #: rhodecode/templates/base/base.html:242
1937 #: rhodecode/templates/branches/branches.html:13
1938 msgid "branches"
1939 msgstr ""
1940
1941 #: rhodecode/templates/base/base.html:249
1942 #: rhodecode/templates/branches/branches_data.html:52
1943 msgid "There are no branches yet"
1944 msgstr ""
1945
1946 #: rhodecode/templates/base/base.html:254
1947 #: rhodecode/templates/shortlog/shortlog_data.html:10
1948 #: rhodecode/templates/tags/tags.html:14
1949 msgid "tags"
1950 msgstr ""
1951
1952 #: rhodecode/templates/base/base.html:261
1953 #: rhodecode/templates/tags/tags_data.html:32
1954 msgid "There are no tags yet"
1955 msgstr ""
1956
1957 #: rhodecode/templates/base/base.html:277
1958 #: rhodecode/templates/base/base.html:281
1959 #: rhodecode/templates/files/files_annotate.html:40
1960 #: rhodecode/templates/files/files_source.html:11
1961 msgid "Options"
1962 msgstr ""
1963
1964 #: rhodecode/templates/base/base.html:286
1965 #: rhodecode/templates/base/base.html:288
1966 #: rhodecode/templates/base/base.html:306
1967 msgid "settings"
1968 msgstr ""
1969
1970 #: rhodecode/templates/base/base.html:292
1971 msgid "search"
1972 msgstr ""
1973
1974 #: rhodecode/templates/base/base.html:299
1975 msgid "journal"
1976 msgstr ""
1977
1978 #: rhodecode/templates/base/base.html:301
1979 msgid "repositories groups"
1980 msgstr ""
1981
1982 #: rhodecode/templates/base/base.html:302
1983 msgid "users"
1984 msgstr ""
1985
1986 #: rhodecode/templates/base/base.html:303
1987 msgid "users groups"
1988 msgstr ""
1989
1990 #: rhodecode/templates/base/base.html:304
1991 msgid "permissions"
1992 msgstr ""
1993
1994 #: rhodecode/templates/base/base.html:317
1995 #: rhodecode/templates/base/base.html:319
1996 #: rhodecode/templates/followers/followers.html:5
1997 msgid "Followers"
1998 msgstr ""
1999
2000 #: rhodecode/templates/base/base.html:325
2001 #: rhodecode/templates/base/base.html:327
2002 #: rhodecode/templates/forks/forks.html:5
2003 msgid "Forks"
2004 msgstr ""
2005
2006 #: rhodecode/templates/base/base.html:356
2007 #: rhodecode/templates/base/base.html:358
2008 #: rhodecode/templates/base/base.html:360
2009 #: rhodecode/templates/search/search.html:4
2010 #: rhodecode/templates/search/search.html:24
2011 #: rhodecode/templates/search/search.html:46
2012 msgid "Search"
2013 msgstr ""
2014
2015 #: rhodecode/templates/base/root.html:57
2016 #: rhodecode/templates/journal/journal.html:48
2017 #: rhodecode/templates/summary/summary.html:36
2018 msgid "Stop following this repository"
2019 msgstr ""
2020
2021 #: rhodecode/templates/base/root.html:66
2022 #: rhodecode/templates/summary/summary.html:40
2023 msgid "Start following this repository"
2024 msgstr ""
2025
2026 #: rhodecode/templates/branches/branches_data.html:4
2027 #: rhodecode/templates/tags/tags_data.html:4
2028 msgid "date"
2029 msgstr ""
2030
2031 #: rhodecode/templates/branches/branches_data.html:6
2032 #: rhodecode/templates/shortlog/shortlog_data.html:7
2033 #: rhodecode/templates/tags/tags_data.html:6
2034 msgid "author"
2035 msgstr ""
2036
2037 #: rhodecode/templates/branches/branches_data.html:8
2038 #: rhodecode/templates/shortlog/shortlog_data.html:11
2039 #: rhodecode/templates/tags/tags_data.html:8
2040 msgid "links"
2041 msgstr ""
2042
2043 #: rhodecode/templates/branches/branches_data.html:23
2044 #: rhodecode/templates/branches/branches_data.html:43
2045 #: rhodecode/templates/shortlog/shortlog_data.html:39
2046 #: rhodecode/templates/tags/tags_data.html:24
2047 msgid "changeset"
2048 msgstr ""
2049
2050 #: rhodecode/templates/branches/branches_data.html:25
2051 #: rhodecode/templates/branches/branches_data.html:45
2052 #: rhodecode/templates/files/files.html:12
2053 #: rhodecode/templates/shortlog/shortlog_data.html:41
2054 #: rhodecode/templates/summary/summary.html:233
2055 #: rhodecode/templates/tags/tags_data.html:26
2056 msgid "files"
2057 msgstr ""
2058
2059 #: rhodecode/templates/changelog/changelog.html:14
2060 msgid "showing "
2061 msgstr ""
2062
2063 #: rhodecode/templates/changelog/changelog.html:14
2064 msgid "out of"
2065 msgstr ""
2066
2067 #: rhodecode/templates/changelog/changelog.html:37
2068 msgid "Show"
2069 msgstr ""
2070
2071 #: rhodecode/templates/changelog/changelog.html:50
2072 #: rhodecode/templates/changeset/changeset.html:42
2073 #: rhodecode/templates/summary/summary.html:609
2074 msgid "commit"
2075 msgstr ""
2076
2077 #: rhodecode/templates/changelog/changelog.html:63
2078 msgid "Affected number of files, click to show more details"
2079 msgstr ""
2080
2081 #: rhodecode/templates/changelog/changelog.html:67
2082 #: rhodecode/templates/changeset/changeset.html:66
2083 msgid "merge"
2084 msgstr ""
2085
2086 #: rhodecode/templates/changelog/changelog.html:72
2087 #: rhodecode/templates/changeset/changeset.html:72
2088 msgid "Parent"
2089 msgstr ""
2090
2091 #: rhodecode/templates/changelog/changelog.html:77
2092 #: rhodecode/templates/changeset/changeset.html:77
2093 msgid "No parents"
2094 msgstr ""
2095
2096 #: rhodecode/templates/changelog/changelog.html:82
2097 #: rhodecode/templates/changeset/changeset.html:80
2098 #: rhodecode/templates/files/files.html:29
2099 #: rhodecode/templates/files/files_annotate.html:25
2100 #: rhodecode/templates/files/files_edit.html:33
2101 #: rhodecode/templates/shortlog/shortlog_data.html:9
2102 msgid "branch"
2103 msgstr ""
2104
2105 #: rhodecode/templates/changelog/changelog.html:86
2106 #: rhodecode/templates/changeset/changeset.html:83
2107 msgid "tag"
2108 msgstr ""
2109
2110 #: rhodecode/templates/changelog/changelog.html:122
2111 msgid "Show selected changes __S -> __E"
2112 msgstr ""
2113
2114 #: rhodecode/templates/changelog/changelog.html:172
2115 #: rhodecode/templates/shortlog/shortlog_data.html:61
2116 msgid "There are no changes yet"
2117 msgstr ""
2118
2119 #: rhodecode/templates/changelog/changelog_details.html:2
2120 #: rhodecode/templates/changeset/changeset.html:55
2121 msgid "removed"
2122 msgstr ""
2123
2124 #: rhodecode/templates/changelog/changelog_details.html:3
2125 #: rhodecode/templates/changeset/changeset.html:56
2126 msgid "changed"
2127 msgstr ""
2128
2129 #: rhodecode/templates/changelog/changelog_details.html:4
2130 #: rhodecode/templates/changeset/changeset.html:57
2131 msgid "added"
2132 msgstr ""
2133
2134 #: rhodecode/templates/changelog/changelog_details.html:6
2135 #: rhodecode/templates/changelog/changelog_details.html:7
2136 #: rhodecode/templates/changelog/changelog_details.html:8
2137 #: rhodecode/templates/changeset/changeset.html:59
2138 #: rhodecode/templates/changeset/changeset.html:60
2139 #: rhodecode/templates/changeset/changeset.html:61
2140 #, python-format
2141 msgid "affected %s files"
2142 msgstr ""
2143
2144 #: rhodecode/templates/changeset/changeset.html:6
2145 #: rhodecode/templates/changeset/changeset.html:14
2146 #: rhodecode/templates/changeset/changeset.html:31
2147 msgid "Changeset"
2148 msgstr ""
2149
2150 #: rhodecode/templates/changeset/changeset.html:32
2151 #: rhodecode/templates/changeset/changeset.html:121
2152 #: rhodecode/templates/changeset/changeset_range.html:78
2153 #: rhodecode/templates/files/file_diff.html:32
2154 #: rhodecode/templates/files/file_diff.html:42
2155 msgid "raw diff"
2156 msgstr ""
2157
2158 #: rhodecode/templates/changeset/changeset.html:34
2159 #: rhodecode/templates/changeset/changeset.html:123
2160 #: rhodecode/templates/changeset/changeset_range.html:80
2161 #: rhodecode/templates/files/file_diff.html:34
2162 msgid "download diff"
2163 msgstr ""
2164
2165 #: rhodecode/templates/changeset/changeset.html:90
2166 #, python-format
2167 msgid "%s files affected with %s additions and %s deletions."
2168 msgstr ""
2169
2170 #: rhodecode/templates/changeset/changeset.html:101
2171 msgid "Changeset was too big and was cut off..."
2172 msgstr ""
2173
2174 #: rhodecode/templates/changeset/changeset.html:119
2175 #: rhodecode/templates/changeset/changeset_range.html:76
2176 #: rhodecode/templates/files/file_diff.html:30
2177 msgid "diff"
2178 msgstr ""
2179
2180 #: rhodecode/templates/changeset/changeset.html:132
2181 #: rhodecode/templates/changeset/changeset_range.html:89
2182 msgid "No changes in this file"
2183 msgstr ""
2184
2185 #: rhodecode/templates/changeset/changeset_range.html:30
2186 msgid "Compare View"
2187 msgstr ""
2188
2189 #: rhodecode/templates/changeset/changeset_range.html:52
2190 msgid "Files affected"
2191 msgstr ""
2192
2193 #: rhodecode/templates/errors/error_document.html:44
2194 #, python-format
2195 msgid "You will be redirected to %s in %s seconds"
2196 msgstr ""
2197
2198 #: rhodecode/templates/files/file_diff.html:4
2199 #: rhodecode/templates/files/file_diff.html:12
2200 msgid "File diff"
2201 msgstr ""
2202
2203 #: rhodecode/templates/files/file_diff.html:42
2204 msgid "Diff is to big to display"
2205 msgstr ""
2206
2207 #: rhodecode/templates/files/files.html:37
2208 #: rhodecode/templates/files/files_annotate.html:31
2209 #: rhodecode/templates/files/files_edit.html:39
2210 msgid "Location"
2211 msgstr ""
2212
2213 #: rhodecode/templates/files/files.html:46
2214 msgid "Go back"
2215 msgstr ""
2216
2217 #: rhodecode/templates/files/files.html:47
2218 msgid "No files at given path"
2219 msgstr ""
2220
2221 #: rhodecode/templates/files/files_annotate.html:4
2222 msgid "File annotate"
2223 msgstr ""
2224
2225 #: rhodecode/templates/files/files_annotate.html:12
2226 msgid "annotate"
2227 msgstr ""
2228
2229 #: rhodecode/templates/files/files_annotate.html:33
2230 #: rhodecode/templates/files/files_browser.html:160
2231 #: rhodecode/templates/files/files_source.html:2
2232 msgid "Revision"
2233 msgstr ""
2234
2235 #: rhodecode/templates/files/files_annotate.html:36
2236 #: rhodecode/templates/files/files_browser.html:158
2237 #: rhodecode/templates/files/files_source.html:7
2238 msgid "Size"
2239 msgstr ""
2240
2241 #: rhodecode/templates/files/files_annotate.html:38
2242 #: rhodecode/templates/files/files_browser.html:159
2243 #: rhodecode/templates/files/files_source.html:9
2244 msgid "Mimetype"
2245 msgstr ""
2246
2247 #: rhodecode/templates/files/files_annotate.html:41
2248 msgid "show source"
2249 msgstr ""
2250
2251 #: rhodecode/templates/files/files_annotate.html:43
2252 #: rhodecode/templates/files/files_annotate.html:78
2253 #: rhodecode/templates/files/files_source.html:14
2254 #: rhodecode/templates/files/files_source.html:51
2255 msgid "show as raw"
2256 msgstr ""
2257
2258 #: rhodecode/templates/files/files_annotate.html:45
2259 #: rhodecode/templates/files/files_source.html:16
2260 msgid "download as raw"
2261 msgstr ""
2262
2263 #: rhodecode/templates/files/files_annotate.html:54
2264 #: rhodecode/templates/files/files_source.html:25
2265 msgid "History"
2266 msgstr ""
2267
2268 #: rhodecode/templates/files/files_annotate.html:73
2269 #: rhodecode/templates/files/files_source.html:46
2270 #, python-format
2271 msgid "Binary file (%s)"
2272 msgstr ""
2273
2274 #: rhodecode/templates/files/files_annotate.html:78
2275 #: rhodecode/templates/files/files_source.html:51
2276 msgid "File is too big to display"
2277 msgstr ""
2278
2279 #: rhodecode/templates/files/files_browser.html:13
2280 msgid "view"
2281 msgstr ""
2282
2283 #: rhodecode/templates/files/files_browser.html:14
2284 msgid "previous revision"
2285 msgstr ""
2286
2287 #: rhodecode/templates/files/files_browser.html:16
2288 msgid "next revision"
2289 msgstr ""
2290
2291 #: rhodecode/templates/files/files_browser.html:23
2292 msgid "follow current branch"
2293 msgstr ""
2294
2295 #: rhodecode/templates/files/files_browser.html:27
2296 msgid "search file list"
2297 msgstr ""
2298
2299 #: rhodecode/templates/files/files_browser.html:32
2300 msgid "Loading file list..."
2301 msgstr ""
2302
2303 #: rhodecode/templates/files/files_browser.html:111
2304 msgid "search truncated"
2305 msgstr ""
2306
2307 #: rhodecode/templates/files/files_browser.html:122
2308 msgid "no matching files"
2309 msgstr ""
2310
2311 #: rhodecode/templates/files/files_browser.html:161
2312 msgid "Last modified"
2313 msgstr ""
2314
2315 #: rhodecode/templates/files/files_browser.html:162
2316 msgid "Last commiter"
2317 msgstr ""
2318
2319 #: rhodecode/templates/files/files_edit.html:4
2320 msgid "Edit file"
2321 msgstr ""
2322
2323 #: rhodecode/templates/files/files_edit.html:19
2324 msgid "edit file"
2325 msgstr ""
2326
2327 #: rhodecode/templates/files/files_edit.html:45
2328 #: rhodecode/templates/shortlog/shortlog_data.html:5
2329 msgid "commit message"
2330 msgstr ""
2331
2332 #: rhodecode/templates/files/files_edit.html:51
2333 msgid "Commit changes"
2334 msgstr ""
2335
2336 #: rhodecode/templates/files/files_source.html:12
2337 msgid "show annotation"
2338 msgstr ""
2339
2340 #: rhodecode/templates/files/files_source.html:153
2341 msgid "Selection link"
2342 msgstr ""
2343
2344 #: rhodecode/templates/followers/followers.html:13
2345 msgid "followers"
2346 msgstr ""
2347
2348 #: rhodecode/templates/followers/followers_data.html:12
2349 msgid "Started following"
2350 msgstr ""
2351
2352 #: rhodecode/templates/forks/forks.html:13
2353 msgid "forks"
2354 msgstr ""
2355
2356 #: rhodecode/templates/forks/forks_data.html:17
2357 msgid "forked"
2358 msgstr ""
2359
2360 #: rhodecode/templates/forks/forks_data.html:34
2361 msgid "There are no forks yet"
2362 msgstr ""
2363
2364 #: rhodecode/templates/journal/journal.html:34
2365 msgid "Following"
2366 msgstr ""
2367
2368 #: rhodecode/templates/journal/journal.html:41
2369 msgid "following user"
2370 msgstr ""
2371
2372 #: rhodecode/templates/journal/journal.html:41
2373 msgid "user"
2374 msgstr ""
2375
2376 #: rhodecode/templates/journal/journal.html:65
2377 msgid "You are not following any users or repositories"
2378 msgstr ""
2379
2380 #: rhodecode/templates/journal/journal_data.html:46
2381 msgid "No entries yet"
2382 msgstr ""
2383
2384 #: rhodecode/templates/journal/public_journal.html:17
2385 msgid "Public Journal"
2386 msgstr ""
2387
2388 #: rhodecode/templates/search/search.html:7
2389 #: rhodecode/templates/search/search.html:26
2390 msgid "in repository: "
2391 msgstr ""
2392
2393 #: rhodecode/templates/search/search.html:9
2394 #: rhodecode/templates/search/search.html:28
2395 msgid "in all repositories"
2396 msgstr ""
2397
2398 #: rhodecode/templates/search/search.html:42
2399 msgid "Search term"
2400 msgstr ""
2401
2402 #: rhodecode/templates/search/search.html:54
2403 msgid "Search in"
2404 msgstr ""
2405
2406 #: rhodecode/templates/search/search.html:57
2407 msgid "File contents"
2408 msgstr ""
2409
2410 #: rhodecode/templates/search/search.html:59
2411 msgid "File names"
2412 msgstr ""
2413
2414 #: rhodecode/templates/search/search_content.html:20
2415 #: rhodecode/templates/search/search_path.html:15
2416 msgid "Permission denied"
2417 msgstr ""
2418
2419 #: rhodecode/templates/settings/repo_fork.html:5
2420 msgid "Fork"
2421 msgstr ""
2422
2423 #: rhodecode/templates/settings/repo_fork.html:31
2424 msgid "Fork name"
2425 msgstr ""
2426
2427 #: rhodecode/templates/settings/repo_fork.html:55
2428 msgid "fork this repository"
2429 msgstr ""
2430
2431 #: rhodecode/templates/shortlog/shortlog.html:5
2432 #: rhodecode/templates/summary/summary.html:666
2433 msgid "Shortlog"
2434 msgstr ""
2435
2436 #: rhodecode/templates/shortlog/shortlog.html:14
2437 msgid "shortlog"
2438 msgstr ""
2439
2440 #: rhodecode/templates/shortlog/shortlog_data.html:6
2441 msgid "age"
2442 msgstr ""
2443
2444 #: rhodecode/templates/summary/summary.html:12
2445 msgid "summary"
2446 msgstr ""
2447
2448 #: rhodecode/templates/summary/summary.html:79
2449 msgid "remote clone"
2450 msgstr ""
2451
2452 #: rhodecode/templates/summary/summary.html:121
2453 msgid "by"
2454 msgstr ""
2455
2456 #: rhodecode/templates/summary/summary.html:128
2457 msgid "Clone url"
2458 msgstr ""
2459
2460 #: rhodecode/templates/summary/summary.html:137
2461 msgid "Trending source files"
2462 msgstr ""
2463
2464 #: rhodecode/templates/summary/summary.html:146
2465 msgid "Download"
2466 msgstr ""
2467
2468 #: rhodecode/templates/summary/summary.html:150
2469 msgid "There are no downloads yet"
2470 msgstr ""
2471
2472 #: rhodecode/templates/summary/summary.html:152
2473 msgid "Downloads are disabled for this repository"
2474 msgstr ""
2475
2476 #: rhodecode/templates/summary/summary.html:154
2477 #: rhodecode/templates/summary/summary.html:320
2478 msgid "enable"
2479 msgstr ""
2480
2481 #: rhodecode/templates/summary/summary.html:162
2482 #: rhodecode/templates/summary/summary.html:297
2483 #, python-format
2484 msgid "Download %s as %s"
2485 msgstr ""
2486
2487 #: rhodecode/templates/summary/summary.html:168
2488 msgid "Check this to download archive with subrepos"
2489 msgstr ""
2490
2491 #: rhodecode/templates/summary/summary.html:168
2492 msgid "with subrepos"
2493 msgstr ""
2494
2495 #: rhodecode/templates/summary/summary.html:176
2496 msgid "Feeds"
2497 msgstr ""
2498
2499 #: rhodecode/templates/summary/summary.html:257
2500 #: rhodecode/templates/summary/summary.html:684
2501 #: rhodecode/templates/summary/summary.html:695
2502 msgid "show more"
2503 msgstr ""
2504
2505 #: rhodecode/templates/summary/summary.html:312
2506 msgid "Commit activity by day / author"
2507 msgstr ""
2508
2509 #: rhodecode/templates/summary/summary.html:324
2510 msgid "Loaded in"
2511 msgstr ""
2512
2513 #: rhodecode/templates/summary/summary.html:603
2514 msgid "commits"
2515 msgstr ""
2516
2517 #: rhodecode/templates/summary/summary.html:604
2518 msgid "files added"
2519 msgstr ""
2520
2521 #: rhodecode/templates/summary/summary.html:605
2522 msgid "files changed"
2523 msgstr ""
2524
2525 #: rhodecode/templates/summary/summary.html:606
2526 msgid "files removed"
2527 msgstr ""
2528
2529 #: rhodecode/templates/summary/summary.html:610
2530 msgid "file added"
2531 msgstr ""
2532
2533 #: rhodecode/templates/summary/summary.html:611
2534 msgid "file changed"
2535 msgstr ""
2536
2537 #: rhodecode/templates/summary/summary.html:612
2538 msgid "file removed"
2539 msgstr ""
2540
@@ -1,15 +1,28 b''
1 #goto pylons folder app (the on holding .ini files)
1 ##########################
2 # to create new language #
3 ##########################
2
4
3 # to create new
5 #this needs to be done on source codes, preferable default/stable branches
6
4 python setup.py extract_messages -> get messages from project
7 python setup.py extract_messages -> get messages from project
5 python setup.py init_catalog -l pl -> create a language directory
8 python setup.py init_catalog -l pl -> create a language directory for <pl> lang
6 edit the new po file with poedit
9 edit the new po file with poedit or any other editor
7 python setup.py compile_catalog -> create translation files
10 python setup.py compile_catalog -> create translation files
8 #done
11
9
12 #############
10 # to update
13 # to update #
14 #############
15
11 python setup.py extract_messages -> get messages from project
16 python setup.py extract_messages -> get messages from project
12 python setup.py update_catalog -> to update the translations
17 python setup.py update_catalog -> to update the translations
13 edit the new updated po file with poedit
18 edit the new updated po file with poedit
14 python setup.py compile_catalog -> create translation files
19 python setup.py compile_catalog -> create translation files
15 #done No newline at end of file
20
21
22 ###################
23 # change language #
24 ###################
25
26 `lang=en`
27
28 in the .ini file No newline at end of file
This diff has been collapsed as it changes many lines, (2073 lines changed) Show them Hide them
@@ -6,273 +6,477 b''
6 #, fuzzy
6 #, fuzzy
7 msgid ""
7 msgid ""
8 msgstr ""
8 msgstr ""
9 "Project-Id-Version: RhodeCode 1.1.5\n"
9 "Project-Id-Version: RhodeCode 1.2.0\n"
10 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11 "POT-Creation-Date: 2011-03-17 02:38+0100\n"
11 "POT-Creation-Date: 2011-09-14 15:50-0300\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
15 "MIME-Version: 1.0\n"
15 "MIME-Version: 1.0\n"
16 "Content-Type: text/plain; charset=utf-8\n"
16 "Content-Type: text/plain; charset=utf-8\n"
17 "Content-Transfer-Encoding: 8bit\n"
17 "Content-Transfer-Encoding: 8bit\n"
18 "Generated-By: Babel 0.9.5\n"
18 "Generated-By: Babel 0.9.6\n"
19
19
20 #: rhodecode/controllers/changeset.py:87 rhodecode/controllers/changeset.py:113
20 #: rhodecode/controllers/changeset.py:108 rhodecode/controllers/changeset.py:149
21 #: rhodecode/controllers/changeset.py:159 rhodecode/controllers/changeset.py:171
21 #: rhodecode/controllers/changeset.py:216 rhodecode/controllers/changeset.py:229
22 msgid "binary file"
22 msgid "binary file"
23 msgstr ""
23 msgstr ""
24
24
25 #: rhodecode/controllers/changeset.py:95 rhodecode/controllers/changeset.py:122
25 #: rhodecode/controllers/changeset.py:123 rhodecode/controllers/changeset.py:168
26 msgid "Changeset is to big and was cut off, see raw changeset instead"
26 msgid "Changeset is to big and was cut off, see raw changeset instead"
27 msgstr ""
27 msgstr ""
28
28
29 #: rhodecode/controllers/error.py:70
29 #: rhodecode/controllers/changeset.py:159
30 msgid "Diff is to big and was cut off, see raw diff instead"
31 msgstr ""
32
33 #: rhodecode/controllers/error.py:69
30 msgid "Home page"
34 msgid "Home page"
31 msgstr ""
35 msgstr ""
32
36
33 #: rhodecode/controllers/error.py:100
37 #: rhodecode/controllers/error.py:98
34 msgid "The request could not be understood by the server due to malformed syntax."
38 msgid "The request could not be understood by the server due to malformed syntax."
35 msgstr ""
39 msgstr ""
36
40
37 #: rhodecode/controllers/error.py:102
41 #: rhodecode/controllers/error.py:101
38 msgid "Unauthorized access to resource"
42 msgid "Unauthorized access to resource"
39 msgstr ""
43 msgstr ""
40
44
41 #: rhodecode/controllers/error.py:104
45 #: rhodecode/controllers/error.py:103
42 msgid "You don't have permission to view this page"
46 msgid "You don't have permission to view this page"
43 msgstr ""
47 msgstr ""
44
48
45 #: rhodecode/controllers/error.py:106
49 #: rhodecode/controllers/error.py:105
46 msgid "The resource could not be found"
50 msgid "The resource could not be found"
47 msgstr ""
51 msgstr ""
48
52
49 #: rhodecode/controllers/error.py:108
53 #: rhodecode/controllers/error.py:107
50 msgid ""
54 msgid ""
51 "The server encountered an unexpected condition which prevented it from "
55 "The server encountered an unexpected condition which prevented it from "
52 "fulfilling the request."
56 "fulfilling the request."
53 msgstr ""
57 msgstr ""
54
58
55 #: rhodecode/controllers/files.py:71
59 #: rhodecode/controllers/feed.py:48
60 #, python-format
61 msgid "Changes on %s repository"
62 msgstr ""
63
64 #: rhodecode/controllers/feed.py:49
65 #, python-format
66 msgid "%s %s feed"
67 msgstr ""
68
69 #: rhodecode/controllers/files.py:72
56 msgid "There are no files yet"
70 msgid "There are no files yet"
57 msgstr ""
71 msgstr ""
58
72
59 #: rhodecode/controllers/files.py:222 rhodecode/controllers/files.py:228
73 #: rhodecode/controllers/files.py:262
60 msgid "binary file changed"
74 #, python-format
61 msgstr ""
75 msgid "Edited %s via RhodeCode"
62
76 msgstr ""
63 #: rhodecode/controllers/files.py:233 rhodecode/controllers/files.py:241
77
64 msgid "Diff is to big to display"
78 #: rhodecode/controllers/files.py:267 rhodecode/templates/files/file_diff.html:40
65 msgstr ""
79 msgid "No changes"
66
80 msgstr ""
67 #: rhodecode/controllers/files.py:235 rhodecode/controllers/files.py:243
81
82 #: rhodecode/controllers/files.py:278
83 #, python-format
84 msgid "Successfully committed to %s"
85 msgstr ""
86
87 #: rhodecode/controllers/files.py:283
88 msgid "Error occurred during commit"
89 msgstr ""
90
91 #: rhodecode/controllers/files.py:308
92 msgid "downloads disabled"
93 msgstr ""
94
95 #: rhodecode/controllers/files.py:313
96 #, python-format
97 msgid "Unknown revision %s"
98 msgstr ""
99
100 #: rhodecode/controllers/files.py:315
101 msgid "Empty repository"
102 msgstr ""
103
104 #: rhodecode/controllers/files.py:317
105 msgid "Unknown archive type"
106 msgstr ""
107
108 #: rhodecode/controllers/files.py:385 rhodecode/controllers/files.py:398
68 msgid "Binary file"
109 msgid "Binary file"
69 msgstr ""
110 msgstr ""
70
111
71 #: rhodecode/controllers/files.py:258
112 #: rhodecode/controllers/files.py:417
113 #: rhodecode/templates/changeset/changeset_range.html:4
114 #: rhodecode/templates/changeset/changeset_range.html:12
115 #: rhodecode/templates/changeset/changeset_range.html:29
72 msgid "Changesets"
116 msgid "Changesets"
73 msgstr ""
117 msgstr ""
74
118
75 #: rhodecode/controllers/files.py:259 rhodecode/templates/branches/branches.html:5
119 #: rhodecode/controllers/files.py:418 rhodecode/controllers/summary.py:175
76 #: rhodecode/templates/summary/summary.html:633
120 #: rhodecode/templates/branches/branches.html:5
121 #: rhodecode/templates/summary/summary.html:690
77 msgid "Branches"
122 msgid "Branches"
78 msgstr ""
123 msgstr ""
79
124
80 #: rhodecode/controllers/files.py:260 rhodecode/templates/summary/summary.html:622
125 #: rhodecode/controllers/files.py:419 rhodecode/controllers/summary.py:176
126 #: rhodecode/templates/summary/summary.html:679
81 #: rhodecode/templates/tags/tags.html:5
127 #: rhodecode/templates/tags/tags.html:5
82 msgid "Tags"
128 msgid "Tags"
83 msgstr ""
129 msgstr ""
84
130
85 #: rhodecode/controllers/login.py:112
131 #: rhodecode/controllers/journal.py:50
132 #, python-format
133 msgid "%s public journal %s feed"
134 msgstr ""
135
136 #: rhodecode/controllers/journal.py:178 rhodecode/controllers/journal.py:212
137 #: rhodecode/templates/admin/repos/repo_edit.html:171
138 #: rhodecode/templates/base/base.html:50
139 msgid "Public journal"
140 msgstr ""
141
142 #: rhodecode/controllers/login.py:111
86 msgid "You have successfully registered into rhodecode"
143 msgid "You have successfully registered into rhodecode"
87 msgstr ""
144 msgstr ""
88
145
89 #: rhodecode/controllers/login.py:134
146 #: rhodecode/controllers/login.py:133
90 msgid "Your new password was sent"
147 msgid "Your password reset link was sent"
91 msgstr ""
148 msgstr ""
92
149
93 #: rhodecode/controllers/search.py:111
150 #: rhodecode/controllers/login.py:155
151 msgid "Your password reset was successful, new password has been sent to your email"
152 msgstr ""
153
154 #: rhodecode/controllers/search.py:109
94 msgid "Invalid search query. Try quoting it."
155 msgid "Invalid search query. Try quoting it."
95 msgstr ""
156 msgstr ""
96
157
97 #: rhodecode/controllers/search.py:116
158 #: rhodecode/controllers/search.py:114
98 msgid "There is no index to search in. Please run whoosh indexer"
159 msgid "There is no index to search in. Please run whoosh indexer"
99 msgstr ""
160 msgstr ""
100
161
101 #: rhodecode/controllers/settings.py:59 rhodecode/controllers/settings.py:152
162 #: rhodecode/controllers/search.py:118
163 msgid "An error occurred during this search operation"
164 msgstr ""
165
166 #: rhodecode/controllers/settings.py:61 rhodecode/controllers/settings.py:171
102 #, python-format
167 #, python-format
103 msgid ""
168 msgid ""
104 "%s repository is not mapped to db perhaps it was created or renamed from the "
169 "%s repository is not mapped to db perhaps it was created or renamed from the "
105 "file system please run the application again in order to rescan repositories"
170 "file system please run the application again in order to rescan repositories"
106 msgstr ""
171 msgstr ""
107
172
108 #: rhodecode/controllers/settings.py:90 rhodecode/controllers/admin/repos.py:142
173 #: rhodecode/controllers/settings.py:109 rhodecode/controllers/admin/repos.py:239
109 #, python-format
174 #, python-format
110 msgid "Repository %s updated successfully"
175 msgid "Repository %s updated successfully"
111 msgstr ""
176 msgstr ""
112
177
113 #: rhodecode/controllers/settings.py:107 rhodecode/controllers/admin/repos.py:175
178 #: rhodecode/controllers/settings.py:126 rhodecode/controllers/admin/repos.py:257
114 #, python-format
179 #, python-format
115 msgid "error occurred during update of repository %s"
180 msgid "error occurred during update of repository %s"
116 msgstr ""
181 msgstr ""
117
182
118 #: rhodecode/controllers/settings.py:126 rhodecode/controllers/admin/repos.py:193
183 #: rhodecode/controllers/settings.py:144 rhodecode/controllers/admin/repos.py:275
119 #, python-format
184 #, python-format
120 msgid ""
185 msgid ""
121 "%s repository is not mapped to db perhaps it was moved or renamed from the "
186 "%s repository is not mapped to db perhaps it was moved or renamed from the "
122 "filesystem please run the application again in order to rescan repositories"
187 "filesystem please run the application again in order to rescan repositories"
123 msgstr ""
188 msgstr ""
124
189
125 #: rhodecode/controllers/settings.py:138 rhodecode/controllers/admin/repos.py:205
190 #: rhodecode/controllers/settings.py:156 rhodecode/controllers/admin/repos.py:287
126 #, python-format
191 #, python-format
127 msgid "deleted repository %s"
192 msgid "deleted repository %s"
128 msgstr ""
193 msgstr ""
129
194
130 #: rhodecode/controllers/settings.py:140 rhodecode/controllers/admin/repos.py:209
195 #: rhodecode/controllers/settings.py:159 rhodecode/controllers/admin/repos.py:297
196 #: rhodecode/controllers/admin/repos.py:303
131 #, python-format
197 #, python-format
132 msgid "An error occurred during deletion of %s"
198 msgid "An error occurred during deletion of %s"
133 msgstr ""
199 msgstr ""
134
200
135 #: rhodecode/controllers/settings.py:174
201 #: rhodecode/controllers/settings.py:193
136 #, python-format
202 #, python-format
137 msgid "forked %s repository as %s"
203 msgid "forked %s repository as %s"
138 msgstr ""
204 msgstr ""
139
205
140 #: rhodecode/controllers/summary.py:114
206 #: rhodecode/controllers/settings.py:211
207 #, python-format
208 msgid "An error occurred during repository forking %s"
209 msgstr ""
210
211 #: rhodecode/controllers/summary.py:123
141 msgid "No data loaded yet"
212 msgid "No data loaded yet"
142 msgstr ""
213 msgstr ""
143
214
144 #: rhodecode/controllers/summary.py:117
215 #: rhodecode/controllers/summary.py:126
145 msgid "Statistics update are disabled for this repository"
216 msgid "Statistics are disabled for this repository"
146 msgstr ""
217 msgstr ""
147
218
148 #: rhodecode/controllers/admin/ldap_settings.py:84
219 #: rhodecode/controllers/admin/ldap_settings.py:49
220 msgid "BASE"
221 msgstr ""
222
223 #: rhodecode/controllers/admin/ldap_settings.py:50
224 msgid "ONELEVEL"
225 msgstr ""
226
227 #: rhodecode/controllers/admin/ldap_settings.py:51
228 msgid "SUBTREE"
229 msgstr ""
230
231 #: rhodecode/controllers/admin/ldap_settings.py:55
232 msgid "NEVER"
233 msgstr ""
234
235 #: rhodecode/controllers/admin/ldap_settings.py:56
236 msgid "ALLOW"
237 msgstr ""
238
239 #: rhodecode/controllers/admin/ldap_settings.py:57
240 msgid "TRY"
241 msgstr ""
242
243 #: rhodecode/controllers/admin/ldap_settings.py:58
244 msgid "DEMAND"
245 msgstr ""
246
247 #: rhodecode/controllers/admin/ldap_settings.py:59
248 msgid "HARD"
249 msgstr ""
250
251 #: rhodecode/controllers/admin/ldap_settings.py:63
252 msgid "No encryption"
253 msgstr ""
254
255 #: rhodecode/controllers/admin/ldap_settings.py:64
256 msgid "LDAPS connection"
257 msgstr ""
258
259 #: rhodecode/controllers/admin/ldap_settings.py:65
260 msgid "START_TLS on LDAP connection"
261 msgstr ""
262
263 #: rhodecode/controllers/admin/ldap_settings.py:115
149 msgid "Ldap settings updated successfully"
264 msgid "Ldap settings updated successfully"
150 msgstr ""
265 msgstr ""
151
266
152 #: rhodecode/controllers/admin/ldap_settings.py:89
267 #: rhodecode/controllers/admin/ldap_settings.py:120
153 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
268 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
154 msgstr ""
269 msgstr ""
155
270
156 #: rhodecode/controllers/admin/ldap_settings.py:102
271 #: rhodecode/controllers/admin/ldap_settings.py:134
157 msgid "error occurred during update of ldap settings"
272 msgid "error occurred during update of ldap settings"
158 msgstr ""
273 msgstr ""
159
274
275 #: rhodecode/controllers/admin/permissions.py:56
276 msgid "None"
277 msgstr ""
278
279 #: rhodecode/controllers/admin/permissions.py:57
280 msgid "Read"
281 msgstr ""
282
283 #: rhodecode/controllers/admin/permissions.py:58
284 msgid "Write"
285 msgstr ""
286
160 #: rhodecode/controllers/admin/permissions.py:59
287 #: rhodecode/controllers/admin/permissions.py:59
161 msgid "None"
162 msgstr ""
163
164 #: rhodecode/controllers/admin/permissions.py:60
165 msgid "Read"
166 msgstr ""
167
168 #: rhodecode/controllers/admin/permissions.py:61
169 msgid "Write"
170 msgstr ""
171
172 #: rhodecode/controllers/admin/permissions.py:62
173 #: rhodecode/templates/admin/ldap/ldap.html:9
288 #: rhodecode/templates/admin/ldap/ldap.html:9
174 #: rhodecode/templates/admin/permissions/permissions.html:9
289 #: rhodecode/templates/admin/permissions/permissions.html:9
175 #: rhodecode/templates/admin/repos/repo_add.html:9
290 #: rhodecode/templates/admin/repos/repo_add.html:9
176 #: rhodecode/templates/admin/repos/repo_edit.html:9
291 #: rhodecode/templates/admin/repos/repo_edit.html:9
177 #: rhodecode/templates/admin/repos/repos.html:10
292 #: rhodecode/templates/admin/repos/repos.html:10
293 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:8
294 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:8
295 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
296 #: rhodecode/templates/admin/settings/hooks.html:9
178 #: rhodecode/templates/admin/settings/settings.html:9
297 #: rhodecode/templates/admin/settings/settings.html:9
179 #: rhodecode/templates/admin/users/user_add.html:8
298 #: rhodecode/templates/admin/users/user_add.html:8
180 #: rhodecode/templates/admin/users/user_edit.html:9
299 #: rhodecode/templates/admin/users/user_edit.html:9
181 #: rhodecode/templates/admin/users/user_edit.html:97
300 #: rhodecode/templates/admin/users/user_edit.html:110
182 #: rhodecode/templates/admin/users/users.html:9
301 #: rhodecode/templates/admin/users/users.html:9
183 #: rhodecode/templates/base/base.html:209 rhodecode/templates/base/base.html:297
302 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
184 #: rhodecode/templates/base/base.html:299 rhodecode/templates/base/base.html:301
303 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
304 #: rhodecode/templates/admin/users_groups/users_groups.html:9
305 #: rhodecode/templates/base/base.html:279 rhodecode/templates/base/base.html:366
306 #: rhodecode/templates/base/base.html:368 rhodecode/templates/base/base.html:370
185 msgid "Admin"
307 msgid "Admin"
186 msgstr ""
308 msgstr ""
187
309
188 #: rhodecode/controllers/admin/permissions.py:65
310 #: rhodecode/controllers/admin/permissions.py:62
189 msgid "disabled"
311 msgid "disabled"
190 msgstr ""
312 msgstr ""
191
313
192 #: rhodecode/controllers/admin/permissions.py:67
314 #: rhodecode/controllers/admin/permissions.py:64
193 msgid "allowed with manual account activation"
315 msgid "allowed with manual account activation"
194 msgstr ""
316 msgstr ""
195
317
318 #: rhodecode/controllers/admin/permissions.py:66
319 msgid "allowed with automatic account activation"
320 msgstr ""
321
322 #: rhodecode/controllers/admin/permissions.py:68
323 msgid "Disabled"
324 msgstr ""
325
196 #: rhodecode/controllers/admin/permissions.py:69
326 #: rhodecode/controllers/admin/permissions.py:69
197 msgid "allowed with automatic account activation"
198 msgstr ""
199
200 #: rhodecode/controllers/admin/permissions.py:71
201 msgid "Disabled"
202 msgstr ""
203
204 #: rhodecode/controllers/admin/permissions.py:72
205 msgid "Enabled"
327 msgid "Enabled"
206 msgstr ""
328 msgstr ""
207
329
208 #: rhodecode/controllers/admin/permissions.py:106
330 #: rhodecode/controllers/admin/permissions.py:102
209 msgid "Default permissions updated successfully"
331 msgid "Default permissions updated successfully"
210 msgstr ""
332 msgstr ""
211
333
212 #: rhodecode/controllers/admin/permissions.py:123
334 #: rhodecode/controllers/admin/permissions.py:119
213 msgid "error occurred during update of permissions"
335 msgid "error occurred during update of permissions"
214 msgstr ""
336 msgstr ""
215
337
216 #: rhodecode/controllers/admin/repos.py:83
338 #: rhodecode/controllers/admin/repos.py:96
217 #, python-format
218 msgid "created repository %s"
219 msgstr ""
220
221 #: rhodecode/controllers/admin/repos.py:110
222 #, python-format
223 msgid "error occurred during creation of repository %s"
224 msgstr ""
225
226 #: rhodecode/controllers/admin/repos.py:225
227 msgid "An error occurred during deletion of repository user"
228 msgstr ""
229
230 #: rhodecode/controllers/admin/repos.py:240
231 msgid "An error occurred during deletion of repository stats"
232 msgstr ""
233
234 #: rhodecode/controllers/admin/repos.py:254
235 msgid "An error occurred during cache invalidation"
236 msgstr ""
237
238 #: rhodecode/controllers/admin/repos.py:272
239 #, python-format
339 #, python-format
240 msgid ""
340 msgid ""
241 "%s repository is not mapped to db perhaps it was created or renamed from the "
341 "%s repository is not mapped to db perhaps it was created or renamed from the "
242 "filesystem please run the application again in order to rescan repositories"
342 "filesystem please run the application again in order to rescan repositories"
243 msgstr ""
343 msgstr ""
244
344
245 #: rhodecode/controllers/admin/settings.py:112
345 #: rhodecode/controllers/admin/repos.py:172
246 msgid "Repositories successfully rescanned"
346 #, python-format
247 msgstr ""
347 msgid "created repository %s from %s"
248
348 msgstr ""
249 #: rhodecode/controllers/admin/settings.py:119
349
350 #: rhodecode/controllers/admin/repos.py:176
351 #, python-format
352 msgid "created repository %s"
353 msgstr ""
354
355 #: rhodecode/controllers/admin/repos.py:205
356 #, python-format
357 msgid "error occurred during creation of repository %s"
358 msgstr ""
359
360 #: rhodecode/controllers/admin/repos.py:292
361 #, python-format
362 msgid "Cannot delete %s it still contains attached forks"
363 msgstr ""
364
365 #: rhodecode/controllers/admin/repos.py:320
366 msgid "An error occurred during deletion of repository user"
367 msgstr ""
368
369 #: rhodecode/controllers/admin/repos.py:335
370 msgid "An error occurred during deletion of repository users groups"
371 msgstr ""
372
373 #: rhodecode/controllers/admin/repos.py:352
374 msgid "An error occurred during deletion of repository stats"
375 msgstr ""
376
377 #: rhodecode/controllers/admin/repos.py:367
378 msgid "An error occurred during cache invalidation"
379 msgstr ""
380
381 #: rhodecode/controllers/admin/repos.py:387
382 msgid "Updated repository visibility in public journal"
383 msgstr ""
384
385 #: rhodecode/controllers/admin/repos.py:390
386 msgid "An error occurred during setting this repository in public journal"
387 msgstr ""
388
389 #: rhodecode/controllers/admin/repos.py:395 rhodecode/model/forms.py:53
390 msgid "Token mismatch"
391 msgstr ""
392
393 #: rhodecode/controllers/admin/repos.py:408
394 msgid "Pulled from remote location"
395 msgstr ""
396
397 #: rhodecode/controllers/admin/repos.py:410
398 msgid "An error occurred during pull from remote location"
399 msgstr ""
400
401 #: rhodecode/controllers/admin/repos_groups.py:83
402 #, python-format
403 msgid "created repos group %s"
404 msgstr ""
405
406 #: rhodecode/controllers/admin/repos_groups.py:96
407 #, python-format
408 msgid "error occurred during creation of repos group %s"
409 msgstr ""
410
411 #: rhodecode/controllers/admin/repos_groups.py:130
412 #, python-format
413 msgid "updated repos group %s"
414 msgstr ""
415
416 #: rhodecode/controllers/admin/repos_groups.py:143
417 #, python-format
418 msgid "error occurred during update of repos group %s"
419 msgstr ""
420
421 #: rhodecode/controllers/admin/repos_groups.py:164
422 #, python-format
423 msgid "This group contains %s repositores and cannot be deleted"
424 msgstr ""
425
426 #: rhodecode/controllers/admin/repos_groups.py:171
427 #, python-format
428 msgid "removed repos group %s"
429 msgstr ""
430
431 #: rhodecode/controllers/admin/repos_groups.py:175
432 #, python-format
433 msgid "error occurred during deletion of repos group %s"
434 msgstr ""
435
436 #: rhodecode/controllers/admin/settings.py:109
437 #, python-format
438 msgid "Repositories successfully rescanned added: %s,removed: %s"
439 msgstr ""
440
441 #: rhodecode/controllers/admin/settings.py:118
250 msgid "Whoosh reindex task scheduled"
442 msgid "Whoosh reindex task scheduled"
251 msgstr ""
443 msgstr ""
252
444
253 #: rhodecode/controllers/admin/settings.py:138
254 msgid "Updated application settings"
255 msgstr ""
256
257 #: rhodecode/controllers/admin/settings.py:143
445 #: rhodecode/controllers/admin/settings.py:143
258 #: rhodecode/controllers/admin/settings.py:204
446 msgid "Updated application settings"
447 msgstr ""
448
449 #: rhodecode/controllers/admin/settings.py:148
450 #: rhodecode/controllers/admin/settings.py:215
259 msgid "error occurred during updating application settings"
451 msgid "error occurred during updating application settings"
260 msgstr ""
452 msgstr ""
261
453
262 #: rhodecode/controllers/admin/settings.py:199
454 #: rhodecode/controllers/admin/settings.py:210
263 msgid "Updated mercurial settings"
455 msgid "Updated mercurial settings"
264 msgstr ""
456 msgstr ""
265
457
266 #: rhodecode/controllers/admin/settings.py:258
458 #: rhodecode/controllers/admin/settings.py:236
459 msgid "Added new hook"
460 msgstr ""
461
462 #: rhodecode/controllers/admin/settings.py:247
463 msgid "Updated hooks"
464 msgstr ""
465
466 #: rhodecode/controllers/admin/settings.py:251
467 msgid "error occurred during hook creation"
468 msgstr ""
469
470 #: rhodecode/controllers/admin/settings.py:310
267 msgid "You can't edit this user since it's crucial for entire application"
471 msgid "You can't edit this user since it's crucial for entire application"
268 msgstr ""
472 msgstr ""
269
473
270 #: rhodecode/controllers/admin/settings.py:286
474 #: rhodecode/controllers/admin/settings.py:339
271 msgid "Your account was updated successfully"
475 msgid "Your account was updated successfully"
272 msgstr ""
476 msgstr ""
273
477
274 #: rhodecode/controllers/admin/settings.py:306
478 #: rhodecode/controllers/admin/settings.py:359
275 #: rhodecode/controllers/admin/users.py:127
479 #: rhodecode/controllers/admin/users.py:130
276 #, python-format
480 #, python-format
277 msgid "error occurred during update of user %s"
481 msgid "error occurred during update of user %s"
278 msgstr ""
482 msgstr ""
@@ -288,442 +492,600 b' msgid "error occurred during creation of'
288 msgstr ""
492 msgstr ""
289
493
290 #: rhodecode/controllers/admin/users.py:116
494 #: rhodecode/controllers/admin/users.py:116
291 msgid "User updated succesfully"
495 msgid "User updated successfully"
292 msgstr ""
496 msgstr ""
293
497
294 #: rhodecode/controllers/admin/users.py:143
498 #: rhodecode/controllers/admin/users.py:146
295 msgid "sucessfully deleted user"
499 msgid "successfully deleted user"
296 msgstr ""
500 msgstr ""
297
501
298 #: rhodecode/controllers/admin/users.py:147
502 #: rhodecode/controllers/admin/users.py:150
299 msgid "An error occurred during deletion of user"
503 msgid "An error occurred during deletion of user"
300 msgstr ""
504 msgstr ""
301
505
302 #: rhodecode/controllers/admin/users.py:163
506 #: rhodecode/controllers/admin/users.py:166
303 msgid "You can't edit this user"
507 msgid "You can't edit this user"
304 msgstr ""
508 msgstr ""
305
509
306 #: rhodecode/lib/helpers.py:383
510 #: rhodecode/controllers/admin/users.py:195
511 #: rhodecode/controllers/admin/users_groups.py:202
512 msgid "Granted 'repository create' permission to user"
513 msgstr ""
514
515 #: rhodecode/controllers/admin/users.py:204
516 #: rhodecode/controllers/admin/users_groups.py:211
517 msgid "Revoked 'repository create' permission to user"
518 msgstr ""
519
520 #: rhodecode/controllers/admin/users_groups.py:74
521 #, python-format
522 msgid "created users group %s"
523 msgstr ""
524
525 #: rhodecode/controllers/admin/users_groups.py:86
526 #, python-format
527 msgid "error occurred during creation of users group %s"
528 msgstr ""
529
530 #: rhodecode/controllers/admin/users_groups.py:119
531 #, python-format
532 msgid "updated users group %s"
533 msgstr ""
534
535 #: rhodecode/controllers/admin/users_groups.py:138
536 #, python-format
537 msgid "error occurred during update of users group %s"
538 msgstr ""
539
540 #: rhodecode/controllers/admin/users_groups.py:154
541 msgid "successfully deleted users group"
542 msgstr ""
543
544 #: rhodecode/controllers/admin/users_groups.py:158
545 msgid "An error occurred during deletion of users group"
546 msgstr ""
547
548 #: rhodecode/lib/__init__.py:279
549 msgid "year"
550 msgstr ""
551
552 #: rhodecode/lib/__init__.py:280
553 msgid "month"
554 msgstr ""
555
556 #: rhodecode/lib/__init__.py:281
557 msgid "day"
558 msgstr ""
559
560 #: rhodecode/lib/__init__.py:282
561 msgid "hour"
562 msgstr ""
563
564 #: rhodecode/lib/__init__.py:283
565 msgid "minute"
566 msgstr ""
567
568 #: rhodecode/lib/__init__.py:284
569 msgid "second"
570 msgstr ""
571
572 #: rhodecode/lib/__init__.py:293
307 msgid "ago"
573 msgid "ago"
308 msgstr ""
574 msgstr ""
309
575
310 #: rhodecode/lib/helpers.py:386
576 #: rhodecode/lib/__init__.py:296
311 msgid "just now"
577 msgid "just now"
312 msgstr ""
578 msgstr ""
313
579
314 #: rhodecode/lib/helpers.py:404
580 #: rhodecode/lib/auth.py:377
581 msgid "You need to be a registered user to perform this action"
582 msgstr ""
583
584 #: rhodecode/lib/auth.py:421
585 msgid "You need to be a signed in to view this page"
586 msgstr ""
587
588 #: rhodecode/lib/helpers.py:307
315 msgid "True"
589 msgid "True"
316 msgstr ""
590 msgstr ""
317
591
318 #: rhodecode/lib/helpers.py:407
592 #: rhodecode/lib/helpers.py:311
319 msgid "False"
593 msgid "False"
320 msgstr ""
594 msgstr ""
321
595
322 #: rhodecode/lib/helpers.py:439
596 #: rhodecode/lib/helpers.py:352
597 #, python-format
598 msgid "Show all combined changesets %s->%s"
599 msgstr ""
600
601 #: rhodecode/lib/helpers.py:356
602 msgid "compare view"
603 msgstr ""
604
605 #: rhodecode/lib/helpers.py:365
323 msgid "and"
606 msgid "and"
324 msgstr ""
607 msgstr ""
325
608
326 #: rhodecode/lib/helpers.py:439
609 #: rhodecode/lib/helpers.py:365
327 #, python-format
610 #, python-format
328 msgid "%s more"
611 msgid "%s more"
329 msgstr ""
612 msgstr ""
330
613
331 #: rhodecode/lib/helpers.py:441 rhodecode/templates/changelog/changelog.html:14
614 #: rhodecode/lib/helpers.py:367 rhodecode/templates/changelog/changelog.html:14
332 #: rhodecode/templates/changelog/changelog.html:40
615 #: rhodecode/templates/changelog/changelog.html:39
333 msgid "revisions"
616 msgid "revisions"
334 msgstr ""
617 msgstr ""
335
618
336 #: rhodecode/lib/helpers.py:456
619 #: rhodecode/lib/helpers.py:385
620 msgid "fork name "
621 msgstr ""
622
623 #: rhodecode/lib/helpers.py:388
337 msgid "[deleted] repository"
624 msgid "[deleted] repository"
338 msgstr ""
625 msgstr ""
339
626
340 #: rhodecode/lib/helpers.py:457 rhodecode/lib/helpers.py:461
627 #: rhodecode/lib/helpers.py:389 rhodecode/lib/helpers.py:393
341 msgid "[created] repository"
628 msgid "[created] repository"
342 msgstr ""
629 msgstr ""
343
630
344 #: rhodecode/lib/helpers.py:458
631 #: rhodecode/lib/helpers.py:390 rhodecode/lib/helpers.py:394
345 msgid "[forked] repository as"
632 msgid "[forked] repository"
346 msgstr ""
633 msgstr ""
347
634
348 #: rhodecode/lib/helpers.py:459 rhodecode/lib/helpers.py:463
635 #: rhodecode/lib/helpers.py:391 rhodecode/lib/helpers.py:395
349 msgid "[updated] repository"
636 msgid "[updated] repository"
350 msgstr ""
637 msgstr ""
351
638
352 #: rhodecode/lib/helpers.py:460
639 #: rhodecode/lib/helpers.py:392
353 msgid "[delete] repository"
640 msgid "[delete] repository"
354 msgstr ""
641 msgstr ""
355
642
356 #: rhodecode/lib/helpers.py:462
643 #: rhodecode/lib/helpers.py:396
357 msgid "[forked] repository"
644 msgid "[pushed] into"
358 msgstr ""
645 msgstr ""
359
646
360 #: rhodecode/lib/helpers.py:464
647 #: rhodecode/lib/helpers.py:397
361 msgid "[pushed] "
648 msgid "[committed via RhodeCode] into"
362 msgstr ""
649 msgstr ""
363
650
364 #: rhodecode/lib/helpers.py:465
651 #: rhodecode/lib/helpers.py:398
365 msgid "[pulled] "
652 msgid "[pulled from remote] into"
366 msgstr ""
653 msgstr ""
367
654
368 #: rhodecode/lib/helpers.py:466
655 #: rhodecode/lib/helpers.py:399
656 msgid "[pulled] from"
657 msgstr ""
658
659 #: rhodecode/lib/helpers.py:400
369 msgid "[started following] repository"
660 msgid "[started following] repository"
370 msgstr ""
661 msgstr ""
371
662
372 #: rhodecode/lib/helpers.py:467
663 #: rhodecode/lib/helpers.py:401
373 msgid "[stopped following] repository"
664 msgid "[stopped following] repository"
374 msgstr ""
665 msgstr ""
375
666
376 #: rhodecode/lib/helpers.py:554 rhodecode/templates/changelog/changelog.html:68
667 #: rhodecode/lib/helpers.py:577
377 #, python-format
668 #, python-format
378 msgid " and %s more"
669 msgid " and %s more"
379 msgstr ""
670 msgstr ""
380
671
381 #: rhodecode/lib/helpers.py:557 rhodecode/templates/changelog/changelog.html:71
672 #: rhodecode/lib/helpers.py:581
382 msgid "No Files"
673 msgid "No Files"
383 msgstr ""
674 msgstr ""
384
675
385 #: rhodecode/model/forms.py:54
676 #: rhodecode/model/forms.py:66
386 msgid "Token mismatch"
387 msgstr ""
388
389 #: rhodecode/model/forms.py:67
390 msgid "Invalid username"
677 msgid "Invalid username"
391 msgstr ""
678 msgstr ""
392
679
393 #: rhodecode/model/forms.py:76
680 #: rhodecode/model/forms.py:75
394 msgid "This username already exists"
681 msgid "This username already exists"
395 msgstr ""
682 msgstr ""
396
683
397 #: rhodecode/model/forms.py:81
684 #: rhodecode/model/forms.py:79
398 msgid ""
685 msgid ""
399 "Username may only contain alphanumeric characters underscores, periods or "
686 "Username may only contain alphanumeric characters underscores, periods or "
400 "dashes and must begin with alphanumeric character"
687 "dashes and must begin with alphanumeric character"
401 msgstr ""
688 msgstr ""
402
689
403 #: rhodecode/model/forms.py:101 rhodecode/model/forms.py:109
690 #: rhodecode/model/forms.py:94
404 #: rhodecode/model/forms.py:117
691 msgid "Invalid group name"
692 msgstr ""
693
694 #: rhodecode/model/forms.py:104
695 msgid "This users group already exists"
696 msgstr ""
697
698 #: rhodecode/model/forms.py:110
699 msgid ""
700 "Group name may only contain alphanumeric characters underscores, periods or "
701 "dashes and must begin with alphanumeric character"
702 msgstr ""
703
704 #: rhodecode/model/forms.py:132
705 msgid "Cannot assign this group as parent"
706 msgstr ""
707
708 #: rhodecode/model/forms.py:148
709 msgid "This group already exists"
710 msgstr ""
711
712 #: rhodecode/model/forms.py:164 rhodecode/model/forms.py:172
713 #: rhodecode/model/forms.py:180
405 msgid "Invalid characters in password"
714 msgid "Invalid characters in password"
406 msgstr ""
715 msgstr ""
407
716
408 #: rhodecode/model/forms.py:128
717 #: rhodecode/model/forms.py:191
409 msgid "Password do not match"
718 msgid "Passwords do not match"
410 msgstr ""
719 msgstr ""
411
720
412 #: rhodecode/model/forms.py:133
721 #: rhodecode/model/forms.py:196
413 msgid "invalid password"
722 msgid "invalid password"
414 msgstr ""
723 msgstr ""
415
724
416 #: rhodecode/model/forms.py:134
725 #: rhodecode/model/forms.py:197
417 msgid "invalid user name"
726 msgid "invalid user name"
418 msgstr ""
727 msgstr ""
419
728
420 #: rhodecode/model/forms.py:135
729 #: rhodecode/model/forms.py:198
421 msgid "Your account is disabled"
730 msgid "Your account is disabled"
422 msgstr ""
731 msgstr ""
423
732
424 #: rhodecode/model/forms.py:172 rhodecode/model/forms.py:207
733 #: rhodecode/model/forms.py:233
425 msgid "This username is not valid"
734 msgid "This username is not valid"
426 msgstr ""
735 msgstr ""
427
736
428 #: rhodecode/model/forms.py:185
737 #: rhodecode/model/forms.py:245
429 msgid "This repository name is disallowed"
738 msgid "This repository name is disallowed"
430 msgstr ""
739 msgstr ""
431
740
432 #: rhodecode/model/forms.py:189
741 #: rhodecode/model/forms.py:266
742 #, python-format
743 msgid "This repository already exists in group \"%s\""
744 msgstr ""
745
746 #: rhodecode/model/forms.py:274
433 msgid "This repository already exists"
747 msgid "This repository already exists"
434 msgstr ""
748 msgstr ""
435
749
436 #: rhodecode/model/forms.py:201
750 #: rhodecode/model/forms.py:312 rhodecode/model/forms.py:319
437 msgid "Fork have to be the same type as original"
751 msgid "invalid clone url"
438 msgstr ""
752 msgstr ""
439
753
440 #: rhodecode/model/forms.py:256
754 #: rhodecode/model/forms.py:322
441 msgid "This is not a valid path"
755 msgid "Invalid clone url, provide a valid clone http\\s url"
442 msgstr ""
443
444 #: rhodecode/model/forms.py:270
445 msgid "This e-mail address is already taken"
446 msgstr ""
447
448 #: rhodecode/model/forms.py:286
449 msgid "This e-mail address doesn't exist."
450 msgstr ""
451
452 #: rhodecode/model/forms.py:311
453 #, python-format
454 msgid ""
455 "You need to specify %(user)s in template for example uid=%(user)s "
456 ",dc=company..."
457 msgstr ""
458
459 #: rhodecode/model/forms.py:317
460 #, python-format
461 msgid "Wrong template used, only %(user)s is an valid entry"
462 msgstr ""
756 msgstr ""
463
757
464 #: rhodecode/model/forms.py:334
758 #: rhodecode/model/forms.py:334
759 msgid "Fork have to be the same type as original"
760 msgstr ""
761
762 #: rhodecode/model/forms.py:341
763 msgid "This username or users group name is not valid"
764 msgstr ""
765
766 #: rhodecode/model/forms.py:403
767 msgid "This is not a valid path"
768 msgstr ""
769
770 #: rhodecode/model/forms.py:416
771 msgid "This e-mail address is already taken"
772 msgstr ""
773
774 #: rhodecode/model/forms.py:427
775 msgid "This e-mail address doesn't exist."
776 msgstr ""
777
778 #: rhodecode/model/forms.py:447
779 msgid ""
780 "The LDAP Login attribute of the CN must be specified - this is the name of "
781 "the attribute that is equivalent to 'username'"
782 msgstr ""
783
784 #: rhodecode/model/forms.py:466
465 msgid "Please enter a login"
785 msgid "Please enter a login"
466 msgstr ""
786 msgstr ""
467
787
468 #: rhodecode/model/forms.py:335
788 #: rhodecode/model/forms.py:467
469 #, python-format
789 #, python-format
470 msgid "Enter a value %(min)i characters long or more"
790 msgid "Enter a value %(min)i characters long or more"
471 msgstr ""
791 msgstr ""
472
792
473 #: rhodecode/model/forms.py:343
793 #: rhodecode/model/forms.py:475
474 msgid "Please enter a password"
794 msgid "Please enter a password"
475 msgstr ""
795 msgstr ""
476
796
477 #: rhodecode/model/forms.py:344
797 #: rhodecode/model/forms.py:476
478 #, python-format
798 #, python-format
479 msgid "Enter %(min)i characters or more"
799 msgid "Enter %(min)i characters or more"
480 msgstr ""
800 msgstr ""
481
801
482 #: rhodecode/model/user.py:126
802 #: rhodecode/model/user.py:145
483 msgid "[RhodeCode] New User registration"
803 msgid "[RhodeCode] New User registration"
484 msgstr ""
804 msgstr ""
485
805
486 #: rhodecode/model/user.py:138 rhodecode/model/user.py:159
806 #: rhodecode/model/user.py:157 rhodecode/model/user.py:179
487 msgid "You can't Edit this user since it's crucial for entire application"
807 msgid "You can't Edit this user since it's crucial for entire application"
488 msgstr ""
808 msgstr ""
489
809
490 #: rhodecode/model/user.py:180
810 #: rhodecode/model/user.py:201
491 msgid "You can't remove this user since it's crucial for entire application"
811 msgid "You can't remove this user since it's crucial for entire application"
492 msgstr ""
812 msgstr ""
493
813
494 #: rhodecode/model/user.py:183
814 #: rhodecode/model/user.py:204
495 #, python-format
815 #, python-format
496 msgid ""
816 msgid ""
497 "This user still owns %s repositories and cannot be removed. Switch owners or "
817 "This user still owns %s repositories and cannot be removed. Switch owners or "
498 "remove those repositories"
818 "remove those repositories"
499 msgstr ""
819 msgstr ""
500
820
501 #: rhodecode/templates/index.html:4 rhodecode/templates/index.html:30
821 #: rhodecode/templates/index.html:4
502 msgid "Dashboard"
822 msgid "Dashboard"
503 msgstr ""
823 msgstr ""
504
824
505 #: rhodecode/templates/index.html:31
825 #: rhodecode/templates/index_base.html:22
506 #: rhodecode/templates/admin/users/user_edit_my_account.html:101
826 #: rhodecode/templates/admin/users/user_edit_my_account.html:102
507 msgid "quick filter..."
827 msgid "quick filter..."
508 msgstr ""
828 msgstr ""
509
829
510 #: rhodecode/templates/index.html:37
830 #: rhodecode/templates/index_base.html:23 rhodecode/templates/base/base.html:300
831 msgid "repositories"
832 msgstr ""
833
834 #: rhodecode/templates/index_base.html:29
835 #: rhodecode/templates/admin/repos/repos.html:22
511 msgid "ADD NEW REPOSITORY"
836 msgid "ADD NEW REPOSITORY"
512 msgstr ""
837 msgstr ""
513
838
514 #: rhodecode/templates/index.html:48
839 #: rhodecode/templates/index_base.html:41
515 #: rhodecode/templates/admin/repos/repo_add.html:31
840 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:32
516 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:27
841 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:32
842 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:33
843 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
844 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
845 msgid "Group name"
846 msgstr ""
847
848 #: rhodecode/templates/index_base.html:42 rhodecode/templates/index_base.html:73
849 #: rhodecode/templates/admin/repos/repo_add_base.html:44
850 #: rhodecode/templates/admin/repos/repo_edit.html:64
851 #: rhodecode/templates/admin/repos/repos.html:31
852 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:41
853 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:41
854 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:34
855 #: rhodecode/templates/settings/repo_fork.html:40
856 #: rhodecode/templates/settings/repo_settings.html:40
857 #: rhodecode/templates/summary/summary.html:92
858 msgid "Description"
859 msgstr ""
860
861 #: rhodecode/templates/index_base.html:53
862 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
863 msgid "Repositories group"
864 msgstr ""
865
866 #: rhodecode/templates/index_base.html:72
867 #: rhodecode/templates/admin/repos/repo_add_base.html:9
517 #: rhodecode/templates/admin/repos/repo_edit.html:32
868 #: rhodecode/templates/admin/repos/repo_edit.html:32
518 #: rhodecode/templates/admin/repos/repos.html:30
869 #: rhodecode/templates/admin/repos/repos.html:30
519 #: rhodecode/templates/admin/users/user_edit_my_account.html:116
870 #: rhodecode/templates/admin/users/user_edit_my_account.html:117
520 #: rhodecode/templates/files/files_browser.html:27
871 #: rhodecode/templates/files/files_browser.html:157
521 #: rhodecode/templates/settings/repo_settings.html:29
872 #: rhodecode/templates/settings/repo_settings.html:31
522 #: rhodecode/templates/summary/summary.html:31
873 #: rhodecode/templates/summary/summary.html:31
523 #: rhodecode/templates/summary/summary.html:92
874 #: rhodecode/templates/summary/summary.html:107
524 msgid "Name"
875 msgid "Name"
525 msgstr ""
876 msgstr ""
526
877
527 #: rhodecode/templates/index.html:49
878 #: rhodecode/templates/index_base.html:74
528 #: rhodecode/templates/admin/repos/repo_add.html:47
879 #: rhodecode/templates/admin/repos/repos.html:32
529 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:44
880 #: rhodecode/templates/summary/summary.html:114
530 #: rhodecode/templates/admin/repos/repo_edit.html:48
531 #: rhodecode/templates/admin/repos/repos.html:31
532 #: rhodecode/templates/settings/repo_fork.html:38
533 #: rhodecode/templates/settings/repo_settings.html:38
534 #: rhodecode/templates/summary/summary.html:75
535 msgid "Description"
536 msgstr ""
537
538 #: rhodecode/templates/index.html:50 rhodecode/templates/admin/repos/repos.html:32
539 #: rhodecode/templates/summary/summary.html:99
540 msgid "Last change"
881 msgid "Last change"
541 msgstr ""
882 msgstr ""
542
883
543 #: rhodecode/templates/index.html:51 rhodecode/templates/admin/repos/repos.html:33
884 #: rhodecode/templates/index_base.html:75
885 #: rhodecode/templates/admin/repos/repos.html:33
544 msgid "Tip"
886 msgid "Tip"
545 msgstr ""
887 msgstr ""
546
888
547 #: rhodecode/templates/index.html:52
889 #: rhodecode/templates/index_base.html:76
548 #: rhodecode/templates/admin/repos/repo_edit.html:73
890 #: rhodecode/templates/admin/repos/repo_edit.html:97
549 msgid "Owner"
891 msgid "Owner"
550 msgstr ""
892 msgstr ""
551
893
552 #: rhodecode/templates/index.html:53 rhodecode/templates/summary/summary.html:236
894 #: rhodecode/templates/index_base.html:77
895 #: rhodecode/templates/journal/public_journal.html:20
896 #: rhodecode/templates/summary/summary.html:180
897 #: rhodecode/templates/summary/summary.html:183
553 msgid "RSS"
898 msgid "RSS"
554 msgstr ""
899 msgstr ""
555
900
556 #: rhodecode/templates/index.html:54 rhodecode/templates/summary/summary.html:237
901 #: rhodecode/templates/index_base.html:78
902 #: rhodecode/templates/journal/public_journal.html:23
903 #: rhodecode/templates/summary/summary.html:181
904 #: rhodecode/templates/summary/summary.html:184
557 msgid "Atom"
905 msgid "Atom"
558 msgstr ""
906 msgstr ""
559
907
560 #: rhodecode/templates/index.html:64 rhodecode/templates/admin/repos/repos.html:42
908 #: rhodecode/templates/index_base.html:87 rhodecode/templates/index_base.html:89
561 #: rhodecode/templates/admin/users/user_edit_my_account.html:126
909 #: rhodecode/templates/index_base.html:91 rhodecode/templates/base/base.html:209
562 #: rhodecode/templates/summary/summary.html:35
910 #: rhodecode/templates/base/base.html:211 rhodecode/templates/base/base.html:213
911 #: rhodecode/templates/summary/summary.html:4
912 msgid "Summary"
913 msgstr ""
914
915 #: rhodecode/templates/index_base.html:95 rhodecode/templates/index_base.html:97
916 #: rhodecode/templates/index_base.html:99 rhodecode/templates/base/base.html:225
917 #: rhodecode/templates/base/base.html:227 rhodecode/templates/base/base.html:229
918 #: rhodecode/templates/changelog/changelog.html:6
919 #: rhodecode/templates/changelog/changelog.html:14
920 msgid "Changelog"
921 msgstr ""
922
923 #: rhodecode/templates/index_base.html:103 rhodecode/templates/index_base.html:105
924 #: rhodecode/templates/index_base.html:107 rhodecode/templates/base/base.html:268
925 #: rhodecode/templates/base/base.html:270 rhodecode/templates/base/base.html:272
926 #: rhodecode/templates/files/files.html:4
927 msgid "Files"
928 msgstr ""
929
930 #: rhodecode/templates/index_base.html:116
931 #: rhodecode/templates/admin/repos/repos.html:42
932 #: rhodecode/templates/admin/users/user_edit_my_account.html:127
933 #: rhodecode/templates/summary/summary.html:48
563 msgid "Mercurial repository"
934 msgid "Mercurial repository"
564 msgstr ""
935 msgstr ""
565
936
566 #: rhodecode/templates/index.html:66 rhodecode/templates/admin/repos/repos.html:44
937 #: rhodecode/templates/index_base.html:118
567 #: rhodecode/templates/admin/users/user_edit_my_account.html:128
938 #: rhodecode/templates/admin/repos/repos.html:44
568 #: rhodecode/templates/summary/summary.html:38
939 #: rhodecode/templates/admin/users/user_edit_my_account.html:129
940 #: rhodecode/templates/summary/summary.html:51
569 msgid "Git repository"
941 msgid "Git repository"
570 msgstr ""
942 msgstr ""
571
943
572 #: rhodecode/templates/index.html:73 rhodecode/templates/journal.html:67
944 #: rhodecode/templates/index_base.html:123
573 #: rhodecode/templates/admin/repos/repo_edit.html:103
945 #: rhodecode/templates/admin/repos/repo_edit_perms.html:16
574 #: rhodecode/templates/settings/repo_settings.html:74
946 #: rhodecode/templates/journal/journal.html:53
575 #: rhodecode/templates/summary/summary.html:42
947 #: rhodecode/templates/summary/summary.html:56
576 msgid "private repository"
948 msgid "private repository"
577 msgstr ""
949 msgstr ""
578
950
579 #: rhodecode/templates/index.html:75 rhodecode/templates/journal.html:69
951 #: rhodecode/templates/index_base.html:125
580 #: rhodecode/templates/summary/summary.html:44
952 #: rhodecode/templates/journal/journal.html:55
953 #: rhodecode/templates/summary/summary.html:58
581 msgid "public repository"
954 msgid "public repository"
582 msgstr ""
955 msgstr ""
583
956
584 #: rhodecode/templates/index.html:83 rhodecode/templates/base/base.html:221
957 #: rhodecode/templates/index_base.html:133 rhodecode/templates/base/base.html:291
585 #: rhodecode/templates/settings/repo_fork.html:11
958 #: rhodecode/templates/settings/repo_fork.html:13
586 msgid "fork"
959 msgid "fork"
587 msgstr ""
960 msgstr ""
588
961
589 #: rhodecode/templates/index.html:84 rhodecode/templates/admin/repos/repos.html:60
962 #: rhodecode/templates/index_base.html:134
590 #: rhodecode/templates/admin/users/user_edit_my_account.html:142
963 #: rhodecode/templates/admin/repos/repos.html:60
591 #: rhodecode/templates/summary/summary.html:63
964 #: rhodecode/templates/admin/users/user_edit_my_account.html:143
592 #: rhodecode/templates/summary/summary.html:65
965 #: rhodecode/templates/summary/summary.html:69
966 #: rhodecode/templates/summary/summary.html:71
593 msgid "Fork of"
967 msgid "Fork of"
594 msgstr ""
968 msgstr ""
595
969
596 #: rhodecode/templates/index.html:105 rhodecode/templates/admin/repos/repos.html:73
970 #: rhodecode/templates/index_base.html:155
971 #: rhodecode/templates/admin/repos/repos.html:73
597 msgid "No changesets yet"
972 msgid "No changesets yet"
598 msgstr ""
973 msgstr ""
599
974
600 #: rhodecode/templates/index.html:110
975 #: rhodecode/templates/index_base.html:161 rhodecode/templates/index_base.html:163
601 #, python-format
976 #, python-format
602 msgid "Subscribe to %s rss feed"
977 msgid "Subscribe to %s rss feed"
603 msgstr ""
978 msgstr ""
604
979
605 #: rhodecode/templates/index.html:113
980 #: rhodecode/templates/index_base.html:168 rhodecode/templates/index_base.html:170
606 #, python-format
981 #, python-format
607 msgid "Subscribe to %s atom feed"
982 msgid "Subscribe to %s atom feed"
608 msgstr ""
983 msgstr ""
609
984
610 #: rhodecode/templates/journal.html:4 rhodecode/templates/journal.html:17
985 #: rhodecode/templates/login.html:5 rhodecode/templates/login.html:54
611 #: rhodecode/templates/base/base.html:41 rhodecode/templates/base/base.html:278
986 #: rhodecode/templates/base/base.html:38
612 #: rhodecode/templates/base/base.html:280 rhodecode/templates/base/base.html:282
613 msgid "Journal"
614 msgstr ""
615
616 #: rhodecode/templates/journal.html:45
617 msgid "No entries yet"
618 msgstr ""
619
620 #: rhodecode/templates/journal.html:53
621 msgid "Following"
622 msgstr ""
623
624 #: rhodecode/templates/journal.html:60
625 msgid "following user"
626 msgstr ""
627
628 #: rhodecode/templates/journal.html:60
629 #: rhodecode/templates/admin/repos/repo_edit.html:94
630 #: rhodecode/templates/settings/repo_settings.html:65
631 msgid "user"
632 msgstr ""
633
634 #: rhodecode/templates/journal.html:79
635 msgid "You are not following any users or repositories"
636 msgstr ""
637
638 #: rhodecode/templates/login.html:5
639 msgid "Sign In"
987 msgid "Sign In"
640 msgstr ""
988 msgstr ""
641
989
642 #: rhodecode/templates/login.html:28
990 #: rhodecode/templates/login.html:21
643 msgid "Sign In to"
991 msgid "Sign In to"
644 msgstr ""
992 msgstr ""
645
993
646 #: rhodecode/templates/login.html:38 rhodecode/templates/register.html:27
994 #: rhodecode/templates/login.html:31 rhodecode/templates/register.html:20
647 #: rhodecode/templates/admin/admin_log.html:5
995 #: rhodecode/templates/admin/admin_log.html:5
648 #: rhodecode/templates/admin/users/user_add.html:32
996 #: rhodecode/templates/admin/users/user_add.html:32
649 #: rhodecode/templates/admin/users/user_edit.html:43
997 #: rhodecode/templates/admin/users/user_edit.html:47
650 #: rhodecode/templates/admin/users/user_edit_my_account.html:41
998 #: rhodecode/templates/admin/users/user_edit_my_account.html:45
651 #: rhodecode/templates/summary/summary.html:91
999 #: rhodecode/templates/base/base.html:15
1000 #: rhodecode/templates/summary/summary.html:106
652 msgid "Username"
1001 msgid "Username"
653 msgstr ""
1002 msgstr ""
654
1003
655 #: rhodecode/templates/login.html:47 rhodecode/templates/register.html:36
1004 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
656 #: rhodecode/templates/admin/ldap/ldap.html:50
1005 #: rhodecode/templates/admin/ldap/ldap.html:46
657 #: rhodecode/templates/admin/users/user_add.html:41
1006 #: rhodecode/templates/admin/users/user_add.html:41
1007 #: rhodecode/templates/base/base.html:24
658 msgid "Password"
1008 msgid "Password"
659 msgstr ""
1009 msgstr ""
660
1010
661 #: rhodecode/templates/login.html:67
1011 #: rhodecode/templates/login.html:60
662 msgid "Forgot your password ?"
1012 msgid "Forgot your password ?"
663 msgstr ""
1013 msgstr ""
664
1014
665 #: rhodecode/templates/login.html:70
1015 #: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:35
666 msgid "Don't have an account ?"
1016 msgid "Don't have an account ?"
667 msgstr ""
1017 msgstr ""
668
1018
669 #: rhodecode/templates/password_reset.html:5
1019 #: rhodecode/templates/password_reset.html:5
670 msgid "Reset You password"
1020 msgid "Reset your password"
671 msgstr ""
1021 msgstr ""
672
1022
673 #: rhodecode/templates/password_reset.html:18
1023 #: rhodecode/templates/password_reset.html:11
674 msgid "Reset You password to"
1024 msgid "Reset your password to"
675 msgstr ""
1025 msgstr ""
676
1026
677 #: rhodecode/templates/password_reset.html:28
1027 #: rhodecode/templates/password_reset.html:21
678 msgid "Email address"
1028 msgid "Email address"
679 msgstr ""
1029 msgstr ""
680
1030
681 #: rhodecode/templates/password_reset.html:38
1031 #: rhodecode/templates/password_reset.html:30
682 msgid "Your new password will be send to matching email address"
1032 msgid "Reset my password"
683 msgstr ""
1033 msgstr ""
684
1034
685 #: rhodecode/templates/register.html:5
1035 #: rhodecode/templates/password_reset.html:31
1036 msgid "Password reset link will be send to matching email address"
1037 msgstr ""
1038
1039 #: rhodecode/templates/register.html:5 rhodecode/templates/register.html:74
686 msgid "Sign Up"
1040 msgid "Sign Up"
687 msgstr ""
1041 msgstr ""
688
1042
689 #: rhodecode/templates/register.html:18
1043 #: rhodecode/templates/register.html:11
690 msgid "Sign Up to"
1044 msgid "Sign Up to"
691 msgstr ""
1045 msgstr ""
692
1046
693 #: rhodecode/templates/register.html:45
1047 #: rhodecode/templates/register.html:38
694 msgid "Re-enter password"
1048 msgid "Re-enter password"
695 msgstr ""
1049 msgstr ""
696
1050
697 #: rhodecode/templates/register.html:54
1051 #: rhodecode/templates/register.html:47
698 #: rhodecode/templates/admin/users/user_add.html:50
1052 #: rhodecode/templates/admin/users/user_add.html:50
699 #: rhodecode/templates/admin/users/user_edit.html:61
1053 #: rhodecode/templates/admin/users/user_edit.html:74
700 #: rhodecode/templates/admin/users/user_edit_my_account.html:59
1054 #: rhodecode/templates/admin/users/user_edit_my_account.html:63
701 msgid "First Name"
1055 msgid "First Name"
702 msgstr ""
1056 msgstr ""
703
1057
704 #: rhodecode/templates/register.html:63
1058 #: rhodecode/templates/register.html:56
705 #: rhodecode/templates/admin/users/user_add.html:59
1059 #: rhodecode/templates/admin/users/user_add.html:59
706 #: rhodecode/templates/admin/users/user_edit.html:70
1060 #: rhodecode/templates/admin/users/user_edit.html:83
707 #: rhodecode/templates/admin/users/user_edit_my_account.html:68
1061 #: rhodecode/templates/admin/users/user_edit_my_account.html:72
708 msgid "Last Name"
1062 msgid "Last Name"
709 msgstr ""
1063 msgstr ""
710
1064
711 #: rhodecode/templates/register.html:72
1065 #: rhodecode/templates/register.html:65
712 #: rhodecode/templates/admin/users/user_add.html:68
1066 #: rhodecode/templates/admin/users/user_add.html:68
713 #: rhodecode/templates/admin/users/user_edit.html:79
1067 #: rhodecode/templates/admin/users/user_edit.html:92
714 #: rhodecode/templates/admin/users/user_edit_my_account.html:77
1068 #: rhodecode/templates/admin/users/user_edit_my_account.html:81
715 #: rhodecode/templates/summary/summary.html:93
1069 #: rhodecode/templates/summary/summary.html:108
716 msgid "Email"
1070 msgid "Email"
717 msgstr ""
1071 msgstr ""
718
1072
719 #: rhodecode/templates/register.html:83
1073 #: rhodecode/templates/register.html:76
720 msgid "Your account will be activated right after registration"
1074 msgid "Your account will be activated right after registration"
721 msgstr ""
1075 msgstr ""
722
1076
723 #: rhodecode/templates/register.html:85
1077 #: rhodecode/templates/register.html:78
724 msgid "Your account must wait for activation by administrator"
1078 msgid "Your account must wait for activation by administrator"
725 msgstr ""
1079 msgstr ""
726
1080
1081 #: rhodecode/templates/repo_switcher_list.html:14
1082 msgid "Private repository"
1083 msgstr ""
1084
1085 #: rhodecode/templates/repo_switcher_list.html:19
1086 msgid "Public repository"
1087 msgstr ""
1088
727 #: rhodecode/templates/admin/admin.html:5 rhodecode/templates/admin/admin.html:9
1089 #: rhodecode/templates/admin/admin.html:5 rhodecode/templates/admin/admin.html:9
728 msgid "Admin journal"
1090 msgid "Admin journal"
729 msgstr ""
1091 msgstr ""
@@ -744,12 +1106,11 b' msgstr ""'
744 msgid "From IP"
1106 msgid "From IP"
745 msgstr ""
1107 msgstr ""
746
1108
747 #: rhodecode/templates/admin/admin_log.html:62
1109 #: rhodecode/templates/admin/admin_log.html:52
748 msgid "No actions yet"
1110 msgid "No actions yet"
749 msgstr ""
1111 msgstr ""
750
1112
751 #: rhodecode/templates/admin/ldap/ldap.html:5
1113 #: rhodecode/templates/admin/ldap/ldap.html:5
752 #: rhodecode/templates/admin/ldap/ldap.html:24
753 msgid "LDAP administration"
1114 msgid "LDAP administration"
754 msgstr ""
1115 msgstr ""
755
1116
@@ -757,8 +1118,12 b' msgstr ""'
757 msgid "Ldap"
1118 msgid "Ldap"
758 msgstr ""
1119 msgstr ""
759
1120
1121 #: rhodecode/templates/admin/ldap/ldap.html:28
1122 msgid "Connection settings"
1123 msgstr ""
1124
760 #: rhodecode/templates/admin/ldap/ldap.html:30
1125 #: rhodecode/templates/admin/ldap/ldap.html:30
761 msgid "Enable ldap"
1126 msgid "Enable LDAP"
762 msgstr ""
1127 msgstr ""
763
1128
764 #: rhodecode/templates/admin/ldap/ldap.html:34
1129 #: rhodecode/templates/admin/ldap/ldap.html:34
@@ -770,24 +1135,71 b' msgid "Port"'
770 msgstr ""
1135 msgstr ""
771
1136
772 #: rhodecode/templates/admin/ldap/ldap.html:42
1137 #: rhodecode/templates/admin/ldap/ldap.html:42
773 msgid "Enable LDAPS"
774 msgstr ""
775
776 #: rhodecode/templates/admin/ldap/ldap.html:46
777 msgid "Account"
1138 msgid "Account"
778 msgstr ""
1139 msgstr ""
779
1140
1141 #: rhodecode/templates/admin/ldap/ldap.html:50
1142 msgid "Connection security"
1143 msgstr ""
1144
780 #: rhodecode/templates/admin/ldap/ldap.html:54
1145 #: rhodecode/templates/admin/ldap/ldap.html:54
1146 msgid "Certificate Checks"
1147 msgstr ""
1148
1149 #: rhodecode/templates/admin/ldap/ldap.html:57
1150 msgid "Search settings"
1151 msgstr ""
1152
1153 #: rhodecode/templates/admin/ldap/ldap.html:59
781 msgid "Base DN"
1154 msgid "Base DN"
782 msgstr ""
1155 msgstr ""
783
1156
1157 #: rhodecode/templates/admin/ldap/ldap.html:63
1158 msgid "LDAP Filter"
1159 msgstr ""
1160
1161 #: rhodecode/templates/admin/ldap/ldap.html:67
1162 msgid "LDAP Search Scope"
1163 msgstr ""
1164
1165 #: rhodecode/templates/admin/ldap/ldap.html:70
1166 msgid "Attribute mappings"
1167 msgstr ""
1168
1169 #: rhodecode/templates/admin/ldap/ldap.html:72
1170 msgid "Login Attribute"
1171 msgstr ""
1172
1173 #: rhodecode/templates/admin/ldap/ldap.html:76
1174 msgid "First Name Attribute"
1175 msgstr ""
1176
1177 #: rhodecode/templates/admin/ldap/ldap.html:80
1178 msgid "Last Name Attribute"
1179 msgstr ""
1180
1181 #: rhodecode/templates/admin/ldap/ldap.html:84
1182 msgid "E-mail Attribute"
1183 msgstr ""
1184
1185 #: rhodecode/templates/admin/ldap/ldap.html:89
1186 #: rhodecode/templates/admin/settings/hooks.html:73
1187 #: rhodecode/templates/admin/users/user_edit.html:117
1188 #: rhodecode/templates/admin/users/user_edit.html:142
1189 #: rhodecode/templates/admin/users/user_edit_my_account.html:89
1190 #: rhodecode/templates/admin/users_groups/users_group_edit.html:263
1191 msgid "Save"
1192 msgstr ""
1193
784 #: rhodecode/templates/admin/permissions/permissions.html:5
1194 #: rhodecode/templates/admin/permissions/permissions.html:5
785 msgid "Permissions administration"
1195 msgid "Permissions administration"
786 msgstr ""
1196 msgstr ""
787
1197
788 #: rhodecode/templates/admin/permissions/permissions.html:11
1198 #: rhodecode/templates/admin/permissions/permissions.html:11
789 #: rhodecode/templates/admin/repos/repo_edit.html:85
1199 #: rhodecode/templates/admin/repos/repo_edit.html:109
790 #: rhodecode/templates/settings/repo_settings.html:56
1200 #: rhodecode/templates/admin/users/user_edit.html:127
1201 #: rhodecode/templates/admin/users_groups/users_group_edit.html:248
1202 #: rhodecode/templates/settings/repo_settings.html:58
791 msgid "Permissions"
1203 msgid "Permissions"
792 msgstr ""
1204 msgstr ""
793
1205
@@ -822,6 +1234,10 b' msgstr ""'
822 msgid "Repository creation"
1234 msgid "Repository creation"
823 msgstr ""
1235 msgstr ""
824
1236
1237 #: rhodecode/templates/admin/permissions/permissions.html:71
1238 msgid "set"
1239 msgstr ""
1240
825 #: rhodecode/templates/admin/repos/repo_add.html:5
1241 #: rhodecode/templates/admin/repos/repo_add.html:5
826 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:5
1242 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:5
827 msgid "Add repository"
1243 msgid "Add repository"
@@ -830,6 +1246,7 b' msgstr ""'
830 #: rhodecode/templates/admin/repos/repo_add.html:11
1246 #: rhodecode/templates/admin/repos/repo_add.html:11
831 #: rhodecode/templates/admin/repos/repo_edit.html:11
1247 #: rhodecode/templates/admin/repos/repo_edit.html:11
832 #: rhodecode/templates/admin/repos/repos.html:10
1248 #: rhodecode/templates/admin/repos/repos.html:10
1249 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
833 msgid "Repositories"
1250 msgid "Repositories"
834 msgstr ""
1251 msgstr ""
835
1252
@@ -837,20 +1254,34 b' msgstr ""'
837 msgid "add new"
1254 msgid "add new"
838 msgstr ""
1255 msgstr ""
839
1256
840 #: rhodecode/templates/admin/repos/repo_add.html:39
1257 #: rhodecode/templates/admin/repos/repo_add_base.html:20
841 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:36
1258 #: rhodecode/templates/summary/summary.html:80
842 #: rhodecode/templates/admin/repos/repo_edit.html:40
1259 #: rhodecode/templates/summary/summary.html:82
1260 msgid "Clone from"
1261 msgstr ""
1262
1263 #: rhodecode/templates/admin/repos/repo_add_base.html:28
1264 #: rhodecode/templates/admin/repos/repo_edit.html:48
1265 #: rhodecode/templates/admin/repos_groups/repos_groups.html:4
1266 msgid "Repository group"
1267 msgstr ""
1268
1269 #: rhodecode/templates/admin/repos/repo_add_base.html:36
1270 #: rhodecode/templates/admin/repos/repo_edit.html:56
843 msgid "Type"
1271 msgid "Type"
844 msgstr ""
1272 msgstr ""
845
1273
846 #: rhodecode/templates/admin/repos/repo_add.html:55
1274 #: rhodecode/templates/admin/repos/repo_add_base.html:52
847 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:52
1275 #: rhodecode/templates/admin/repos/repo_edit.html:73
848 #: rhodecode/templates/admin/repos/repo_edit.html:57
1276 #: rhodecode/templates/settings/repo_fork.html:48
849 #: rhodecode/templates/settings/repo_fork.html:46
1277 #: rhodecode/templates/settings/repo_settings.html:49
850 #: rhodecode/templates/settings/repo_settings.html:47
851 msgid "Private"
1278 msgid "Private"
852 msgstr ""
1279 msgstr ""
853
1280
1281 #: rhodecode/templates/admin/repos/repo_add_base.html:59
1282 msgid "add"
1283 msgstr ""
1284
854 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:9
1285 #: rhodecode/templates/admin/repos/repo_add_create_repository.html:9
855 msgid "add new repository"
1286 msgid "add new repository"
856 msgstr ""
1287 msgstr ""
@@ -861,121 +1292,268 b' msgstr ""'
861
1292
862 #: rhodecode/templates/admin/repos/repo_edit.html:13
1293 #: rhodecode/templates/admin/repos/repo_edit.html:13
863 #: rhodecode/templates/admin/users/user_edit.html:13
1294 #: rhodecode/templates/admin/users/user_edit.html:13
864 #: rhodecode/templates/admin/users/user_edit_my_account.html:147
1295 #: rhodecode/templates/admin/users/user_edit_my_account.html:148
1296 #: rhodecode/templates/admin/users_groups/users_group_edit.html:13
1297 #: rhodecode/templates/files/files_annotate.html:49
1298 #: rhodecode/templates/files/files_source.html:20
865 msgid "edit"
1299 msgid "edit"
866 msgstr ""
1300 msgstr ""
867
1301
868 #: rhodecode/templates/admin/repos/repo_edit.html:65
1302 #: rhodecode/templates/admin/repos/repo_edit.html:40
1303 msgid "Clone uri"
1304 msgstr ""
1305
1306 #: rhodecode/templates/admin/repos/repo_edit.html:81
869 msgid "Enable statistics"
1307 msgid "Enable statistics"
870 msgstr ""
1308 msgstr ""
871
1309
872 #: rhodecode/templates/admin/repos/repo_edit.html:90
1310 #: rhodecode/templates/admin/repos/repo_edit.html:89
873 #: rhodecode/templates/settings/repo_settings.html:61
1311 msgid "Enable downloads"
874 msgid "none"
1312 msgstr ""
875 msgstr ""
1313
876
1314 #: rhodecode/templates/admin/repos/repo_edit.html:127
877 #: rhodecode/templates/admin/repos/repo_edit.html:91
1315 msgid "Administration"
878 #: rhodecode/templates/settings/repo_settings.html:62
1316 msgstr ""
879 msgid "read"
1317
880 msgstr ""
1318 #: rhodecode/templates/admin/repos/repo_edit.html:130
881
1319 msgid "Statistics"
882 #: rhodecode/templates/admin/repos/repo_edit.html:92
1320 msgstr ""
883 #: rhodecode/templates/settings/repo_settings.html:63
1321
884 msgid "write"
1322 #: rhodecode/templates/admin/repos/repo_edit.html:134
885 msgstr ""
1323 msgid "Reset current statistics"
886
1324 msgstr ""
887 #: rhodecode/templates/admin/repos/repo_edit.html:93
1325
888 #: rhodecode/templates/admin/users/users.html:37
1326 #: rhodecode/templates/admin/repos/repo_edit.html:134
889 #: rhodecode/templates/base/base.html:226
1327 msgid "Confirm to remove current statistics"
890 #: rhodecode/templates/settings/repo_settings.html:64
1328 msgstr ""
891 msgid "admin"
1329
892 msgstr ""
1330 #: rhodecode/templates/admin/repos/repo_edit.html:137
893
1331 msgid "Fetched to rev"
894 #: rhodecode/templates/admin/repos/repo_edit.html:124
1332 msgstr ""
895 #: rhodecode/templates/settings/repo_settings.html:95
1333
896 msgid "Failed to remove user"
1334 #: rhodecode/templates/admin/repos/repo_edit.html:138
1335 msgid "Percentage of stats gathered"
1336 msgstr ""
1337
1338 #: rhodecode/templates/admin/repos/repo_edit.html:147
1339 msgid "Remote"
1340 msgstr ""
1341
1342 #: rhodecode/templates/admin/repos/repo_edit.html:151
1343 msgid "Pull changes from remote location"
897 msgstr ""
1344 msgstr ""
898
1345
899 #: rhodecode/templates/admin/repos/repo_edit.html:151
1346 #: rhodecode/templates/admin/repos/repo_edit.html:151
900 #: rhodecode/templates/settings/repo_settings.html:123
1347 msgid "Confirm to pull changes from remote side"
901 msgid "Add another user"
1348 msgstr ""
902 msgstr ""
1349
903
1350 #: rhodecode/templates/admin/repos/repo_edit.html:162
904 #: rhodecode/templates/admin/repos/repo_edit.html:293
905 msgid "Administration"
906 msgstr ""
907
908 #: rhodecode/templates/admin/repos/repo_edit.html:296
909 msgid "Statistics"
910 msgstr ""
911
912 #: rhodecode/templates/admin/repos/repo_edit.html:301
913 msgid "Reset current statistics"
914 msgstr ""
915
916 #: rhodecode/templates/admin/repos/repo_edit.html:305
917 msgid "Fetched to rev"
918 msgstr ""
919
920 #: rhodecode/templates/admin/repos/repo_edit.html:306
921 msgid "Percentage of stats gathered"
922 msgstr ""
923
924 #: rhodecode/templates/admin/repos/repo_edit.html:314
925 msgid "Cache"
1351 msgid "Cache"
926 msgstr ""
1352 msgstr ""
927
1353
928 #: rhodecode/templates/admin/repos/repo_edit.html:318
1354 #: rhodecode/templates/admin/repos/repo_edit.html:166
929 msgid "Invalidate repository cache"
1355 msgid "Invalidate repository cache"
930 msgstr ""
1356 msgstr ""
931
1357
932 #: rhodecode/templates/admin/repos/repo_edit.html:324
1358 #: rhodecode/templates/admin/repos/repo_edit.html:166
1359 msgid "Confirm to invalidate repository cache"
1360 msgstr ""
1361
1362 #: rhodecode/templates/admin/repos/repo_edit.html:177
1363 msgid "Remove from public journal"
1364 msgstr ""
1365
1366 #: rhodecode/templates/admin/repos/repo_edit.html:179
1367 msgid "Add to public journal"
1368 msgstr ""
1369
1370 #: rhodecode/templates/admin/repos/repo_edit.html:185
933 msgid "Delete"
1371 msgid "Delete"
934 msgstr ""
1372 msgstr ""
935
1373
936 #: rhodecode/templates/admin/repos/repo_edit.html:328
1374 #: rhodecode/templates/admin/repos/repo_edit.html:189
937 msgid "Remove this repository"
1375 msgid "Remove this repository"
938 msgstr ""
1376 msgstr ""
939
1377
1378 #: rhodecode/templates/admin/repos/repo_edit.html:189
1379 #: rhodecode/templates/admin/repos/repos.html:79
1380 msgid "Confirm to delete this repository"
1381 msgstr ""
1382
1383 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
1384 msgid "none"
1385 msgstr ""
1386
1387 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
1388 msgid "read"
1389 msgstr ""
1390
1391 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
1392 msgid "write"
1393 msgstr ""
1394
1395 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
1396 #: rhodecode/templates/admin/users/users.html:38
1397 #: rhodecode/templates/base/base.html:296
1398 msgid "admin"
1399 msgstr ""
1400
1401 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
1402 msgid "member"
1403 msgstr ""
1404
1405 #: rhodecode/templates/admin/repos/repo_edit_perms.html:33
1406 #: rhodecode/templates/admin/repos/repo_edit_perms.html:53
1407 msgid "revoke"
1408 msgstr ""
1409
1410 #: rhodecode/templates/admin/repos/repo_edit_perms.html:75
1411 msgid "Add another member"
1412 msgstr ""
1413
1414 #: rhodecode/templates/admin/repos/repo_edit_perms.html:89
1415 msgid "Failed to remove user"
1416 msgstr ""
1417
1418 #: rhodecode/templates/admin/repos/repo_edit_perms.html:104
1419 msgid "Failed to remove users group"
1420 msgstr ""
1421
1422 #: rhodecode/templates/admin/repos/repo_edit_perms.html:205
1423 msgid "Group"
1424 msgstr ""
1425
1426 #: rhodecode/templates/admin/repos/repo_edit_perms.html:206
1427 #: rhodecode/templates/admin/users_groups/users_groups.html:33
1428 msgid "members"
1429 msgstr ""
1430
940 #: rhodecode/templates/admin/repos/repos.html:5
1431 #: rhodecode/templates/admin/repos/repos.html:5
941 msgid "Repositories administration"
1432 msgid "Repositories administration"
942 msgstr ""
1433 msgstr ""
943
1434
944 #: rhodecode/templates/admin/repos/repos.html:34
1435 #: rhodecode/templates/admin/repos/repos.html:34
945 #: rhodecode/templates/summary/summary.html:85
1436 #: rhodecode/templates/summary/summary.html:100
946 msgid "Contact"
1437 msgid "Contact"
947 msgstr ""
1438 msgstr ""
948
1439
949 #: rhodecode/templates/admin/repos/repos.html:35
1440 #: rhodecode/templates/admin/repos/repos.html:35
950 #: rhodecode/templates/admin/users/user_edit_my_account.html:118
1441 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:36
951 #: rhodecode/templates/admin/users/users.html:39
1442 #: rhodecode/templates/admin/users/user_edit_my_account.html:119
1443 #: rhodecode/templates/admin/users/users.html:40
1444 #: rhodecode/templates/admin/users_groups/users_groups.html:35
952 msgid "action"
1445 msgid "action"
953 msgstr ""
1446 msgstr ""
954
1447
955 #: rhodecode/templates/admin/repos/repos.html:51
1448 #: rhodecode/templates/admin/repos/repos.html:51
956 #: rhodecode/templates/admin/users/user_edit_my_account.html:133
1449 #: rhodecode/templates/admin/users/user_edit_my_account.html:134
957 #: rhodecode/templates/admin/users/user_edit_my_account.html:147
1450 #: rhodecode/templates/admin/users/user_edit_my_account.html:148
958 msgid "private"
1451 msgid "private"
959 msgstr ""
1452 msgstr ""
960
1453
961 #: rhodecode/templates/admin/repos/repos.html:53
1454 #: rhodecode/templates/admin/repos/repos.html:53
962 #: rhodecode/templates/admin/repos/repos.html:59
1455 #: rhodecode/templates/admin/repos/repos.html:59
963 #: rhodecode/templates/admin/users/user_edit_my_account.html:135
1456 #: rhodecode/templates/admin/users/user_edit_my_account.html:136
964 #: rhodecode/templates/admin/users/user_edit_my_account.html:141
1457 #: rhodecode/templates/admin/users/user_edit_my_account.html:142
965 #: rhodecode/templates/summary/summary.html:62
1458 #: rhodecode/templates/summary/summary.html:68
966 msgid "public"
1459 msgid "public"
967 msgstr ""
1460 msgstr ""
968
1461
1462 #: rhodecode/templates/admin/repos/repos.html:79
1463 #: rhodecode/templates/admin/users/users.html:55
1464 msgid "delete"
1465 msgstr ""
1466
1467 #: rhodecode/templates/admin/repos_groups/repos_groups.html:8
1468 msgid "Groups"
1469 msgstr ""
1470
1471 #: rhodecode/templates/admin/repos_groups/repos_groups.html:13
1472 msgid "with"
1473 msgstr ""
1474
1475 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5
1476 msgid "Add repos group"
1477 msgstr ""
1478
1479 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:10
1480 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:10
1481 msgid "Repos groups"
1482 msgstr ""
1483
1484 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:12
1485 msgid "add new repos group"
1486 msgstr ""
1487
1488 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:50
1489 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:50
1490 msgid "Group parent"
1491 msgstr ""
1492
1493 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:58
1494 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:58
1495 #: rhodecode/templates/admin/users/user_add.html:85
1496 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
1497 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
1498 msgid "save"
1499 msgstr ""
1500
1501 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:5
1502 msgid "Edit repos group"
1503 msgstr ""
1504
1505 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:12
1506 msgid "edit repos group"
1507 msgstr ""
1508
1509 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5
1510 msgid "Repositories groups administration"
1511 msgstr ""
1512
1513 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:22
1514 msgid "ADD NEW GROUP"
1515 msgstr ""
1516
1517 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:35
1518 msgid "Number of repositories"
1519 msgstr ""
1520
1521 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:54
1522 msgid "Confirm to delete this group"
1523 msgstr ""
1524
1525 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:62
1526 msgid "There are no repositories groups yet"
1527 msgstr ""
1528
1529 #: rhodecode/templates/admin/settings/hooks.html:5
969 #: rhodecode/templates/admin/settings/settings.html:5
1530 #: rhodecode/templates/admin/settings/settings.html:5
970 msgid "Settings administration"
1531 msgid "Settings administration"
971 msgstr ""
1532 msgstr ""
972
1533
1534 #: rhodecode/templates/admin/settings/hooks.html:9
973 #: rhodecode/templates/admin/settings/settings.html:9
1535 #: rhodecode/templates/admin/settings/settings.html:9
974 #: rhodecode/templates/settings/repo_settings.html:5
1536 #: rhodecode/templates/settings/repo_settings.html:5
975 #: rhodecode/templates/settings/repo_settings.html:11
1537 #: rhodecode/templates/settings/repo_settings.html:13
976 msgid "Settings"
1538 msgid "Settings"
977 msgstr ""
1539 msgstr ""
978
1540
1541 #: rhodecode/templates/admin/settings/hooks.html:24
1542 msgid "Built in hooks - read only"
1543 msgstr ""
1544
1545 #: rhodecode/templates/admin/settings/hooks.html:40
1546 msgid "Custom hooks"
1547 msgstr ""
1548
1549 #: rhodecode/templates/admin/settings/hooks.html:56
1550 msgid "remove"
1551 msgstr ""
1552
1553 #: rhodecode/templates/admin/settings/hooks.html:88
1554 msgid "Failed to remove hook"
1555 msgstr ""
1556
979 #: rhodecode/templates/admin/settings/settings.html:24
1557 #: rhodecode/templates/admin/settings/settings.html:24
980 msgid "Remap and rescan repositories"
1558 msgid "Remap and rescan repositories"
981 msgstr ""
1559 msgstr ""
@@ -995,6 +1573,10 b' msgstr ""'
995 msgid "destroy old data"
1573 msgid "destroy old data"
996 msgstr ""
1574 msgstr ""
997
1575
1576 #: rhodecode/templates/admin/settings/settings.html:45
1577 msgid "Rescan repositories"
1578 msgstr ""
1579
998 #: rhodecode/templates/admin/settings/settings.html:51
1580 #: rhodecode/templates/admin/settings/settings.html:51
999 msgid "Whoosh indexing"
1581 msgid "Whoosh indexing"
1000 msgstr ""
1582 msgstr ""
@@ -1007,6 +1589,10 b' msgstr ""'
1007 msgid "build from scratch"
1589 msgid "build from scratch"
1008 msgstr ""
1590 msgstr ""
1009
1591
1592 #: rhodecode/templates/admin/settings/settings.html:70
1593 msgid "Reindex"
1594 msgstr ""
1595
1010 #: rhodecode/templates/admin/settings/settings.html:76
1596 #: rhodecode/templates/admin/settings/settings.html:76
1011 msgid "Global application settings"
1597 msgid "Global application settings"
1012 msgstr ""
1598 msgstr ""
@@ -1019,50 +1605,73 b' msgstr ""'
1019 msgid "Realm text"
1605 msgid "Realm text"
1020 msgstr ""
1606 msgstr ""
1021
1607
1022 #: rhodecode/templates/admin/settings/settings.html:109
1608 #: rhodecode/templates/admin/settings/settings.html:103
1023 msgid "Mercurial settings"
1609 msgid "GA code"
1610 msgstr ""
1611
1612 #: rhodecode/templates/admin/settings/settings.html:111
1613 #: rhodecode/templates/admin/settings/settings.html:177
1614 msgid "Save settings"
1615 msgstr ""
1616
1617 #: rhodecode/templates/admin/settings/settings.html:112
1618 #: rhodecode/templates/admin/settings/settings.html:178
1619 #: rhodecode/templates/admin/users/user_edit.html:118
1620 #: rhodecode/templates/admin/users/user_edit.html:143
1621 #: rhodecode/templates/admin/users/user_edit_my_account.html:90
1622 #: rhodecode/templates/admin/users_groups/users_group_edit.html:264
1623 #: rhodecode/templates/files/files_edit.html:50
1624 msgid "Reset"
1024 msgstr ""
1625 msgstr ""
1025
1626
1026 #: rhodecode/templates/admin/settings/settings.html:118
1627 #: rhodecode/templates/admin/settings/settings.html:118
1628 msgid "Mercurial settings"
1629 msgstr ""
1630
1631 #: rhodecode/templates/admin/settings/settings.html:127
1027 msgid "Web"
1632 msgid "Web"
1028 msgstr ""
1633 msgstr ""
1029
1634
1030 #: rhodecode/templates/admin/settings/settings.html:123
1635 #: rhodecode/templates/admin/settings/settings.html:132
1031 msgid "require ssl for pushing"
1636 msgid "require ssl for pushing"
1032 msgstr ""
1637 msgstr ""
1033
1638
1034 #: rhodecode/templates/admin/settings/settings.html:130
1035 msgid "Hooks"
1036 msgstr ""
1037
1038 #: rhodecode/templates/admin/settings/settings.html:135
1039 msgid "Update repository after push (hg update)"
1040 msgstr ""
1041
1042 #: rhodecode/templates/admin/settings/settings.html:139
1639 #: rhodecode/templates/admin/settings/settings.html:139
1043 msgid "Show repository size after push"
1640 msgid "Hooks"
1044 msgstr ""
1641 msgstr ""
1045
1642
1046 #: rhodecode/templates/admin/settings/settings.html:143
1643 #: rhodecode/templates/admin/settings/settings.html:142
1047 msgid "Log user push commands"
1644 msgid "advanced setup"
1048 msgstr ""
1645 msgstr ""
1049
1646
1050 #: rhodecode/templates/admin/settings/settings.html:147
1647 #: rhodecode/templates/admin/settings/settings.html:147
1051 msgid "Log user pull commands"
1648 msgid "Update repository after push (hg update)"
1052 msgstr ""
1649 msgstr ""
1053
1650
1054 #: rhodecode/templates/admin/settings/settings.html:154
1651 #: rhodecode/templates/admin/settings/settings.html:151
1055 msgid "Repositories location"
1652 msgid "Show repository size after push"
1653 msgstr ""
1654
1655 #: rhodecode/templates/admin/settings/settings.html:155
1656 msgid "Log user push commands"
1056 msgstr ""
1657 msgstr ""
1057
1658
1058 #: rhodecode/templates/admin/settings/settings.html:159
1659 #: rhodecode/templates/admin/settings/settings.html:159
1660 msgid "Log user pull commands"
1661 msgstr ""
1662
1663 #: rhodecode/templates/admin/settings/settings.html:166
1664 msgid "Repositories location"
1665 msgstr ""
1666
1667 #: rhodecode/templates/admin/settings/settings.html:171
1059 msgid ""
1668 msgid ""
1060 "This a crucial application setting. If You really sure you need to change "
1669 "This a crucial application setting. If you are really sure you need to change"
1061 "this, you must restart application in order to make this settings take "
1670 " this, you must restart application in order to make this setting take "
1062 "effect. Click this label to unlock."
1671 "effect. Click this label to unlock."
1063 msgstr ""
1672 msgstr ""
1064
1673
1065 #: rhodecode/templates/admin/settings/settings.html:160
1674 #: rhodecode/templates/admin/settings/settings.html:172
1066 msgid "unlock"
1675 msgid "unlock"
1067 msgstr ""
1676 msgstr ""
1068
1677
@@ -1081,7 +1690,9 b' msgid "add new user"'
1081 msgstr ""
1690 msgstr ""
1082
1691
1083 #: rhodecode/templates/admin/users/user_add.html:77
1692 #: rhodecode/templates/admin/users/user_add.html:77
1084 #: rhodecode/templates/admin/users/user_edit.html:88
1693 #: rhodecode/templates/admin/users/user_edit.html:101
1694 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
1695 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
1085 msgid "Active"
1696 msgid "Active"
1086 msgstr ""
1697 msgstr ""
1087
1698
@@ -1089,16 +1700,35 b' msgstr ""'
1089 msgid "Edit user"
1700 msgid "Edit user"
1090 msgstr ""
1701 msgstr ""
1091
1702
1092 #: rhodecode/templates/admin/users/user_edit.html:36
1703 #: rhodecode/templates/admin/users/user_edit.html:33
1704 #: rhodecode/templates/admin/users/user_edit_my_account.html:32
1705 msgid "Change your avatar at"
1706 msgstr ""
1707
1708 #: rhodecode/templates/admin/users/user_edit.html:34
1093 #: rhodecode/templates/admin/users/user_edit_my_account.html:33
1709 #: rhodecode/templates/admin/users/user_edit_my_account.html:33
1094 msgid "Using"
1710 msgid "Using"
1095 msgstr ""
1711 msgstr ""
1096
1712
1097 #: rhodecode/templates/admin/users/user_edit.html:52
1713 #: rhodecode/templates/admin/users/user_edit.html:40
1098 #: rhodecode/templates/admin/users/user_edit_my_account.html:50
1714 #: rhodecode/templates/admin/users/user_edit_my_account.html:39
1715 msgid "API key"
1716 msgstr ""
1717
1718 #: rhodecode/templates/admin/users/user_edit.html:56
1719 msgid "LDAP DN"
1720 msgstr ""
1721
1722 #: rhodecode/templates/admin/users/user_edit.html:65
1723 #: rhodecode/templates/admin/users/user_edit_my_account.html:54
1099 msgid "New password"
1724 msgid "New password"
1100 msgstr ""
1725 msgstr ""
1101
1726
1727 #: rhodecode/templates/admin/users/user_edit.html:135
1728 #: rhodecode/templates/admin/users_groups/users_group_edit.html:256
1729 msgid "Create repositories"
1730 msgstr ""
1731
1102 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
1732 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
1103 msgid "My account"
1733 msgid "My account"
1104 msgstr ""
1734 msgstr ""
@@ -1107,26 +1737,26 b' msgstr ""'
1107 msgid "My Account"
1737 msgid "My Account"
1108 msgstr ""
1738 msgstr ""
1109
1739
1110 #: rhodecode/templates/admin/users/user_edit_my_account.html:100
1740 #: rhodecode/templates/admin/users/user_edit_my_account.html:101
1111 msgid "My repositories"
1741 msgid "My repositories"
1112 msgstr ""
1742 msgstr ""
1113
1743
1114 #: rhodecode/templates/admin/users/user_edit_my_account.html:106
1744 #: rhodecode/templates/admin/users/user_edit_my_account.html:107
1115 msgid "ADD REPOSITORY"
1745 msgid "ADD REPOSITORY"
1116 msgstr ""
1746 msgstr ""
1117
1747
1118 #: rhodecode/templates/admin/users/user_edit_my_account.html:117
1748 #: rhodecode/templates/admin/users/user_edit_my_account.html:118
1119 #: rhodecode/templates/branches/branches_data.html:7
1749 #: rhodecode/templates/branches/branches_data.html:7
1120 #: rhodecode/templates/shortlog/shortlog_data.html:8
1750 #: rhodecode/templates/shortlog/shortlog_data.html:8
1121 #: rhodecode/templates/tags/tags_data.html:7
1751 #: rhodecode/templates/tags/tags_data.html:7
1122 msgid "revision"
1752 msgid "revision"
1123 msgstr ""
1753 msgstr ""
1124
1754
1125 #: rhodecode/templates/admin/users/user_edit_my_account.html:156
1755 #: rhodecode/templates/admin/users/user_edit_my_account.html:157
1126 msgid "No repositories yet"
1756 msgid "No repositories yet"
1127 msgstr ""
1757 msgstr ""
1128
1758
1129 #: rhodecode/templates/admin/users/user_edit_my_account.html:158
1759 #: rhodecode/templates/admin/users/user_edit_my_account.html:159
1130 msgid "create one now"
1760 msgid "create one now"
1131 msgstr ""
1761 msgstr ""
1132
1762
@@ -1134,6 +1764,10 b' msgstr ""'
1134 msgid "Users administration"
1764 msgid "Users administration"
1135 msgstr ""
1765 msgstr ""
1136
1766
1767 #: rhodecode/templates/admin/users/users.html:23
1768 msgid "ADD NEW USER"
1769 msgstr ""
1770
1137 #: rhodecode/templates/admin/users/users.html:33
1771 #: rhodecode/templates/admin/users/users.html:33
1138 msgid "username"
1772 msgid "username"
1139 msgstr ""
1773 msgstr ""
@@ -1149,140 +1783,203 b' msgid "lastname"'
1149 msgstr ""
1783 msgstr ""
1150
1784
1151 #: rhodecode/templates/admin/users/users.html:36
1785 #: rhodecode/templates/admin/users/users.html:36
1786 msgid "last login"
1787 msgstr ""
1788
1789 #: rhodecode/templates/admin/users/users.html:37
1790 #: rhodecode/templates/admin/users_groups/users_groups.html:34
1152 msgid "active"
1791 msgid "active"
1153 msgstr ""
1792 msgstr ""
1154
1793
1155 #: rhodecode/templates/admin/users/users.html:38
1794 #: rhodecode/templates/admin/users/users.html:39
1156 #: rhodecode/templates/base/base.html:233
1795 #: rhodecode/templates/base/base.html:305
1157 msgid "ldap"
1796 msgid "ldap"
1158 msgstr ""
1797 msgstr ""
1159
1798
1160 #: rhodecode/templates/base/base.html:37 rhodecode/templates/base/base.html:269
1799 #: rhodecode/templates/admin/users/users.html:56
1161 #: rhodecode/templates/base/base.html:271 rhodecode/templates/base/base.html:273
1800 msgid "Confirm to delete this user"
1801 msgstr ""
1802
1803 #: rhodecode/templates/admin/users_groups/users_group_add.html:5
1804 msgid "Add users group"
1805 msgstr ""
1806
1807 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
1808 #: rhodecode/templates/admin/users_groups/users_groups.html:9
1809 msgid "Users groups"
1810 msgstr ""
1811
1812 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
1813 msgid "add new users group"
1814 msgstr ""
1815
1816 #: rhodecode/templates/admin/users_groups/users_group_edit.html:5
1817 msgid "Edit users group"
1818 msgstr ""
1819
1820 #: rhodecode/templates/admin/users_groups/users_group_edit.html:11
1821 msgid "UsersGroups"
1822 msgstr ""
1823
1824 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
1825 msgid "Members"
1826 msgstr ""
1827
1828 #: rhodecode/templates/admin/users_groups/users_group_edit.html:58
1829 msgid "Choosen group members"
1830 msgstr ""
1831
1832 #: rhodecode/templates/admin/users_groups/users_group_edit.html:61
1833 msgid "Remove all elements"
1834 msgstr ""
1835
1836 #: rhodecode/templates/admin/users_groups/users_group_edit.html:75
1837 msgid "Available members"
1838 msgstr ""
1839
1840 #: rhodecode/templates/admin/users_groups/users_group_edit.html:79
1841 msgid "Add all elements"
1842 msgstr ""
1843
1844 #: rhodecode/templates/admin/users_groups/users_groups.html:5
1845 msgid "Users groups administration"
1846 msgstr ""
1847
1848 #: rhodecode/templates/admin/users_groups/users_groups.html:23
1849 msgid "ADD NEW USER GROUP"
1850 msgstr ""
1851
1852 #: rhodecode/templates/admin/users_groups/users_groups.html:32
1853 msgid "group name"
1854 msgstr ""
1855
1856 #: rhodecode/templates/base/base.html:32
1857 msgid "Forgot password ?"
1858 msgstr ""
1859
1860 #: rhodecode/templates/base/base.html:57 rhodecode/templates/base/base.html:338
1861 #: rhodecode/templates/base/base.html:340 rhodecode/templates/base/base.html:342
1162 msgid "Home"
1862 msgid "Home"
1163 msgstr ""
1863 msgstr ""
1164
1864
1165 #: rhodecode/templates/base/base.html:87
1865 #: rhodecode/templates/base/base.html:61 rhodecode/templates/base/base.html:347
1866 #: rhodecode/templates/base/base.html:349 rhodecode/templates/base/base.html:351
1867 #: rhodecode/templates/journal/journal.html:4
1868 #: rhodecode/templates/journal/journal.html:17
1869 #: rhodecode/templates/journal/public_journal.html:4
1870 msgid "Journal"
1871 msgstr ""
1872
1873 #: rhodecode/templates/base/base.html:66
1874 msgid "Login"
1875 msgstr ""
1876
1877 #: rhodecode/templates/base/base.html:68
1878 msgid "Log Out"
1879 msgstr ""
1880
1881 #: rhodecode/templates/base/base.html:107
1166 msgid "Submit a bug"
1882 msgid "Submit a bug"
1167 msgstr ""
1883 msgstr ""
1168
1884
1169 #: rhodecode/templates/base/base.html:88
1885 #: rhodecode/templates/base/base.html:141
1170 msgid "GPL license"
1171 msgstr ""
1172
1173 #: rhodecode/templates/base/base.html:120
1174 msgid "Switch repository"
1886 msgid "Switch repository"
1175 msgstr ""
1887 msgstr ""
1176
1888
1177 #: rhodecode/templates/base/base.html:122
1889 #: rhodecode/templates/base/base.html:143
1178 msgid "Products"
1890 msgid "Products"
1179 msgstr ""
1891 msgstr ""
1180
1892
1181 #: rhodecode/templates/base/base.html:130
1893 #: rhodecode/templates/base/base.html:149
1182 msgid "Private repository"
1894 msgid "loading..."
1183 msgstr ""
1895 msgstr ""
1184
1896
1185 #: rhodecode/templates/base/base.html:132
1897 #: rhodecode/templates/base/base.html:234 rhodecode/templates/base/base.html:236
1186 msgid "Public repository"
1898 #: rhodecode/templates/base/base.html:238
1187 msgstr ""
1188
1189 #: rhodecode/templates/base/base.html:139 rhodecode/templates/base/base.html:141
1190 #: rhodecode/templates/base/base.html:143
1191 #: rhodecode/templates/summary/summary.html:4
1192 msgid "Summary"
1193 msgstr ""
1194
1195 #: rhodecode/templates/base/base.html:155 rhodecode/templates/base/base.html:157
1196 #: rhodecode/templates/base/base.html:159
1197 #: rhodecode/templates/changelog/changelog.html:6
1198 #: rhodecode/templates/changelog/changelog.html:14
1199 msgid "Changelog"
1200 msgstr ""
1201
1202 #: rhodecode/templates/base/base.html:164 rhodecode/templates/base/base.html:166
1203 #: rhodecode/templates/base/base.html:168
1204 msgid "Switch to"
1899 msgid "Switch to"
1205 msgstr ""
1900 msgstr ""
1206
1901
1207 #: rhodecode/templates/base/base.html:172
1902 #: rhodecode/templates/base/base.html:242
1208 #: rhodecode/templates/branches/branches.html:13
1903 #: rhodecode/templates/branches/branches.html:13
1209 msgid "branches"
1904 msgid "branches"
1210 msgstr ""
1905 msgstr ""
1211
1906
1212 #: rhodecode/templates/base/base.html:179
1907 #: rhodecode/templates/base/base.html:249
1213 #: rhodecode/templates/branches/branches_data.html:32
1908 #: rhodecode/templates/branches/branches_data.html:52
1214 msgid "There are no branches yet"
1909 msgid "There are no branches yet"
1215 msgstr ""
1910 msgstr ""
1216
1911
1217 #: rhodecode/templates/base/base.html:184
1912 #: rhodecode/templates/base/base.html:254
1218 #: rhodecode/templates/shortlog/shortlog_data.html:10
1913 #: rhodecode/templates/shortlog/shortlog_data.html:10
1219 #: rhodecode/templates/tags/tags.html:14
1914 #: rhodecode/templates/tags/tags.html:14
1220 msgid "tags"
1915 msgid "tags"
1221 msgstr ""
1916 msgstr ""
1222
1917
1223 #: rhodecode/templates/base/base.html:191
1918 #: rhodecode/templates/base/base.html:261
1224 #: rhodecode/templates/tags/tags_data.html:32
1919 #: rhodecode/templates/tags/tags_data.html:32
1225 msgid "There are no tags yet"
1920 msgid "There are no tags yet"
1226 msgstr ""
1921 msgstr ""
1227
1922
1228 #: rhodecode/templates/base/base.html:198 rhodecode/templates/base/base.html:200
1923 #: rhodecode/templates/base/base.html:277 rhodecode/templates/base/base.html:281
1229 #: rhodecode/templates/base/base.html:202 rhodecode/templates/files/files.html:4
1230 msgid "Files"
1231 msgstr ""
1232
1233 #: rhodecode/templates/base/base.html:207 rhodecode/templates/base/base.html:211
1234 #: rhodecode/templates/files/files_annotate.html:40
1924 #: rhodecode/templates/files/files_annotate.html:40
1235 #: rhodecode/templates/files/files_source.html:11
1925 #: rhodecode/templates/files/files_source.html:11
1236 msgid "Options"
1926 msgid "Options"
1237 msgstr ""
1927 msgstr ""
1238
1928
1239 #: rhodecode/templates/base/base.html:216 rhodecode/templates/base/base.html:218
1929 #: rhodecode/templates/base/base.html:286 rhodecode/templates/base/base.html:288
1240 #: rhodecode/templates/base/base.html:234
1930 #: rhodecode/templates/base/base.html:306
1241 msgid "settings"
1931 msgid "settings"
1242 msgstr ""
1932 msgstr ""
1243
1933
1244 #: rhodecode/templates/base/base.html:222
1934 #: rhodecode/templates/base/base.html:292
1245 msgid "search"
1935 msgid "search"
1246 msgstr ""
1936 msgstr ""
1247
1937
1248 #: rhodecode/templates/base/base.html:229
1938 #: rhodecode/templates/base/base.html:299
1249 msgid "journal"
1939 msgid "journal"
1250 msgstr ""
1940 msgstr ""
1251
1941
1252 #: rhodecode/templates/base/base.html:230
1942 #: rhodecode/templates/base/base.html:301
1253 msgid "repositories"
1943 msgid "repositories groups"
1254 msgstr ""
1944 msgstr ""
1255
1945
1256 #: rhodecode/templates/base/base.html:231
1946 #: rhodecode/templates/base/base.html:302
1257 msgid "users"
1947 msgid "users"
1258 msgstr ""
1948 msgstr ""
1259
1949
1260 #: rhodecode/templates/base/base.html:232
1950 #: rhodecode/templates/base/base.html:303
1951 msgid "users groups"
1952 msgstr ""
1953
1954 #: rhodecode/templates/base/base.html:304
1261 msgid "permissions"
1955 msgid "permissions"
1262 msgstr ""
1956 msgstr ""
1263
1957
1264 #: rhodecode/templates/base/base.html:246 rhodecode/templates/base/base.html:248
1958 #: rhodecode/templates/base/base.html:317 rhodecode/templates/base/base.html:319
1959 #: rhodecode/templates/followers/followers.html:5
1265 msgid "Followers"
1960 msgid "Followers"
1266 msgstr ""
1961 msgstr ""
1267
1962
1268 #: rhodecode/templates/base/base.html:254 rhodecode/templates/base/base.html:256
1963 #: rhodecode/templates/base/base.html:325 rhodecode/templates/base/base.html:327
1964 #: rhodecode/templates/forks/forks.html:5
1269 msgid "Forks"
1965 msgid "Forks"
1270 msgstr ""
1966 msgstr ""
1271
1967
1272 #: rhodecode/templates/base/base.html:287 rhodecode/templates/base/base.html:289
1968 #: rhodecode/templates/base/base.html:356 rhodecode/templates/base/base.html:358
1273 #: rhodecode/templates/base/base.html:291 rhodecode/templates/search/search.html:4
1969 #: rhodecode/templates/base/base.html:360 rhodecode/templates/search/search.html:4
1274 #: rhodecode/templates/search/search.html:24
1970 #: rhodecode/templates/search/search.html:24
1275 #: rhodecode/templates/search/search.html:46
1971 #: rhodecode/templates/search/search.html:46
1276 msgid "Search"
1972 msgid "Search"
1277 msgstr ""
1973 msgstr ""
1278
1974
1279 #: rhodecode/templates/base/base.html:339
1975 #: rhodecode/templates/base/root.html:57
1280 #: rhodecode/templates/summary/summary.html:49
1976 #: rhodecode/templates/journal/journal.html:48
1977 #: rhodecode/templates/summary/summary.html:36
1281 msgid "Stop following this repository"
1978 msgid "Stop following this repository"
1282 msgstr ""
1979 msgstr ""
1283
1980
1284 #: rhodecode/templates/base/base.html:343
1981 #: rhodecode/templates/base/root.html:66
1285 #: rhodecode/templates/summary/summary.html:53
1982 #: rhodecode/templates/summary/summary.html:40
1286 msgid "Start following this repository"
1983 msgid "Start following this repository"
1287 msgstr ""
1984 msgstr ""
1288
1985
@@ -1303,16 +2000,18 b' msgstr ""'
1303 msgid "links"
2000 msgid "links"
1304 msgstr ""
2001 msgstr ""
1305
2002
1306 #: rhodecode/templates/branches/branches_data.html:24
2003 #: rhodecode/templates/branches/branches_data.html:23
2004 #: rhodecode/templates/branches/branches_data.html:43
1307 #: rhodecode/templates/shortlog/shortlog_data.html:39
2005 #: rhodecode/templates/shortlog/shortlog_data.html:39
1308 #: rhodecode/templates/tags/tags_data.html:24
2006 #: rhodecode/templates/tags/tags_data.html:24
1309 msgid "changeset"
2007 msgid "changeset"
1310 msgstr ""
2008 msgstr ""
1311
2009
1312 #: rhodecode/templates/branches/branches_data.html:26
2010 #: rhodecode/templates/branches/branches_data.html:25
2011 #: rhodecode/templates/branches/branches_data.html:45
1313 #: rhodecode/templates/files/files.html:12
2012 #: rhodecode/templates/files/files.html:12
1314 #: rhodecode/templates/shortlog/shortlog_data.html:41
2013 #: rhodecode/templates/shortlog/shortlog_data.html:41
1315 #: rhodecode/templates/summary/summary.html:161
2014 #: rhodecode/templates/summary/summary.html:233
1316 #: rhodecode/templates/tags/tags_data.html:26
2015 #: rhodecode/templates/tags/tags_data.html:26
1317 msgid "files"
2016 msgid "files"
1318 msgstr ""
2017 msgstr ""
@@ -1325,119 +2024,130 b' msgstr ""'
1325 msgid "out of"
2024 msgid "out of"
1326 msgstr ""
2025 msgstr ""
1327
2026
1328 #: rhodecode/templates/changelog/changelog.html:38
2027 #: rhodecode/templates/changelog/changelog.html:37
1329 msgid "Show"
2028 msgid "Show"
1330 msgstr ""
2029 msgstr ""
1331
2030
1332 #: rhodecode/templates/changelog/changelog.html:41
2031 #: rhodecode/templates/changelog/changelog.html:50
1333 msgid "set"
2032 #: rhodecode/templates/changeset/changeset.html:42
1334 msgstr ""
2033 #: rhodecode/templates/summary/summary.html:609
1335
1336 #: rhodecode/templates/changelog/changelog.html:49
1337 #: rhodecode/templates/changeset/changeset.html:40
1338 #: rhodecode/templates/summary/summary.html:552
1339 msgid "commit"
2034 msgid "commit"
1340 msgstr ""
2035 msgstr ""
1341
2036
1342 #: rhodecode/templates/changelog/changelog.html:74
2037 #: rhodecode/templates/changelog/changelog.html:63
1343 #: rhodecode/templates/changeset/changeset.html:52
2038 msgid "Affected number of files, click to show more details"
1344 msgid "removed"
2039 msgstr ""
1345 msgstr ""
2040
1346
2041 #: rhodecode/templates/changelog/changelog.html:67
1347 #: rhodecode/templates/changelog/changelog.html:75
2042 #: rhodecode/templates/changeset/changeset.html:66
1348 #: rhodecode/templates/changeset/changeset.html:53
1349 msgid "changed"
1350 msgstr ""
1351
1352 #: rhodecode/templates/changelog/changelog.html:76
1353 #: rhodecode/templates/changeset/changeset.html:54
1354 msgid "added"
1355 msgstr ""
1356
1357 #: rhodecode/templates/changelog/changelog.html:80
1358 #: rhodecode/templates/changeset/changeset.html:58
1359 msgid "merge"
2043 msgid "merge"
1360 msgstr ""
2044 msgstr ""
1361
2045
1362 #: rhodecode/templates/changelog/changelog.html:85
2046 #: rhodecode/templates/changelog/changelog.html:72
1363 #: rhodecode/templates/changeset/changeset.html:64
2047 #: rhodecode/templates/changeset/changeset.html:72
1364 msgid "Parent"
2048 msgid "Parent"
1365 msgstr ""
2049 msgstr ""
1366
2050
1367 #: rhodecode/templates/changelog/changelog.html:90
2051 #: rhodecode/templates/changelog/changelog.html:77
1368 #: rhodecode/templates/changeset/changeset.html:69
2052 #: rhodecode/templates/changeset/changeset.html:77
1369 msgid "No parents"
2053 msgid "No parents"
1370 msgstr ""
2054 msgstr ""
1371
2055
1372 #: rhodecode/templates/changelog/changelog.html:95
2056 #: rhodecode/templates/changelog/changelog.html:82
1373 #: rhodecode/templates/changeset/changeset.html:72
2057 #: rhodecode/templates/changeset/changeset.html:80
1374 #: rhodecode/templates/files/files.html:29
2058 #: rhodecode/templates/files/files.html:29
1375 #: rhodecode/templates/files/files_annotate.html:25
2059 #: rhodecode/templates/files/files_annotate.html:25
2060 #: rhodecode/templates/files/files_edit.html:33
1376 #: rhodecode/templates/shortlog/shortlog_data.html:9
2061 #: rhodecode/templates/shortlog/shortlog_data.html:9
1377 msgid "branch"
2062 msgid "branch"
1378 msgstr ""
2063 msgstr ""
1379
2064
1380 #: rhodecode/templates/changelog/changelog.html:99
2065 #: rhodecode/templates/changelog/changelog.html:86
1381 #: rhodecode/templates/changeset/changeset.html:75
2066 #: rhodecode/templates/changeset/changeset.html:83
1382 msgid "tag"
2067 msgid "tag"
1383 msgstr ""
2068 msgstr ""
1384
2069
1385 #: rhodecode/templates/changelog/changelog.html:132
2070 #: rhodecode/templates/changelog/changelog.html:122
1386 #: rhodecode/templates/shortlog/shortlog_data.html:64
2071 msgid "Show selected changes __S -> __E"
2072 msgstr ""
2073
2074 #: rhodecode/templates/changelog/changelog.html:172
2075 #: rhodecode/templates/shortlog/shortlog_data.html:61
1387 msgid "There are no changes yet"
2076 msgid "There are no changes yet"
1388 msgstr ""
2077 msgstr ""
1389
2078
1390 #: rhodecode/templates/changeset/changeset.html:4
2079 #: rhodecode/templates/changelog/changelog_details.html:2
1391 #: rhodecode/templates/changeset/changeset.html:12
2080 #: rhodecode/templates/changeset/changeset.html:55
1392 #: rhodecode/templates/changeset/changeset.html:29
2081 msgid "removed"
2082 msgstr ""
2083
2084 #: rhodecode/templates/changelog/changelog_details.html:3
2085 #: rhodecode/templates/changeset/changeset.html:56
2086 msgid "changed"
2087 msgstr ""
2088
2089 #: rhodecode/templates/changelog/changelog_details.html:4
2090 #: rhodecode/templates/changeset/changeset.html:57
2091 msgid "added"
2092 msgstr ""
2093
2094 #: rhodecode/templates/changelog/changelog_details.html:6
2095 #: rhodecode/templates/changelog/changelog_details.html:7
2096 #: rhodecode/templates/changelog/changelog_details.html:8
2097 #: rhodecode/templates/changeset/changeset.html:59
2098 #: rhodecode/templates/changeset/changeset.html:60
2099 #: rhodecode/templates/changeset/changeset.html:61
2100 #, python-format
2101 msgid "affected %s files"
2102 msgstr ""
2103
2104 #: rhodecode/templates/changeset/changeset.html:6
2105 #: rhodecode/templates/changeset/changeset.html:14
2106 #: rhodecode/templates/changeset/changeset.html:31
1393 msgid "Changeset"
2107 msgid "Changeset"
1394 msgstr ""
2108 msgstr ""
1395
2109
1396 #: rhodecode/templates/changeset/changeset.html:30
1397 #: rhodecode/templates/changeset/changeset.html:104
1398 #: rhodecode/templates/files/file_diff.html:32
1399 msgid "raw diff"
1400 msgstr ""
1401
1402 #: rhodecode/templates/changeset/changeset.html:32
2110 #: rhodecode/templates/changeset/changeset.html:32
1403 #: rhodecode/templates/changeset/changeset.html:106
2111 #: rhodecode/templates/changeset/changeset.html:121
2112 #: rhodecode/templates/changeset/changeset_range.html:78
2113 #: rhodecode/templates/files/file_diff.html:32
2114 #: rhodecode/templates/files/file_diff.html:42
2115 msgid "raw diff"
2116 msgstr ""
2117
2118 #: rhodecode/templates/changeset/changeset.html:34
2119 #: rhodecode/templates/changeset/changeset.html:123
2120 #: rhodecode/templates/changeset/changeset_range.html:80
1404 #: rhodecode/templates/files/file_diff.html:34
2121 #: rhodecode/templates/files/file_diff.html:34
1405 msgid "download diff"
2122 msgid "download diff"
1406 msgstr ""
2123 msgstr ""
1407
2124
1408 #: rhodecode/templates/changeset/changeset.html:81
2125 #: rhodecode/templates/changeset/changeset.html:90
1409 msgid "Files affected"
2126 #, python-format
1410 msgstr ""
2127 msgid "%s files affected with %s additions and %s deletions."
1411
2128 msgstr ""
1412 #: rhodecode/templates/changeset/changeset.html:102
2129
2130 #: rhodecode/templates/changeset/changeset.html:101
2131 msgid "Changeset was too big and was cut off..."
2132 msgstr ""
2133
2134 #: rhodecode/templates/changeset/changeset.html:119
2135 #: rhodecode/templates/changeset/changeset_range.html:76
1413 #: rhodecode/templates/files/file_diff.html:30
2136 #: rhodecode/templates/files/file_diff.html:30
1414 msgid "diff"
2137 msgid "diff"
1415 msgstr ""
2138 msgstr ""
1416
2139
1417 #: rhodecode/templates/changeset/changeset.html:115
2140 #: rhodecode/templates/changeset/changeset.html:132
2141 #: rhodecode/templates/changeset/changeset_range.html:89
1418 msgid "No changes in this file"
2142 msgid "No changes in this file"
1419 msgstr ""
2143 msgstr ""
1420
2144
1421 #: rhodecode/templates/errors/error_404.html:5
2145 #: rhodecode/templates/changeset/changeset_range.html:30
1422 msgid "Repository not found"
2146 msgid "Compare View"
1423 msgstr ""
2147 msgstr ""
1424
2148
1425 #: rhodecode/templates/errors/error_404.html:22
2149 #: rhodecode/templates/changeset/changeset_range.html:52
1426 msgid "Not Found"
2150 msgid "Files affected"
1427 msgstr ""
1428
1429 #: rhodecode/templates/errors/error_404.html:23
1430 #, python-format
1431 msgid "The specified repository \"%s\" is unknown, sorry."
1432 msgstr ""
1433
1434 #: rhodecode/templates/errors/error_404.html:26
1435 #, python-format
1436 msgid "Create \"%s\" repository as %s"
1437 msgstr ""
1438
1439 #: rhodecode/templates/errors/error_404.html:29
1440 msgid "Go back to the main repository list page"
1441 msgstr ""
2151 msgstr ""
1442
2152
1443 #: rhodecode/templates/errors/error_document.html:44
2153 #: rhodecode/templates/errors/error_document.html:44
@@ -1450,12 +2160,13 b' msgstr ""'
1450 msgid "File diff"
2160 msgid "File diff"
1451 msgstr ""
2161 msgstr ""
1452
2162
1453 #: rhodecode/templates/files/file_diff.html:40
2163 #: rhodecode/templates/files/file_diff.html:42
1454 msgid "No changes"
2164 msgid "Diff is to big to display"
1455 msgstr ""
2165 msgstr ""
1456
2166
1457 #: rhodecode/templates/files/files.html:37
2167 #: rhodecode/templates/files/files.html:37
1458 #: rhodecode/templates/files/files_annotate.html:31
2168 #: rhodecode/templates/files/files_annotate.html:31
2169 #: rhodecode/templates/files/files_edit.html:39
1459 msgid "Location"
2170 msgid "Location"
1460 msgstr ""
2171 msgstr ""
1461
2172
@@ -1476,19 +2187,19 b' msgid "annotate"'
1476 msgstr ""
2187 msgstr ""
1477
2188
1478 #: rhodecode/templates/files/files_annotate.html:33
2189 #: rhodecode/templates/files/files_annotate.html:33
1479 #: rhodecode/templates/files/files_browser.html:30
2190 #: rhodecode/templates/files/files_browser.html:160
1480 #: rhodecode/templates/files/files_source.html:2
2191 #: rhodecode/templates/files/files_source.html:2
1481 msgid "Revision"
2192 msgid "Revision"
1482 msgstr ""
2193 msgstr ""
1483
2194
1484 #: rhodecode/templates/files/files_annotate.html:36
2195 #: rhodecode/templates/files/files_annotate.html:36
1485 #: rhodecode/templates/files/files_browser.html:28
2196 #: rhodecode/templates/files/files_browser.html:158
1486 #: rhodecode/templates/files/files_source.html:7
2197 #: rhodecode/templates/files/files_source.html:7
1487 msgid "Size"
2198 msgid "Size"
1488 msgstr ""
2199 msgstr ""
1489
2200
1490 #: rhodecode/templates/files/files_annotate.html:38
2201 #: rhodecode/templates/files/files_annotate.html:38
1491 #: rhodecode/templates/files/files_browser.html:29
2202 #: rhodecode/templates/files/files_browser.html:159
1492 #: rhodecode/templates/files/files_source.html:9
2203 #: rhodecode/templates/files/files_source.html:9
1493 msgid "Mimetype"
2204 msgid "Mimetype"
1494 msgstr ""
2205 msgstr ""
@@ -1498,9 +2209,9 b' msgid "show source"'
1498 msgstr ""
2209 msgstr ""
1499
2210
1500 #: rhodecode/templates/files/files_annotate.html:43
2211 #: rhodecode/templates/files/files_annotate.html:43
1501 #: rhodecode/templates/files/files_annotate.html:69
2212 #: rhodecode/templates/files/files_annotate.html:78
1502 #: rhodecode/templates/files/files_source.html:14
2213 #: rhodecode/templates/files/files_source.html:14
1503 #: rhodecode/templates/files/files_source.html:42
2214 #: rhodecode/templates/files/files_source.html:51
1504 msgid "show as raw"
2215 msgid "show as raw"
1505 msgstr ""
2216 msgstr ""
1506
2217
@@ -1509,40 +2220,131 b' msgstr ""'
1509 msgid "download as raw"
2220 msgid "download as raw"
1510 msgstr ""
2221 msgstr ""
1511
2222
1512 #: rhodecode/templates/files/files_annotate.html:48
2223 #: rhodecode/templates/files/files_annotate.html:54
1513 #: rhodecode/templates/files/files_source.html:19
2224 #: rhodecode/templates/files/files_source.html:25
1514 msgid "History"
2225 msgid "History"
1515 msgstr ""
2226 msgstr ""
1516
2227
1517 #: rhodecode/templates/files/files_annotate.html:69
2228 #: rhodecode/templates/files/files_annotate.html:73
1518 #: rhodecode/templates/files/files_source.html:42
2229 #: rhodecode/templates/files/files_source.html:46
1519 msgid "File is to big to display"
2230 #, python-format
1520 msgstr ""
2231 msgid "Binary file (%s)"
1521
2232 msgstr ""
1522 #: rhodecode/templates/files/files_browser.html:12
2233
1523 msgid "view"
2234 #: rhodecode/templates/files/files_annotate.html:78
2235 #: rhodecode/templates/files/files_source.html:51
2236 msgid "File is too big to display"
1524 msgstr ""
2237 msgstr ""
1525
2238
1526 #: rhodecode/templates/files/files_browser.html:13
2239 #: rhodecode/templates/files/files_browser.html:13
2240 msgid "view"
2241 msgstr ""
2242
2243 #: rhodecode/templates/files/files_browser.html:14
1527 msgid "previous revision"
2244 msgid "previous revision"
1528 msgstr ""
2245 msgstr ""
1529
2246
1530 #: rhodecode/templates/files/files_browser.html:15
2247 #: rhodecode/templates/files/files_browser.html:16
1531 msgid "next revision"
2248 msgid "next revision"
1532 msgstr ""
2249 msgstr ""
1533
2250
1534 #: rhodecode/templates/files/files_browser.html:31
2251 #: rhodecode/templates/files/files_browser.html:23
1535 msgid "Last modified"
2252 msgid "follow current branch"
2253 msgstr ""
2254
2255 #: rhodecode/templates/files/files_browser.html:27
2256 msgid "search file list"
1536 msgstr ""
2257 msgstr ""
1537
2258
1538 #: rhodecode/templates/files/files_browser.html:32
2259 #: rhodecode/templates/files/files_browser.html:32
2260 msgid "Loading file list..."
2261 msgstr ""
2262
2263 #: rhodecode/templates/files/files_browser.html:111
2264 msgid "search truncated"
2265 msgstr ""
2266
2267 #: rhodecode/templates/files/files_browser.html:122
2268 msgid "no matching files"
2269 msgstr ""
2270
2271 #: rhodecode/templates/files/files_browser.html:161
2272 msgid "Last modified"
2273 msgstr ""
2274
2275 #: rhodecode/templates/files/files_browser.html:162
1539 msgid "Last commiter"
2276 msgid "Last commiter"
1540 msgstr ""
2277 msgstr ""
1541
2278
2279 #: rhodecode/templates/files/files_edit.html:4
2280 msgid "Edit file"
2281 msgstr ""
2282
2283 #: rhodecode/templates/files/files_edit.html:19
2284 msgid "edit file"
2285 msgstr ""
2286
2287 #: rhodecode/templates/files/files_edit.html:45
2288 #: rhodecode/templates/shortlog/shortlog_data.html:5
2289 msgid "commit message"
2290 msgstr ""
2291
2292 #: rhodecode/templates/files/files_edit.html:51
2293 msgid "Commit changes"
2294 msgstr ""
2295
1542 #: rhodecode/templates/files/files_source.html:12
2296 #: rhodecode/templates/files/files_source.html:12
1543 msgid "show annotation"
2297 msgid "show annotation"
1544 msgstr ""
2298 msgstr ""
1545
2299
2300 #: rhodecode/templates/files/files_source.html:153
2301 msgid "Selection link"
2302 msgstr ""
2303
2304 #: rhodecode/templates/followers/followers.html:13
2305 msgid "followers"
2306 msgstr ""
2307
2308 #: rhodecode/templates/followers/followers_data.html:12
2309 msgid "Started following"
2310 msgstr ""
2311
2312 #: rhodecode/templates/forks/forks.html:13
2313 msgid "forks"
2314 msgstr ""
2315
2316 #: rhodecode/templates/forks/forks_data.html:17
2317 msgid "forked"
2318 msgstr ""
2319
2320 #: rhodecode/templates/forks/forks_data.html:34
2321 msgid "There are no forks yet"
2322 msgstr ""
2323
2324 #: rhodecode/templates/journal/journal.html:34
2325 msgid "Following"
2326 msgstr ""
2327
2328 #: rhodecode/templates/journal/journal.html:41
2329 msgid "following user"
2330 msgstr ""
2331
2332 #: rhodecode/templates/journal/journal.html:41
2333 msgid "user"
2334 msgstr ""
2335
2336 #: rhodecode/templates/journal/journal.html:65
2337 msgid "You are not following any users or repositories"
2338 msgstr ""
2339
2340 #: rhodecode/templates/journal/journal_data.html:46
2341 msgid "No entries yet"
2342 msgstr ""
2343
2344 #: rhodecode/templates/journal/public_journal.html:17
2345 msgid "Public Journal"
2346 msgstr ""
2347
1546 #: rhodecode/templates/search/search.html:7
2348 #: rhodecode/templates/search/search.html:7
1547 #: rhodecode/templates/search/search.html:26
2349 #: rhodecode/templates/search/search.html:26
1548 msgid "in repository: "
2350 msgid "in repository: "
@@ -1562,7 +2364,7 b' msgid "Search in"'
1562 msgstr ""
2364 msgstr ""
1563
2365
1564 #: rhodecode/templates/search/search.html:57
2366 #: rhodecode/templates/search/search.html:57
1565 msgid "Source codes"
2367 msgid "File contents"
1566 msgstr ""
2368 msgstr ""
1567
2369
1568 #: rhodecode/templates/search/search.html:59
2370 #: rhodecode/templates/search/search.html:59
@@ -1578,12 +2380,16 b' msgstr ""'
1578 msgid "Fork"
2380 msgid "Fork"
1579 msgstr ""
2381 msgstr ""
1580
2382
1581 #: rhodecode/templates/settings/repo_fork.html:29
2383 #: rhodecode/templates/settings/repo_fork.html:31
1582 msgid "Fork name"
2384 msgid "Fork name"
1583 msgstr ""
2385 msgstr ""
1584
2386
2387 #: rhodecode/templates/settings/repo_fork.html:55
2388 msgid "fork this repository"
2389 msgstr ""
2390
1585 #: rhodecode/templates/shortlog/shortlog.html:5
2391 #: rhodecode/templates/shortlog/shortlog.html:5
1586 #: rhodecode/templates/summary/summary.html:609
2392 #: rhodecode/templates/summary/summary.html:666
1587 msgid "Shortlog"
2393 msgid "Shortlog"
1588 msgstr ""
2394 msgstr ""
1589
2395
@@ -1591,10 +2397,6 b' msgstr ""'
1591 msgid "shortlog"
2397 msgid "shortlog"
1592 msgstr ""
2398 msgstr ""
1593
2399
1594 #: rhodecode/templates/shortlog/shortlog_data.html:5
1595 msgid "commit message"
1596 msgstr ""
1597
1598 #: rhodecode/templates/shortlog/shortlog_data.html:6
2400 #: rhodecode/templates/shortlog/shortlog_data.html:6
1599 msgid "age"
2401 msgid "age"
1600 msgstr ""
2402 msgstr ""
@@ -1603,61 +2405,96 b' msgstr ""'
1603 msgid "summary"
2405 msgid "summary"
1604 msgstr ""
2406 msgstr ""
1605
2407
1606 #: rhodecode/templates/summary/summary.html:103
2408 #: rhodecode/templates/summary/summary.html:79
2409 msgid "remote clone"
2410 msgstr ""
2411
2412 #: rhodecode/templates/summary/summary.html:121
1607 msgid "by"
2413 msgid "by"
1608 msgstr ""
2414 msgstr ""
1609
2415
1610 #: rhodecode/templates/summary/summary.html:110
2416 #: rhodecode/templates/summary/summary.html:128
1611 msgid "Clone url"
2417 msgid "Clone url"
1612 msgstr ""
2418 msgstr ""
1613
2419
1614 #: rhodecode/templates/summary/summary.html:119
2420 #: rhodecode/templates/summary/summary.html:137
1615 msgid "Trending source files"
2421 msgid "Trending source files"
1616 msgstr ""
2422 msgstr ""
1617
2423
1618 #: rhodecode/templates/summary/summary.html:184
2424 #: rhodecode/templates/summary/summary.html:146
1619 #: rhodecode/templates/summary/summary.html:627
1620 #: rhodecode/templates/summary/summary.html:638
1621 msgid "show more"
1622 msgstr ""
1623
1624 #: rhodecode/templates/summary/summary.html:217
1625 msgid "Download"
2425 msgid "Download"
1626 msgstr ""
2426 msgstr ""
1627
2427
1628 #: rhodecode/templates/summary/summary.html:233
2428 #: rhodecode/templates/summary/summary.html:150
2429 msgid "There are no downloads yet"
2430 msgstr ""
2431
2432 #: rhodecode/templates/summary/summary.html:152
2433 msgid "Downloads are disabled for this repository"
2434 msgstr ""
2435
2436 #: rhodecode/templates/summary/summary.html:154
2437 #: rhodecode/templates/summary/summary.html:320
2438 msgid "enable"
2439 msgstr ""
2440
2441 #: rhodecode/templates/summary/summary.html:162
2442 #: rhodecode/templates/summary/summary.html:297
2443 #, python-format
2444 msgid "Download %s as %s"
2445 msgstr ""
2446
2447 #: rhodecode/templates/summary/summary.html:168
2448 msgid "Check this to download archive with subrepos"
2449 msgstr ""
2450
2451 #: rhodecode/templates/summary/summary.html:168
2452 msgid "with subrepos"
2453 msgstr ""
2454
2455 #: rhodecode/templates/summary/summary.html:176
1629 msgid "Feeds"
2456 msgid "Feeds"
1630 msgstr ""
2457 msgstr ""
1631
2458
1632 #: rhodecode/templates/summary/summary.html:247
2459 #: rhodecode/templates/summary/summary.html:257
2460 #: rhodecode/templates/summary/summary.html:684
2461 #: rhodecode/templates/summary/summary.html:695
2462 msgid "show more"
2463 msgstr ""
2464
2465 #: rhodecode/templates/summary/summary.html:312
1633 msgid "Commit activity by day / author"
2466 msgid "Commit activity by day / author"
1634 msgstr ""
2467 msgstr ""
1635
2468
1636 #: rhodecode/templates/summary/summary.html:546
2469 #: rhodecode/templates/summary/summary.html:324
2470 msgid "Loaded in"
2471 msgstr ""
2472
2473 #: rhodecode/templates/summary/summary.html:603
1637 msgid "commits"
2474 msgid "commits"
1638 msgstr ""
2475 msgstr ""
1639
2476
1640 #: rhodecode/templates/summary/summary.html:547
2477 #: rhodecode/templates/summary/summary.html:604
1641 msgid "files added"
2478 msgid "files added"
1642 msgstr ""
2479 msgstr ""
1643
2480
1644 #: rhodecode/templates/summary/summary.html:548
2481 #: rhodecode/templates/summary/summary.html:605
1645 msgid "files changed"
2482 msgid "files changed"
1646 msgstr ""
2483 msgstr ""
1647
2484
1648 #: rhodecode/templates/summary/summary.html:549
2485 #: rhodecode/templates/summary/summary.html:606
1649 msgid "files removed"
2486 msgid "files removed"
1650 msgstr ""
2487 msgstr ""
1651
2488
1652 #: rhodecode/templates/summary/summary.html:553
2489 #: rhodecode/templates/summary/summary.html:610
1653 msgid "file added"
2490 msgid "file added"
1654 msgstr ""
2491 msgstr ""
1655
2492
1656 #: rhodecode/templates/summary/summary.html:554
2493 #: rhodecode/templates/summary/summary.html:611
1657 msgid "file changed"
2494 msgid "file changed"
1658 msgstr ""
2495 msgstr ""
1659
2496
1660 #: rhodecode/templates/summary/summary.html:555
2497 #: rhodecode/templates/summary/summary.html:612
1661 msgid "file removed"
2498 msgid "file removed"
1662 msgstr ""
2499 msgstr ""
1663
2500
@@ -24,6 +24,55 b''
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25
26
26
27 try:
28 import json
29 except ImportError:
30 #python 2.5 compatibility
31 import simplejson as json
32
33
34 def __get_lem():
35 from pygments import lexers
36 from string import lower
37 from collections import defaultdict
38
39 d = defaultdict(lambda: [])
40
41 def __clean(s):
42 s = s.lstrip('*')
43 s = s.lstrip('.')
44
45 if s.find('[') != -1:
46 exts = []
47 start, stop = s.find('['), s.find(']')
48
49 for suffix in s[start + 1:stop]:
50 exts.append(s[:s.find('[')] + suffix)
51 return map(lower, exts)
52 else:
53 return map(lower, [s])
54
55 for lx, t in sorted(lexers.LEXERS.items()):
56 m = map(__clean, t[-2])
57 if m:
58 m = reduce(lambda x, y: x + y, m)
59 for ext in m:
60 desc = lx.replace('Lexer', '')
61 d[ext].append(desc)
62
63 return dict(d)
64
65 # language map is also used by whoosh indexer, which for those specified
66 # extensions will index it's content
67 LANGUAGES_EXTENSIONS_MAP = __get_lem()
68
69 # Additional mappings that are not present in the pygments lexers
70 # NOTE: that this will overide any mappings in LANGUAGES_EXTENSIONS_MAP
71 ADDITIONAL_MAPPINGS = {'xaml': 'XAML'}
72
73 LANGUAGES_EXTENSIONS_MAP.update(ADDITIONAL_MAPPINGS)
74
75
27 def str2bool(_str):
76 def str2bool(_str):
28 """
77 """
29 returs True/False value from given string, it tries to translate the
78 returs True/False value from given string, it tries to translate the
@@ -41,9 +90,57 b' def str2bool(_str):'
41 return _str in ('t', 'true', 'y', 'yes', 'on', '1')
90 return _str in ('t', 'true', 'y', 'yes', 'on', '1')
42
91
43
92
93 def convert_line_endings(line, mode):
94 """
95 Converts a given line "line end" accordingly to given mode
96
97 Available modes are::
98 0 - Unix
99 1 - Mac
100 2 - DOS
101
102 :param line: given line to convert
103 :param mode: mode to convert to
104 :rtype: str
105 :return: converted line according to mode
106 """
107 from string import replace
108
109 if mode == 0:
110 line = replace(line, '\r\n', '\n')
111 line = replace(line, '\r', '\n')
112 elif mode == 1:
113 line = replace(line, '\r\n', '\r')
114 line = replace(line, '\n', '\r')
115 elif mode == 2:
116 import re
117 line = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", line)
118 return line
119
120
121 def detect_mode(line, default):
122 """
123 Detects line break for given line, if line break couldn't be found
124 given default value is returned
125
126 :param line: str line
127 :param default: default
128 :rtype: int
129 :return: value of line end on of 0 - Unix, 1 - Mac, 2 - DOS
130 """
131 if line.endswith('\r\n'):
132 return 2
133 elif line.endswith('\n'):
134 return 0
135 elif line.endswith('\r'):
136 return 1
137 else:
138 return default
139
140
44 def generate_api_key(username, salt=None):
141 def generate_api_key(username, salt=None):
45 """
142 """
46 Generates unique API key for given username,if salt is not given
143 Generates unique API key for given username, if salt is not given
47 it'll be generated from some random string
144 it'll be generated from some random string
48
145
49 :param username: username as string
146 :param username: username as string
@@ -60,22 +157,233 b' def generate_api_key(username, salt=None'
60 return hashlib.sha1(username + salt).hexdigest()
157 return hashlib.sha1(username + salt).hexdigest()
61
158
62
159
63 def safe_unicode(_str, from_encoding='utf8'):
160 def safe_unicode(str_, from_encoding='utf8'):
64 """
161 """
65 safe unicode function. In case of UnicodeDecode error we try to return
162 safe unicode function. Does few trick to turn str_ into unicode
66 unicode with errors replace
163
164 In case of UnicodeDecode error we try to return it with encoding detected
165 by chardet library if it fails fallback to unicode with errors replaced
67
166
68 :param _str: string to decode
167 :param str_: string to decode
69 :rtype: unicode
168 :rtype: unicode
70 :returns: unicode object
169 :returns: unicode object
71 """
170 """
171 if isinstance(str_, unicode):
172 return str_
72
173
73 if isinstance(_str, unicode):
174 try:
74 return _str
175 return unicode(str_)
176 except UnicodeDecodeError:
177 pass
178
179 try:
180 return unicode(str_, from_encoding)
181 except UnicodeDecodeError:
182 pass
183
184 try:
185 import chardet
186 encoding = chardet.detect(str_)['encoding']
187 if encoding is None:
188 raise Exception()
189 return str_.decode(encoding)
190 except (ImportError, UnicodeDecodeError, Exception):
191 return unicode(str_, from_encoding, 'replace')
192
193 def safe_str(unicode_, to_encoding='utf8'):
194 """
195 safe str function. Does few trick to turn unicode_ into string
196
197 In case of UnicodeEncodeError we try to return it with encoding detected
198 by chardet library if it fails fallback to string with errors replaced
199
200 :param unicode_: unicode to encode
201 :rtype: str
202 :returns: str object
203 """
204
205 if isinstance(unicode_, str):
206 return unicode_
75
207
76 try:
208 try:
77 u_str = unicode(_str, from_encoding)
209 return unicode_.encode(to_encoding)
78 except UnicodeDecodeError:
210 except UnicodeEncodeError:
79 u_str = unicode(_str, from_encoding, 'replace')
211 pass
212
213 try:
214 import chardet
215 encoding = chardet.detect(unicode_)['encoding']
216 print encoding
217 if encoding is None:
218 raise UnicodeEncodeError()
219
220 return unicode_.encode(encoding)
221 except (ImportError, UnicodeEncodeError):
222 return unicode_.encode(to_encoding, 'replace')
223
224 return safe_str
225
226
227
228 def engine_from_config(configuration, prefix='sqlalchemy.', **kwargs):
229 """
230 Custom engine_from_config functions that makes sure we use NullPool for
231 file based sqlite databases. This prevents errors on sqlite. This only
232 applies to sqlalchemy versions < 0.7.0
233
234 """
235 import sqlalchemy
236 from sqlalchemy import engine_from_config as efc
237 import logging
238
239 if int(sqlalchemy.__version__.split('.')[1]) < 7:
240
241 # This solution should work for sqlalchemy < 0.7.0, and should use
242 # proxy=TimerProxy() for execution time profiling
243
244 from sqlalchemy.pool import NullPool
245 url = configuration[prefix + 'url']
246
247 if url.startswith('sqlite'):
248 kwargs.update({'poolclass': NullPool})
249 return efc(configuration, prefix, **kwargs)
250 else:
251 import time
252 from sqlalchemy import event
253 from sqlalchemy.engine import Engine
254
255 log = logging.getLogger('sqlalchemy.engine')
256 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = xrange(30, 38)
257 engine = efc(configuration, prefix, **kwargs)
258
259 def color_sql(sql):
260 COLOR_SEQ = "\033[1;%dm"
261 COLOR_SQL = YELLOW
262 normal = '\x1b[0m'
263 return ''.join([COLOR_SEQ % COLOR_SQL, sql, normal])
264
265 if configuration['debug']:
266 #attach events only for debug configuration
267
268 def before_cursor_execute(conn, cursor, statement,
269 parameters, context, executemany):
270 context._query_start_time = time.time()
271 log.info(color_sql(">>>>> STARTING QUERY >>>>>"))
272
273
274 def after_cursor_execute(conn, cursor, statement,
275 parameters, context, executemany):
276 total = time.time() - context._query_start_time
277 log.info(color_sql("<<<<< TOTAL TIME: %f <<<<<" % total))
278
279 event.listen(engine, "before_cursor_execute",
280 before_cursor_execute)
281 event.listen(engine, "after_cursor_execute",
282 after_cursor_execute)
283
284 return engine
285
286
287 def age(curdate):
288 """
289 turns a datetime into an age string.
290
291 :param curdate: datetime object
292 :rtype: unicode
293 :returns: unicode words describing age
294 """
295
296 from datetime import datetime
297 from webhelpers.date import time_ago_in_words
80
298
81 return u_str
299 _ = lambda s:s
300
301 if not curdate:
302 return ''
303
304 agescales = [(_(u"year"), 3600 * 24 * 365),
305 (_(u"month"), 3600 * 24 * 30),
306 (_(u"day"), 3600 * 24),
307 (_(u"hour"), 3600),
308 (_(u"minute"), 60),
309 (_(u"second"), 1), ]
310
311 age = datetime.now() - curdate
312 age_seconds = (age.days * agescales[2][1]) + age.seconds
313 pos = 1
314 for scale in agescales:
315 if scale[1] <= age_seconds:
316 if pos == 6:pos = 5
317 return '%s %s' % (time_ago_in_words(curdate,
318 agescales[pos][0]), _('ago'))
319 pos += 1
320
321 return _(u'just now')
322
323
324 def uri_filter(uri):
325 """
326 Removes user:password from given url string
327
328 :param uri:
329 :rtype: unicode
330 :returns: filtered list of strings
331 """
332 if not uri:
333 return ''
334
335 proto = ''
336
337 for pat in ('https://', 'http://'):
338 if uri.startswith(pat):
339 uri = uri[len(pat):]
340 proto = pat
341 break
342
343 # remove passwords and username
344 uri = uri[uri.find('@') + 1:]
345
346 # get the port
347 cred_pos = uri.find(':')
348 if cred_pos == -1:
349 host, port = uri, None
350 else:
351 host, port = uri[:cred_pos], uri[cred_pos + 1:]
352
353 return filter(None, [proto, host, port])
354
355
356 def credentials_filter(uri):
357 """
358 Returns a url with removed credentials
359
360 :param uri:
361 """
362
363 uri = uri_filter(uri)
364 #check if we have port
365 if len(uri) > 2 and uri[2]:
366 uri[2] = ':' + uri[2]
367
368 return ''.join(uri)
369
370 def get_changeset_safe(repo, rev):
371 """
372 Safe version of get_changeset if this changeset doesn't exists for a
373 repo it returns a Dummy one instead
374
375 :param repo:
376 :param rev:
377 """
378 from vcs.backends.base import BaseRepository
379 from vcs.exceptions import RepositoryError
380 if not isinstance(repo, BaseRepository):
381 raise Exception('You must pass an Repository '
382 'object as first argument got %s', type(repo))
383
384 try:
385 cs = repo.get_changeset(rev)
386 except RepositoryError:
387 from rhodecode.lib.utils import EmptyChangeset
388 cs = EmptyChangeset(requested_revision=rev)
389 return cs No newline at end of file
@@ -2,7 +2,7 b''
2
2
3 from beaker.cache import CacheManager
3 from beaker.cache import CacheManager
4 from beaker.util import parse_cache_config_options
4 from beaker.util import parse_cache_config_options
5 from vcs.utils.lazy import LazyProperty
5
6
6
7 class Globals(object):
7 class Globals(object):
8 """Globals acts as a container for objects available throughout the
8 """Globals acts as a container for objects available throughout the
@@ -18,14 +18,3 b' class Globals(object):'
18 """
18 """
19 self.cache = CacheManager(**parse_cache_config_options(config))
19 self.cache = CacheManager(**parse_cache_config_options(config))
20 self.available_permissions = None # propagated after init_model
20 self.available_permissions = None # propagated after init_model
21 self.baseui = None # propagated after init_model
22
23 @LazyProperty
24 def paths(self):
25 if self.baseui:
26 return self.baseui.configitems('paths')
27
28 @LazyProperty
29 def base_path(self):
30 if self.baseui:
31 return self.paths[0][1]
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: 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: file renamed from rhodecode/templates/journal.html to rhodecode/templates/journal/journal.html
NO CONTENT: file renamed from rhodecode/templates/journal.html to rhodecode/templates/journal/journal.html
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/tests/test_hg_operations.sh to rhodecode/tests/test_hg_operations.py
NO CONTENT: file renamed from rhodecode/tests/test_hg_operations.sh to rhodecode/tests/test_hg_operations.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: 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, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
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