##// END OF EJS Templates
release: Merge default into stable for release preparation
marcink -
r1610:1f5086cf merge stable
parent child Browse files
Show More

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

@@ -0,0 +1,14 b''
1 .. _git-lfs-loc:
2
3 Change the |git| LFS storage Location
4 -------------------------------------
5
6 |RCE| manages |git| LFS files from the following default location
7 :file:`/home/{user}/repos/.cache/lfs_store`. If you wish to change this, use
8 the following steps:
9
10 1. Open :menuselection:`Admin --> Settings --> VCS` as super-admin.
11
12 In section called `Git Settings` you can change where the LFS
13 objects should be stored.
14
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,162 b''
1 |RCE| 4.7.0 |RNS|
2 -----------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2017-04-08
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Git: added support for Git LFS v2 protocol. RhodeCode now supports both
14 Mercurial Largefiles, and Git LFS for storing large binaries.
15 - Largefiles: detect Git LFS or Mercurial Largefiles objects in UI.
16 Those are now available for downloading together with showing their size.
17 - Files: Jupyter notebooks will be now rendered inside the file view. Including
18 MatJax support, and relative images.
19 - Files: render images inside the file view.
20 Instead of displaying binary message, render images icons and gifs
21 inside the file view page.
22 - Files: relative ULR support inside rendered files. It's now possible to
23 write Markup files and relative links will be handled from the RhodeCode
24 instance itself. Adds basic wiki functionality.
25 - Files: allow to show inline pdf in browser using embedded files from source code.
26 - Annotation: added shortcut links to browse the annotation view with previous
27 commits. Allows browsing history for each line from annotation view.
28 - Pull Requests: add explicit close action instead of close with status from
29 status selector. This allows closing of approved or rejected
30 pull requests, without performing a merge action.
31 - Authentication: LDAP now has an option to sync LDA groups using two
32 distinct ways. Either using rfc2307 or rfc2307bis. Increases compatibility
33 with different OpenLDAP and AD servers.
34 - Slack: updated slack integration to use the attachments for nicer formatting.
35 Added number of commits inside the message, changed UI for all Slack events.
36 - Authentication (EE edition only): added repository scope for VCS type auth
37 tokens. Each token can be now bound to particular repository for added security.
38 - User administration: added audit page to allow showing single user actions.
39 - API: implemented `get_user_audit_logs` method to fetch audit logs via API endpoint.
40 - User administration: It's now possible to edit user group membership from
41 user view.
42 - User groups administration: added managing and showing the group
43 synchronization in UI. It's now possible to enable manual group syncing on
44 already existing user groups from external sources such as LDAP/AD.
45 - Repositories: added new strip view allowing removing commits from repositories
46 via web interface for repository administrators.
47 - System Info: added info about workers and worker type.
48 Added more details about CPU. Expose workers of VCSServer in system info data.
49 Detect database migration errors.
50
51
52 General
53 ^^^^^^^
54
55 - Core: ported many views into pure pyramid code with python3.6 compatibility.
56 - Core: removed deprecated Pyro4 backend from Enterprise code.
57 - Maintenance: implemented maintenance view for Mercurial and GIT repositories.
58 For HG it will run `hg verify`, and for GIT a `git gc` command.
59 - Notifications: different approach with fixed/standard container. Floating
60 notifications no longer hide the menu when browsed on top of the page.
61 Also added option to remove single elements from stacked notifications.
62 - VCS server: exception-handling: better handling of remote exception and logging.
63 - VCS server: propagate hooks tracebacks to VCS server for easier debugging.
64 - Core: prevent `httplib3` logs to spam internal RhodeCode logs.
65 It often confuses people looking at those entries, misleading during debug.
66 - Mercurial: allow editing Largefiles store location from web interface.
67 - Git: allow editing GIT LFS store location from web interface.
68 - API: add get_method API call. This allows showing the method and it's parameter
69 from the CLI without reading the documentation.
70 In addition use it's mechanics to propose users other methods with close names
71 if the calling method is not found.
72 - UI: add timezone info into tooltips.
73 - Dependencies: bumped pyramid to 1.7.4
74 - Dependencies: bumped Mercurial version to 4.1.2
75
76
77 Security
78 ^^^^^^^^
79
80 - Hooks: added changes to propagate commit metadata on pre-push.
81 This allows easier implementation of checking hooks such as branch protection.
82 - Hooks: added new pretx hook to allow mercurial checks such as protected
83 branches, or force push.
84 - Auth: give owner of user group proper admin permissions to the user group.
85 This makes the behaviour consistent with repositories and repository groups.
86 And allows delegation of administration of those to other users.
87 - Password reset: strengthen security on password reset logic.
88 Generate token that has special password reset role.
89 Set 10 minute expiration for the token.
90 Add some logic to prevent brute forcing attacks.
91 Use more implicit messages to prevent user email discovery attacks.
92 - Core: added checks for password change for authenticated users in pure
93 Pyramid views. 2 views were still available and not forcing users to change
94 their passwords.
95 - Auth tokens: removed builtin auth-token for users.
96 Builtin token were non-removable, and always generated for new users. This
97 wasn't best practice for security as some users are strictly not allowed to
98 use tokens. From now on new users needs a new token generation in case they
99 want to use token based authentication.
100 - Auth tokens: don't generate builtin token for new users.
101 Also don't change them when password reset is made.
102 - Api: added last-activity into returned data of get_user api.
103
104
105 Performance
106 ^^^^^^^^^^^
107
108 - Mercurial: enabled new `Zstandard` compression algorithm available with
109 Mercurial 4.1.X. This allows faster, more CPU efficient clones when used
110 with new Mercurial clients.
111
112 - Users Admin: moved user admin to pyramid, and made it load users in chunks.
113 Fixed loading data to be lazy fetched, drastically improves speed of user
114 administration page in case of large amount of users.
115
116
117 Fixes
118 ^^^^^
119
120 - Search: goto commit search will now use a safe search option and never
121 throw any exceptions even if search is misconfigured
122 e.g. Elastic Search cluster is down.
123 - Events: fix a case for events called from API that couldn't fetch
124 registered user object.
125 - Comments: unlock submit if we use slash commands to set status.
126 - UI: fixed an issue with date of last change was not displayed correctly.
127 - Emails: added comment types (TODO/NOTE) into emails.
128 - Events: fix wrongly returned author data.
129 - Error middleware: read the instance title from cached object.
130 Reading from settings inside error handler can cause error hiding when
131 error_handler was caused by database errors.
132 - Pull requests: show version age component should use local dates instead of UTC.
133 - Pull requests: lock button when updating reviewers to forbid multi-submit
134 problems. Additionally fixed some small UI issues found in that view.
135 - Pull requests: forbid browsing versions on closed pull request.
136 - Pull requests: allow super-admins to delete pull requests instead of only owners.
137 - Diffs: support mercurial copy operation in diffs details.
138 - SVN: escape special chars to allow interactions with non-standard svn paths.
139 Path with special characters such as '#' will no longer trigger 404 errors.
140 - Data grids: fix some styling and processing text display.
141 - API: use consistent way to extract users, repos, repo groups and user groups
142 by id or name. Makes usage of Number vs String to differentiate if we pick
143 object ID or it's name this will allow editing of objects by either id or
144 it's name, including numeric string names.
145 - API: validate commit_id when using commit_comment API
146 - API: cleanup sessions enforce older_then must be a valid INT.
147
148
149 Upgrade notes
150 ^^^^^^^^^^^^^
151
152 - Auth-tokens: a builtin token will be migrated for all users into a custom
153 external token. We advise to inform users that the current builtin tokens
154 will now show as external ones. Builtin tokens were removed to allow expiring
155 ,or removing them. It's now possible to create users without any tokens.
156
157 From now on new users needs a new token generation in case they want to use
158 token based authentication.
159
160 - Hooks: we added via migration a pre transaction hook for Mercurial. If you're
161 using a custom code inside pre-push function of rcextensions make sure it
162 will not block your pushes.
@@ -0,0 +1,93 b''
1 .. _git-lfs-files:
2
3 |git| LFS Extension
4 ===================
5
6
7 Git Large File Storage (or LFS) is a new, open-source extension to Git that
8 aims to improve handling of large files. It does this by replacing large files
9 in your repository—such as graphics and videos—with simple text pointers.
10 |RC| Server includes an embedded LFS object store server, allowing storage of
11 large files without the need for an external object store.
12 Git LFS is disabled by default, globally, and for each individual repository.
13
14 .. note::
15
16 |RC| implements V2 API of Git LFS. Please make sure your git client is
17 using the latest version (2.0.X recommended) to leverage full feature set
18 of the V2 API.
19
20
21
22 Enabling Git LFS
23 ++++++++++++++++
24
25 Git LFS is disabled by default within |RC| Server.
26
27 To enable Git LFS Globally:
28
29 - Go to :menuselection:`Admin --> Settings --> VCS`
30
31 - Scroll down into `Git settings`
32
33 - Tick `Enable lfs extension`
34
35 - Save your settings.
36
37 Those settings apply globally to each repository that inherits from the defaults
38 You can leave `lfs extension` disabled globally, and only enable it per
39 repository that would use the lfs.
40
41
42 .. note::
43
44 You might want to adjust the global storage location at that point, however
45 we recommend leaving the default one created.
46
47
48 Installing and using the Git LFS command line client
49 ++++++++++++++++++++++++++++++++++++++++++++++++++++
50
51 Git LFS aims to integrate with the standard Git workflow as seamlessly
52 as possible. To push your first Git LFS files to an existing repository
53 Download and install the git-lfs command line client
54 Install the Git LFS filters::
55
56 git lfs install
57
58 This adds the following lines to the .gitconfig file located in your home directory::
59
60 [filter "lfs"]
61 clean = git-lfs clean %f
62 smudge = git-lfs smudge %f
63 required = true
64
65 The above change applies globally, so it is not necessary to run this for
66 each repository you work with. Choose the file types you would like LFS to
67 handle by executing the git lfs track command. The git lfs track command
68 creates or updates the .gitattributes file in your repository.
69 Change to your cloned repository, then execute git add to ensure updates
70 to the .gitattributes are later committed::
71
72 git lfs track "*.jpg"
73 git add .gitattributes
74
75 Add, commit, and push your changes as you normally would::
76
77 git add image.jpg
78 git commit -m "Added an image"
79 git push
80
81 When pushed, the Git tree updates to include a pointer to the file actual
82 file content. This pointer will include the SHA256 hash of the object and its
83 size in bytes. For example::
84
85 oid sha256:4fa32d6f9b1461c4a53618a47324ee43e36ce7ceaea2ad440cc811a7e6881be1
86 size 2580390
87
88
89 The object itself will be uploaded to a separate location via the Git LFS Batch API.
90 The transfer is validated and authorized by |RC| server itself.
91
92 If give repository has Git LFS disabled, a proper message will be sent back to
93 the client and upload of LFS objects will be forbidden.
@@ -0,0 +1,12 b''
1 diff -rup celery-2.2.10-orig/setup.py celery-2.2.10/setup.py
2 --- celery-2.2.10-orig/setup.py 2017-02-25 15:30:34.000000000 +0100
3 +++ celery-2.2.10/setup.py 2017-02-25 15:30:34.000000000 +0100
4 @@ -48,7 +48,7 @@ try:
5 except ImportError:
6 install_requires.append("importlib")
7 install_requires.extend([
8 - "python-dateutil>=1.5.0,<2.0.0",
9 + "python-dateutil>=1.5.0,<2.2.0",
10 "anyjson>=0.3.1",
11 "kombu>=1.1.2,<2.0.0",
12 "pyparsing>=1.5.0,<2.0.0",
@@ -0,0 +1,58 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21
22 import pytest
23
24 from rhodecode.api.tests.utils import build_data, api_call, assert_ok
25
26
27 @pytest.mark.usefixtures("testuser_api", "app")
28 class TestGetMethod(object):
29 def test_get_methods_no_matches(self):
30 id_, params = build_data(self.apikey, 'get_method', pattern='hello')
31 response = api_call(self.app, params)
32
33 expected = []
34 assert_ok(id_, expected, given=response.body)
35
36 def test_get_methods(self):
37 id_, params = build_data(self.apikey, 'get_method', pattern='*comment*')
38 response = api_call(self.app, params)
39
40 expected = ['changeset_comment', 'comment_pull_request',
41 'comment_commit']
42 assert_ok(id_, expected, given=response.body)
43
44 def test_get_methods_on_single_match(self):
45 id_, params = build_data(self.apikey, 'get_method', pattern='*comment_commit*')
46 response = api_call(self.app, params)
47
48 expected = ['comment_commit',
49 {'apiuser': '<RequiredType>',
50 'comment_type': "<Optional:u'note'>",
51 'commit_id': '<RequiredType>',
52 'message': '<RequiredType>',
53 'repoid': '<RequiredType>',
54 'request': '<RequiredType>',
55 'resolves_comment_id': '<Optional:None>',
56 'status': '<Optional:None>',
57 'userid': '<Optional:<OptionalAttr:apiuser>>'}]
58 assert_ok(id_, expected, given=response.body)
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
@@ -0,0 +1,163 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import time
22 import logging
23 from pylons import tmpl_context as c
24 from pyramid.httpexceptions import HTTPFound
25
26 from rhodecode.lib import helpers as h
27 from rhodecode.lib.utils2 import StrictAttributeDict, safe_int
28 from rhodecode.model import repo
29 from rhodecode.model.db import User
30 from rhodecode.model.scm import ScmModel
31
32 log = logging.getLogger(__name__)
33
34
35 ADMIN_PREFIX = '/_admin'
36 STATIC_FILE_PREFIX = '/_static'
37
38
39 class TemplateArgs(StrictAttributeDict):
40 pass
41
42
43 class BaseAppView(object):
44
45 def __init__(self, context, request):
46 self.request = request
47 self.context = context
48 self.session = request.session
49 self._rhodecode_user = request.user # auth user
50 self._rhodecode_db_user = self._rhodecode_user.get_instance()
51 self._maybe_needs_password_change(
52 request.matched_route.name, self._rhodecode_db_user)
53
54 def _maybe_needs_password_change(self, view_name, user_obj):
55 log.debug('Checking if user %s needs password change on view %s',
56 user_obj, view_name)
57 skip_user_views = [
58 'logout', 'login',
59 'my_account_password', 'my_account_password_update'
60 ]
61
62 if not user_obj:
63 return
64
65 if user_obj.username == User.DEFAULT_USER:
66 return
67
68 now = time.time()
69 should_change = user_obj.user_data.get('force_password_change')
70 change_after = safe_int(should_change) or 0
71 if should_change and now > change_after:
72 log.debug('User %s requires password change', user_obj)
73 h.flash('You are required to change your password', 'warning',
74 ignore_duplicate=True)
75
76 if view_name not in skip_user_views:
77 raise HTTPFound(
78 self.request.route_path('my_account_password'))
79
80 def _get_local_tmpl_context(self):
81 c = TemplateArgs()
82 c.auth_user = self.request.user
83 return c
84
85 def _register_global_c(self, tmpl_args):
86 """
87 Registers attributes to pylons global `c`
88 """
89 # TODO(marcink): remove once pyramid migration is finished
90 for k, v in tmpl_args.items():
91 setattr(c, k, v)
92
93 def _get_template_context(self, tmpl_args):
94 self._register_global_c(tmpl_args)
95
96 local_tmpl_args = {
97 'defaults': {},
98 'errors': {},
99 }
100 local_tmpl_args.update(tmpl_args)
101 return local_tmpl_args
102
103 def load_default_context(self):
104 """
105 example:
106
107 def load_default_context(self):
108 c = self._get_local_tmpl_context()
109 c.custom_var = 'foobar'
110 self._register_global_c(c)
111 return c
112 """
113 raise NotImplementedError('Needs implementation in view class')
114
115
116 class RepoAppView(BaseAppView):
117
118 def __init__(self, context, request):
119 super(RepoAppView, self).__init__(context, request)
120 self.db_repo = request.db_repo
121 self.db_repo_name = self.db_repo.repo_name
122 self.db_repo_pull_requests = ScmModel().get_pull_requests(self.db_repo)
123
124 def _get_local_tmpl_context(self):
125 c = super(RepoAppView, self)._get_local_tmpl_context()
126 # register common vars for this type of view
127 c.rhodecode_db_repo = self.db_repo
128 c.repo_name = self.db_repo_name
129 c.repository_pull_requests = self.db_repo_pull_requests
130 return c
131
132
133 class RepoRoutePredicate(object):
134 def __init__(self, val, config):
135 self.val = val
136
137 def text(self):
138 return 'repo_route = %s' % self.val
139
140 phash = text
141
142 def __call__(self, info, request):
143 repo_name = info['match']['repo_name']
144 repo_model = repo.RepoModel()
145 by_name_match = repo_model.get_by_repo_name(repo_name, cache=True)
146 # if we match quickly from database, short circuit the operation,
147 # and validate repo based on the type.
148 if by_name_match:
149 # register this as request object we can re-use later
150 request.db_repo = by_name_match
151 return True
152
153 by_id_match = repo_model.get_repo_by_id(repo_name)
154 if by_id_match:
155 request.db_repo = by_id_match
156 return True
157
158 return False
159
160
161 def includeme(config):
162 config.add_route_predicate(
163 'repo_route', RepoRoutePredicate)
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
@@ -0,0 +1,142 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import pytest
22
23 from rhodecode.model.db import User, UserApiKeys
24
25 from rhodecode.tests import (
26 TestController, TEST_USER_REGULAR_LOGIN, assert_session_flash)
27 from rhodecode.tests.fixture import Fixture
28
29 fixture = Fixture()
30
31
32 def route_path(name, params=None, **kwargs):
33 import urllib
34 from rhodecode.apps._base import ADMIN_PREFIX
35
36 base_url = {
37 'users':
38 ADMIN_PREFIX + '/users',
39 'users_data':
40 ADMIN_PREFIX + '/users_data',
41 'edit_user_auth_tokens':
42 ADMIN_PREFIX + '/users/{user_id}/edit/auth_tokens',
43 'edit_user_auth_tokens_add':
44 ADMIN_PREFIX + '/users/{user_id}/edit/auth_tokens/new',
45 'edit_user_auth_tokens_delete':
46 ADMIN_PREFIX + '/users/{user_id}/edit/auth_tokens/delete',
47 }[name].format(**kwargs)
48
49 if params:
50 base_url = '{}?{}'.format(base_url, urllib.urlencode(params))
51 return base_url
52
53
54 class TestAdminUsersView(TestController):
55
56 def test_show_users(self):
57 self.log_user()
58 self.app.get(route_path('users'))
59
60 def test_show_users_data(self, xhr_header):
61 self.log_user()
62 response = self.app.get(route_path(
63 'users_data'), extra_environ=xhr_header)
64
65 all_users = User.query().filter(
66 User.username != User.DEFAULT_USER).count()
67 assert response.json['recordsTotal'] == all_users
68
69 def test_show_users_data_filtered(self, xhr_header):
70 self.log_user()
71 response = self.app.get(route_path(
72 'users_data', params={'search[value]': 'empty_search'}),
73 extra_environ=xhr_header)
74
75 all_users = User.query().filter(
76 User.username != User.DEFAULT_USER).count()
77 assert response.json['recordsTotal'] == all_users
78 assert response.json['recordsFiltered'] == 0
79
80 def test_auth_tokens_default_user(self):
81 self.log_user()
82 user = User.get_default_user()
83 response = self.app.get(
84 route_path('edit_user_auth_tokens', user_id=user.user_id),
85 status=302)
86
87 def test_auth_tokens(self):
88 self.log_user()
89
90 user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
91 response = self.app.get(
92 route_path('edit_user_auth_tokens', user_id=user.user_id))
93 for token in user.auth_tokens:
94 response.mustcontain(token)
95 response.mustcontain('never')
96
97 @pytest.mark.parametrize("desc, lifetime", [
98 ('forever', -1),
99 ('5mins', 60*5),
100 ('30days', 60*60*24*30),
101 ])
102 def test_add_auth_token(self, desc, lifetime, user_util):
103 self.log_user()
104 user = user_util.create_user()
105 user_id = user.user_id
106
107 response = self.app.post(
108 route_path('edit_user_auth_tokens_add', user_id=user_id),
109 {'description': desc, 'lifetime': lifetime,
110 'csrf_token': self.csrf_token})
111 assert_session_flash(response, 'Auth token successfully created')
112
113 response = response.follow()
114 user = User.get(user_id)
115 for auth_token in user.auth_tokens:
116 response.mustcontain(auth_token)
117
118 def test_delete_auth_token(self, user_util):
119 self.log_user()
120 user = user_util.create_user()
121 user_id = user.user_id
122 keys = user.extra_auth_tokens
123 assert 2 == len(keys)
124
125 response = self.app.post(
126 route_path('edit_user_auth_tokens_add', user_id=user_id),
127 {'description': 'desc', 'lifetime': -1,
128 'csrf_token': self.csrf_token})
129 assert_session_flash(response, 'Auth token successfully created')
130 response.follow()
131
132 # now delete our key
133 keys = UserApiKeys.query().filter(UserApiKeys.user_id == user_id).all()
134 assert 3 == len(keys)
135
136 response = self.app.post(
137 route_path('edit_user_auth_tokens_delete', user_id=user_id),
138 {'del_auth_token': keys[0].api_key, 'csrf_token': self.csrf_token})
139
140 assert_session_flash(response, 'Auth token successfully deleted')
141 keys = UserApiKeys.query().filter(UserApiKeys.user_id == user_id).all()
142 assert 2 == len(keys)
@@ -0,0 +1,317 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import logging
22
23 from pyramid.httpexceptions import HTTPFound
24 from pyramid.view import view_config
25
26 from rhodecode.lib.helpers import Page
27 from rhodecode_tools.lib.ext_json import json
28
29 from rhodecode.apps._base import BaseAppView
30 from rhodecode.lib.auth import (
31 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
32 from rhodecode.lib import helpers as h
33 from rhodecode.lib.utils import PartialRenderer
34 from rhodecode.lib.utils2 import safe_int, safe_unicode
35 from rhodecode.model.auth_token import AuthTokenModel
36 from rhodecode.model.user import UserModel
37 from rhodecode.model.user_group import UserGroupModel
38 from rhodecode.model.db import User, or_
39 from rhodecode.model.meta import Session
40
41 log = logging.getLogger(__name__)
42
43
44 class AdminUsersView(BaseAppView):
45 ALLOW_SCOPED_TOKENS = False
46 """
47 This view has alternative version inside EE, if modified please take a look
48 in there as well.
49 """
50
51 def load_default_context(self):
52 c = self._get_local_tmpl_context()
53 c.allow_scoped_tokens = self.ALLOW_SCOPED_TOKENS
54 self._register_global_c(c)
55 return c
56
57 def _redirect_for_default_user(self, username):
58 _ = self.request.translate
59 if username == User.DEFAULT_USER:
60 h.flash(_("You can't edit this user"), category='warning')
61 # TODO(marcink): redirect to 'users' admin panel once this
62 # is a pyramid view
63 raise HTTPFound('/')
64
65 def _extract_ordering(self, request):
66 column_index = safe_int(request.GET.get('order[0][column]'))
67 order_dir = request.GET.get(
68 'order[0][dir]', 'desc')
69 order_by = request.GET.get(
70 'columns[%s][data][sort]' % column_index, 'name_raw')
71
72 # translate datatable to DB columns
73 order_by = {
74 'first_name': 'name',
75 'last_name': 'lastname',
76 }.get(order_by) or order_by
77
78 search_q = request.GET.get('search[value]')
79 return search_q, order_by, order_dir
80
81 def _extract_chunk(self, request):
82 start = safe_int(request.GET.get('start'), 0)
83 length = safe_int(request.GET.get('length'), 25)
84 draw = safe_int(request.GET.get('draw'))
85 return draw, start, length
86
87 @HasPermissionAllDecorator('hg.admin')
88 @view_config(
89 route_name='users', request_method='GET',
90 renderer='rhodecode:templates/admin/users/users.mako')
91 def users_list(self):
92 c = self.load_default_context()
93 return self._get_template_context(c)
94
95 @HasPermissionAllDecorator('hg.admin')
96 @view_config(
97 # renderer defined below
98 route_name='users_data', request_method='GET', renderer='json',
99 xhr=True)
100 def users_list_data(self):
101 draw, start, limit = self._extract_chunk(self.request)
102 search_q, order_by, order_dir = self._extract_ordering(self.request)
103
104 _render = PartialRenderer('data_table/_dt_elements.mako')
105
106 def user_actions(user_id, username):
107 return _render("user_actions", user_id, username)
108
109 users_data_total_count = User.query()\
110 .filter(User.username != User.DEFAULT_USER) \
111 .count()
112
113 # json generate
114 base_q = User.query().filter(User.username != User.DEFAULT_USER)
115
116 if search_q:
117 like_expression = u'%{}%'.format(safe_unicode(search_q))
118 base_q = base_q.filter(or_(
119 User.username.ilike(like_expression),
120 User._email.ilike(like_expression),
121 User.name.ilike(like_expression),
122 User.lastname.ilike(like_expression),
123 ))
124
125 users_data_total_filtered_count = base_q.count()
126
127 sort_col = getattr(User, order_by, None)
128 if sort_col and order_dir == 'asc':
129 base_q = base_q.order_by(sort_col.asc().nullslast())
130 elif sort_col:
131 base_q = base_q.order_by(sort_col.desc().nullslast())
132
133 base_q = base_q.offset(start).limit(limit)
134 users_list = base_q.all()
135
136 users_data = []
137 for user in users_list:
138 users_data.append({
139 "username": h.gravatar_with_user(user.username),
140 "email": user.email,
141 "first_name": h.escape(user.name),
142 "last_name": h.escape(user.lastname),
143 "last_login": h.format_date(user.last_login),
144 "last_activity": h.format_date(user.last_activity),
145 "active": h.bool2icon(user.active),
146 "active_raw": user.active,
147 "admin": h.bool2icon(user.admin),
148 "extern_type": user.extern_type,
149 "extern_name": user.extern_name,
150 "action": user_actions(user.user_id, user.username),
151 })
152
153 data = ({
154 'draw': draw,
155 'data': users_data,
156 'recordsTotal': users_data_total_count,
157 'recordsFiltered': users_data_total_filtered_count,
158 })
159
160 return data
161
162 @LoginRequired()
163 @HasPermissionAllDecorator('hg.admin')
164 @view_config(
165 route_name='edit_user_auth_tokens', request_method='GET',
166 renderer='rhodecode:templates/admin/users/user_edit.mako')
167 def auth_tokens(self):
168 _ = self.request.translate
169 c = self.load_default_context()
170
171 user_id = self.request.matchdict.get('user_id')
172 c.user = User.get_or_404(user_id, pyramid_exc=True)
173 self._redirect_for_default_user(c.user.username)
174
175 c.active = 'auth_tokens'
176
177 c.lifetime_values = [
178 (str(-1), _('forever')),
179 (str(5), _('5 minutes')),
180 (str(60), _('1 hour')),
181 (str(60 * 24), _('1 day')),
182 (str(60 * 24 * 30), _('1 month')),
183 ]
184 c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
185 c.role_values = [
186 (x, AuthTokenModel.cls._get_role_name(x))
187 for x in AuthTokenModel.cls.ROLES]
188 c.role_options = [(c.role_values, _("Role"))]
189 c.user_auth_tokens = AuthTokenModel().get_auth_tokens(
190 c.user.user_id, show_expired=True)
191 return self._get_template_context(c)
192
193 def maybe_attach_token_scope(self, token):
194 # implemented in EE edition
195 pass
196
197 @LoginRequired()
198 @HasPermissionAllDecorator('hg.admin')
199 @CSRFRequired()
200 @view_config(
201 route_name='edit_user_auth_tokens_add', request_method='POST')
202 def auth_tokens_add(self):
203 _ = self.request.translate
204 c = self.load_default_context()
205
206 user_id = self.request.matchdict.get('user_id')
207 c.user = User.get_or_404(user_id, pyramid_exc=True)
208 self._redirect_for_default_user(c.user.username)
209
210 lifetime = safe_int(self.request.POST.get('lifetime'), -1)
211 description = self.request.POST.get('description')
212 role = self.request.POST.get('role')
213
214 token = AuthTokenModel().create(
215 c.user.user_id, description, lifetime, role)
216 self.maybe_attach_token_scope(token)
217 Session().commit()
218
219 h.flash(_("Auth token successfully created"), category='success')
220 return HTTPFound(h.route_path('edit_user_auth_tokens', user_id=user_id))
221
222 @LoginRequired()
223 @HasPermissionAllDecorator('hg.admin')
224 @CSRFRequired()
225 @view_config(
226 route_name='edit_user_auth_tokens_delete', request_method='POST')
227 def auth_tokens_delete(self):
228 _ = self.request.translate
229 c = self.load_default_context()
230
231 user_id = self.request.matchdict.get('user_id')
232 c.user = User.get_or_404(user_id, pyramid_exc=True)
233 self._redirect_for_default_user(c.user.username)
234
235 del_auth_token = self.request.POST.get('del_auth_token')
236
237 if del_auth_token:
238 AuthTokenModel().delete(del_auth_token, c.user.user_id)
239 Session().commit()
240 h.flash(_("Auth token successfully deleted"), category='success')
241
242 return HTTPFound(h.route_path('edit_user_auth_tokens', user_id=user_id))
243
244 @LoginRequired()
245 @HasPermissionAllDecorator('hg.admin')
246 @view_config(
247 route_name='edit_user_groups_management', request_method='GET',
248 renderer='rhodecode:templates/admin/users/user_edit.mako')
249 def groups_management(self):
250 c = self.load_default_context()
251
252 user_id = self.request.matchdict.get('user_id')
253 c.user = User.get_or_404(user_id, pyramid_exc=True)
254 c.data = c.user.group_member
255 self._redirect_for_default_user(c.user.username)
256 groups = [UserGroupModel.get_user_groups_as_dict(group.users_group) for group in c.user.group_member]
257 c.groups = json.dumps(groups)
258 c.active = 'groups'
259
260 return self._get_template_context(c)
261
262 @LoginRequired()
263 @HasPermissionAllDecorator('hg.admin')
264 @view_config(
265 route_name='edit_user_groups_management_updates', request_method='POST')
266 def groups_management_updates(self):
267 _ = self.request.translate
268 c = self.load_default_context()
269
270 user_id = self.request.matchdict.get('user_id')
271 c.user = User.get_or_404(user_id, pyramid_exc=True)
272 self._redirect_for_default_user(c.user.username)
273
274 users_groups = set(self.request.POST.getall('users_group_id'))
275 users_groups_model = []
276
277 for ugid in users_groups:
278 users_groups_model.append(UserGroupModel().get_group(safe_int(ugid)))
279 user_group_model = UserGroupModel()
280 user_group_model.change_groups(c.user, users_groups_model)
281
282 Session().commit()
283 c.active = 'user_groups_management'
284 h.flash(_("Groups successfully changed"), category='success')
285
286 return HTTPFound(h.route_path(
287 'edit_user_groups_management', user_id=user_id))
288
289 @LoginRequired()
290 @HasPermissionAllDecorator('hg.admin')
291 @view_config(
292 route_name='edit_user_audit_logs', request_method='GET',
293 renderer='rhodecode:templates/admin/users/user_edit.mako')
294 def user_audit_logs(self):
295 _ = self.request.translate
296 c = self.load_default_context()
297
298 user_id = self.request.matchdict.get('user_id')
299 c.user = User.get_or_404(user_id, pyramid_exc=True)
300 self._redirect_for_default_user(c.user.username)
301 c.active = 'audit'
302
303 p = safe_int(self.request.GET.get('page', 1), 1)
304
305 filter_term = self.request.GET.get('filter')
306 c.user_log = UserModel().get_user_log(c.user, filter_term)
307
308 def url_generator(**kw):
309 if filter_term:
310 kw['filter'] = filter_term
311 return self.request.current_route_path(_query=kw)
312
313 c.user_log = Page(c.user_log, page=p, items_per_page=10,
314 url=url_generator)
315 c.filter_term = filter_term
316 return self._get_template_context(c)
317
@@ -0,0 +1,52 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21
22 from rhodecode.apps._base import ADMIN_PREFIX
23
24
25 def includeme(config):
26
27 config.add_route(
28 name='my_account_profile',
29 pattern=ADMIN_PREFIX + '/my_account/profile')
30
31 config.add_route(
32 name='my_account_password',
33 pattern=ADMIN_PREFIX + '/my_account/password')
34
35 config.add_route(
36 name='my_account_password_update',
37 pattern=ADMIN_PREFIX + '/my_account/password')
38
39 config.add_route(
40 name='my_account_auth_tokens',
41 pattern=ADMIN_PREFIX + '/my_account/auth_tokens')
42 config.add_route(
43 name='my_account_auth_tokens_add',
44 pattern=ADMIN_PREFIX + '/my_account/auth_tokens/new',
45 )
46 config.add_route(
47 name='my_account_auth_tokens_delete',
48 pattern=ADMIN_PREFIX + '/my_account/auth_tokens/delete',
49 )
50
51 # Scan module for configuration decorators.
52 config.scan()
@@ -0,0 +1,19 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
@@ -0,0 +1,111 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import pytest
22
23 from rhodecode.apps._base import ADMIN_PREFIX
24 from rhodecode.model.db import User
25 from rhodecode.tests import (
26 TestController, TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS,
27 TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS, assert_session_flash)
28 from rhodecode.tests.fixture import Fixture
29 from rhodecode.tests.utils import AssertResponse
30
31 fixture = Fixture()
32
33
34 def route_path(name, **kwargs):
35 return {
36 'my_account_auth_tokens':
37 ADMIN_PREFIX + '/my_account/auth_tokens',
38 'my_account_auth_tokens_add':
39 ADMIN_PREFIX + '/my_account/auth_tokens/new',
40 'my_account_auth_tokens_delete':
41 ADMIN_PREFIX + '/my_account/auth_tokens/delete',
42 }[name].format(**kwargs)
43
44
45 class TestMyAccountAuthTokens(TestController):
46
47 def test_my_account_auth_tokens(self):
48 usr = self.log_user('test_regular2', 'test12')
49 user = User.get(usr['user_id'])
50 response = self.app.get(route_path('my_account_auth_tokens'))
51 for token in user.auth_tokens:
52 response.mustcontain(token)
53 response.mustcontain('never')
54
55 def test_my_account_add_auth_tokens_wrong_csrf(self, user_util):
56 user = user_util.create_user(password='qweqwe')
57 self.log_user(user.username, 'qweqwe')
58
59 self.app.post(
60 route_path('my_account_auth_tokens_add'),
61 {'description': 'desc', 'lifetime': -1}, status=403)
62
63 @pytest.mark.parametrize("desc, lifetime", [
64 ('forever', -1),
65 ('5mins', 60*5),
66 ('30days', 60*60*24*30),
67 ])
68 def test_my_account_add_auth_tokens(self, desc, lifetime, user_util):
69 user = user_util.create_user(password='qweqwe')
70 user_id = user.user_id
71 self.log_user(user.username, 'qweqwe')
72
73 response = self.app.post(
74 route_path('my_account_auth_tokens_add'),
75 {'description': desc, 'lifetime': lifetime,
76 'csrf_token': self.csrf_token})
77 assert_session_flash(response, 'Auth token successfully created')
78
79 response = response.follow()
80 user = User.get(user_id)
81 for auth_token in user.auth_tokens:
82 response.mustcontain(auth_token)
83
84 def test_my_account_delete_auth_token(self, user_util):
85 user = user_util.create_user(password='qweqwe')
86 user_id = user.user_id
87 self.log_user(user.username, 'qweqwe')
88
89 user = User.get(user_id)
90 keys = user.extra_auth_tokens
91 assert 2 == len(keys)
92
93 response = self.app.post(
94 route_path('my_account_auth_tokens_add'),
95 {'description': 'desc', 'lifetime': -1,
96 'csrf_token': self.csrf_token})
97 assert_session_flash(response, 'Auth token successfully created')
98 response.follow()
99
100 user = User.get(user_id)
101 keys = user.extra_auth_tokens
102 assert 3 == len(keys)
103
104 response = self.app.post(
105 route_path('my_account_auth_tokens_delete'),
106 {'del_auth_token': keys[0].api_key, 'csrf_token': self.csrf_token})
107 assert_session_flash(response, 'Auth token successfully deleted')
108
109 user = User.get(user_id)
110 keys = user.extra_auth_tokens
111 assert 2 == len(keys)
@@ -0,0 +1,137 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import pytest
22 import mock
23
24 from rhodecode.apps._base import ADMIN_PREFIX
25 from rhodecode.lib import helpers as h
26 from rhodecode.lib.auth import check_password
27 from rhodecode.model.meta import Session
28 from rhodecode.model.user import UserModel
29 from rhodecode.tests import assert_session_flash
30 from rhodecode.tests.fixture import Fixture, TestController, error_function
31
32 fixture = Fixture()
33
34
35 def route_path(name, **kwargs):
36 return {
37 'home': '/',
38 'my_account_password':
39 ADMIN_PREFIX + '/my_account/password',
40 }[name].format(**kwargs)
41
42
43 test_user_1 = 'testme'
44 test_user_1_password = '0jd83nHNS/d23n'
45
46
47 class TestMyAccountPassword(TestController):
48 def test_valid_change_password(self, user_util):
49 new_password = 'my_new_valid_password'
50 user = user_util.create_user(password=test_user_1_password)
51 self.log_user(user.username, test_user_1_password)
52
53 form_data = [
54 ('current_password', test_user_1_password),
55 ('__start__', 'new_password:mapping'),
56 ('new_password', new_password),
57 ('new_password-confirm', new_password),
58 ('__end__', 'new_password:mapping'),
59 ('csrf_token', self.csrf_token),
60 ]
61 response = self.app.post(route_path('my_account_password'), form_data).follow()
62 assert 'Successfully updated password' in response
63
64 # check_password depends on user being in session
65 Session().add(user)
66 try:
67 assert check_password(new_password, user.password)
68 finally:
69 Session().expunge(user)
70
71 @pytest.mark.parametrize('current_pw, new_pw, confirm_pw', [
72 ('', 'abcdef123', 'abcdef123'),
73 ('wrong_pw', 'abcdef123', 'abcdef123'),
74 (test_user_1_password, test_user_1_password, test_user_1_password),
75 (test_user_1_password, '', ''),
76 (test_user_1_password, 'abcdef123', ''),
77 (test_user_1_password, '', 'abcdef123'),
78 (test_user_1_password, 'not_the', 'same_pw'),
79 (test_user_1_password, 'short', 'short'),
80 ])
81 def test_invalid_change_password(self, current_pw, new_pw, confirm_pw,
82 user_util):
83 user = user_util.create_user(password=test_user_1_password)
84 self.log_user(user.username, test_user_1_password)
85
86 form_data = [
87 ('current_password', current_pw),
88 ('__start__', 'new_password:mapping'),
89 ('new_password', new_pw),
90 ('new_password-confirm', confirm_pw),
91 ('__end__', 'new_password:mapping'),
92 ('csrf_token', self.csrf_token),
93 ]
94 response = self.app.post(route_path('my_account_password'), form_data)
95
96 assert_response = response.assert_response()
97 assert assert_response.get_elements('.error-block')
98
99 @mock.patch.object(UserModel, 'update_user', error_function)
100 def test_invalid_change_password_exception(self, user_util):
101 user = user_util.create_user(password=test_user_1_password)
102 self.log_user(user.username, test_user_1_password)
103
104 form_data = [
105 ('current_password', test_user_1_password),
106 ('__start__', 'new_password:mapping'),
107 ('new_password', '123456'),
108 ('new_password-confirm', '123456'),
109 ('__end__', 'new_password:mapping'),
110 ('csrf_token', self.csrf_token),
111 ]
112 response = self.app.post(route_path('my_account_password'), form_data)
113 assert_session_flash(
114 response, 'Error occurred during update of user password')
115
116 def test_password_is_updated_in_session_on_password_change(self, user_util):
117 old_password = 'abcdef123'
118 new_password = 'abcdef124'
119
120 user = user_util.create_user(password=old_password)
121 session = self.log_user(user.username, old_password)
122 old_password_hash = session['password']
123
124 form_data = [
125 ('current_password', old_password),
126 ('__start__', 'new_password:mapping'),
127 ('new_password', new_password),
128 ('new_password-confirm', new_password),
129 ('__end__', 'new_password:mapping'),
130 ('csrf_token', self.csrf_token),
131 ]
132 self.app.post(route_path('my_account_password'), form_data)
133
134 response = self.app.get(route_path('home'))
135 new_password_hash = response.session['rhodecode_user']['password']
136
137 assert old_password_hash != new_password_hash No newline at end of file
@@ -0,0 +1,55 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import pytest
22
23 from rhodecode.apps._base import ADMIN_PREFIX
24 from rhodecode.tests import (
25 TestController, TEST_USER_ADMIN_LOGIN,
26 TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
27 from rhodecode.tests.fixture import Fixture
28
29 fixture = Fixture()
30
31
32 def route_path(name, **kwargs):
33 return {
34 'my_account':
35 ADMIN_PREFIX + '/my_account/profile',
36 }[name].format(**kwargs)
37
38
39 class TestMyAccountProfile(TestController):
40
41 def test_my_account(self):
42 self.log_user()
43 response = self.app.get(route_path('my_account'))
44
45 response.mustcontain(TEST_USER_ADMIN_LOGIN)
46 response.mustcontain('href="/_admin/my_account/edit"')
47 response.mustcontain('Photo')
48
49 def test_my_account_regular_user(self):
50 self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
51 response = self.app.get(route_path('my_account'))
52
53 response.mustcontain(TEST_USER_REGULAR_LOGIN)
54 response.mustcontain('href="/_admin/my_account/edit"')
55 response.mustcontain('Photo')
@@ -0,0 +1,194 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import logging
22
23 from pyramid.httpexceptions import HTTPFound
24 from pyramid.view import view_config
25
26 from rhodecode.apps._base import BaseAppView
27 from rhodecode import forms
28 from rhodecode.lib.auth import LoginRequired, NotAnonymous, CSRFRequired
29 from rhodecode.lib import helpers as h
30 from rhodecode.lib.utils2 import safe_int, md5
31 from rhodecode.model.auth_token import AuthTokenModel
32 from rhodecode.model.meta import Session
33 from rhodecode.model.user import UserModel
34 from rhodecode.model.validation_schema.schemas import user_schema
35
36 log = logging.getLogger(__name__)
37
38
39 class MyAccountView(BaseAppView):
40 ALLOW_SCOPED_TOKENS = False
41 """
42 This view has alternative version inside EE, if modified please take a look
43 in there as well.
44 """
45
46 def load_default_context(self):
47 c = self._get_local_tmpl_context()
48 c.user = c.auth_user.get_instance()
49 c.allow_scoped_tokens = self.ALLOW_SCOPED_TOKENS
50 self._register_global_c(c)
51 return c
52
53 @LoginRequired()
54 @NotAnonymous()
55 @view_config(
56 route_name='my_account_profile', request_method='GET',
57 renderer='rhodecode:templates/admin/my_account/my_account.mako')
58 def my_account_profile(self):
59 c = self.load_default_context()
60 c.active = 'profile'
61 return self._get_template_context(c)
62
63 @LoginRequired()
64 @NotAnonymous()
65 @view_config(
66 route_name='my_account_password', request_method='GET',
67 renderer='rhodecode:templates/admin/my_account/my_account.mako')
68 def my_account_password(self):
69 c = self.load_default_context()
70 c.active = 'password'
71 c.extern_type = c.user.extern_type
72
73 schema = user_schema.ChangePasswordSchema().bind(
74 username=c.user.username)
75
76 form = forms.Form(
77 schema, buttons=(forms.buttons.save, forms.buttons.reset))
78
79 c.form = form
80 return self._get_template_context(c)
81
82 @LoginRequired()
83 @NotAnonymous()
84 @CSRFRequired()
85 @view_config(
86 route_name='my_account_password', request_method='POST',
87 renderer='rhodecode:templates/admin/my_account/my_account.mako')
88 def my_account_password_update(self):
89 _ = self.request.translate
90 c = self.load_default_context()
91 c.active = 'password'
92 c.extern_type = c.user.extern_type
93
94 schema = user_schema.ChangePasswordSchema().bind(
95 username=c.user.username)
96
97 form = forms.Form(
98 schema, buttons=(forms.buttons.save, forms.buttons.reset))
99
100 if c.extern_type != 'rhodecode':
101 raise HTTPFound(self.request.route_path('my_account_password'))
102
103 controls = self.request.POST.items()
104 try:
105 valid_data = form.validate(controls)
106 UserModel().update_user(c.user.user_id, **valid_data)
107 c.user.update_userdata(force_password_change=False)
108 Session().commit()
109 except forms.ValidationFailure as e:
110 c.form = e
111 return self._get_template_context(c)
112
113 except Exception:
114 log.exception("Exception updating password")
115 h.flash(_('Error occurred during update of user password'),
116 category='error')
117 else:
118 instance = c.auth_user.get_instance()
119 self.session.setdefault('rhodecode_user', {}).update(
120 {'password': md5(instance.password)})
121 self.session.save()
122 h.flash(_("Successfully updated password"), category='success')
123
124 raise HTTPFound(self.request.route_path('my_account_password'))
125
126 @LoginRequired()
127 @NotAnonymous()
128 @view_config(
129 route_name='my_account_auth_tokens', request_method='GET',
130 renderer='rhodecode:templates/admin/my_account/my_account.mako')
131 def my_account_auth_tokens(self):
132 _ = self.request.translate
133
134 c = self.load_default_context()
135 c.active = 'auth_tokens'
136
137 c.lifetime_values = [
138 (str(-1), _('forever')),
139 (str(5), _('5 minutes')),
140 (str(60), _('1 hour')),
141 (str(60 * 24), _('1 day')),
142 (str(60 * 24 * 30), _('1 month')),
143 ]
144 c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
145 c.role_values = [
146 (x, AuthTokenModel.cls._get_role_name(x))
147 for x in AuthTokenModel.cls.ROLES]
148 c.role_options = [(c.role_values, _("Role"))]
149 c.user_auth_tokens = AuthTokenModel().get_auth_tokens(
150 c.user.user_id, show_expired=True)
151 return self._get_template_context(c)
152
153 def maybe_attach_token_scope(self, token):
154 # implemented in EE edition
155 pass
156
157 @LoginRequired()
158 @NotAnonymous()
159 @CSRFRequired()
160 @view_config(
161 route_name='my_account_auth_tokens_add', request_method='POST')
162 def my_account_auth_tokens_add(self):
163 _ = self.request.translate
164 c = self.load_default_context()
165
166 lifetime = safe_int(self.request.POST.get('lifetime'), -1)
167 description = self.request.POST.get('description')
168 role = self.request.POST.get('role')
169
170 token = AuthTokenModel().create(
171 c.user.user_id, description, lifetime, role)
172 self.maybe_attach_token_scope(token)
173 Session().commit()
174
175 h.flash(_("Auth token successfully created"), category='success')
176 return HTTPFound(h.route_path('my_account_auth_tokens'))
177
178 @LoginRequired()
179 @NotAnonymous()
180 @CSRFRequired()
181 @view_config(
182 route_name='my_account_auth_tokens_delete', request_method='POST')
183 def my_account_auth_tokens_delete(self):
184 _ = self.request.translate
185 c = self.load_default_context()
186
187 del_auth_token = self.request.POST.get('del_auth_token')
188
189 if del_auth_token:
190 AuthTokenModel().delete(del_auth_token, c.user.user_id)
191 Session().commit()
192 h.flash(_("Auth token successfully deleted"), category='success')
193
194 return HTTPFound(h.route_path('my_account_auth_tokens'))
@@ -0,0 +1,46 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21
22 def includeme(config):
23
24 config.add_route(
25 name='repo_maintenance',
26 pattern='/{repo_name:.*?[^/]}/maintenance', repo_route=True)
27
28 config.add_route(
29 name='repo_maintenance_execute',
30 pattern='/{repo_name:.*?[^/]}/maintenance/execute', repo_route=True)
31
32
33 # Strip
34 config.add_route(
35 name='strip',
36 pattern='/{repo_name:.*?[^/]}/strip', repo_route=True)
37
38 config.add_route(
39 name='strip_check',
40 pattern='/{repo_name:.*?[^/]}/strip_check', repo_route=True)
41
42 config.add_route(
43 name='strip_execute',
44 pattern='/{repo_name:.*?[^/]}/strip_execute', repo_route=True)
45 # Scan module for configuration decorators.
46 config.scan()
@@ -0,0 +1,19 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2011-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
@@ -0,0 +1,70 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2011-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import logging
22
23 from pyramid.view import view_config
24
25 from rhodecode.apps._base import RepoAppView
26 from rhodecode.lib.auth import (LoginRequired, HasRepoPermissionAnyDecorator,
27 NotAnonymous)
28 from rhodecode.lib import repo_maintenance
29
30 log = logging.getLogger(__name__)
31
32
33 class RepoMaintenanceView(RepoAppView):
34 def load_default_context(self):
35 c = self._get_local_tmpl_context()
36
37 # TODO(marcink): remove repo_info and use c.rhodecode_db_repo instead
38 c.repo_info = self.db_repo
39
40 self._register_global_c(c)
41 return c
42
43 @LoginRequired()
44 @NotAnonymous()
45 @HasRepoPermissionAnyDecorator('repository.admin')
46 @view_config(
47 route_name='repo_maintenance', request_method='GET',
48 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
49 def repo_maintenance(self):
50 c = self.load_default_context()
51 c.active = 'maintenance'
52 maintenance = repo_maintenance.RepoMaintenance()
53 c.executable_tasks = maintenance.get_tasks_for_repo(self.db_repo)
54 return self._get_template_context(c)
55
56 @LoginRequired()
57 @NotAnonymous()
58 @HasRepoPermissionAnyDecorator('repository.admin')
59 @view_config(
60 route_name='repo_maintenance_execute', request_method='GET',
61 renderer='json', xhr=True)
62 def repo_maintenance_execute(self):
63 c = self.load_default_context()
64 c.active = 'maintenance'
65 _ = self.request.translate
66
67 maintenance = repo_maintenance.RepoMaintenance()
68 executed_types = maintenance.execute(self.db_repo)
69
70 return executed_types
@@ -0,0 +1,110 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2011-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import logging
22 from pyramid.view import view_config
23
24 from rhodecode.apps._base import RepoAppView
25 from rhodecode.lib.auth import (LoginRequired, HasRepoPermissionAnyDecorator,
26 NotAnonymous)
27
28
29 log = logging.getLogger(__name__)
30
31
32 class StripView(RepoAppView):
33 def load_default_context(self):
34 c = self._get_local_tmpl_context()
35
36 # TODO(marcink): remove repo_info and use c.rhodecode_db_repo instead
37 c.repo_info = self.db_repo
38
39 self._register_global_c(c)
40 return c
41
42 @LoginRequired()
43 @NotAnonymous()
44 @HasRepoPermissionAnyDecorator('repository.admin')
45 @view_config(
46 route_name='strip', request_method='GET',
47 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
48 def strip(self):
49 c = self.load_default_context()
50 c.active = 'strip'
51 c.strip_limit = 10
52
53 return self._get_template_context(c)
54
55 @LoginRequired()
56 @NotAnonymous()
57 @HasRepoPermissionAnyDecorator('repository.admin')
58 @view_config(
59 route_name='strip_check', request_method='POST',
60 renderer='json', xhr=True
61 )
62 def strip_check(self):
63 from rhodecode.lib.vcs.backends.base import EmptyCommit
64 data = {}
65 rp = self.request.POST
66 for i in range(1, 11):
67 chset = 'changeset_id-%d'%(i,)
68 check = rp.get(chset)
69 if check:
70 data[i] = self.db_repo.get_changeset(rp[chset])
71 if isinstance(data[i], EmptyCommit):
72 data[i] = {'rev': None, 'commit': rp[chset]}
73 else:
74 data[i] = {'rev': data[i].raw_id, 'branch': data[i].branch, 'author': data[i].author,
75 'comment': data[i].message}
76 else:
77 break
78 return data
79
80 @LoginRequired()
81 @NotAnonymous()
82 @HasRepoPermissionAnyDecorator('repository.admin')
83 @view_config(
84 route_name='strip_execute', request_method='POST',
85 renderer='json', xhr=True
86 )
87 def strip_execute(self):
88
89 from rhodecode.model.scm import ScmModel
90 from rhodecode.lib.ext_json import json
91
92 c = self.load_default_context()
93 user = self._rhodecode_user
94 rp = self.request.POST
95 data = {}
96 for idx in rp:
97 commit = json.loads(rp[idx])
98 #If someone put two times the same branch
99 if commit['branch'] in data.keys():
100 continue
101 try:
102 ScmModel().strip(repo=c.repo_info,
103 commit_id=commit['rev'], branch=commit['branch'])
104 log.info('Stripped commit %s from repo `%s` by %s' % (commit['rev'], c.repo_info.repo_name, user))
105 data[commit['rev']] = True
106 except Exception, e:
107 data[commit['rev']] = False
108 log.debug('Stripped commit %s from repo `%s` failed by %s, exeption %s' % (commit['rev'],
109 c.repo_info.repo_name, user, e.message))
110 return data
@@ -0,0 +1,28 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21
22 def includeme(config):
23 config.add_route(
24 name='user_profile',
25 pattern='/_profiles/{username}')
26
27 # Scan module for configuration decorators.
28 config.scan()
@@ -0,0 +1,19 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
@@ -0,0 +1,75 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import pytest
22
23 from rhodecode.model.db import User
24 from rhodecode.tests import (
25 TestController, TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS,
26 TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
27 from rhodecode.tests.fixture import Fixture
28 from rhodecode.tests.utils import AssertResponse
29
30 fixture = Fixture()
31
32
33 def route_path(name, **kwargs):
34 return '/_profiles/{username}'.format(**kwargs)
35
36
37 class TestUsersController(TestController):
38
39 def test_user_profile(self, user_util):
40 edit_link_css = '.user-profile .panel-edit'
41 self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
42 user = user_util.create_user(
43 'test-my-user', password='qweqwe', email='testme@rhodecode.org')
44 username = user.username
45
46 response = self.app.get(route_path('user_profile', username=username))
47 response.mustcontain('testme')
48 response.mustcontain('testme@rhodecode.org')
49 assert_response = AssertResponse(response)
50 assert_response.no_element_exists(edit_link_css)
51
52 # edit should be available to superadmin users
53 self.logout_user()
54 self.log_user(TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS)
55 response = self.app.get(route_path('user_profile', username=username))
56 assert_response = AssertResponse(response)
57 assert_response.element_contains(edit_link_css, 'Edit')
58
59 def test_user_profile_not_available(self, user_util):
60 user = user_util.create_user()
61 username = user.username
62
63 # not logged in, redirect
64 self.app.get(route_path('user_profile', username=username), status=302)
65
66 self.log_user()
67 # after log-in show
68 self.app.get(route_path('user_profile', username=username), status=200)
69
70 # default user, not allowed to show it
71 self.app.get(
72 route_path('user_profile', username=User.DEFAULT_USER), status=404)
73
74 # actual 404
75 self.app.get(route_path('user_profile', username='unknown'), status=404)
@@ -0,0 +1,53 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import logging
22
23 from pyramid.httpexceptions import HTTPNotFound
24 from pyramid.view import view_config
25
26 from rhodecode.apps._base import BaseAppView
27 from rhodecode.lib.auth import LoginRequired, NotAnonymous
28
29 from rhodecode.model.db import User
30 from rhodecode.model.user import UserModel
31
32 log = logging.getLogger(__name__)
33
34
35 class UserProfileView(BaseAppView):
36
37 @LoginRequired()
38 @NotAnonymous()
39 @view_config(
40 route_name='user_profile', request_method='GET',
41 renderer='rhodecode:templates/users/user.mako')
42 def login(self):
43 # register local template context
44 c = self._get_local_tmpl_context()
45 c.active = 'user_profile'
46
47 username = self.request.matchdict.get('username')
48
49 c.user = UserModel().get_by_username(username)
50 if not c.user or c.user.username == User.DEFAULT_USER:
51 raise HTTPNotFound()
52
53 return self._get_template_context(c)
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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
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,5 +1,5 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.6.1
2 current_version = 4.7.0
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
@@ -10,6 +10,8 b' include ='
10 omit =
10 omit =
11 rhodecode/lib/vcs/remote/*
11 rhodecode/lib/vcs/remote/*
12 rhodecode/lib/dbmigrate/*
12 rhodecode/lib/dbmigrate/*
13 rhodecode/lib/paster_commands/*
14 rhodecode/tests/*
13
15
14 [report]
16 [report]
15
17
@@ -4,26 +4,21 b' done = false'
4 [task:bump_version]
4 [task:bump_version]
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
8 done = true
9
10 [task:fixes_on_stable]
7 [task:fixes_on_stable]
11 done = true
12
8
13 [task:pip2nix_generated]
9 [task:pip2nix_generated]
14 done = true
15
10
16 [task:changelog_updated]
11 [task:changelog_updated]
17 done = true
18
12
19 [task:generate_api_docs]
13 [task:generate_api_docs]
20 done = true
14
15 [task:updated_translation]
21
16
22 [release]
17 [release]
23 state = prepared
18 state = in_progress
24 version = 4.6.1
19 version = 4.7.0
25
20
26 [task:updated_translation]
21 [task:rc_tools_pinned]
27
22
28 [task:generate_js_routes]
23 [task:generate_js_routes]
29
24
@@ -1,5 +1,5 b''
1 # top level files
1 # top level files
2 include test.ini
2
3 include MANIFEST.in
3 include MANIFEST.in
4 include README.rst
4 include README.rst
5 include CHANGES.rst
5 include CHANGES.rst
@@ -539,18 +539,15 b' vcs.server = localhost:9900'
539
539
540 ## Web server connectivity protocol, responsible for web based VCS operatations
540 ## Web server connectivity protocol, responsible for web based VCS operatations
541 ## Available protocols are:
541 ## Available protocols are:
542 ## `pyro4` - use pyro4 server
543 ## `http` - use http-rpc backend (default)
542 ## `http` - use http-rpc backend (default)
544 vcs.server.protocol = http
543 vcs.server.protocol = http
545
544
546 ## Push/Pull operations protocol, available options are:
545 ## Push/Pull operations protocol, available options are:
547 ## `pyro4` - use pyro4 server
548 ## `http` - use http-rpc backend (default)
546 ## `http` - use http-rpc backend (default)
549 ##
547 ##
550 vcs.scm_app_implementation = http
548 vcs.scm_app_implementation = http
551
549
552 ## Push/Pull operations hooks protocol, available options are:
550 ## Push/Pull operations hooks protocol, available options are:
553 ## `pyro4` - use pyro4 server
554 ## `http` - use http-rpc backend (default)
551 ## `http` - use http-rpc backend (default)
555 vcs.hooks.protocol = http
552 vcs.hooks.protocol = http
556
553
@@ -666,7 +663,7 b' formatter = color_formatter_sql'
666 ################
663 ################
667
664
668 [formatter_generic]
665 [formatter_generic]
669 class = rhodecode.lib.logging_formatter.Pyro4AwareFormatter
666 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
670 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
667 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
671 datefmt = %Y-%m-%d %H:%M:%S
668 datefmt = %Y-%m-%d %H:%M:%S
672
669
@@ -36,7 +36,7 b' tmp_upload_dir = None'
36
36
37 # Custom log format
37 # Custom log format
38 access_log_format = (
38 access_log_format = (
39 '%(t)s GNCRN %(p)-8s %(h)-15s rqt:%(L)s %(s)s %(b)s "%(m)s:%(U)s %(q)s" usr:%(u)s "%(f)s" "%(a)s"')
39 '%(t)s GNCRN %(p)-8s %(h)-15s rqt:%(L)s %(s)s %(b)-6s "%(m)s:%(U)s %(q)s" usr:%(u)s "%(f)s" "%(a)s"')
40
40
41 # self adjust workers based on CPU count
41 # self adjust workers based on CPU count
42 # workers = multiprocessing.cpu_count() * 2 + 1
42 # workers = multiprocessing.cpu_count() * 2 + 1
@@ -508,18 +508,15 b' vcs.server = localhost:9900'
508
508
509 ## Web server connectivity protocol, responsible for web based VCS operatations
509 ## Web server connectivity protocol, responsible for web based VCS operatations
510 ## Available protocols are:
510 ## Available protocols are:
511 ## `pyro4` - use pyro4 server
512 ## `http` - use http-rpc backend (default)
511 ## `http` - use http-rpc backend (default)
513 vcs.server.protocol = http
512 vcs.server.protocol = http
514
513
515 ## Push/Pull operations protocol, available options are:
514 ## Push/Pull operations protocol, available options are:
516 ## `pyro4` - use pyro4 server
517 ## `http` - use http-rpc backend (default)
515 ## `http` - use http-rpc backend (default)
518 ##
516 ##
519 vcs.scm_app_implementation = http
517 vcs.scm_app_implementation = http
520
518
521 ## Push/Pull operations hooks protocol, available options are:
519 ## Push/Pull operations hooks protocol, available options are:
522 ## `pyro4` - use pyro4 server
523 ## `http` - use http-rpc backend (default)
520 ## `http` - use http-rpc backend (default)
524 vcs.hooks.protocol = http
521 vcs.hooks.protocol = http
525
522
@@ -635,7 +632,7 b' formatter = generic'
635 ################
632 ################
636
633
637 [formatter_generic]
634 [formatter_generic]
638 class = rhodecode.lib.logging_formatter.Pyro4AwareFormatter
635 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
639 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
636 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
640 datefmt = %Y-%m-%d %H:%M:%S
637 datefmt = %Y-%m-%d %H:%M:%S
641
638
@@ -124,6 +124,7 b' let'
124 name = "rhodecode-enterprise-ce-${version}";
124 name = "rhodecode-enterprise-ce-${version}";
125 releaseName = "RhodeCodeEnterpriseCE-${version}";
125 releaseName = "RhodeCodeEnterpriseCE-${version}";
126 src = rhodecode-enterprise-ce-src;
126 src = rhodecode-enterprise-ce-src;
127 dontStrip = true; # prevent strip, we don't need it.
127
128
128 buildInputs =
129 buildInputs =
129 attrs.buildInputs ++
130 attrs.buildInputs ++
@@ -225,8 +226,8 b' let'
225 rhodecode-testdata-src = sources.rhodecode-testdata or (
226 rhodecode-testdata-src = sources.rhodecode-testdata or (
226 pkgs.fetchhg {
227 pkgs.fetchhg {
227 url = "https://code.rhodecode.com/upstream/rc_testdata";
228 url = "https://code.rhodecode.com/upstream/rc_testdata";
228 rev = "v0.9.0";
229 rev = "v0.10.0";
229 sha256 = "0k0ccb7cncd6mmzwckfbr6l7fsymcympwcm948qc3i0f0m6bbg1y";
230 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
230 });
231 });
231
232
232 # Apply all overrides and fix the final package set
233 # Apply all overrides and fix the final package set
@@ -17,7 +17,6 b' implemented in :mod:`rhodecode.lib.middl'
17 .. toctree::
17 .. toctree::
18 :maxdepth: 2
18 :maxdepth: 2
19
19
20 http-transition
21 middleware
20 middleware
22 vcsserver
21 vcsserver
23 subversion
22 subversion
@@ -59,7 +59,7 b' Below config if for an Apache Reverse Pr'
59
59
60 # Url to running RhodeCode instance. This is shown as `- URL:` when
60 # Url to running RhodeCode instance. This is shown as `- URL:` when
61 # running rccontrol status.
61 # running rccontrol status.
62 ProxyPass / http://127.0.0.1:10002/
62 ProxyPass / http://127.0.0.1:10002/ timeout=7200 Keepalive=On
63 ProxyPassReverse / http://127.0.0.1:10002/
63 ProxyPassReverse / http://127.0.0.1:10002/
64
64
65 # strict http prevents from https -> http downgrade
65 # strict http prevents from https -> http downgrade
@@ -47,7 +47,7 b' the ``debug`` level.'
47 ### LOGGING CONFIGURATION ####
47 ### LOGGING CONFIGURATION ####
48 ################################
48 ################################
49 [loggers]
49 [loggers]
50 keys = root, routes, rhodecode, sqlalchemy, beaker, pyro4, templates
50 keys = root, routes, rhodecode, sqlalchemy, beaker, templates
51
51
52 [handlers]
52 [handlers]
53 keys = console, console_sql, file, file_rotating
53 keys = console, console_sql, file, file_rotating
@@ -75,12 +75,6 b' the ``debug`` level.'
75 qualname = beaker.container
75 qualname = beaker.container
76 propagate = 1
76 propagate = 1
77
77
78 [logger_pyro4]
79 level = DEBUG
80 handlers =
81 qualname = Pyro4
82 propagate = 1
83
84 [logger_templates]
78 [logger_templates]
85 level = INFO
79 level = INFO
86 handlers =
80 handlers =
@@ -114,8 +114,20 b' 4. Add the following configuration optio'
114
114
115 This would create a special template file called ```mod_dav_svn.conf```. We
115 This would create a special template file called ```mod_dav_svn.conf```. We
116 used that file path in the apache config above inside the Include statement.
116 used that file path in the apache config above inside the Include statement.
117 It's also possible to generate the config from the
117 It's also possible to manually generate the config from the
118 :menuselection:`Admin --> Settings --> VCS` page.
118 :menuselection:`Admin --> Settings --> VCS` page by clicking a
119 `Generate Apache Config` button.
120
121 5. Now only things left is to enable svn support, and generate the initial
122 configuration.
123
124 - Select `Proxy subversion HTTP requests` checkbox
125 - Enter http://localhost:8090 into `Subversion HTTP Server URL`
126 - Click the `Generate Apache Config` button.
127
128 This config will be automatically re-generated once an user-groups is added
129 to properly map the additional paths generated.
130
119
131
120
132
121 Using |svn|
133 Using |svn|
@@ -7,26 +7,8 b' Change the |hg| Large Files Location'
7 :file:`/home/{user}/repos/.cache/largefiles`. If you wish to change this, use
7 :file:`/home/{user}/repos/.cache/largefiles`. If you wish to change this, use
8 the following steps:
8 the following steps:
9
9
10 1. Open ishell from the terminal and use it to log into the |RCE| database by
10 1. Open :menuselection:`Admin --> Settings --> VCS` as super-admin.
11 specifying the instance :file:`rhodecode.ini` file.
12
13 .. code-block:: bash
14
15 # Open iShell from the terminal and set ini file
16 $ rccontrol ishell enterprise-1
17
18 2. Run the following commands, and ensure that |RCE| has write access to the
19 new directory:
20
11
21 .. code-block:: bash
12 In section called `Mercurial Settings` you can change where the largefiles
13 objects should be stored.
22
14
23 # Once logged into the database, use SQL to redirect
24 # the large files location
25 In [1]: from rhodecode.model.settings import SettingsModel
26 In [2]: SettingsModel().get_ui_by_key('usercache')
27 Out[2]: <RhodeCodeUi[largefiles]usercache=>/mnt/hgfs/shared/workspace/xxxx/.cache/largefiles]>
28
29 In [3]: largefiles_cache = SettingsModel().get_ui_by_key('usercache')
30 In [4]: largefiles_cache.ui_value = '/new/path’
31 In [5]: Session().add(largefiles_cache);Session().commit()
32
@@ -17,5 +17,6 b' may find some of the following methods u'
17 tuning-mount-cache-memory
17 tuning-mount-cache-memory
18 tuning-change-encoding
18 tuning-change-encoding
19 tuning-change-large-file-dir
19 tuning-change-large-file-dir
20 tuning-change-lfs-dir
20 tuning-hg-auth-loop
21 tuning-hg-auth-loop
21
22
@@ -232,7 +232,7 b' For a more detailed explanation of the l'
232 ### LOGGING CONFIGURATION ####
232 ### LOGGING CONFIGURATION ####
233 ################################
233 ################################
234 [loggers]
234 [loggers]
235 keys = root, vcsserver, pyro4, beaker
235 keys = root, vcsserver, beaker
236
236
237 [handlers]
237 [handlers]
238 keys = console
238 keys = console
@@ -259,12 +259,6 b' For a more detailed explanation of the l'
259 qualname = beaker
259 qualname = beaker
260 propagate = 1
260 propagate = 1
261
261
262 [logger_pyro4]
263 level = DEBUG
264 handlers =
265 qualname = Pyro4
266 propagate = 1
267
268
262
269 ##############
263 ##############
270 ## HANDLERS ##
264 ## HANDLERS ##
@@ -75,7 +75,7 b' Example call for auto pulling from remot'
75 .. code-block:: bash
75 .. code-block:: bash
76
76
77 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,
77 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,
78 "auth_token":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull", "args":{"repo":"CPython"}}'
78 "auth_token":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull", "args":{"repoid":"CPython"}}'
79
79
80 Provide those parameters:
80 Provide those parameters:
81 - **id** A value of any type, which is used to match the response with the
81 - **id** A value of any type, which is used to match the response with the
@@ -25,8 +25,7 b' close_pull_request'
25 .. code-block:: bash
25 .. code-block:: bash
26
26
27 "id": <id_given_in_input>,
27 "id": <id_given_in_input>,
28 "result":
28 "result": {
29 {
30 "pull_request_id": "<int>",
29 "pull_request_id": "<int>",
31 "closed": "<bool>"
30 "closed": "<bool>"
32 },
31 },
@@ -68,13 +67,12 b' comment_pull_request'
68 .. code-block:: bash
67 .. code-block:: bash
69
68
70 id : <id_given_in_input>
69 id : <id_given_in_input>
71 result :
70 result : {
72 {
73 "pull_request_id": "<Integer>",
71 "pull_request_id": "<Integer>",
74 "comment_id": "<Integer>",
72 "comment_id": "<Integer>",
75 "status": {"given": <given_status>,
73 "status": {"given": <given_status>,
76 "was_changed": <bool status_was_actually_changed> },
74 "was_changed": <bool status_was_actually_changed> },
77 }
75 },
78 error : null
76 error : null
79
77
80
78
@@ -109,9 +107,8 b' create_pull_request'
109 :param reviewers: Set the new pull request reviewers list.
107 :param reviewers: Set the new pull request reviewers list.
110 :type reviewers: Optional(list)
108 :type reviewers: Optional(list)
111 Accepts username strings or objects of the format:
109 Accepts username strings or objects of the format:
112 {
110
113 'username': 'nick', 'reasons': ['original author']
111 {'username': 'nick', 'reasons': ['original author']}
114 }
115
112
116
113
117 get_pull_request
114 get_pull_request
@@ -306,8 +303,7 b' merge_pull_request'
306 .. code-block:: bash
303 .. code-block:: bash
307
304
308 "id": <id_given_in_input>,
305 "id": <id_given_in_input>,
309 "result":
306 "result": {
310 {
311 "executed": "<bool>",
307 "executed": "<bool>",
312 "failure_reason": "<int>",
308 "failure_reason": "<int>",
313 "merge_commit_id": "<merge_commit_id>",
309 "merge_commit_id": "<merge_commit_id>",
@@ -350,8 +346,7 b' update_pull_request'
350 .. code-block:: bash
346 .. code-block:: bash
351
347
352 id : <id_given_in_input>
348 id : <id_given_in_input>
353 result :
349 result : {
354 {
355 "msg": "Updated pull request `63`",
350 "msg": "Updated pull request `63`",
356 "pull_request": <pull_request_object>,
351 "pull_request": <pull_request_object>,
357 "updated_reviewers": {
352 "updated_reviewers": {
@@ -85,6 +85,58 b' get_ip'
85 }
85 }
86
86
87
87
88 get_method
89 ----------
90
91 .. py:function:: get_method(apiuser, pattern=<Optional:'*'>)
92
93 Returns list of all available API methods. By default match pattern
94 os "*" but any other pattern can be specified. eg *comment* will return
95 all methods with comment inside them. If just single method is matched
96 returned data will also include method specification
97
98 This command can only be run using an |authtoken| with admin rights to
99 the specified repository.
100
101 This command takes the following options:
102
103 :param apiuser: This is filled automatically from the |authtoken|.
104 :type apiuser: AuthUser
105 :param pattern: pattern to match method names against
106 :type older_then: Optional("*")
107
108 Example output:
109
110 .. code-block:: bash
111
112 id : <id_given_in_input>
113 "result": [
114 "changeset_comment",
115 "comment_pull_request",
116 "comment_commit"
117 ]
118 error : null
119
120 .. code-block:: bash
121
122 id : <id_given_in_input>
123 "result": [
124 "comment_commit",
125 {
126 "apiuser": "<RequiredType>",
127 "comment_type": "<Optional:u'note'>",
128 "commit_id": "<RequiredType>",
129 "message": "<RequiredType>",
130 "repoid": "<RequiredType>",
131 "request": "<RequiredType>",
132 "resolves_comment_id": "<Optional:None>",
133 "status": "<Optional:None>",
134 "userid": "<Optional:<OptionalAttr:apiuser>>"
135 }
136 ]
137 error : null
138
139
88 get_server_info
140 get_server_info
89 ---------------
141 ---------------
90
142
@@ -41,6 +41,7 b' create_user'
41 :type force_password_change: Optional(``True`` | ``False``)
41 :type force_password_change: Optional(``True`` | ``False``)
42 :param create_personal_repo_group: Create personal repo group for this user
42 :param create_personal_repo_group: Create personal repo group for this user
43 :type create_personal_repo_group: Optional(``True`` | ``False``)
43 :type create_personal_repo_group: Optional(``True`` | ``False``)
44
44 Example output:
45 Example output:
45
46
46 .. code-block:: bash
47 .. code-block:: bash
@@ -145,8 +146,8 b' get_user'
145 "result": {
146 "result": {
146 "active": true,
147 "active": true,
147 "admin": false,
148 "admin": false,
148 "api_key": "api-key",
149 "api_keys": [ list of keys ],
149 "api_keys": [ list of keys ],
150 "auth_tokens": [ list of tokens with details ],
150 "email": "user@example.com",
151 "email": "user@example.com",
151 "emails": [
152 "emails": [
152 "user@example.com"
153 "user@example.com"
@@ -157,6 +158,7 b' get_user'
157 "ip_addresses": [],
158 "ip_addresses": [],
158 "language": null,
159 "language": null,
159 "last_login": "Timestamp",
160 "last_login": "Timestamp",
161 "last_activity": "Timestamp",
160 "lastname": "surnae",
162 "lastname": "surnae",
161 "permissions": {
163 "permissions": {
162 "global": [
164 "global": [
@@ -183,6 +185,32 b' get_user'
183 }
185 }
184
186
185
187
188 get_user_audit_logs
189 -------------------
190
191 .. py:function:: get_user_audit_logs(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
192
193 Fetches all action logs made by the specified user.
194
195 This command takes the following options:
196
197 :param apiuser: This is filled automatically from the |authtoken|.
198 :type apiuser: AuthUser
199 :param userid: Sets the userid whose list of locked |repos| will be
200 displayed.
201 :type userid: Optional(str or int)
202
203 Example output:
204
205 .. code-block:: bash
206
207 id : <id_given_in_input>
208 result : {
209 [action, action,...]
210 }
211 error : null
212
213
186 get_user_locks
214 get_user_locks
187 --------------
215 --------------
188
216
@@ -19,4 +19,11 b' authentication.'
19 # Set the Active Directory user surname
19 # Set the Active Directory user surname
20 Last Name Attribute = user_surname
20 Last Name Attribute = user_surname
21 # Set the Active Directory user email
21 # Set the Active Directory user email
22 E-mail Attribute = userEmail No newline at end of file
22 E-mail Attribute = userEmail
23
24
25 Below is example setup that can be used with Active Directory and ldap groups.
26
27 .. image:: ../images/ldap-groups-example.png
28 :alt: LDAP/AD setup example
29 :scale: 50 % No newline at end of file
@@ -104,4 +104,10 b' The following are optional when enabling'
104 following directory: `/etc/openldap/cacerts`
104 following directory: `/etc/openldap/cacerts`
105
105
106
106
107 Below is example setup that can be used with Active Directory and ldap groups.
108
109 .. image:: ../images/ldap-groups-example.png
110 :alt: LDAP/AD setup example
111 :scale: 50 %
112
107 .. _RFC 2254: http://www.rfc-base.org/rfc-2254.html No newline at end of file
113 .. _RFC 2254: http://www.rfc-base.org/rfc-2254.html
@@ -114,6 +114,30 b' following command from inside the cloned'
114 fine on both MacOS and Linux platforms.
114 fine on both MacOS and Linux platforms.
115
115
116
116
117 Create config.nix for development
118 ---------------------------------
119
120 In order to run proper tests and setup linking across projects, a config.nix
121 file needs to be setup::
122
123 # create config
124 mkdir -p ~/.nixpkgs
125 touch ~/.nixpkgs/config.nix
126
127 # put the below content into the ~/.nixpkgs/config.nix file
128 # adjusts, the path to where you cloned your repositories.
129
130 {
131 rc = {
132 sources = {
133 rhodecode-vcsserver = "/home/dev/rhodecode-vcsserver";
134 rhodecode-enterprise-ce = "/home/dev/rhodecode-enterprise-ce";
135 rhodecode-enterprise-ee = "/home/dev/rhodecode-enterprise-ee";
136 };
137 };
138 }
139
140
117
141
118 Creating a Development Configuration
142 Creating a Development Configuration
119 ------------------------------------
143 ------------------------------------
@@ -21,7 +21,7 b' New Features'
21 - Pull request reviewers (EE only): added new default reviewers functionality.
21 - Pull request reviewers (EE only): added new default reviewers functionality.
22 Allows picking users or user groups defined as reviewers for new pull request.
22 Allows picking users or user groups defined as reviewers for new pull request.
23 Picking reviewers can be based on branch name, changed file name patterns or
23 Picking reviewers can be based on branch name, changed file name patterns or
24 original author of changed source code. eg *.css -> design team.
24 original author of changed source code. eg \*.css -> design team.
25 Master branch -> repo owner, fixes #1131.
25 Master branch -> repo owner, fixes #1131.
26 - Pull request reviewers: store and show reasons why given person is a reviewer.
26 - Pull request reviewers: store and show reasons why given person is a reviewer.
27 Manually adding reviewers after creating a PR will now be also indicated
27 Manually adding reviewers after creating a PR will now be also indicated
@@ -85,7 +85,7 b' General'
85 input for text box.
85 input for text box.
86 - Api: WARNING DEPRECATION, refactor repository group schemas. Fixes #4133.
86 - Api: WARNING DEPRECATION, refactor repository group schemas. Fixes #4133.
87 When using create_repo, create_repo_group, update_repo, update_repo_group
87 When using create_repo, create_repo_group, update_repo, update_repo_group
88 the *_name parameter now takes full path including sub repository groups.
88 the \*_name parameter now takes full path including sub repository groups.
89 This is the only way to add resource under another repository group.
89 This is the only way to add resource under another repository group.
90 Furthermore giving non-existing path will no longer create the missing
90 Furthermore giving non-existing path will no longer create the missing
91 structure. This change makes the api more consistent, it better validates
91 structure. This change makes the api more consistent, it better validates
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.7.0.rst
12 release-notes-4.6.1.rst
13 release-notes-4.6.1.rst
13 release-notes-4.6.0.rst
14 release-notes-4.6.0.rst
14 release-notes-4.5.2.rst
15 release-notes-4.5.2.rst
@@ -9,6 +9,36 b' has a large files extension which tracks'
9 means that the large files are only downloaded when they are needed as part
9 means that the large files are only downloaded when they are needed as part
10 of the current revision. This saves both disk space and bandwidth.
10 of the current revision. This saves both disk space and bandwidth.
11
11
12
13 Enabling HG Largefiles
14 ++++++++++++++++++++++
15
16 Mercurial Largefiles extension is disabled by default within |RC| Server.
17
18 To enable Mercurial Largefiles Globally:
19
20 - Go to :menuselection:`Admin --> Settings --> VCS`
21
22 - Scroll down into `Mercurial settings`
23
24 - Tick `Enable largefiles extension`
25
26 - Save your settings.
27
28 Those settings apply globally to each repository that inherits from the defaults
29 You can leave `largefiles extension` disabled globally, and only enable it per
30 repository that would use the largefiles.
31
32
33 .. note::
34
35 You might want to adjust the global storage location at that point, however
36 we recommend leaving the default one created.
37
38
39 Installing and using the |hg| Largefiles
40 ++++++++++++++++++++++++++++++++++++++++
41
12 To find out more, see the |hg| `Large Files Extensions Documentation`_.
42 To find out more, see the |hg| `Large Files Extensions Documentation`_.
13
43
14 To configure the large files extension, you need to set up your
44 To configure the large files extension, you need to set up your
@@ -12,6 +12,7 b' then please send a request to support@rh'
12
12
13 deploy-from-host
13 deploy-from-host
14 hg-large-ext
14 hg-large-ext
15 git-lfs-ext
15 multi-instance-setup
16 multi-instance-setup
16 scaling-best-practices
17 scaling-best-practices
17 squash-commits
18 squash-commits
@@ -48,12 +48,27 b' self: super: {'
48 ];
48 ];
49 });
49 });
50
50
51 nbconvert = super.nbconvert.override (attrs: {
52 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
53 # marcink: plug in jupyter-client for notebook rendering
54 self.jupyter-client
55 ];
56 });
57
51 ipython = super.ipython.override (attrs: {
58 ipython = super.ipython.override (attrs: {
52 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
59 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
53 self.gnureadline
60 self.gnureadline
54 ];
61 ];
55 });
62 });
56
63
64 celery = super.celery.override (attrs: {
65 # The current version of kombu needs some patching to work with the
66 # other libs. Should be removed once we update celery and kombu.
67 patches = [
68 ./patch-celery-dateutil.diff
69 ];
70 });
71
57 kombu = super.kombu.override (attrs: {
72 kombu = super.kombu.override (attrs: {
58 # The current version of kombu needs some patching to work with the
73 # The current version of kombu needs some patching to work with the
59 # other libs. Should be removed once we update celery and kombu.
74 # other libs. Should be removed once we update celery and kombu.
@@ -197,19 +197,6 b''
197 license = [ pkgs.lib.licenses.bsdOriginal ];
197 license = [ pkgs.lib.licenses.bsdOriginal ];
198 };
198 };
199 };
199 };
200 Pyro4 = super.buildPythonPackage {
201 name = "Pyro4-4.41";
202 buildInputs = with self; [];
203 doCheck = false;
204 propagatedBuildInputs = with self; [serpent];
205 src = fetchurl {
206 url = "https://pypi.python.org/packages/56/2b/89b566b4bf3e7f8ba790db2d1223852f8cb454c52cab7693dd41f608ca2a/Pyro4-4.41.tar.gz";
207 md5 = "ed69e9bfafa9c06c049a87cb0c4c2b6c";
208 };
209 meta = {
210 license = [ pkgs.lib.licenses.mit ];
211 };
212 };
213 Routes = super.buildPythonPackage {
200 Routes = super.buildPythonPackage {
214 name = "Routes-1.13";
201 name = "Routes-1.13";
215 buildInputs = with self; [];
202 buildInputs = with self; [];
@@ -444,6 +431,19 b''
444 license = [ pkgs.lib.licenses.mit ];
431 license = [ pkgs.lib.licenses.mit ];
445 };
432 };
446 };
433 };
434 bleach = super.buildPythonPackage {
435 name = "bleach-1.5.0";
436 buildInputs = with self; [];
437 doCheck = false;
438 propagatedBuildInputs = with self; [six html5lib];
439 src = fetchurl {
440 url = "https://pypi.python.org/packages/99/00/25a8fce4de102bf6e3cc76bc4ea60685b2fee33bde1b34830c70cacc26a7/bleach-1.5.0.tar.gz";
441 md5 = "b663300efdf421b3b727b19d7be9c7e7";
442 };
443 meta = {
444 license = [ pkgs.lib.licenses.asl20 ];
445 };
446 };
447 bottle = super.buildPythonPackage {
447 bottle = super.buildPythonPackage {
448 name = "bottle-0.12.8";
448 name = "bottle-0.12.8";
449 buildInputs = with self; [];
449 buildInputs = with self; [];
@@ -535,6 +535,19 b''
535 license = [ pkgs.lib.licenses.bsdOriginal ];
535 license = [ pkgs.lib.licenses.bsdOriginal ];
536 };
536 };
537 };
537 };
538 configparser = super.buildPythonPackage {
539 name = "configparser-3.5.0";
540 buildInputs = with self; [];
541 doCheck = false;
542 propagatedBuildInputs = with self; [];
543 src = fetchurl {
544 url = "https://pypi.python.org/packages/7c/69/c2ce7e91c89dc073eb1aa74c0621c3eefbffe8216b3f9af9d3885265c01c/configparser-3.5.0.tar.gz";
545 md5 = "cfdd915a5b7a6c09917a64a573140538";
546 };
547 meta = {
548 license = [ pkgs.lib.licenses.mit ];
549 };
550 };
538 cov-core = super.buildPythonPackage {
551 cov-core = super.buildPythonPackage {
539 name = "cov-core-1.15.0";
552 name = "cov-core-1.15.0";
540 buildInputs = with self; [];
553 buildInputs = with self; [];
@@ -562,29 +575,29 b''
562 };
575 };
563 };
576 };
564 cssselect = super.buildPythonPackage {
577 cssselect = super.buildPythonPackage {
565 name = "cssselect-0.9.1";
578 name = "cssselect-1.0.1";
566 buildInputs = with self; [];
579 buildInputs = with self; [];
567 doCheck = false;
580 doCheck = false;
568 propagatedBuildInputs = with self; [];
581 propagatedBuildInputs = with self; [];
569 src = fetchurl {
582 src = fetchurl {
570 url = "https://pypi.python.org/packages/aa/e5/9ee1460d485b94a6d55732eb7ad5b6c084caf73dd6f9cb0bb7d2a78fafe8/cssselect-0.9.1.tar.gz";
583 url = "https://pypi.python.org/packages/77/ff/9c865275cd19290feba56344eba570e719efb7ca5b34d67ed12b22ebbb0d/cssselect-1.0.1.tar.gz";
571 md5 = "c74f45966277dc7a0f768b9b0f3522ac";
584 md5 = "3fa03bf82a9f0b1223c0f1eb1369e139";
572 };
585 };
573 meta = {
586 meta = {
574 license = [ pkgs.lib.licenses.bsdOriginal ];
587 license = [ pkgs.lib.licenses.bsdOriginal ];
575 };
588 };
576 };
589 };
577 decorator = super.buildPythonPackage {
590 decorator = super.buildPythonPackage {
578 name = "decorator-3.4.2";
591 name = "decorator-4.0.11";
579 buildInputs = with self; [];
592 buildInputs = with self; [];
580 doCheck = false;
593 doCheck = false;
581 propagatedBuildInputs = with self; [];
594 propagatedBuildInputs = with self; [];
582 src = fetchurl {
595 src = fetchurl {
583 url = "https://pypi.python.org/packages/35/3a/42566eb7a2cbac774399871af04e11d7ae3fc2579e7dae85213b8d1d1c57/decorator-3.4.2.tar.gz";
596 url = "https://pypi.python.org/packages/cc/ac/5a16f1fc0506ff72fcc8fd4e858e3a1c231f224ab79bb7c4c9b2094cc570/decorator-4.0.11.tar.gz";
584 md5 = "9e0536870d2b83ae27d58dbf22582f4d";
597 md5 = "73644c8f0bd4983d1b6a34b49adec0ae";
585 };
598 };
586 meta = {
599 meta = {
587 license = [ pkgs.lib.licenses.bsdOriginal ];
600 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "new BSD License"; } ];
588 };
601 };
589 };
602 };
590 deform = super.buildPythonPackage {
603 deform = super.buildPythonPackage {
@@ -678,6 +691,19 b''
678 license = [ pkgs.lib.licenses.asl20 ];
691 license = [ pkgs.lib.licenses.asl20 ];
679 };
692 };
680 };
693 };
694 entrypoints = super.buildPythonPackage {
695 name = "entrypoints-0.2.2";
696 buildInputs = with self; [];
697 doCheck = false;
698 propagatedBuildInputs = with self; [configparser];
699 src = fetchurl {
700 url = "https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313";
701 md5 = "7db37771aea9ac9fefe093e5d6987313";
702 };
703 meta = {
704 license = [ pkgs.lib.licenses.mit ];
705 };
706 };
681 enum34 = super.buildPythonPackage {
707 enum34 = super.buildPythonPackage {
682 name = "enum34-1.1.6";
708 name = "enum34-1.1.6";
683 buildInputs = with self; [];
709 buildInputs = with self; [];
@@ -691,6 +717,19 b''
691 license = [ pkgs.lib.licenses.bsdOriginal ];
717 license = [ pkgs.lib.licenses.bsdOriginal ];
692 };
718 };
693 };
719 };
720 functools32 = super.buildPythonPackage {
721 name = "functools32-3.2.3.post2";
722 buildInputs = with self; [];
723 doCheck = false;
724 propagatedBuildInputs = with self; [];
725 src = fetchurl {
726 url = "https://pypi.python.org/packages/5e/1a/0aa2c8195a204a9f51284018562dea77e25511f02fe924fac202fc012172/functools32-3.2.3-2.zip";
727 md5 = "d55232eb132ec779e6893c902a0bc5ad";
728 };
729 meta = {
730 license = [ pkgs.lib.licenses.psfl ];
731 };
732 };
694 future = super.buildPythonPackage {
733 future = super.buildPythonPackage {
695 name = "future-0.14.3";
734 name = "future-0.14.3";
696 buildInputs = with self; [];
735 buildInputs = with self; [];
@@ -782,6 +821,19 b''
782 license = [ pkgs.lib.licenses.mit ];
821 license = [ pkgs.lib.licenses.mit ];
783 };
822 };
784 };
823 };
824 html5lib = super.buildPythonPackage {
825 name = "html5lib-0.9999999";
826 buildInputs = with self; [];
827 doCheck = false;
828 propagatedBuildInputs = with self; [six];
829 src = fetchurl {
830 url = "https://pypi.python.org/packages/ae/ae/bcb60402c60932b32dfaf19bb53870b29eda2cd17551ba5639219fb5ebf9/html5lib-0.9999999.tar.gz";
831 md5 = "ef43cb05e9e799f25d65d1135838a96f";
832 };
833 meta = {
834 license = [ pkgs.lib.licenses.mit ];
835 };
836 };
785 infrae.cache = super.buildPythonPackage {
837 infrae.cache = super.buildPythonPackage {
786 name = "infrae.cache-1.0.1";
838 name = "infrae.cache-1.0.1";
787 buildInputs = with self; [];
839 buildInputs = with self; [];
@@ -873,6 +925,45 b''
873 license = [ pkgs.lib.licenses.bsdOriginal ];
925 license = [ pkgs.lib.licenses.bsdOriginal ];
874 };
926 };
875 };
927 };
928 jsonschema = super.buildPythonPackage {
929 name = "jsonschema-2.6.0";
930 buildInputs = with self; [];
931 doCheck = false;
932 propagatedBuildInputs = with self; [functools32];
933 src = fetchurl {
934 url = "https://pypi.python.org/packages/58/b9/171dbb07e18c6346090a37f03c7e74410a1a56123f847efed59af260a298/jsonschema-2.6.0.tar.gz";
935 md5 = "50c6b69a373a8b55ff1e0ec6e78f13f4";
936 };
937 meta = {
938 license = [ pkgs.lib.licenses.mit ];
939 };
940 };
941 jupyter-client = super.buildPythonPackage {
942 name = "jupyter-client-5.0.0";
943 buildInputs = with self; [];
944 doCheck = false;
945 propagatedBuildInputs = with self; [traitlets jupyter-core pyzmq python-dateutil];
946 src = fetchurl {
947 url = "https://pypi.python.org/packages/e5/6f/65412ed462202b90134b7e761b0b7e7f949e07a549c1755475333727b3d0/jupyter_client-5.0.0.tar.gz";
948 md5 = "1acd331b5c9fb4d79dae9939e79f2426";
949 };
950 meta = {
951 license = [ pkgs.lib.licenses.bsdOriginal ];
952 };
953 };
954 jupyter-core = super.buildPythonPackage {
955 name = "jupyter-core-4.3.0";
956 buildInputs = with self; [];
957 doCheck = false;
958 propagatedBuildInputs = with self; [traitlets];
959 src = fetchurl {
960 url = "https://pypi.python.org/packages/2f/39/5138f975100ce14d150938df48a83cd852a3fd8e24b1244f4113848e69e2/jupyter_core-4.3.0.tar.gz";
961 md5 = "18819511a809afdeed9a995a9c27bcfb";
962 };
963 meta = {
964 license = [ pkgs.lib.licenses.bsdOriginal ];
965 };
966 };
876 kombu = super.buildPythonPackage {
967 kombu = super.buildPythonPackage {
877 name = "kombu-1.5.1";
968 name = "kombu-1.5.1";
878 buildInputs = with self; [];
969 buildInputs = with self; [];
@@ -887,13 +978,13 b''
887 };
978 };
888 };
979 };
889 lxml = super.buildPythonPackage {
980 lxml = super.buildPythonPackage {
890 name = "lxml-3.4.4";
981 name = "lxml-3.7.3";
891 buildInputs = with self; [];
982 buildInputs = with self; [];
892 doCheck = false;
983 doCheck = false;
893 propagatedBuildInputs = with self; [];
984 propagatedBuildInputs = with self; [];
894 src = fetchurl {
985 src = fetchurl {
895 url = "https://pypi.python.org/packages/63/c7/4f2a2a4ad6c6fa99b14be6b3c1cece9142e2d915aa7c43c908677afc8fa4/lxml-3.4.4.tar.gz";
986 url = "https://pypi.python.org/packages/39/e8/a8e0b1fa65dd021d48fe21464f71783655f39a41f218293c1c590d54eb82/lxml-3.7.3.tar.gz";
896 md5 = "a9a65972afc173ec7a39c585f4eea69c";
987 md5 = "075692ce442e69bbd604d44e21c02753";
897 };
988 };
898 meta = {
989 meta = {
899 license = [ pkgs.lib.licenses.bsdOriginal ];
990 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -912,6 +1003,19 b''
912 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1003 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
913 };
1004 };
914 };
1005 };
1006 mistune = super.buildPythonPackage {
1007 name = "mistune-0.7.3";
1008 buildInputs = with self; [];
1009 doCheck = false;
1010 propagatedBuildInputs = with self; [];
1011 src = fetchurl {
1012 url = "https://pypi.python.org/packages/88/1e/be99791262b3a794332fda598a07c2749a433b9378586361ba9d8e824607/mistune-0.7.3.tar.gz";
1013 md5 = "4eba50bd121b83716fa4be6a4049004b";
1014 };
1015 meta = {
1016 license = [ pkgs.lib.licenses.bsdOriginal ];
1017 };
1018 };
915 mock = super.buildPythonPackage {
1019 mock = super.buildPythonPackage {
916 name = "mock-1.0.1";
1020 name = "mock-1.0.1";
917 buildInputs = with self; [];
1021 buildInputs = with self; [];
@@ -938,6 +1042,32 b''
938 license = [ pkgs.lib.licenses.asl20 ];
1042 license = [ pkgs.lib.licenses.asl20 ];
939 };
1043 };
940 };
1044 };
1045 nbconvert = super.buildPythonPackage {
1046 name = "nbconvert-5.1.1";
1047 buildInputs = with self; [];
1048 doCheck = false;
1049 propagatedBuildInputs = with self; [mistune Jinja2 Pygments traitlets jupyter-core nbformat entrypoints bleach pandocfilters testpath];
1050 src = fetchurl {
1051 url = "https://pypi.python.org/packages/95/58/df1c91f1658ee5df19097f915a1e71c91fc824a708d82d2b2e35f8b80e9a/nbconvert-5.1.1.tar.gz";
1052 md5 = "d0263fb03a44db2f94eea09a608ed813";
1053 };
1054 meta = {
1055 license = [ pkgs.lib.licenses.bsdOriginal ];
1056 };
1057 };
1058 nbformat = super.buildPythonPackage {
1059 name = "nbformat-4.3.0";
1060 buildInputs = with self; [];
1061 doCheck = false;
1062 propagatedBuildInputs = with self; [ipython-genutils traitlets jsonschema jupyter-core];
1063 src = fetchurl {
1064 url = "https://pypi.python.org/packages/f9/c5/89df4abf906f766727f976e170caa85b4f1c1d1feb1f45d716016e68e19f/nbformat-4.3.0.tar.gz";
1065 md5 = "9a00d20425914cd5ba5f97769d9963ca";
1066 };
1067 meta = {
1068 license = [ pkgs.lib.licenses.bsdOriginal ];
1069 };
1070 };
941 nose = super.buildPythonPackage {
1071 nose = super.buildPythonPackage {
942 name = "nose-1.3.6";
1072 name = "nose-1.3.6";
943 buildInputs = with self; [];
1073 buildInputs = with self; [];
@@ -977,6 +1107,19 b''
977 license = [ pkgs.lib.licenses.asl20 ];
1107 license = [ pkgs.lib.licenses.asl20 ];
978 };
1108 };
979 };
1109 };
1110 pandocfilters = super.buildPythonPackage {
1111 name = "pandocfilters-1.4.1";
1112 buildInputs = with self; [];
1113 doCheck = false;
1114 propagatedBuildInputs = with self; [];
1115 src = fetchurl {
1116 url = "https://pypi.python.org/packages/e3/1f/21d1b7e8ca571e80b796c758d361fdf5554335ff138158654684bc5401d8/pandocfilters-1.4.1.tar.gz";
1117 md5 = "7680d9f9ec07397dd17f380ee3818b9d";
1118 };
1119 meta = {
1120 license = [ pkgs.lib.licenses.bsdOriginal ];
1121 };
1122 };
980 paramiko = super.buildPythonPackage {
1123 paramiko = super.buildPythonPackage {
981 name = "paramiko-1.15.1";
1124 name = "paramiko-1.15.1";
982 buildInputs = with self; [];
1125 buildInputs = with self; [];
@@ -1043,13 +1186,13 b''
1043 };
1186 };
1044 };
1187 };
1045 prompt-toolkit = super.buildPythonPackage {
1188 prompt-toolkit = super.buildPythonPackage {
1046 name = "prompt-toolkit-1.0.9";
1189 name = "prompt-toolkit-1.0.13";
1047 buildInputs = with self; [];
1190 buildInputs = with self; [];
1048 doCheck = false;
1191 doCheck = false;
1049 propagatedBuildInputs = with self; [six wcwidth];
1192 propagatedBuildInputs = with self; [six wcwidth];
1050 src = fetchurl {
1193 src = fetchurl {
1051 url = "https://pypi.python.org/packages/83/14/5ac258da6c530eca02852ee25c7a9ff3ca78287bb4c198d0d0055845d856/prompt_toolkit-1.0.9.tar.gz";
1194 url = "https://pypi.python.org/packages/23/be/4876b52d5cc159cbd4b0ff6e7aa419a26470849a43a8f647857a4a24467b/prompt_toolkit-1.0.13.tar.gz";
1052 md5 = "a39f91a54308fb7446b1a421c11f227c";
1195 md5 = "427b496d2c147bd3819bc3a7f6e0d493";
1053 };
1196 };
1054 meta = {
1197 meta = {
1055 license = [ pkgs.lib.licenses.bsdOriginal ];
1198 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -1199,13 +1342,13 b''
1199 };
1342 };
1200 };
1343 };
1201 pyramid = super.buildPythonPackage {
1344 pyramid = super.buildPythonPackage {
1202 name = "pyramid-1.6.1";
1345 name = "pyramid-1.7.4";
1203 buildInputs = with self; [];
1346 buildInputs = with self; [];
1204 doCheck = false;
1347 doCheck = false;
1205 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
1348 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
1206 src = fetchurl {
1349 src = fetchurl {
1207 url = "https://pypi.python.org/packages/30/b3/fcc4a2a4800cbf21989e00454b5828cf1f7fe35c63e0810b350e56d4c475/pyramid-1.6.1.tar.gz";
1350 url = "https://pypi.python.org/packages/33/91/55f5c661f8923902cd1f68d75f2b937c45e7682857356cf18f0be5493899/pyramid-1.7.4.tar.gz";
1208 md5 = "b18688ff3cc33efdbb098a35b45dd122";
1351 md5 = "6ef1dfdcff9136d04490410757c4c446";
1209 };
1352 };
1210 meta = {
1353 meta = {
1211 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1354 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
@@ -1225,13 +1368,13 b''
1225 };
1368 };
1226 };
1369 };
1227 pyramid-debugtoolbar = super.buildPythonPackage {
1370 pyramid-debugtoolbar = super.buildPythonPackage {
1228 name = "pyramid-debugtoolbar-2.4.2";
1371 name = "pyramid-debugtoolbar-3.0.5";
1229 buildInputs = with self; [];
1372 buildInputs = with self; [];
1230 doCheck = false;
1373 doCheck = false;
1231 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
1374 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
1232 src = fetchurl {
1375 src = fetchurl {
1233 url = "https://pypi.python.org/packages/89/00/ed5426ee41ed747ba3ffd30e8230841a6878286ea67d480b1444d24f06a2/pyramid_debugtoolbar-2.4.2.tar.gz";
1376 url = "https://pypi.python.org/packages/64/0e/df00bfb55605900e7a2f7e4a18dd83575a6651688e297d5a0aa4c208fd7d/pyramid_debugtoolbar-3.0.5.tar.gz";
1234 md5 = "073ea67086cc4bd5decc3a000853642d";
1377 md5 = "aebab8c3bfdc6f89e4d3adc1d126538e";
1235 };
1378 };
1236 meta = {
1379 meta = {
1237 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
1380 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
@@ -1368,16 +1511,16 b''
1368 };
1511 };
1369 };
1512 };
1370 python-dateutil = super.buildPythonPackage {
1513 python-dateutil = super.buildPythonPackage {
1371 name = "python-dateutil-1.5";
1514 name = "python-dateutil-2.1";
1372 buildInputs = with self; [];
1515 buildInputs = with self; [];
1373 doCheck = false;
1516 doCheck = false;
1374 propagatedBuildInputs = with self; [];
1517 propagatedBuildInputs = with self; [six];
1375 src = fetchurl {
1518 src = fetchurl {
1376 url = "https://pypi.python.org/packages/b4/7c/df59c89a753eb33c7c44e1dd42de0e9bc2ccdd5a4d576e0bfad97cc280cb/python-dateutil-1.5.tar.gz";
1519 url = "https://pypi.python.org/packages/65/52/9c18dac21f174ad31b65e22d24297864a954e6fe65876eba3f5773d2da43/python-dateutil-2.1.tar.gz";
1377 md5 = "0dcb1de5e5cad69490a3b6ab63f0cfa5";
1520 md5 = "1534bb15cf311f07afaa3aacba1c028b";
1378 };
1521 };
1379 meta = {
1522 meta = {
1380 license = [ pkgs.lib.licenses.psfl ];
1523 license = [ { fullName = "Simplified BSD"; } ];
1381 };
1524 };
1382 };
1525 };
1383 python-editor = super.buildPythonPackage {
1526 python-editor = super.buildPythonPackage {
@@ -1498,10 +1641,10 b''
1498 };
1641 };
1499 };
1642 };
1500 rhodecode-enterprise-ce = super.buildPythonPackage {
1643 rhodecode-enterprise-ce = super.buildPythonPackage {
1501 name = "rhodecode-enterprise-ce-4.6.1";
1644 name = "rhodecode-enterprise-ce-4.7.0";
1502 buildInputs = with self; [pytest py pytest-cov pytest-sugar pytest-runner pytest-catchlog pytest-profiling gprof2dot pytest-timeout mock WebTest cov-core coverage cssselect lxml configobj];
1645 buildInputs = with self; [pytest py pytest-cov pytest-sugar pytest-runner pytest-catchlog pytest-profiling gprof2dot pytest-timeout mock WebTest cov-core coverage configobj];
1503 doCheck = true;
1646 doCheck = true;
1504 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments pygments-markdown-lexer Pylons Pyro4 Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery channelstream colander decorator deform docutils gevent gunicorn infrae.cache ipython iso8601 kombu msgpack-python packaging psycopg2 py-gfm pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson subprocess32 waitress zope.cachedescriptors dogpile.cache dogpile.core psutil py-bcrypt];
1647 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments pygments-markdown-lexer Pylons Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress cssselect celery channelstream colander decorator deform docutils gevent gunicorn infrae.cache ipython iso8601 kombu lxml msgpack-python nbconvert packaging psycopg2 py-gfm pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson subprocess32 waitress zope.cachedescriptors dogpile.cache dogpile.core psutil py-bcrypt];
1505 src = ./.;
1648 src = ./.;
1506 meta = {
1649 meta = {
1507 license = [ { fullName = "Affero GNU General Public License v3 or later (AGPLv3+)"; } { fullName = "AGPLv3, and Commercial License"; } ];
1650 license = [ { fullName = "Affero GNU General Public License v3 or later (AGPLv3+)"; } { fullName = "AGPLv3, and Commercial License"; } ];
@@ -1520,19 +1663,6 b''
1520 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1663 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1521 };
1664 };
1522 };
1665 };
1523 serpent = super.buildPythonPackage {
1524 name = "serpent-1.15";
1525 buildInputs = with self; [];
1526 doCheck = false;
1527 propagatedBuildInputs = with self; [];
1528 src = fetchurl {
1529 url = "https://pypi.python.org/packages/7b/38/b2b27673a882ff2ea5871bb3e3e6b496ebbaafd1612e51990ffb158b9254/serpent-1.15.tar.gz";
1530 md5 = "e27b1aad5c218e16442f52abb7c7053a";
1531 };
1532 meta = {
1533 license = [ pkgs.lib.licenses.mit ];
1534 };
1535 };
1536 setproctitle = super.buildPythonPackage {
1666 setproctitle = super.buildPythonPackage {
1537 name = "setproctitle-1.1.8";
1667 name = "setproctitle-1.1.8";
1538 buildInputs = with self; [];
1668 buildInputs = with self; [];
@@ -1650,14 +1780,27 b''
1650 license = [ pkgs.lib.licenses.mit ];
1780 license = [ pkgs.lib.licenses.mit ];
1651 };
1781 };
1652 };
1782 };
1783 testpath = super.buildPythonPackage {
1784 name = "testpath-0.1";
1785 buildInputs = with self; [];
1786 doCheck = false;
1787 propagatedBuildInputs = with self; [];
1788 src = fetchurl {
1789 url = "https://pypi.python.org/packages/f9/c4/c0b22f35138bc26a6058c39cb61db1e8977e5e9550b12cd2cb02ef56fc51/testpath-0.1.tar.gz";
1790 md5 = "401918bcd0b0e5b71a9b909835117bc6";
1791 };
1792 meta = {
1793 license = [ pkgs.lib.licenses.mit ];
1794 };
1795 };
1653 traitlets = super.buildPythonPackage {
1796 traitlets = super.buildPythonPackage {
1654 name = "traitlets-4.3.1";
1797 name = "traitlets-4.3.2";
1655 buildInputs = with self; [];
1798 buildInputs = with self; [];
1656 doCheck = false;
1799 doCheck = false;
1657 propagatedBuildInputs = with self; [ipython-genutils six decorator enum34];
1800 propagatedBuildInputs = with self; [ipython-genutils six decorator enum34];
1658 src = fetchurl {
1801 src = fetchurl {
1659 url = "https://pypi.python.org/packages/b1/d6/5b5aa6d5c474691909b91493da1e8972e309c9f01ecfe4aeafd272eb3234/traitlets-4.3.1.tar.gz";
1802 url = "https://pypi.python.org/packages/a5/98/7f5ef2fe9e9e071813aaf9cb91d1a732e0a68b6c44a32b38cb8e14c3f069/traitlets-4.3.2.tar.gz";
1660 md5 = "dd0b1b6e5d31ce446d55a4b5e5083c98";
1803 md5 = "3068663f2f38fd939a9eb3a500ccc154";
1661 };
1804 };
1662 meta = {
1805 meta = {
1663 license = [ pkgs.lib.licenses.bsdOriginal ];
1806 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -2,7 +2,6 b''
2 testpaths = ./rhodecode
2 testpaths = ./rhodecode
3 pylons_config = rhodecode/tests/rhodecode.ini
3 pylons_config = rhodecode/tests/rhodecode.ini
4 vcsserver_protocol = http
4 vcsserver_protocol = http
5 vcsserver_config_pyro4 = rhodecode/tests/vcsserver_pyro4.ini
6 vcsserver_config_http = rhodecode/tests/vcsserver_http.ini
5 vcsserver_config_http = rhodecode/tests/vcsserver_http.ini
7 norecursedirs = tests/scripts
6 norecursedirs = tests/scripts
8 addopts = -k "not _BaseTest"
7 addopts = -k "not _BaseTest"
@@ -14,7 +14,8 b' channelstream==0.5.2'
14 click==5.1
14 click==5.1
15 colander==1.2
15 colander==1.2
16 configobj==5.0.6
16 configobj==5.0.6
17 decorator==3.4.2
17 cssselect==1.0.1
18 decorator==4.0.11
18 deform==2.0a2
19 deform==2.0a2
19 docutils==0.12
20 docutils==0.12
20 dogpile.cache==0.6.1
21 dogpile.cache==0.6.1
@@ -29,6 +30,7 b' iso8601==0.1.11'
29 itsdangerous==0.24
30 itsdangerous==0.24
30 Jinja2==2.7.3
31 Jinja2==2.7.3
31 kombu==1.5.1
32 kombu==1.5.1
33 lxml==3.7.3
32 Mako==1.0.6
34 Mako==1.0.6
33 Markdown==2.6.7
35 Markdown==2.6.7
34 MarkupSafe==0.23
36 MarkupSafe==0.23
@@ -42,6 +44,7 b' paramiko==1.15.1'
42 Paste==2.0.3
44 Paste==2.0.3
43 PasteDeploy==1.5.2
45 PasteDeploy==1.5.2
44 PasteScript==1.7.5
46 PasteScript==1.7.5
47 pathlib2==2.1.0
45 psutil==4.3.1
48 psutil==4.3.1
46 psycopg2==2.6.1
49 psycopg2==2.6.1
47 py-bcrypt==0.4
50 py-bcrypt==0.4
@@ -52,12 +55,12 b' pygments-markdown-lexer==0.1.0.dev39'
52 Pygments==2.2.0
55 Pygments==2.2.0
53 pyparsing==1.5.7
56 pyparsing==1.5.7
54 pyramid-beaker==0.8
57 pyramid-beaker==0.8
55 pyramid-debugtoolbar==2.4.2
58 pyramid-debugtoolbar==3.0.5
56 pyramid-jinja2==2.5
59 pyramid-jinja2==2.5
57 pyramid-mako==1.0.2
60 pyramid-mako==1.0.2
58 pyramid==1.6.1
61 pyramid==1.7.4
59 pysqlite==2.6.3
62 pysqlite==2.6.3
60 python-dateutil==1.5
63 python-dateutil==2.1
61 python-ldap==2.4.19
64 python-ldap==2.4.19
62 python-memcached==1.57
65 python-memcached==1.57
63 python-pam==1.8.2
66 python-pam==1.8.2
@@ -97,6 +100,12 b' https://code.rhodecode.com/upstream/pylo'
97 # not released py-gfm==0.1.3
100 # not released py-gfm==0.1.3
98 https://code.rhodecode.com/upstream/py-gfm/archive/0d66a19bc16e3d49de273c0f797d4e4781e8c0f2.tar.gz?md5=0d0d5385bfb629eea636a80b9c2bfd16#egg=py-gfm==0.1.3.rhodecode-upstream1
101 https://code.rhodecode.com/upstream/py-gfm/archive/0d66a19bc16e3d49de273c0f797d4e4781e8c0f2.tar.gz?md5=0d0d5385bfb629eea636a80b9c2bfd16#egg=py-gfm==0.1.3.rhodecode-upstream1
99
102
103 # IPYTHON RENDERING
104 # entrypoints backport, pypi version doesn't support egg installs
105 https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313#egg=entrypoints==0.2.2.rhodecode-upstream1
106 nbconvert==5.1.1
107 nbformat==4.3.0
108 jupyter_client==5.0.0
100
109
101 ## cli tools
110 ## cli tools
102 alembic==0.8.4
111 alembic==0.8.4
@@ -123,9 +132,5 b' https://code.rhodecode.com/rhodecode-too'
123 ## appenlight
132 ## appenlight
124 appenlight-client==0.6.14
133 appenlight-client==0.6.14
125
134
126 # Pyro/Deprecated TODO(Marcink): remove in 4.7 release.
127 Pyro4==4.41
128 serpent==1.15
129
130 ## test related requirements
135 ## test related requirements
131 -r requirements_test.txt
136 -r requirements_test.txt
@@ -13,5 +13,3 b' mock==1.0.1'
13 WebTest==1.4.3
13 WebTest==1.4.3
14 cov-core==1.15.0
14 cov-core==1.15.0
15 coverage==3.7.1
15 coverage==3.7.1
16 cssselect==0.9.1
17 lxml==3.4.4
@@ -1,1 +1,1 b''
1 4.6.1 No newline at end of file
1 4.7.0 No newline at end of file
@@ -51,7 +51,7 b' PYRAMID_SETTINGS = {}'
51 EXTENSIONS = {}
51 EXTENSIONS = {}
52
52
53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
54 __dbversion__ = 64 # defines current db version for migrations
54 __dbversion__ = 71 # defines current db version for migrations
55 __platform__ = platform.system()
55 __platform__ = platform.system()
56 __license__ = 'AGPLv3, and Commercial License'
56 __license__ = 'AGPLv3, and Commercial License'
57 __author__ = 'RhodeCode GmbH'
57 __author__ = 'RhodeCode GmbH'
@@ -22,6 +22,7 b' import inspect'
22 import itertools
22 import itertools
23 import logging
23 import logging
24 import types
24 import types
25 import fnmatch
25
26
26 import decorator
27 import decorator
27 import venusian
28 import venusian
@@ -47,6 +48,18 b" DEFAULT_RENDERER = 'jsonrpc_renderer'"
47 DEFAULT_URL = '/_admin/apiv2'
48 DEFAULT_URL = '/_admin/apiv2'
48
49
49
50
51 def find_methods(jsonrpc_methods, pattern):
52 matches = OrderedDict()
53 if not isinstance(pattern, (list, tuple)):
54 pattern = [pattern]
55
56 for single_pattern in pattern:
57 for method_name, method in jsonrpc_methods.items():
58 if fnmatch.fnmatch(method_name, single_pattern):
59 matches[method_name] = method
60 return matches
61
62
50 class ExtJsonRenderer(object):
63 class ExtJsonRenderer(object):
51 """
64 """
52 Custom renderer that mkaes use of our ext_json lib
65 Custom renderer that mkaes use of our ext_json lib
@@ -143,7 +156,19 b' def exception_view(exc, request):'
143 log.debug('json-rpc method `%s` not found in list of '
156 log.debug('json-rpc method `%s` not found in list of '
144 'api calls: %s, rpc_id:%s',
157 'api calls: %s, rpc_id:%s',
145 method, request.registry.jsonrpc_methods.keys(), rpc_id)
158 method, request.registry.jsonrpc_methods.keys(), rpc_id)
146 fault_message = "No such method: {}".format(method)
159
160 similar = 'none'
161 try:
162 similar_paterns = ['*{}*'.format(x) for x in method.split('_')]
163 similar_found = find_methods(
164 request.registry.jsonrpc_methods, similar_paterns)
165 similar = ', '.join(similar_found.keys()) or similar
166 except Exception:
167 # make the whole above block safe
168 pass
169
170 fault_message = "No such method: {}. Similar methods: {}".format(
171 method, similar)
147
172
148 return jsonrpc_error(request, fault_message, rpc_id)
173 return jsonrpc_error(request, fault_message, rpc_id)
149
174
@@ -184,18 +209,18 b' def request_view(request):'
184 request.rpc_user = auth_u
209 request.rpc_user = auth_u
185
210
186 # now check if token is valid for API
211 # now check if token is valid for API
187 role = UserApiKeys.ROLE_API
212 auth_token = request.rpc_api_key
188 extra_auth_tokens = [
213 token_match = api_user.authenticate_by_token(
189 x.api_key for x in User.extra_valid_auth_tokens(api_user, role=role)]
214 auth_token, roles=[UserApiKeys.ROLE_API])
190 active_tokens = [api_user.api_key] + extra_auth_tokens
215 invalid_token = not token_match
191
216
192 log.debug('Checking if API key has proper role')
217 log.debug('Checking if API KEY is valid with proper role')
193 if request.rpc_api_key not in active_tokens:
218 if invalid_token:
194 return jsonrpc_error(
219 return jsonrpc_error(
195 request, retid=request.rpc_id,
220 request, retid=request.rpc_id,
196 message='API KEY has bad role for an API call')
221 message='API KEY invalid or, has bad role for an API call')
197
222
198 except Exception as e:
223 except Exception:
199 log.exception('Error on API AUTH')
224 log.exception('Error on API AUTH')
200 return jsonrpc_error(
225 return jsonrpc_error(
201 request, retid=request.rpc_id, message='Invalid API KEY')
226 request, retid=request.rpc_id, message='Invalid API KEY')
@@ -351,9 +376,10 b' class RoutePredicate(object):'
351 class NotFoundPredicate(object):
376 class NotFoundPredicate(object):
352 def __init__(self, val, config):
377 def __init__(self, val, config):
353 self.val = val
378 self.val = val
379 self.methods = config.registry.jsonrpc_methods
354
380
355 def text(self):
381 def text(self):
356 return 'jsonrpc method not found = %s' % self.val
382 return 'jsonrpc method not found = {}.'.format(self.val)
357
383
358 phash = text
384 phash = text
359
385
@@ -22,14 +22,19 b' import pytest'
22
22
23 from rhodecode.model.meta import Session
23 from rhodecode.model.meta import Session
24 from rhodecode.model.user import UserModel
24 from rhodecode.model.user import UserModel
25 from rhodecode.model.auth_token import AuthTokenModel
25 from rhodecode.tests import TEST_USER_ADMIN_LOGIN
26 from rhodecode.tests import TEST_USER_ADMIN_LOGIN
26
27
27
28
28 @pytest.fixture(scope="class")
29 @pytest.fixture(scope="class")
29 def testuser_api(request, pylonsapp):
30 def testuser_api(request, pylonsapp):
30 cls = request.cls
31 cls = request.cls
32
33 # ADMIN USER
31 cls.usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
34 cls.usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
32 cls.apikey = cls.usr.api_key
35 cls.apikey = cls.usr.api_key
36
37 # REGULAR USER
33 cls.test_user = UserModel().create_or_update(
38 cls.test_user = UserModel().create_or_update(
34 username='test-api',
39 username='test-api',
35 password='test',
40 password='test',
@@ -37,6 +42,11 b' def testuser_api(request, pylonsapp):'
37 firstname='first',
42 firstname='first',
38 lastname='last'
43 lastname='last'
39 )
44 )
45 # create TOKEN for user, if he doesn't have one
46 if not cls.test_user.api_key:
47 AuthTokenModel().create(
48 user=cls.test_user, description='TEST_USER_TOKEN')
49
40 Session().commit()
50 Session().commit()
41 cls.TEST_USER_LOGIN = cls.test_user.username
51 cls.TEST_USER_LOGIN = cls.test_user.username
42 cls.apikey_regular = cls.test_user.api_key
52 cls.apikey_regular = cls.test_user.api_key
@@ -80,7 +80,13 b' class TestApi(object):'
80 def test_api_non_existing_method(self, request):
80 def test_api_non_existing_method(self, request):
81 id_, params = build_data(self.apikey, 'not_existing', args='xx')
81 id_, params = build_data(self.apikey, 'not_existing', args='xx')
82 response = api_call(self.app, params)
82 response = api_call(self.app, params)
83 expected = 'No such method: not_existing'
83 expected = 'No such method: not_existing. Similar methods: none'
84 assert_error(id_, expected, given=response.body)
85
86 def test_api_non_existing_method_have_similar(self, request):
87 id_, params = build_data(self.apikey, 'comment', args='xx')
88 response = api_call(self.app, params)
89 expected = 'No such method: comment. Similar methods: changeset_comment, comment_pull_request, comment_commit'
84 assert_error(id_, expected, given=response.body)
90 assert_error(id_, expected, given=response.body)
85
91
86 def test_api_disabled_user(self, request):
92 def test_api_disabled_user(self, request):
@@ -29,6 +29,7 b' from rhodecode.api.tests.utils import ('
29
29
30 @pytest.mark.usefixtures("testuser_api", "app")
30 @pytest.mark.usefixtures("testuser_api", "app")
31 class TestClosePullRequest(object):
31 class TestClosePullRequest(object):
32
32 @pytest.mark.backends("git", "hg")
33 @pytest.mark.backends("git", "hg")
33 def test_api_close_pull_request(self, pr_util):
34 def test_api_close_pull_request(self, pr_util):
34 pull_request = pr_util.create_pull_request()
35 pull_request = pr_util.create_pull_request()
@@ -53,11 +53,10 b' class TestApiDeleteRepo(object):'
53 }
53 }
54 assert_ok(id_, expected, given=response.body)
54 assert_ok(id_, expected, given=response.body)
55
55
56 def test_api_delete_repo_by_non_admin_no_permission(
56 def test_api_delete_repo_by_non_admin_no_permission(self, backend):
57 self, backend, user_regular):
58 repo = backend.create_repo()
57 repo = backend.create_repo()
59 id_, params = build_data(
58 id_, params = build_data(
60 user_regular.api_key, 'delete_repo', repoid=repo.repo_name, )
59 self.apikey_regular, 'delete_repo', repoid=repo.repo_name, )
61 response = api_call(self.app, params)
60 response = api_call(self.app, params)
62 expected = 'repository `%s` does not exist' % (repo.repo_name)
61 expected = 'repository `%s` does not exist' % (repo.repo_name)
63 assert_error(id_, expected, given=response.body)
62 assert_error(id_, expected, given=response.body)
@@ -23,7 +23,7 b' import pytest'
23
23
24 from rhodecode.model.user import UserModel
24 from rhodecode.model.user import UserModel
25 from rhodecode.model.user_group import UserGroupModel
25 from rhodecode.model.user_group import UserGroupModel
26 from rhodecode.tests import TEST_USER_REGULAR_LOGIN
26 from rhodecode.tests import TEST_USER_ADMIN_EMAIL
27 from rhodecode.api.tests.utils import (
27 from rhodecode.api.tests.utils import (
28 build_data, api_call, assert_error, assert_ok, crash, jsonify)
28 build_data, api_call, assert_error, assert_ok, crash, jsonify)
29
29
@@ -33,7 +33,8 b' class TestUpdateUserGroup(object):'
33 @pytest.mark.parametrize("changing_attr, updates", [
33 @pytest.mark.parametrize("changing_attr, updates", [
34 ('group_name', {'group_name': 'new_group_name'}),
34 ('group_name', {'group_name': 'new_group_name'}),
35 ('group_name', {'group_name': 'test_group_for_update'}),
35 ('group_name', {'group_name': 'test_group_for_update'}),
36 ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
36 # ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
37 ('owner_email', {'owner_email': TEST_USER_ADMIN_EMAIL}),
37 ('active', {'active': False}),
38 ('active', {'active': False}),
38 ('active', {'active': True})
39 ('active', {'active': True})
39 ])
40 ])
@@ -59,7 +60,8 b' class TestUpdateUserGroup(object):'
59 # TODO: mikhail: decide if we need to test against the commented params
60 # TODO: mikhail: decide if we need to test against the commented params
60 # ('group_name', {'group_name': 'new_group_name'}),
61 # ('group_name', {'group_name': 'new_group_name'}),
61 # ('group_name', {'group_name': 'test_group_for_update'}),
62 # ('group_name', {'group_name': 'test_group_for_update'}),
62 ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
63 # ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
64 ('owner_email', {'owner_email': TEST_USER_ADMIN_EMAIL}),
63 ('active', {'active': False}),
65 ('active', {'active': False}),
64 ('active', {'active': True})
66 ('active', {'active': True})
65 ])
67 ])
@@ -181,17 +181,40 b' class TestGetRefHash(object):'
181 class TestUserByNameOrError(object):
181 class TestUserByNameOrError(object):
182 def test_user_found_by_id(self):
182 def test_user_found_by_id(self):
183 fake_user = Mock(id=123)
183 fake_user = Mock(id=123)
184
185 patcher = patch('rhodecode.model.user.UserModel.get_user')
186 with patcher as get_user:
187 get_user.return_value = fake_user
188
189 patcher = patch('rhodecode.model.user.UserModel.get_by_username')
190 with patcher as get_by_username:
191 result = utils.get_user_or_error(123)
192 assert result == fake_user
193
194 def test_user_not_found_by_id_as_str(self):
195 fake_user = Mock(id=123)
196
184 patcher = patch('rhodecode.model.user.UserModel.get_user')
197 patcher = patch('rhodecode.model.user.UserModel.get_user')
185 with patcher as get_user:
198 with patcher as get_user:
186 get_user.return_value = fake_user
199 get_user.return_value = fake_user
187 result = utils.get_user_or_error('123')
200 patcher = patch('rhodecode.model.user.UserModel.get_by_username')
188 assert result == fake_user
201 with patcher as get_by_username:
202 get_by_username.return_value = None
203
204 with pytest.raises(JSONRPCError):
205 utils.get_user_or_error('123')
189
206
190 def test_user_found_by_name(self):
207 def test_user_found_by_name(self):
191 fake_user = Mock(id=123)
208 fake_user = Mock(id=123)
209
210 patcher = patch('rhodecode.model.user.UserModel.get_user')
211 with patcher as get_user:
212 get_user.return_value = None
213
192 patcher = patch('rhodecode.model.user.UserModel.get_by_username')
214 patcher = patch('rhodecode.model.user.UserModel.get_by_username')
193 with patcher as get_by_username:
215 with patcher as get_by_username:
194 get_by_username.return_value = fake_user
216 get_by_username.return_value = fake_user
217
195 result = utils.get_user_or_error('test')
218 result = utils.get_user_or_error('test')
196 assert result == fake_user
219 assert result == fake_user
197
220
@@ -199,8 +222,12 b' class TestUserByNameOrError(object):'
199 patcher = patch('rhodecode.model.user.UserModel.get_user')
222 patcher = patch('rhodecode.model.user.UserModel.get_user')
200 with patcher as get_user:
223 with patcher as get_user:
201 get_user.return_value = None
224 get_user.return_value = None
225 patcher = patch('rhodecode.model.user.UserModel.get_by_username')
226 with patcher as get_by_username:
227 get_by_username.return_value = None
228
202 with pytest.raises(JSONRPCError) as excinfo:
229 with pytest.raises(JSONRPCError) as excinfo:
203 utils.get_user_or_error('123')
230 utils.get_user_or_error(123)
204
231
205 expected_message = 'user `123` does not exist'
232 expected_message = 'user `123` does not exist'
206 assert excinfo.value.message == expected_message
233 assert excinfo.value.message == expected_message
@@ -216,8 +243,7 b' class TestUserByNameOrError(object):'
216 assert excinfo.value.message == expected_message
243 assert excinfo.value.message == expected_message
217
244
218
245
219 class TestGetCommitDict:
246 class TestGetCommitDict(object):
220
221 @pytest.mark.parametrize('filename, expected', [
247 @pytest.mark.parametrize('filename, expected', [
222 (b'sp\xc3\xa4cial', u'sp\xe4cial'),
248 (b'sp\xc3\xa4cial', u'sp\xe4cial'),
223 (b'sp\xa4cial', u'sp\ufffdcial'),
249 (b'sp\xa4cial', u'sp\ufffdcial'),
@@ -213,15 +213,19 b' def get_user_or_error(userid):'
213 :param userid:
213 :param userid:
214 """
214 """
215 from rhodecode.model.user import UserModel
215 from rhodecode.model.user import UserModel
216 user_model = UserModel()
216
217
217 user_model = UserModel()
218 if isinstance(userid, (int, long)):
218 try:
219 try:
219 user = user_model.get_user(int(userid))
220 user = user_model.get_user(userid)
220 except ValueError:
221 except ValueError:
222 user = None
223 else:
221 user = user_model.get_by_username(userid)
224 user = user_model.get_by_username(userid)
222
225
223 if user is None:
226 if user is None:
224 raise JSONRPCError("user `%s` does not exist" % (userid,))
227 raise JSONRPCError(
228 'user `%s` does not exist' % (userid,))
225 return user
229 return user
226
230
227
231
@@ -232,10 +236,19 b' def get_repo_or_error(repoid):'
232 :param repoid:
236 :param repoid:
233 """
237 """
234 from rhodecode.model.repo import RepoModel
238 from rhodecode.model.repo import RepoModel
239 repo_model = RepoModel()
235
240
236 repo = RepoModel().get_repo(repoid)
241 if isinstance(repoid, (int, long)):
242 try:
243 repo = repo_model.get_repo(repoid)
244 except ValueError:
245 repo = None
246 else:
247 repo = repo_model.get_by_repo_name(repoid)
248
237 if repo is None:
249 if repo is None:
238 raise JSONRPCError('repository `%s` does not exist' % (repoid,))
250 raise JSONRPCError(
251 'repository `%s` does not exist' % (repoid,))
239 return repo
252 return repo
240
253
241
254
@@ -246,8 +259,16 b' def get_repo_group_or_error(repogroupid)'
246 :param repogroupid:
259 :param repogroupid:
247 """
260 """
248 from rhodecode.model.repo_group import RepoGroupModel
261 from rhodecode.model.repo_group import RepoGroupModel
262 repo_group_model = RepoGroupModel()
249
263
250 repo_group = RepoGroupModel()._get_repo_group(repogroupid)
264 if isinstance(repogroupid, (int, long)):
265 try:
266 repo_group = repo_group_model._get_repo_group(repogroupid)
267 except ValueError:
268 repo_group = None
269 else:
270 repo_group = repo_group_model.get_by_group_name(repogroupid)
271
251 if repo_group is None:
272 if repo_group is None:
252 raise JSONRPCError(
273 raise JSONRPCError(
253 'repository group `%s` does not exist' % (repogroupid,))
274 'repository group `%s` does not exist' % (repogroupid,))
@@ -261,10 +282,19 b' def get_user_group_or_error(usergroupid)'
261 :param usergroupid:
282 :param usergroupid:
262 """
283 """
263 from rhodecode.model.user_group import UserGroupModel
284 from rhodecode.model.user_group import UserGroupModel
285 user_group_model = UserGroupModel()
264
286
265 user_group = UserGroupModel().get_group(usergroupid)
287 if isinstance(usergroupid, (int, long)):
288 try:
289 user_group = user_group_model.get_group(usergroupid)
290 except ValueError:
291 user_group = None
292 else:
293 user_group = user_group_model.get_by_name(usergroupid)
294
266 if user_group is None:
295 if user_group is None:
267 raise JSONRPCError('user group `%s` does not exist' % (usergroupid,))
296 raise JSONRPCError(
297 'user group `%s` does not exist' % (usergroupid,))
268 return user_group
298 return user_group
269
299
270
300
@@ -245,8 +245,7 b' def merge_pull_request(request, apiuser,'
245 .. code-block:: bash
245 .. code-block:: bash
246
246
247 "id": <id_given_in_input>,
247 "id": <id_given_in_input>,
248 "result":
248 "result": {
249 {
250 "executed": "<bool>",
249 "executed": "<bool>",
251 "failure_reason": "<int>",
250 "failure_reason": "<int>",
252 "merge_commit_id": "<merge_commit_id>",
251 "merge_commit_id": "<merge_commit_id>",
@@ -258,7 +257,6 b' def merge_pull_request(request, apiuser,'
258 }
257 }
259 },
258 },
260 "error": null
259 "error": null
261
262 """
260 """
263 repo = get_repo_or_error(repoid)
261 repo = get_repo_or_error(repoid)
264 if not isinstance(userid, Optional):
262 if not isinstance(userid, Optional):
@@ -322,8 +320,7 b' def close_pull_request(request, apiuser,'
322 .. code-block:: bash
320 .. code-block:: bash
323
321
324 "id": <id_given_in_input>,
322 "id": <id_given_in_input>,
325 "result":
323 "result": {
326 {
327 "pull_request_id": "<int>",
324 "pull_request_id": "<int>",
328 "closed": "<bool>"
325 "closed": "<bool>"
329 },
326 },
@@ -397,13 +394,12 b' def comment_pull_request('
397 .. code-block:: bash
394 .. code-block:: bash
398
395
399 id : <id_given_in_input>
396 id : <id_given_in_input>
400 result :
397 result : {
401 {
402 "pull_request_id": "<Integer>",
398 "pull_request_id": "<Integer>",
403 "comment_id": "<Integer>",
399 "comment_id": "<Integer>",
404 "status": {"given": <given_status>,
400 "status": {"given": <given_status>,
405 "was_changed": <bool status_was_actually_changed> },
401 "was_changed": <bool status_was_actually_changed> },
406 }
402 },
407 error : null
403 error : null
408 """
404 """
409 repo = get_repo_or_error(repoid)
405 repo = get_repo_or_error(repoid)
@@ -535,9 +531,8 b' def create_pull_request('
535 :param reviewers: Set the new pull request reviewers list.
531 :param reviewers: Set the new pull request reviewers list.
536 :type reviewers: Optional(list)
532 :type reviewers: Optional(list)
537 Accepts username strings or objects of the format:
533 Accepts username strings or objects of the format:
538 {
534
539 'username': 'nick', 'reasons': ['original author']
535 {'username': 'nick', 'reasons': ['original author']}
540 }
541 """
536 """
542
537
543 source = get_repo_or_error(source_repo)
538 source = get_repo_or_error(source_repo)
@@ -634,8 +629,7 b' def update_pull_request('
634 .. code-block:: bash
629 .. code-block:: bash
635
630
636 id : <id_given_in_input>
631 id : <id_given_in_input>
637 result :
632 result : {
638 {
639 "msg": "Updated pull request `63`",
633 "msg": "Updated pull request `63`",
640 "pull_request": <pull_request_object>,
634 "pull_request": <pull_request_object>,
641 "updated_reviewers": {
635 "updated_reviewers": {
@@ -18,10 +18,12 b''
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21 import inspect
22 import logging
22 import logging
23 import itertools
23
24
24 from rhodecode.api import jsonrpc_method, JSONRPCError, JSONRPCForbidden
25 from rhodecode.api import (
26 jsonrpc_method, JSONRPCError, JSONRPCForbidden, find_methods)
25
27
26 from rhodecode.api.utils import (
28 from rhodecode.api.utils import (
27 Optional, OAttr, has_superadmin_permission, get_user_or_error)
29 Optional, OAttr, has_superadmin_permission, get_user_or_error)
@@ -243,3 +245,77 b' def cleanup_sessions(request, apiuser, o'
243 raise JSONRPCError(
245 raise JSONRPCError(
244 'Error occurred during session cleanup'
246 'Error occurred during session cleanup'
245 )
247 )
248
249
250 @jsonrpc_method()
251 def get_method(request, apiuser, pattern=Optional('*')):
252 """
253 Returns list of all available API methods. By default match pattern
254 os "*" but any other pattern can be specified. eg *comment* will return
255 all methods with comment inside them. If just single method is matched
256 returned data will also include method specification
257
258 This command can only be run using an |authtoken| with admin rights to
259 the specified repository.
260
261 This command takes the following options:
262
263 :param apiuser: This is filled automatically from the |authtoken|.
264 :type apiuser: AuthUser
265 :param pattern: pattern to match method names against
266 :type older_then: Optional("*")
267
268 Example output:
269
270 .. code-block:: bash
271
272 id : <id_given_in_input>
273 "result": [
274 "changeset_comment",
275 "comment_pull_request",
276 "comment_commit"
277 ]
278 error : null
279
280 .. code-block:: bash
281
282 id : <id_given_in_input>
283 "result": [
284 "comment_commit",
285 {
286 "apiuser": "<RequiredType>",
287 "comment_type": "<Optional:u'note'>",
288 "commit_id": "<RequiredType>",
289 "message": "<RequiredType>",
290 "repoid": "<RequiredType>",
291 "request": "<RequiredType>",
292 "resolves_comment_id": "<Optional:None>",
293 "status": "<Optional:None>",
294 "userid": "<Optional:<OptionalAttr:apiuser>>"
295 }
296 ]
297 error : null
298 """
299 if not has_superadmin_permission(apiuser):
300 raise JSONRPCForbidden()
301
302 pattern = Optional.extract(pattern)
303
304 matches = find_methods(request.registry.jsonrpc_methods, pattern)
305
306 args_desc = []
307 if len(matches) == 1:
308 func = matches[matches.keys()[0]]
309
310 argspec = inspect.getargspec(func)
311 arglist = argspec[0]
312 defaults = map(repr, argspec[3] or [])
313
314 default_empty = '<RequiredType>'
315
316 # kw arguments required by this method
317 func_kwargs = dict(itertools.izip_longest(
318 reversed(arglist), reversed(defaults), fillvalue=default_empty))
319 args_desc.append(func_kwargs)
320
321 return matches.keys() + args_desc
@@ -29,7 +29,6 b' from rhodecode.lib.utils2 import safe_in'
29 from rhodecode.model.db import Session, User, Repository
29 from rhodecode.model.db import Session, User, Repository
30 from rhodecode.model.user import UserModel
30 from rhodecode.model.user import UserModel
31
31
32
33 log = logging.getLogger(__name__)
32 log = logging.getLogger(__name__)
34
33
35
34
@@ -62,8 +61,8 b' def get_user(request, apiuser, userid=Op'
62 "result": {
61 "result": {
63 "active": true,
62 "active": true,
64 "admin": false,
63 "admin": false,
65 "api_key": "api-key",
66 "api_keys": [ list of keys ],
64 "api_keys": [ list of keys ],
65 "auth_tokens": [ list of tokens with details ],
67 "email": "user@example.com",
66 "email": "user@example.com",
68 "emails": [
67 "emails": [
69 "user@example.com"
68 "user@example.com"
@@ -74,6 +73,7 b' def get_user(request, apiuser, userid=Op'
74 "ip_addresses": [],
73 "ip_addresses": [],
75 "language": null,
74 "language": null,
76 "last_login": "Timestamp",
75 "last_login": "Timestamp",
76 "last_activity": "Timestamp",
77 "lastname": "surnae",
77 "lastname": "surnae",
78 "permissions": {
78 "permissions": {
79 "global": [
79 "global": [
@@ -191,6 +191,7 b' def create_user(request, apiuser, userna'
191 :type force_password_change: Optional(``True`` | ``False``)
191 :type force_password_change: Optional(``True`` | ``False``)
192 :param create_personal_repo_group: Create personal repo group for this user
192 :param create_personal_repo_group: Create personal repo group for this user
193 :type create_personal_repo_group: Optional(``True`` | ``False``)
193 :type create_personal_repo_group: Optional(``True`` | ``False``)
194
194 Example output:
195 Example output:
195
196
196 .. code-block:: bash
197 .. code-block:: bash
@@ -470,3 +471,45 b' def get_user_locks(request, apiuser, use'
470 ret.append(_api_data)
471 ret.append(_api_data)
471
472
472 return ret
473 return ret
474
475
476 @jsonrpc_method()
477 def get_user_audit_logs(request, apiuser, userid=Optional(OAttr('apiuser'))):
478 """
479 Fetches all action logs made by the specified user.
480
481 This command takes the following options:
482
483 :param apiuser: This is filled automatically from the |authtoken|.
484 :type apiuser: AuthUser
485 :param userid: Sets the userid whose list of locked |repos| will be
486 displayed.
487 :type userid: Optional(str or int)
488
489 Example output:
490
491 .. code-block:: bash
492
493 id : <id_given_in_input>
494 result : {
495 [action, action,...]
496 }
497 error : null
498 """
499
500 if not has_superadmin_permission(apiuser):
501 # make sure normal user does not pass someone else userid,
502 # he is not allowed to do that
503 if not isinstance(userid, Optional) and userid != apiuser.user_id:
504 raise JSONRPCError('userid is not the same as your user')
505
506 userid = Optional.extract(userid, evaluate_locals=locals())
507 userid = getattr(userid, 'user_id', userid)
508 user = get_user_or_error(userid)
509
510 ret = []
511
512 # show all user actions
513 for entry in UserModel().get_user_log(user, filter_term=None):
514 ret.append(entry)
515 return ret
@@ -19,11 +19,72 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21
22 from rhodecode.admin.navigation import NavigationRegistry
22 from rhodecode.apps.admin.navigation import NavigationRegistry
23 from rhodecode.config.routing import ADMIN_PREFIX
23 from rhodecode.config.routing import ADMIN_PREFIX
24 from rhodecode.lib.utils2 import str2bool
24 from rhodecode.lib.utils2 import str2bool
25
25
26
26
27 def admin_routes(config):
28 """
29 Admin prefixed routes
30 """
31
32 config.add_route(
33 name='admin_settings_open_source',
34 pattern='/settings/open_source')
35 config.add_route(
36 name='admin_settings_vcs_svn_generate_cfg',
37 pattern='/settings/vcs/svn_generate_cfg')
38
39 config.add_route(
40 name='admin_settings_system',
41 pattern='/settings/system')
42 config.add_route(
43 name='admin_settings_system_update',
44 pattern='/settings/system/updates')
45
46 config.add_route(
47 name='admin_settings_sessions',
48 pattern='/settings/sessions')
49 config.add_route(
50 name='admin_settings_sessions_cleanup',
51 pattern='/settings/sessions/cleanup')
52
53 # users admin
54 config.add_route(
55 name='users',
56 pattern='/users')
57
58 config.add_route(
59 name='users_data',
60 pattern='/users_data')
61
62 # user auth tokens
63 config.add_route(
64 name='edit_user_auth_tokens',
65 pattern='/users/{user_id:\d+}/edit/auth_tokens')
66 config.add_route(
67 name='edit_user_auth_tokens_add',
68 pattern='/users/{user_id:\d+}/edit/auth_tokens/new')
69 config.add_route(
70 name='edit_user_auth_tokens_delete',
71 pattern='/users/{user_id:\d+}/edit/auth_tokens/delete')
72
73 # user groups management
74 config.add_route(
75 name='edit_user_groups_management',
76 pattern='/users/{user_id:\d+}/edit/groups_management')
77
78 config.add_route(
79 name='edit_user_groups_management_updates',
80 pattern='/users/{user_id:\d+}/edit/edit_user_groups_management/updates')
81
82 # user audit logs
83 config.add_route(
84 name='edit_user_audit_logs',
85 pattern='/users/{user_id:\d+}/edit/audit')
86
87
27 def includeme(config):
88 def includeme(config):
28 settings = config.get_settings()
89 settings = config.get_settings()
29
90
@@ -32,26 +93,7 b' def includeme(config):'
32 navigation_registry = NavigationRegistry(labs_active=labs_active)
93 navigation_registry = NavigationRegistry(labs_active=labs_active)
33 config.registry.registerUtility(navigation_registry)
94 config.registry.registerUtility(navigation_registry)
34
95
35 config.add_route(
96 config.include(admin_routes, route_prefix=ADMIN_PREFIX)
36 name='admin_settings_open_source',
37 pattern=ADMIN_PREFIX + '/settings/open_source')
38 config.add_route(
39 name='admin_settings_vcs_svn_generate_cfg',
40 pattern=ADMIN_PREFIX + '/settings/vcs/svn_generate_cfg')
41
42 config.add_route(
43 name='admin_settings_system',
44 pattern=ADMIN_PREFIX + '/settings/system')
45 config.add_route(
46 name='admin_settings_system_update',
47 pattern=ADMIN_PREFIX + '/settings/system/updates')
48
49 config.add_route(
50 name='admin_settings_sessions',
51 pattern=ADMIN_PREFIX + '/settings/sessions')
52 config.add_route(
53 name='admin_settings_sessions_cleanup',
54 pattern=ADMIN_PREFIX + '/settings/sessions/cleanup')
55
97
56 # Scan module for configuration decorators.
98 # Scan module for configuration decorators.
57 config.scan()
99 config.scan()
1 NO CONTENT: file renamed from rhodecode/admin/interfaces.py to rhodecode/apps/admin/interfaces.py
NO CONTENT: file renamed from rhodecode/admin/interfaces.py to rhodecode/apps/admin/interfaces.py
@@ -25,7 +25,7 b' import collections'
25 from pylons import url
25 from pylons import url
26 from zope.interface import implementer
26 from zope.interface import implementer
27
27
28 from rhodecode.admin.interfaces import IAdminNavigationRegistry
28 from rhodecode.apps.admin.interfaces import IAdminNavigationRegistry
29 from rhodecode.lib.utils import get_registry
29 from rhodecode.lib.utils import get_registry
30 from rhodecode.translation import _
30 from rhodecode.translation import _
31
31
1 NO CONTENT: file renamed from rhodecode/admin/views/__init__.py to rhodecode/apps/admin/views/__init__.py
NO CONTENT: file renamed from rhodecode/admin/views/__init__.py to rhodecode/apps/admin/views/__init__.py
@@ -24,15 +24,15 b' import logging'
24 from pylons import tmpl_context as c
24 from pylons import tmpl_context as c
25 from pyramid.view import view_config
25 from pyramid.view import view_config
26
26
27 from rhodecode.admin.views.base import AdminSettingsView
27 from rhodecode.apps._base import BaseAppView
28 from rhodecode.admin.navigation import navigation_list
28 from rhodecode.apps.admin.navigation import navigation_list
29 from rhodecode.lib.auth import (LoginRequired, HasPermissionAllDecorator)
29 from rhodecode.lib.auth import (LoginRequired, HasPermissionAllDecorator)
30 from rhodecode.lib.utils import read_opensource_licenses
30 from rhodecode.lib.utils import read_opensource_licenses
31
31
32 log = logging.getLogger(__name__)
32 log = logging.getLogger(__name__)
33
33
34
34
35 class OpenSourceLicensesAdminSettingsView(AdminSettingsView):
35 class OpenSourceLicensesAdminSettingsView(BaseAppView):
36
36
37 @LoginRequired()
37 @LoginRequired()
38 @HasPermissionAllDecorator('hg.admin')
38 @HasPermissionAllDecorator('hg.admin')
@@ -24,9 +24,8 b' from pylons import tmpl_context as c'
24 from pyramid.view import view_config
24 from pyramid.view import view_config
25 from pyramid.httpexceptions import HTTPFound
25 from pyramid.httpexceptions import HTTPFound
26
26
27 from rhodecode.translation import _
27 from rhodecode.apps._base import BaseAppView
28
28 from rhodecode.apps.admin.navigation import navigation_list
29 from rhodecode.admin.views.base import AdminSettingsView
30 from rhodecode.lib.auth import (
29 from rhodecode.lib.auth import (
31 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
30 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
32 from rhodecode.lib.utils2 import safe_int
31 from rhodecode.lib.utils2 import safe_int
@@ -34,13 +33,10 b' from rhodecode.lib import system_info'
34 from rhodecode.lib import user_sessions
33 from rhodecode.lib import user_sessions
35
34
36
35
37 from rhodecode.admin.navigation import navigation_list
38
39
40 log = logging.getLogger(__name__)
36 log = logging.getLogger(__name__)
41
37
42
38
43 class AdminSessionSettingsView(AdminSettingsView):
39 class AdminSessionSettingsView(BaseAppView):
44
40
45 @LoginRequired()
41 @LoginRequired()
46 @HasPermissionAllDecorator('hg.admin')
42 @HasPermissionAllDecorator('hg.admin')
@@ -22,16 +22,15 b' import logging'
22
22
23 from pyramid.view import view_config
23 from pyramid.view import view_config
24
24
25 from rhodecode.svn_support.utils import generate_mod_dav_svn_config
25 from rhodecode.apps._base import BaseAppView
26
26 from rhodecode.apps.svn_support.utils import generate_mod_dav_svn_config
27 from rhodecode.admin.views.base import AdminSettingsView
28 from rhodecode.lib.auth import (
27 from rhodecode.lib.auth import (
29 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
28 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
30
29
31 log = logging.getLogger(__name__)
30 log = logging.getLogger(__name__)
32
31
33
32
34 class SvnConfigAdminSettingsView(AdminSettingsView):
33 class SvnConfigAdminSettingsView(BaseAppView):
35
34
36 @LoginRequired()
35 @LoginRequired()
37 @CSRFRequired()
36 @CSRFRequired()
@@ -26,20 +26,19 b' from pylons import tmpl_context as c'
26 from pyramid.view import view_config
26 from pyramid.view import view_config
27
27
28 import rhodecode
28 import rhodecode
29 from rhodecode.apps._base import BaseAppView
30 from rhodecode.apps.admin.navigation import navigation_list
29 from rhodecode.lib import helpers as h
31 from rhodecode.lib import helpers as h
30 from rhodecode.lib.auth import (LoginRequired, HasPermissionAllDecorator)
32 from rhodecode.lib.auth import (LoginRequired, HasPermissionAllDecorator)
31 from rhodecode.lib.utils2 import str2bool
33 from rhodecode.lib.utils2 import str2bool
32 from rhodecode.lib import system_info
34 from rhodecode.lib import system_info
33 from rhodecode.lib.ext_json import json
35 from rhodecode.lib.ext_json import json
34
35 from rhodecode.admin.views.base import AdminSettingsView
36 from rhodecode.admin.navigation import navigation_list
37 from rhodecode.model.settings import SettingsModel
36 from rhodecode.model.settings import SettingsModel
38
37
39 log = logging.getLogger(__name__)
38 log = logging.getLogger(__name__)
40
39
41
40
42 class AdminSystemInfoSettingsView(AdminSettingsView):
41 class AdminSystemInfoSettingsView(BaseAppView):
43
42
44 @staticmethod
43 @staticmethod
45 def get_update_data(update_url):
44 def get_update_data(update_url):
@@ -107,6 +106,8 b' class AdminSystemInfoSettingsView(AdminS'
107 (_('RhodeCode Server IP'), val('server')['server_ip'], state('server')),
106 (_('RhodeCode Server IP'), val('server')['server_ip'], state('server')),
108 (_('RhodeCode Server ID'), val('server')['server_id'], state('server')),
107 (_('RhodeCode Server ID'), val('server')['server_id'], state('server')),
109 (_('RhodeCode Configuration'), val('rhodecode_config')['path'], state('rhodecode_config')),
108 (_('RhodeCode Configuration'), val('rhodecode_config')['path'], state('rhodecode_config')),
109 (_('Workers'), val('rhodecode_config')['config']['server:main'].get('workers', '?'), state('rhodecode_config')),
110 (_('Worker Type'), val('rhodecode_config')['config']['server:main'].get('worker_class', 'sync'), state('rhodecode_config')),
110 ('', '', ''), # spacer
111 ('', '', ''), # spacer
111
112
112 # Database
113 # Database
@@ -122,7 +123,7 b' class AdminSystemInfoSettingsView(AdminS'
122 ('', '', ''), # spacer
123 ('', '', ''), # spacer
123
124
124 # Systems stats
125 # Systems stats
125 (_('CPU'), val('cpu'), state('cpu')),
126 (_('CPU'), val('cpu')['text'], state('cpu')),
126 (_('Load'), val('load')['text'], state('load')),
127 (_('Load'), val('load')['text'], state('load')),
127 (_('Memory'), val('memory')['text'], state('memory')),
128 (_('Memory'), val('memory')['text'], state('memory')),
128 (_('Uptime'), val('uptime')['text'], state('uptime')),
129 (_('Uptime'), val('uptime')['text'], state('uptime')),
@@ -85,4 +85,6 b' def includeme(config):'
85 config.add_route(
85 config.add_route(
86 name='channelstream_proxy',
86 name='channelstream_proxy',
87 pattern=settings.get('channelstream.proxy_path') or '/_channelstream')
87 pattern=settings.get('channelstream.proxy_path') or '/_channelstream')
88 config.scan('rhodecode.channelstream')
88
89 # Scan module for configuration decorators.
90 config.scan()
1 NO CONTENT: file renamed from rhodecode/channelstream/views.py to rhodecode/apps/channelstream/views.py
NO CONTENT: file renamed from rhodecode/channelstream/views.py to rhodecode/apps/channelstream/views.py
1 NO CONTENT: file renamed from rhodecode/login/__init__.py to rhodecode/apps/login/__init__.py
NO CONTENT: file renamed from rhodecode/login/__init__.py to rhodecode/apps/login/__init__.py
1 NO CONTENT: file renamed from rhodecode/login/tests/__init__.py to rhodecode/apps/login/tests/__init__.py
NO CONTENT: file renamed from rhodecode/login/tests/__init__.py to rhodecode/apps/login/tests/__init__.py
@@ -22,8 +22,9 b''
22 import mock
22 import mock
23 import pytest
23 import pytest
24
24
25 from rhodecode.apps.login.views import LoginView, CaptchaData
25 from rhodecode.config.routing import ADMIN_PREFIX
26 from rhodecode.config.routing import ADMIN_PREFIX
26 from rhodecode.login.views import LoginView, CaptchaData
27 from rhodecode.lib.utils2 import AttributeDict
27 from rhodecode.model.settings import SettingsModel
28 from rhodecode.model.settings import SettingsModel
28 from rhodecode.tests.utils import AssertResponse
29 from rhodecode.tests.utils import AssertResponse
29
30
@@ -40,7 +41,7 b' class RhodeCodeSetting(object):'
40 model.create_or_update_setting(name=self.name, val=self.value)
41 model.create_or_update_setting(name=self.name, val=self.value)
41 return self
42 return self
42
43
43 def __exit__(self, type, value, traceback):
44 def __exit__(self, exc_type, exc_val, exc_tb):
44 model = SettingsModel()
45 model = SettingsModel()
45 if self.old_setting:
46 if self.old_setting:
46 model.create_or_update_setting(
47 model.create_or_update_setting(
@@ -57,8 +58,12 b' class TestRegisterCaptcha(object):'
57 ('privkey', '', CaptchaData(True, 'privkey', '')),
58 ('privkey', '', CaptchaData(True, 'privkey', '')),
58 ('privkey', 'pubkey', CaptchaData(True, 'privkey', 'pubkey')),
59 ('privkey', 'pubkey', CaptchaData(True, 'privkey', 'pubkey')),
59 ])
60 ])
60 def test_get_captcha_data(self, private_key, public_key, expected, db):
61 def test_get_captcha_data(self, private_key, public_key, expected, db,
61 login_view = LoginView(mock.Mock(), mock.Mock())
62 request_stub, user_util):
63 request_stub.user = user_util.create_user().AuthUser
64 request_stub.matched_route = AttributeDict({'name': 'login'})
65 login_view = LoginView(mock.Mock(), request_stub)
66
62 with RhodeCodeSetting('captcha_private_key', private_key):
67 with RhodeCodeSetting('captcha_private_key', private_key):
63 with RhodeCodeSetting('captcha_public_key', public_key):
68 with RhodeCodeSetting('captcha_public_key', public_key):
64 captcha = login_view._get_captcha_data()
69 captcha = login_view._get_captcha_data()
@@ -92,7 +97,7 b' class TestRegisterCaptcha(object):'
92 assertr.no_element_exists('#recaptcha_field')
97 assertr.no_element_exists('#recaptcha_field')
93
98
94 @pytest.mark.parametrize('valid', [False, True])
99 @pytest.mark.parametrize('valid', [False, True])
95 @mock.patch('rhodecode.login.views.submit')
100 @mock.patch('rhodecode.apps.login.views.submit')
96 @mock.patch.object(LoginView, '_get_captcha_data')
101 @mock.patch.object(LoginView, '_get_captcha_data')
97 def test_register_with_active_captcha(
102 def test_register_with_active_captcha(
98 self, m_get_captcha_data, m_submit, valid, app, csrf_token):
103 self, m_get_captcha_data, m_submit, valid, app, csrf_token):
@@ -18,6 +18,7 b''
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import time
21 import collections
22 import collections
22 import datetime
23 import datetime
23 import formencode
24 import formencode
@@ -29,6 +30,7 b' from pyramid.httpexceptions import HTTPF'
29 from pyramid.view import view_config
30 from pyramid.view import view_config
30 from recaptcha.client.captcha import submit
31 from recaptcha.client.captcha import submit
31
32
33 from rhodecode.apps._base import BaseAppView
32 from rhodecode.authentication.base import authenticate, HTTP_TYPE
34 from rhodecode.authentication.base import authenticate, HTTP_TYPE
33 from rhodecode.events import UserRegistered
35 from rhodecode.events import UserRegistered
34 from rhodecode.lib import helpers as h
36 from rhodecode.lib import helpers as h
@@ -37,9 +39,10 b' from rhodecode.lib.auth import ('
37 from rhodecode.lib.base import get_ip_addr
39 from rhodecode.lib.base import get_ip_addr
38 from rhodecode.lib.exceptions import UserCreationError
40 from rhodecode.lib.exceptions import UserCreationError
39 from rhodecode.lib.utils2 import safe_str
41 from rhodecode.lib.utils2 import safe_str
40 from rhodecode.model.db import User
42 from rhodecode.model.db import User, UserApiKeys
41 from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
43 from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
42 from rhodecode.model.meta import Session
44 from rhodecode.model.meta import Session
45 from rhodecode.model.auth_token import AuthTokenModel
43 from rhodecode.model.settings import SettingsModel
46 from rhodecode.model.settings import SettingsModel
44 from rhodecode.model.user import UserModel
47 from rhodecode.model.user import UserModel
45 from rhodecode.translation import _
48 from rhodecode.translation import _
@@ -103,20 +106,13 b' def get_came_from(request):'
103 return came_from or url('home')
106 return came_from or url('home')
104
107
105
108
106 class LoginView(object):
109 class LoginView(BaseAppView):
107
110
108 def __init__(self, context, request):
111 def load_default_context(self):
109 self.request = request
112 c = self._get_local_tmpl_context()
110 self.context = context
113 c.came_from = get_came_from(self.request)
111 self.session = request.session
114 self._register_global_c(c)
112 self._rhodecode_user = request.user
115 return c
113
114 def _get_template_context(self):
115 return {
116 'came_from': get_came_from(self.request),
117 'defaults': {},
118 'errors': {},
119 }
120
116
121 def _get_captcha_data(self):
117 def _get_captcha_data(self):
122 settings = SettingsModel().get_all_settings()
118 settings = SettingsModel().get_all_settings()
@@ -130,12 +126,13 b' class LoginView(object):'
130 route_name='login', request_method='GET',
126 route_name='login', request_method='GET',
131 renderer='rhodecode:templates/login.mako')
127 renderer='rhodecode:templates/login.mako')
132 def login(self):
128 def login(self):
133 came_from = get_came_from(self.request)
129 c = self.load_default_context()
134 user = self.request.user
130 auth_user = self._rhodecode_user
135
131
136 # redirect if already logged in
132 # redirect if already logged in
137 if user.is_authenticated and not user.is_default and user.ip_allowed:
133 if (auth_user.is_authenticated and
138 raise HTTPFound(came_from)
134 not auth_user.is_default and auth_user.ip_allowed):
135 raise HTTPFound(c.came_from)
139
136
140 # check if we use headers plugin, and try to login using it.
137 # check if we use headers plugin, and try to login using it.
141 try:
138 try:
@@ -145,18 +142,18 b' class LoginView(object):'
145 if auth_info:
142 if auth_info:
146 headers = _store_user_in_session(
143 headers = _store_user_in_session(
147 self.session, auth_info.get('username'))
144 self.session, auth_info.get('username'))
148 raise HTTPFound(came_from, headers=headers)
145 raise HTTPFound(c.came_from, headers=headers)
149 except UserCreationError as e:
146 except UserCreationError as e:
150 log.error(e)
147 log.error(e)
151 self.session.flash(e, queue='error')
148 self.session.flash(e, queue='error')
152
149
153 return self._get_template_context()
150 return self._get_template_context(c)
154
151
155 @view_config(
152 @view_config(
156 route_name='login', request_method='POST',
153 route_name='login', request_method='POST',
157 renderer='rhodecode:templates/login.mako')
154 renderer='rhodecode:templates/login.mako')
158 def login_post(self):
155 def login_post(self):
159 came_from = get_came_from(self.request)
156 c = self.load_default_context()
160
157
161 login_form = LoginForm()()
158 login_form = LoginForm()()
162
159
@@ -168,13 +165,13 b' class LoginView(object):'
168 self.session,
165 self.session,
169 username=form_result['username'],
166 username=form_result['username'],
170 remember=form_result['remember'])
167 remember=form_result['remember'])
171 log.debug('Redirecting to "%s" after login.', came_from)
168 log.debug('Redirecting to "%s" after login.', c.came_from)
172 raise HTTPFound(came_from, headers=headers)
169 raise HTTPFound(c.came_from, headers=headers)
173 except formencode.Invalid as errors:
170 except formencode.Invalid as errors:
174 defaults = errors.value
171 defaults = errors.value
175 # remove password from filling in form again
172 # remove password from filling in form again
176 defaults.pop('password', None)
173 defaults.pop('password', None)
177 render_ctx = self._get_template_context()
174 render_ctx = self._get_template_context(c)
178 render_ctx.update({
175 render_ctx.update({
179 'errors': errors.error_dict,
176 'errors': errors.error_dict,
180 'defaults': defaults,
177 'defaults': defaults,
@@ -187,13 +184,13 b' class LoginView(object):'
187 # with user creation, explanation should be provided in
184 # with user creation, explanation should be provided in
188 # Exception itself
185 # Exception itself
189 self.session.flash(e, queue='error')
186 self.session.flash(e, queue='error')
190 return self._get_template_context()
187 return self._get_template_context(c)
191
188
192 @CSRFRequired()
189 @CSRFRequired()
193 @view_config(route_name='logout', request_method='POST')
190 @view_config(route_name='logout', request_method='POST')
194 def logout(self):
191 def logout(self):
195 user = self.request.user
192 auth_user = self._rhodecode_user
196 log.info('Deleting session for user: `%s`', user)
193 log.info('Deleting session for user: `%s`', auth_user)
197 self.session.delete()
194 self.session.delete()
198 return HTTPFound(url('home'))
195 return HTTPFound(url('home'))
199
196
@@ -203,6 +200,7 b' class LoginView(object):'
203 route_name='register', request_method='GET',
200 route_name='register', request_method='GET',
204 renderer='rhodecode:templates/register.mako',)
201 renderer='rhodecode:templates/register.mako',)
205 def register(self, defaults=None, errors=None):
202 def register(self, defaults=None, errors=None):
203 c = self.load_default_context()
206 defaults = defaults or {}
204 defaults = defaults or {}
207 errors = errors or {}
205 errors = errors or {}
208
206
@@ -212,7 +210,7 b' class LoginView(object):'
212 auto_active = 'hg.register.auto_activate' in User.get_default_user()\
210 auto_active = 'hg.register.auto_activate' in User.get_default_user()\
213 .AuthUser.permissions['global']
211 .AuthUser.permissions['global']
214
212
215 render_ctx = self._get_template_context()
213 render_ctx = self._get_template_context(c)
216 render_ctx.update({
214 render_ctx.update({
217 'defaults': defaults,
215 'defaults': defaults,
218 'errors': errors,
216 'errors': errors,
@@ -289,17 +287,24 b' class LoginView(object):'
289 'errors': {},
287 'errors': {},
290 }
288 }
291
289
290 # always send implicit message to prevent from discovery of
291 # matching emails
292 msg = _('If such email exists, a password reset link was sent to it.')
293
292 if self.request.POST:
294 if self.request.POST:
295 if h.HasPermissionAny('hg.password_reset.disabled')():
296 _email = self.request.POST.get('email', '')
297 log.error('Failed attempt to reset password for `%s`.', _email)
298 self.session.flash(_('Password reset has been disabled.'),
299 queue='error')
300 return HTTPFound(self.request.route_path('reset_password'))
301
293 password_reset_form = PasswordResetForm()()
302 password_reset_form = PasswordResetForm()()
294 try:
303 try:
295 form_result = password_reset_form.to_python(
304 form_result = password_reset_form.to_python(
296 self.request.params)
305 self.request.params)
297 if h.HasPermissionAny('hg.password_reset.disabled')():
306 user_email = form_result['email']
298 log.error('Failed attempt to reset password for %s.', form_result['email'] )
307
299 self.session.flash(
300 _('Password reset has been disabled.'),
301 queue='error')
302 return HTTPFound(self.request.route_path('reset_password'))
303 if captcha.active:
308 if captcha.active:
304 response = submit(
309 response = submit(
305 self.request.params.get('recaptcha_challenge_field'),
310 self.request.params.get('recaptcha_challenge_field'),
@@ -310,43 +315,76 b' class LoginView(object):'
310 _value = form_result
315 _value = form_result
311 _msg = _('Bad captcha')
316 _msg = _('Bad captcha')
312 error_dict = {'recaptcha_field': _msg}
317 error_dict = {'recaptcha_field': _msg}
313 raise formencode.Invalid(_msg, _value, None,
318 raise formencode.Invalid(
314 error_dict=error_dict)
319 _msg, _value, None, error_dict=error_dict)
315
320
316 # Generate reset URL and send mail.
321 # Generate reset URL and send mail.
317 user_email = form_result['email']
318 user = User.get_by_email(user_email)
322 user = User.get_by_email(user_email)
323
324 # generate password reset token that expires in 10minutes
325 desc = 'Generated token for password reset from {}'.format(
326 datetime.datetime.now().isoformat())
327 reset_token = AuthTokenModel().create(
328 user, lifetime=10,
329 description=desc,
330 role=UserApiKeys.ROLE_PASSWORD_RESET)
331 Session().commit()
332
333 log.debug('Successfully created password recovery token')
319 password_reset_url = self.request.route_url(
334 password_reset_url = self.request.route_url(
320 'reset_password_confirmation',
335 'reset_password_confirmation',
321 _query={'key': user.api_key})
336 _query={'key': reset_token.api_key})
322 UserModel().reset_password_link(
337 UserModel().reset_password_link(
323 form_result, password_reset_url)
338 form_result, password_reset_url)
324
325 # Display success message and redirect.
339 # Display success message and redirect.
326 self.session.flash(
340 self.session.flash(msg, queue='success')
327 _('Your password reset link was sent'),
341 return HTTPFound(self.request.route_path('reset_password'))
328 queue='success')
329 return HTTPFound(self.request.route_path('login'))
330
342
331 except formencode.Invalid as errors:
343 except formencode.Invalid as errors:
332 render_ctx.update({
344 render_ctx.update({
333 'defaults': errors.value,
345 'defaults': errors.value,
334 'errors': errors.error_dict,
346 'errors': errors.error_dict,
335 })
347 })
348 if not self.request.params.get('email'):
349 # case of empty email, we want to report that
350 return render_ctx
351
352 if 'recaptcha_field' in errors.error_dict:
353 # case of failed captcha
354 return render_ctx
355
356 log.debug('faking response on invalid password reset')
357 # make this take 2s, to prevent brute forcing.
358 time.sleep(2)
359 self.session.flash(msg, queue='success')
360 return HTTPFound(self.request.route_path('reset_password'))
336
361
337 return render_ctx
362 return render_ctx
338
363
339 @view_config(route_name='reset_password_confirmation',
364 @view_config(route_name='reset_password_confirmation',
340 request_method='GET')
365 request_method='GET')
341 def password_reset_confirmation(self):
366 def password_reset_confirmation(self):
367
342 if self.request.GET and self.request.GET.get('key'):
368 if self.request.GET and self.request.GET.get('key'):
369 # make this take 2s, to prevent brute forcing.
370 time.sleep(2)
371
372 token = AuthTokenModel().get_auth_token(
373 self.request.GET.get('key'))
374
375 # verify token is the correct role
376 if token is None or token.role != UserApiKeys.ROLE_PASSWORD_RESET:
377 log.debug('Got token with role:%s expected is %s',
378 getattr(token, 'role', 'EMPTY_TOKEN'),
379 UserApiKeys.ROLE_PASSWORD_RESET)
380 self.session.flash(
381 _('Given reset token is invalid'), queue='error')
382 return HTTPFound(self.request.route_path('reset_password'))
383
343 try:
384 try:
344 user = User.get_by_auth_token(self.request.GET.get('key'))
385 owner = token.user
345 password_reset_url = self.request.route_url(
386 data = {'email': owner.email, 'token': token.api_key}
346 'reset_password_confirmation',
387 UserModel().reset_password(data)
347 _query={'key': user.api_key})
348 data = {'email': user.email}
349 UserModel().reset_password(data, password_reset_url)
350 self.session.flash(
388 self.session.flash(
351 _('Your password reset was successful, '
389 _('Your password reset was successful, '
352 'a new password has been sent to your email'),
390 'a new password has been sent to your email'),
1 NO CONTENT: file renamed from rhodecode/svn_support/__init__.py to rhodecode/apps/svn_support/__init__.py
NO CONTENT: file renamed from rhodecode/svn_support/__init__.py to rhodecode/apps/svn_support/__init__.py
1 NO CONTENT: file renamed from rhodecode/svn_support/config_keys.py to rhodecode/apps/svn_support/config_keys.py
NO CONTENT: file renamed from rhodecode/svn_support/config_keys.py to rhodecode/apps/svn_support/config_keys.py
1 NO CONTENT: file renamed from rhodecode/svn_support/events.py to rhodecode/apps/svn_support/events.py
NO CONTENT: file renamed from rhodecode/svn_support/events.py to rhodecode/apps/svn_support/events.py
1 NO CONTENT: file renamed from rhodecode/svn_support/subscribers.py to rhodecode/apps/svn_support/subscribers.py
NO CONTENT: file renamed from rhodecode/svn_support/subscribers.py to rhodecode/apps/svn_support/subscribers.py
1 NO CONTENT: file renamed from rhodecode/svn_support/templates/mod-dav-svn.conf.mako to rhodecode/apps/svn_support/templates/mod-dav-svn.conf.mako
NO CONTENT: file renamed from rhodecode/svn_support/templates/mod-dav-svn.conf.mako to rhodecode/apps/svn_support/templates/mod-dav-svn.conf.mako
@@ -25,7 +25,7 b' import re'
25
25
26 from pyramid import testing
26 from pyramid import testing
27
27
28 from rhodecode.svn_support import utils
28 from rhodecode.apps.svn_support import utils
29
29
30
30
31 class TestModDavSvnConfig(object):
31 class TestModDavSvnConfig(object):
@@ -81,7 +81,7 b' def _render_mod_dav_svn_config('
81 }
81 }
82
82
83 # Render the configuration template to string.
83 # Render the configuration template to string.
84 template = 'rhodecode:svn_support/templates/mod-dav-svn.conf.mako'
84 template = 'rhodecode:apps/svn_support/templates/mod-dav-svn.conf.mako'
85 return render(template, context)
85 return render(template, context)
86
86
87
87
@@ -91,6 +91,11 b' class RhodeCodeAuthPluginBase(object):'
91 # set on authenticate() method and via set_auth_type func.
91 # set on authenticate() method and via set_auth_type func.
92 auth_type = None
92 auth_type = None
93
93
94 # set on authenticate() method and via set_calling_scope_repo, this is a
95 # calling scope repository when doing authentication most likely on VCS
96 # operations
97 acl_repo_name = None
98
94 # List of setting names to store encrypted. Plugins may override this list
99 # List of setting names to store encrypted. Plugins may override this list
95 # to store settings encrypted.
100 # to store settings encrypted.
96 _settings_encrypted = []
101 _settings_encrypted = []
@@ -268,6 +273,9 b' class RhodeCodeAuthPluginBase(object):'
268 def set_auth_type(self, auth_type):
273 def set_auth_type(self, auth_type):
269 self.auth_type = auth_type
274 self.auth_type = auth_type
270
275
276 def set_calling_scope_repo(self, acl_repo_name):
277 self.acl_repo_name = acl_repo_name
278
271 def allows_authentication_from(
279 def allows_authentication_from(
272 self, user, allows_non_existing_user=True,
280 self, user, allows_non_existing_user=True,
273 allowed_auth_plugins=None, allowed_auth_sources=None):
281 allowed_auth_plugins=None, allowed_auth_sources=None):
@@ -332,6 +340,8 b' class RhodeCodeAuthPluginBase(object):'
332 log.debug('provided username:`%s` is empty skipping...', username)
340 log.debug('provided username:`%s` is empty skipping...', username)
333 if not user:
341 if not user:
334 log.debug('User `%s` not found in database', username)
342 log.debug('User `%s` not found in database', username)
343 else:
344 log.debug('Got DB user:%s', user)
335 return user
345 return user
336
346
337 def user_activation_state(self):
347 def user_activation_state(self):
@@ -518,7 +528,7 b' def get_auth_cache_manager(custom_ttl=No'
518
528
519
529
520 def authenticate(username, password, environ=None, auth_type=None,
530 def authenticate(username, password, environ=None, auth_type=None,
521 skip_missing=False, registry=None):
531 skip_missing=False, registry=None, acl_repo_name=None):
522 """
532 """
523 Authentication function used for access control,
533 Authentication function used for access control,
524 It tries to authenticate based on enabled authentication modules.
534 It tries to authenticate based on enabled authentication modules.
@@ -538,6 +548,7 b' def authenticate(username, password, env'
538 authn_registry = get_authn_registry(registry)
548 authn_registry = get_authn_registry(registry)
539 for plugin in authn_registry.get_plugins_for_authentication():
549 for plugin in authn_registry.get_plugins_for_authentication():
540 plugin.set_auth_type(auth_type)
550 plugin.set_auth_type(auth_type)
551 plugin.set_calling_scope_repo(acl_repo_name)
541 user = plugin.get_user(username)
552 user = plugin.get_user(username)
542 display_user = user.username if user else username
553 display_user = user.username if user else username
543
554
@@ -627,3 +638,21 b' def authenticate(username, password, env'
627 log.debug("User `%s` failed to authenticate against %s",
638 log.debug("User `%s` failed to authenticate against %s",
628 display_user, plugin.get_id())
639 display_user, plugin.get_id())
629 return None
640 return None
641
642
643 def chop_at(s, sub, inclusive=False):
644 """Truncate string ``s`` at the first occurrence of ``sub``.
645
646 If ``inclusive`` is true, truncate just after ``sub`` rather than at it.
647
648 >>> chop_at("plutocratic brats", "rat")
649 'plutoc'
650 >>> chop_at("plutocratic brats", "rat", True)
651 'plutocrat'
652 """
653 pos = s.find(sub)
654 if pos == -1:
655 return s
656 if inclusive:
657 return s[:pos+len(sub)]
658 return s[:pos]
@@ -28,10 +28,9 b' import base64'
28 import logging
28 import logging
29 import urllib2
29 import urllib2
30
30
31 from pylons.i18n.translation import lazy_ugettext as _
31 from rhodecode.translation import _
32 from sqlalchemy.ext.hybrid import hybrid_property
32 from rhodecode.authentication.base import (
33
33 RhodeCodeExternalAuthPlugin, hybrid_property)
34 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
35 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
34 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
36 from rhodecode.authentication.routes import AuthnPluginResourceBase
35 from rhodecode.authentication.routes import AuthnPluginResourceBase
37 from rhodecode.lib.colander_utils import strip_whitespace
36 from rhodecode.lib.colander_utils import strip_whitespace
@@ -21,15 +21,14 b''
21 import colander
21 import colander
22 import logging
22 import logging
23
23
24 from sqlalchemy.ext.hybrid import hybrid_property
24 from rhodecode.translation import _
25
25 from rhodecode.authentication.base import (
26 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
26 RhodeCodeExternalAuthPlugin, hybrid_property)
27 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
27 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
28 from rhodecode.authentication.routes import AuthnPluginResourceBase
28 from rhodecode.authentication.routes import AuthnPluginResourceBase
29 from rhodecode.lib.colander_utils import strip_whitespace
29 from rhodecode.lib.colander_utils import strip_whitespace
30 from rhodecode.lib.utils2 import str2bool, safe_unicode
30 from rhodecode.lib.utils2 import str2bool, safe_unicode
31 from rhodecode.model.db import User
31 from rhodecode.model.db import User
32 from rhodecode.translation import _
33
32
34
33
35 log = logging.getLogger(__name__)
34 log = logging.getLogger(__name__)
@@ -30,10 +30,9 b' import rhodecode'
30 import urllib
30 import urllib
31 import urllib2
31 import urllib2
32
32
33 from pylons.i18n.translation import lazy_ugettext as _
33 from rhodecode.translation import _
34 from sqlalchemy.ext.hybrid import hybrid_property
34 from rhodecode.authentication.base import (
35
35 RhodeCodeExternalAuthPlugin, hybrid_property)
36 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
37 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
36 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
38 from rhodecode.authentication.routes import AuthnPluginResourceBase
37 from rhodecode.authentication.routes import AuthnPluginResourceBase
39 from rhodecode.lib.colander_utils import strip_whitespace
38 from rhodecode.lib.colander_utils import strip_whitespace
@@ -27,10 +27,9 b' import colander'
27 import logging
27 import logging
28 import traceback
28 import traceback
29
29
30 from pylons.i18n.translation import lazy_ugettext as _
30 from rhodecode.translation import _
31 from sqlalchemy.ext.hybrid import hybrid_property
31 from rhodecode.authentication.base import (
32
32 RhodeCodeExternalAuthPlugin, chop_at, hybrid_property)
33 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
34 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
33 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
35 from rhodecode.authentication.routes import AuthnPluginResourceBase
34 from rhodecode.authentication.routes import AuthnPluginResourceBase
36 from rhodecode.lib.colander_utils import strip_whitespace
35 from rhodecode.lib.colander_utils import strip_whitespace
@@ -72,14 +71,15 b' class LdapSettingsSchema(AuthnPluginSett'
72 host = colander.SchemaNode(
71 host = colander.SchemaNode(
73 colander.String(),
72 colander.String(),
74 default='',
73 default='',
75 description=_('Host of the LDAP Server'),
74 description=_('Host of the LDAP Server \n'
75 '(e.g., 192.168.2.154, or ldap-server.domain.com'),
76 preparer=strip_whitespace,
76 preparer=strip_whitespace,
77 title=_('LDAP Host'),
77 title=_('LDAP Host'),
78 widget='string')
78 widget='string')
79 port = colander.SchemaNode(
79 port = colander.SchemaNode(
80 colander.Int(),
80 colander.Int(),
81 default=389,
81 default=389,
82 description=_('Port that the LDAP server is listening on'),
82 description=_('Custom port that the LDAP server is listening on. Default: 389'),
83 preparer=strip_whitespace,
83 preparer=strip_whitespace,
84 title=_('Port'),
84 title=_('Port'),
85 validator=colander.Range(min=0, max=65536),
85 validator=colander.Range(min=0, max=65536),
@@ -87,7 +87,9 b' class LdapSettingsSchema(AuthnPluginSett'
87 dn_user = colander.SchemaNode(
87 dn_user = colander.SchemaNode(
88 colander.String(),
88 colander.String(),
89 default='',
89 default='',
90 description=_('User to connect to LDAP'),
90 description=_('Optional user DN/account to connect to LDAP if authentication is required. \n'
91 'e.g., cn=admin,dc=mydomain,dc=com, or '
92 'uid=root,cn=users,dc=mydomain,dc=com, or admin@mydomain.com'),
91 missing='',
93 missing='',
92 preparer=strip_whitespace,
94 preparer=strip_whitespace,
93 title=_('Account'),
95 title=_('Account'),
@@ -95,7 +97,7 b' class LdapSettingsSchema(AuthnPluginSett'
95 dn_pass = colander.SchemaNode(
97 dn_pass = colander.SchemaNode(
96 colander.String(),
98 colander.String(),
97 default='',
99 default='',
98 description=_('Password to connect to LDAP'),
100 description=_('Password to authenticate for given user DN.'),
99 missing='',
101 missing='',
100 preparer=strip_whitespace,
102 preparer=strip_whitespace,
101 title=_('Password'),
103 title=_('Password'),
@@ -117,7 +119,9 b' class LdapSettingsSchema(AuthnPluginSett'
117 base_dn = colander.SchemaNode(
119 base_dn = colander.SchemaNode(
118 colander.String(),
120 colander.String(),
119 default='',
121 default='',
120 description=_('Base DN to search (e.g., dc=mydomain,dc=com)'),
122 description=_('Base DN to search. Dynamic bind is supported. Add `$login` marker '
123 'in it to be replaced with current user credentials \n'
124 '(e.g., dc=mydomain,dc=com, or ou=Users,dc=mydomain,dc=com)'),
121 missing='',
125 missing='',
122 preparer=strip_whitespace,
126 preparer=strip_whitespace,
123 title=_('Base DN'),
127 title=_('Base DN'),
@@ -125,22 +129,25 b' class LdapSettingsSchema(AuthnPluginSett'
125 filter = colander.SchemaNode(
129 filter = colander.SchemaNode(
126 colander.String(),
130 colander.String(),
127 default='',
131 default='',
128 description=_('Filter to narrow results (e.g., ou=Users, etc)'),
132 description=_('Filter to narrow results \n'
133 '(e.g., (&(objectCategory=Person)(objectClass=user)), or \n'
134 '(memberof=cn=rc-login,ou=groups,ou=company,dc=mydomain,dc=com)))'),
129 missing='',
135 missing='',
130 preparer=strip_whitespace,
136 preparer=strip_whitespace,
131 title=_('LDAP Search Filter'),
137 title=_('LDAP Search Filter'),
132 widget='string')
138 widget='string')
139
133 search_scope = colander.SchemaNode(
140 search_scope = colander.SchemaNode(
134 colander.String(),
141 colander.String(),
135 default=search_scope_choices[0],
142 default=search_scope_choices[2],
136 description=_('How deep to search LDAP'),
143 description=_('How deep to search LDAP. If unsure set to SUBTREE'),
137 title=_('LDAP Search Scope'),
144 title=_('LDAP Search Scope'),
138 validator=colander.OneOf(search_scope_choices),
145 validator=colander.OneOf(search_scope_choices),
139 widget='select')
146 widget='select')
140 attr_login = colander.SchemaNode(
147 attr_login = colander.SchemaNode(
141 colander.String(),
148 colander.String(),
142 default='',
149 default='uid',
143 description=_('LDAP Attribute to map to user name'),
150 description=_('LDAP Attribute to map to user name (e.g., uid, or sAMAccountName)'),
144 preparer=strip_whitespace,
151 preparer=strip_whitespace,
145 title=_('Login Attribute'),
152 title=_('Login Attribute'),
146 missing_msg=_('The LDAP Login attribute of the CN must be specified'),
153 missing_msg=_('The LDAP Login attribute of the CN must be specified'),
@@ -148,7 +155,7 b' class LdapSettingsSchema(AuthnPluginSett'
148 attr_firstname = colander.SchemaNode(
155 attr_firstname = colander.SchemaNode(
149 colander.String(),
156 colander.String(),
150 default='',
157 default='',
151 description=_('LDAP Attribute to map to first name'),
158 description=_('LDAP Attribute to map to first name (e.g., givenName)'),
152 missing='',
159 missing='',
153 preparer=strip_whitespace,
160 preparer=strip_whitespace,
154 title=_('First Name Attribute'),
161 title=_('First Name Attribute'),
@@ -156,7 +163,7 b' class LdapSettingsSchema(AuthnPluginSett'
156 attr_lastname = colander.SchemaNode(
163 attr_lastname = colander.SchemaNode(
157 colander.String(),
164 colander.String(),
158 default='',
165 default='',
159 description=_('LDAP Attribute to map to last name'),
166 description=_('LDAP Attribute to map to last name (e.g., sn)'),
160 missing='',
167 missing='',
161 preparer=strip_whitespace,
168 preparer=strip_whitespace,
162 title=_('Last Name Attribute'),
169 title=_('Last Name Attribute'),
@@ -164,7 +171,9 b' class LdapSettingsSchema(AuthnPluginSett'
164 attr_email = colander.SchemaNode(
171 attr_email = colander.SchemaNode(
165 colander.String(),
172 colander.String(),
166 default='',
173 default='',
167 description=_('LDAP Attribute to map to email address'),
174 description=_('LDAP Attribute to map to email address (e.g., mail).\n'
175 'Emails are a crucial part of RhodeCode. \n'
176 'If possible add a valid email attribute to ldap users.'),
168 missing='',
177 missing='',
169 preparer=strip_whitespace,
178 preparer=strip_whitespace,
170 title=_('Email Attribute'),
179 title=_('Email Attribute'),
@@ -182,7 +191,7 b' class AuthLdap(object):'
182 def __init__(self, server, base_dn, port=389, bind_dn='', bind_pass='',
191 def __init__(self, server, base_dn, port=389, bind_dn='', bind_pass='',
183 tls_kind='PLAIN', tls_reqcert='DEMAND', ldap_version=3,
192 tls_kind='PLAIN', tls_reqcert='DEMAND', ldap_version=3,
184 search_scope='SUBTREE', attr_login='uid',
193 search_scope='SUBTREE', attr_login='uid',
185 ldap_filter='(&(objectClass=user)(!(objectClass=computer)))'):
194 ldap_filter=None):
186 if ldap == Missing:
195 if ldap == Missing:
187 raise LdapImportError("Missing or incompatible ldap library")
196 raise LdapImportError("Missing or incompatible ldap library")
188
197
@@ -236,14 +245,13 b' class AuthLdap(object):'
236 server.start_tls_s()
245 server.start_tls_s()
237
246
238 if self.LDAP_BIND_DN and self.LDAP_BIND_PASS:
247 if self.LDAP_BIND_DN and self.LDAP_BIND_PASS:
239 log.debug('Trying simple_bind with password and given DN: %s',
248 log.debug('Trying simple_bind with password and given login DN: %s',
240 self.LDAP_BIND_DN)
249 self.LDAP_BIND_DN)
241 server.simple_bind_s(self.LDAP_BIND_DN, self.LDAP_BIND_PASS)
250 server.simple_bind_s(self.LDAP_BIND_DN, self.LDAP_BIND_PASS)
242
251
243 return server
252 return server
244
253
245 def get_uid(self, username):
254 def get_uid(self, username):
246 from rhodecode.lib.helpers import chop_at
247 uid = username
255 uid = username
248 for server_addr in self.SERVER_ADDRESSES:
256 for server_addr in self.SERVER_ADDRESSES:
249 uid = chop_at(username, "@%s" % server_addr)
257 uid = chop_at(username, "@%s" % server_addr)
@@ -292,8 +300,11 b' class AuthLdap(object):'
292 self.BASE_DN, self.SEARCH_SCOPE, filter_)
300 self.BASE_DN, self.SEARCH_SCOPE, filter_)
293
301
294 if not lobjects:
302 if not lobjects:
303 log.debug("No matching LDAP objects for authentication "
304 "of UID:'%s' username:(%s)", uid, username)
295 raise ldap.NO_SUCH_OBJECT()
305 raise ldap.NO_SUCH_OBJECT()
296
306
307 log.debug('Found matching ldap object, trying to authenticate')
297 for (dn, _attrs) in lobjects:
308 for (dn, _attrs) in lobjects:
298 if dn is None:
309 if dn is None:
299 continue
310 continue
@@ -304,15 +315,13 b' class AuthLdap(object):'
304 break
315 break
305
316
306 else:
317 else:
307 log.debug("No matching LDAP objects for authentication "
308 "of '%s' (%s)", uid, username)
309 raise LdapPasswordError('Failed to authenticate user '
318 raise LdapPasswordError('Failed to authenticate user '
310 'with given password')
319 'with given password')
311
320
312 except ldap.NO_SUCH_OBJECT:
321 except ldap.NO_SUCH_OBJECT:
313 log.debug("LDAP says no such user '%s' (%s), org_exc:",
322 log.debug("LDAP says no such user '%s' (%s), org_exc:",
314 uid, username, exc_info=True)
323 uid, username, exc_info=True)
315 raise LdapUsernameError()
324 raise LdapUsernameError('Unable to find user')
316 except ldap.SERVER_DOWN:
325 except ldap.SERVER_DOWN:
317 org_exc = traceback.format_exc()
326 org_exc = traceback.format_exc()
318 raise LdapConnectionError(
327 raise LdapConnectionError(
@@ -447,7 +456,7 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
447 'email': get_ldap_attr('attr_email') or email,
456 'email': get_ldap_attr('attr_email') or email,
448 'admin': admin,
457 'admin': admin,
449 'active': active,
458 'active': active,
450 "active_from_extern": None,
459 'active_from_extern': None,
451 'extern_name': user_dn,
460 'extern_name': user_dn,
452 'extern_type': extern_type,
461 'extern_type': extern_type,
453 }
462 }
@@ -17,6 +17,7 b''
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20 """
21 """
21 RhodeCode authentication library for PAM
22 RhodeCode authentication library for PAM
22 """
23 """
@@ -29,10 +30,9 b' import pwd'
29 import re
30 import re
30 import socket
31 import socket
31
32
32 from pylons.i18n.translation import lazy_ugettext as _
33 from rhodecode.translation import _
33 from sqlalchemy.ext.hybrid import hybrid_property
34 from rhodecode.authentication.base import (
34
35 RhodeCodeExternalAuthPlugin, hybrid_property)
35 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
36 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
36 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
37 from rhodecode.authentication.routes import AuthnPluginResourceBase
37 from rhodecode.authentication.routes import AuthnPluginResourceBase
38 from rhodecode.lib.colander_utils import strip_whitespace
38 from rhodecode.lib.colander_utils import strip_whitespace
@@ -25,9 +25,8 b' RhodeCode authentication plugin for buil'
25 import logging
25 import logging
26
26
27 from pylons.i18n.translation import lazy_ugettext as _
27 from pylons.i18n.translation import lazy_ugettext as _
28 from sqlalchemy.ext.hybrid import hybrid_property
29
28
30 from rhodecode.authentication.base import RhodeCodeAuthPluginBase
29 from rhodecode.authentication.base import RhodeCodeAuthPluginBase, hybrid_property
31 from rhodecode.authentication.routes import AuthnPluginResourceBase
30 from rhodecode.authentication.routes import AuthnPluginResourceBase
32 from rhodecode.lib.utils2 import safe_str
31 from rhodecode.lib.utils2 import safe_str
33 from rhodecode.model.db import User
32 from rhodecode.model.db import User
@@ -24,12 +24,11 b' RhodeCode authentication token plugin fo'
24
24
25 import logging
25 import logging
26
26
27 from sqlalchemy.ext.hybrid import hybrid_property
28
29 from rhodecode.translation import _
27 from rhodecode.translation import _
30 from rhodecode.authentication.base import RhodeCodeAuthPluginBase, VCS_TYPE
28 from rhodecode.authentication.base import (
29 RhodeCodeAuthPluginBase, VCS_TYPE, hybrid_property)
31 from rhodecode.authentication.routes import AuthnPluginResourceBase
30 from rhodecode.authentication.routes import AuthnPluginResourceBase
32 from rhodecode.model.db import User, UserApiKeys
31 from rhodecode.model.db import User, UserApiKeys, Repository
33
32
34
33
35 log = logging.getLogger(__name__)
34 log = logging.getLogger(__name__)
@@ -122,10 +121,17 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
122
121
123 log.debug('Authenticating user with args %s', user_attrs)
122 log.debug('Authenticating user with args %s', user_attrs)
124 if userobj.active:
123 if userobj.active:
125 role = UserApiKeys.ROLE_VCS
124 # calling context repo for token scopes
126 active_tokens = [x.api_key for x in
125 scope_repo_id = None
127 User.extra_valid_auth_tokens(userobj, role=role)]
126 if self.acl_repo_name:
128 if userobj.username == username and password in active_tokens:
127 repo = Repository.get_by_repo_name(self.acl_repo_name)
128 scope_repo_id = repo.repo_id if repo else None
129
130 token_match = userobj.authenticate_by_token(
131 password, roles=[UserApiKeys.ROLE_VCS],
132 scope_repo_id=scope_repo_id)
133
134 if userobj.username == username and token_match:
129 log.info(
135 log.info(
130 'user `%s` successfully authenticated via %s',
136 'user `%s` successfully authenticated via %s',
131 user_attrs['username'], self.name)
137 user_attrs['username'], self.name)
@@ -40,10 +40,11 b' class AuthnPluginSettingsSchemaBase(cola'
40 cache_ttl = colander.SchemaNode(
40 cache_ttl = colander.SchemaNode(
41 colander.Int(),
41 colander.Int(),
42 default=0,
42 default=0,
43 description=_('Amount of seconds to cache the authentication '
43 description=_('Amount of seconds to cache the authentication response'
44 'call for this plugin. Useful for long calls like '
44 'call for this plugin. \n'
45 'LDAP to improve the responsiveness of the '
45 'Useful for long calls like LDAP to improve the '
46 'authentication system (0 means disabled).'),
46 'performance of the authentication system '
47 '(0 means disabled).'),
47 missing=0,
48 missing=0,
48 title=_('Auth Cache TTL'),
49 title=_('Auth Cache TTL'),
49 validator=colander.Range(min=0, max=None),
50 validator=colander.Range(min=0, max=None),
@@ -87,15 +87,6 b' def load_environment(global_conf, app_co'
87
87
88 config['routes.map'] = make_map(config)
88 config['routes.map'] = make_map(config)
89
89
90 if asbool(config.get('generate_js_files', 'false')):
91 jsroutes = config['routes.map'].jsroutes()
92 jsroutes_file_content = generate_jsroutes_content(jsroutes)
93 jsroutes_file_path = os.path.join(
94 paths['static_files'], 'js', 'rhodecode', 'routes.js')
95
96 with io.open(jsroutes_file_path, 'w', encoding='utf-8') as f:
97 f.write(jsroutes_file_content)
98
99 config['pylons.app_globals'] = app_globals.Globals(config)
90 config['pylons.app_globals'] = app_globals.Globals(config)
100 config['pylons.h'] = helpers
91 config['pylons.h'] = helpers
101 rhodecode.CONFIG = config
92 rhodecode.CONFIG = config
@@ -184,7 +175,6 b' def load_pyramid_environment(global_conf'
184 protocol=utils.get_vcs_server_protocol(settings),
175 protocol=utils.get_vcs_server_protocol(settings),
185 log_level=settings['vcs.server.log_level'])
176 log_level=settings['vcs.server.log_level'])
186
177
187 utils.configure_pyro4(settings)
188 utils.configure_vcs(settings)
178 utils.configure_vcs(settings)
189 if vcs_server_enabled:
179 if vcs_server_enabled:
190 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(settings))
180 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(settings))
@@ -41,9 +41,6 b''
41 "python2.7-Pylons-1.0.1-patch1": {
41 "python2.7-Pylons-1.0.1-patch1": {
42 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
42 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
43 },
43 },
44 "python2.7-Pyro4-4.35": {
45 "MIT License": "http://spdx.org/licenses/MIT"
46 },
47 "python2.7-Routes-1.13": {
44 "python2.7-Routes-1.13": {
48 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
45 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
49 },
46 },
@@ -215,9 +212,6 b''
215 "python2.7-requests-2.9.1": {
212 "python2.7-requests-2.9.1": {
216 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
213 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
217 },
214 },
218 "python2.7-serpent-1.12": {
219 "MIT License": "http://spdx.org/licenses/MIT"
220 },
221 "python2.7-setuptools-19.4": {
215 "python2.7-setuptools-19.4": {
222 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0",
216 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0",
223 "Zope Public License 2.0": "http://spdx.org/licenses/ZPL-2.0"
217 "Zope Public License 2.0": "http://spdx.org/licenses/ZPL-2.0"
@@ -32,7 +32,7 b' from pyramid.config import Configurator'
32 from pyramid.settings import asbool, aslist
32 from pyramid.settings import asbool, aslist
33 from pyramid.wsgi import wsgiapp
33 from pyramid.wsgi import wsgiapp
34 from pyramid.httpexceptions import (
34 from pyramid.httpexceptions import (
35 HTTPError, HTTPInternalServerError, HTTPFound)
35 HTTPException, HTTPError, HTTPInternalServerError, HTTPFound)
36 from pyramid.events import ApplicationCreated
36 from pyramid.events import ApplicationCreated
37 from pyramid.renderers import render_to_response
37 from pyramid.renderers import render_to_response
38 from routes.middleware import RoutesMiddleware
38 from routes.middleware import RoutesMiddleware
@@ -53,7 +53,8 b' from rhodecode.lib.middleware.vcs import'
53 from rhodecode.lib.plugins.utils import register_rhodecode_plugin
53 from rhodecode.lib.plugins.utils import register_rhodecode_plugin
54 from rhodecode.lib.utils2 import aslist as rhodecode_aslist
54 from rhodecode.lib.utils2 import aslist as rhodecode_aslist
55 from rhodecode.subscribers import (
55 from rhodecode.subscribers import (
56 scan_repositories_if_enabled, write_metadata_if_needed)
56 scan_repositories_if_enabled, write_metadata_if_needed,
57 write_js_routes_if_enabled)
57
58
58
59
59 log = logging.getLogger(__name__)
60 log = logging.getLogger(__name__)
@@ -219,18 +220,14 b' def add_pylons_compat_data(registry, glo'
219
220
220
221
221 def error_handler(exception, request):
222 def error_handler(exception, request):
222 from rhodecode.model.settings import SettingsModel
223 import rhodecode
223 from rhodecode.lib.utils2 import AttributeDict
224 from rhodecode.lib.utils2 import AttributeDict
224
225
225 try:
226 rhodecode_title = rhodecode.CONFIG.get('rhodecode_title') or 'RhodeCode'
226 rc_config = SettingsModel().get_all_settings()
227 except Exception:
228 log.exception('failed to fetch settings')
229 rc_config = {}
230
227
231 base_response = HTTPInternalServerError()
228 base_response = HTTPInternalServerError()
232 # prefer original exception for the response since it may have headers set
229 # prefer original exception for the response since it may have headers set
233 if isinstance(exception, HTTPError):
230 if isinstance(exception, HTTPException):
234 base_response = exception
231 base_response = exception
235
232
236 def is_http_error(response):
233 def is_http_error(response):
@@ -251,7 +248,7 b' def error_handler(exception, request):'
251 request.route_url('rhodecode_support')
248 request.route_url('rhodecode_support')
252 )
249 )
253 c.redirect_time = 0
250 c.redirect_time = 0
254 c.rhodecode_name = rc_config.get('rhodecode_title', '')
251 c.rhodecode_name = rhodecode_title
255 if not c.rhodecode_name:
252 if not c.rhodecode_name:
256 c.rhodecode_name = 'Rhodecode'
253 c.rhodecode_name = 'Rhodecode'
257
254
@@ -281,14 +278,24 b' def includeme(config):'
281 # Includes which are required. The application would fail without them.
278 # Includes which are required. The application would fail without them.
282 config.include('pyramid_mako')
279 config.include('pyramid_mako')
283 config.include('pyramid_beaker')
280 config.include('pyramid_beaker')
284 config.include('rhodecode.channelstream')
281
285 config.include('rhodecode.admin')
286 config.include('rhodecode.authentication')
282 config.include('rhodecode.authentication')
287 config.include('rhodecode.integrations')
283 config.include('rhodecode.integrations')
288 config.include('rhodecode.login')
284
285 # apps
286 config.include('rhodecode.apps._base')
287
288 config.include('rhodecode.apps.admin')
289 config.include('rhodecode.apps.channelstream')
290 config.include('rhodecode.apps.login')
291 config.include('rhodecode.apps.repository')
292 config.include('rhodecode.apps.user_profile')
293 config.include('rhodecode.apps.my_account')
294 config.include('rhodecode.apps.svn_support')
295
289 config.include('rhodecode.tweens')
296 config.include('rhodecode.tweens')
290 config.include('rhodecode.api')
297 config.include('rhodecode.api')
291 config.include('rhodecode.svn_support')
298
292 config.add_route(
299 config.add_route(
293 'rhodecode_support', 'https://rhodecode.com/help/', static=True)
300 'rhodecode_support', 'https://rhodecode.com/help/', static=True)
294
301
@@ -298,6 +305,7 b' def includeme(config):'
298 # Add subscribers.
305 # Add subscribers.
299 config.add_subscriber(scan_repositories_if_enabled, ApplicationCreated)
306 config.add_subscriber(scan_repositories_if_enabled, ApplicationCreated)
300 config.add_subscriber(write_metadata_if_needed, ApplicationCreated)
307 config.add_subscriber(write_metadata_if_needed, ApplicationCreated)
308 config.add_subscriber(write_js_routes_if_enabled, ApplicationCreated)
301
309
302 # Set the authorization policy.
310 # Set the authorization policy.
303 authz_policy = ACLAuthorizationPolicy()
311 authz_policy = ACLAuthorizationPolicy()
@@ -92,7 +92,7 b' class JSRoutesMapper(Mapper):'
92 def _extract_route_information(self, route):
92 def _extract_route_information(self, route):
93 """
93 """
94 Convert a route into tuple(name, path, args), eg:
94 Convert a route into tuple(name, path, args), eg:
95 ('user_profile', '/profile/%(username)s', ['username'])
95 ('show_user', '/profile/%(username)s', ['username'])
96 """
96 """
97 routepath = route.routepath
97 routepath = route.routepath
98 def replace(matchobj):
98 def replace(matchobj):
@@ -198,10 +198,6 b' def make_map(config):'
198 rmap.connect('user_group_autocomplete_data', '/_user_groups', controller='home',
198 rmap.connect('user_group_autocomplete_data', '/_user_groups', controller='home',
199 action='user_group_autocomplete_data', jsroute=True)
199 action='user_group_autocomplete_data', jsroute=True)
200
200
201 rmap.connect(
202 'user_profile', '/_profiles/{username}', controller='users',
203 action='user_profile')
204
205 # TODO: johbo: Static links, to be replaced by our redirection mechanism
201 # TODO: johbo: Static links, to be replaced by our redirection mechanism
206 rmap.connect('rst_help',
202 rmap.connect('rst_help',
207 'http://docutils.sourceforge.net/docs/user/rst/quickref.html',
203 'http://docutils.sourceforge.net/docs/user/rst/quickref.html',
@@ -296,8 +292,6 b' def make_map(config):'
296 controller='admin/users') as m:
292 controller='admin/users') as m:
297 m.connect('users', '/users',
293 m.connect('users', '/users',
298 action='create', conditions={'method': ['POST']})
294 action='create', conditions={'method': ['POST']})
299 m.connect('users', '/users',
300 action='index', conditions={'method': ['GET']})
301 m.connect('new_user', '/users/new',
295 m.connect('new_user', '/users/new',
302 action='new', conditions={'method': ['GET']})
296 action='new', conditions={'method': ['GET']})
303 m.connect('update_user', '/users/{user_id}',
297 m.connect('update_user', '/users/{user_id}',
@@ -319,13 +313,6 b' def make_map(config):'
319 m.connect('edit_user_advanced', '/users/{user_id}/edit/advanced',
313 m.connect('edit_user_advanced', '/users/{user_id}/edit/advanced',
320 action='update_advanced', conditions={'method': ['PUT']})
314 action='update_advanced', conditions={'method': ['PUT']})
321
315
322 m.connect('edit_user_auth_tokens', '/users/{user_id}/edit/auth_tokens',
323 action='edit_auth_tokens', conditions={'method': ['GET']})
324 m.connect('edit_user_auth_tokens', '/users/{user_id}/edit/auth_tokens',
325 action='add_auth_token', conditions={'method': ['PUT']})
326 m.connect('edit_user_auth_tokens', '/users/{user_id}/edit/auth_tokens',
327 action='delete_auth_token', conditions={'method': ['DELETE']})
328
329 m.connect('edit_user_global_perms', '/users/{user_id}/edit/global_permissions',
316 m.connect('edit_user_global_perms', '/users/{user_id}/edit/global_permissions',
330 action='edit_global_perms', conditions={'method': ['GET']})
317 action='edit_global_perms', conditions={'method': ['GET']})
331 m.connect('edit_user_global_perms', '/users/{user_id}/edit/global_permissions',
318 m.connect('edit_user_global_perms', '/users/{user_id}/edit/global_permissions',
@@ -387,6 +374,10 b' def make_map(config):'
387 '/user_groups/{user_group_id}/edit/advanced',
374 '/user_groups/{user_group_id}/edit/advanced',
388 action='edit_advanced', conditions={'method': ['GET']})
375 action='edit_advanced', conditions={'method': ['GET']})
389
376
377 m.connect('edit_user_group_advanced_sync',
378 '/user_groups/{user_group_id}/edit/advanced/sync',
379 action='edit_advanced_set_synchronization', conditions={'method': ['POST']})
380
390 m.connect('edit_user_group_members',
381 m.connect('edit_user_group_members',
391 '/user_groups/{user_group_id}/edit/members', jsroute=True,
382 '/user_groups/{user_group_id}/edit/members', jsroute=True,
392 action='user_group_members', conditions={'method': ['GET']})
383 action='user_group_members', conditions={'method': ['GET']})
@@ -518,15 +509,15 b' def make_map(config):'
518 with rmap.submapper(path_prefix=ADMIN_PREFIX,
509 with rmap.submapper(path_prefix=ADMIN_PREFIX,
519 controller='admin/my_account') as m:
510 controller='admin/my_account') as m:
520
511
521 m.connect('my_account', '/my_account',
522 action='my_account', conditions={'method': ['GET']})
523 m.connect('my_account_edit', '/my_account/edit',
512 m.connect('my_account_edit', '/my_account/edit',
524 action='my_account_edit', conditions={'method': ['GET']})
513 action='my_account_edit', conditions={'method': ['GET']})
525 m.connect('my_account', '/my_account',
514 m.connect('my_account', '/my_account/update',
526 action='my_account_update', conditions={'method': ['POST']})
515 action='my_account_update', conditions={'method': ['POST']})
527
516
517 # NOTE(marcink): this needs to be kept for password force flag to be
518 # handler, remove after migration to pyramid
528 m.connect('my_account_password', '/my_account/password',
519 m.connect('my_account_password', '/my_account/password',
529 action='my_account_password', conditions={'method': ['GET', 'POST']})
520 action='my_account_password', conditions={'method': ['GET']})
530
521
531 m.connect('my_account_repos', '/my_account/repos',
522 m.connect('my_account_repos', '/my_account/repos',
532 action='my_account_repos', conditions={'method': ['GET']})
523 action='my_account_repos', conditions={'method': ['GET']})
@@ -547,12 +538,6 b' def make_map(config):'
547 m.connect('my_account_emails', '/my_account/emails',
538 m.connect('my_account_emails', '/my_account/emails',
548 action='my_account_emails_delete', conditions={'method': ['DELETE']})
539 action='my_account_emails_delete', conditions={'method': ['DELETE']})
549
540
550 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
551 action='my_account_auth_tokens', conditions={'method': ['GET']})
552 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
553 action='my_account_auth_tokens_add', conditions={'method': ['POST']})
554 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
555 action='my_account_auth_tokens_delete', conditions={'method': ['DELETE']})
556 m.connect('my_account_notifications', '/my_account/notifications',
541 m.connect('my_account_notifications', '/my_account/notifications',
557 action='my_notifications',
542 action='my_notifications',
558 conditions={'method': ['GET']})
543 conditions={'method': ['GET']})
@@ -1066,6 +1051,12 b' def make_map(config):'
1066 f_path='', annotate=True, conditions={'function': check_repo},
1051 f_path='', annotate=True, conditions={'function': check_repo},
1067 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1052 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1068
1053
1054 rmap.connect('files_annotate_previous',
1055 '/{repo_name}/annotate-previous/{revision}/{f_path}',
1056 controller='files', action='annotate_previous', revision='tip',
1057 f_path='', annotate=True, conditions={'function': check_repo},
1058 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1059
1069 rmap.connect('files_edit',
1060 rmap.connect('files_edit',
1070 '/{repo_name}/edit/{revision}/{f_path}',
1061 '/{repo_name}/edit/{revision}/{f_path}',
1071 controller='files', action='edit', revision='tip',
1062 controller='files', action='edit', revision='tip',
@@ -1137,11 +1128,6 b' def make_map(config):'
1137 conditions={'function': check_repo},
1128 conditions={'function': check_repo},
1138 requirements=URL_NAME_REQUIREMENTS)
1129 requirements=URL_NAME_REQUIREMENTS)
1139
1130
1140 rmap.connect('repo_followers_home', '/{repo_name}/followers',
1141 controller='followers', action='followers',
1142 conditions={'function': check_repo},
1143 requirements=URL_NAME_REQUIREMENTS)
1144
1145 # must be here for proper group/repo catching pattern
1131 # must be here for proper group/repo catching pattern
1146 _connect_with_slash(
1132 _connect_with_slash(
1147 rmap, 'repo_group_home', '/{group_name}',
1133 rmap, 'repo_group_home', '/{group_name}',
@@ -20,29 +20,11 b''
20
20
21 import os
21 import os
22 import shlex
22 import shlex
23 import Pyro4
24 import platform
23 import platform
25
24
26 from rhodecode.model import init_model
25 from rhodecode.model import init_model
27
26
28
27
29 def configure_pyro4(config):
30 """
31 Configure Pyro4 based on `config`.
32
33 This will mainly set the different configuration parameters of the Pyro4
34 library based on the settings in our INI files. The Pyro4 documentation
35 lists more details about the specific settings and their meaning.
36 """
37 Pyro4.config.COMMTIMEOUT = float(config['vcs.connection_timeout'])
38 Pyro4.config.SERIALIZER = 'pickle'
39 Pyro4.config.SERIALIZERS_ACCEPTED.add('pickle')
40
41 # Note: We need server configuration in the WSGI processes
42 # because we provide a callback server in certain vcs operations.
43 Pyro4.config.SERVERTYPE = "multiplex"
44 Pyro4.config.POLLTIMEOUT = 0.01
45
46
28
47 def configure_vcs(config):
29 def configure_vcs(config):
48 """
30 """
@@ -77,9 +59,16 b' def initialize_test_environment(settings'
77 create_test_directory, create_test_database, create_test_repositories,
59 create_test_directory, create_test_database, create_test_repositories,
78 create_test_index)
60 create_test_index)
79 from rhodecode.tests import TESTS_TMP_PATH
61 from rhodecode.tests import TESTS_TMP_PATH
62 from rhodecode.lib.vcs.backends.hg import largefiles_store
63 from rhodecode.lib.vcs.backends.git import lfs_store
64
80 # test repos
65 # test repos
81 if test_env:
66 if test_env:
82 create_test_directory(TESTS_TMP_PATH)
67 create_test_directory(TESTS_TMP_PATH)
68 # large object stores
69 create_test_directory(largefiles_store(TESTS_TMP_PATH))
70 create_test_directory(lfs_store(TESTS_TMP_PATH))
71
83 create_test_database(TESTS_TMP_PATH, settings)
72 create_test_database(TESTS_TMP_PATH, settings)
84 create_test_repositories(TESTS_TMP_PATH, settings)
73 create_test_repositories(TESTS_TMP_PATH, settings)
85 create_test_index(TESTS_TMP_PATH, settings)
74 create_test_index(TESTS_TMP_PATH, settings)
@@ -28,101 +28,17 b' import logging'
28 from pylons import request, tmpl_context as c, url
28 from pylons import request, tmpl_context as c, url
29 from pylons.controllers.util import redirect
29 from pylons.controllers.util import redirect
30 from sqlalchemy.orm import joinedload
30 from sqlalchemy.orm import joinedload
31 from whoosh.qparser.default import QueryParser, query
32 from whoosh.qparser.dateparse import DateParserPlugin
33 from whoosh.fields import (TEXT, Schema, DATETIME)
34 from sqlalchemy.sql.expression import or_, and_, func
35
31
36 from rhodecode.model.db import UserLog, PullRequest
32 from rhodecode.model.db import UserLog, PullRequest
33 from rhodecode.lib.user_log_filter import user_log_filter
37 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
34 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
38 from rhodecode.lib.base import BaseController, render
35 from rhodecode.lib.base import BaseController, render
39 from rhodecode.lib.utils2 import safe_int, remove_prefix, remove_suffix
36 from rhodecode.lib.utils2 import safe_int
40 from rhodecode.lib.helpers import Page
37 from rhodecode.lib.helpers import Page
41
38
42
39
43 log = logging.getLogger(__name__)
40 log = logging.getLogger(__name__)
44
41
45 # JOURNAL SCHEMA used only to generate queries in journal. We use whoosh
46 # querylang to build sql queries and filter journals
47 JOURNAL_SCHEMA = Schema(
48 username=TEXT(),
49 date=DATETIME(),
50 action=TEXT(),
51 repository=TEXT(),
52 ip=TEXT(),
53 )
54
55
56 def _journal_filter(user_log, search_term):
57 """
58 Filters sqlalchemy user_log based on search_term with whoosh Query language
59 http://packages.python.org/Whoosh/querylang.html
60
61 :param user_log:
62 :param search_term:
63 """
64 log.debug('Initial search term: %r' % search_term)
65 qry = None
66 if search_term:
67 qp = QueryParser('repository', schema=JOURNAL_SCHEMA)
68 qp.add_plugin(DateParserPlugin())
69 qry = qp.parse(unicode(search_term))
70 log.debug('Filtering using parsed query %r' % qry)
71
72 def wildcard_handler(col, wc_term):
73 if wc_term.startswith('*') and not wc_term.endswith('*'):
74 # postfix == endswith
75 wc_term = remove_prefix(wc_term, prefix='*')
76 return func.lower(col).endswith(wc_term)
77 elif wc_term.startswith('*') and wc_term.endswith('*'):
78 # wildcard == ilike
79 wc_term = remove_prefix(wc_term, prefix='*')
80 wc_term = remove_suffix(wc_term, suffix='*')
81 return func.lower(col).contains(wc_term)
82
83 def get_filterion(field, val, term):
84
85 if field == 'repository':
86 field = getattr(UserLog, 'repository_name')
87 elif field == 'ip':
88 field = getattr(UserLog, 'user_ip')
89 elif field == 'date':
90 field = getattr(UserLog, 'action_date')
91 elif field == 'username':
92 field = getattr(UserLog, 'username')
93 else:
94 field = getattr(UserLog, field)
95 log.debug('filter field: %s val=>%s' % (field, val))
96
97 # sql filtering
98 if isinstance(term, query.Wildcard):
99 return wildcard_handler(field, val)
100 elif isinstance(term, query.Prefix):
101 return func.lower(field).startswith(func.lower(val))
102 elif isinstance(term, query.DateRange):
103 return and_(field >= val[0], field <= val[1])
104 return func.lower(field) == func.lower(val)
105
106 if isinstance(qry, (query.And, query.Term, query.Prefix, query.Wildcard,
107 query.DateRange)):
108 if not isinstance(qry, query.And):
109 qry = [qry]
110 for term in qry:
111 field = term.fieldname
112 val = (term.text if not isinstance(term, query.DateRange)
113 else [term.startdate, term.enddate])
114 user_log = user_log.filter(get_filterion(field, val, term))
115 elif isinstance(qry, query.Or):
116 filters = []
117 for term in qry:
118 field = term.fieldname
119 val = (term.text if not isinstance(term, query.DateRange)
120 else [term.startdate, term.enddate])
121 filters.append(get_filterion(field, val, term))
122 user_log = user_log.filter(or_(*filters))
123
124 return user_log
125
126
42
127 class AdminController(BaseController):
43 class AdminController(BaseController):
128
44
@@ -139,7 +55,7 b' class AdminController(BaseController):'
139 # FILTERING
55 # FILTERING
140 c.search_term = request.GET.get('filter')
56 c.search_term = request.GET.get('filter')
141 try:
57 try:
142 users_log = _journal_filter(users_log, c.search_term)
58 users_log = user_log_filter(users_log, c.search_term)
143 except Exception:
59 except Exception:
144 # we want this to crash for now
60 # we want this to crash for now
145 raise
61 raise
@@ -29,32 +29,30 b' import datetime'
29 import formencode
29 import formencode
30 from formencode import htmlfill
30 from formencode import htmlfill
31 from pyramid.threadlocal import get_current_registry
31 from pyramid.threadlocal import get_current_registry
32 from pylons import request, tmpl_context as c, url, session
32 from pyramid.httpexceptions import HTTPFound
33
34 from pylons import request, tmpl_context as c, url
33 from pylons.controllers.util import redirect
35 from pylons.controllers.util import redirect
34 from pylons.i18n.translation import _
36 from pylons.i18n.translation import _
35 from sqlalchemy.orm import joinedload
37 from sqlalchemy.orm import joinedload
36 from webob.exc import HTTPBadGateway
37
38
38 from rhodecode import forms
39 from rhodecode.lib import helpers as h
39 from rhodecode.lib import helpers as h
40 from rhodecode.lib import auth
40 from rhodecode.lib import auth
41 from rhodecode.lib.auth import (
41 from rhodecode.lib.auth import (
42 LoginRequired, NotAnonymous, AuthUser, generate_auth_token)
42 LoginRequired, NotAnonymous, AuthUser)
43 from rhodecode.lib.base import BaseController, render
43 from rhodecode.lib.base import BaseController, render
44 from rhodecode.lib.utils import jsonify
44 from rhodecode.lib.utils import jsonify
45 from rhodecode.lib.utils2 import safe_int, md5, str2bool
45 from rhodecode.lib.utils2 import safe_int, str2bool
46 from rhodecode.lib.ext_json import json
46 from rhodecode.lib.ext_json import json
47 from rhodecode.lib.channelstream import channelstream_request, \
47 from rhodecode.lib.channelstream import channelstream_request, \
48 ChannelstreamException
48 ChannelstreamException
49
49
50 from rhodecode.model.validation_schema.schemas import user_schema
51 from rhodecode.model.db import (
50 from rhodecode.model.db import (
52 Repository, PullRequest, UserEmailMap, User, UserFollowing)
51 Repository, PullRequest, UserEmailMap, User, UserFollowing)
53 from rhodecode.model.forms import UserForm
52 from rhodecode.model.forms import UserForm
54 from rhodecode.model.scm import RepoList
53 from rhodecode.model.scm import RepoList
55 from rhodecode.model.user import UserModel
54 from rhodecode.model.user import UserModel
56 from rhodecode.model.repo import RepoModel
55 from rhodecode.model.repo import RepoModel
57 from rhodecode.model.auth_token import AuthTokenModel
58 from rhodecode.model.meta import Session
56 from rhodecode.model.meta import Session
59 from rhodecode.model.pull_request import PullRequestModel
57 from rhodecode.model.pull_request import PullRequestModel
60 from rhodecode.model.comment import CommentsModel
58 from rhodecode.model.comment import CommentsModel
@@ -79,7 +77,7 b' class MyAccountController(BaseController'
79 if c.user.username == User.DEFAULT_USER:
77 if c.user.username == User.DEFAULT_USER:
80 h.flash(_("You can't edit this user since it's"
78 h.flash(_("You can't edit this user since it's"
81 " crucial for entire application"), category='warning')
79 " crucial for entire application"), category='warning')
82 return redirect(url('users'))
80 return redirect(h.route_path('users'))
83
81
84 c.auth_user = AuthUser(
82 c.auth_user = AuthUser(
85 user_id=c.rhodecode_user.user_id, ip_addr=self.ip_addr)
83 user_id=c.rhodecode_user.user_id, ip_addr=self.ip_addr)
@@ -156,7 +154,7 b' class MyAccountController(BaseController'
156 % form_result.get('username'), category='error')
154 % form_result.get('username'), category='error')
157
155
158 if update:
156 if update:
159 return redirect('my_account')
157 raise HTTPFound(h.route_path('my_account_profile'))
160
158
161 return htmlfill.render(
159 return htmlfill.render(
162 render('admin/my_account/my_account.mako'),
160 render('admin/my_account/my_account.mako'),
@@ -165,19 +163,6 b' class MyAccountController(BaseController'
165 force_defaults=False
163 force_defaults=False
166 )
164 )
167
165
168 def my_account(self):
169 """
170 GET /_admin/my_account Displays info about my account
171 """
172 # url('my_account')
173 c.active = 'profile'
174 self.__load_data()
175
176 defaults = c.user.get_dict()
177 return htmlfill.render(
178 render('admin/my_account/my_account.mako'),
179 defaults=defaults, encoding="UTF-8", force_defaults=False)
180
181 def my_account_edit(self):
166 def my_account_edit(self):
182 """
167 """
183 GET /_admin/my_account/edit Displays edit form of my account
168 GET /_admin/my_account/edit Displays edit form of my account
@@ -196,47 +181,6 b' class MyAccountController(BaseController'
196 force_defaults=False
181 force_defaults=False
197 )
182 )
198
183
199 @auth.CSRFRequired(except_methods=['GET'])
200 def my_account_password(self):
201 c.active = 'password'
202 self.__load_data()
203 c.extern_type = c.user.extern_type
204
205 schema = user_schema.ChangePasswordSchema().bind(
206 username=c.rhodecode_user.username)
207
208 form = forms.Form(schema,
209 buttons=(forms.buttons.save, forms.buttons.reset))
210
211 if request.method == 'POST' and c.extern_type == 'rhodecode':
212 controls = request.POST.items()
213 try:
214 valid_data = form.validate(controls)
215 UserModel().update_user(c.rhodecode_user.user_id, **valid_data)
216 instance = c.rhodecode_user.get_instance()
217 instance.update_userdata(force_password_change=False)
218 Session().commit()
219 except forms.ValidationFailure as e:
220 request.session.flash(
221 _('Error occurred during update of user password'),
222 queue='error')
223 form = e
224 except Exception:
225 log.exception("Exception updating password")
226 request.session.flash(
227 _('Error occurred during update of user password'),
228 queue='error')
229 else:
230 session.setdefault('rhodecode_user', {}).update(
231 {'password': md5(instance.password)})
232 session.save()
233 request.session.flash(
234 _("Successfully updated password"), queue='success')
235 return redirect(url('my_account_password'))
236
237 c.form = form
238 return render('admin/my_account/my_account.mako')
239
240 def my_account_repos(self):
184 def my_account_repos(self):
241 c.active = 'repos'
185 c.active = 'repos'
242 self.__load_data()
186 self.__load_data()
@@ -376,54 +320,6 b' class MyAccountController(BaseController'
376 else:
320 else:
377 return json.dumps(data)
321 return json.dumps(data)
378
322
379 def my_account_auth_tokens(self):
380 c.active = 'auth_tokens'
381 self.__load_data()
382 show_expired = True
383 c.lifetime_values = [
384 (str(-1), _('forever')),
385 (str(5), _('5 minutes')),
386 (str(60), _('1 hour')),
387 (str(60 * 24), _('1 day')),
388 (str(60 * 24 * 30), _('1 month')),
389 ]
390 c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
391 c.role_values = [(x, AuthTokenModel.cls._get_role_name(x))
392 for x in AuthTokenModel.cls.ROLES]
393 c.role_options = [(c.role_values, _("Role"))]
394 c.user_auth_tokens = AuthTokenModel().get_auth_tokens(
395 c.rhodecode_user.user_id, show_expired=show_expired)
396 return render('admin/my_account/my_account.mako')
397
398 @auth.CSRFRequired()
399 def my_account_auth_tokens_add(self):
400 lifetime = safe_int(request.POST.get('lifetime'), -1)
401 description = request.POST.get('description')
402 role = request.POST.get('role')
403 AuthTokenModel().create(c.rhodecode_user.user_id, description, lifetime,
404 role)
405 Session().commit()
406 h.flash(_("Auth token successfully created"), category='success')
407 return redirect(url('my_account_auth_tokens'))
408
409 @auth.CSRFRequired()
410 def my_account_auth_tokens_delete(self):
411 auth_token = request.POST.get('del_auth_token')
412 user_id = c.rhodecode_user.user_id
413 if request.POST.get('del_auth_token_builtin'):
414 user = User.get(user_id)
415 if user:
416 user.api_key = generate_auth_token(user.username)
417 Session().add(user)
418 Session().commit()
419 h.flash(_("Auth token successfully reset"), category='success')
420 elif auth_token:
421 AuthTokenModel().delete(auth_token, c.rhodecode_user.user_id)
422 Session().commit()
423 h.flash(_("Auth token successfully deleted"), category='success')
424
425 return redirect(url('my_account_auth_tokens'))
426
427 def my_notifications(self):
323 def my_notifications(self):
428 c.active = 'notifications'
324 c.active = 'notifications'
429 return render('admin/my_account/my_account.mako')
325 return render('admin/my_account/my_account.mako')
@@ -36,7 +36,8 b' from pyramid.threadlocal import get_curr'
36 from webob.exc import HTTPBadRequest
36 from webob.exc import HTTPBadRequest
37
37
38 import rhodecode
38 import rhodecode
39 from rhodecode.admin.navigation import navigation_list
39 from rhodecode.apps.admin.navigation import navigation_list
40 from rhodecode.apps.svn_support.config_keys import generate_config
40 from rhodecode.lib import auth
41 from rhodecode.lib import auth
41 from rhodecode.lib import helpers as h
42 from rhodecode.lib import helpers as h
42 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
43 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
@@ -62,7 +63,6 b' from rhodecode.model.settings import ('
62 SettingsModel)
63 SettingsModel)
63
64
64 from rhodecode.model.supervisor import SupervisorModel, SUPERVISOR_MASTER
65 from rhodecode.model.supervisor import SupervisorModel, SUPERVISOR_MASTER
65 from rhodecode.svn_support.config_keys import generate_config
66
66
67
67
68 log = logging.getLogger(__name__)
68 log = logging.getLogger(__name__)
@@ -82,7 +82,7 b' class SettingsController(BaseController)'
82 rhodecode.CONFIG.get('labs_settings_active', 'true'))
82 rhodecode.CONFIG.get('labs_settings_active', 'true'))
83 c.navlist = navigation_list(request)
83 c.navlist = navigation_list(request)
84
84
85 def _get_hg_ui_settings(self):
85 def _get_ui_settings(self):
86 ret = RhodeCodeUi.query().all()
86 ret = RhodeCodeUi.query().all()
87
87
88 if not ret:
88 if not ret:
@@ -94,7 +94,7 b' class SettingsController(BaseController)'
94 if k == '/':
94 if k == '/':
95 k = 'root_path'
95 k = 'root_path'
96
96
97 if k in ['push_ssl', 'publish']:
97 if k in ['push_ssl', 'publish', 'enabled']:
98 v = str2bool(v)
98 v = str2bool(v)
99
99
100 if k.find('.') != -1:
100 if k.find('.') != -1:
@@ -165,6 +165,7 b' class SettingsController(BaseController)'
165
165
166 model.create_or_update_global_svn_settings(form_result)
166 model.create_or_update_global_svn_settings(form_result)
167 model.create_or_update_global_hg_settings(form_result)
167 model.create_or_update_global_hg_settings(form_result)
168 model.create_or_update_global_git_settings(form_result)
168 model.create_or_update_global_pr_settings(form_result)
169 model.create_or_update_global_pr_settings(form_result)
169 except Exception:
170 except Exception:
170 log.exception("Exception while updating settings")
171 log.exception("Exception while updating settings")
@@ -668,7 +669,8 b' class SettingsController(BaseController)'
668
669
669 def _form_defaults(self):
670 def _form_defaults(self):
670 defaults = SettingsModel().get_all_settings()
671 defaults = SettingsModel().get_all_settings()
671 defaults.update(self._get_hg_ui_settings())
672 defaults.update(self._get_ui_settings())
673
672 defaults.update({
674 defaults.update({
673 'new_svn_branch': '',
675 'new_svn_branch': '',
674 'new_svn_tag': '',
676 'new_svn_tag': '',
@@ -117,7 +117,7 b' class UserGroupsController(BaseControlle'
117 def user_group_actions(user_group_id, user_group_name):
117 def user_group_actions(user_group_id, user_group_name):
118 return _render("user_group_actions", user_group_id, user_group_name)
118 return _render("user_group_actions", user_group_id, user_group_name)
119
119
120 ## json generate
120 # json generate
121 group_iter = UserGroupList(UserGroup.query().all(),
121 group_iter = UserGroupList(UserGroup.query().all(),
122 perm_set=['usergroup.admin'])
122 perm_set=['usergroup.admin'])
123
123
@@ -129,6 +129,7 b' class UserGroupsController(BaseControlle'
129 "group_name_raw": user_gr.users_group_name,
129 "group_name_raw": user_gr.users_group_name,
130 "desc": h.escape(user_gr.user_group_description),
130 "desc": h.escape(user_gr.user_group_description),
131 "members": len(user_gr.members),
131 "members": len(user_gr.members),
132 "sync": user_gr.group_data.get('extern_type'),
132 "active": h.bool2icon(user_gr.users_group_active),
133 "active": h.bool2icon(user_gr.users_group_active),
133 "owner": h.escape(h.link_to_user(user_gr.user.username)),
134 "owner": h.escape(h.link_to_user(user_gr.user.username)),
134 "action": user_group_actions(
135 "action": user_group_actions(
@@ -431,7 +432,6 b' class UserGroupsController(BaseControlle'
431 prefix_error=False,
432 prefix_error=False,
432 encoding="UTF-8",
433 encoding="UTF-8",
433 force_defaults=False)
434 force_defaults=False)
434
435 except Exception:
435 except Exception:
436 log.exception("Exception during permissions saving")
436 log.exception("Exception during permissions saving")
437 h.flash(_('An error occurred during permissions saving'),
437 h.flash(_('An error occurred during permissions saving'),
@@ -459,6 +459,36 b' class UserGroupsController(BaseControlle'
459 return render('admin/user_groups/user_group_edit.mako')
459 return render('admin/user_groups/user_group_edit.mako')
460
460
461 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
461 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
462 def edit_advanced_set_synchronization(self, user_group_id):
463 user_group_id = safe_int(user_group_id)
464 user_group = UserGroup.get_or_404(user_group_id)
465
466 existing = user_group.group_data.get('extern_type')
467
468 if existing:
469 new_state = user_group.group_data
470 new_state['extern_type'] = None
471 else:
472 new_state = user_group.group_data
473 new_state['extern_type'] = 'manual'
474 new_state['extern_type_set_by'] = c.rhodecode_user.username
475
476 try:
477 user_group.group_data = new_state
478 Session().add(user_group)
479 Session().commit()
480
481 h.flash(_('User Group synchronization updated successfully'),
482 category='success')
483 except Exception:
484 log.exception("Exception during sync settings saving")
485 h.flash(_('An error occurred during synchronization update'),
486 category='error')
487
488 return redirect(
489 url('edit_user_group_advanced', user_group_id=user_group_id))
490
491 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
462 @XHRRequired()
492 @XHRRequired()
463 @jsonify
493 @jsonify
464 def user_group_members(self, user_group_id):
494 def user_group_members(self, user_group_id):
@@ -50,7 +50,6 b' from rhodecode.model.user import UserMod'
50 from rhodecode.model.meta import Session
50 from rhodecode.model.meta import Session
51 from rhodecode.model.permission import PermissionModel
51 from rhodecode.model.permission import PermissionModel
52 from rhodecode.lib.utils import action_logger
52 from rhodecode.lib.utils import action_logger
53 from rhodecode.lib.ext_json import json
54 from rhodecode.lib.utils2 import datetime_to_time, safe_int, AttributeDict
53 from rhodecode.lib.utils2 import datetime_to_time, safe_int, AttributeDict
55
54
56 log = logging.getLogger(__name__)
55 log = logging.getLogger(__name__)
@@ -76,51 +75,6 b' class UsersController(BaseController):'
76 ]
75 ]
77 PermissionModel().set_global_permission_choices(c, gettext_translator=_)
76 PermissionModel().set_global_permission_choices(c, gettext_translator=_)
78
77
79 @HasPermissionAllDecorator('hg.admin')
80 def index(self):
81 """GET /users: All items in the collection"""
82 # url('users')
83
84 from rhodecode.lib.utils import PartialRenderer
85 _render = PartialRenderer('data_table/_dt_elements.mako')
86
87 def username(user_id, username):
88 return _render("user_name", user_id, username)
89
90 def user_actions(user_id, username):
91 return _render("user_actions", user_id, username)
92
93 # json generate
94 c.users_list = User.query()\
95 .filter(User.username != User.DEFAULT_USER) \
96 .all()
97
98 users_data = []
99 for user in c.users_list:
100 users_data.append({
101 "username": h.gravatar_with_user(user.username),
102 "username_raw": user.username,
103 "email": user.email,
104 "first_name": h.escape(user.name),
105 "last_name": h.escape(user.lastname),
106 "last_login": h.format_date(user.last_login),
107 "last_login_raw": datetime_to_time(user.last_login),
108 "last_activity": h.format_date(
109 h.time_to_datetime(user.user_data.get('last_activity', 0))),
110 "last_activity_raw": user.user_data.get('last_activity', 0),
111 "active": h.bool2icon(user.active),
112 "active_raw": user.active,
113 "admin": h.bool2icon(user.admin),
114 "admin_raw": user.admin,
115 "extern_type": user.extern_type,
116 "extern_name": user.extern_name,
117 "action": user_actions(user.user_id, user.username),
118 })
119
120
121 c.data = json.dumps(users_data)
122 return render('admin/users/users.mako')
123
124 def _get_personal_repo_group_template_vars(self):
78 def _get_personal_repo_group_template_vars(self):
125 DummyUser = AttributeDict({
79 DummyUser = AttributeDict({
126 'username': '${username}',
80 'username': '${username}',
@@ -135,7 +89,6 b' class UsersController(BaseController):'
135 @auth.CSRFRequired()
89 @auth.CSRFRequired()
136 def create(self):
90 def create(self):
137 """POST /users: Create a new item"""
91 """POST /users: Create a new item"""
138 # url('users')
139 c.default_extern_type = auth_rhodecode.RhodeCodeAuthPlugin.name
92 c.default_extern_type = auth_rhodecode.RhodeCodeAuthPlugin.name
140 user_model = UserModel()
93 user_model = UserModel()
141 user_form = UserForm()()
94 user_form = UserForm()()
@@ -168,7 +121,7 b' class UsersController(BaseController):'
168 log.exception("Exception creation of user")
121 log.exception("Exception creation of user")
169 h.flash(_('Error occurred during creation of user %s')
122 h.flash(_('Error occurred during creation of user %s')
170 % request.POST.get('username'), category='error')
123 % request.POST.get('username'), category='error')
171 return redirect(url('users'))
124 return redirect(h.route_path('users'))
172
125
173 @HasPermissionAllDecorator('hg.admin')
126 @HasPermissionAllDecorator('hg.admin')
174 def new(self):
127 def new(self):
@@ -312,7 +265,7 b' class UsersController(BaseController):'
312 log.exception("Exception during deletion of user")
265 log.exception("Exception during deletion of user")
313 h.flash(_('An error occurred during deletion of user'),
266 h.flash(_('An error occurred during deletion of user'),
314 category='error')
267 category='error')
315 return redirect(url('users'))
268 return redirect(h.route_path('users'))
316
269
317 @HasPermissionAllDecorator('hg.admin')
270 @HasPermissionAllDecorator('hg.admin')
318 @auth.CSRFRequired()
271 @auth.CSRFRequired()
@@ -404,7 +357,7 b' class UsersController(BaseController):'
404 c.user = User.get_or_404(user_id)
357 c.user = User.get_or_404(user_id)
405 if c.user.username == User.DEFAULT_USER:
358 if c.user.username == User.DEFAULT_USER:
406 h.flash(_("You can't edit this user"), category='warning')
359 h.flash(_("You can't edit this user"), category='warning')
407 return redirect(url('users'))
360 return redirect(h.route_path('users'))
408
361
409 c.active = 'profile'
362 c.active = 'profile'
410 c.extern_type = c.user.extern_type
363 c.extern_type = c.user.extern_type
@@ -425,7 +378,7 b' class UsersController(BaseController):'
425 user = c.user = User.get_or_404(user_id)
378 user = c.user = User.get_or_404(user_id)
426 if user.username == User.DEFAULT_USER:
379 if user.username == User.DEFAULT_USER:
427 h.flash(_("You can't edit this user"), category='warning')
380 h.flash(_("You can't edit this user"), category='warning')
428 return redirect(url('users'))
381 return redirect(h.route_path('users'))
429
382
430 c.active = 'advanced'
383 c.active = 'advanced'
431 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
384 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
@@ -452,83 +405,12 b' class UsersController(BaseController):'
452 force_defaults=False)
405 force_defaults=False)
453
406
454 @HasPermissionAllDecorator('hg.admin')
407 @HasPermissionAllDecorator('hg.admin')
455 def edit_auth_tokens(self, user_id):
456 user_id = safe_int(user_id)
457 c.user = User.get_or_404(user_id)
458 if c.user.username == User.DEFAULT_USER:
459 h.flash(_("You can't edit this user"), category='warning')
460 return redirect(url('users'))
461
462 c.active = 'auth_tokens'
463 show_expired = True
464 c.lifetime_values = [
465 (str(-1), _('forever')),
466 (str(5), _('5 minutes')),
467 (str(60), _('1 hour')),
468 (str(60 * 24), _('1 day')),
469 (str(60 * 24 * 30), _('1 month')),
470 ]
471 c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
472 c.role_values = [(x, AuthTokenModel.cls._get_role_name(x))
473 for x in AuthTokenModel.cls.ROLES]
474 c.role_options = [(c.role_values, _("Role"))]
475 c.user_auth_tokens = AuthTokenModel().get_auth_tokens(
476 c.user.user_id, show_expired=show_expired)
477 defaults = c.user.get_dict()
478 return htmlfill.render(
479 render('admin/users/user_edit.mako'),
480 defaults=defaults,
481 encoding="UTF-8",
482 force_defaults=False)
483
484 @HasPermissionAllDecorator('hg.admin')
485 @auth.CSRFRequired()
486 def add_auth_token(self, user_id):
487 user_id = safe_int(user_id)
488 c.user = User.get_or_404(user_id)
489 if c.user.username == User.DEFAULT_USER:
490 h.flash(_("You can't edit this user"), category='warning')
491 return redirect(url('users'))
492
493 lifetime = safe_int(request.POST.get('lifetime'), -1)
494 description = request.POST.get('description')
495 role = request.POST.get('role')
496 AuthTokenModel().create(c.user.user_id, description, lifetime, role)
497 Session().commit()
498 h.flash(_("Auth token successfully created"), category='success')
499 return redirect(url('edit_user_auth_tokens', user_id=c.user.user_id))
500
501 @HasPermissionAllDecorator('hg.admin')
502 @auth.CSRFRequired()
503 def delete_auth_token(self, user_id):
504 user_id = safe_int(user_id)
505 c.user = User.get_or_404(user_id)
506 if c.user.username == User.DEFAULT_USER:
507 h.flash(_("You can't edit this user"), category='warning')
508 return redirect(url('users'))
509
510 auth_token = request.POST.get('del_auth_token')
511 if request.POST.get('del_auth_token_builtin'):
512 user = User.get(c.user.user_id)
513 if user:
514 user.api_key = generate_auth_token(user.username)
515 Session().add(user)
516 Session().commit()
517 h.flash(_("Auth token successfully reset"), category='success')
518 elif auth_token:
519 AuthTokenModel().delete(auth_token, c.user.user_id)
520 Session().commit()
521 h.flash(_("Auth token successfully deleted"), category='success')
522
523 return redirect(url('edit_user_auth_tokens', user_id=c.user.user_id))
524
525 @HasPermissionAllDecorator('hg.admin')
526 def edit_global_perms(self, user_id):
408 def edit_global_perms(self, user_id):
527 user_id = safe_int(user_id)
409 user_id = safe_int(user_id)
528 c.user = User.get_or_404(user_id)
410 c.user = User.get_or_404(user_id)
529 if c.user.username == User.DEFAULT_USER:
411 if c.user.username == User.DEFAULT_USER:
530 h.flash(_("You can't edit this user"), category='warning')
412 h.flash(_("You can't edit this user"), category='warning')
531 return redirect(url('users'))
413 return redirect(h.route_path('users'))
532
414
533 c.active = 'global_perms'
415 c.active = 'global_perms'
534
416
@@ -602,7 +484,7 b' class UsersController(BaseController):'
602 c.user = User.get_or_404(user_id)
484 c.user = User.get_or_404(user_id)
603 if c.user.username == User.DEFAULT_USER:
485 if c.user.username == User.DEFAULT_USER:
604 h.flash(_("You can't edit this user"), category='warning')
486 h.flash(_("You can't edit this user"), category='warning')
605 return redirect(url('users'))
487 return redirect(h.route_path('users'))
606
488
607 c.active = 'perms_summary'
489 c.active = 'perms_summary'
608 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
490 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
@@ -615,7 +497,7 b' class UsersController(BaseController):'
615 c.user = User.get_or_404(user_id)
497 c.user = User.get_or_404(user_id)
616 if c.user.username == User.DEFAULT_USER:
498 if c.user.username == User.DEFAULT_USER:
617 h.flash(_("You can't edit this user"), category='warning')
499 h.flash(_("You can't edit this user"), category='warning')
618 return redirect(url('users'))
500 return redirect(h.route_path('users'))
619
501
620 c.active = 'emails'
502 c.active = 'emails'
621 c.user_email_map = UserEmailMap.query() \
503 c.user_email_map = UserEmailMap.query() \
@@ -673,7 +555,7 b' class UsersController(BaseController):'
673 c.user = User.get_or_404(user_id)
555 c.user = User.get_or_404(user_id)
674 if c.user.username == User.DEFAULT_USER:
556 if c.user.username == User.DEFAULT_USER:
675 h.flash(_("You can't edit this user"), category='warning')
557 h.flash(_("You can't edit this user"), category='warning')
676 return redirect(url('users'))
558 return redirect(h.route_path('users'))
677
559
678 c.active = 'ips'
560 c.active = 'ips'
679 c.user_ip_map = UserIpMap.query() \
561 c.user_ip_map = UserIpMap.query() \
@@ -28,12 +28,11 b' import pytz'
28 from pylons import url, response, tmpl_context as c
28 from pylons import url, response, tmpl_context as c
29 from pylons.i18n.translation import _
29 from pylons.i18n.translation import _
30
30
31 from beaker.cache import cache_region, region_invalidate
31 from beaker.cache import cache_region
32 from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed
32 from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed
33
33
34 from rhodecode.model.db import CacheKey
34 from rhodecode.model.db import CacheKey, UserApiKeys
35 from rhodecode.lib import helpers as h
35 from rhodecode.lib import helpers as h
36 from rhodecode.lib import caches
37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
36 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
38 from rhodecode.lib.base import BaseRepoController
37 from rhodecode.lib.base import BaseRepoController
39 from rhodecode.lib.diffs import DiffProcessor, LimitedDiffContainer
38 from rhodecode.lib.diffs import DiffProcessor, LimitedDiffContainer
@@ -62,7 +61,7 b' class FeedController(BaseRepoController)'
62 safe_int(config.get('rss_cut_off_limit', 32 * 1024)),
61 safe_int(config.get('rss_cut_off_limit', 32 * 1024)),
63 }
62 }
64
63
65 @LoginRequired(auth_token_access=True)
64 @LoginRequired(auth_token_access=[UserApiKeys.ROLE_FEED])
66 def __before__(self):
65 def __before__(self):
67 super(FeedController, self).__before__()
66 super(FeedController, self).__before__()
68 config = self._get_config()
67 config = self._get_config()
@@ -223,6 +223,8 b' class FilesController(BaseRepoController'
223 c.file_author = True
223 c.file_author = True
224 c.file_tree = ''
224 c.file_tree = ''
225 if c.file.is_file():
225 if c.file.is_file():
226 c.lf_node = c.file.get_largefile_node()
227
226 c.file_source_page = 'true'
228 c.file_source_page = 'true'
227 c.file_last_commit = c.file.last_commit
229 c.file_last_commit = c.file.last_commit
228 if c.file.size < self.cut_off_limit_file:
230 if c.file.size < self.cut_off_limit_file:
@@ -239,7 +241,11 b' class FilesController(BaseRepoController'
239
241
240 c.on_branch_head = self._is_valid_head(
242 c.on_branch_head = self._is_valid_head(
241 commit_id, c.rhodecode_repo)
243 commit_id, c.rhodecode_repo)
242 c.branch_or_raw_id = c.commit.branch or c.commit.raw_id
244
245 branch = c.commit.branch if (
246 c.commit.branch and '/' not in c.commit.branch) else None
247 c.branch_or_raw_id = branch or c.commit.raw_id
248 c.branch_name = c.commit.branch or h.short_id(c.commit.raw_id)
243
249
244 author = c.file_last_commit.author
250 author = c.file_last_commit.author
245 c.authors = [(h.email(author),
251 c.authors = [(h.email(author),
@@ -260,6 +266,32 b' class FilesController(BaseRepoController'
260 return render('files/files.mako')
266 return render('files/files.mako')
261
267
262 @LoginRequired()
268 @LoginRequired()
269 @HasRepoPermissionAnyDecorator(
270 'repository.read', 'repository.write', 'repository.admin')
271 def annotate_previous(self, repo_name, revision, f_path):
272
273 commit_id = revision
274 commit = self.__get_commit_or_redirect(commit_id, repo_name)
275 prev_commit_id = commit.raw_id
276
277 f_path = f_path
278 is_file = False
279 try:
280 _file = commit.get_node(f_path)
281 is_file = _file.is_file()
282 except (NodeDoesNotExistError, CommitDoesNotExistError, VCSError):
283 pass
284
285 if is_file:
286 history = commit.get_file_history(f_path)
287 prev_commit_id = history[1].raw_id \
288 if len(history) > 1 else prev_commit_id
289
290 return redirect(h.url(
291 'files_annotate_home', repo_name=repo_name,
292 revision=prev_commit_id, f_path=f_path))
293
294 @LoginRequired()
263 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
295 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
264 'repository.admin')
296 'repository.admin')
265 @jsonify
297 @jsonify
@@ -317,6 +349,14 b' class FilesController(BaseRepoController'
317 commit = self.__get_commit_or_redirect(revision, repo_name)
349 commit = self.__get_commit_or_redirect(revision, repo_name)
318 file_node = self.__get_filenode_or_redirect(repo_name, commit, f_path)
350 file_node = self.__get_filenode_or_redirect(repo_name, commit, f_path)
319
351
352 if request.GET.get('lf'):
353 # only if lf get flag is passed, we download this file
354 # as LFS/Largefile
355 lf_node = file_node.get_largefile_node()
356 if lf_node:
357 # overwrite our pointer with the REAL large-file
358 file_node = lf_node
359
320 response.content_disposition = 'attachment; filename=%s' % \
360 response.content_disposition = 'attachment; filename=%s' % \
321 safe_str(f_path.split(Repository.NAME_SEP)[-1])
361 safe_str(f_path.split(Repository.NAME_SEP)[-1])
322
362
@@ -352,6 +392,7 b' class FilesController(BaseRepoController'
352 'image/png': ('image/png', 'inline'),
392 'image/png': ('image/png', 'inline'),
353 'image/gif': ('image/gif', 'inline'),
393 'image/gif': ('image/gif', 'inline'),
354 'image/jpeg': ('image/jpeg', 'inline'),
394 'image/jpeg': ('image/jpeg', 'inline'),
395 'application/pdf': ('application/pdf', 'inline'),
355 }
396 }
356
397
357 mimetype = file_node.mimetype
398 mimetype = file_node.mimetype
@@ -34,8 +34,8 b' from webob.exc import HTTPBadRequest'
34 from pylons import request, tmpl_context as c, response, url
34 from pylons import request, tmpl_context as c, response, url
35 from pylons.i18n.translation import _
35 from pylons.i18n.translation import _
36
36
37 from rhodecode.controllers.admin.admin import _journal_filter
37 from rhodecode.controllers.admin.admin import user_log_filter
38 from rhodecode.model.db import UserLog, UserFollowing, User
38 from rhodecode.model.db import UserLog, UserFollowing, User, UserApiKeys
39 from rhodecode.model.meta import Session
39 from rhodecode.model.meta import Session
40 import rhodecode.lib.helpers as h
40 import rhodecode.lib.helpers as h
41 from rhodecode.lib.helpers import Page
41 from rhodecode.lib.helpers import Page
@@ -89,7 +89,7 b' class JournalController(BaseController):'
89 .options(joinedload(UserLog.repository))
89 .options(joinedload(UserLog.repository))
90 #filter
90 #filter
91 try:
91 try:
92 journal = _journal_filter(journal, c.search_term)
92 journal = user_log_filter(journal, c.search_term)
93 except Exception:
93 except Exception:
94 # we want this to crash for now
94 # we want this to crash for now
95 raise
95 raise
@@ -211,7 +211,7 b' class JournalController(BaseController):'
211
211
212 return render('journal/journal.mako')
212 return render('journal/journal.mako')
213
213
214 @LoginRequired(auth_token_access=True)
214 @LoginRequired(auth_token_access=[UserApiKeys.ROLE_FEED])
215 @NotAnonymous()
215 @NotAnonymous()
216 def journal_atom(self):
216 def journal_atom(self):
217 """
217 """
@@ -223,7 +223,7 b' class JournalController(BaseController):'
223 .all()
223 .all()
224 return self._atom_feed(following, public=False)
224 return self._atom_feed(following, public=False)
225
225
226 @LoginRequired(auth_token_access=True)
226 @LoginRequired(auth_token_access=[UserApiKeys.ROLE_FEED])
227 @NotAnonymous()
227 @NotAnonymous()
228 def journal_rss(self):
228 def journal_rss(self):
229 """
229 """
@@ -281,7 +281,7 b' class JournalController(BaseController):'
281 return c.journal_data
281 return c.journal_data
282 return render('journal/public_journal.mako')
282 return render('journal/public_journal.mako')
283
283
284 @LoginRequired(auth_token_access=True)
284 @LoginRequired(auth_token_access=[UserApiKeys.ROLE_FEED])
285 def public_journal_atom(self):
285 def public_journal_atom(self):
286 """
286 """
287 Produce an atom-1.0 feed via feedgenerator module
287 Produce an atom-1.0 feed via feedgenerator module
@@ -293,7 +293,7 b' class JournalController(BaseController):'
293
293
294 return self._atom_feed(c.following)
294 return self._atom_feed(c.following)
295
295
296 @LoginRequired(auth_token_access=True)
296 @LoginRequired(auth_token_access=[UserApiKeys.ROLE_FEED])
297 def public_journal_rss(self):
297 def public_journal_rss(self):
298 """
298 """
299 Produce an rss2 feed via feedgenerator module
299 Produce an rss2 feed via feedgenerator module
@@ -69,6 +69,8 b' class PullrequestsController(BaseRepoCon'
69
69
70 def __before__(self):
70 def __before__(self):
71 super(PullrequestsController, self).__before__()
71 super(PullrequestsController, self).__before__()
72 c.REVIEW_STATUS_APPROVED = ChangesetStatus.STATUS_APPROVED
73 c.REVIEW_STATUS_REJECTED = ChangesetStatus.STATUS_REJECTED
72
74
73 def _extract_ordering(self, request):
75 def _extract_ordering(self, request):
74 column_index = safe_int(request.GET.get('order[0][column]'))
76 column_index = safe_int(request.GET.get('order[0][column]'))
@@ -440,13 +442,25 b' class PullrequestsController(BaseRepoCon'
440 resp = PullRequestModel().update_commits(pull_request)
442 resp = PullRequestModel().update_commits(pull_request)
441
443
442 if resp.executed:
444 if resp.executed:
445
446 if resp.target_changed and resp.source_changed:
447 changed = 'target and source repositories'
448 elif resp.target_changed and not resp.source_changed:
449 changed = 'target repository'
450 elif not resp.target_changed and resp.source_changed:
451 changed = 'source repository'
452 else:
453 changed = 'nothing'
454
443 msg = _(
455 msg = _(
444 u'Pull request updated to "{source_commit_id}" with '
456 u'Pull request updated to "{source_commit_id}" with '
445 u'{count_added} added, {count_removed} removed commits.')
457 u'{count_added} added, {count_removed} removed commits. '
458 u'Source of changes: {change_source}')
446 msg = msg.format(
459 msg = msg.format(
447 source_commit_id=pull_request.source_ref_parts.commit_id,
460 source_commit_id=pull_request.source_ref_parts.commit_id,
448 count_added=len(resp.changes.added),
461 count_added=len(resp.changes.added),
449 count_removed=len(resp.changes.removed))
462 count_removed=len(resp.changes.removed),
463 change_source=changed)
450 h.flash(msg, category='success')
464 h.flash(msg, category='success')
451
465
452 registry = get_current_registry()
466 registry = get_current_registry()
@@ -562,13 +576,21 b' class PullrequestsController(BaseRepoCon'
562 def delete(self, repo_name, pull_request_id):
576 def delete(self, repo_name, pull_request_id):
563 pull_request_id = safe_int(pull_request_id)
577 pull_request_id = safe_int(pull_request_id)
564 pull_request = PullRequest.get_or_404(pull_request_id)
578 pull_request = PullRequest.get_or_404(pull_request_id)
579
580 pr_closed = pull_request.is_closed()
581 allowed_to_delete = PullRequestModel().check_user_delete(
582 pull_request, c.rhodecode_user) and not pr_closed
583
565 # only owner can delete it !
584 # only owner can delete it !
566 if pull_request.author.user_id == c.rhodecode_user.user_id:
585 if allowed_to_delete:
567 PullRequestModel().delete(pull_request)
586 PullRequestModel().delete(pull_request)
568 Session().commit()
587 Session().commit()
569 h.flash(_('Successfully deleted pull request'),
588 h.flash(_('Successfully deleted pull request'),
570 category='success')
589 category='success')
571 return redirect(url('my_account_pullrequests'))
590 return redirect(url('my_account_pullrequests'))
591
592 h.flash(_('Your are not allowed to delete this pull request'),
593 category='error')
572 raise HTTPForbidden()
594 raise HTTPForbidden()
573
595
574 def _get_pr_version(self, pull_request_id, version=None):
596 def _get_pr_version(self, pull_request_id, version=None):
@@ -642,6 +664,13 b' class PullrequestsController(BaseRepoCon'
642 pull_request_display_obj,
664 pull_request_display_obj,
643 at_version) = self._get_pr_version(
665 at_version) = self._get_pr_version(
644 pull_request_id, version=version)
666 pull_request_id, version=version)
667 pr_closed = pull_request_latest.is_closed()
668
669 if pr_closed and (version or from_version):
670 # not allow to browse versions
671 return redirect(h.url('pullrequest_show', repo_name=repo_name,
672 pull_request_id=pull_request_id))
673
645 versions = pull_request_display_obj.versions()
674 versions = pull_request_display_obj.versions()
646
675
647 c.at_version = at_version
676 c.at_version = at_version
@@ -675,20 +704,21 b' class PullrequestsController(BaseRepoCon'
675 c.shadow_clone_url = PullRequestModel().get_shadow_clone_url(
704 c.shadow_clone_url = PullRequestModel().get_shadow_clone_url(
676 pull_request_at_ver)
705 pull_request_at_ver)
677
706
678 c.ancestor = None # empty ancestor hidden in display
679 c.pull_request = pull_request_display_obj
707 c.pull_request = pull_request_display_obj
680 c.pull_request_latest = pull_request_latest
708 c.pull_request_latest = pull_request_latest
681
709
682 pr_closed = pull_request_latest.is_closed()
683 if compare or (at_version and not at_version == 'latest'):
710 if compare or (at_version and not at_version == 'latest'):
684 c.allowed_to_change_status = False
711 c.allowed_to_change_status = False
685 c.allowed_to_update = False
712 c.allowed_to_update = False
686 c.allowed_to_merge = False
713 c.allowed_to_merge = False
687 c.allowed_to_delete = False
714 c.allowed_to_delete = False
688 c.allowed_to_comment = False
715 c.allowed_to_comment = False
716 c.allowed_to_close = False
689 else:
717 else:
690 c.allowed_to_change_status = PullRequestModel(). \
718 c.allowed_to_change_status = PullRequestModel(). \
691 check_user_change_status(pull_request_at_ver, c.rhodecode_user)
719 check_user_change_status(pull_request_at_ver, c.rhodecode_user) \
720 and not pr_closed
721
692 c.allowed_to_update = PullRequestModel().check_user_update(
722 c.allowed_to_update = PullRequestModel().check_user_update(
693 pull_request_latest, c.rhodecode_user) and not pr_closed
723 pull_request_latest, c.rhodecode_user) and not pr_closed
694 c.allowed_to_merge = PullRequestModel().check_user_merge(
724 c.allowed_to_merge = PullRequestModel().check_user_merge(
@@ -696,6 +726,7 b' class PullrequestsController(BaseRepoCon'
696 c.allowed_to_delete = PullRequestModel().check_user_delete(
726 c.allowed_to_delete = PullRequestModel().check_user_delete(
697 pull_request_latest, c.rhodecode_user) and not pr_closed
727 pull_request_latest, c.rhodecode_user) and not pr_closed
698 c.allowed_to_comment = not pr_closed
728 c.allowed_to_comment = not pr_closed
729 c.allowed_to_close = c.allowed_to_change_status and not pr_closed
699
730
700 # check merge capabilities
731 # check merge capabilities
701 _merge_check = MergeCheck.validate(
732 _merge_check = MergeCheck.validate(
@@ -704,6 +735,7 b' class PullrequestsController(BaseRepoCon'
704 c.pr_merge_possible = not _merge_check.failed
735 c.pr_merge_possible = not _merge_check.failed
705 c.pr_merge_message = _merge_check.merge_msg
736 c.pr_merge_message = _merge_check.merge_msg
706
737
738 c.pull_request_review_status = _merge_check.review_status
707 if merge_checks:
739 if merge_checks:
708 return render('/pullrequests/pullrequest_merge_checks.mako')
740 return render('/pullrequests/pullrequest_merge_checks.mako')
709
741
@@ -712,7 +744,6 b' class PullrequestsController(BaseRepoCon'
712 # reviewers and statuses
744 # reviewers and statuses
713 c.pull_request_reviewers = pull_request_at_ver.reviewers_statuses()
745 c.pull_request_reviewers = pull_request_at_ver.reviewers_statuses()
714 allowed_reviewers = [x[0].user_id for x in c.pull_request_reviewers]
746 allowed_reviewers = [x[0].user_id for x in c.pull_request_reviewers]
715 c.pull_request_review_status = pull_request_at_ver.calculated_review_status()
716
747
717 # GENERAL COMMENTS with versions #
748 # GENERAL COMMENTS with versions #
718 q = comments_model._all_general_comments_of_pull_request(pull_request_latest)
749 q = comments_model._all_general_comments_of_pull_request(pull_request_latest)
@@ -789,12 +820,15 b' class PullrequestsController(BaseRepoCon'
789 target_commit = EmptyCommit()
820 target_commit = EmptyCommit()
790 c.missing_requirements = False
821 c.missing_requirements = False
791
822
823 source_scm = source_repo.scm_instance()
824 target_scm = target_repo.scm_instance()
825
792 # try first shadow repo, fallback to regular repo
826 # try first shadow repo, fallback to regular repo
793 try:
827 try:
794 commits_source_repo = pull_request_latest.get_shadow_repo()
828 commits_source_repo = pull_request_latest.get_shadow_repo()
795 except Exception:
829 except Exception:
796 log.debug('Failed to get shadow repo', exc_info=True)
830 log.debug('Failed to get shadow repo', exc_info=True)
797 commits_source_repo = source_repo.scm_instance()
831 commits_source_repo = source_scm
798
832
799 c.commits_source_repo = commits_source_repo
833 c.commits_source_repo = commits_source_repo
800 commit_cache = {}
834 commit_cache = {}
@@ -818,6 +852,15 b' class PullrequestsController(BaseRepoCon'
818 'Failed to get all required data from repo', exc_info=True)
852 'Failed to get all required data from repo', exc_info=True)
819 c.missing_requirements = True
853 c.missing_requirements = True
820
854
855 c.ancestor = None # set it to None, to hide it from PR view
856
857 try:
858 ancestor_id = source_scm.get_common_ancestor(
859 source_commit.raw_id, target_commit.raw_id, target_scm)
860 c.ancestor_commit = source_scm.get_commit(ancestor_id)
861 except Exception:
862 c.ancestor_commit = None
863
821 c.statuses = source_repo.statuses(
864 c.statuses = source_repo.statuses(
822 [x.raw_id for x in c.commit_ranges])
865 [x.raw_id for x in c.commit_ranges])
823
866
@@ -860,12 +903,7 b' class PullrequestsController(BaseRepoCon'
860 # We need to swap that here to generate it properly on the html side
903 # We need to swap that here to generate it properly on the html side
861 c.target_repo = c.source_repo
904 c.target_repo = c.source_repo
862
905
863 if c.allowed_to_update:
906 c.commit_statuses = ChangesetStatus.STATUSES
864 force_close = ('forced_closed', _('Close Pull Request'))
865 statuses = ChangesetStatus.STATUSES + [force_close]
866 else:
867 statuses = ChangesetStatus.STATUSES
868 c.commit_statuses = statuses
869
907
870 c.show_version_changes = not pr_closed
908 c.show_version_changes = not pr_closed
871 if c.show_version_changes:
909 if c.show_version_changes:
@@ -924,22 +962,21 b' class PullrequestsController(BaseRepoCon'
924 if pull_request.is_closed():
962 if pull_request.is_closed():
925 raise HTTPForbidden()
963 raise HTTPForbidden()
926
964
927 # TODO: johbo: Re-think this bit, "approved_closed" does not exist
928 # as a changeset status, still we want to send it in one value.
929 status = request.POST.get('changeset_status', None)
965 status = request.POST.get('changeset_status', None)
930 text = request.POST.get('text')
966 text = request.POST.get('text')
931 comment_type = request.POST.get('comment_type')
967 comment_type = request.POST.get('comment_type')
932 resolves_comment_id = request.POST.get('resolves_comment_id', None)
968 resolves_comment_id = request.POST.get('resolves_comment_id', None)
969 close_pull_request = request.POST.get('close_pull_request')
933
970
934 if status and '_closed' in status:
971 close_pr = False
972 if close_pull_request:
935 close_pr = True
973 close_pr = True
936 status = status.replace('_closed', '')
974 pull_request_review_status = pull_request.calculated_review_status()
975 if pull_request_review_status == ChangesetStatus.STATUS_APPROVED:
976 # approved only if we have voting consent
977 status = ChangesetStatus.STATUS_APPROVED
937 else:
978 else:
938 close_pr = False
979 status = ChangesetStatus.STATUS_REJECTED
939
940 forced = (status == 'forced')
941 if forced:
942 status = 'rejected'
943
980
944 allowed_to_change_status = PullRequestModel().check_user_change_status(
981 allowed_to_change_status = PullRequestModel().check_user_change_status(
945 pull_request, c.rhodecode_user)
982 pull_request, c.rhodecode_user)
@@ -995,7 +1032,7 b' class PullrequestsController(BaseRepoCon'
995 status_completed = (
1032 status_completed = (
996 calculated_status in [ChangesetStatus.STATUS_APPROVED,
1033 calculated_status in [ChangesetStatus.STATUS_APPROVED,
997 ChangesetStatus.STATUS_REJECTED])
1034 ChangesetStatus.STATUS_REJECTED])
998 if forced or status_completed:
1035 if close_pull_request or status_completed:
999 PullRequestModel().close_pull_request(
1036 PullRequestModel().close_pull_request(
1000 pull_request_id, c.rhodecode_user)
1037 pull_request_id, c.rhodecode_user)
1001 else:
1038 else:
@@ -38,7 +38,7 b' from rhodecode.lib.utils2 import safe_st'
38 from rhodecode.lib.auth import (
38 from rhodecode.lib.auth import (
39 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, XHRRequired)
39 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, XHRRequired)
40 from rhodecode.lib.base import BaseRepoController, render
40 from rhodecode.lib.base import BaseRepoController, render
41 from rhodecode.lib.markup_renderer import MarkupRenderer
41 from rhodecode.lib.markup_renderer import MarkupRenderer, relative_links
42 from rhodecode.lib.ext_json import json
42 from rhodecode.lib.ext_json import json
43 from rhodecode.lib.vcs.backends.base import EmptyCommit
43 from rhodecode.lib.vcs.backends.base import EmptyCommit
44 from rhodecode.lib.vcs.exceptions import (
44 from rhodecode.lib.vcs.exceptions import (
@@ -70,7 +70,12 b' class SummaryController(BaseRepoControll'
70 log.debug("Searching for a README file.")
70 log.debug("Searching for a README file.")
71 readme_node = ReadmeFinder(default_renderer).search(commit)
71 readme_node = ReadmeFinder(default_renderer).search(commit)
72 if readme_node:
72 if readme_node:
73 readme_data = self._render_readme_or_none(commit, readme_node)
73 relative_url = h.url('files_raw_home',
74 repo_name=repo_name,
75 revision=commit.raw_id,
76 f_path=readme_node.path)
77 readme_data = self._render_readme_or_none(
78 commit, readme_node, relative_url)
74 readme_filename = readme_node.path
79 readme_filename = readme_node.path
75 return readme_data, readme_filename
80 return readme_data, readme_filename
76
81
@@ -95,13 +100,16 b' class SummaryController(BaseRepoControll'
95 log.exception(
100 log.exception(
96 "Problem getting commit when trying to render the README.")
101 "Problem getting commit when trying to render the README.")
97
102
98 def _render_readme_or_none(self, commit, readme_node):
103 def _render_readme_or_none(self, commit, readme_node, relative_url):
99 log.debug(
104 log.debug(
100 'Found README file `%s` rendering...', readme_node.path)
105 'Found README file `%s` rendering...', readme_node.path)
101 renderer = MarkupRenderer()
106 renderer = MarkupRenderer()
102 try:
107 try:
103 return renderer.render(
108 html_source = renderer.render(
104 readme_node.content, filename=readme_node.path)
109 readme_node.content, filename=readme_node.path)
110 if relative_url:
111 return relative_links(html_source, relative_url)
112 return html_source
105 except Exception:
113 except Exception:
106 log.exception(
114 log.exception(
107 "Exception while trying to render the README")
115 "Exception while trying to render the README")
@@ -56,8 +56,15 b' class RhodecodeEvent(object):'
56 @property
56 @property
57 def actor(self):
57 def actor(self):
58 auth_user = self.auth_user
58 auth_user = self.auth_user
59
59 if auth_user:
60 if auth_user:
60 return auth_user.get_instance()
61 instance = auth_user.get_instance()
62 if not instance:
63 return AttributeDict(dict(
64 username=auth_user.username
65 ))
66 return instance
67
61 return SYSTEM_USER
68 return SYSTEM_USER
62
69
63 @property
70 @property
@@ -128,6 +128,9 b' class PullRequestCommentEvent(PullReques'
128 'comment': {
128 'comment': {
129 'status': status,
129 'status': status,
130 'text': self.comment.text,
130 'text': self.comment.text,
131 'type': self.comment.comment_type,
132 'file': self.comment.f_path,
133 'line': self.comment.line_no,
131 'url': CommentsModel().get_url(self.comment)
134 'url': CommentsModel().get_url(self.comment)
132 }
135 }
133 })
136 })
@@ -34,10 +34,9 b' def _commits_as_dict(commit_ids, repos):'
34 :param repos: list of repos to check
34 :param repos: list of repos to check
35 """
35 """
36 from rhodecode.lib.utils2 import extract_mentioned_users
36 from rhodecode.lib.utils2 import extract_mentioned_users
37 from rhodecode.model.db import Repository
38 from rhodecode.lib import helpers as h
37 from rhodecode.lib import helpers as h
39 from rhodecode.lib.helpers import process_patterns
38 from rhodecode.lib.helpers import (
40 from rhodecode.lib.helpers import urlify_commit_message
39 urlify_commit_message, process_patterns, chop_at_smart)
41
40
42 if not repos:
41 if not repos:
43 raise Exception('no repo defined')
42 raise Exception('no repo defined')
@@ -78,14 +77,15 b' def _commits_as_dict(commit_ids, repos):'
78 cs_data['issues'] = issues_data
77 cs_data['issues'] = issues_data
79 cs_data['message_html'] = urlify_commit_message(cs_data['message'],
78 cs_data['message_html'] = urlify_commit_message(cs_data['message'],
80 repo.repo_name)
79 repo.repo_name)
80 cs_data['message_html_title'] = chop_at_smart(cs_data['message'], '\n', suffix_if_chopped='...')
81 commits.append(cs_data)
81 commits.append(cs_data)
82
82
83 needed_commits.remove(commit_id)
83 needed_commits.remove(commit_id)
84
84
85 except Exception as e:
85 except Exception as e:
86 log.exception(e)
86 log.exception(e)
87 # we don't send any commits when crash happens, only full list matters
87 # we don't send any commits when crash happens, only full list
88 # we short circuit then.
88 # matters we short circuit then.
89 return []
89 return []
90
90
91 missing_commits = set(commit_ids) - set(c['raw_id'] for c in commits)
91 missing_commits = set(commit_ids) - set(c['raw_id'] for c in commits)
This diff has been collapsed as it changes many lines, (2761 lines changed) Show them Hide them
@@ -6,9 +6,9 b''
6 #, fuzzy
6 #, fuzzy
7 msgid ""
7 msgid ""
8 msgstr ""
8 msgstr ""
9 "Project-Id-Version: rhodecode-enterprise-ce 4.6.0\n"
9 "Project-Id-Version: rhodecode-enterprise-ce 4.7.0\n"
10 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
10 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
11 "POT-Creation-Date: 2017-02-05 18:07+0100\n"
11 "POT-Creation-Date: 2017-04-07 12:33+0200\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"
@@ -17,51 +17,52 b' msgstr ""'
17 "Content-Transfer-Encoding: 8bit\n"
17 "Content-Transfer-Encoding: 8bit\n"
18 "Generated-By: Babel 1.3\n"
18 "Generated-By: Babel 1.3\n"
19
19
20 #: rhodecode/admin/navigation.py:83 rhodecode/authentication/routes.py:60
20 #: rhodecode/apps/admin/navigation.py:83 rhodecode/authentication/routes.py:60
21 #: rhodecode/integrations/views.py:167
21 #: rhodecode/integrations/views.py:166
22 #: rhodecode/templates/admin/permissions/permissions.mako:36
22 #: rhodecode/templates/admin/permissions/permissions.mako:36
23 msgid "Global"
23 msgid "Global"
24 msgstr ""
24 msgstr ""
25
25
26 #: rhodecode/admin/navigation.py:84
26 #: rhodecode/apps/admin/navigation.py:84
27 #: rhodecode/templates/admin/repos/repo_edit.mako:52
27 #: rhodecode/templates/admin/repos/repo_edit.mako:52
28 msgid "VCS"
28 msgid "VCS"
29 msgstr ""
29 msgstr ""
30
30
31 #: rhodecode/admin/navigation.py:85
31 #: rhodecode/apps/admin/navigation.py:85
32 msgid "Visual"
32 msgid "Visual"
33 msgstr ""
33 msgstr ""
34
34
35 #: rhodecode/admin/navigation.py:86
35 #: rhodecode/apps/admin/navigation.py:86
36 msgid "Remap and Rescan"
36 msgid "Remap and Rescan"
37 msgstr ""
37 msgstr ""
38
38
39 #: rhodecode/admin/navigation.py:87
39 #: rhodecode/apps/admin/navigation.py:87
40 #: rhodecode/templates/admin/repos/repo_edit.mako:58
40 #: rhodecode/templates/admin/repos/repo_edit.mako:58
41 msgid "Issue Tracker"
41 msgid "Issue Tracker"
42 msgstr ""
42 msgstr ""
43
43
44 #: rhodecode/admin/navigation.py:89 rhodecode/integrations/types/email.py:232
44 #: rhodecode/apps/admin/navigation.py:89
45 #: rhodecode/templates/register.mako:75
45 #: rhodecode/integrations/types/email.py:232
46 #: rhodecode/templates/register.mako:76
46 #: rhodecode/templates/admin/my_account/my_account_profile.mako:48
47 #: rhodecode/templates/admin/my_account/my_account_profile.mako:48
47 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:97
48 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:97
48 #: rhodecode/templates/admin/users/user_add.mako:86
49 #: rhodecode/templates/admin/users/user_add.mako:86
49 #: rhodecode/templates/admin/users/user_edit_profile.mako:65
50 #: rhodecode/templates/admin/users/user_edit_profile.mako:65
50 #: rhodecode/templates/admin/users/users.mako:92
51 #: rhodecode/templates/admin/users/users.mako:64
51 #: rhodecode/templates/email_templates/user_registration.mako:25
52 #: rhodecode/templates/email_templates/user_registration.mako:25
52 #: rhodecode/templates/users/user_profile.mako:51
53 #: rhodecode/templates/users/user_profile.mako:51
53 msgid "Email"
54 msgid "Email"
54 msgstr ""
55 msgstr ""
55
56
56 #: rhodecode/admin/navigation.py:90
57 #: rhodecode/apps/admin/navigation.py:90
57 msgid "Hooks"
58 msgid "Hooks"
58 msgstr ""
59 msgstr ""
59
60
60 #: rhodecode/admin/navigation.py:91
61 #: rhodecode/apps/admin/navigation.py:91
61 msgid "Full Text Search"
62 msgid "Full Text Search"
62 msgstr ""
63 msgstr ""
63
64
64 #: rhodecode/admin/navigation.py:93
65 #: rhodecode/apps/admin/navigation.py:93
65 #: rhodecode/templates/admin/integrations/base.mako:23
66 #: rhodecode/templates/admin/integrations/base.mako:23
66 #: rhodecode/templates/admin/integrations/form.mako:8
67 #: rhodecode/templates/admin/integrations/form.mako:8
67 #: rhodecode/templates/admin/integrations/form.mako:21
68 #: rhodecode/templates/admin/integrations/form.mako:21
@@ -75,175 +76,286 b' msgstr ""'
75 #: rhodecode/templates/admin/integrations/new.mako:23
76 #: rhodecode/templates/admin/integrations/new.mako:23
76 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:51
77 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:51
77 #: rhodecode/templates/admin/repos/repo_edit.mako:72
78 #: rhodecode/templates/admin/repos/repo_edit.mako:72
78 #: rhodecode/templates/base/base.mako:79
79 #: rhodecode/templates/base/base.mako:82
79 msgid "Integrations"
80 msgid "Integrations"
80 msgstr ""
81 msgstr ""
81
82
82 #: rhodecode/admin/navigation.py:95
83 #: rhodecode/apps/admin/navigation.py:95
83 #: rhodecode/templates/admin/settings/settings_system.mako:9
84 #: rhodecode/templates/admin/settings/settings_system.mako:9
84 msgid "System Info"
85 msgid "System Info"
85 msgstr ""
86 msgstr ""
86
87
87 #: rhodecode/admin/navigation.py:97
88 #: rhodecode/apps/admin/navigation.py:97
88 msgid "User Sessions"
89 msgid "User Sessions"
89 msgstr ""
90 msgstr ""
90
91
91 #: rhodecode/admin/navigation.py:99
92 #: rhodecode/apps/admin/navigation.py:99
92 msgid "Open Source Licenses"
93 msgid "Open Source Licenses"
93 msgstr ""
94 msgstr ""
94
95
95 #: rhodecode/admin/navigation.py:107
96 #: rhodecode/apps/admin/navigation.py:107
96 msgid "Labs"
97 msgid "Labs"
97 msgstr ""
98 msgstr ""
98
99
99 #: rhodecode/admin/views/sessions.py:90
100 #: rhodecode/apps/admin/views/sessions.py:86
100 msgid "Cleaned up old sessions"
101 msgid "Cleaned up old sessions"
101 msgstr ""
102 msgstr ""
102
103
103 #: rhodecode/admin/views/sessions.py:96
104 #: rhodecode/apps/admin/views/sessions.py:92
104 msgid "Failed to cleanup up old sessions"
105 msgid "Failed to cleanup up old sessions"
105 msgstr ""
106 msgstr ""
106
107
107 #: rhodecode/admin/views/svn_config.py:47
108 #: rhodecode/apps/admin/views/svn_config.py:46
108 msgid "Apache configuration for Subversion generated."
109 msgid "Apache configuration for Subversion generated."
109 msgstr ""
110 msgstr ""
110
111
111 #: rhodecode/admin/views/svn_config.py:55
112 #: rhodecode/apps/admin/views/svn_config.py:54
112 msgid "Failed to generate the Apache configuration for Subversion."
113 msgid "Failed to generate the Apache configuration for Subversion."
113 msgstr ""
114 msgstr ""
114
115
115 #: rhodecode/admin/views/system_info.py:96
116 #: rhodecode/apps/admin/views/system_info.py:95
116 msgid "Note: please make sure this server can access `${url}` for the update link to work"
117 msgid "Note: please make sure this server can access `${url}` for the update link to work"
117 msgstr ""
118 msgstr ""
118
119
119 #: rhodecode/admin/views/system_info.py:99
120 #: rhodecode/apps/admin/views/system_info.py:98
120 msgid "Update info"
121 msgid "Update info"
121 msgstr ""
122 msgstr ""
122
123
123 #: rhodecode/admin/views/system_info.py:101
124 #: rhodecode/apps/admin/views/system_info.py:100
124 msgid "Check for updates"
125 msgid "Check for updates"
125 msgstr ""
126 msgstr ""
126
127
127 #: rhodecode/admin/views/system_info.py:106
128 #: rhodecode/apps/admin/views/system_info.py:105
128 msgid "RhodeCode Version"
129 msgid "RhodeCode Version"
129 msgstr ""
130 msgstr ""
130
131
131 #: rhodecode/admin/views/system_info.py:107
132 #: rhodecode/apps/admin/views/system_info.py:106
132 msgid "RhodeCode Server IP"
133 msgid "RhodeCode Server IP"
133 msgstr ""
134 msgstr ""
134
135
135 #: rhodecode/admin/views/system_info.py:108
136 #: rhodecode/apps/admin/views/system_info.py:107
136 msgid "RhodeCode Server ID"
137 msgid "RhodeCode Server ID"
137 msgstr ""
138 msgstr ""
138
139
139 #: rhodecode/admin/views/system_info.py:109
140 #: rhodecode/apps/admin/views/system_info.py:108
140 msgid "RhodeCode Configuration"
141 msgid "RhodeCode Configuration"
141 msgstr ""
142 msgstr ""
142
143
143 #: rhodecode/admin/views/system_info.py:113
144 #: rhodecode/apps/admin/views/system_info.py:109
145 msgid "Workers"
146 msgstr ""
147
148 #: rhodecode/apps/admin/views/system_info.py:110
149 msgid "Worker Type"
150 msgstr ""
151
152 #: rhodecode/apps/admin/views/system_info.py:114
144 msgid "Database"
153 msgid "Database"
145 msgstr ""
154 msgstr ""
146
155
147 #: rhodecode/admin/views/system_info.py:114
156 #: rhodecode/apps/admin/views/system_info.py:115
148 msgid "Database version"
157 msgid "Database version"
149 msgstr ""
158 msgstr ""
150
159
151 #: rhodecode/admin/views/system_info.py:118
160 #: rhodecode/apps/admin/views/system_info.py:119
152 msgid "Platform"
161 msgid "Platform"
153 msgstr ""
162 msgstr ""
154
163
155 #: rhodecode/admin/views/system_info.py:119
164 #: rhodecode/apps/admin/views/system_info.py:120
156 msgid "Platform UUID"
165 msgid "Platform UUID"
157 msgstr ""
166 msgstr ""
158
167
159 #: rhodecode/admin/views/system_info.py:120
168 #: rhodecode/apps/admin/views/system_info.py:121
160 msgid "Python version"
169 msgid "Python version"
161 msgstr ""
170 msgstr ""
162
171
163 #: rhodecode/admin/views/system_info.py:121
172 #: rhodecode/apps/admin/views/system_info.py:122
164 msgid "Python path"
173 msgid "Python path"
165 msgstr ""
174 msgstr ""
166
175
167 #: rhodecode/admin/views/system_info.py:125
176 #: rhodecode/apps/admin/views/system_info.py:126
168 msgid "CPU"
177 msgid "CPU"
169 msgstr ""
178 msgstr ""
170
179
171 #: rhodecode/admin/views/system_info.py:126
180 #: rhodecode/apps/admin/views/system_info.py:127
172 msgid "Load"
181 msgid "Load"
173 msgstr ""
182 msgstr ""
174
183
175 #: rhodecode/admin/views/system_info.py:127
184 #: rhodecode/apps/admin/views/system_info.py:128
176 msgid "Memory"
185 msgid "Memory"
177 msgstr ""
186 msgstr ""
178
187
179 #: rhodecode/admin/views/system_info.py:128
188 #: rhodecode/apps/admin/views/system_info.py:129
180 msgid "Uptime"
189 msgid "Uptime"
181 msgstr ""
190 msgstr ""
182
191
183 #: rhodecode/admin/views/system_info.py:132
192 #: rhodecode/apps/admin/views/system_info.py:133
184 msgid "Storage location"
193 msgid "Storage location"
185 msgstr ""
194 msgstr ""
186
195
187 #: rhodecode/admin/views/system_info.py:133
196 #: rhodecode/apps/admin/views/system_info.py:134
188 msgid "Storage info"
197 msgid "Storage info"
189 msgstr ""
198 msgstr ""
190
199
191 #: rhodecode/admin/views/system_info.py:134
200 #: rhodecode/apps/admin/views/system_info.py:135
192 msgid "Storage inodes"
201 msgid "Storage inodes"
193 msgstr ""
202 msgstr ""
194
203
195 #: rhodecode/admin/views/system_info.py:136
204 #: rhodecode/apps/admin/views/system_info.py:137
196 msgid "Gist storage location"
205 msgid "Gist storage location"
197 msgstr ""
206 msgstr ""
198
207
199 #: rhodecode/admin/views/system_info.py:137
208 #: rhodecode/apps/admin/views/system_info.py:138
200 msgid "Gist storage info"
209 msgid "Gist storage info"
201 msgstr ""
210 msgstr ""
202
211
203 #: rhodecode/admin/views/system_info.py:139
212 #: rhodecode/apps/admin/views/system_info.py:140
204 msgid "Archive cache storage location"
213 msgid "Archive cache storage location"
205 msgstr ""
214 msgstr ""
206
215
207 #: rhodecode/admin/views/system_info.py:140
216 #: rhodecode/apps/admin/views/system_info.py:141
208 msgid "Archive cache info"
217 msgid "Archive cache info"
209 msgstr ""
218 msgstr ""
210
219
211 #: rhodecode/admin/views/system_info.py:142
220 #: rhodecode/apps/admin/views/system_info.py:143
212 msgid "Temp storage location"
221 msgid "Temp storage location"
213 msgstr ""
222 msgstr ""
214
223
215 #: rhodecode/admin/views/system_info.py:143
224 #: rhodecode/apps/admin/views/system_info.py:144
216 msgid "Temp storage info"
225 msgid "Temp storage info"
217 msgstr ""
226 msgstr ""
218
227
219 #: rhodecode/admin/views/system_info.py:145
228 #: rhodecode/apps/admin/views/system_info.py:146
220 msgid "Search info"
229 msgid "Search info"
221 msgstr ""
230 msgstr ""
222
231
223 #: rhodecode/admin/views/system_info.py:146
232 #: rhodecode/apps/admin/views/system_info.py:147
224 msgid "Search location"
233 msgid "Search location"
225 msgstr ""
234 msgstr ""
226
235
227 #: rhodecode/admin/views/system_info.py:150
236 #: rhodecode/apps/admin/views/system_info.py:151
228 msgid "VCS Backends"
237 msgid "VCS Backends"
229 msgstr ""
238 msgstr ""
230
239
231 #: rhodecode/admin/views/system_info.py:151
240 #: rhodecode/apps/admin/views/system_info.py:152
232 msgid "VCS Server"
241 msgid "VCS Server"
233 msgstr ""
242 msgstr ""
234
243
235 #: rhodecode/admin/views/system_info.py:152
244 #: rhodecode/apps/admin/views/system_info.py:153
236 msgid "GIT"
245 msgid "GIT"
237 msgstr ""
246 msgstr ""
238
247
239 #: rhodecode/admin/views/system_info.py:153
248 #: rhodecode/apps/admin/views/system_info.py:154
240 msgid "HG"
249 msgid "HG"
241 msgstr ""
250 msgstr ""
242
251
243 #: rhodecode/admin/views/system_info.py:154
252 #: rhodecode/apps/admin/views/system_info.py:155
244 msgid "SVN"
253 msgid "SVN"
245 msgstr ""
254 msgstr ""
246
255
256 #: rhodecode/apps/admin/views/users.py:60
257 #: rhodecode/controllers/admin/users.py:359
258 #: rhodecode/controllers/admin/users.py:380
259 #: rhodecode/controllers/admin/users.py:412
260 #: rhodecode/controllers/admin/users.py:486
261 #: rhodecode/controllers/admin/users.py:499
262 #: rhodecode/controllers/admin/users.py:557
263 msgid "You can't edit this user"
264 msgstr ""
265
266 #: rhodecode/apps/admin/views/users.py:178
267 #: rhodecode/apps/my_account/views.py:138
268 #: rhodecode/controllers/admin/gists.py:62
269 msgid "forever"
270 msgstr ""
271
272 #: rhodecode/apps/admin/views/users.py:179
273 #: rhodecode/apps/my_account/views.py:139
274 #: rhodecode/controllers/admin/gists.py:63
275 msgid "5 minutes"
276 msgstr ""
277
278 #: rhodecode/apps/admin/views/users.py:180
279 #: rhodecode/apps/my_account/views.py:140
280 #: rhodecode/controllers/admin/gists.py:64
281 msgid "1 hour"
282 msgstr ""
283
284 #: rhodecode/apps/admin/views/users.py:181
285 #: rhodecode/apps/my_account/views.py:141
286 #: rhodecode/controllers/admin/gists.py:65
287 msgid "1 day"
288 msgstr ""
289
290 #: rhodecode/apps/admin/views/users.py:182
291 #: rhodecode/apps/my_account/views.py:142
292 #: rhodecode/controllers/admin/gists.py:66
293 msgid "1 month"
294 msgstr ""
295
296 #: rhodecode/apps/admin/views/users.py:184
297 #: rhodecode/apps/my_account/views.py:144
298 #: rhodecode/controllers/admin/gists.py:70
299 msgid "Lifetime"
300 msgstr ""
301
302 #: rhodecode/apps/admin/views/users.py:188
303 #: rhodecode/apps/my_account/views.py:148
304 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:16
305 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:16
306 msgid "Role"
307 msgstr ""
308
309 #: rhodecode/apps/admin/views/users.py:219
310 #: rhodecode/apps/my_account/views.py:175
311 msgid "Auth token successfully created"
312 msgstr ""
313
314 #: rhodecode/apps/admin/views/users.py:240
315 #: rhodecode/apps/my_account/views.py:192
316 msgid "Auth token successfully deleted"
317 msgstr ""
318
319 #: rhodecode/apps/admin/views/users.py:284
320 msgid "Groups successfully changed"
321 msgstr ""
322
323 #: rhodecode/apps/login/views.py:247 rhodecode/apps/login/views.py:316
324 msgid "Bad captcha"
325 msgstr ""
326
327 #: rhodecode/apps/login/views.py:256
328 msgid "You have successfully registered with RhodeCode"
329 msgstr ""
330
331 #: rhodecode/apps/login/views.py:292
332 msgid "If such email exists, a password reset link was sent to it."
333 msgstr ""
334
335 #: rhodecode/apps/login/views.py:298
336 msgid "Password reset has been disabled."
337 msgstr ""
338
339 #: rhodecode/apps/login/views.py:381
340 msgid "Given reset token is invalid"
341 msgstr ""
342
343 #: rhodecode/apps/login/views.py:389
344 msgid "Your password reset was successful, a new password has been sent to your email"
345 msgstr ""
346
347 #: rhodecode/apps/my_account/views.py:115
348 msgid "Error occurred during update of user password"
349 msgstr ""
350
351 #: rhodecode/apps/my_account/views.py:122
352 msgid "Successfully updated password"
353 msgstr ""
354
355 #: rhodecode/apps/svn_support/events.py:30
356 msgid "Configuration for Apaache mad_dav_svn changed."
357 msgstr ""
358
247 #: rhodecode/authentication/schema.py:35
359 #: rhodecode/authentication/schema.py:35
248 msgid "Enable or disable this authentication plugin."
360 msgid "Enable or disable this authentication plugin."
249 msgstr ""
361 msgstr ""
@@ -258,10 +370,12 b' msgid "Enabled"'
258 msgstr ""
370 msgstr ""
259
371
260 #: rhodecode/authentication/schema.py:43
372 #: rhodecode/authentication/schema.py:43
261 msgid "Amount of seconds to cache the authentication call for this plugin. Useful for long calls like LDAP to improve the responsiveness of the authentication system (0 means disabled)."
373 msgid ""
262 msgstr ""
374 "Amount of seconds to cache the authentication responsecall for this plugin. \n"
263
375 "Useful for long calls like LDAP to improve the performance of the authentication system (0 means disabled)."
264 #: rhodecode/authentication/schema.py:48
376 msgstr ""
377
378 #: rhodecode/authentication/schema.py:49
265 msgid "Auth Cache TTL"
379 msgid "Auth Cache TTL"
266 msgstr ""
380 msgstr ""
267
381
@@ -281,94 +395,96 b' msgstr ""'
281 msgid "Error occurred during update of auth settings."
395 msgid "Error occurred during update of auth settings."
282 msgstr ""
396 msgstr ""
283
397
284 #: rhodecode/authentication/plugins/auth_crowd.py:61
398 #: rhodecode/authentication/plugins/auth_crowd.py:60
285 msgid "The FQDN or IP of the Atlassian CROWD Server"
399 msgid "The FQDN or IP of the Atlassian CROWD Server"
286 msgstr ""
400 msgstr ""
287
401
288 #: rhodecode/authentication/plugins/auth_crowd.py:63
402 #: rhodecode/authentication/plugins/auth_crowd.py:62
289 msgid "Host"
403 msgid "Host"
290 msgstr ""
404 msgstr ""
291
405
292 #: rhodecode/authentication/plugins/auth_crowd.py:68
406 #: rhodecode/authentication/plugins/auth_crowd.py:67
293 msgid "The Port in use by the Atlassian CROWD Server"
407 msgid "The Port in use by the Atlassian CROWD Server"
294 msgstr ""
408 msgstr ""
295
409
296 #: rhodecode/authentication/plugins/auth_crowd.py:70
410 #: rhodecode/authentication/plugins/auth_crowd.py:69
297 #: rhodecode/authentication/plugins/auth_ldap.py:84
411 #: rhodecode/authentication/plugins/auth_ldap.py:84
298 msgid "Port"
412 msgid "Port"
299 msgstr ""
413 msgstr ""
300
414
301 #: rhodecode/authentication/plugins/auth_crowd.py:76
415 #: rhodecode/authentication/plugins/auth_crowd.py:75
302 msgid "The Application Name to authenticate to CROWD"
416 msgid "The Application Name to authenticate to CROWD"
303 msgstr ""
417 msgstr ""
304
418
305 #: rhodecode/authentication/plugins/auth_crowd.py:78
419 #: rhodecode/authentication/plugins/auth_crowd.py:77
306 msgid "Application Name"
420 msgid "Application Name"
307 msgstr ""
421 msgstr ""
308
422
309 #: rhodecode/authentication/plugins/auth_crowd.py:83
423 #: rhodecode/authentication/plugins/auth_crowd.py:82
310 msgid "The password to authenticate to CROWD"
424 msgid "The password to authenticate to CROWD"
311 msgstr ""
425 msgstr ""
312
426
313 #: rhodecode/authentication/plugins/auth_crowd.py:85
427 #: rhodecode/authentication/plugins/auth_crowd.py:84
314 msgid "Application Password"
428 msgid "Application Password"
315 msgstr ""
429 msgstr ""
316
430
317 #: rhodecode/authentication/plugins/auth_crowd.py:90
431 #: rhodecode/authentication/plugins/auth_crowd.py:89
318 msgid "A comma separated list of group names that identify users as RhodeCode Administrators"
432 msgid "A comma separated list of group names that identify users as RhodeCode Administrators"
319 msgstr ""
433 msgstr ""
320
434
321 #: rhodecode/authentication/plugins/auth_crowd.py:94
435 #: rhodecode/authentication/plugins/auth_crowd.py:93
322 msgid "Admin Groups"
436 msgid "Admin Groups"
323 msgstr ""
437 msgstr ""
324
438
325 #: rhodecode/authentication/plugins/auth_crowd.py:216
439 #: rhodecode/authentication/plugins/auth_crowd.py:215
326 msgid "CROWD"
440 msgid "CROWD"
327 msgstr ""
441 msgstr ""
328
442
329 #: rhodecode/authentication/plugins/auth_headers.py:55
443 #: rhodecode/authentication/plugins/auth_headers.py:54
330 msgid "Header to extract the user from"
444 msgid "Header to extract the user from"
331 msgstr ""
445 msgstr ""
332
446
333 #: rhodecode/authentication/plugins/auth_headers.py:57
447 #: rhodecode/authentication/plugins/auth_headers.py:56
334 msgid "Header"
448 msgid "Header"
335 msgstr ""
449 msgstr ""
336
450
337 #: rhodecode/authentication/plugins/auth_headers.py:62
451 #: rhodecode/authentication/plugins/auth_headers.py:61
338 msgid "Header to extract the user from when main one fails"
452 msgid "Header to extract the user from when main one fails"
339 msgstr ""
453 msgstr ""
340
454
341 #: rhodecode/authentication/plugins/auth_headers.py:64
455 #: rhodecode/authentication/plugins/auth_headers.py:63
342 msgid "Fallback header"
456 msgid "Fallback header"
343 msgstr ""
457 msgstr ""
344
458
345 #: rhodecode/authentication/plugins/auth_headers.py:69
459 #: rhodecode/authentication/plugins/auth_headers.py:68
346 msgid "Perform cleaning of user, if passed user has @ in username then first part before @ is taken. If there's \\ in the username only the part after \\ is taken"
460 msgid "Perform cleaning of user, if passed user has @ in username then first part before @ is taken. If there's \\ in the username only the part after \\ is taken"
347 msgstr ""
461 msgstr ""
348
462
349 #: rhodecode/authentication/plugins/auth_headers.py:74
463 #: rhodecode/authentication/plugins/auth_headers.py:73
350 msgid "Clean username"
464 msgid "Clean username"
351 msgstr ""
465 msgstr ""
352
466
353 #: rhodecode/authentication/plugins/auth_headers.py:99
467 #: rhodecode/authentication/plugins/auth_headers.py:98
354 msgid "Headers"
468 msgid "Headers"
355 msgstr ""
469 msgstr ""
356
470
357 #: rhodecode/authentication/plugins/auth_jasig_cas.py:63
471 #: rhodecode/authentication/plugins/auth_jasig_cas.py:62
358 msgid "The url of the Jasig CAS REST service"
472 msgid "The url of the Jasig CAS REST service"
359 msgstr ""
473 msgstr ""
360
474
361 #: rhodecode/authentication/plugins/auth_jasig_cas.py:65
475 #: rhodecode/authentication/plugins/auth_jasig_cas.py:64
362 #: rhodecode/templates/admin/gists/show.mako:21
476 #: rhodecode/templates/admin/gists/show.mako:21
363 msgid "URL"
477 msgid "URL"
364 msgstr ""
478 msgstr ""
365
479
366 #: rhodecode/authentication/plugins/auth_jasig_cas.py:93
480 #: rhodecode/authentication/plugins/auth_jasig_cas.py:92
367 msgid "Jasig-CAS"
481 msgid "Jasig-CAS"
368 msgstr ""
482 msgstr ""
369
483
370 #: rhodecode/authentication/plugins/auth_ldap.py:75
484 #: rhodecode/authentication/plugins/auth_ldap.py:74
371 msgid "Host of the LDAP Server"
485 msgid ""
486 "Host of the LDAP Server \n"
487 "(e.g., 192.168.2.154, or ldap-server.domain.com"
372 msgstr ""
488 msgstr ""
373
489
374 #: rhodecode/authentication/plugins/auth_ldap.py:77
490 #: rhodecode/authentication/plugins/auth_ldap.py:77
@@ -376,107 +492,117 b' msgid "LDAP Host"'
376 msgstr ""
492 msgstr ""
377
493
378 #: rhodecode/authentication/plugins/auth_ldap.py:82
494 #: rhodecode/authentication/plugins/auth_ldap.py:82
379 msgid "Port that the LDAP server is listening on"
495 msgid "Custom port that the LDAP server is listening on. Default: 389"
380 msgstr ""
496 msgstr ""
381
497
382 #: rhodecode/authentication/plugins/auth_ldap.py:90
498 #: rhodecode/authentication/plugins/auth_ldap.py:90
383 msgid "User to connect to LDAP"
499 msgid ""
384 msgstr ""
500 "Optional user DN/account to connect to LDAP if authentication is required. \n"
385
501 "e.g., cn=admin,dc=mydomain,dc=com, or uid=root,cn=users,dc=mydomain,dc=com, or admin@mydomain.com"
386 #: rhodecode/authentication/plugins/auth_ldap.py:93
502 msgstr ""
503
504 #: rhodecode/authentication/plugins/auth_ldap.py:95
387 msgid "Account"
505 msgid "Account"
388 msgstr ""
506 msgstr ""
389
507
390 #: rhodecode/authentication/plugins/auth_ldap.py:98
508 #: rhodecode/authentication/plugins/auth_ldap.py:100
391 msgid "Password to connect to LDAP"
509 msgid "Password to authenticate for given user DN."
392 msgstr ""
510 msgstr ""
393
511
394 #: rhodecode/authentication/plugins/auth_ldap.py:101
512 #: rhodecode/authentication/plugins/auth_ldap.py:103
395 #: rhodecode/templates/login.mako:49 rhodecode/templates/register.mako:47
513 #: rhodecode/templates/login.mako:50 rhodecode/templates/register.mako:48
396 #: rhodecode/templates/admin/my_account/my_account.mako:30
514 #: rhodecode/templates/admin/my_account/my_account.mako:30
397 #: rhodecode/templates/admin/users/user_add.mako:44
515 #: rhodecode/templates/admin/users/user_add.mako:44
398 #: rhodecode/templates/base/base.mako:310
516 #: rhodecode/templates/base/base.mako:313
399 #: rhodecode/templates/debug_style/login.html:45
517 #: rhodecode/templates/debug_style/login.html:45
400 msgid "Password"
518 msgid "Password"
401 msgstr ""
519 msgstr ""
402
520
403 #: rhodecode/authentication/plugins/auth_ldap.py:106
521 #: rhodecode/authentication/plugins/auth_ldap.py:108
404 msgid "TLS Type"
522 msgid "TLS Type"
405 msgstr ""
523 msgstr ""
406
524
407 #: rhodecode/authentication/plugins/auth_ldap.py:107
525 #: rhodecode/authentication/plugins/auth_ldap.py:109
408 msgid "Connection Security"
526 msgid "Connection Security"
409 msgstr ""
527 msgstr ""
410
528
411 #: rhodecode/authentication/plugins/auth_ldap.py:113
529 #: rhodecode/authentication/plugins/auth_ldap.py:115
412 msgid "Require Cert over TLS?"
530 msgid "Require Cert over TLS?"
413 msgstr ""
531 msgstr ""
414
532
415 #: rhodecode/authentication/plugins/auth_ldap.py:114
533 #: rhodecode/authentication/plugins/auth_ldap.py:116
416 msgid "Certificate Checks"
534 msgid "Certificate Checks"
417 msgstr ""
535 msgstr ""
418
536
419 #: rhodecode/authentication/plugins/auth_ldap.py:120
537 #: rhodecode/authentication/plugins/auth_ldap.py:122
420 msgid "Base DN to search (e.g., dc=mydomain,dc=com)"
538 msgid ""
421 msgstr ""
539 "Base DN to search. Dynamic bind is supported. Add `$login` marker in it to be replaced with current user credentials \n"
422
540 "(e.g., dc=mydomain,dc=com, or ou=Users,dc=mydomain,dc=com)"
423 #: rhodecode/authentication/plugins/auth_ldap.py:123
541 msgstr ""
542
543 #: rhodecode/authentication/plugins/auth_ldap.py:127
424 msgid "Base DN"
544 msgid "Base DN"
425 msgstr ""
545 msgstr ""
426
546
427 #: rhodecode/authentication/plugins/auth_ldap.py:128
547 #: rhodecode/authentication/plugins/auth_ldap.py:132
428 msgid "Filter to narrow results (e.g., ou=Users, etc)"
548 msgid ""
429 msgstr ""
549 "Filter to narrow results \n"
430
550 "(e.g., (&(objectCategory=Person)(objectClass=user)), or \n"
431 #: rhodecode/authentication/plugins/auth_ldap.py:131
551 "(memberof=cn=rc-login,ou=groups,ou=company,dc=mydomain,dc=com)))"
432 msgid "LDAP Search Filter"
433 msgstr ""
434
435 #: rhodecode/authentication/plugins/auth_ldap.py:136
436 msgid "How deep to search LDAP"
437 msgstr ""
552 msgstr ""
438
553
439 #: rhodecode/authentication/plugins/auth_ldap.py:137
554 #: rhodecode/authentication/plugins/auth_ldap.py:137
440 msgid "LDAP Search Scope"
555 msgid "LDAP Search Filter"
441 msgstr ""
556 msgstr ""
442
557
443 #: rhodecode/authentication/plugins/auth_ldap.py:143
558 #: rhodecode/authentication/plugins/auth_ldap.py:143
444 msgid "LDAP Attribute to map to user name"
559 msgid "How deep to search LDAP. If unsure set to SUBTREE"
445 msgstr ""
560 msgstr ""
446
561
447 #: rhodecode/authentication/plugins/auth_ldap.py:145
562 #: rhodecode/authentication/plugins/auth_ldap.py:144
563 msgid "LDAP Search Scope"
564 msgstr ""
565
566 #: rhodecode/authentication/plugins/auth_ldap.py:150
567 msgid "LDAP Attribute to map to user name (e.g., uid, or sAMAccountName)"
568 msgstr ""
569
570 #: rhodecode/authentication/plugins/auth_ldap.py:152
448 msgid "Login Attribute"
571 msgid "Login Attribute"
449 msgstr ""
572 msgstr ""
450
573
451 #: rhodecode/authentication/plugins/auth_ldap.py:146
574 #: rhodecode/authentication/plugins/auth_ldap.py:153
452 msgid "The LDAP Login attribute of the CN must be specified"
575 msgid "The LDAP Login attribute of the CN must be specified"
453 msgstr ""
576 msgstr ""
454
577
455 #: rhodecode/authentication/plugins/auth_ldap.py:151
578 #: rhodecode/authentication/plugins/auth_ldap.py:158
456 msgid "LDAP Attribute to map to first name"
579 msgid "LDAP Attribute to map to first name (e.g., givenName)"
457 msgstr ""
580 msgstr ""
458
581
459 #: rhodecode/authentication/plugins/auth_ldap.py:154
582 #: rhodecode/authentication/plugins/auth_ldap.py:161
460 msgid "First Name Attribute"
583 msgid "First Name Attribute"
461 msgstr ""
584 msgstr ""
462
585
463 #: rhodecode/authentication/plugins/auth_ldap.py:159
586 #: rhodecode/authentication/plugins/auth_ldap.py:166
464 msgid "LDAP Attribute to map to last name"
587 msgid "LDAP Attribute to map to last name (e.g., sn)"
465 msgstr ""
588 msgstr ""
466
589
467 #: rhodecode/authentication/plugins/auth_ldap.py:162
590 #: rhodecode/authentication/plugins/auth_ldap.py:169
468 msgid "Last Name Attribute"
591 msgid "Last Name Attribute"
469 msgstr ""
592 msgstr ""
470
593
471 #: rhodecode/authentication/plugins/auth_ldap.py:167
594 #: rhodecode/authentication/plugins/auth_ldap.py:174
472 msgid "LDAP Attribute to map to email address"
595 msgid ""
473 msgstr ""
596 "LDAP Attribute to map to email address (e.g., mail).\n"
474
597 "Emails are a crucial part of RhodeCode. \n"
475 #: rhodecode/authentication/plugins/auth_ldap.py:170
598 "If possible add a valid email attribute to ldap users."
599 msgstr ""
600
601 #: rhodecode/authentication/plugins/auth_ldap.py:179
476 msgid "Email Attribute"
602 msgid "Email Attribute"
477 msgstr ""
603 msgstr ""
478
604
479 #: rhodecode/authentication/plugins/auth_ldap.py:351
605 #: rhodecode/authentication/plugins/auth_ldap.py:360
480 msgid "LDAP"
606 msgid "LDAP"
481 msgstr ""
607 msgstr ""
482
608
@@ -500,16 +626,16 b' msgstr ""'
500 msgid "PAM"
626 msgid "PAM"
501 msgstr ""
627 msgstr ""
502
628
503 #: rhodecode/authentication/plugins/auth_rhodecode.py:68
629 #: rhodecode/authentication/plugins/auth_rhodecode.py:67
504 msgid "Rhodecode"
630 msgid "Rhodecode"
505 msgstr ""
631 msgstr ""
506
632
507 #: rhodecode/authentication/plugins/auth_token.py:71
633 #: rhodecode/authentication/plugins/auth_token.py:70
508 msgid "Rhodecode Token Auth"
634 msgid "Rhodecode Token Auth"
509 msgstr ""
635 msgstr ""
510
636
511 #: rhodecode/controllers/changelog.py:91 rhodecode/controllers/compare.py:64
637 #: rhodecode/controllers/changelog.py:91 rhodecode/controllers/compare.py:64
512 #: rhodecode/controllers/pullrequests.py:202
638 #: rhodecode/controllers/pullrequests.py:204
513 msgid "There are no commits yet"
639 msgid "There are no commits yet"
514 msgstr ""
640 msgstr ""
515
641
@@ -543,8 +669,8 b' msgid "No such commit exists for this re'
543 msgstr ""
669 msgstr ""
544
670
545 #: rhodecode/controllers/changeset.py:344
671 #: rhodecode/controllers/changeset.py:344
546 #: rhodecode/controllers/pullrequests.py:948
672 #: rhodecode/controllers/pullrequests.py:985
547 #: rhodecode/model/pull_request.py:1009
673 #: rhodecode/model/pull_request.py:1055
548 #, python-format
674 #, python-format
549 msgid "Status change %(transition_icon)s %(status)s"
675 msgid "Status change %(transition_icon)s %(status)s"
550 msgstr ""
676 msgstr ""
@@ -580,12 +706,12 b' msgstr ""'
580 msgid "Repositories unrelated. Cannot compare commit %(commit1)s from repository %(repo1)s with commit %(commit2)s from repository %(repo2)s."
706 msgid "Repositories unrelated. Cannot compare commit %(commit1)s from repository %(repo1)s with commit %(commit2)s from repository %(repo2)s."
581 msgstr ""
707 msgstr ""
582
708
583 #: rhodecode/controllers/feed.py:70
709 #: rhodecode/controllers/feed.py:69
584 #, python-format
710 #, python-format
585 msgid "Changes on %s repository"
711 msgid "Changes on %s repository"
586 msgstr ""
712 msgstr ""
587
713
588 #: rhodecode/controllers/feed.py:71
714 #: rhodecode/controllers/feed.py:70
589 #, python-format
715 #, python-format
590 msgid "%s %s feed"
716 msgid "%s %s feed"
591 msgstr ""
717 msgstr ""
@@ -599,91 +725,91 b' msgstr ""'
599 msgid "There are no files yet. %s"
725 msgid "There are no files yet. %s"
600 msgstr ""
726 msgstr ""
601
727
602 #: rhodecode/controllers/files.py:394 rhodecode/controllers/files.py:447
728 #: rhodecode/controllers/files.py:435 rhodecode/controllers/files.py:488
603 #: rhodecode/controllers/files.py:478 rhodecode/controllers/files.py:553
729 #: rhodecode/controllers/files.py:519 rhodecode/controllers/files.py:594
604 #: rhodecode/controllers/files.py:598 rhodecode/controllers/files.py:689
730 #: rhodecode/controllers/files.py:639 rhodecode/controllers/files.py:730
605 #, python-format
731 #, python-format
606 msgid "This repository has been locked by %s on %s"
732 msgid "This repository has been locked by %s on %s"
607 msgstr ""
733 msgstr ""
608
734
609 #: rhodecode/controllers/files.py:402 rhodecode/controllers/files.py:455
735 #: rhodecode/controllers/files.py:443 rhodecode/controllers/files.py:496
610 msgid "You can only delete files with revision being a valid branch "
736 msgid "You can only delete files with revision being a valid branch "
611 msgstr ""
737 msgstr ""
612
738
613 #: rhodecode/controllers/files.py:411 rhodecode/controllers/files.py:464
739 #: rhodecode/controllers/files.py:452 rhodecode/controllers/files.py:505
614 #, python-format
740 #, python-format
615 msgid "Deleted file %s via RhodeCode Enterprise"
741 msgid "Deleted file %s via RhodeCode Enterprise"
616 msgstr ""
742 msgstr ""
617
743
618 #: rhodecode/controllers/files.py:431
744 #: rhodecode/controllers/files.py:472
619 #, python-format
745 #, python-format
620 msgid "Successfully deleted file %s"
746 msgid "Successfully deleted file %s"
621 msgstr ""
747 msgstr ""
622
748
623 #: rhodecode/controllers/files.py:434 rhodecode/controllers/files.py:540
749 #: rhodecode/controllers/files.py:475 rhodecode/controllers/files.py:581
624 #: rhodecode/controllers/files.py:677
750 #: rhodecode/controllers/files.py:718
625 msgid "Error occurred during commit"
751 msgid "Error occurred during commit"
626 msgstr ""
752 msgstr ""
627
753
628 #: rhodecode/controllers/files.py:486 rhodecode/controllers/files.py:561
754 #: rhodecode/controllers/files.py:527 rhodecode/controllers/files.py:602
629 msgid "You can only edit files with revision being a valid branch "
755 msgid "You can only edit files with revision being a valid branch "
630 msgstr ""
756 msgstr ""
631
757
632 #: rhodecode/controllers/files.py:498 rhodecode/controllers/files.py:573
758 #: rhodecode/controllers/files.py:539 rhodecode/controllers/files.py:614
633 #, python-format
759 #, python-format
634 msgid "Edited file %s via RhodeCode Enterprise"
760 msgid "Edited file %s via RhodeCode Enterprise"
635 msgstr ""
761 msgstr ""
636
762
637 #: rhodecode/controllers/files.py:515
763 #: rhodecode/controllers/files.py:556
638 msgid "No changes"
764 msgid "No changes"
639 msgstr ""
765 msgstr ""
640
766
641 #: rhodecode/controllers/files.py:537 rhodecode/controllers/files.py:666
767 #: rhodecode/controllers/files.py:578 rhodecode/controllers/files.py:707
642 #, python-format
768 #, python-format
643 msgid "Successfully committed to %s"
769 msgid "Successfully committed to %s"
644 msgstr ""
770 msgstr ""
645
771
646 #: rhodecode/controllers/files.py:611 rhodecode/controllers/files.py:700
772 #: rhodecode/controllers/files.py:652 rhodecode/controllers/files.py:741
647 msgid "Added file via RhodeCode Enterprise"
773 msgid "Added file via RhodeCode Enterprise"
648 msgstr ""
774 msgstr ""
649
775
650 #: rhodecode/controllers/files.py:636
776 #: rhodecode/controllers/files.py:677
651 msgid "No filename"
777 msgid "No filename"
652 msgstr ""
778 msgstr ""
653
779
654 #: rhodecode/controllers/files.py:669
780 #: rhodecode/controllers/files.py:710
655 msgid "The location specified must be a relative path and must not contain .. in the path"
781 msgid "The location specified must be a relative path and must not contain .. in the path"
656 msgstr ""
782 msgstr ""
657
783
658 #: rhodecode/controllers/files.py:723
784 #: rhodecode/controllers/files.py:764
659 msgid "Downloads disabled"
785 msgid "Downloads disabled"
660 msgstr ""
786 msgstr ""
661
787
662 #: rhodecode/controllers/files.py:729
788 #: rhodecode/controllers/files.py:770
663 #, python-format
789 #, python-format
664 msgid "Unknown revision %s"
790 msgid "Unknown revision %s"
665 msgstr ""
791 msgstr ""
666
792
667 #: rhodecode/controllers/files.py:731
793 #: rhodecode/controllers/files.py:772
668 msgid "Empty repository"
794 msgid "Empty repository"
669 msgstr ""
795 msgstr ""
670
796
671 #: rhodecode/controllers/files.py:733 rhodecode/controllers/files.py:767
797 #: rhodecode/controllers/files.py:774 rhodecode/controllers/files.py:808
672 msgid "Unknown archive type"
798 msgid "Unknown archive type"
673 msgstr ""
799 msgstr ""
674
800
675 #: rhodecode/controllers/files.py:952
801 #: rhodecode/controllers/files.py:993
676 msgid "Changesets"
802 msgid "Changesets"
677 msgstr ""
803 msgstr ""
678
804
679 #: rhodecode/controllers/files.py:973 rhodecode/controllers/summary.py:269
805 #: rhodecode/controllers/files.py:1014 rhodecode/controllers/summary.py:277
680 #: rhodecode/model/pull_request.py:1234 rhodecode/model/scm.py:782
806 #: rhodecode/model/pull_request.py:1280 rhodecode/model/scm.py:782
681 #: rhodecode/templates/base/vcs_settings.mako:193
807 #: rhodecode/templates/base/vcs_settings.mako:242
682 msgid "Branches"
808 msgid "Branches"
683 msgstr ""
809 msgstr ""
684
810
685 #: rhodecode/controllers/files.py:977 rhodecode/model/scm.py:797
811 #: rhodecode/controllers/files.py:1018 rhodecode/model/scm.py:797
686 #: rhodecode/templates/base/vcs_settings.mako:218
812 #: rhodecode/templates/base/vcs_settings.mako:267
687 msgid "Tags"
813 msgid "Tags"
688 msgstr ""
814 msgstr ""
689
815
@@ -692,22 +818,23 b' msgstr ""'
692 msgid "An error occurred during repository forking %s"
818 msgid "An error occurred during repository forking %s"
693 msgstr ""
819 msgstr ""
694
820
695 #: rhodecode/controllers/home.py:205
821 #: rhodecode/controllers/home.py:207
696 msgid "Groups"
822 msgid "Groups"
697 msgstr ""
823 msgstr ""
698
824
699 #: rhodecode/controllers/home.py:212 rhodecode/controllers/home.py:247
825 #: rhodecode/controllers/home.py:214 rhodecode/controllers/home.py:249
700 #: rhodecode/controllers/pullrequests.py:308
826 #: rhodecode/controllers/pullrequests.py:310
827 #: rhodecode/templates/admin/my_account/my_account.mako:38
701 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:128
828 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:128
702 #: rhodecode/templates/admin/repos/repo_add.mako:15
829 #: rhodecode/templates/admin/repos/repo_add.mako:15
703 #: rhodecode/templates/admin/repos/repo_add.mako:19
830 #: rhodecode/templates/admin/repos/repo_add.mako:19
704 #: rhodecode/templates/admin/users/user_edit_advanced.mako:11
831 #: rhodecode/templates/admin/users/user_edit_advanced.mako:11
705 #: rhodecode/templates/base/base.mako:73 rhodecode/templates/base/base.mako:145
832 #: rhodecode/templates/base/base.mako:76 rhodecode/templates/base/base.mako:148
706 #: rhodecode/templates/base/base.mako:569
833 #: rhodecode/templates/base/base.mako:572
707 msgid "Repositories"
834 msgid "Repositories"
708 msgstr ""
835 msgstr ""
709
836
710 #: rhodecode/controllers/home.py:225
837 #: rhodecode/controllers/home.py:227
711 #, python-format
838 #, python-format
712 msgid "Commits in %(repo)s"
839 msgid "Commits in %(repo)s"
713 msgstr ""
840 msgstr ""
@@ -720,77 +847,77 b' msgstr ""'
720 msgid "journal"
847 msgid "journal"
721 msgstr ""
848 msgstr ""
722
849
723 #: rhodecode/controllers/pullrequests.py:216
850 #: rhodecode/controllers/pullrequests.py:218
724 msgid "Commit does not exist"
851 msgid "Commit does not exist"
725 msgstr ""
852 msgstr ""
726
853
727 #: rhodecode/controllers/pullrequests.py:333
728 msgid "Pull request requires a title with min. 3 chars"
729 msgstr ""
730
731 #: rhodecode/controllers/pullrequests.py:335
854 #: rhodecode/controllers/pullrequests.py:335
855 msgid "Pull request requires a title with min. 3 chars"
856 msgstr ""
857
858 #: rhodecode/controllers/pullrequests.py:337
732 msgid "Error creating pull request: {}"
859 msgid "Error creating pull request: {}"
733 msgstr ""
860 msgstr ""
734
861
735 #: rhodecode/controllers/pullrequests.py:383
862 #: rhodecode/controllers/pullrequests.py:385
736 msgid "Successfully opened new pull request"
863 msgid "Successfully opened new pull request"
737 msgstr ""
864 msgstr ""
738
865
739 #: rhodecode/controllers/pullrequests.py:386
866 #: rhodecode/controllers/pullrequests.py:388
740 msgid "Error occurred during sending pull request"
867 msgid "Error occurred during sending pull request"
741 msgstr ""
868 msgstr ""
742
869
743 #: rhodecode/controllers/pullrequests.py:429
870 #: rhodecode/controllers/pullrequests.py:431
744 msgid "Cannot update closed pull requests."
871 msgid "Cannot update closed pull requests."
745 msgstr ""
872 msgstr ""
746
873
747 #: rhodecode/controllers/pullrequests.py:435
874 #: rhodecode/controllers/pullrequests.py:437
748 msgid "Pull request title & description updated."
875 msgid "Pull request title & description updated."
749 msgstr ""
876 msgstr ""
750
877
751 #: rhodecode/controllers/pullrequests.py:443
878 #: rhodecode/controllers/pullrequests.py:455
752 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits."
879 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits. Source of changes: {change_source}"
753 msgstr ""
880 msgstr ""
754
881
755 #: rhodecode/controllers/pullrequests.py:458
882 #: rhodecode/controllers/pullrequests.py:472
756 msgid "Reload page"
883 msgid "Reload page"
757 msgstr ""
884 msgstr ""
758
885
759 #: rhodecode/controllers/pullrequests.py:532
886 #: rhodecode/controllers/pullrequests.py:546
760 msgid "Pull request was successfully merged and closed."
887 msgid "Pull request was successfully merged and closed."
761 msgstr ""
888 msgstr ""
762
889
763 #: rhodecode/controllers/pullrequests.py:569
890 #: rhodecode/controllers/pullrequests.py:588
764 msgid "Successfully deleted pull request"
891 msgid "Successfully deleted pull request"
765 msgstr ""
892 msgstr ""
766
893
767 #: rhodecode/controllers/pullrequests.py:864
894 #: rhodecode/controllers/pullrequests.py:592
768 msgid "Close Pull Request"
895 msgid "Your are not allowed to delete this pull request"
769 msgstr ""
896 msgstr ""
770
897
771 #: rhodecode/controllers/pullrequests.py:952
898 #: rhodecode/controllers/pullrequests.py:989
772 #: rhodecode/model/pull_request.py:1013
899 #: rhodecode/model/pull_request.py:1059
773 msgid "Closing with"
900 msgid "Closing with"
774 msgstr ""
901 msgstr ""
775
902
776 #: rhodecode/controllers/pullrequests.py:1002
903 #: rhodecode/controllers/pullrequests.py:1039
777 #, python-format
904 #, python-format
778 msgid "Closing pull request on other statuses than rejected or approved is forbidden. Calculated status from all reviewers is currently: %s"
905 msgid "Closing pull request on other statuses than rejected or approved is forbidden. Calculated status from all reviewers is currently: %s"
779 msgstr ""
906 msgstr ""
780
907
781 #: rhodecode/controllers/summary.py:243
908 #: rhodecode/controllers/summary.py:251
782 msgid "Branch"
909 msgid "Branch"
783 msgstr ""
910 msgstr ""
784
911
785 #: rhodecode/controllers/summary.py:244
912 #: rhodecode/controllers/summary.py:252
786 msgid "Tag"
913 msgid "Tag"
787 msgstr ""
914 msgstr ""
788
915
789 #: rhodecode/controllers/summary.py:245
916 #: rhodecode/controllers/summary.py:253
790 msgid "Bookmark"
917 msgid "Bookmark"
791 msgstr ""
918 msgstr ""
792
919
793 #: rhodecode/controllers/summary.py:270
920 #: rhodecode/controllers/summary.py:278
794 msgid "Closed branches"
921 msgid "Closed branches"
795 msgstr ""
922 msgstr ""
796
923
@@ -802,42 +929,6 b' msgstr ""'
802 msgid "Error occurred during update of default values"
929 msgid "Error occurred during update of default values"
803 msgstr ""
930 msgstr ""
804
931
805 #: rhodecode/controllers/admin/gists.py:62
806 #: rhodecode/controllers/admin/my_account.py:384
807 #: rhodecode/controllers/admin/users.py:465
808 msgid "forever"
809 msgstr ""
810
811 #: rhodecode/controllers/admin/gists.py:63
812 #: rhodecode/controllers/admin/my_account.py:385
813 #: rhodecode/controllers/admin/users.py:466
814 msgid "5 minutes"
815 msgstr ""
816
817 #: rhodecode/controllers/admin/gists.py:64
818 #: rhodecode/controllers/admin/my_account.py:386
819 #: rhodecode/controllers/admin/users.py:467
820 msgid "1 hour"
821 msgstr ""
822
823 #: rhodecode/controllers/admin/gists.py:65
824 #: rhodecode/controllers/admin/my_account.py:387
825 #: rhodecode/controllers/admin/users.py:468
826 msgid "1 day"
827 msgstr ""
828
829 #: rhodecode/controllers/admin/gists.py:66
830 #: rhodecode/controllers/admin/my_account.py:388
831 #: rhodecode/controllers/admin/users.py:469
832 msgid "1 month"
833 msgstr ""
834
835 #: rhodecode/controllers/admin/gists.py:70
836 #: rhodecode/controllers/admin/my_account.py:390
837 #: rhodecode/controllers/admin/users.py:471
838 msgid "Lifetime"
839 msgstr ""
840
841 #: rhodecode/controllers/admin/gists.py:72
932 #: rhodecode/controllers/admin/gists.py:72
842 msgid "Requires registered account"
933 msgid "Requires registered account"
843 msgstr ""
934 msgstr ""
@@ -874,10 +965,8 b' msgstr ""'
874
965
875 #: rhodecode/controllers/admin/gists.py:343
966 #: rhodecode/controllers/admin/gists.py:343
876 #: rhodecode/templates/admin/gists/show.mako:67
967 #: rhodecode/templates/admin/gists/show.mako:67
877 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:23
968 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:35
878 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:46
969 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:31
879 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:20
880 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:42
881 #: rhodecode/templates/data_table/_dt_elements.mako:263
970 #: rhodecode/templates/data_table/_dt_elements.mako:263
882 msgid "never"
971 msgid "never"
883 msgstr ""
972 msgstr ""
@@ -887,65 +976,36 b' msgstr ""'
887 msgid "%(expiry)s - current value"
976 msgid "%(expiry)s - current value"
888 msgstr ""
977 msgstr ""
889
978
890 #: rhodecode/controllers/admin/my_account.py:80
979 #: rhodecode/controllers/admin/my_account.py:78
891 msgid "You can't edit this user since it's crucial for entire application"
980 msgid "You can't edit this user since it's crucial for entire application"
892 msgstr ""
981 msgstr ""
893
982
894 #: rhodecode/controllers/admin/my_account.py:140
983 #: rhodecode/controllers/admin/my_account.py:138
895 msgid "Your account was updated successfully"
984 msgid "Your account was updated successfully"
896 msgstr ""
985 msgstr ""
897
986
898 #: rhodecode/controllers/admin/my_account.py:155
987 #: rhodecode/controllers/admin/my_account.py:153
899 #: rhodecode/controllers/admin/users.py:231
988 #: rhodecode/controllers/admin/users.py:184
900 #, python-format
989 #, python-format
901 msgid "Error occurred during update of user %s"
990 msgid "Error occurred during update of user %s"
902 msgstr ""
991 msgstr ""
903
992
904 #: rhodecode/controllers/admin/my_account.py:221
993 #: rhodecode/controllers/admin/my_account.py:222
905 #: rhodecode/controllers/admin/my_account.py:227
994 #: rhodecode/controllers/admin/users.py:527
906 msgid "Error occurred during update of user password"
907 msgstr ""
908
909 #: rhodecode/controllers/admin/my_account.py:234
910 msgid "Successfully updated password"
911 msgstr ""
912
913 #: rhodecode/controllers/admin/my_account.py:278
914 #: rhodecode/controllers/admin/users.py:645
915 #, python-format
995 #, python-format
916 msgid "Added new email address `%s` for user account"
996 msgid "Added new email address `%s` for user account"
917 msgstr ""
997 msgstr ""
918
998
919 #: rhodecode/controllers/admin/my_account.py:285
999 #: rhodecode/controllers/admin/my_account.py:229
920 #: rhodecode/controllers/admin/users.py:652
1000 #: rhodecode/controllers/admin/users.py:534
921 msgid "An error occurred during email saving"
1001 msgid "An error occurred during email saving"
922 msgstr ""
1002 msgstr ""
923
1003
924 #: rhodecode/controllers/admin/my_account.py:295
1004 #: rhodecode/controllers/admin/my_account.py:239
925 #: rhodecode/controllers/admin/users.py:667
1005 #: rhodecode/controllers/admin/users.py:549
926 msgid "Removed email address from user account"
1006 msgid "Removed email address from user account"
927 msgstr ""
1007 msgstr ""
928
1008
929 #: rhodecode/controllers/admin/my_account.py:393
930 #: rhodecode/controllers/admin/users.py:474
931 msgid "Role"
932 msgstr ""
933
934 #: rhodecode/controllers/admin/my_account.py:406
935 #: rhodecode/controllers/admin/users.py:498
936 msgid "Auth token successfully created"
937 msgstr ""
938
939 #: rhodecode/controllers/admin/my_account.py:419
940 #: rhodecode/controllers/admin/users.py:517
941 msgid "Auth token successfully reset"
942 msgstr ""
943
944 #: rhodecode/controllers/admin/my_account.py:423
945 #: rhodecode/controllers/admin/users.py:521
946 msgid "Auth token successfully deleted"
947 msgstr ""
948
949 #: rhodecode/controllers/admin/permissions.py:112
1009 #: rhodecode/controllers/admin/permissions.py:112
950 msgid "Application permissions updated successfully"
1010 msgid "Application permissions updated successfully"
951 msgstr ""
1011 msgstr ""
@@ -1009,7 +1069,7 b' msgid "Error occurred during deletion of'
1009 msgstr ""
1069 msgstr ""
1010
1070
1011 #: rhodecode/controllers/admin/repo_groups.py:388
1071 #: rhodecode/controllers/admin/repo_groups.py:388
1012 #: rhodecode/controllers/admin/user_groups.py:322
1072 #: rhodecode/controllers/admin/user_groups.py:323
1013 msgid "Cannot change permission for yourself as admin"
1073 msgid "Cannot change permission for yourself as admin"
1014 msgstr ""
1074 msgstr ""
1015
1075
@@ -1161,18 +1221,18 b' msgid "Error occurred during deleting is'
1161 msgstr ""
1221 msgstr ""
1162
1222
1163 #: rhodecode/controllers/admin/repos.py:728
1223 #: rhodecode/controllers/admin/repos.py:728
1164 #: rhodecode/controllers/admin/settings.py:380
1224 #: rhodecode/controllers/admin/settings.py:381
1165 msgid "Removed issue tracker entry"
1225 msgid "Removed issue tracker entry"
1166 msgstr ""
1226 msgstr ""
1167
1227
1168 #: rhodecode/controllers/admin/repos.py:758
1228 #: rhodecode/controllers/admin/repos.py:758
1169 #: rhodecode/controllers/admin/settings.py:427
1229 #: rhodecode/controllers/admin/settings.py:428
1170 msgid "Updated issue tracker entries"
1230 msgid "Updated issue tracker entries"
1171 msgstr ""
1231 msgstr ""
1172
1232
1173 #: rhodecode/controllers/admin/repos.py:819
1233 #: rhodecode/controllers/admin/repos.py:819
1174 #: rhodecode/controllers/admin/settings.py:147
1234 #: rhodecode/controllers/admin/settings.py:147
1175 #: rhodecode/controllers/admin/settings.py:618
1235 #: rhodecode/controllers/admin/settings.py:619
1176 msgid "Some form inputs contain invalid data."
1236 msgid "Some form inputs contain invalid data."
1177 msgstr ""
1237 msgstr ""
1178
1238
@@ -1181,279 +1241,275 b' msgid "Error occurred during updating re'
1181 msgstr ""
1241 msgstr ""
1182
1242
1183 #: rhodecode/controllers/admin/repos.py:841
1243 #: rhodecode/controllers/admin/repos.py:841
1184 #: rhodecode/controllers/admin/settings.py:175
1244 #: rhodecode/controllers/admin/settings.py:176
1185 msgid "Updated VCS settings"
1245 msgid "Updated VCS settings"
1186 msgstr ""
1246 msgstr ""
1187
1247
1188 #: rhodecode/controllers/admin/settings.py:171
1248 #: rhodecode/controllers/admin/settings.py:172
1189 #: rhodecode/controllers/admin/settings.py:282
1249 #: rhodecode/controllers/admin/settings.py:283
1190 msgid "Error occurred during updating application settings"
1250 msgid "Error occurred during updating application settings"
1191 msgstr ""
1251 msgstr ""
1192
1252
1193 #: rhodecode/controllers/admin/settings.py:222
1253 #: rhodecode/controllers/admin/settings.py:223
1194 #, python-format
1254 #, python-format
1195 msgid "Repositories successfully rescanned added: %s ; removed: %s"
1255 msgid "Repositories successfully rescanned added: %s ; removed: %s"
1196 msgstr ""
1256 msgstr ""
1197
1257
1198 #: rhodecode/controllers/admin/settings.py:278
1258 #: rhodecode/controllers/admin/settings.py:279
1199 msgid "Updated application settings"
1259 msgid "Updated application settings"
1200 msgstr ""
1260 msgstr ""
1201
1261
1202 #: rhodecode/controllers/admin/settings.py:344
1262 #: rhodecode/controllers/admin/settings.py:345
1203 msgid "Updated visualisation settings"
1263 msgid "Updated visualisation settings"
1204 msgstr ""
1264 msgstr ""
1205
1265
1206 #: rhodecode/controllers/admin/settings.py:347
1266 #: rhodecode/controllers/admin/settings.py:348
1207 msgid "Error occurred during updating visualisation settings"
1267 msgid "Error occurred during updating visualisation settings"
1208 msgstr ""
1268 msgstr ""
1209
1269
1210 #: rhodecode/controllers/admin/settings.py:440
1270 #: rhodecode/controllers/admin/settings.py:441
1211 msgid "Please enter email address"
1271 msgid "Please enter email address"
1212 msgstr ""
1272 msgstr ""
1213
1273
1214 #: rhodecode/controllers/admin/settings.py:458
1274 #: rhodecode/controllers/admin/settings.py:459
1215 msgid "Send email task created"
1275 msgid "Send email task created"
1216 msgstr ""
1276 msgstr ""
1217
1277
1218 #: rhodecode/controllers/admin/settings.py:491
1278 #: rhodecode/controllers/admin/settings.py:492
1219 msgid "Added new hook"
1279 msgid "Added new hook"
1220 msgstr ""
1280 msgstr ""
1221
1281
1222 #: rhodecode/controllers/admin/settings.py:506
1282 #: rhodecode/controllers/admin/settings.py:507
1223 msgid "Updated hooks"
1283 msgid "Updated hooks"
1224 msgstr ""
1284 msgstr ""
1225
1285
1226 #: rhodecode/controllers/admin/settings.py:510
1286 #: rhodecode/controllers/admin/settings.py:511
1227 msgid "Error occurred during hook creation"
1287 msgid "Error occurred during hook creation"
1228 msgstr ""
1288 msgstr ""
1229
1289
1230 #: rhodecode/controllers/admin/settings.py:639
1290 #: rhodecode/controllers/admin/settings.py:640
1231 msgid "Error occurred during updating labs settings"
1291 msgid "Error occurred during updating labs settings"
1232 msgstr ""
1292 msgstr ""
1233
1293
1234 #: rhodecode/controllers/admin/settings.py:644
1294 #: rhodecode/controllers/admin/settings.py:645
1235 msgid "Updated Labs settings"
1295 msgid "Updated Labs settings"
1236 msgstr ""
1296 msgstr ""
1237
1297
1238 #: rhodecode/controllers/admin/user_groups.py:164
1298 #: rhodecode/controllers/admin/user_groups.py:165
1239 #, python-format
1299 #, python-format
1240 msgid "Created user group %(user_group_link)s"
1300 msgid "Created user group %(user_group_link)s"
1241 msgstr ""
1301 msgstr ""
1242
1302
1243 #: rhodecode/controllers/admin/user_groups.py:178
1303 #: rhodecode/controllers/admin/user_groups.py:179
1244 #, python-format
1304 #, python-format
1245 msgid "Error occurred during creation of user group %s"
1305 msgid "Error occurred during creation of user group %s"
1246 msgstr ""
1306 msgstr ""
1247
1307
1248 #: rhodecode/controllers/admin/user_groups.py:219
1308 #: rhodecode/controllers/admin/user_groups.py:220
1249 #, python-format
1309 #, python-format
1250 msgid "Updated user group %s"
1310 msgid "Updated user group %s"
1251 msgstr ""
1311 msgstr ""
1252
1312
1253 #: rhodecode/controllers/admin/user_groups.py:235
1313 #: rhodecode/controllers/admin/user_groups.py:236
1254 #, python-format
1314 #, python-format
1255 msgid "Error occurred during update of user group %s"
1315 msgid "Error occurred during update of user group %s"
1256 msgstr ""
1316 msgstr ""
1257
1317
1258 #: rhodecode/controllers/admin/user_groups.py:257
1318 #: rhodecode/controllers/admin/user_groups.py:258
1259 msgid "Successfully deleted user group"
1319 msgid "Successfully deleted user group"
1260 msgstr ""
1320 msgstr ""
1261
1321
1262 #: rhodecode/controllers/admin/user_groups.py:262
1322 #: rhodecode/controllers/admin/user_groups.py:263
1263 msgid "An error occurred during deletion of user group"
1323 msgid "An error occurred during deletion of user group"
1264 msgstr ""
1324 msgstr ""
1265
1325
1266 #: rhodecode/controllers/admin/user_groups.py:330
1326 #: rhodecode/controllers/admin/user_groups.py:331
1267 msgid "Target group cannot be the same"
1327 msgid "Target group cannot be the same"
1268 msgstr ""
1328 msgstr ""
1269
1329
1270 #: rhodecode/controllers/admin/user_groups.py:336
1330 #: rhodecode/controllers/admin/user_groups.py:337
1271 msgid "User Group permissions updated"
1331 msgid "User Group permissions updated"
1272 msgstr ""
1332 msgstr ""
1273
1333
1274 #: rhodecode/controllers/admin/user_groups.py:421
1334 #: rhodecode/controllers/admin/user_groups.py:422
1275 msgid "User Group global permissions updated successfully"
1335 msgid "User Group global permissions updated successfully"
1276 msgstr ""
1336 msgstr ""
1277
1337
1278 #: rhodecode/controllers/admin/user_groups.py:437
1338 #: rhodecode/controllers/admin/user_groups.py:437
1279 #: rhodecode/controllers/admin/users.py:595
1339 #: rhodecode/controllers/admin/users.py:477
1280 msgid "An error occurred during permissions saving"
1340 msgid "An error occurred during permissions saving"
1281 msgstr ""
1341 msgstr ""
1282
1342
1283 #: rhodecode/controllers/admin/users.py:153
1343 #: rhodecode/controllers/admin/user_groups.py:481
1344 msgid "User Group synchronization updated successfully"
1345 msgstr ""
1346
1347 #: rhodecode/controllers/admin/user_groups.py:485
1348 msgid "An error occurred during synchronization update"
1349 msgstr ""
1350
1351 #: rhodecode/controllers/admin/users.py:106
1284 #, python-format
1352 #, python-format
1285 msgid "Created user %(user_link)s"
1353 msgid "Created user %(user_link)s"
1286 msgstr ""
1354 msgstr ""
1287
1355
1288 #: rhodecode/controllers/admin/users.py:169
1356 #: rhodecode/controllers/admin/users.py:122
1289 #, python-format
1357 #, python-format
1290 msgid "Error occurred during creation of user %s"
1358 msgid "Error occurred during creation of user %s"
1291 msgstr ""
1359 msgstr ""
1292
1360
1293 #: rhodecode/controllers/admin/users.py:214
1361 #: rhodecode/controllers/admin/users.py:167
1294 msgid "User updated successfully"
1362 msgid "User updated successfully"
1295 msgstr ""
1363 msgstr ""
1296
1364
1297 #: rhodecode/controllers/admin/users.py:265
1365 #: rhodecode/controllers/admin/users.py:218
1298 #, python-format
1366 #, python-format
1299 msgid "Detached %s repositories"
1367 msgid "Detached %s repositories"
1300 msgstr ""
1368 msgstr ""
1301
1369
1302 #: rhodecode/controllers/admin/users.py:270
1370 #: rhodecode/controllers/admin/users.py:223
1303 #, python-format
1371 #, python-format
1304 msgid "Deleted %s repositories"
1372 msgid "Deleted %s repositories"
1305 msgstr ""
1373 msgstr ""
1306
1374
1307 #: rhodecode/controllers/admin/users.py:278
1375 #: rhodecode/controllers/admin/users.py:231
1308 #, python-format
1376 #, python-format
1309 msgid "Detached %s repository groups"
1377 msgid "Detached %s repository groups"
1310 msgstr ""
1378 msgstr ""
1311
1379
1312 #: rhodecode/controllers/admin/users.py:283
1380 #: rhodecode/controllers/admin/users.py:236
1313 #, python-format
1381 #, python-format
1314 msgid "Deleted %s repository groups"
1382 msgid "Deleted %s repository groups"
1315 msgstr ""
1383 msgstr ""
1316
1384
1385 #: rhodecode/controllers/admin/users.py:244
1386 #, python-format
1387 msgid "Detached %s user groups"
1388 msgstr ""
1389
1390 #: rhodecode/controllers/admin/users.py:249
1391 #, python-format
1392 msgid "Deleted %s user groups"
1393 msgstr ""
1394
1395 #: rhodecode/controllers/admin/users.py:260
1396 msgid "Successfully deleted user"
1397 msgstr ""
1398
1399 #: rhodecode/controllers/admin/users.py:266
1400 msgid "An error occurred during deletion of user"
1401 msgstr ""
1402
1403 #: rhodecode/controllers/admin/users.py:285
1404 msgid "Force password change disabled for user"
1405 msgstr ""
1406
1407 #: rhodecode/controllers/admin/users.py:287
1408 msgid "Force password change enabled for user"
1409 msgstr ""
1410
1317 #: rhodecode/controllers/admin/users.py:291
1411 #: rhodecode/controllers/admin/users.py:291
1318 #, python-format
1412 msgid "An error occurred during password reset for user"
1319 msgid "Detached %s user groups"
1413 msgstr ""
1320 msgstr ""
1414
1321
1415 #: rhodecode/controllers/admin/users.py:324
1322 #: rhodecode/controllers/admin/users.py:296
1416 #, python-format
1323 #, python-format
1417 msgid "Linked repository group `%s` as personal"
1324 msgid "Deleted %s user groups"
1418 msgstr ""
1325 msgstr ""
1419
1326
1420 #: rhodecode/controllers/admin/users.py:330
1327 #: rhodecode/controllers/admin/users.py:307
1421 #, python-format
1328 msgid "Successfully deleted user"
1422 msgid "Created repository group `%s`"
1329 msgstr ""
1330
1331 #: rhodecode/controllers/admin/users.py:313
1332 msgid "An error occurred during deletion of user"
1333 msgstr ""
1334
1335 #: rhodecode/controllers/admin/users.py:332
1336 msgid "Force password change disabled for user"
1337 msgstr ""
1423 msgstr ""
1338
1424
1339 #: rhodecode/controllers/admin/users.py:334
1425 #: rhodecode/controllers/admin/users.py:334
1340 msgid "Force password change enabled for user"
1341 msgstr ""
1342
1343 #: rhodecode/controllers/admin/users.py:338
1344 msgid "An error occurred during password reset for user"
1345 msgstr ""
1346
1347 #: rhodecode/controllers/admin/users.py:371
1348 #, python-format
1349 msgid "Linked repository group `%s` as personal"
1350 msgstr ""
1351
1352 #: rhodecode/controllers/admin/users.py:377
1353 #, python-format
1354 msgid "Created repository group `%s`"
1355 msgstr ""
1356
1357 #: rhodecode/controllers/admin/users.py:381
1358 #, python-format
1426 #, python-format
1359 msgid "Repository group `%s` is already taken"
1427 msgid "Repository group `%s` is already taken"
1360 msgstr ""
1428 msgstr ""
1361
1429
1362 #: rhodecode/controllers/admin/users.py:386
1430 #: rhodecode/controllers/admin/users.py:339
1363 msgid "An error occurred during repository group creation for user"
1431 msgid "An error occurred during repository group creation for user"
1364 msgstr ""
1432 msgstr ""
1365
1433
1366 #: rhodecode/controllers/admin/users.py:406
1434 #: rhodecode/controllers/admin/users.py:396
1367 #: rhodecode/controllers/admin/users.py:427
1368 #: rhodecode/controllers/admin/users.py:459
1369 #: rhodecode/controllers/admin/users.py:490
1370 #: rhodecode/controllers/admin/users.py:507
1371 #: rhodecode/controllers/admin/users.py:530
1372 #: rhodecode/controllers/admin/users.py:604
1373 #: rhodecode/controllers/admin/users.py:617
1374 #: rhodecode/controllers/admin/users.py:675
1375 msgid "You can't edit this user"
1376 msgstr ""
1377
1378 #: rhodecode/controllers/admin/users.py:443
1379 msgid "The user participates as reviewer in pull requests and cannot be deleted. You can set the user to \"inactive\" instead of deleting it."
1435 msgid "The user participates as reviewer in pull requests and cannot be deleted. You can set the user to \"inactive\" instead of deleting it."
1380 msgstr ""
1436 msgstr ""
1381
1437
1382 #: rhodecode/controllers/admin/users.py:579
1438 #: rhodecode/controllers/admin/users.py:461
1383 msgid "User global permissions updated successfully"
1439 msgid "User global permissions updated successfully"
1384 msgstr ""
1440 msgstr ""
1385
1441
1386 #: rhodecode/controllers/admin/users.py:707
1442 #: rhodecode/controllers/admin/users.py:589
1387 #, python-format
1443 #, python-format
1388 msgid "An error occurred during ip saving:%s"
1444 msgid "An error occurred during ip saving:%s"
1389 msgstr ""
1445 msgstr ""
1390
1446
1391 #: rhodecode/controllers/admin/users.py:722
1447 #: rhodecode/controllers/admin/users.py:604
1392 msgid "An error occurred during ip saving"
1448 msgid "An error occurred during ip saving"
1393 msgstr ""
1449 msgstr ""
1394
1450
1395 #: rhodecode/controllers/admin/users.py:726
1451 #: rhodecode/controllers/admin/users.py:608
1396 #, python-format
1452 #, python-format
1397 msgid "Added ips %s to user whitelist"
1453 msgid "Added ips %s to user whitelist"
1398 msgstr ""
1454 msgstr ""
1399
1455
1400 #: rhodecode/controllers/admin/users.py:744
1456 #: rhodecode/controllers/admin/users.py:626
1401 msgid "Removed ip address from user whitelist"
1457 msgid "Removed ip address from user whitelist"
1402 msgstr ""
1458 msgstr ""
1403
1459
1404 #: rhodecode/events/pullrequest.py:65
1460 #: rhodecode/events/pullrequest.py:68
1405 msgid "pullrequest created"
1461 msgid "pullrequest created"
1406 msgstr ""
1462 msgstr ""
1407
1463
1408 #: rhodecode/events/pullrequest.py:74
1464 #: rhodecode/events/pullrequest.py:77
1409 msgid "pullrequest closed"
1465 msgid "pullrequest closed"
1410 msgstr ""
1466 msgstr ""
1411
1467
1412 #: rhodecode/events/pullrequest.py:83
1468 #: rhodecode/events/pullrequest.py:86
1413 msgid "pullrequest commits updated"
1469 msgid "pullrequest commits updated"
1414 msgstr ""
1470 msgstr ""
1415
1471
1416 #: rhodecode/events/pullrequest.py:92
1472 #: rhodecode/events/pullrequest.py:95
1417 msgid "pullrequest review changed"
1473 msgid "pullrequest review changed"
1418 msgstr ""
1474 msgstr ""
1419
1475
1420 #: rhodecode/events/pullrequest.py:101
1476 #: rhodecode/events/pullrequest.py:104
1421 msgid "pullrequest merged"
1477 msgid "pullrequest merged"
1422 msgstr ""
1478 msgstr ""
1423
1479
1424 #: rhodecode/events/pullrequest.py:110
1480 #: rhodecode/events/pullrequest.py:113
1425 msgid "pullrequest commented"
1481 msgid "pullrequest commented"
1426 msgstr ""
1482 msgstr ""
1427
1483
1428 #: rhodecode/events/repo.py:136
1484 #: rhodecode/events/repo.py:138
1429 msgid "repository pre create"
1485 msgid "repository pre create"
1430 msgstr ""
1486 msgstr ""
1431
1487
1432 #: rhodecode/events/repo.py:145
1488 #: rhodecode/events/repo.py:147
1433 msgid "repository created"
1489 msgid "repository created"
1434 msgstr ""
1490 msgstr ""
1435
1491
1436 #: rhodecode/events/repo.py:154
1492 #: rhodecode/events/repo.py:156
1437 msgid "repository pre delete"
1493 msgid "repository pre delete"
1438 msgstr ""
1494 msgstr ""
1439
1495
1440 #: rhodecode/events/repo.py:163
1496 #: rhodecode/events/repo.py:165
1441 msgid "repository deleted"
1497 msgid "repository deleted"
1442 msgstr ""
1498 msgstr ""
1443
1499
1444 #: rhodecode/events/repo.py:199
1500 #: rhodecode/events/repo.py:201
1445 msgid "repository pre pull"
1501 msgid "repository pre pull"
1446 msgstr ""
1502 msgstr ""
1447
1503
1448 #: rhodecode/events/repo.py:208
1504 #: rhodecode/events/repo.py:210
1449 msgid "repository pull"
1505 msgid "repository pull"
1450 msgstr ""
1506 msgstr ""
1451
1507
1452 #: rhodecode/events/repo.py:217
1508 #: rhodecode/events/repo.py:219
1453 msgid "repository pre push"
1509 msgid "repository pre push"
1454 msgstr ""
1510 msgstr ""
1455
1511
1456 #: rhodecode/events/repo.py:228
1512 #: rhodecode/events/repo.py:230
1457 msgid "repository push"
1513 msgid "repository push"
1458 msgstr ""
1514 msgstr ""
1459
1515
@@ -1469,25 +1525,24 b' msgstr ""'
1469 msgid "repository group update"
1525 msgid "repository group update"
1470 msgstr ""
1526 msgstr ""
1471
1527
1472 #: rhodecode/events/user.py:34
1528 #: rhodecode/events/user.py:37
1473 msgid "user registered"
1529 msgid "user registered"
1474 msgstr ""
1530 msgstr ""
1475
1531
1476 #: rhodecode/events/user.py:48
1532 #: rhodecode/events/user.py:52
1477 msgid "user pre create"
1533 msgid "user pre create"
1478 msgstr ""
1534 msgstr ""
1479
1535
1480 #: rhodecode/events/user.py:61
1536 #: rhodecode/events/user.py:66
1481 msgid "user post create"
1537 msgid "user post create"
1482 msgstr ""
1538 msgstr ""
1483
1539
1484 #: rhodecode/events/user.py:74
1540 #: rhodecode/events/user.py:80
1485 msgid "user pre update"
1541 msgid "user pre update"
1486 msgstr ""
1542 msgstr ""
1487
1543
1488 #: rhodecode/forms/__init__.py:32 rhodecode/templates/admin/gists/new.mako:62
1544 #: rhodecode/forms/__init__.py:32 rhodecode/templates/admin/gists/new.mako:62
1489 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:31
1545 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:87
1490 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:88
1491 #: rhodecode/templates/admin/my_account/my_account_emails.mako:65
1546 #: rhodecode/templates/admin/my_account/my_account_emails.mako:65
1492 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:107
1547 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:107
1493 #: rhodecode/templates/admin/permissions/permissions_application.mako:60
1548 #: rhodecode/templates/admin/permissions/permissions_application.mako:60
@@ -1499,15 +1554,14 b' msgstr ""'
1499 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:80
1554 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:80
1500 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:111
1555 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:111
1501 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:161
1556 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:161
1502 #: rhodecode/templates/admin/repos/repo_edit_vcs.mako:46
1557 #: rhodecode/templates/admin/repos/repo_edit_vcs.mako:44
1503 #: rhodecode/templates/admin/settings/settings_global.mako:140
1558 #: rhodecode/templates/admin/settings/settings_global.mako:140
1504 #: rhodecode/templates/admin/settings/settings_issuetracker.mako:16
1559 #: rhodecode/templates/admin/settings/settings_issuetracker.mako:16
1505 #: rhodecode/templates/admin/settings/settings_labs.mako:49
1560 #: rhodecode/templates/admin/settings/settings_labs.mako:49
1506 #: rhodecode/templates/admin/settings/settings_vcs.mako:14
1561 #: rhodecode/templates/admin/settings/settings_vcs.mako:14
1507 #: rhodecode/templates/admin/settings/settings_visual.mako:222
1562 #: rhodecode/templates/admin/settings/settings_visual.mako:222
1508 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:121
1563 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:121
1509 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:27
1564 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:83
1510 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:85
1511 #: rhodecode/templates/admin/users/user_edit_emails.mako:63
1565 #: rhodecode/templates/admin/users/user_edit_emails.mako:63
1512 #: rhodecode/templates/admin/users/user_edit_ips.mako:70
1566 #: rhodecode/templates/admin/users/user_edit_ips.mako:70
1513 #: rhodecode/templates/admin/users/user_edit_profile.mako:135
1567 #: rhodecode/templates/admin/users/user_edit_profile.mako:135
@@ -1517,17 +1571,17 b' msgstr ""'
1517
1571
1518 #: rhodecode/forms/__init__.py:33 rhodecode/templates/admin/gists/show.mako:49
1572 #: rhodecode/forms/__init__.py:33 rhodecode/templates/admin/gists/show.mako:49
1519 #: rhodecode/templates/admin/integrations/list.mako:211
1573 #: rhodecode/templates/admin/integrations/list.mako:211
1520 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:60
1574 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:49
1521 #: rhodecode/templates/admin/my_account/my_account_emails.mako:32
1575 #: rhodecode/templates/admin/my_account/my_account_emails.mako:32
1522 #: rhodecode/templates/admin/permissions/permissions_ips.mako:26
1576 #: rhodecode/templates/admin/permissions/permissions_ips.mako:26
1523 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:25
1577 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:25
1524 #: rhodecode/templates/admin/settings/settings_hooks.mako:46
1578 #: rhodecode/templates/admin/settings/settings_hooks.mako:46
1525 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:56
1579 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:45
1526 #: rhodecode/templates/admin/users/user_edit_emails.mako:31
1580 #: rhodecode/templates/admin/users/user_edit_emails.mako:31
1527 #: rhodecode/templates/admin/users/user_edit_ips.mako:34
1581 #: rhodecode/templates/admin/users/user_edit_ips.mako:34
1528 #: rhodecode/templates/base/issue_tracker_settings.mako:70
1582 #: rhodecode/templates/base/issue_tracker_settings.mako:69
1529 #: rhodecode/templates/base/vcs_settings.mako:202
1583 #: rhodecode/templates/base/vcs_settings.mako:251
1530 #: rhodecode/templates/base/vcs_settings.mako:227
1584 #: rhodecode/templates/base/vcs_settings.mako:276
1531 #: rhodecode/templates/changeset/changeset_file_comment.mako:137
1585 #: rhodecode/templates/changeset/changeset_file_comment.mako:137
1532 #: rhodecode/templates/changeset/changeset_file_comment.mako:139
1586 #: rhodecode/templates/changeset/changeset_file_comment.mako:139
1533 #: rhodecode/templates/changeset/changeset_file_comment.mako:142
1587 #: rhodecode/templates/changeset/changeset_file_comment.mako:142
@@ -1536,9 +1590,9 b' msgstr ""'
1536 #: rhodecode/templates/data_table/_dt_elements.mako:198
1590 #: rhodecode/templates/data_table/_dt_elements.mako:198
1537 #: rhodecode/templates/data_table/_dt_elements.mako:210
1591 #: rhodecode/templates/data_table/_dt_elements.mako:210
1538 #: rhodecode/templates/debug_style/buttons.html:132
1592 #: rhodecode/templates/debug_style/buttons.html:132
1539 #: rhodecode/templates/files/files_source.mako:35
1593 #: rhodecode/templates/files/files_source.mako:45
1540 #: rhodecode/templates/files/files_source.mako:39
1594 #: rhodecode/templates/files/files_source.mako:49
1541 #: rhodecode/templates/files/files_source.mako:42
1595 #: rhodecode/templates/files/files_source.mako:52
1542 #: rhodecode/templates/pullrequests/pullrequest_show.mako:56
1596 #: rhodecode/templates/pullrequests/pullrequest_show.mako:56
1543 #: rhodecode/templates/pullrequests/pullrequest_show.mako:60
1597 #: rhodecode/templates/pullrequests/pullrequest_show.mako:60
1544 msgid "Delete"
1598 msgid "Delete"
@@ -1575,27 +1629,27 b' msgstr ""'
1575 msgid "Root repositories only"
1629 msgid "Root repositories only"
1576 msgstr ""
1630 msgstr ""
1577
1631
1578 #: rhodecode/integrations/views.py:161
1632 #: rhodecode/integrations/views.py:160
1579 msgid "{repo_name} repository"
1633 msgid "{repo_name} repository"
1580 msgstr ""
1634 msgstr ""
1581
1635
1582 #: rhodecode/integrations/views.py:164
1636 #: rhodecode/integrations/views.py:163
1583 msgid "{repo_group_name} repo group"
1637 msgid "{repo_group_name} repo group"
1584 msgstr ""
1638 msgstr ""
1585
1639
1586 #: rhodecode/integrations/views.py:171
1640 #: rhodecode/integrations/views.py:170
1587 msgid "{name} integration"
1641 msgid "{name} integration"
1588 msgstr ""
1642 msgstr ""
1589
1643
1590 #: rhodecode/integrations/views.py:185
1644 #: rhodecode/integrations/views.py:184
1591 msgid "Integration {integration_name} deleted successfully."
1645 msgid "Integration {integration_name} deleted successfully."
1592 msgstr ""
1646 msgstr ""
1593
1647
1594 #: rhodecode/integrations/views.py:265
1648 #: rhodecode/integrations/views.py:264
1595 msgid "Errors exist when saving integration settings. Please check the form inputs."
1649 msgid "Errors exist when saving integration settings. Please check the form inputs."
1596 msgstr ""
1650 msgstr ""
1597
1651
1598 #: rhodecode/integrations/views.py:290
1652 #: rhodecode/integrations/views.py:289
1599 msgid "Integration {integration_name} updated successfully."
1653 msgid "Integration {integration_name} updated successfully."
1600 msgstr ""
1654 msgstr ""
1601
1655
@@ -1668,56 +1722,57 b' msgstr ""'
1668 msgid "Send events such as repo pushes and pull requests to your hipchat channel."
1722 msgid "Send events such as repo pushes and pull requests to your hipchat channel."
1669 msgstr ""
1723 msgstr ""
1670
1724
1671 #: rhodecode/integrations/types/slack.py:44
1725 #: rhodecode/integrations/types/slack.py:46
1672 msgid "Slack service URL"
1726 msgid "Slack service URL"
1673 msgstr ""
1727 msgstr ""
1674
1728
1675 #: rhodecode/integrations/types/slack.py:45
1729 #: rhodecode/integrations/types/slack.py:47
1676 msgid "This can be setup at the <a href=\"https://my.slack.com/services/new/incoming-webhook/\">slack app manager</a>"
1730 msgid "This can be setup at the <a href=\"https://my.slack.com/services/new/incoming-webhook/\">slack app manager</a>"
1677 msgstr ""
1731 msgstr ""
1678
1732
1679 #: rhodecode/integrations/types/slack.py:58 rhodecode/templates/login.mako:42
1733 #: rhodecode/integrations/types/slack.py:60 rhodecode/templates/login.mako:43
1680 #: rhodecode/templates/register.mako:40
1734 #: rhodecode/templates/register.mako:41
1681 #: rhodecode/templates/admin/admin_log.mako:7
1735 #: rhodecode/templates/admin/admin_log.mako:7
1682 #: rhodecode/templates/admin/my_account/my_account_profile.mako:24
1736 #: rhodecode/templates/admin/my_account/my_account_profile.mako:24
1683 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:24
1737 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:24
1684 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:69
1738 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:69
1685 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:70
1739 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:70
1686 #: rhodecode/templates/admin/users/user_add.mako:35
1740 #: rhodecode/templates/admin/users/user_add.mako:35
1741 #: rhodecode/templates/admin/users/user_edit_audit.mako:22
1687 #: rhodecode/templates/admin/users/user_edit_profile.mako:39
1742 #: rhodecode/templates/admin/users/user_edit_profile.mako:39
1688 #: rhodecode/templates/admin/users/users.mako:90
1743 #: rhodecode/templates/admin/users/users.mako:62
1689 #: rhodecode/templates/base/base.mako:301
1744 #: rhodecode/templates/base/base.mako:304
1690 #: rhodecode/templates/debug_style/login.html:36
1745 #: rhodecode/templates/debug_style/login.html:36
1691 #: rhodecode/templates/email_templates/user_registration.mako:23
1746 #: rhodecode/templates/email_templates/user_registration.mako:23
1692 #: rhodecode/templates/users/user_profile.mako:27
1747 #: rhodecode/templates/users/user_profile.mako:27
1693 msgid "Username"
1748 msgid "Username"
1694 msgstr ""
1749 msgstr ""
1695
1750
1696 #: rhodecode/integrations/types/slack.py:59
1751 #: rhodecode/integrations/types/slack.py:61
1697 msgid "Username to show notifications coming from."
1752 msgid "Username to show notifications coming from."
1698 msgstr ""
1753 msgstr ""
1699
1754
1700 #: rhodecode/integrations/types/slack.py:68
1755 #: rhodecode/integrations/types/slack.py:70
1701 msgid "Channel"
1756 msgid "Channel"
1702 msgstr ""
1757 msgstr ""
1703
1758
1704 #: rhodecode/integrations/types/slack.py:69
1759 #: rhodecode/integrations/types/slack.py:71
1705 msgid "Channel to send notifications to."
1760 msgid "Channel to send notifications to."
1706 msgstr ""
1761 msgstr ""
1707
1762
1708 #: rhodecode/integrations/types/slack.py:78
1763 #: rhodecode/integrations/types/slack.py:80
1709 msgid "Emoji"
1764 msgid "Emoji"
1710 msgstr ""
1765 msgstr ""
1711
1766
1712 #: rhodecode/integrations/types/slack.py:79
1767 #: rhodecode/integrations/types/slack.py:81
1713 msgid "Emoji to use eg. :studio_microphone:"
1768 msgid "Emoji to use eg. :studio_microphone:"
1714 msgstr ""
1769 msgstr ""
1715
1770
1716 #: rhodecode/integrations/types/slack.py:101
1771 #: rhodecode/integrations/types/slack.py:92
1717 msgid "Slack"
1772 msgid "Slack"
1718 msgstr ""
1773 msgstr ""
1719
1774
1720 #: rhodecode/integrations/types/slack.py:102
1775 #: rhodecode/integrations/types/slack.py:93
1721 msgid "Send events such as repo pushes and pull requests to your slack channel."
1776 msgid "Send events such as repo pushes and pull requests to your slack channel."
1722 msgstr ""
1777 msgstr ""
1723
1778
@@ -1876,25 +1931,25 b' msgstr ""'
1876 msgid "Commit not found"
1931 msgid "Commit not found"
1877 msgstr ""
1932 msgstr ""
1878
1933
1879 #: rhodecode/lib/auth.py:1189
1934 #: rhodecode/lib/auth.py:1197
1880 #, python-format
1935 #, python-format
1881 msgid "IP %s not allowed"
1936 msgid "IP %s not allowed"
1882 msgstr ""
1937 msgstr ""
1883
1938
1884 #: rhodecode/lib/auth.py:1263
1939 #: rhodecode/lib/auth.py:1281
1885 msgid "You need to be a registered user to perform this action"
1940 msgid "You need to be a registered user to perform this action"
1886 msgstr ""
1941 msgstr ""
1887
1942
1888 #: rhodecode/lib/auth.py:1311
1943 #: rhodecode/lib/auth.py:1329
1889 #, python-format
1944 #, python-format
1890 msgid "Action not supported for %s."
1945 msgid "Action not supported for %s."
1891 msgstr ""
1946 msgstr ""
1892
1947
1893 #: rhodecode/lib/auth.py:1348
1948 #: rhodecode/lib/auth.py:1379
1894 msgid "You need to be signed in to view this page"
1949 msgid "You need to be signed in to view this page"
1895 msgstr ""
1950 msgstr ""
1896
1951
1897 #: rhodecode/lib/base.py:557
1952 #: rhodecode/lib/base.py:549
1898 #, python-format
1953 #, python-format
1899 msgid "The repository at %(repo_name)s cannot be located."
1954 msgid "The repository at %(repo_name)s cannot be located."
1900 msgstr ""
1955 msgstr ""
@@ -1919,36 +1974,16 b' msgstr ""'
1919 msgid "Click to select line"
1974 msgid "Click to select line"
1920 msgstr ""
1975 msgstr ""
1921
1976
1922 #: rhodecode/lib/helpers.py:1515
1977 #: rhodecode/lib/helpers.py:1517
1923 #, python-format
1978 #, python-format
1924 msgid " and %s more"
1979 msgid " and %s more"
1925 msgstr ""
1980 msgstr ""
1926
1981
1927 #: rhodecode/lib/helpers.py:1519
1982 #: rhodecode/lib/helpers.py:1521
1928 msgid "No Files"
1983 msgid "No Files"
1929 msgstr ""
1984 msgstr ""
1930
1985
1931 #: rhodecode/lib/helpers.py:1592
1986 #: rhodecode/lib/helpers.py:1800
1932 msgid "new file"
1933 msgstr ""
1934
1935 #: rhodecode/lib/helpers.py:1595
1936 msgid "mod"
1937 msgstr ""
1938
1939 #: rhodecode/lib/helpers.py:1598
1940 msgid "del"
1941 msgstr ""
1942
1943 #: rhodecode/lib/helpers.py:1601
1944 msgid "rename"
1945 msgstr ""
1946
1947 #: rhodecode/lib/helpers.py:1606
1948 msgid "chmod"
1949 msgstr ""
1950
1951 #: rhodecode/lib/helpers.py:1853
1952 msgid ""
1987 msgid ""
1953 "Example filter terms:\n"
1988 "Example filter terms:\n"
1954 " repository:vcs\n"
1989 " repository:vcs\n"
@@ -1967,7 +2002,7 b' msgid ""'
1967 " \"username:test AND repository:test*\"\n"
2002 " \"username:test AND repository:test*\"\n"
1968 msgstr ""
2003 msgstr ""
1969
2004
1970 #: rhodecode/lib/helpers.py:1873
2005 #: rhodecode/lib/helpers.py:1820
1971 #, python-format
2006 #, python-format
1972 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"
2007 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"
1973 msgstr ""
2008 msgstr ""
@@ -2005,9 +2040,9 b' msgid "in ${val} and ${detail}"'
2005 msgstr ""
2040 msgstr ""
2006
2041
2007 #: rhodecode/lib/utils2.py:515
2042 #: rhodecode/lib/utils2.py:515
2008 #: rhodecode/public/js/rhodecode-components.js:33194
2043 #: rhodecode/public/js/rhodecode-components.js:33659
2009 #: rhodecode/public/js/scripts.js:25042
2044 #: rhodecode/public/js/scripts.js:25507
2010 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:65
2045 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:66
2011 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:174
2046 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:174
2012 msgid "just now"
2047 msgid "just now"
2013 msgstr ""
2048 msgstr ""
@@ -2039,7 +2074,9 b' msgstr ""'
2039 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2285
2074 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2285
2040 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2285
2075 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2285
2041 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2289
2076 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2289
2042 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2289 rhodecode/model/db.py:2298
2077 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2289
2078 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2339
2079 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2340 rhodecode/model/db.py:2410
2043 msgid "Repository no access"
2080 msgid "Repository no access"
2044 msgstr ""
2081 msgstr ""
2045
2082
@@ -2070,7 +2107,9 b' msgstr ""'
2070 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2286
2107 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2286
2071 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2286
2108 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2286
2072 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2290
2109 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2290
2073 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2290 rhodecode/model/db.py:2299
2110 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2290
2111 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2340
2112 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2341 rhodecode/model/db.py:2411
2074 msgid "Repository read access"
2113 msgid "Repository read access"
2075 msgstr ""
2114 msgstr ""
2076
2115
@@ -2101,7 +2140,9 b' msgstr ""'
2101 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2287
2140 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2287
2102 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2287
2141 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2287
2103 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2291
2142 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2291
2104 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2291 rhodecode/model/db.py:2300
2143 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2291
2144 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2341
2145 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2342 rhodecode/model/db.py:2412
2105 msgid "Repository write access"
2146 msgid "Repository write access"
2106 msgstr ""
2147 msgstr ""
2107
2148
@@ -2132,7 +2173,9 b' msgstr ""'
2132 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2288
2173 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2288
2133 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2288
2174 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2288
2134 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2292
2175 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2292
2135 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2292 rhodecode/model/db.py:2301
2176 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2292
2177 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2342
2178 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2343 rhodecode/model/db.py:2413
2136 msgid "Repository admin access"
2179 msgid "Repository admin access"
2137 msgstr ""
2180 msgstr ""
2138
2181
@@ -2203,7 +2246,9 b' msgstr ""'
2203 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2306
2246 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2306
2204 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2306
2247 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2306
2205 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2310
2248 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2310
2206 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2310 rhodecode/model/db.py:2319
2249 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2310
2250 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2360
2251 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2361 rhodecode/model/db.py:2431
2207 msgid "Repository creation disabled"
2252 msgid "Repository creation disabled"
2208 msgstr ""
2253 msgstr ""
2209
2254
@@ -2234,7 +2279,9 b' msgstr ""'
2234 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2307
2279 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2307
2235 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2307
2280 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2307
2236 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2311
2281 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2311
2237 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2311 rhodecode/model/db.py:2320
2282 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2311
2283 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2361
2284 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2362 rhodecode/model/db.py:2432
2238 msgid "Repository creation enabled"
2285 msgid "Repository creation enabled"
2239 msgstr ""
2286 msgstr ""
2240
2287
@@ -2265,7 +2312,9 b' msgstr ""'
2265 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2311
2312 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2311
2266 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2311
2313 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2311
2267 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2315
2314 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2315
2268 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2315 rhodecode/model/db.py:2324
2315 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2315
2316 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2365
2317 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2366 rhodecode/model/db.py:2436
2269 msgid "Repository forking disabled"
2318 msgid "Repository forking disabled"
2270 msgstr ""
2319 msgstr ""
2271
2320
@@ -2296,7 +2345,9 b' msgstr ""'
2296 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2312
2345 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2312
2297 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2312
2346 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2312
2298 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2316
2347 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2316
2299 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2316 rhodecode/model/db.py:2325
2348 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2316
2349 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2366
2350 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2367 rhodecode/model/db.py:2437
2300 msgid "Repository forking enabled"
2351 msgid "Repository forking enabled"
2301 msgstr ""
2352 msgstr ""
2302
2353
@@ -2348,7 +2399,9 b' msgstr ""'
2348 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2946
2399 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2946
2349 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2946
2400 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2946
2350 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2950
2401 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2950
2351 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2950 rhodecode/model/db.py:3009
2402 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2950
2403 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3050
2404 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3051 rhodecode/model/db.py:3121
2352 msgid "Not Reviewed"
2405 msgid "Not Reviewed"
2353 msgstr ""
2406 msgstr ""
2354
2407
@@ -2379,7 +2432,9 b' msgstr ""'
2379 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2947
2432 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2947
2380 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2947
2433 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2947
2381 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2951
2434 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2951
2382 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2951 rhodecode/model/db.py:3010
2435 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2951
2436 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3051
2437 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3052 rhodecode/model/db.py:3122
2383 msgid "Approved"
2438 msgid "Approved"
2384 msgstr ""
2439 msgstr ""
2385
2440
@@ -2410,7 +2465,9 b' msgstr ""'
2410 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2948
2465 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2948
2411 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2948
2466 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2948
2412 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2952
2467 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2952
2413 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2952 rhodecode/model/db.py:3011
2468 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2952
2469 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3052
2470 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3053 rhodecode/model/db.py:3123
2414 msgid "Rejected"
2471 msgid "Rejected"
2415 msgstr ""
2472 msgstr ""
2416
2473
@@ -2441,7 +2498,9 b' msgstr ""'
2441 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2949
2498 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2949
2442 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2949
2499 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2949
2443 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2953
2500 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2953
2444 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2953 rhodecode/model/db.py:3012
2501 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2953
2502 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3053
2503 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3054 rhodecode/model/db.py:3124
2445 msgid "Under Review"
2504 msgid "Under Review"
2446 msgstr ""
2505 msgstr ""
2447
2506
@@ -2469,7 +2528,9 b' msgstr ""'
2469 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2290
2528 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2290
2470 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2290
2529 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2290
2471 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2294
2530 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2294
2472 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2294 rhodecode/model/db.py:2303
2531 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2294
2532 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2344
2533 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2345 rhodecode/model/db.py:2415
2473 msgid "Repository group no access"
2534 msgid "Repository group no access"
2474 msgstr ""
2535 msgstr ""
2475
2536
@@ -2497,7 +2558,9 b' msgstr ""'
2497 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2291
2558 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2291
2498 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2291
2559 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2291
2499 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2295
2560 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2295
2500 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2295 rhodecode/model/db.py:2304
2561 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2295
2562 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2345
2563 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2346 rhodecode/model/db.py:2416
2501 msgid "Repository group read access"
2564 msgid "Repository group read access"
2502 msgstr ""
2565 msgstr ""
2503
2566
@@ -2525,7 +2588,9 b' msgstr ""'
2525 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2292
2588 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2292
2526 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2292
2589 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2292
2527 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2296
2590 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2296
2528 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2296 rhodecode/model/db.py:2305
2591 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2296
2592 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2346
2593 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2347 rhodecode/model/db.py:2417
2529 msgid "Repository group write access"
2594 msgid "Repository group write access"
2530 msgstr ""
2595 msgstr ""
2531
2596
@@ -2553,7 +2618,9 b' msgstr ""'
2553 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2293
2618 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2293
2554 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2293
2619 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2293
2555 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2297
2620 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2297
2556 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2297 rhodecode/model/db.py:2306
2621 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2297
2622 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2347
2623 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2348 rhodecode/model/db.py:2418
2557 msgid "Repository group admin access"
2624 msgid "Repository group admin access"
2558 msgstr ""
2625 msgstr ""
2559
2626
@@ -2580,7 +2647,9 b' msgstr ""'
2580 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2295
2647 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2295
2581 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2295
2648 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2295
2582 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2299
2649 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2299
2583 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2299 rhodecode/model/db.py:2308
2650 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2299
2651 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2349
2652 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2350 rhodecode/model/db.py:2420
2584 msgid "User group no access"
2653 msgid "User group no access"
2585 msgstr ""
2654 msgstr ""
2586
2655
@@ -2607,7 +2676,9 b' msgstr ""'
2607 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2296
2676 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2296
2608 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2296
2677 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2296
2609 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2300
2678 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2300
2610 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2300 rhodecode/model/db.py:2309
2679 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2300
2680 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2350
2681 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2351 rhodecode/model/db.py:2421
2611 msgid "User group read access"
2682 msgid "User group read access"
2612 msgstr ""
2683 msgstr ""
2613
2684
@@ -2634,7 +2705,9 b' msgstr ""'
2634 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2297
2705 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2297
2635 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2297
2706 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2297
2636 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2301
2707 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2301
2637 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2301 rhodecode/model/db.py:2310
2708 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2301
2709 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2351
2710 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2352 rhodecode/model/db.py:2422
2638 msgid "User group write access"
2711 msgid "User group write access"
2639 msgstr ""
2712 msgstr ""
2640
2713
@@ -2661,7 +2734,9 b' msgstr ""'
2661 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2298
2734 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2298
2662 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2298
2735 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2298
2663 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2302
2736 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2302
2664 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2302 rhodecode/model/db.py:2311
2737 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2302
2738 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2352
2739 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2353 rhodecode/model/db.py:2423
2665 msgid "User group admin access"
2740 msgid "User group admin access"
2666 msgstr ""
2741 msgstr ""
2667
2742
@@ -2688,7 +2763,9 b' msgstr ""'
2688 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2300
2763 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2300
2689 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2300
2764 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2300
2690 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2304
2765 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2304
2691 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2304 rhodecode/model/db.py:2313
2766 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2304
2767 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2354
2768 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2355 rhodecode/model/db.py:2425
2692 msgid "Repository Group creation disabled"
2769 msgid "Repository Group creation disabled"
2693 msgstr ""
2770 msgstr ""
2694
2771
@@ -2715,7 +2792,9 b' msgstr ""'
2715 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2301
2792 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2301
2716 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2301
2793 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2301
2717 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2305
2794 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2305
2718 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2305 rhodecode/model/db.py:2314
2795 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2305
2796 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2355
2797 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2356 rhodecode/model/db.py:2426
2719 msgid "Repository Group creation enabled"
2798 msgid "Repository Group creation enabled"
2720 msgstr ""
2799 msgstr ""
2721
2800
@@ -2742,7 +2821,9 b' msgstr ""'
2742 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2303
2821 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2303
2743 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2303
2822 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2303
2744 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2307
2823 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2307
2745 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2307 rhodecode/model/db.py:2316
2824 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2307
2825 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2357
2826 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2358 rhodecode/model/db.py:2428
2746 msgid "User Group creation disabled"
2827 msgid "User Group creation disabled"
2747 msgstr ""
2828 msgstr ""
2748
2829
@@ -2769,7 +2850,9 b' msgstr ""'
2769 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2304
2850 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2304
2770 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2304
2851 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2304
2771 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2308
2852 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2308
2772 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2308 rhodecode/model/db.py:2317
2853 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2308
2854 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2358
2855 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2359 rhodecode/model/db.py:2429
2773 msgid "User Group creation enabled"
2856 msgid "User Group creation enabled"
2774 msgstr ""
2857 msgstr ""
2775
2858
@@ -2796,7 +2879,9 b' msgstr ""'
2796 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2314
2879 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2314
2797 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2314
2880 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2314
2798 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2318
2881 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2318
2799 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2318 rhodecode/model/db.py:2327
2882 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2318
2883 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2368
2884 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2369 rhodecode/model/db.py:2439
2800 msgid "Registration disabled"
2885 msgid "Registration disabled"
2801 msgstr ""
2886 msgstr ""
2802
2887
@@ -2823,7 +2908,9 b' msgstr ""'
2823 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2315
2908 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2315
2824 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2315
2909 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2315
2825 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2319
2910 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2319
2826 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2319 rhodecode/model/db.py:2328
2911 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2319
2912 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2369
2913 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2370 rhodecode/model/db.py:2440
2827 msgid "User Registration with manual account activation"
2914 msgid "User Registration with manual account activation"
2828 msgstr ""
2915 msgstr ""
2829
2916
@@ -2850,7 +2937,9 b' msgstr ""'
2850 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2316
2937 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2316
2851 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2316
2938 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2316
2852 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2320
2939 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2320
2853 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2320 rhodecode/model/db.py:2329
2940 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2320
2941 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2370
2942 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2371 rhodecode/model/db.py:2441
2854 msgid "User Registration with automatic account activation"
2943 msgid "User Registration with automatic account activation"
2855 msgstr ""
2944 msgstr ""
2856
2945
@@ -2877,7 +2966,9 b' msgstr ""'
2877 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2318
2966 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2318
2878 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2318
2967 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2318
2879 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2322
2968 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2322
2880 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2322 rhodecode/model/db.py:2335
2969 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2322
2970 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2376
2971 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2377 rhodecode/model/db.py:2447
2881 #: rhodecode/model/permission.py:95
2972 #: rhodecode/model/permission.py:95
2882 msgid "Manual activation of external account"
2973 msgid "Manual activation of external account"
2883 msgstr ""
2974 msgstr ""
@@ -2905,7 +2996,9 b' msgstr ""'
2905 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2319
2996 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2319
2906 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2319
2997 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2319
2907 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2323
2998 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2323
2908 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2323 rhodecode/model/db.py:2336
2999 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2323
3000 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2377
3001 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2378 rhodecode/model/db.py:2448
2909 #: rhodecode/model/permission.py:96
3002 #: rhodecode/model/permission.py:96
2910 msgid "Automatic activation of external account"
3003 msgid "Automatic activation of external account"
2911 msgstr ""
3004 msgstr ""
@@ -2927,7 +3020,9 b' msgstr ""'
2927 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2308
3020 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2308
2928 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2308
3021 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2308
2929 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2312
3022 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2312
2930 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2312 rhodecode/model/db.py:2321
3023 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2312
3024 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2362
3025 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2363 rhodecode/model/db.py:2433
2931 msgid "Repository creation enabled with write permission to a repository group"
3026 msgid "Repository creation enabled with write permission to a repository group"
2932 msgstr ""
3027 msgstr ""
2933
3028
@@ -2948,7 +3043,9 b' msgstr ""'
2948 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2309
3043 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2309
2949 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2309
3044 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2309
2950 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2313
3045 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2313
2951 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2313 rhodecode/model/db.py:2322
3046 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2313
3047 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2363
3048 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2364 rhodecode/model/db.py:2434
2952 msgid "Repository creation disabled with write permission to a repository group"
3049 msgid "Repository creation disabled with write permission to a repository group"
2953 msgstr ""
3050 msgstr ""
2954
3051
@@ -2966,7 +3063,9 b' msgstr ""'
2966 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2283
3063 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2283
2967 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2283
3064 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2283
2968 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2287
3065 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2287
2969 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2287 rhodecode/model/db.py:2296
3066 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2287
3067 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2337
3068 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2338 rhodecode/model/db.py:2408
2970 msgid "RhodeCode Super Administrator"
3069 msgid "RhodeCode Super Administrator"
2971 msgstr ""
3070 msgstr ""
2972
3071
@@ -2982,7 +3081,9 b' msgstr ""'
2982 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2321
3081 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2321
2983 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2321
3082 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2321
2984 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2325
3083 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2325
2985 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2325 rhodecode/model/db.py:2338
3084 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2325
3085 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2379
3086 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2380 rhodecode/model/db.py:2450
2986 msgid "Inherit object permissions from default user disabled"
3087 msgid "Inherit object permissions from default user disabled"
2987 msgstr ""
3088 msgstr ""
2988
3089
@@ -2998,7 +3099,9 b' msgstr ""'
2998 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2322
3099 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2322
2999 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2322
3100 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2322
3000 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2326
3101 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2326
3001 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2326 rhodecode/model/db.py:2339
3102 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2326
3103 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2380
3104 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2381 rhodecode/model/db.py:2451
3002 msgid "Inherit object permissions from default user enabled"
3105 msgid "Inherit object permissions from default user enabled"
3003 msgstr ""
3106 msgstr ""
3004
3107
@@ -3006,7 +3109,9 b' msgstr ""'
3006 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:910
3109 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:910
3007 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:910
3110 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:910
3008 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:912
3111 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:912
3009 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:912 rhodecode/model/db.py:913
3112 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:912
3113 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:954
3114 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:955 rhodecode/model/db.py:1008
3010 msgid "all"
3115 msgid "all"
3011 msgstr ""
3116 msgstr ""
3012
3117
@@ -3014,7 +3119,9 b' msgstr ""'
3014 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:911
3119 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:911
3015 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:911
3120 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:911
3016 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:913
3121 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:913
3017 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:913 rhodecode/model/db.py:914
3122 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:913
3123 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:955
3124 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:956 rhodecode/model/db.py:1009
3018 msgid "http/web interface"
3125 msgid "http/web interface"
3019 msgstr ""
3126 msgstr ""
3020
3127
@@ -3022,7 +3129,9 b' msgstr ""'
3022 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:912
3129 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:912
3023 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:912
3130 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:912
3024 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:914
3131 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:914
3025 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:914 rhodecode/model/db.py:915
3132 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:914
3133 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:956
3134 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:957 rhodecode/model/db.py:1010
3026 msgid "vcs (git/hg/svn protocol)"
3135 msgid "vcs (git/hg/svn protocol)"
3027 msgstr ""
3136 msgstr ""
3028
3137
@@ -3030,7 +3139,9 b' msgstr ""'
3030 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:913
3139 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:913
3031 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:913
3140 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:913
3032 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:915
3141 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:915
3033 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:915 rhodecode/model/db.py:916
3142 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:915
3143 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:957
3144 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:958 rhodecode/model/db.py:1011
3034 msgid "api calls"
3145 msgid "api calls"
3035 msgstr ""
3146 msgstr ""
3036
3147
@@ -3038,7 +3149,9 b' msgstr ""'
3038 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:914
3149 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:914
3039 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:914
3150 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:914
3040 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:916
3151 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:916
3041 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:916 rhodecode/model/db.py:917
3152 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:916
3153 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:958
3154 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:959 rhodecode/model/db.py:1012
3042 msgid "feed access"
3155 msgid "feed access"
3043 msgstr ""
3156 msgstr ""
3044
3157
@@ -3046,82 +3159,67 b' msgstr ""'
3046 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2061
3159 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2061
3047 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2061
3160 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2061
3048 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2065
3161 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py:2065
3049 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2065 rhodecode/model/db.py:2067
3162 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2065
3163 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2108
3164 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2109 rhodecode/model/db.py:2179
3050 msgid "No parent"
3165 msgid "No parent"
3051 msgstr ""
3166 msgstr ""
3052
3167
3053 #: rhodecode/lib/index/whoosh.py:148
3168 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2372
3169 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2373 rhodecode/model/db.py:2443
3170 msgid "Password reset enabled"
3171 msgstr ""
3172
3173 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2373
3174 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2374 rhodecode/model/db.py:2444
3175 msgid "Password reset hidden"
3176 msgstr ""
3177
3178 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2374
3179 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2375 rhodecode/model/db.py:2445
3180 msgid "Password reset disabled"
3181 msgstr ""
3182
3183 #: rhodecode/lib/index/whoosh.py:149
3054 msgid "Invalid search query. Try quoting it."
3184 msgid "Invalid search query. Try quoting it."
3055 msgstr ""
3185 msgstr ""
3056
3186
3057 #: rhodecode/lib/index/whoosh.py:150
3187 #: rhodecode/lib/index/whoosh.py:151
3058 msgid "There is no index to search in. Please run whoosh indexer"
3188 msgid "There is no index to search in. Please run whoosh indexer"
3059 msgstr ""
3189 msgstr ""
3060
3190
3061 #: rhodecode/lib/index/whoosh.py:155
3191 #: rhodecode/lib/index/whoosh.py:156
3062 msgid "An error occurred during this search operation"
3192 msgid "An error occurred during this search operation"
3063 msgstr ""
3193 msgstr ""
3064
3194
3065 #: rhodecode/lib/index/whoosh.py:163
3066 msgid "Index Type"
3067 msgstr ""
3068
3069 #: rhodecode/lib/index/whoosh.py:164
3195 #: rhodecode/lib/index/whoosh.py:164
3196 msgid "Index Type"
3197 msgstr ""
3198
3199 #: rhodecode/lib/index/whoosh.py:165
3070 msgid "File Index"
3200 msgid "File Index"
3071 msgstr ""
3201 msgstr ""
3072
3202
3073 #: rhodecode/lib/index/whoosh.py:165 rhodecode/lib/index/whoosh.py:170
3203 #: rhodecode/lib/index/whoosh.py:166 rhodecode/lib/index/whoosh.py:171
3074 msgid "Indexed documents"
3204 msgid "Indexed documents"
3075 msgstr ""
3205 msgstr ""
3076
3206
3077 #: rhodecode/lib/index/whoosh.py:167 rhodecode/lib/index/whoosh.py:172
3207 #: rhodecode/lib/index/whoosh.py:168 rhodecode/lib/index/whoosh.py:173
3078 msgid "Last update"
3208 msgid "Last update"
3079 msgstr ""
3209 msgstr ""
3080
3210
3081 #: rhodecode/lib/index/whoosh.py:169
3211 #: rhodecode/lib/index/whoosh.py:170
3082 msgid "Commit index"
3212 msgid "Commit index"
3083 msgstr ""
3213 msgstr ""
3084
3214
3085 #: rhodecode/login/views.py:249 rhodecode/login/views.py:311
3086 msgid "Bad captcha"
3087 msgstr ""
3088
3089 #: rhodecode/login/views.py:258
3090 msgid "You have successfully registered with RhodeCode"
3091 msgstr ""
3092
3093 #: rhodecode/login/views.py:300
3094 msgid "Password reset has been disabled."
3095 msgstr ""
3096
3097 #: rhodecode/login/views.py:327
3098 msgid "Your password reset link was sent"
3099 msgstr ""
3100
3101 #: rhodecode/login/views.py:351
3102 msgid "Your password reset was successful, a new password has been sent to your email"
3103 msgstr ""
3104
3105 #: rhodecode/model/comment.py:367
3106 msgid "made a comment"
3107 msgstr ""
3108
3109 #: rhodecode/model/comment.py:368
3215 #: rhodecode/model/comment.py:368
3216 msgid "made a comment"
3217 msgstr ""
3218
3219 #: rhodecode/model/comment.py:369
3110 msgid "Show it now"
3220 msgid "Show it now"
3111 msgstr ""
3221 msgstr ""
3112
3222
3113 #: rhodecode/model/db.py:2331
3114 msgid "Password reset enabled"
3115 msgstr ""
3116
3117 #: rhodecode/model/db.py:2332
3118 msgid "Password reset hidden"
3119 msgstr ""
3120
3121 #: rhodecode/model/db.py:2333
3122 msgid "Password reset disabled"
3123 msgstr ""
3124
3125 #: rhodecode/model/forms.py:85
3223 #: rhodecode/model/forms.py:85
3126 msgid "Please enter a login"
3224 msgid "Please enter a login"
3127 msgstr ""
3225 msgstr ""
@@ -3256,9 +3354,9 b' msgstr ""'
3256 #: rhodecode/templates/admin/users/user_add.mako:11
3354 #: rhodecode/templates/admin/users/user_add.mako:11
3257 #: rhodecode/templates/admin/users/user_edit.mako:12
3355 #: rhodecode/templates/admin/users/user_edit.mako:12
3258 #: rhodecode/templates/admin/users/users.mako:13
3356 #: rhodecode/templates/admin/users/users.mako:13
3259 #: rhodecode/templates/admin/users/users.mako:103
3357 #: rhodecode/templates/admin/users/users.mako:75
3260 #: rhodecode/templates/base/base.mako:406
3358 #: rhodecode/templates/base/base.mako:409
3261 #: rhodecode/templates/base/base.mako:413
3359 #: rhodecode/templates/base/base.mako:416
3262 msgid "Admin"
3360 msgid "Admin"
3263 msgstr ""
3361 msgstr ""
3264
3362
@@ -3289,64 +3387,64 b' msgstr ""'
3289 msgid "Disable password recovery"
3387 msgid "Disable password recovery"
3290 msgstr ""
3388 msgstr ""
3291
3389
3292 #: rhodecode/model/pull_request.py:77
3390 #: rhodecode/model/pull_request.py:78
3293 msgid "This pull request can be automatically merged."
3391 msgid "This pull request can be automatically merged."
3294 msgstr ""
3392 msgstr ""
3295
3393
3296 #: rhodecode/model/pull_request.py:79
3394 #: rhodecode/model/pull_request.py:80
3297 msgid "This pull request cannot be merged because of an unhandled exception."
3395 msgid "This pull request cannot be merged because of an unhandled exception."
3298 msgstr ""
3396 msgstr ""
3299
3397
3300 #: rhodecode/model/pull_request.py:82
3398 #: rhodecode/model/pull_request.py:83
3301 msgid "This pull request cannot be merged because of merge conflicts."
3399 msgid "This pull request cannot be merged because of merge conflicts."
3302 msgstr ""
3400 msgstr ""
3303
3401
3304 #: rhodecode/model/pull_request.py:84
3402 #: rhodecode/model/pull_request.py:85
3305 msgid "This pull request could not be merged because push to target failed."
3403 msgid "This pull request could not be merged because push to target failed."
3306 msgstr ""
3404 msgstr ""
3307
3405
3308 #: rhodecode/model/pull_request.py:87
3406 #: rhodecode/model/pull_request.py:88
3309 msgid "This pull request cannot be merged because the target is not a head."
3407 msgid "This pull request cannot be merged because the target is not a head."
3310 msgstr ""
3408 msgstr ""
3311
3409
3312 #: rhodecode/model/pull_request.py:90
3410 #: rhodecode/model/pull_request.py:91
3313 msgid "This pull request cannot be merged because the source contains more branches than the target."
3411 msgid "This pull request cannot be merged because the source contains more branches than the target."
3314 msgstr ""
3412 msgstr ""
3315
3413
3316 #: rhodecode/model/pull_request.py:93
3414 #: rhodecode/model/pull_request.py:94
3317 msgid "This pull request cannot be merged because the target has multiple heads."
3415 msgid "This pull request cannot be merged because the target has multiple heads."
3318 msgstr ""
3416 msgstr ""
3319
3417
3320 #: rhodecode/model/pull_request.py:96
3418 #: rhodecode/model/pull_request.py:97
3321 msgid "This pull request cannot be merged because the target repository is locked."
3419 msgid "This pull request cannot be merged because the target repository is locked."
3322 msgstr ""
3420 msgstr ""
3323
3421
3324 #: rhodecode/model/pull_request.py:99
3422 #: rhodecode/model/pull_request.py:100
3325 msgid "This pull request cannot be merged because the target or the source reference is missing."
3423 msgid "This pull request cannot be merged because the target or the source reference is missing."
3326 msgstr ""
3424 msgstr ""
3327
3425
3328 #: rhodecode/model/pull_request.py:102
3426 #: rhodecode/model/pull_request.py:103
3329 msgid "This pull request cannot be merged because the target reference is missing."
3427 msgid "This pull request cannot be merged because the target reference is missing."
3330 msgstr ""
3428 msgstr ""
3331
3429
3332 #: rhodecode/model/pull_request.py:105
3430 #: rhodecode/model/pull_request.py:106
3333 msgid "This pull request cannot be merged because the source reference is missing."
3431 msgid "This pull request cannot be merged because the source reference is missing."
3334 msgstr ""
3432 msgstr ""
3335
3433
3336 #: rhodecode/model/pull_request.py:108
3434 #: rhodecode/model/pull_request.py:109
3337 msgid "This pull request cannot be merged because of conflicts related to sub repositories."
3435 msgid "This pull request cannot be merged because of conflicts related to sub repositories."
3338 msgstr ""
3436 msgstr ""
3339
3437
3340 #: rhodecode/model/pull_request.py:114
3438 #: rhodecode/model/pull_request.py:115
3341 msgid "Pull request update successful."
3439 msgid "Pull request update successful."
3342 msgstr ""
3440 msgstr ""
3343
3441
3344 #: rhodecode/model/pull_request.py:116
3442 #: rhodecode/model/pull_request.py:117
3345 msgid "Pull request update failed because of an unknown error."
3443 msgid "Pull request update failed because of an unknown error."
3346 msgstr ""
3444 msgstr ""
3347
3445
3348 #: rhodecode/model/pull_request.py:118
3446 #: rhodecode/model/pull_request.py:119
3349 msgid "No update needed because the source reference is already up to date."
3447 msgid "No update needed because the source and target have not changed."
3350 msgstr ""
3448 msgstr ""
3351
3449
3352 #: rhodecode/model/pull_request.py:121
3450 #: rhodecode/model/pull_request.py:121
@@ -3373,51 +3471,51 b' msgstr ""'
3373 msgid "Pull request merged and closed"
3471 msgid "Pull request merged and closed"
3374 msgstr ""
3472 msgstr ""
3375
3473
3376 #: rhodecode/model/pull_request.py:1041
3474 #: rhodecode/model/pull_request.py:1087
3377 msgid "Server-side pull request merging is disabled."
3475 msgid "Server-side pull request merging is disabled."
3378 msgstr ""
3476 msgstr ""
3379
3477
3380 #: rhodecode/model/pull_request.py:1043
3478 #: rhodecode/model/pull_request.py:1089
3381 msgid "This pull request is closed."
3479 msgid "This pull request is closed."
3382 msgstr ""
3480 msgstr ""
3383
3481
3384 #: rhodecode/model/pull_request.py:1055
3482 #: rhodecode/model/pull_request.py:1101
3385 msgid "Pull request merging is not supported."
3483 msgid "Pull request merging is not supported."
3386 msgstr ""
3484 msgstr ""
3387
3485
3388 #: rhodecode/model/pull_request.py:1073
3486 #: rhodecode/model/pull_request.py:1119
3389 msgid "Target repository large files support is disabled."
3487 msgid "Target repository large files support is disabled."
3390 msgstr ""
3488 msgstr ""
3391
3489
3392 #: rhodecode/model/pull_request.py:1076
3490 #: rhodecode/model/pull_request.py:1122
3393 msgid "Source repository large files support is disabled."
3491 msgid "Source repository large files support is disabled."
3394 msgstr ""
3492 msgstr ""
3395
3493
3396 #: rhodecode/model/pull_request.py:1233 rhodecode/model/scm.py:790
3494 #: rhodecode/model/pull_request.py:1279 rhodecode/model/scm.py:790
3397 msgid "Bookmarks"
3495 msgid "Bookmarks"
3398 msgstr ""
3496 msgstr ""
3399
3497
3400 #: rhodecode/model/pull_request.py:1238
3498 #: rhodecode/model/pull_request.py:1284
3401 msgid "Commit IDs"
3499 msgid "Commit IDs"
3402 msgstr ""
3500 msgstr ""
3403
3501
3404 #: rhodecode/model/pull_request.py:1241
3502 #: rhodecode/model/pull_request.py:1287
3405 msgid "Closed Branches"
3503 msgid "Closed Branches"
3406 msgstr ""
3504 msgstr ""
3407
3505
3408 #: rhodecode/model/pull_request.py:1364
3506 #: rhodecode/model/pull_request.py:1411
3409 msgid "User `{}` not allowed to perform merge."
3507 msgid "User `{}` not allowed to perform merge."
3410 msgstr ""
3508 msgstr ""
3411
3509
3412 #: rhodecode/model/pull_request.py:1375
3510 #: rhodecode/model/pull_request.py:1424
3413 msgid "Pull request reviewer approval is pending."
3511 msgid "Pull request reviewer approval is pending."
3414 msgstr ""
3512 msgstr ""
3415
3513
3416 #: rhodecode/model/pull_request.py:1390
3514 #: rhodecode/model/pull_request.py:1439
3417 msgid "Cannot merge, {} TODO still not resolved."
3515 msgid "Cannot merge, {} TODO still not resolved."
3418 msgstr ""
3516 msgstr ""
3419
3517
3420 #: rhodecode/model/pull_request.py:1393
3518 #: rhodecode/model/pull_request.py:1442
3421 msgid "Cannot merge, {} TODOs still not resolved."
3519 msgid "Cannot merge, {} TODOs still not resolved."
3422 msgstr ""
3520 msgstr ""
3423
3521
@@ -3425,30 +3523,30 b' msgstr ""'
3425 msgid "latest tip"
3523 msgid "latest tip"
3426 msgstr ""
3524 msgstr ""
3427
3525
3428 #: rhodecode/model/user.py:125
3526 #: rhodecode/model/user.py:126
3429 msgid "You can't Edit this user since it's crucial for entire application"
3527 msgid "You can't Edit this user since it's crucial for entire application"
3430 msgstr ""
3528 msgstr ""
3431
3529
3432 #: rhodecode/model/user.py:291
3530 #: rhodecode/model/user.py:292
3433 #, python-format
3531 #, python-format
3434 msgid "You can't edit this user (`%(username)s`) since it's crucial for entire application"
3532 msgid "You can't edit this user (`%(username)s`) since it's crucial for entire application"
3435 msgstr ""
3533 msgstr ""
3436
3534
3437 #: rhodecode/model/user.py:464
3535 #: rhodecode/model/user.py:462
3438 msgid "You can't remove this user since it's crucial for entire application"
3536 msgid "You can't remove this user since it's crucial for entire application"
3439 msgstr ""
3537 msgstr ""
3440
3538
3441 #: rhodecode/model/user.py:472
3539 #: rhodecode/model/user.py:470
3442 #, python-format
3540 #, python-format
3443 msgid "user \"%s\" still owns %s repositories and cannot be removed. Switch owners or remove those repositories:%s"
3541 msgid "user \"%s\" still owns %s repositories and cannot be removed. Switch owners or remove those repositories:%s"
3444 msgstr ""
3542 msgstr ""
3445
3543
3446 #: rhodecode/model/user.py:481
3544 #: rhodecode/model/user.py:479
3447 #, python-format
3545 #, python-format
3448 msgid "user \"%s\" still owns %s repository groups and cannot be removed. Switch owners or remove those repository groups:%s"
3546 msgid "user \"%s\" still owns %s repository groups and cannot be removed. Switch owners or remove those repository groups:%s"
3449 msgstr ""
3547 msgstr ""
3450
3548
3451 #: rhodecode/model/user.py:490
3549 #: rhodecode/model/user.py:488
3452 #, python-format
3550 #, python-format
3453 msgid "user \"%s\" still owns %s user groups and cannot be removed. Switch owners or remove those user groups:%s"
3551 msgid "user \"%s\" still owns %s user groups and cannot be removed. Switch owners or remove those user groups:%s"
3454 msgstr ""
3552 msgstr ""
@@ -3767,367 +3865,369 b' msgstr ""'
3767 msgid "New password must be different to old password"
3865 msgid "New password must be different to old password"
3768 msgstr ""
3866 msgstr ""
3769
3867
3770 #: rhodecode/public/js/rhodecode-components.js:31198
3868 #: rhodecode/public/js/rhodecode-components.js:31663
3771 #: rhodecode/public/js/scripts.js:23046
3869 #: rhodecode/public/js/scripts.js:23511
3772 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
3870 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
3773 #: rhodecode/public/js/src/plugins/jquery.autocomplete.js:87
3871 #: rhodecode/public/js/src/plugins/jquery.autocomplete.js:87
3774 msgid "No results"
3872 msgid "No results"
3775 msgstr ""
3873 msgstr ""
3776
3874
3777 #: rhodecode/public/js/rhodecode-components.js:33129
3875 #: rhodecode/public/js/rhodecode-components.js:33594
3778 #: rhodecode/public/js/scripts.js:24977
3876 #: rhodecode/public/js/scripts.js:25442
3779 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:85
3877 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:88
3780 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:109
3878 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:109
3781 msgid "{0} year"
3879 msgid "{0} year"
3782 msgstr ""
3880 msgstr ""
3783
3881
3784 #: rhodecode/public/js/rhodecode-components.js:33130
3882 #: rhodecode/public/js/rhodecode-components.js:33595
3785 #: rhodecode/public/js/scripts.js:24978
3883 #: rhodecode/public/js/scripts.js:25443
3786 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:81
3884 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
3787 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:110
3885 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:110
3788 msgid "{0} month"
3886 msgid "{0} month"
3789 msgstr ""
3887 msgstr ""
3790
3888
3791 #: rhodecode/public/js/rhodecode-components.js:33131
3889 #: rhodecode/public/js/rhodecode-components.js:33596
3792 #: rhodecode/public/js/scripts.js:24979
3890 #: rhodecode/public/js/scripts.js:25444
3793 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:76
3891 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:78
3794 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:111
3892 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:111
3795 msgid "{0} day"
3893 msgid "{0} day"
3796 msgstr ""
3894 msgstr ""
3797
3895
3798 #: rhodecode/public/js/rhodecode-components.js:33132
3896 #: rhodecode/public/js/rhodecode-components.js:33597
3799 #: rhodecode/public/js/scripts.js:24980
3897 #: rhodecode/public/js/scripts.js:25445
3800 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:78
3898 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:80
3801 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:112
3899 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:112
3802 msgid "{0} hour"
3900 msgid "{0} hour"
3803 msgstr ""
3901 msgstr ""
3804
3902
3805 #: rhodecode/public/js/rhodecode-components.js:33133
3903 #: rhodecode/public/js/rhodecode-components.js:33598
3806 #: rhodecode/public/js/scripts.js:24981
3904 #: rhodecode/public/js/scripts.js:25446
3807 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:80
3905 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:82
3808 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:113
3906 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:113
3809 msgid "{0} min"
3907 msgid "{0} min"
3810 msgstr ""
3908 msgstr ""
3811
3909
3812 #: rhodecode/public/js/rhodecode-components.js:33134
3910 #: rhodecode/public/js/rhodecode-components.js:33599
3813 #: rhodecode/public/js/scripts.js:24982
3911 #: rhodecode/public/js/scripts.js:25447
3814 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:84
3912 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:87
3815 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:114
3913 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:114
3816 msgid "{0} sec"
3914 msgid "{0} sec"
3817 msgstr ""
3915 msgstr ""
3818
3916
3819 #: rhodecode/public/js/rhodecode-components.js:33154
3917 #: rhodecode/public/js/rhodecode-components.js:33619
3820 #: rhodecode/public/js/scripts.js:25002
3918 #: rhodecode/public/js/scripts.js:25467
3821 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:62
3919 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:63
3822 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:134
3920 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:134
3823 msgid "in {0}"
3921 msgid "in {0}"
3824 msgstr ""
3922 msgstr ""
3825
3923
3826 #: rhodecode/public/js/rhodecode-components.js:33162
3924 #: rhodecode/public/js/rhodecode-components.js:33627
3827 #: rhodecode/public/js/scripts.js:25010
3925 #: rhodecode/public/js/scripts.js:25475
3828 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:73
3926 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:75
3829 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:142
3927 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:142
3830 msgid "{0} ago"
3928 msgid "{0} ago"
3831 msgstr ""
3929 msgstr ""
3832
3930
3833 #: rhodecode/public/js/rhodecode-components.js:33174
3931 #: rhodecode/public/js/rhodecode-components.js:33639
3834 #: rhodecode/public/js/scripts.js:25022
3932 #: rhodecode/public/js/scripts.js:25487
3835 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:87
3933 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:90
3836 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:154
3934 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:154
3837 msgid "{0}, {1} ago"
3935 msgid "{0}, {1} ago"
3838 msgstr ""
3936 msgstr ""
3839
3937
3840 #: rhodecode/public/js/rhodecode-components.js:33176
3938 #: rhodecode/public/js/rhodecode-components.js:33641
3841 #: rhodecode/public/js/scripts.js:25024
3939 #: rhodecode/public/js/scripts.js:25489
3842 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:64
3940 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:65
3843 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:156
3941 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:156
3844 msgid "in {0}, {1}"
3942 msgid "in {0}, {1}"
3845 msgstr ""
3943 msgstr ""
3846
3944
3847 #: rhodecode/public/js/rhodecode-components.js:33180
3945 #: rhodecode/public/js/rhodecode-components.js:33645
3848 #: rhodecode/public/js/scripts.js:25028
3946 #: rhodecode/public/js/scripts.js:25493
3849 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:74
3947 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:76
3850 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:160
3948 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:160
3851 msgid "{0} and {1}"
3949 msgid "{0} and {1}"
3852 msgstr ""
3950 msgstr ""
3853
3951
3854 #: rhodecode/public/js/rhodecode-components.js:33182
3952 #: rhodecode/public/js/rhodecode-components.js:33647
3855 #: rhodecode/public/js/scripts.js:25030
3953 #: rhodecode/public/js/scripts.js:25495
3856 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:75
3954 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:77
3857 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:162
3955 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:162
3858 msgid "{0} and {1} ago"
3956 msgid "{0} and {1} ago"
3859 msgstr ""
3957 msgstr ""
3860
3958
3861 #: rhodecode/public/js/rhodecode-components.js:33184
3959 #: rhodecode/public/js/rhodecode-components.js:33649
3862 #: rhodecode/public/js/scripts.js:25032
3960 #: rhodecode/public/js/scripts.js:25497
3863 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:63
3961 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:64
3864 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:164
3962 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:164
3865 msgid "in {0} and {1}"
3963 msgid "in {0} and {1}"
3866 msgstr ""
3964 msgstr ""
3867
3965
3868 #: rhodecode/public/js/rhodecode-components.js:47027
3966 #: rhodecode/public/js/rhodecode-components.js:47492
3869 #: rhodecode/public/js/scripts.js:38875
3967 #: rhodecode/public/js/scripts.js:39340
3870 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:14
3968 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:14
3871 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:4
3969 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:4
3872 msgid "Loading more results..."
3970 msgid "Loading more results..."
3873 msgstr ""
3971 msgstr ""
3874
3972
3875 #: rhodecode/public/js/rhodecode-components.js:47030
3973 #: rhodecode/public/js/rhodecode-components.js:47495
3876 #: rhodecode/public/js/scripts.js:38878
3974 #: rhodecode/public/js/scripts.js:39343
3877 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:35
3975 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:36
3878 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:7
3976 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:7
3879 msgid "Searching..."
3977 msgid "Searching..."
3880 msgstr ""
3978 msgstr ""
3881
3979
3882 #: rhodecode/public/js/rhodecode-components.js:47033
3980 #: rhodecode/public/js/rhodecode-components.js:47498
3883 #: rhodecode/public/js/scripts.js:38881
3981 #: rhodecode/public/js/scripts.js:39346
3884 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:18
3982 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:18
3885 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:10
3983 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:10
3886 msgid "No matches found"
3984 msgid "No matches found"
3887 msgstr ""
3985 msgstr ""
3888
3986
3889 #: rhodecode/public/js/rhodecode-components.js:47036
3987 #: rhodecode/public/js/rhodecode-components.js:47501
3890 #: rhodecode/public/js/scripts.js:38884
3988 #: rhodecode/public/js/scripts.js:39349
3891 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:13
3989 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:13
3892 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:13
3990 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:13
3893 msgid "Loading failed"
3991 msgid "Loading failed"
3894 msgstr ""
3992 msgstr ""
3895
3993
3896 #: rhodecode/public/js/rhodecode-components.js:47040
3994 #: rhodecode/public/js/rhodecode-components.js:47505
3897 #: rhodecode/public/js/scripts.js:38888
3995 #: rhodecode/public/js/scripts.js:39353
3898 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:28
3996 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:28
3899 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:17
3997 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:17
3900 msgid "One result is available, press enter to select it."
3998 msgid "One result is available, press enter to select it."
3901 msgstr ""
3999 msgstr ""
3902
4000
3903 #: rhodecode/public/js/rhodecode-components.js:47042
4001 #: rhodecode/public/js/rhodecode-components.js:47507
3904 #: rhodecode/public/js/scripts.js:38890
4002 #: rhodecode/public/js/scripts.js:39355
3905 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
4003 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86
3906 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:19
4004 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:19
3907 msgid "{0} results are available, use up and down arrow keys to navigate."
4005 msgid "{0} results are available, use up and down arrow keys to navigate."
3908 msgstr ""
4006 msgstr ""
3909
4007
3910 #: rhodecode/public/js/rhodecode-components.js:47047
4008 #: rhodecode/public/js/rhodecode-components.js:47512
3911 #: rhodecode/public/js/scripts.js:38895
4009 #: rhodecode/public/js/scripts.js:39360
3912 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:33
4010 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:33
3913 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:24
4011 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:24
3914 msgid "Please enter {0} or more character"
4012 msgid "Please enter {0} or more character"
3915 msgstr ""
4013 msgstr ""
3916
4014
3917 #: rhodecode/public/js/rhodecode-components.js:47049
4015 #: rhodecode/public/js/rhodecode-components.js:47514
3918 #: rhodecode/public/js/scripts.js:38897
4016 #: rhodecode/public/js/scripts.js:39362
3919 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:34
4017 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:34
3920 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:26
4018 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:26
3921 msgid "Please enter {0} or more characters"
4019 msgid "Please enter {0} or more characters"
3922 msgstr ""
4020 msgstr ""
3923
4021
3924 #: rhodecode/public/js/rhodecode-components.js:47054
4022 #: rhodecode/public/js/rhodecode-components.js:47519
3925 #: rhodecode/public/js/scripts.js:38902
4023 #: rhodecode/public/js/scripts.js:39367
3926 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:31
4024 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:31
3927 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:31
4025 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:31
3928 msgid "Please delete {0} character"
4026 msgid "Please delete {0} character"
3929 msgstr ""
4027 msgstr ""
3930
4028
3931 #: rhodecode/public/js/rhodecode-components.js:47056
4029 #: rhodecode/public/js/rhodecode-components.js:47521
3932 #: rhodecode/public/js/scripts.js:38904
4030 #: rhodecode/public/js/scripts.js:39369
3933 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:32
4031 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:32
3934 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:33
4032 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:33
3935 msgid "Please delete {0} characters"
4033 msgid "Please delete {0} characters"
3936 msgstr ""
4034 msgstr ""
3937
4035
3938 #: rhodecode/public/js/rhodecode-components.js:47060
4036 #: rhodecode/public/js/rhodecode-components.js:47525
3939 #: rhodecode/public/js/scripts.js:38908
4037 #: rhodecode/public/js/scripts.js:39373
3940 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:55
4038 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:56
3941 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:37
4039 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:37
3942 msgid "You can only select {0} item"
4040 msgid "You can only select {0} item"
3943 msgstr ""
4041 msgstr ""
3944
4042
3945 #: rhodecode/public/js/rhodecode-components.js:47062
4043 #: rhodecode/public/js/rhodecode-components.js:47527
3946 #: rhodecode/public/js/scripts.js:38910
4044 #: rhodecode/public/js/scripts.js:39375
3947 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:56
4045 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:57
3948 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:39
4046 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:39
3949 msgid "You can only select {0} items"
4047 msgid "You can only select {0} items"
3950 msgstr ""
4048 msgstr ""
3951
4049
3952 #: rhodecode/public/js/rhodecode-components.js:47991
4050 #: rhodecode/public/js/rhodecode-components.js:48456
3953 #: rhodecode/public/js/scripts.js:39839
4051 #: rhodecode/public/js/scripts.js:40304
3954 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:67
4052 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:69
3955 #: rhodecode/public/js/src/rhodecode/changelog.js:35
4053 #: rhodecode/public/js/src/rhodecode/changelog.js:35
3956 msgid "showing {0} out of {1} commit"
4054 msgid "showing {0} out of {1} commit"
3957 msgstr ""
4055 msgstr ""
3958
4056
3959 #: rhodecode/public/js/rhodecode-components.js:47993
4057 #: rhodecode/public/js/rhodecode-components.js:48458
3960 #: rhodecode/public/js/scripts.js:39841
4058 #: rhodecode/public/js/scripts.js:40306
3961 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:68
4059 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:70
3962 #: rhodecode/public/js/src/rhodecode/changelog.js:37
4060 #: rhodecode/public/js/src/rhodecode/changelog.js:37
3963 msgid "showing {0} out of {1} commits"
4061 msgid "showing {0} out of {1} commits"
3964 msgstr ""
4062 msgstr ""
3965
4063
3966 #: rhodecode/public/js/rhodecode-components.js:48426
4064 #: rhodecode/public/js/rhodecode-components.js:48891
3967 #: rhodecode/public/js/scripts.js:40274
4065 #: rhodecode/public/js/scripts.js:40739
3968 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
4066 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:39
3969 #: rhodecode/public/js/src/rhodecode/codemirror.js:296
4067 #: rhodecode/public/js/src/rhodecode/codemirror.js:296
3970 msgid "Set status to Approved"
4068 msgid "Set status to Approved"
3971 msgstr ""
4069 msgstr ""
3972
4070
3973 #: rhodecode/public/js/rhodecode-components.js:48445
4071 #: rhodecode/public/js/rhodecode-components.js:48910
3974 #: rhodecode/public/js/scripts.js:40293
4072 #: rhodecode/public/js/scripts.js:40758
3975 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:39
4073 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
3976 #: rhodecode/public/js/src/rhodecode/codemirror.js:315
4074 #: rhodecode/public/js/src/rhodecode/codemirror.js:315
3977 msgid "Set status to Rejected"
4075 msgid "Set status to Rejected"
3978 msgstr ""
4076 msgstr ""
3979
4077
3980 #: rhodecode/public/js/rhodecode-components.js:48464
4078 #: rhodecode/public/js/rhodecode-components.js:48929
3981 #: rhodecode/public/js/scripts.js:40312
4079 #: rhodecode/public/js/scripts.js:40777
3982 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
4080 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:51
3983 #: rhodecode/public/js/src/rhodecode/codemirror.js:334
4081 #: rhodecode/public/js/src/rhodecode/codemirror.js:334
4082 #: rhodecode/templates/email_templates/commit_comment.mako:99
4083 #: rhodecode/templates/email_templates/pull_request_comment.mako:107
3984 msgid "TODO comment"
4084 msgid "TODO comment"
3985 msgstr ""
4085 msgstr ""
3986
4086
3987 #: rhodecode/public/js/rhodecode-components.js:48484
4087 #: rhodecode/public/js/rhodecode-components.js:48949
3988 #: rhodecode/public/js/scripts.js:40332
4088 #: rhodecode/public/js/scripts.js:40797
3989 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:27
4089 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:27
3990 #: rhodecode/public/js/src/rhodecode/codemirror.js:354
4090 #: rhodecode/public/js/src/rhodecode/codemirror.js:354
3991 msgid "Note Comment"
4091 msgid "Note Comment"
3992 msgstr ""
4092 msgstr ""
3993
4093
3994 #: rhodecode/public/js/rhodecode-components.js:48848
4094 #: rhodecode/public/js/rhodecode-components.js:49315
3995 #: rhodecode/public/js/scripts.js:40696
4095 #: rhodecode/public/js/scripts.js:41163
3996 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:66
4096 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:68
3997 #: rhodecode/public/js/src/rhodecode/comments.js:123
4097 #: rhodecode/public/js/src/rhodecode/comments.js:125
3998 msgid "resolve comment"
4098 msgid "resolve comment"
3999 msgstr ""
4099 msgstr ""
4000
4100
4001 #: rhodecode/public/js/rhodecode-components.js:48927
4101 #: rhodecode/public/js/rhodecode-components.js:49399
4002 #: rhodecode/public/js/scripts.js:40775
4102 #: rhodecode/public/js/scripts.js:41247
4003 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:45
4103 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:46
4004 #: rhodecode/public/js/src/rhodecode/comments.js:202
4104 #: rhodecode/public/js/src/rhodecode/comments.js:209
4005 msgid "Status Review"
4105 msgid "Status Review"
4006 msgstr ""
4106 msgstr ""
4007
4107
4008 #: rhodecode/public/js/rhodecode-components.js:48941
4108 #: rhodecode/public/js/rhodecode-components.js:49414
4009 #: rhodecode/public/js/scripts.js:40789
4109 #: rhodecode/public/js/scripts.js:41262
4010 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:5
4110 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:5
4011 #: rhodecode/public/js/src/rhodecode/comments.js:216
4111 #: rhodecode/public/js/src/rhodecode/comments.js:224
4012 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
4112 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
4013 msgstr ""
4113 msgstr ""
4014
4114
4015 #: rhodecode/public/js/rhodecode-components.js:49089
4115 #: rhodecode/public/js/rhodecode-components.js:49571
4016 #: rhodecode/public/js/scripts.js:40937
4116 #: rhodecode/public/js/scripts.js:41419
4017 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
4117 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
4018 #: rhodecode/public/js/src/rhodecode/comments.js:364
4118 #: rhodecode/public/js/src/rhodecode/comments.js:381
4019 msgid "Submitting..."
4119 msgid "Submitting..."
4020 msgstr ""
4120 msgstr ""
4021
4121
4022 #: rhodecode/public/js/rhodecode-components.js:49140
4122 #: rhodecode/public/js/rhodecode-components.js:49622
4023 #: rhodecode/public/js/scripts.js:40988
4123 #: rhodecode/public/js/scripts.js:41470
4024 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12
4124 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12
4025 #: rhodecode/public/js/src/rhodecode/comments.js:415
4125 #: rhodecode/public/js/src/rhodecode/comments.js:432
4026 #: rhodecode/templates/files/files_browser_tree.mako:51
4126 #: rhodecode/templates/files/files_browser_tree.mako:51
4027 msgid "Loading ..."
4127 msgid "Loading ..."
4028 msgstr ""
4128 msgstr ""
4029
4129
4030 #: rhodecode/public/js/rhodecode-components.js:49245
4130 #: rhodecode/public/js/rhodecode-components.js:49727
4031 #: rhodecode/public/js/scripts.js:41093
4131 #: rhodecode/public/js/scripts.js:41575
4032 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:6
4132 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:6
4033 #: rhodecode/public/js/src/rhodecode/comments.js:520
4133 #: rhodecode/public/js/src/rhodecode/comments.js:537
4034 msgid "Delete this comment?"
4134 msgid "Delete this comment?"
4035 msgstr ""
4135 msgstr ""
4036
4136
4037 #: rhodecode/public/js/rhodecode-components.js:49316
4137 #: rhodecode/public/js/rhodecode-components.js:49798
4038 #: rhodecode/public/js/scripts.js:41164
4138 #: rhodecode/public/js/scripts.js:41646
4039 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:11
4139 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:11
4040 #: rhodecode/public/js/src/rhodecode/comments.js:591
4140 #: rhodecode/public/js/src/rhodecode/comments.js:608
4041 msgid "Leave a comment, or click resolve button to resolve TODO comment #{0}"
4141 msgid "Leave a comment, or click resolve button to resolve TODO comment #{0}"
4042 msgstr ""
4142 msgstr ""
4043
4143
4044 #: rhodecode/public/js/rhodecode-components.js:49393
4144 #: rhodecode/public/js/rhodecode-components.js:49875
4045 #: rhodecode/public/js/scripts.js:41241
4145 #: rhodecode/public/js/scripts.js:41723
4046 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10
4146 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10
4047 #: rhodecode/public/js/src/rhodecode/comments.js:668
4147 #: rhodecode/public/js/src/rhodecode/comments.js:685
4048 msgid "Leave a comment on line {0}."
4148 msgid "Leave a comment on line {0}."
4049 msgstr ""
4149 msgstr ""
4050
4150
4051 #: rhodecode/public/js/rhodecode-components.js:49507
4151 #: rhodecode/public/js/rhodecode-components.js:49989
4052 #: rhodecode/public/js/scripts.js:41355
4152 #: rhodecode/public/js/scripts.js:41837
4053 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:51
4153 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:52
4054 #: rhodecode/public/js/src/rhodecode/comments.js:782
4154 #: rhodecode/public/js/src/rhodecode/comments.js:799
4055 msgid "TODO from comment {0} was fixed."
4155 msgid "TODO from comment {0} was fixed."
4056 msgstr ""
4156 msgstr ""
4057
4157
4058 #: rhodecode/public/js/rhodecode-components.js:49713
4158 #: rhodecode/public/js/rhodecode-components.js:50195
4059 #: rhodecode/public/js/scripts.js:41561
4159 #: rhodecode/public/js/scripts.js:42043
4060 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:70
4160 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72
4061 #: rhodecode/public/js/src/rhodecode/files.js:150
4161 #: rhodecode/public/js/src/rhodecode/files.js:150
4062 msgid "truncated result"
4162 msgid "truncated result"
4063 msgstr ""
4163 msgstr ""
4064
4164
4065 #: rhodecode/public/js/rhodecode-components.js:49715
4165 #: rhodecode/public/js/rhodecode-components.js:50197
4066 #: rhodecode/public/js/scripts.js:41563
4166 #: rhodecode/public/js/scripts.js:42045
4067 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:71
4167 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:73
4068 #: rhodecode/public/js/src/rhodecode/files.js:152
4168 #: rhodecode/public/js/src/rhodecode/files.js:152
4069 msgid "truncated results"
4169 msgid "truncated results"
4070 msgstr ""
4170 msgstr ""
4071
4171
4072 #: rhodecode/public/js/rhodecode-components.js:49724
4172 #: rhodecode/public/js/rhodecode-components.js:50206
4073 #: rhodecode/public/js/scripts.js:41572
4173 #: rhodecode/public/js/scripts.js:42054
4074 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:19
4174 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:19
4075 #: rhodecode/public/js/src/rhodecode/files.js:161
4175 #: rhodecode/public/js/src/rhodecode/files.js:161
4076 msgid "No matching files"
4176 msgid "No matching files"
4077 msgstr ""
4177 msgstr ""
4078
4178
4079 #: rhodecode/public/js/rhodecode-components.js:49859
4179 #: rhodecode/public/js/rhodecode-components.js:50341
4080 #: rhodecode/public/js/scripts.js:41707
4180 #: rhodecode/public/js/scripts.js:42189
4081 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:36
4181 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:37
4082 #: rhodecode/public/js/src/rhodecode/files.js:296
4182 #: rhodecode/public/js/src/rhodecode/files.js:296
4083 msgid "Selection link"
4183 msgid "Selection link"
4084 msgstr ""
4184 msgstr ""
4085
4185
4086 #: rhodecode/public/js/rhodecode-components.js:49899
4186 #: rhodecode/public/js/rhodecode-components.js:50381
4087 #: rhodecode/public/js/scripts.js:41747
4187 #: rhodecode/public/js/scripts.js:42229
4088 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:46
4188 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
4089 #: rhodecode/public/js/src/rhodecode/followers.js:26
4189 #: rhodecode/public/js/src/rhodecode/followers.js:26
4090 msgid "Stop following this repository"
4190 msgid "Stop following this repository"
4091 msgstr ""
4191 msgstr ""
4092
4192
4093 #: rhodecode/public/js/rhodecode-components.js:49900
4193 #: rhodecode/public/js/rhodecode-components.js:50382
4094 #: rhodecode/public/js/scripts.js:41748
4194 #: rhodecode/public/js/scripts.js:42230
4095 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
4195 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
4096 #: rhodecode/public/js/src/rhodecode/followers.js:27
4196 #: rhodecode/public/js/src/rhodecode/followers.js:27
4097 msgid "Unfollow"
4197 msgid "Unfollow"
4098 msgstr ""
4198 msgstr ""
4099
4199
4100 #: rhodecode/public/js/rhodecode-components.js:49909
4200 #: rhodecode/public/js/rhodecode-components.js:50391
4101 #: rhodecode/public/js/scripts.js:41757
4201 #: rhodecode/public/js/scripts.js:42239
4102 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
4202 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:45
4103 #: rhodecode/public/js/src/rhodecode/followers.js:36
4203 #: rhodecode/public/js/src/rhodecode/followers.js:36
4104 msgid "Start following this repository"
4204 msgid "Start following this repository"
4105 msgstr ""
4205 msgstr ""
4106
4206
4107 #: rhodecode/public/js/rhodecode-components.js:49910
4207 #: rhodecode/public/js/rhodecode-components.js:50392
4108 #: rhodecode/public/js/scripts.js:41758
4208 #: rhodecode/public/js/scripts.js:42240
4109 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:8
4209 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:8
4110 #: rhodecode/public/js/src/rhodecode/followers.js:37
4210 #: rhodecode/public/js/src/rhodecode/followers.js:37
4111 msgid "Follow"
4211 msgid "Follow"
4112 msgstr ""
4212 msgstr ""
4113
4213
4114 #: rhodecode/public/js/rhodecode-components.js:50366
4214 #: rhodecode/public/js/rhodecode-components.js:50849
4115 #: rhodecode/public/js/scripts.js:42214
4215 #: rhodecode/public/js/scripts.js:42697
4116 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:57
4216 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:58
4117 #: rhodecode/public/js/src/rhodecode/pullrequests.js:212
4217 #: rhodecode/public/js/src/rhodecode/pullrequests.js:213
4118 msgid "added manually by \"{0}\""
4218 msgid "added manually by \"{0}\""
4119 msgstr ""
4219 msgstr ""
4120
4220
4121 #: rhodecode/public/js/rhodecode-components.js:50937
4221 #: rhodecode/public/js/rhodecode-components.js:51420
4122 #: rhodecode/public/js/scripts.js:42785
4222 #: rhodecode/public/js/scripts.js:43268
4123 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
4223 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:61
4124 #: rhodecode/public/js/src/rhodecode.js:142
4224 #: rhodecode/public/js/src/rhodecode.js:142
4125 msgid "file"
4225 msgid "file"
4126 msgstr ""
4226 msgstr ""
4127
4227
4128 #: rhodecode/public/js/rhodecode-components.js:50957
4228 #: rhodecode/public/js/rhodecode-components.js:51440
4129 #: rhodecode/public/js/scripts.js:42805
4229 #: rhodecode/public/js/scripts.js:43288
4130 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:41
4230 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:42
4131 #: rhodecode/public/js/src/rhodecode.js:162
4231 #: rhodecode/public/js/src/rhodecode.js:162
4132 msgid "Show more"
4232 msgid "Show more"
4133 msgstr ""
4233 msgstr ""
@@ -4137,14 +4237,14 b' msgid "(from usergroup {0})"'
4137 msgstr ""
4237 msgstr ""
4138
4238
4139 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:3
4239 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:3
4140 #: rhodecode/templates/codeblocks/diffs.mako:479
4240 #: rhodecode/templates/codeblocks/diffs.mako:488
4141 #: rhodecode/templates/codeblocks/diffs.mako:484
4241 #: rhodecode/templates/codeblocks/diffs.mako:493
4142 msgid "Add another comment"
4242 msgid "Add another comment"
4143 msgstr ""
4243 msgstr ""
4144
4244
4145 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:4
4245 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:4
4146 #: rhodecode/public/js/src/i18n_messages.js:5
4246 #: rhodecode/public/js/src/i18n_messages.js:5
4147 #: rhodecode/templates/pullrequests/pullrequest_show.mako:320
4247 #: rhodecode/templates/pullrequests/pullrequest_show.mako:325
4148 msgid "Close"
4248 msgid "Close"
4149 msgstr ""
4249 msgstr ""
4150
4250
@@ -4202,80 +4302,101 b' msgstr ""'
4202 msgid "Open new pull request for selected commit"
4302 msgid "Open new pull request for selected commit"
4203 msgstr ""
4303 msgstr ""
4204
4304
4205 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:37
4305 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:35
4306 msgid "Saving..."
4307 msgstr ""
4308
4309 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
4206 #: rhodecode/public/js/src/i18n_messages.js:6
4310 #: rhodecode/public/js/src/i18n_messages.js:6
4207 #: rhodecode/templates/admin/settings/settings_email.mako:48
4311 #: rhodecode/templates/admin/settings/settings_email.mako:48
4208 msgid "Send"
4312 msgid "Send"
4209 msgstr ""
4313 msgstr ""
4210
4314
4211 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
4315 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:41
4212 msgid "Show at Commit "
4316 msgid "Show at Commit "
4213 msgstr ""
4317 msgstr ""
4214
4318
4215 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:42
4216 msgid "Show selected commit __S"
4217 msgstr ""
4218
4219 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:43
4319 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:43
4320 msgid "Show selected commit __S"
4321 msgstr ""
4322
4323 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
4220 msgid "Show selected commits __S ... __E"
4324 msgid "Show selected commits __S ... __E"
4221 msgstr ""
4325 msgstr ""
4222
4326
4223 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
4224 #: rhodecode/public/js/src/i18n_messages.js:7
4225 msgid "Switch to chat"
4226 msgstr ""
4227
4228 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49
4327 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49
4328 #: rhodecode/public/js/src/i18n_messages.js:7
4329 msgid "Switch to chat"
4330 msgstr ""
4331
4332 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
4229 #: rhodecode/public/js/src/i18n_messages.js:8
4333 #: rhodecode/public/js/src/i18n_messages.js:8
4230 msgid "Switch to comment"
4334 msgid "Switch to comment"
4231 msgstr ""
4335 msgstr ""
4232
4336
4233 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:52
4337 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
4234 msgid "There are currently no open pull requests requiring your participation."
4338 msgid "There are currently no open pull requests requiring your participation."
4235 msgstr ""
4339 msgstr ""
4236
4340
4237 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
4341 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:55
4238 msgid "Updating..."
4342 msgid "Updating..."
4239 msgstr ""
4343 msgstr ""
4240
4344
4241 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:58
4242 #: rhodecode/templates/admin/auth/auth_settings.mako:71
4243 msgid "disabled"
4244 msgstr ""
4245
4246 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:59
4345 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:59
4247 #: rhodecode/templates/admin/auth/auth_settings.mako:71
4346 #: rhodecode/templates/admin/auth/auth_settings.mako:71
4347 msgid "disabled"
4348 msgstr ""
4349
4350 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
4351 #: rhodecode/templates/admin/auth/auth_settings.mako:71
4248 msgid "enabled"
4352 msgid "enabled"
4249 msgstr ""
4353 msgstr ""
4250
4354
4251 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:61
4355 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:62
4252 msgid "files"
4356 msgid "files"
4253 msgstr ""
4357 msgstr ""
4254
4358
4255 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:69
4359 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:67
4360 #: rhodecode/templates/pullrequests/pullrequest.mako:108
4361 msgid "loading..."
4362 msgstr ""
4363
4364 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:71
4256 msgid "specify commit"
4365 msgid "specify commit"
4257 msgstr ""
4366 msgstr ""
4258
4367
4259 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72
4368 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:74
4260 msgid "{0} active out of {1} users"
4369 msgid "{0} active out of {1} users"
4261 msgstr ""
4370 msgstr ""
4262
4371
4263 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:77
4264 msgid "{0} days"
4265 msgstr ""
4266
4267 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:79
4372 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:79
4373 msgid "{0} days"
4374 msgstr ""
4375
4376 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:81
4268 msgid "{0} hours"
4377 msgid "{0} hours"
4269 msgstr ""
4378 msgstr ""
4270
4379
4271 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:82
4380 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:84
4272 msgid "{0} months"
4381 msgid "{0} months"
4273 msgstr ""
4382 msgstr ""
4274
4383
4275 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86
4384 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:85
4385 msgid "{0} out of {1} users"
4386 msgstr ""
4387
4388 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:89
4276 msgid "{0} years"
4389 msgid "{0} years"
4277 msgstr ""
4390 msgstr ""
4278
4391
4392 #: rhodecode/public/js/src/math_jax/extensions/HelpDialog.js:19
4393 msgid "HelpDialog"
4394 msgstr ""
4395
4396 #: rhodecode/public/js/src/math_jax/jax/output/HTML-CSS/autoload/mglyph.js:19
4397 msgid "MathML"
4398 msgstr ""
4399
4279 #: rhodecode/public/js/vendors/webcomponentsjs/webcomponents.min.js:11
4400 #: rhodecode/public/js/vendors/webcomponentsjs/webcomponents.min.js:11
4280 msgid "UIEvent"
4401 msgid "UIEvent"
4281 msgstr ""
4402 msgstr ""
@@ -4292,10 +4413,6 b' msgstr ""'
4292 msgid "FocusEvent"
4413 msgid "FocusEvent"
4293 msgstr ""
4414 msgstr ""
4294
4415
4295 #: rhodecode/svn_support/events.py:30
4296 msgid "Configuration for Apaache mad_dav_svn changed."
4297 msgstr ""
4298
4299 #: rhodecode/templates/index.mako:5
4416 #: rhodecode/templates/index.mako:5
4300 msgid "Dashboard"
4417 msgid "Dashboard"
4301 msgstr ""
4418 msgstr ""
@@ -4353,6 +4470,7 b' msgstr ""'
4353 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:15
4470 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:15
4354 #: rhodecode/templates/admin/repos/repos.mako:54
4471 #: rhodecode/templates/admin/repos/repos.mako:54
4355 #: rhodecode/templates/admin/user_groups/user_groups.mako:55
4472 #: rhodecode/templates/admin/user_groups/user_groups.mako:55
4473 #: rhodecode/templates/admin/users/user_edit_groups.mako:54
4356 #: rhodecode/templates/base/perms_summary.mako:102
4474 #: rhodecode/templates/base/perms_summary.mako:102
4357 #: rhodecode/templates/bookmarks/bookmarks.mako:59
4475 #: rhodecode/templates/bookmarks/bookmarks.mako:59
4358 #: rhodecode/templates/branches/branches.mako:58
4476 #: rhodecode/templates/branches/branches.mako:58
@@ -4365,22 +4483,25 b' msgstr ""'
4365 #: rhodecode/templates/index_base.mako:100
4483 #: rhodecode/templates/index_base.mako:100
4366 #: rhodecode/templates/index_base.mako:125
4484 #: rhodecode/templates/index_base.mako:125
4367 #: rhodecode/templates/admin/gists/index.mako:114
4485 #: rhodecode/templates/admin/gists/index.mako:114
4368 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:81
4486 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:15
4487 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:71
4369 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:45
4488 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:45
4370 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:42
4489 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:42
4371 #: rhodecode/templates/admin/repo_groups/repo_groups.mako:56
4490 #: rhodecode/templates/admin/repo_groups/repo_groups.mako:56
4372 #: rhodecode/templates/admin/repos/repo_add_base.mako:32
4491 #: rhodecode/templates/admin/repos/repo_add_base.mako:43
4373 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:29
4492 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:29
4374 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:98
4493 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:98
4375 #: rhodecode/templates/admin/repos/repos.mako:57
4494 #: rhodecode/templates/admin/repos/repos.mako:57
4376 #: rhodecode/templates/admin/user_groups/user_group_add.mako:43
4495 #: rhodecode/templates/admin/user_groups/user_group_add.mako:43
4377 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:42
4496 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:42
4378 #: rhodecode/templates/admin/user_groups/user_groups.mako:57
4497 #: rhodecode/templates/admin/user_groups/user_groups.mako:57
4379 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:78
4498 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:15
4499 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:67
4500 #: rhodecode/templates/admin/users/user_edit_groups.mako:59
4380 #: rhodecode/templates/base/issue_tracker_settings.mako:10
4501 #: rhodecode/templates/base/issue_tracker_settings.mako:10
4381 #: rhodecode/templates/changeset/changeset.mako:53
4502 #: rhodecode/templates/changeset/changeset.mako:53
4382 #: rhodecode/templates/compare/compare_commits.mako:20
4503 #: rhodecode/templates/compare/compare_commits.mako:20
4383 #: rhodecode/templates/email_templates/commit_comment.mako:82
4504 #: rhodecode/templates/email_templates/commit_comment.mako:89
4384 #: rhodecode/templates/email_templates/pull_request_review.mako:41
4505 #: rhodecode/templates/email_templates/pull_request_review.mako:41
4385 #: rhodecode/templates/email_templates/pull_request_review.mako:75
4506 #: rhodecode/templates/email_templates/pull_request_review.mako:75
4386 #: rhodecode/templates/files/file_tree_detail.mako:5
4507 #: rhodecode/templates/files/file_tree_detail.mako:5
@@ -4388,8 +4509,8 b' msgstr ""'
4388 #: rhodecode/templates/forks/fork.mako:48
4509 #: rhodecode/templates/forks/fork.mako:48
4389 #: rhodecode/templates/forks/forks_data.mako:9
4510 #: rhodecode/templates/forks/forks_data.mako:9
4390 #: rhodecode/templates/pullrequests/pullrequest.mako:47
4511 #: rhodecode/templates/pullrequests/pullrequest.mako:47
4391 #: rhodecode/templates/pullrequests/pullrequest_show.mako:158
4512 #: rhodecode/templates/pullrequests/pullrequest_show.mako:163
4392 #: rhodecode/templates/pullrequests/pullrequest_show.mako:455
4513 #: rhodecode/templates/pullrequests/pullrequest_show.mako:460
4393 #: rhodecode/templates/summary/components.mako:73
4514 #: rhodecode/templates/summary/components.mako:73
4394 msgid "Description"
4515 msgid "Description"
4395 msgstr ""
4516 msgstr ""
@@ -4404,7 +4525,8 b' msgstr ""'
4404 #: rhodecode/templates/admin/repos/repos.mako:65
4525 #: rhodecode/templates/admin/repos/repos.mako:65
4405 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:5
4526 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:5
4406 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:24
4527 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:24
4407 #: rhodecode/templates/admin/user_groups/user_groups.mako:64
4528 #: rhodecode/templates/admin/user_groups/user_groups.mako:66
4529 #: rhodecode/templates/admin/users/user_edit_groups.mako:65
4408 #: rhodecode/templates/forks/forks_data.mako:7
4530 #: rhodecode/templates/forks/forks_data.mako:7
4409 #: rhodecode/templates/summary/components.mako:195
4531 #: rhodecode/templates/summary/components.mako:195
4410 msgid "Owner"
4532 msgid "Owner"
@@ -4425,9 +4547,9 b' msgstr ""'
4425 #: rhodecode/templates/changelog/changelog_summary_data.mako:8
4547 #: rhodecode/templates/changelog/changelog_summary_data.mako:8
4426 #: rhodecode/templates/changeset/changeset.mako:36
4548 #: rhodecode/templates/changeset/changeset.mako:36
4427 #: rhodecode/templates/compare/compare_commits.mako:18
4549 #: rhodecode/templates/compare/compare_commits.mako:18
4428 #: rhodecode/templates/email_templates/commit_comment.mako:45
4550 #: rhodecode/templates/email_templates/commit_comment.mako:49
4429 #: rhodecode/templates/email_templates/commit_comment.mako:81
4551 #: rhodecode/templates/email_templates/commit_comment.mako:88
4430 #: rhodecode/templates/pullrequests/pullrequest_show.mako:453
4552 #: rhodecode/templates/pullrequests/pullrequest_show.mako:458
4431 #: rhodecode/templates/search/search_commit.mako:6
4553 #: rhodecode/templates/search/search_commit.mako:6
4432 #: rhodecode/templates/tags/tags.mako:66
4554 #: rhodecode/templates/tags/tags.mako:66
4433 msgid "Commit"
4555 msgid "Commit"
@@ -4442,41 +4564,41 b' msgstr ""'
4442 msgid "Home"
4564 msgid "Home"
4443 msgstr ""
4565 msgstr ""
4444
4566
4445 #: rhodecode/templates/login.mako:5 rhodecode/templates/login.mako:34
4567 #: rhodecode/templates/login.mako:5 rhodecode/templates/login.mako:35
4446 #: rhodecode/templates/login.mako:75 rhodecode/templates/base/base.mako:326
4568 #: rhodecode/templates/login.mako:75 rhodecode/templates/base/base.mako:329
4447 #: rhodecode/templates/debug_style/login.html:60
4569 #: rhodecode/templates/debug_style/login.html:60
4448 msgid "Sign In"
4570 msgid "Sign In"
4449 msgstr ""
4571 msgstr ""
4450
4572
4451 #: rhodecode/templates/login.mako:36
4573 #: rhodecode/templates/login.mako:37
4452 msgid "Go to the registration page to create a new account."
4574 msgid "Go to the registration page to create a new account."
4453 msgstr ""
4575 msgstr ""
4454
4576
4455 #: rhodecode/templates/login.mako:57
4577 #: rhodecode/templates/login.mako:58
4456 msgid "Remember me"
4578 msgid "Remember me"
4457 msgstr ""
4579 msgstr ""
4458
4580
4459 #: rhodecode/templates/login.mako:61
4581 #: rhodecode/templates/login.mako:62
4460 msgid "Forgot your password?"
4582 msgid "Forgot your password?"
4461 msgstr ""
4583 msgstr ""
4462
4584
4463 #: rhodecode/templates/login.mako:65 rhodecode/templates/password_reset.mako:34
4585 #: rhodecode/templates/login.mako:66 rhodecode/templates/password_reset.mako:35
4464 msgid "Password reset is disabled. Please contact "
4586 msgid "Password reset is disabled. Please contact "
4465 msgstr ""
4587 msgstr ""
4466
4588
4467 #: rhodecode/templates/login.mako:67 rhodecode/templates/password_reset.mako:36
4468 #: rhodecode/templates/base/base.mako:43
4469 #: rhodecode/templates/errors/error_document.mako:64
4470 msgid "Support"
4471 msgstr ""
4472
4473 #: rhodecode/templates/login.mako:68 rhodecode/templates/password_reset.mako:37
4589 #: rhodecode/templates/login.mako:68 rhodecode/templates/password_reset.mako:37
4590 #: rhodecode/templates/base/base.mako:46
4591 #: rhodecode/templates/errors/error_document.mako:64
4592 msgid "Support"
4593 msgstr ""
4594
4595 #: rhodecode/templates/login.mako:69 rhodecode/templates/password_reset.mako:38
4474 #: rhodecode/templates/files/files_add.mako:54
4596 #: rhodecode/templates/files/files_add.mako:54
4475 #: rhodecode/templates/files/files_add.mako:65
4597 #: rhodecode/templates/files/files_add.mako:65
4476 msgid "or"
4598 msgid "or"
4477 msgstr ""
4599 msgstr ""
4478
4600
4479 #: rhodecode/templates/login.mako:70 rhodecode/templates/password_reset.mako:39
4601 #: rhodecode/templates/login.mako:71 rhodecode/templates/password_reset.mako:40
4480 msgid "an administrator if you need help."
4602 msgid "an administrator if you need help."
4481 msgstr ""
4603 msgstr ""
4482
4604
@@ -4484,28 +4606,28 b' msgstr ""'
4484 msgid "Reset Password"
4606 msgid "Reset Password"
4485 msgstr ""
4607 msgstr ""
4486
4608
4487 #: rhodecode/templates/password_reset.mako:46
4609 #: rhodecode/templates/password_reset.mako:47
4488 msgid "Reset your Password"
4610 msgid "Reset your Password"
4489 msgstr ""
4611 msgstr ""
4490
4612
4491 #: rhodecode/templates/password_reset.mako:47
4613 #: rhodecode/templates/password_reset.mako:48
4492 msgid "Go to the login page to sign in."
4614 msgid "Go to the login page to sign in."
4493 msgstr ""
4615 msgstr ""
4494
4616
4495 #: rhodecode/templates/password_reset.mako:51
4617 #: rhodecode/templates/password_reset.mako:52
4496 msgid "Email Address"
4618 msgid "Email Address"
4497 msgstr ""
4619 msgstr ""
4498
4620
4499 #: rhodecode/templates/password_reset.mako:60
4621 #: rhodecode/templates/password_reset.mako:61
4500 #: rhodecode/templates/register.mako:84
4622 #: rhodecode/templates/register.mako:85
4501 msgid "Captcha"
4623 msgid "Captcha"
4502 msgstr ""
4624 msgstr ""
4503
4625
4504 #: rhodecode/templates/password_reset.mako:70
4505 msgid "Send password reset email"
4506 msgstr ""
4507
4508 #: rhodecode/templates/password_reset.mako:71
4626 #: rhodecode/templates/password_reset.mako:71
4627 msgid "Send password reset email"
4628 msgstr ""
4629
4630 #: rhodecode/templates/password_reset.mako:72
4509 msgid "Password reset link will be sent to matching email address"
4631 msgid "Password reset link will be sent to matching email address"
4510 msgstr ""
4632 msgstr ""
4511
4633
@@ -4513,49 +4635,49 b' msgstr ""'
4513 msgid "Create an Account"
4635 msgid "Create an Account"
4514 msgstr ""
4636 msgstr ""
4515
4637
4516 #: rhodecode/templates/register.mako:34
4638 #: rhodecode/templates/register.mako:35
4517 msgid "Create an account"
4639 msgid "Create an account"
4518 msgstr ""
4640 msgstr ""
4519
4641
4520 #: rhodecode/templates/register.mako:35
4642 #: rhodecode/templates/register.mako:36
4521 msgid "Go to the login page to sign in with an existing account."
4643 msgid "Go to the login page to sign in with an existing account."
4522 msgstr ""
4644 msgstr ""
4523
4645
4524 #: rhodecode/templates/register.mako:54
4646 #: rhodecode/templates/register.mako:55
4525 msgid "Re-enter password"
4647 msgid "Re-enter password"
4526 msgstr ""
4648 msgstr ""
4527
4649
4528 #: rhodecode/templates/register.mako:61
4650 #: rhodecode/templates/register.mako:62
4529 #: rhodecode/templates/admin/my_account/my_account_profile.mako:32
4651 #: rhodecode/templates/admin/my_account/my_account_profile.mako:32
4530 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:33
4652 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:33
4531 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:79
4653 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:79
4532 #: rhodecode/templates/admin/users/user_add.mako:68
4654 #: rhodecode/templates/admin/users/user_add.mako:68
4533 #: rhodecode/templates/admin/users/user_edit_profile.mako:47
4655 #: rhodecode/templates/admin/users/user_edit_profile.mako:47
4534 #: rhodecode/templates/admin/users/users.mako:94
4656 #: rhodecode/templates/admin/users/users.mako:66
4535 msgid "First Name"
4657 msgid "First Name"
4536 msgstr ""
4658 msgstr ""
4537
4659
4538 #: rhodecode/templates/register.mako:68
4660 #: rhodecode/templates/register.mako:69
4539 #: rhodecode/templates/admin/my_account/my_account_profile.mako:40
4661 #: rhodecode/templates/admin/my_account/my_account_profile.mako:40
4540 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:42
4662 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:42
4541 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:88
4663 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:88
4542 #: rhodecode/templates/admin/users/user_add.mako:77
4664 #: rhodecode/templates/admin/users/user_add.mako:77
4543 #: rhodecode/templates/admin/users/user_edit_profile.mako:56
4665 #: rhodecode/templates/admin/users/user_edit_profile.mako:56
4544 #: rhodecode/templates/admin/users/users.mako:96
4666 #: rhodecode/templates/admin/users/users.mako:68
4545 msgid "Last Name"
4667 msgid "Last Name"
4546 msgstr ""
4668 msgstr ""
4547
4669
4548 #: rhodecode/templates/register.mako:96
4670 #: rhodecode/templates/register.mako:97
4549 msgid "Account activation requires admin approval."
4671 msgid "Account activation requires admin approval."
4550 msgstr ""
4672 msgstr ""
4551
4673
4552 #: rhodecode/templates/register.mako:103
4674 #: rhodecode/templates/register.mako:104
4553 msgid "Create Account"
4675 msgid "Create Account"
4554 msgstr ""
4676 msgstr ""
4555
4677
4556 #: rhodecode/templates/admin/admin.mako:5
4678 #: rhodecode/templates/admin/admin.mako:5
4557 #: rhodecode/templates/admin/admin.mako:15
4679 #: rhodecode/templates/admin/admin.mako:15
4558 #: rhodecode/templates/base/base.mako:72
4680 #: rhodecode/templates/base/base.mako:75
4559 msgid "Admin journal"
4681 msgid "Admin journal"
4560 msgstr ""
4682 msgstr ""
4561
4683
@@ -4564,6 +4686,7 b' msgid "journal filter..."'
4564 msgstr ""
4686 msgstr ""
4565
4687
4566 #: rhodecode/templates/admin/admin.mako:14
4688 #: rhodecode/templates/admin/admin.mako:14
4689 #: rhodecode/templates/admin/users/user_edit_audit.mako:15
4567 msgid "filter"
4690 msgid "filter"
4568 msgstr ""
4691 msgstr ""
4569
4692
@@ -4576,31 +4699,38 b' msgstr[0] ""'
4576 msgstr[1] ""
4699 msgstr[1] ""
4577
4700
4578 #: rhodecode/templates/admin/admin.mako:17
4701 #: rhodecode/templates/admin/admin.mako:17
4702 #: rhodecode/templates/admin/users/user_edit_audit.mako:17
4579 #: rhodecode/templates/journal/journal.mako:17
4703 #: rhodecode/templates/journal/journal.mako:17
4580 msgid "Example Queries"
4704 msgid "Example Queries"
4581 msgstr ""
4705 msgstr ""
4582
4706
4583 #: rhodecode/templates/admin/admin_log.mako:8
4707 #: rhodecode/templates/admin/admin_log.mako:8
4708 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:18
4584 #: rhodecode/templates/admin/my_account/my_account_repos.mako:37
4709 #: rhodecode/templates/admin/my_account/my_account_repos.mako:37
4585 #: rhodecode/templates/admin/repo_groups/repo_groups.mako:62
4710 #: rhodecode/templates/admin/repo_groups/repo_groups.mako:62
4586 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:13
4711 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:13
4587 #: rhodecode/templates/admin/repos/repos.mako:69
4712 #: rhodecode/templates/admin/repos/repos.mako:69
4588 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:71
4713 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:71
4589 #: rhodecode/templates/admin/user_groups/user_groups.mako:66
4714 #: rhodecode/templates/admin/user_groups/user_groups.mako:68
4590 #: rhodecode/templates/admin/users/users.mako:107
4715 #: rhodecode/templates/admin/users/user_edit_audit.mako:23
4591 #: rhodecode/templates/files/files_detail.mako:63
4716 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:18
4717 #: rhodecode/templates/admin/users/user_edit_groups.mako:73
4718 #: rhodecode/templates/admin/users/users.mako:79
4719 #: rhodecode/templates/files/files_detail.mako:58
4592 msgid "Action"
4720 msgid "Action"
4593 msgstr ""
4721 msgstr ""
4594
4722
4595 #: rhodecode/templates/admin/admin_log.mako:9
4723 #: rhodecode/templates/admin/admin_log.mako:9
4596 #: rhodecode/templates/admin/defaults/defaults.mako:31
4724 #: rhodecode/templates/admin/defaults/defaults.mako:31
4597 #: rhodecode/templates/admin/permissions/permissions_objects.mako:13
4725 #: rhodecode/templates/admin/permissions/permissions_objects.mako:13
4726 #: rhodecode/templates/admin/users/user_edit_audit.mako:24
4598 #: rhodecode/templates/search/search_commit.mako:5
4727 #: rhodecode/templates/search/search_commit.mako:5
4599 #: rhodecode/templates/search/search_path.mako:3
4728 #: rhodecode/templates/search/search_path.mako:3
4600 msgid "Repository"
4729 msgid "Repository"
4601 msgstr ""
4730 msgstr ""
4602
4731
4603 #: rhodecode/templates/admin/admin_log.mako:10
4732 #: rhodecode/templates/admin/admin_log.mako:10
4733 #: rhodecode/templates/admin/users/user_edit_audit.mako:25
4604 #: rhodecode/templates/bookmarks/bookmarks.mako:61
4734 #: rhodecode/templates/bookmarks/bookmarks.mako:61
4605 #: rhodecode/templates/branches/branches.mako:60
4735 #: rhodecode/templates/branches/branches.mako:60
4606 #: rhodecode/templates/tags/tags.mako:61
4736 #: rhodecode/templates/tags/tags.mako:61
@@ -4608,10 +4738,12 b' msgid "Date"'
4608 msgstr ""
4738 msgstr ""
4609
4739
4610 #: rhodecode/templates/admin/admin_log.mako:11
4740 #: rhodecode/templates/admin/admin_log.mako:11
4741 #: rhodecode/templates/admin/users/user_edit_audit.mako:26
4611 msgid "From IP"
4742 msgid "From IP"
4612 msgstr ""
4743 msgstr ""
4613
4744
4614 #: rhodecode/templates/admin/admin_log.mako:46
4745 #: rhodecode/templates/admin/admin_log.mako:46
4746 #: rhodecode/templates/admin/users/user_edit_audit.mako:61
4615 msgid "No actions yet"
4747 msgid "No actions yet"
4616 msgstr ""
4748 msgstr ""
4617
4749
@@ -4650,7 +4782,7 b' msgstr ""'
4650 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:72
4782 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:72
4651 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:135
4783 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:135
4652 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:67
4784 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:67
4653 #: rhodecode/templates/admin/repos/repo_add_base.mako:90
4785 #: rhodecode/templates/admin/repos/repo_add_base.mako:101
4654 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:79
4786 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:79
4655 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:110
4787 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:110
4656 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:160
4788 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:160
@@ -4660,6 +4792,7 b' msgstr ""'
4660 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:120
4792 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:120
4661 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:102
4793 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:102
4662 #: rhodecode/templates/admin/users/user_add.mako:128
4794 #: rhodecode/templates/admin/users/user_add.mako:128
4795 #: rhodecode/templates/admin/users/user_edit_groups.mako:27
4663 #: rhodecode/templates/admin/users/user_edit_profile.mako:134
4796 #: rhodecode/templates/admin/users/user_edit_profile.mako:134
4664 #: rhodecode/templates/base/default_perms_box.mako:88
4797 #: rhodecode/templates/base/default_perms_box.mako:88
4665 msgid "Save"
4798 msgid "Save"
@@ -4681,18 +4814,18 b' msgstr ""'
4681 #: rhodecode/templates/admin/defaults/defaults_repositories.mako:14
4814 #: rhodecode/templates/admin/defaults/defaults_repositories.mako:14
4682 #: rhodecode/templates/admin/gists/index.mako:110
4815 #: rhodecode/templates/admin/gists/index.mako:110
4683 #: rhodecode/templates/admin/integrations/list.mako:103
4816 #: rhodecode/templates/admin/integrations/list.mako:103
4684 #: rhodecode/templates/admin/repos/repo_add_base.mako:64
4817 #: rhodecode/templates/admin/repos/repo_add_base.mako:75
4685 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:12
4818 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:12
4686 msgid "Type"
4819 msgid "Type"
4687 msgstr ""
4820 msgstr ""
4688
4821
4689 #: rhodecode/templates/admin/defaults/defaults_repositories.mako:23
4822 #: rhodecode/templates/admin/defaults/defaults_repositories.mako:23
4690 #: rhodecode/templates/admin/repos/repo_add_base.mako:82
4823 #: rhodecode/templates/admin/repos/repo_add_base.mako:93
4691 msgid "Private Repository"
4824 msgid "Private Repository"
4692 msgstr ""
4825 msgstr ""
4693
4826
4694 #: rhodecode/templates/admin/defaults/defaults_repositories.mako:27
4827 #: rhodecode/templates/admin/defaults/defaults_repositories.mako:27
4695 #: rhodecode/templates/admin/repos/repo_add_base.mako:86
4828 #: rhodecode/templates/admin/repos/repo_add_base.mako:97
4696 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:112
4829 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:112
4697 #: rhodecode/templates/forks/fork.mako:87
4830 #: rhodecode/templates/forks/fork.mako:87
4698 msgid "Private repositories are only visible to people explicitly added as collaborators."
4831 msgid "Private repositories are only visible to people explicitly added as collaborators."
@@ -4754,7 +4887,7 b' msgid "Update Gist"'
4754 msgstr ""
4887 msgstr ""
4755
4888
4756 #: rhodecode/templates/admin/gists/edit.mako:102
4889 #: rhodecode/templates/admin/gists/edit.mako:102
4757 #: rhodecode/templates/base/issue_tracker_settings.mako:74
4890 #: rhodecode/templates/base/issue_tracker_settings.mako:73
4758 #: rhodecode/templates/changeset/changeset_file_comment.mako:385
4891 #: rhodecode/templates/changeset/changeset_file_comment.mako:385
4759 #: rhodecode/templates/codeblocks/diffs.mako:76
4892 #: rhodecode/templates/codeblocks/diffs.mako:76
4760 #: rhodecode/templates/files/files_add.mako:102
4893 #: rhodecode/templates/files/files_add.mako:102
@@ -4828,8 +4961,8 b' msgstr ""'
4828 #: rhodecode/templates/changeset/changeset.mako:180
4961 #: rhodecode/templates/changeset/changeset.mako:180
4829 #: rhodecode/templates/compare/compare_commits.mako:17
4962 #: rhodecode/templates/compare/compare_commits.mako:17
4830 #: rhodecode/templates/files/files_browser_tree.mako:9
4963 #: rhodecode/templates/files/files_browser_tree.mako:9
4831 #: rhodecode/templates/pullrequests/pullrequest_show.mako:304
4964 #: rhodecode/templates/pullrequests/pullrequest_show.mako:309
4832 #: rhodecode/templates/pullrequests/pullrequest_show.mako:452
4965 #: rhodecode/templates/pullrequests/pullrequest_show.mako:457
4833 #: rhodecode/templates/pullrequests/pullrequests.mako:102
4966 #: rhodecode/templates/pullrequests/pullrequests.mako:102
4834 #: rhodecode/templates/search/search_commit.mako:16
4967 #: rhodecode/templates/search/search_commit.mako:16
4835 #: rhodecode/templates/tags/tags.mako:63
4968 #: rhodecode/templates/tags/tags.mako:63
@@ -4886,7 +5019,7 b' msgstr ""'
4886 #: rhodecode/templates/admin/gists/show.mako:56
5019 #: rhodecode/templates/admin/gists/show.mako:56
4887 #: rhodecode/templates/admin/integrations/list.mako:204
5020 #: rhodecode/templates/admin/integrations/list.mako:204
4888 #: rhodecode/templates/admin/my_account/my_account_profile.mako:5
5021 #: rhodecode/templates/admin/my_account/my_account_profile.mako:5
4889 #: rhodecode/templates/base/issue_tracker_settings.mako:61
5022 #: rhodecode/templates/base/issue_tracker_settings.mako:60
4890 #: rhodecode/templates/data_table/_dt_elements.mako:118
5023 #: rhodecode/templates/data_table/_dt_elements.mako:118
4891 #: rhodecode/templates/data_table/_dt_elements.mako:180
5024 #: rhodecode/templates/data_table/_dt_elements.mako:180
4892 #: rhodecode/templates/data_table/_dt_elements.mako:193
5025 #: rhodecode/templates/data_table/_dt_elements.mako:193
@@ -4894,10 +5027,10 b' msgstr ""'
4894 #: rhodecode/templates/debug_style/buttons.html:128
5027 #: rhodecode/templates/debug_style/buttons.html:128
4895 #: rhodecode/templates/files/files_add.mako:204
5028 #: rhodecode/templates/files/files_add.mako:204
4896 #: rhodecode/templates/files/files_edit.mako:165
5029 #: rhodecode/templates/files/files_edit.mako:165
4897 #: rhodecode/templates/files/files_source.mako:38
5030 #: rhodecode/templates/files/files_source.mako:48
4898 #: rhodecode/templates/files/files_source.mako:41
5031 #: rhodecode/templates/files/files_source.mako:51
4899 #: rhodecode/templates/pullrequests/pullrequest_show.mako:63
5032 #: rhodecode/templates/pullrequests/pullrequest_show.mako:63
4900 #: rhodecode/templates/pullrequests/pullrequest_show.mako:319
5033 #: rhodecode/templates/pullrequests/pullrequest_show.mako:324
4901 #: rhodecode/templates/users/user_profile.mako:7
5034 #: rhodecode/templates/users/user_profile.mako:7
4902 msgid "Edit"
5035 msgid "Edit"
4903 msgstr ""
5036 msgstr ""
@@ -4916,7 +5049,7 b' msgstr ""'
4916
5049
4917 #: rhodecode/templates/admin/gists/show.mako:91
5050 #: rhodecode/templates/admin/gists/show.mako:91
4918 #: rhodecode/templates/files/files_delete.mako:50
5051 #: rhodecode/templates/files/files_delete.mako:50
4919 #: rhodecode/templates/files/files_source.mako:73
5052 #: rhodecode/templates/files/files_source.mako:87
4920 msgid "Show as raw"
5053 msgid "Show as raw"
4921 msgstr ""
5054 msgstr ""
4922
5055
@@ -4941,7 +5074,7 b' msgstr ""'
4941 #: rhodecode/templates/admin/repos/repo_edit.mako:43
5074 #: rhodecode/templates/admin/repos/repo_edit.mako:43
4942 #: rhodecode/templates/admin/settings/settings.mako:14
5075 #: rhodecode/templates/admin/settings/settings.mako:14
4943 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:33
5076 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:33
4944 #: rhodecode/templates/base/base.mako:81 rhodecode/templates/base/base.mako:246
5077 #: rhodecode/templates/base/base.mako:84 rhodecode/templates/base/base.mako:249
4945 msgid "Settings"
5078 msgid "Settings"
4946 msgstr ""
5079 msgstr ""
4947
5080
@@ -4973,6 +5106,8 b' msgid "Create new integration"'
4973 msgstr ""
5106 msgstr ""
4974
5107
4975 #: rhodecode/templates/admin/integrations/list.mako:104
5108 #: rhodecode/templates/admin/integrations/list.mako:104
5109 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:14
5110 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:14
4976 msgid "Scope"
5111 msgid "Scope"
4977 msgstr ""
5112 msgstr ""
4978
5113
@@ -5042,7 +5177,7 b' msgid "No description available"'
5042 msgstr ""
5177 msgstr ""
5043
5178
5044 #: rhodecode/templates/admin/my_account/my_account.mako:5
5179 #: rhodecode/templates/admin/my_account/my_account.mako:5
5045 #: rhodecode/templates/base/base.mako:340
5180 #: rhodecode/templates/base/base.mako:343
5046 msgid "My account"
5181 msgid "My account"
5047 msgstr ""
5182 msgstr ""
5048
5183
@@ -5051,9 +5186,10 b' msgid "My Account"'
5051 msgstr ""
5186 msgstr ""
5052
5187
5053 #: rhodecode/templates/admin/my_account/my_account.mako:29
5188 #: rhodecode/templates/admin/my_account/my_account.mako:29
5054 #: rhodecode/templates/admin/my_account/my_account_profile.mako:4
5189 #: rhodecode/templates/email_templates/user_registration.mako:26
5055 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:4
5190 #: rhodecode/templates/users/user.mako:29
5056 msgid "My Profile"
5191 #: rhodecode/templates/users/user_profile.mako:5
5192 msgid "Profile"
5057 msgstr ""
5193 msgstr ""
5058
5194
5059 #: rhodecode/templates/admin/my_account/my_account.mako:31
5195 #: rhodecode/templates/admin/my_account/my_account.mako:31
@@ -5065,11 +5201,8 b' msgid "OAuth Identities"'
5065 msgstr ""
5201 msgstr ""
5066
5202
5067 #: rhodecode/templates/admin/my_account/my_account.mako:37
5203 #: rhodecode/templates/admin/my_account/my_account.mako:37
5068 msgid "My Emails"
5204 #: rhodecode/templates/admin/users/user_edit.mako:38
5069 msgstr ""
5205 msgid "Emails"
5070
5071 #: rhodecode/templates/admin/my_account/my_account.mako:38
5072 msgid "My Repositories"
5073 msgstr ""
5206 msgstr ""
5074
5207
5075 #: rhodecode/templates/admin/my_account/my_account.mako:39
5208 #: rhodecode/templates/admin/my_account/my_account.mako:39
@@ -5078,79 +5211,79 b' msgstr ""'
5078
5211
5079 #: rhodecode/templates/admin/my_account/my_account.mako:40
5212 #: rhodecode/templates/admin/my_account/my_account.mako:40
5080 #: rhodecode/templates/admin/notifications/notifications.mako:33
5213 #: rhodecode/templates/admin/notifications/notifications.mako:33
5081 #: rhodecode/templates/base/base.mako:238
5214 #: rhodecode/templates/base/base.mako:241
5082 msgid "Pull Requests"
5215 msgid "Pull Requests"
5083 msgstr ""
5216 msgstr ""
5084
5217
5085 #: rhodecode/templates/admin/my_account/my_account.mako:41
5218 #: rhodecode/templates/admin/my_account/my_account.mako:41
5086 msgid "My Permissions"
5219 #: rhodecode/templates/admin/permissions/permissions.mako:14
5220 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:49
5221 #: rhodecode/templates/admin/repos/repo_edit.mako:46
5222 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:34
5223 #: rhodecode/templates/base/base.mako:80
5224 msgid "Permissions"
5087 msgstr ""
5225 msgstr ""
5088
5226
5089 #: rhodecode/templates/admin/my_account/my_account.mako:42
5227 #: rhodecode/templates/admin/my_account/my_account.mako:42
5090 msgid "My Live Notifications"
5228 msgid "Live Notifications"
5091 msgstr ""
5229 msgstr ""
5092
5230
5093 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:3
5231 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:3
5232 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:3
5094 msgid "Authentication Tokens"
5233 msgid "Authentication Tokens"
5095 msgstr ""
5234 msgstr ""
5096
5235
5097 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:7
5098 msgid "Built-in tokens can be used to authenticate with all possible options."
5099 msgstr ""
5100
5101 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:8
5236 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:8
5102 msgid "Each token can have a role. VCS tokens can be used together with the authtoken auth plugin for git/hg/svn operations."
5237 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:8
5103 msgstr ""
5238 msgid "Each token can have a role. Token with a role can be used only in given context, e.g. VCS tokens can be used together with the authtoken auth plugin for git/hg/svn operations only."
5104
5239 msgstr ""
5105 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:14
5240
5106 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:11
5241 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:13
5107 msgid "Built-in"
5242 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:13
5108 msgstr ""
5243 msgid "Token"
5109
5244 msgstr ""
5110 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:23
5245
5111 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:46
5246 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:17
5112 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:51
5247 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:17
5113 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:20
5248 msgid "Expiration"
5114 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:42
5249 msgstr ""
5115 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:47
5250
5116 msgid "expires"
5251 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:48
5117 msgstr ""
5252 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:44
5118
5119 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:29
5120 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:26
5121 #, python-format
5122 msgid "Confirm to reset this auth token: %s"
5123 msgstr ""
5124
5125 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:49
5126 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:45
5127 msgid "expired"
5128 msgstr ""
5129
5130 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:59
5131 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:55
5132 #, python-format
5253 #, python-format
5133 msgid "Confirm to remove this auth token: %s"
5254 msgid "Confirm to remove this auth token: %s"
5134 msgstr ""
5255 msgstr ""
5135
5256
5136 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:67
5257 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:56
5137 msgid "No additional auth token specified"
5258 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:52
5138 msgstr ""
5259 msgid "No additional auth tokens specified"
5139
5260 msgstr ""
5140 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:78
5261
5262 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:68
5263 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:64
5141 msgid "New authentication token"
5264 msgid "New authentication token"
5142 msgstr ""
5265 msgstr ""
5143
5266
5144 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:87
5267 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:82
5268 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:78
5269 msgid "Repository scope works only with tokens with VCS type."
5270 msgstr ""
5271
5272 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:86
5145 #: rhodecode/templates/admin/my_account/my_account_emails.mako:64
5273 #: rhodecode/templates/admin/my_account/my_account_emails.mako:64
5146 #: rhodecode/templates/admin/permissions/permissions_ips.mako:60
5274 #: rhodecode/templates/admin/permissions/permissions_ips.mako:60
5147 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:65
5275 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:65
5148 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:84
5276 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:82
5149 #: rhodecode/templates/admin/users/user_edit_emails.mako:62
5277 #: rhodecode/templates/admin/users/user_edit_emails.mako:62
5150 #: rhodecode/templates/admin/users/user_edit_ips.mako:69
5278 #: rhodecode/templates/admin/users/user_edit_ips.mako:69
5151 msgid "Add"
5279 msgid "Add"
5152 msgstr ""
5280 msgstr ""
5153
5281
5282 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:128
5283 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:125
5284 msgid "repository scope"
5285 msgstr ""
5286
5154 #: rhodecode/templates/admin/my_account/my_account_emails.mako:5
5287 #: rhodecode/templates/admin/my_account/my_account_emails.mako:5
5155 msgid "Account Emails"
5288 msgid "Account Emails"
5156 msgstr ""
5289 msgstr ""
@@ -5202,6 +5335,11 b' msgstr ""'
5202 msgid "Source type"
5335 msgid "Source type"
5203 msgstr ""
5336 msgstr ""
5204
5337
5338 #: rhodecode/templates/admin/my_account/my_account_profile.mako:4
5339 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:4
5340 msgid "My Profile"
5341 msgstr ""
5342
5205 #: rhodecode/templates/admin/my_account/my_account_profile.mako:11
5343 #: rhodecode/templates/admin/my_account/my_account_profile.mako:11
5206 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:55
5344 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:55
5207 #: rhodecode/templates/admin/users/user_edit_profile.mako:25
5345 #: rhodecode/templates/admin/users/user_edit_profile.mako:25
@@ -5291,14 +5429,6 b' msgstr ""'
5291 msgid "Permissions Administration"
5429 msgid "Permissions Administration"
5292 msgstr ""
5430 msgstr ""
5293
5431
5294 #: rhodecode/templates/admin/permissions/permissions.mako:14
5295 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:49
5296 #: rhodecode/templates/admin/repos/repo_edit.mako:46
5297 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:34
5298 #: rhodecode/templates/base/base.mako:77
5299 msgid "Permissions"
5300 msgstr ""
5301
5302 #: rhodecode/templates/admin/permissions/permissions.mako:33
5432 #: rhodecode/templates/admin/permissions/permissions.mako:33
5303 msgid "Application"
5433 msgid "Application"
5304 msgstr ""
5434 msgstr ""
@@ -5421,7 +5551,7 b' msgstr ""'
5421
5551
5422 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14
5552 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14
5423 #: rhodecode/templates/admin/users/user_edit_advanced.mako:12
5553 #: rhodecode/templates/admin/users/user_edit_advanced.mako:12
5424 #: rhodecode/templates/base/base.mako:74 rhodecode/templates/base/base.mako:148
5554 #: rhodecode/templates/base/base.mako:77 rhodecode/templates/base/base.mako:151
5425 msgid "Repository groups"
5555 msgid "Repository groups"
5426 msgstr ""
5556 msgstr ""
5427
5557
@@ -5435,7 +5565,7 b' msgid "Group Parent"'
5435 msgstr ""
5565 msgstr ""
5436
5566
5437 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:63
5567 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:63
5438 #: rhodecode/templates/admin/repos/repo_add_base.mako:55
5568 #: rhodecode/templates/admin/repos/repo_add_base.mako:66
5439 msgid "Copy Parent Group Permissions"
5569 msgid "Copy Parent Group Permissions"
5440 msgstr ""
5570 msgstr ""
5441
5571
@@ -5552,7 +5682,7 b' msgstr ""'
5552 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:118
5682 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:118
5553 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:107
5683 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:107
5554 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:117
5684 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:117
5555 #: rhodecode/templates/base/issue_tracker_settings.mako:84
5685 #: rhodecode/templates/base/issue_tracker_settings.mako:83
5556 msgid "Add new"
5686 msgid "Add new"
5557 msgstr ""
5687 msgstr ""
5558
5688
@@ -5610,51 +5740,47 b' msgid "Import Existing Repository ?"'
5610 msgstr ""
5740 msgstr ""
5611
5741
5612 #: rhodecode/templates/admin/repos/repo_add_base.mako:23
5742 #: rhodecode/templates/admin/repos/repo_add_base.mako:23
5613 #: rhodecode/templates/base/base.mako:193
5743 #: rhodecode/templates/base/base.mako:196
5614 msgid "Clone from"
5744 msgid "Clone from"
5615 msgstr ""
5745 msgstr ""
5616
5746
5617 #: rhodecode/templates/admin/repos/repo_add_base.mako:27
5747 #: rhodecode/templates/admin/repos/repo_add_base.mako:47
5618 msgid "Optional http[s] URL from which to clone a repository."
5619 msgstr ""
5620
5621 #: rhodecode/templates/admin/repos/repo_add_base.mako:36
5622 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:102
5748 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:102
5623 #: rhodecode/templates/forks/fork.mako:52
5749 #: rhodecode/templates/forks/fork.mako:52
5624 msgid "Keep it short and to the point. Use a README file for longer descriptions."
5750 msgid "Keep it short and to the point. Use a README file for longer descriptions."
5625 msgstr ""
5751 msgstr ""
5626
5752
5627 #: rhodecode/templates/admin/repos/repo_add_base.mako:41
5753 #: rhodecode/templates/admin/repos/repo_add_base.mako:52
5628 msgid "Repository Group"
5754 msgid "Repository Group"
5629 msgstr ""
5755 msgstr ""
5630
5756
5631 #: rhodecode/templates/admin/repos/repo_add_base.mako:47
5757 #: rhodecode/templates/admin/repos/repo_add_base.mako:58
5632 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:62
5758 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:62
5633 #: rhodecode/templates/forks/fork.mako:64
5759 #: rhodecode/templates/forks/fork.mako:64
5634 #, python-format
5760 #, python-format
5635 msgid "Select my personal group (%(repo_group_name)s)"
5761 msgid "Select my personal group (%(repo_group_name)s)"
5636 msgstr ""
5762 msgstr ""
5637
5763
5638 #: rhodecode/templates/admin/repos/repo_add_base.mako:50
5764 #: rhodecode/templates/admin/repos/repo_add_base.mako:61
5639 #: rhodecode/templates/forks/fork.mako:67
5765 #: rhodecode/templates/forks/fork.mako:67
5640 msgid "Optionally select a group to put this repository into."
5766 msgid "Optionally select a group to put this repository into."
5641 msgstr ""
5767 msgstr ""
5642
5768
5643 #: rhodecode/templates/admin/repos/repo_add_base.mako:59
5769 #: rhodecode/templates/admin/repos/repo_add_base.mako:70
5644 msgid "Copy permission set from the parent repository group."
5770 msgid "Copy permission set from the parent repository group."
5645 msgstr ""
5771 msgstr ""
5646
5772
5647 #: rhodecode/templates/admin/repos/repo_add_base.mako:68
5773 #: rhodecode/templates/admin/repos/repo_add_base.mako:79
5648 msgid "Set the type of repository to create."
5774 msgid "Set the type of repository to create."
5649 msgstr ""
5775 msgstr ""
5650
5776
5651 #: rhodecode/templates/admin/repos/repo_add_base.mako:73
5777 #: rhodecode/templates/admin/repos/repo_add_base.mako:84
5652 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:70
5778 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:70
5653 #: rhodecode/templates/forks/fork.mako:73
5779 #: rhodecode/templates/forks/fork.mako:73
5654 msgid "Landing commit"
5780 msgid "Landing commit"
5655 msgstr ""
5781 msgstr ""
5656
5782
5657 #: rhodecode/templates/admin/repos/repo_add_base.mako:77
5783 #: rhodecode/templates/admin/repos/repo_add_base.mako:88
5658 msgid "The default commit for file pages, downloads, full text search index, and README generation."
5784 msgid "The default commit for file pages, downloads, full text search index, and README generation."
5659 msgstr ""
5785 msgstr ""
5660
5786
@@ -5694,7 +5820,16 b' msgstr ""'
5694 msgid "Statistics"
5820 msgid "Statistics"
5695 msgstr ""
5821 msgstr ""
5696
5822
5697 #: rhodecode/templates/admin/repos/repo_edit.mako:87
5823 #: rhodecode/templates/admin/repos/repo_edit.mako:75
5824 #: rhodecode/templates/admin/repos/repo_edit_maintenance.mako:3
5825 msgid "Maintenance"
5826 msgstr ""
5827
5828 #: rhodecode/templates/admin/repos/repo_edit.mako:78
5829 msgid "Strip"
5830 msgstr ""
5831
5832 #: rhodecode/templates/admin/repos/repo_edit.mako:93
5698 msgid "Reviewers"
5833 msgid "Reviewers"
5699 msgstr ""
5834 msgstr ""
5700
5835
@@ -5721,12 +5856,10 b' msgid "This repository is a fork of %(re'
5721 msgstr ""
5856 msgstr ""
5722
5857
5723 #: rhodecode/templates/admin/repos/repo_edit_advanced.mako:36
5858 #: rhodecode/templates/admin/repos/repo_edit_advanced.mako:36
5724 #: rhodecode/templates/admin/repos/repo_edit_fork.mako:5
5725 msgid "Set"
5859 msgid "Set"
5726 msgstr ""
5860 msgstr ""
5727
5861
5728 #: rhodecode/templates/admin/repos/repo_edit_advanced.mako:39
5862 #: rhodecode/templates/admin/repos/repo_edit_advanced.mako:39
5729 #: rhodecode/templates/admin/repos/repo_edit_fork.mako:9
5730 msgid "Manually set this repository as a fork of another from the list"
5863 msgid "Manually set this repository as a fork of another from the list"
5731 msgstr ""
5864 msgstr ""
5732
5865
@@ -5852,10 +5985,11 b' msgstr ""'
5852 #: rhodecode/templates/admin/repos/repo_edit_caches.mako:37
5985 #: rhodecode/templates/admin/repos/repo_edit_caches.mako:37
5853 #: rhodecode/templates/admin/user_groups/user_group_add.mako:52
5986 #: rhodecode/templates/admin/user_groups/user_group_add.mako:52
5854 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:51
5987 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:51
5855 #: rhodecode/templates/admin/user_groups/user_groups.mako:62
5988 #: rhodecode/templates/admin/user_groups/user_groups.mako:64
5856 #: rhodecode/templates/admin/users/user_add.mako:97
5989 #: rhodecode/templates/admin/users/user_add.mako:97
5990 #: rhodecode/templates/admin/users/user_edit_groups.mako:64
5857 #: rhodecode/templates/admin/users/user_edit_profile.mako:90
5991 #: rhodecode/templates/admin/users/user_edit_profile.mako:90
5858 #: rhodecode/templates/admin/users/users.mako:101
5992 #: rhodecode/templates/admin/users/users.mako:73
5859 msgid "Active"
5993 msgid "Active"
5860 msgstr ""
5994 msgstr ""
5861
5995
@@ -5929,6 +6063,22 b' msgstr ""'
5929 msgid "Test Patterns"
6063 msgid "Test Patterns"
5930 msgstr ""
6064 msgstr ""
5931
6065
6066 #: rhodecode/templates/admin/repos/repo_edit_maintenance.mako:9
6067 msgid "Perform maintenance tasks for this repo, following tasks will be performed"
6068 msgstr ""
6069
6070 #: rhodecode/templates/admin/repos/repo_edit_maintenance.mako:16
6071 msgid "No maintenance tasks for this repo available"
6072 msgstr ""
6073
6074 #: rhodecode/templates/admin/repos/repo_edit_maintenance.mako:26
6075 msgid "Run Maintenance"
6076 msgstr ""
6077
6078 #: rhodecode/templates/admin/repos/repo_edit_maintenance.mako:41
6079 msgid "Performing Maintenance"
6080 msgstr ""
6081
5932 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:5
6082 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:5
5933 msgid "Repository Permissions"
6083 msgid "Repository Permissions"
5934 msgstr ""
6084 msgstr ""
@@ -5949,16 +6099,20 b' msgstr ""'
5949 msgid "Remote mirror url"
6099 msgid "Remote mirror url"
5950 msgstr ""
6100 msgstr ""
5951
6101
5952 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:14
6102 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:12
6103 msgid "Pull can be automated by such api call called periodically (in crontab etc)"
6104 msgstr ""
6105
5953 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:22
6106 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:22
6107 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:30
5954 msgid "Pull changes from remote location"
6108 msgid "Pull changes from remote location"
5955 msgstr ""
6109 msgstr ""
5956
6110
5957 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:14
6111 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:22
5958 msgid "Confirm to pull changes from remote side"
6112 msgid "Confirm to pull changes from remote side"
5959 msgstr ""
6113 msgstr ""
5960
6114
5961 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:19
6115 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:27
5962 msgid "This repository does not have any remote mirror url set."
6116 msgid "This repository does not have any remote mirror url set."
5963 msgstr ""
6117 msgstr ""
5964
6118
@@ -6078,11 +6232,79 b' msgstr ""'
6078 msgid "Confirm to remove current statistics"
6232 msgid "Confirm to remove current statistics"
6079 msgstr ""
6233 msgstr ""
6080
6234
6081 #: rhodecode/templates/admin/repos/repo_edit_vcs.mako:14
6235 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:3
6236 msgid "Strip commits from repository"
6237 msgstr ""
6238
6239 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:7
6240 #, python-format
6241 msgid "Please provide up to %d commits commits to strip"
6242 msgstr ""
6243
6244 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:9
6245 msgid "In the first step commits will be verified for existance in the repository"
6246 msgstr ""
6247
6248 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:10
6249 msgid "In the second step, correct commits will be available for stripping"
6250 msgstr ""
6251
6252 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:16
6253 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:52
6254 msgid "Enter full 40 character commit sha"
6255 msgstr ""
6256
6257 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:18
6258 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:54
6259 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:95
6260 msgid "Add another commit"
6261 msgstr ""
6262
6263 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:27
6264 msgid "Check commits"
6265 msgstr ""
6266
6267 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:33
6268 msgid "Sorry this functionality is not available for SVN repository"
6269 msgstr ""
6270
6271 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:46
6272 msgid "Remove"
6273 msgstr ""
6274
6275 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:112
6276 msgid "Checking commits"
6277 msgstr ""
6278
6279 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:127
6280 msgid "author"
6281 msgstr ""
6282
6283 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:127
6284 msgid "comment"
6285 msgstr ""
6286
6287 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:128
6288 msgid " commit verified positive"
6289 msgstr ""
6290
6291 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:131
6292 msgid " commit verified negative"
6293 msgstr ""
6294
6295 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:153
6296 msgid " commit striped successful"
6297 msgstr ""
6298
6299 #: rhodecode/templates/admin/repos/repo_edit_strip.mako:156
6300 msgid " commit striped failed"
6301 msgstr ""
6302
6303 #: rhodecode/templates/admin/repos/repo_edit_vcs.mako:13
6082 msgid "Select to inherit global vcs settings."
6304 msgid "Select to inherit global vcs settings."
6083 msgstr ""
6305 msgstr ""
6084
6306
6085 #: rhodecode/templates/admin/repos/repo_edit_vcs.mako:45
6307 #: rhodecode/templates/admin/repos/repo_edit_vcs.mako:43
6086 #: rhodecode/templates/admin/settings/settings_global.mako:139
6308 #: rhodecode/templates/admin/settings/settings_global.mako:139
6087 #: rhodecode/templates/admin/settings/settings_labs.mako:48
6309 #: rhodecode/templates/admin/settings/settings_labs.mako:48
6088 #: rhodecode/templates/admin/settings/settings_vcs.mako:13
6310 #: rhodecode/templates/admin/settings/settings_vcs.mako:13
@@ -6588,7 +6810,7 b' msgstr ""'
6588
6810
6589 #: rhodecode/templates/admin/user_groups/user_group_add.mako:13
6811 #: rhodecode/templates/admin/user_groups/user_group_add.mako:13
6590 #: rhodecode/templates/admin/users/user_edit_advanced.mako:13
6812 #: rhodecode/templates/admin/users/user_edit_advanced.mako:13
6591 #: rhodecode/templates/base/base.mako:76 rhodecode/templates/base/base.mako:151
6813 #: rhodecode/templates/base/base.mako:79 rhodecode/templates/base/base.mako:154
6592 msgid "User groups"
6814 msgid "User groups"
6593 msgstr ""
6815 msgstr ""
6594
6816
@@ -6629,29 +6851,69 b' msgid "Members"'
6629 msgstr ""
6851 msgstr ""
6630
6852
6631 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:9
6853 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:9
6854 msgid "Automatic member sync"
6855 msgstr ""
6856
6857 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:11
6632 msgid "Assigned to repositories"
6858 msgid "Assigned to repositories"
6633 msgstr ""
6859 msgstr ""
6634
6860
6635 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:10
6861 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:12
6636 msgid "Assigned to repo groups"
6862 msgid "Assigned to repo groups"
6637 msgstr ""
6863 msgstr ""
6638
6864
6639 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:17
6865 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:19
6640 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:6
6866 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:6
6641 #, python-format
6867 #, python-format
6642 msgid "User Group: %s"
6868 msgid "User Group: %s"
6643 msgstr ""
6869 msgstr ""
6644
6870
6645 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:26
6871 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:29
6872 msgid "Group members sync"
6873 msgstr ""
6874
6875 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:36
6876 msgid "This group is set to be automatically synchronised."
6877 msgstr ""
6878
6879 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:37
6880 msgid "Each member will be added or removed from this groups once they interact with RhodeCode system."
6881 msgstr ""
6882
6883 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:38
6884 msgid "This group synchronization was set by"
6885 msgstr ""
6886
6887 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:42
6888 msgid "This group is not set to be automatically synchronised"
6889 msgstr ""
6890
6891 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:51
6892 msgid "Disable synchronization"
6893 msgstr ""
6894
6895 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:53
6896 msgid "Enable synchronization"
6897 msgstr ""
6898
6899 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:60
6900 msgid "User group will no longer synchronize membership"
6901 msgstr ""
6902
6903 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:62
6904 msgid "User group will start to synchronize membership"
6905 msgstr ""
6906
6907 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:75
6646 msgid "Delete User Group"
6908 msgid "Delete User Group"
6647 msgstr ""
6909 msgstr ""
6648
6910
6649 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:32
6911 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:81
6650 #, python-format
6912 #, python-format
6651 msgid "Confirm to delete user group `%(ugroup)s` with all permission assignments"
6913 msgid "Confirm to delete user group `%(ugroup)s` with all permission assignments"
6652 msgstr ""
6914 msgstr ""
6653
6915
6654 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:34
6916 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:83
6655 msgid "Delete This User Group"
6917 msgid "Delete This User Group"
6656 msgstr ""
6918 msgstr ""
6657
6919
@@ -6677,6 +6939,7 b' msgid "No members yet"'
6677 msgstr ""
6939 msgstr ""
6678
6940
6679 #: rhodecode/templates/admin/user_groups/user_groups.mako:5
6941 #: rhodecode/templates/admin/user_groups/user_groups.mako:5
6942 #: rhodecode/templates/admin/users/user_edit_groups.mako:6
6680 msgid "User groups administration"
6943 msgid "User groups administration"
6681 msgstr ""
6944 msgstr ""
6682
6945
@@ -6684,18 +6947,22 b' msgstr ""'
6684 msgid "user groups"
6947 msgid "user groups"
6685 msgstr ""
6948 msgstr ""
6686
6949
6950 #: rhodecode/templates/admin/user_groups/user_groups.mako:62
6951 msgid "Sync"
6952 msgstr ""
6953
6687 #: rhodecode/templates/admin/users/user_add.mako:5
6954 #: rhodecode/templates/admin/users/user_add.mako:5
6688 msgid "Add user"
6955 msgid "Add user"
6689 msgstr ""
6956 msgstr ""
6690
6957
6691 #: rhodecode/templates/admin/users/user_add.mako:13
6958 #: rhodecode/templates/admin/users/user_add.mako:13
6692 #: rhodecode/templates/admin/users/user_edit.mako:14
6959 #: rhodecode/templates/admin/users/user_edit.mako:14
6693 #: rhodecode/templates/base/base.mako:75
6960 #: rhodecode/templates/base/base.mako:78
6694 msgid "Users"
6961 msgid "Users"
6695 msgstr ""
6962 msgstr ""
6696
6963
6697 #: rhodecode/templates/admin/users/user_add.mako:15
6964 #: rhodecode/templates/admin/users/user_add.mako:15
6698 #: rhodecode/templates/admin/users/users.mako:27
6965 #: rhodecode/templates/admin/users/users.mako:28
6699 msgid "Add User"
6966 msgid "Add User"
6700 msgstr ""
6967 msgstr ""
6701
6968
@@ -6747,14 +7014,18 b' msgstr ""'
6747 msgid "Auth tokens"
7014 msgid "Auth tokens"
6748 msgstr ""
7015 msgstr ""
6749
7016
6750 #: rhodecode/templates/admin/users/user_edit.mako:38
6751 msgid "Emails"
6752 msgstr ""
6753
6754 #: rhodecode/templates/admin/users/user_edit.mako:39
7017 #: rhodecode/templates/admin/users/user_edit.mako:39
6755 msgid "Ip Whitelist"
7018 msgid "Ip Whitelist"
6756 msgstr ""
7019 msgstr ""
6757
7020
7021 #: rhodecode/templates/admin/users/user_edit.mako:40
7022 msgid "User Groups Management"
7023 msgstr ""
7024
7025 #: rhodecode/templates/admin/users/user_edit.mako:41
7026 msgid "User audit"
7027 msgstr ""
7028
6758 #: rhodecode/templates/admin/users/user_edit_advanced.mako:6
7029 #: rhodecode/templates/admin/users/user_edit_advanced.mako:6
6759 #: rhodecode/templates/admin/users/user_edit_profile.mako:106
7030 #: rhodecode/templates/admin/users/user_edit_profile.mako:106
6760 msgid "Source of Record"
7031 msgid "Source of Record"
@@ -6765,7 +7036,7 b' msgid "Last login"'
6765 msgstr ""
7036 msgstr ""
6766
7037
6767 #: rhodecode/templates/admin/users/user_edit_advanced.mako:9
7038 #: rhodecode/templates/admin/users/user_edit_advanced.mako:9
6768 #: rhodecode/templates/admin/users/users.mako:99
7039 #: rhodecode/templates/admin/users/users.mako:71
6769 msgid "Last activity"
7040 msgid "Last activity"
6770 msgstr ""
7041 msgstr ""
6771
7042
@@ -6868,22 +7139,23 b' msgstr ""'
6868 msgid "When selecting the detach option, the depending objects owned by this user will be assigned to the `%s` super admin in the system. The delete option will delete the user's repositories!"
7139 msgid "When selecting the detach option, the depending objects owned by this user will be assigned to the `%s` super admin in the system. The delete option will delete the user's repositories!"
6869 msgstr ""
7140 msgstr ""
6870
7141
6871 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:3
7142 #: rhodecode/templates/admin/users/user_edit_audit.mako:7
6872 msgid "Authentication Access Tokens"
7143 msgid "User Audit Logs"
6873 msgstr ""
7144 msgstr ""
6874
7145
6875 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:63
7146 #: rhodecode/templates/admin/users/user_edit_audit.mako:14
6876 msgid "No additional auth tokens specified"
7147 msgid "audit filter..."
6877 msgstr ""
6878
6879 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:75
6880 msgid "New auth token"
6881 msgstr ""
7148 msgstr ""
6882
7149
6883 #: rhodecode/templates/admin/users/user_edit_emails.mako:5
7150 #: rhodecode/templates/admin/users/user_edit_emails.mako:5
6884 msgid "Additional Email Addresses"
7151 msgid "Additional Email Addresses"
6885 msgstr ""
7152 msgstr ""
6886
7153
7154 #: rhodecode/templates/admin/users/user_edit_groups.mako:12
7155 #, python-format
7156 msgid "Add `%s` to user group"
7157 msgstr ""
7158
6887 #: rhodecode/templates/admin/users/user_edit_ips.mako:3
7159 #: rhodecode/templates/admin/users/user_edit_ips.mako:3
6888 msgid "Custom IP Whitelist"
7160 msgid "Custom IP Whitelist"
6889 msgstr ""
7161 msgstr ""
@@ -6938,98 +7210,98 b' msgstr ""'
6938 msgid "Users administration"
7210 msgid "Users administration"
6939 msgstr ""
7211 msgstr ""
6940
7212
6941 #: rhodecode/templates/admin/users/users.mako:105
7213 #: rhodecode/templates/admin/users/users.mako:77
6942 msgid "Auth type"
7214 msgid "Auth type"
6943 msgstr ""
7215 msgstr ""
6944
7216
6945 #: rhodecode/templates/base/base.mako:50
7217 #: rhodecode/templates/base/base.mako:53
6946 #, python-format
7218 #, python-format
6947 msgid "RhodeCode instance id: %s"
7219 msgid "RhodeCode instance id: %s"
6948 msgstr ""
7220 msgstr ""
6949
7221
6950 #: rhodecode/templates/base/base.mako:78
7222 #: rhodecode/templates/base/base.mako:81
6951 msgid "Authentication"
7223 msgid "Authentication"
6952 msgstr ""
7224 msgstr ""
6953
7225
6954 #: rhodecode/templates/base/base.mako:80
7226 #: rhodecode/templates/base/base.mako:83
6955 msgid "Defaults"
7227 msgid "Defaults"
6956 msgstr ""
7228 msgstr ""
6957
7229
6958 #: rhodecode/templates/base/base.mako:98
7230 #: rhodecode/templates/base/base.mako:101
6959 #: rhodecode/templates/files/files_pjax.mako:24
7231 #: rhodecode/templates/files/files_pjax.mako:24
6960 #: rhodecode/templates/summary/components.mako:42
7232 #: rhodecode/templates/summary/components.mako:42
6961 msgid "Show More"
7233 msgid "Show More"
6962 msgstr ""
7234 msgstr ""
6963
7235
6964 #: rhodecode/templates/base/base.mako:185
7236 #: rhodecode/templates/base/base.mako:188
6965 msgid "Fork of"
7237 msgid "Fork of"
6966 msgstr ""
7238 msgstr ""
6967
7239
6968 #: rhodecode/templates/base/base.mako:202
7240 #: rhodecode/templates/base/base.mako:205
6969 #, python-format
7241 #, python-format
6970 msgid "Repository locked by %(user)s"
7242 msgid "Repository locked by %(user)s"
6971 msgstr ""
7243 msgstr ""
6972
7244
6973 #: rhodecode/templates/base/base.mako:207
7245 #: rhodecode/templates/base/base.mako:210
6974 msgid "Repository not locked. Pull repository to lock it."
7246 msgid "Repository not locked. Pull repository to lock it."
6975 msgstr ""
7247 msgstr ""
6976
7248
6977 #: rhodecode/templates/base/base.mako:225
7249 #: rhodecode/templates/base/base.mako:228
6978 #: rhodecode/templates/data_table/_dt_elements.mako:12
7250 #: rhodecode/templates/data_table/_dt_elements.mako:12
6979 #: rhodecode/templates/data_table/_dt_elements.mako:13
7251 #: rhodecode/templates/data_table/_dt_elements.mako:13
6980 #: rhodecode/templates/data_table/_dt_elements.mako:153
7252 #: rhodecode/templates/data_table/_dt_elements.mako:153
6981 msgid "Summary"
7253 msgid "Summary"
6982 msgstr ""
7254 msgstr ""
6983
7255
6984 #: rhodecode/templates/base/base.mako:226
7256 #: rhodecode/templates/base/base.mako:229
6985 #: rhodecode/templates/data_table/_dt_elements.mako:17
7257 #: rhodecode/templates/data_table/_dt_elements.mako:17
6986 #: rhodecode/templates/data_table/_dt_elements.mako:18
7258 #: rhodecode/templates/data_table/_dt_elements.mako:18
6987 msgid "Changelog"
7259 msgid "Changelog"
6988 msgstr ""
7260 msgstr ""
6989
7261
6990 #: rhodecode/templates/base/base.mako:227
7262 #: rhodecode/templates/base/base.mako:230
6991 #: rhodecode/templates/data_table/_dt_elements.mako:22
7263 #: rhodecode/templates/data_table/_dt_elements.mako:22
6992 #: rhodecode/templates/data_table/_dt_elements.mako:23
7264 #: rhodecode/templates/data_table/_dt_elements.mako:23
6993 #: rhodecode/templates/files/files.mako:15
7265 #: rhodecode/templates/files/files.mako:15
6994 msgid "Files"
7266 msgid "Files"
6995 msgstr ""
7267 msgstr ""
6996
7268
6997 #: rhodecode/templates/base/base.mako:229
7269 #: rhodecode/templates/base/base.mako:232
6998 #: rhodecode/templates/bookmarks/bookmarks.mako:68
7270 #: rhodecode/templates/bookmarks/bookmarks.mako:68
6999 #: rhodecode/templates/branches/branches.mako:67
7271 #: rhodecode/templates/branches/branches.mako:67
7000 #: rhodecode/templates/tags/tags.mako:68
7272 #: rhodecode/templates/tags/tags.mako:68
7001 msgid "Compare"
7273 msgid "Compare"
7002 msgstr ""
7274 msgstr ""
7003
7275
7004 #: rhodecode/templates/base/base.mako:234
7276 #: rhodecode/templates/base/base.mako:237
7005 #, python-format
7277 #, python-format
7006 msgid "Show Pull Requests for %s"
7278 msgid "Show Pull Requests for %s"
7007 msgstr ""
7279 msgstr ""
7008
7280
7009 #: rhodecode/templates/base/base.mako:243
7281 #: rhodecode/templates/base/base.mako:246
7010 msgid "Options"
7282 msgid "Options"
7011 msgstr ""
7283 msgstr ""
7012
7284
7013 #: rhodecode/templates/base/base.mako:250
7014 #: rhodecode/templates/forks/forks_data.mako:30
7015 msgid "Compare fork"
7016 msgstr ""
7017
7018 #: rhodecode/templates/base/base.mako:253
7285 #: rhodecode/templates/base/base.mako:253
7019 #: rhodecode/templates/base/base.mako:400
7286 #: rhodecode/templates/forks/forks_data.mako:30
7287 msgid "Compare fork"
7288 msgstr ""
7289
7290 #: rhodecode/templates/base/base.mako:256
7291 #: rhodecode/templates/base/base.mako:403
7020 #: rhodecode/templates/search/search.mako:64
7292 #: rhodecode/templates/search/search.mako:64
7021 msgid "Search"
7293 msgid "Search"
7022 msgstr ""
7294 msgstr ""
7023
7295
7024 #: rhodecode/templates/base/base.mako:257
7296 #: rhodecode/templates/base/base.mako:260
7025 msgid "Unlock"
7297 msgid "Unlock"
7026 msgstr ""
7298 msgstr ""
7027
7299
7028 #: rhodecode/templates/base/base.mako:259
7300 #: rhodecode/templates/base/base.mako:262
7029 msgid "Lock"
7301 msgid "Lock"
7030 msgstr ""
7302 msgstr ""
7031
7303
7032 #: rhodecode/templates/base/base.mako:264
7304 #: rhodecode/templates/base/base.mako:267
7033 #: rhodecode/templates/data_table/_dt_elements.mako:27
7305 #: rhodecode/templates/data_table/_dt_elements.mako:27
7034 #: rhodecode/templates/data_table/_dt_elements.mako:28
7306 #: rhodecode/templates/data_table/_dt_elements.mako:28
7035 #: rhodecode/templates/forks/forks_data.mako:8
7307 #: rhodecode/templates/forks/forks_data.mako:8
@@ -7039,77 +7311,77 b' msgid_plural "Forks"'
7039 msgstr[0] ""
7311 msgstr[0] ""
7040 msgstr[1] ""
7312 msgstr[1] ""
7041
7313
7042 #: rhodecode/templates/base/base.mako:265
7314 #: rhodecode/templates/base/base.mako:268
7043 msgid "Create Pull Request"
7315 msgid "Create Pull Request"
7044 msgstr ""
7316 msgstr ""
7045
7317
7046 #: rhodecode/templates/base/base.mako:287
7318 #: rhodecode/templates/base/base.mako:290
7047 msgid "Sign in"
7319 msgid "Sign in"
7048 msgstr ""
7320 msgstr ""
7049
7321
7050 #: rhodecode/templates/base/base.mako:295
7322 #: rhodecode/templates/base/base.mako:298
7051 #: rhodecode/templates/debug_style/login.html:28
7323 #: rhodecode/templates/debug_style/login.html:28
7052 msgid "Sign in to your account"
7324 msgid "Sign in to your account"
7053 msgstr ""
7325 msgstr ""
7054
7326
7055 #: rhodecode/templates/base/base.mako:312
7327 #: rhodecode/templates/base/base.mako:315
7056 #: rhodecode/templates/debug_style/login.html:46
7328 #: rhodecode/templates/debug_style/login.html:46
7057 msgid "(Forgot password?)"
7329 msgid "(Forgot password?)"
7058 msgstr ""
7330 msgstr ""
7059
7331
7060 #: rhodecode/templates/base/base.mako:322
7332 #: rhodecode/templates/base/base.mako:325
7061 #: rhodecode/templates/debug_style/login.html:56
7333 #: rhodecode/templates/debug_style/login.html:56
7062 msgid "Don't have an account ?"
7334 msgid "Don't have an account ?"
7063 msgstr ""
7335 msgstr ""
7064
7336
7065 #: rhodecode/templates/base/base.mako:342
7337 #: rhodecode/templates/base/base.mako:345
7066 msgid "My personal group"
7338 msgid "My personal group"
7067 msgstr ""
7339 msgstr ""
7068
7340
7069 #: rhodecode/templates/base/base.mako:346
7341 #: rhodecode/templates/base/base.mako:349
7070 msgid "Sign Out"
7342 msgid "Sign Out"
7071 msgstr ""
7343 msgstr ""
7072
7344
7073 #: rhodecode/templates/base/base.mako:382
7345 #: rhodecode/templates/base/base.mako:385
7074 msgid "Show activity journal"
7346 msgid "Show activity journal"
7075 msgstr ""
7347 msgstr ""
7076
7348
7077 #: rhodecode/templates/base/base.mako:383
7349 #: rhodecode/templates/base/base.mako:386
7078 #: rhodecode/templates/journal/journal.mako:4
7350 #: rhodecode/templates/journal/journal.mako:4
7079 #: rhodecode/templates/journal/journal.mako:14
7351 #: rhodecode/templates/journal/journal.mako:14
7080 msgid "Journal"
7352 msgid "Journal"
7081 msgstr ""
7353 msgstr ""
7082
7354
7083 #: rhodecode/templates/base/base.mako:388
7355 #: rhodecode/templates/base/base.mako:391
7084 msgid "Show Public activity journal"
7356 msgid "Show Public activity journal"
7085 msgstr ""
7357 msgstr ""
7086
7358
7087 #: rhodecode/templates/base/base.mako:389
7359 #: rhodecode/templates/base/base.mako:392
7088 msgid "Public journal"
7360 msgid "Public journal"
7089 msgstr ""
7361 msgstr ""
7090
7362
7091 #: rhodecode/templates/base/base.mako:394
7363 #: rhodecode/templates/base/base.mako:397
7092 msgid "Show Gists"
7364 msgid "Show Gists"
7093 msgstr ""
7365 msgstr ""
7094
7366
7095 #: rhodecode/templates/base/base.mako:395
7367 #: rhodecode/templates/base/base.mako:398
7096 msgid "Gists"
7368 msgid "Gists"
7097 msgstr ""
7369 msgstr ""
7098
7370
7099 #: rhodecode/templates/base/base.mako:399
7371 #: rhodecode/templates/base/base.mako:402
7100 msgid "Search in repositories you have access to"
7372 msgid "Search in repositories you have access to"
7101 msgstr ""
7373 msgstr ""
7102
7374
7103 #: rhodecode/templates/base/base.mako:405
7375 #: rhodecode/templates/base/base.mako:408
7104 msgid "Admin settings"
7376 msgid "Admin settings"
7105 msgstr ""
7377 msgstr ""
7106
7378
7107 #: rhodecode/templates/base/base.mako:412
7379 #: rhodecode/templates/base/base.mako:415
7108 msgid "Delegated Admin settings"
7380 msgid "Delegated Admin settings"
7109 msgstr ""
7381 msgstr ""
7110
7382
7111 #: rhodecode/templates/base/base.mako:422
7383 #: rhodecode/templates/base/base.mako:425
7112 #: rhodecode/templates/base/base.mako:423
7384 #: rhodecode/templates/base/base.mako:426
7113 #: rhodecode/templates/debug_style/alerts.html:5
7385 #: rhodecode/templates/debug_style/alerts.html:5
7114 #: rhodecode/templates/debug_style/buttons.html:5
7386 #: rhodecode/templates/debug_style/buttons.html:5
7115 #: rhodecode/templates/debug_style/code-block.html:6
7387 #: rhodecode/templates/debug_style/code-block.html:6
@@ -7131,15 +7403,15 b' msgstr ""'
7131 msgid "Style"
7403 msgid "Style"
7132 msgstr ""
7404 msgstr ""
7133
7405
7134 #: rhodecode/templates/base/base.mako:480
7406 #: rhodecode/templates/base/base.mako:483
7135 msgid "Go to"
7407 msgid "Go to"
7136 msgstr ""
7408 msgstr ""
7137
7409
7138 #: rhodecode/templates/base/base.mako:533
7410 #: rhodecode/templates/base/base.mako:536
7139 msgid "Keyboard shortcuts"
7411 msgid "Keyboard shortcuts"
7140 msgstr ""
7412 msgstr ""
7141
7413
7142 #: rhodecode/templates/base/base.mako:541
7414 #: rhodecode/templates/base/base.mako:544
7143 msgid "Site-wide shortcuts"
7415 msgid "Site-wide shortcuts"
7144 msgstr ""
7416 msgstr ""
7145
7417
@@ -7196,7 +7468,7 b' msgid "User Group Creation"'
7196 msgstr ""
7468 msgstr ""
7197
7469
7198 #: rhodecode/templates/base/default_perms_box.mako:72
7470 #: rhodecode/templates/base/default_perms_box.mako:72
7199 msgid "Permission to allow user group creation. When disabled, user group admins can still create subgroups within their user groups."
7471 msgid "Permission to allow user group creation."
7200 msgstr ""
7472 msgstr ""
7201
7473
7202 #: rhodecode/templates/base/default_perms_box.mako:78
7474 #: rhodecode/templates/base/default_perms_box.mako:78
@@ -7218,19 +7490,19 b' msgid ""'
7218 "permission by members of user groups."
7490 "permission by members of user groups."
7219 msgstr ""
7491 msgstr ""
7220
7492
7221 #: rhodecode/templates/base/issue_tracker_settings.mako:22
7493 #: rhodecode/templates/base/issue_tracker_settings.mako:21
7222 msgid "Read more"
7494 msgid "Read more"
7223 msgstr ""
7495 msgstr ""
7224
7496
7225 #: rhodecode/templates/base/issue_tracker_settings.mako:92
7497 #: rhodecode/templates/base/issue_tracker_settings.mako:91
7226 msgid "New Entry"
7498 msgid "New Entry"
7227 msgstr ""
7499 msgstr ""
7228
7500
7229 #: rhodecode/templates/base/issue_tracker_settings.mako:96
7501 #: rhodecode/templates/base/issue_tracker_settings.mako:95
7230 msgid "Confirm to remove this pattern:"
7502 msgid "Confirm to remove this pattern:"
7231 msgstr ""
7503 msgstr ""
7232
7504
7233 #: rhodecode/templates/base/issue_tracker_settings.mako:192
7505 #: rhodecode/templates/base/issue_tracker_settings.mako:191
7234 #: rhodecode/templates/changeset/changeset_file_comment.mako:269
7506 #: rhodecode/templates/changeset/changeset_file_comment.mako:269
7235 #: rhodecode/templates/changeset/changeset_file_comment.mako:319
7507 #: rhodecode/templates/changeset/changeset_file_comment.mako:319
7236 #: rhodecode/templates/files/files_add.mako:78
7508 #: rhodecode/templates/files/files_add.mako:78
@@ -7240,7 +7512,7 b' msgstr ""'
7240 msgid "Preview"
7512 msgid "Preview"
7241 msgstr ""
7513 msgstr ""
7242
7514
7243 #: rhodecode/templates/base/issue_tracker_settings.mako:193
7515 #: rhodecode/templates/base/issue_tracker_settings.mako:192
7244 msgid "Test Pattern Preview"
7516 msgid "Test Pattern Preview"
7245 msgstr ""
7517 msgstr ""
7246
7518
@@ -7378,99 +7650,127 b' msgstr ""'
7378 msgid "Enable largefiles extension"
7650 msgid "Enable largefiles extension"
7379 msgstr ""
7651 msgstr ""
7380
7652
7381 #: rhodecode/templates/base/vcs_settings.mako:99
7653 #: rhodecode/templates/base/vcs_settings.mako:100
7382 msgid "Enable Largefiles extensions for all repositories."
7654 msgid "Enable Largefiles extensions for all repositories."
7383 msgstr ""
7655 msgstr ""
7384
7656
7385 #: rhodecode/templates/base/vcs_settings.mako:103
7657 #: rhodecode/templates/base/vcs_settings.mako:102
7658 msgid "Enable Largefiles extensions for this repository."
7659 msgstr ""
7660
7661 #: rhodecode/templates/base/vcs_settings.mako:113
7662 msgid "Filesystem location where Mercurial largefile objects should be stored."
7663 msgstr ""
7664
7665 #: rhodecode/templates/base/vcs_settings.mako:119
7386 msgid "Set repositories as publishing"
7666 msgid "Set repositories as publishing"
7387 msgstr ""
7667 msgstr ""
7388
7668
7389 #: rhodecode/templates/base/vcs_settings.mako:103
7669 #: rhodecode/templates/base/vcs_settings.mako:119
7390 msgid "Set repository as publishing"
7670 msgid "Set repository as publishing"
7391 msgstr ""
7671 msgstr ""
7392
7672
7393 #: rhodecode/templates/base/vcs_settings.mako:106
7673 #: rhodecode/templates/base/vcs_settings.mako:122
7394 msgid "When this is enabled all commits in the repository are seen as public commits by clients."
7674 msgid "When this is enabled all commits in the repository are seen as public commits by clients."
7395 msgstr ""
7675 msgstr ""
7396
7676
7397 #: rhodecode/templates/base/vcs_settings.mako:111
7677 #: rhodecode/templates/base/vcs_settings.mako:127
7398 msgid "Enable hgsubversion extension"
7678 msgid "Enable hgsubversion extension"
7399 msgstr ""
7679 msgstr ""
7400
7680
7401 #: rhodecode/templates/base/vcs_settings.mako:114
7681 #: rhodecode/templates/base/vcs_settings.mako:130
7402 msgid "Requires hgsubversion library to be installed. Allows cloning remote SVN repositories and migrates them to Mercurial type."
7682 msgid "Requires hgsubversion library to be installed. Allows cloning remote SVN repositories and migrates them to Mercurial type."
7403 msgstr ""
7683 msgstr ""
7404
7684
7405 #: rhodecode/templates/base/vcs_settings.mako:123
7685 #: rhodecode/templates/base/vcs_settings.mako:139
7406 msgid "Mercurial Labs Settings"
7686 msgid "Mercurial Labs Settings"
7407 msgstr ""
7687 msgstr ""
7408
7688
7409 #: rhodecode/templates/base/vcs_settings.mako:123
7689 #: rhodecode/templates/base/vcs_settings.mako:139
7410 msgid "These features are considered experimental and may not work as expected."
7690 msgid "These features are considered experimental and may not work as expected."
7411 msgstr ""
7691 msgstr ""
7412
7692
7413 #: rhodecode/templates/base/vcs_settings.mako:129
7693 #: rhodecode/templates/base/vcs_settings.mako:145
7414 msgid "Use rebase as merge strategy"
7694 msgid "Use rebase as merge strategy"
7415 msgstr ""
7695 msgstr ""
7416
7696
7417 #: rhodecode/templates/base/vcs_settings.mako:132
7697 #: rhodecode/templates/base/vcs_settings.mako:148
7418 msgid "Use rebase instead of creating a merge commit when merging via web interface."
7698 msgid "Use rebase instead of creating a merge commit when merging via web interface."
7419 msgstr ""
7699 msgstr ""
7420
7700
7421 #: rhodecode/templates/base/vcs_settings.mako:144
7701 #: rhodecode/templates/base/vcs_settings.mako:160
7702 msgid "Git Settings"
7703 msgstr ""
7704
7705 #: rhodecode/templates/base/vcs_settings.mako:165
7706 msgid "Enable lfs extension"
7707 msgstr ""
7708
7709 #: rhodecode/templates/base/vcs_settings.mako:169
7710 msgid "Enable lfs extensions for all repositories."
7711 msgstr ""
7712
7713 #: rhodecode/templates/base/vcs_settings.mako:171
7714 msgid "Enable lfs extensions for this repository."
7715 msgstr ""
7716
7717 #: rhodecode/templates/base/vcs_settings.mako:182
7718 msgid "Filesystem location where Git lfs objects should be stored."
7719 msgstr ""
7720
7721 #: rhodecode/templates/base/vcs_settings.mako:193
7422 msgid "Global Subversion Settings"
7722 msgid "Global Subversion Settings"
7423 msgstr ""
7723 msgstr ""
7424
7724
7425 #: rhodecode/templates/base/vcs_settings.mako:150
7725 #: rhodecode/templates/base/vcs_settings.mako:199
7426 msgid "Proxy subversion HTTP requests"
7726 msgid "Proxy subversion HTTP requests"
7427 msgstr ""
7727 msgstr ""
7428
7728
7429 #: rhodecode/templates/base/vcs_settings.mako:154
7729 #: rhodecode/templates/base/vcs_settings.mako:203
7430 msgid "Subversion HTTP Support. Enables communication with SVN over HTTP protocol."
7730 msgid "Subversion HTTP Support. Enables communication with SVN over HTTP protocol."
7431 msgstr ""
7731 msgstr ""
7432
7732
7433 #: rhodecode/templates/base/vcs_settings.mako:155
7733 #: rhodecode/templates/base/vcs_settings.mako:204
7434 msgid "SVN Protocol setup Documentation"
7734 msgid "SVN Protocol setup Documentation"
7435 msgstr ""
7735 msgstr ""
7436
7736
7437 #: rhodecode/templates/base/vcs_settings.mako:161
7737 #: rhodecode/templates/base/vcs_settings.mako:210
7438 msgid "Subversion HTTP Server URL"
7738 msgid "Subversion HTTP Server URL"
7439 msgstr ""
7739 msgstr ""
7440
7740
7441 #: rhodecode/templates/base/vcs_settings.mako:167
7741 #: rhodecode/templates/base/vcs_settings.mako:216
7442 msgid "Generate Apache Config"
7742 msgid "Generate Apache Config"
7443 msgstr ""
7743 msgstr ""
7444
7744
7445 #: rhodecode/templates/base/vcs_settings.mako:179
7745 #: rhodecode/templates/base/vcs_settings.mako:228
7446 msgid "Subversion Settings"
7746 msgid "Subversion Settings"
7447 msgstr ""
7747 msgstr ""
7448
7748
7449 #: rhodecode/templates/base/vcs_settings.mako:184
7749 #: rhodecode/templates/base/vcs_settings.mako:233
7450 msgid "Repository patterns"
7750 msgid "Repository patterns"
7451 msgstr ""
7751 msgstr ""
7452
7752
7453 #: rhodecode/templates/base/vcs_settings.mako:188
7753 #: rhodecode/templates/base/vcs_settings.mako:237
7454 msgid "Patterns for identifying SVN branches and tags. For recursive search, use \"*\". Eg.: \"/branches/*\""
7754 msgid "Patterns for identifying SVN branches and tags. For recursive search, use \"*\". Eg.: \"/branches/*\""
7455 msgstr ""
7755 msgstr ""
7456
7756
7457 #: rhodecode/templates/base/vcs_settings.mako:254
7757 #: rhodecode/templates/base/vcs_settings.mako:301
7458 msgid "Pull Request Settings"
7758 msgid "Pull Request Settings"
7459 msgstr ""
7759 msgstr ""
7460
7760
7461 #: rhodecode/templates/base/vcs_settings.mako:259
7761 #: rhodecode/templates/base/vcs_settings.mako:306
7462 msgid "Enable server-side merge for pull requests"
7762 msgid "Enable server-side merge for pull requests"
7463 msgstr ""
7763 msgstr ""
7464
7764
7465 #: rhodecode/templates/base/vcs_settings.mako:262
7765 #: rhodecode/templates/base/vcs_settings.mako:309
7466 msgid "Note: when this feature is enabled, it only runs hooks defined in the rcextension package. Custom hooks added on the Admin -> Settings -> Hooks page will not be run when pull requests are automatically merged from the web interface."
7766 msgid "Note: when this feature is enabled, it only runs hooks defined in the rcextension package. Custom hooks added on the Admin -> Settings -> Hooks page will not be run when pull requests are automatically merged from the web interface."
7467 msgstr ""
7767 msgstr ""
7468
7768
7469 #: rhodecode/templates/base/vcs_settings.mako:266
7769 #: rhodecode/templates/base/vcs_settings.mako:313
7470 msgid "Invalidate and relocate inline comments during update"
7770 msgid "Invalidate and relocate inline comments during update"
7471 msgstr ""
7771 msgstr ""
7472
7772
7473 #: rhodecode/templates/base/vcs_settings.mako:269
7773 #: rhodecode/templates/base/vcs_settings.mako:316
7474 msgid "During the update of a pull request, the position of inline comments will be updated and outdated inline comments will be hidden."
7774 msgid "During the update of a pull request, the position of inline comments will be updated and outdated inline comments will be hidden."
7475 msgstr ""
7775 msgstr ""
7476
7776
@@ -7605,7 +7905,7 b' msgstr ""'
7605
7905
7606 #: rhodecode/templates/changelog/changelog_elements.mako:53
7906 #: rhodecode/templates/changelog/changelog_elements.mako:53
7607 #: rhodecode/templates/compare/compare_commits.mako:46
7907 #: rhodecode/templates/compare/compare_commits.mako:46
7608 #: rhodecode/templates/pullrequests/pullrequest_show.mako:490
7908 #: rhodecode/templates/pullrequests/pullrequest_show.mako:495
7609 #: rhodecode/templates/search/search_commit.mako:36
7909 #: rhodecode/templates/search/search_commit.mako:36
7610 msgid "Expand commit message"
7910 msgid "Expand commit message"
7611 msgstr ""
7911 msgstr ""
@@ -7698,8 +7998,8 b' msgid "Diff options"'
7698 msgstr ""
7998 msgstr ""
7699
7999
7700 #: rhodecode/templates/changeset/changeset.mako:119
8000 #: rhodecode/templates/changeset/changeset.mako:119
7701 #: rhodecode/templates/codeblocks/diffs.mako:436
8001 #: rhodecode/templates/codeblocks/diffs.mako:445
7702 #: rhodecode/templates/codeblocks/diffs.mako:439
8002 #: rhodecode/templates/codeblocks/diffs.mako:448
7703 msgid "Raw diff"
8003 msgid "Raw diff"
7704 msgstr ""
8004 msgstr ""
7705
8005
@@ -7716,8 +8016,8 b' msgid "Patch Diff"'
7716 msgstr ""
8016 msgstr ""
7717
8017
7718 #: rhodecode/templates/changeset/changeset.mako:127
8018 #: rhodecode/templates/changeset/changeset.mako:127
7719 #: rhodecode/templates/codeblocks/diffs.mako:443
8019 #: rhodecode/templates/codeblocks/diffs.mako:452
7720 #: rhodecode/templates/codeblocks/diffs.mako:446
8020 #: rhodecode/templates/codeblocks/diffs.mako:455
7721 msgid "Download diff"
8021 msgid "Download diff"
7722 msgstr ""
8022 msgstr ""
7723
8023
@@ -7727,7 +8027,7 b' msgstr ""'
7727
8027
7728 #: rhodecode/templates/changeset/changeset.mako:145
8028 #: rhodecode/templates/changeset/changeset.mako:145
7729 #: rhodecode/templates/changeset/changeset.mako:147
8029 #: rhodecode/templates/changeset/changeset.mako:147
7730 #: rhodecode/tests/functional/test_commit_comments.py:270
8030 #: rhodecode/tests/functional/test_commit_comments.py:275
7731 #, python-format
8031 #, python-format
7732 msgid "%d Commit comment"
8032 msgid "%d Commit comment"
7733 msgid_plural "%d Commit comments"
8033 msgid_plural "%d Commit comments"
@@ -7736,7 +8036,7 b' msgstr[1] ""'
7736
8036
7737 #: rhodecode/templates/changeset/changeset.mako:150
8037 #: rhodecode/templates/changeset/changeset.mako:150
7738 #: rhodecode/templates/changeset/changeset.mako:152
8038 #: rhodecode/templates/changeset/changeset.mako:152
7739 #: rhodecode/tests/functional/test_commit_comments.py:277
8039 #: rhodecode/tests/functional/test_commit_comments.py:282
7740 #, python-format
8040 #, python-format
7741 msgid "%d Inline Comment"
8041 msgid "%d Inline Comment"
7742 msgid_plural "%d Inline Comments"
8042 msgid_plural "%d Inline Comments"
@@ -7841,18 +8141,16 b' msgstr ""'
7841
8141
7842 #: rhodecode/templates/changeset/changeset_file_comment.mako:363
8142 #: rhodecode/templates/changeset/changeset_file_comment.mako:363
7843 #: rhodecode/templates/pullrequests/pullrequest_show.mako:15
8143 #: rhodecode/templates/pullrequests/pullrequest_show.mako:15
7844 #: rhodecode/templates/pullrequests/pullrequest_show.mako:148
8144 #: rhodecode/templates/pullrequests/pullrequest_show.mako:153
7845 #: rhodecode/templates/pullrequests/pullrequests.mako:52
8145 #: rhodecode/templates/pullrequests/pullrequests.mako:52
7846 msgid "Closed"
8146 msgid "Closed"
7847 msgstr ""
8147 msgstr ""
7848
8148
7849 #: rhodecode/templates/changeset/changeset_file_comment.mako:388
8149 #: rhodecode/templates/changeset/changeset_file_comment.mako:393
7850 #: rhodecode/templates/compare/compare_diff.mako:104
8150 #: rhodecode/templates/compare/compare_diff.mako:104
7851 #: rhodecode/templates/compare/compare_diff.mako:112
8151 #: rhodecode/templates/compare/compare_diff.mako:112
7852 #: rhodecode/templates/compare/compare_diff.mako:120
8152 #: rhodecode/templates/compare/compare_diff.mako:120
7853 #: rhodecode/templates/compare/compare_diff.mako:122
8153 #: rhodecode/templates/compare/compare_diff.mako:122
7854 #: rhodecode/templates/email_templates/commit_comment.mako:87
7855 #: rhodecode/templates/email_templates/pull_request_comment.mako:97
7856 msgid "Comment"
8154 msgid "Comment"
7857 msgstr ""
8155 msgstr ""
7858
8156
@@ -7887,7 +8185,7 b' msgstr ""'
7887
8185
7888 #: rhodecode/templates/changeset/changeset_range.mako:99
8186 #: rhodecode/templates/changeset/changeset_range.mako:99
7889 #: rhodecode/templates/compare/compare_diff.mako:312
8187 #: rhodecode/templates/compare/compare_diff.mako:312
7890 #: rhodecode/templates/pullrequests/pullrequest_show.mako:414
8188 #: rhodecode/templates/pullrequests/pullrequest_show.mako:419
7891 #, python-format
8189 #, python-format
7892 msgid "Expand %s commit"
8190 msgid "Expand %s commit"
7893 msgid_plural "Expand %s commits"
8191 msgid_plural "Expand %s commits"
@@ -7896,7 +8194,7 b' msgstr[1] ""'
7896
8194
7897 #: rhodecode/templates/changeset/changeset_range.mako:105
8195 #: rhodecode/templates/changeset/changeset_range.mako:105
7898 #: rhodecode/templates/compare/compare_diff.mako:318
8196 #: rhodecode/templates/compare/compare_diff.mako:318
7899 #: rhodecode/templates/pullrequests/pullrequest_show.mako:420
8197 #: rhodecode/templates/pullrequests/pullrequest_show.mako:425
7900 #, python-format
8198 #, python-format
7901 msgid "Collapse %s commit"
8199 msgid "Collapse %s commit"
7902 msgid_plural "Collapse %s commits"
8200 msgid_plural "Collapse %s commits"
@@ -7995,64 +8293,68 b' msgstr ""'
7995 msgid "File was deleted in this version, and outdated comments were made on it"
8293 msgid "File was deleted in this version, and outdated comments were made on it"
7996 msgstr ""
8294 msgstr ""
7997
8295
7998 #: rhodecode/templates/codeblocks/diffs.mako:406
8296 #: rhodecode/templates/codeblocks/diffs.mako:415
7999 #: rhodecode/templates/codeblocks/diffs.mako:422
8297 #: rhodecode/templates/codeblocks/diffs.mako:431
8000 #, python-format
8298 #, python-format
8001 msgid "Show file at commit: %(commit_id)s"
8299 msgid "Show file at commit: %(commit_id)s"
8002 msgstr ""
8300 msgstr ""
8003
8301
8004 #: rhodecode/templates/codeblocks/diffs.mako:408
8302 #: rhodecode/templates/codeblocks/diffs.mako:417
8005 #: rhodecode/templates/codeblocks/diffs.mako:415
8303 #: rhodecode/templates/codeblocks/diffs.mako:424
8006 msgid "Show file before"
8304 msgid "Show file before"
8007 msgstr ""
8305 msgstr ""
8008
8306
8009 #: rhodecode/templates/codeblocks/diffs.mako:413
8307 #: rhodecode/templates/codeblocks/diffs.mako:422
8010 #: rhodecode/templates/codeblocks/diffs.mako:429
8308 #: rhodecode/templates/codeblocks/diffs.mako:438
8011 #, python-format
8309 #, python-format
8012 msgid "File no longer present at commit: %(commit_id)s"
8310 msgid "File no longer present at commit: %(commit_id)s"
8013 msgstr ""
8311 msgstr ""
8014
8312
8015 #: rhodecode/templates/codeblocks/diffs.mako:424
8313 #: rhodecode/templates/codeblocks/diffs.mako:433
8016 #: rhodecode/templates/codeblocks/diffs.mako:431
8314 #: rhodecode/templates/codeblocks/diffs.mako:440
8017 msgid "Show file after"
8315 msgid "Show file after"
8018 msgstr ""
8316 msgstr ""
8019
8317
8020 #: rhodecode/templates/codeblocks/diffs.mako:462
8318 #: rhodecode/templates/codeblocks/diffs.mako:471
8021 msgid "Show comments"
8319 msgid "Show comments"
8022 msgstr ""
8320 msgstr ""
8023
8321
8024 #: rhodecode/templates/codeblocks/diffs.mako:462
8322 #: rhodecode/templates/codeblocks/diffs.mako:471
8025 msgid "Hide comments"
8323 msgid "Hide comments"
8026 msgstr ""
8324 msgstr ""
8027
8325
8028 #: rhodecode/templates/codeblocks/diffs.mako:634
8326 #: rhodecode/templates/codeblocks/diffs.mako:643
8029 msgid "View side by side"
8327 msgid "View side by side"
8030 msgstr ""
8328 msgstr ""
8031
8329
8032 #: rhodecode/templates/codeblocks/diffs.mako:636
8330 #: rhodecode/templates/codeblocks/diffs.mako:645
8033 msgid "Side by Side"
8331 msgid "Side by Side"
8034 msgstr ""
8332 msgstr ""
8035
8333
8036 #: rhodecode/templates/codeblocks/diffs.mako:640
8334 #: rhodecode/templates/codeblocks/diffs.mako:649
8037 msgid "View unified"
8335 msgid "View unified"
8038 msgstr ""
8336 msgstr ""
8039
8337
8040 #: rhodecode/templates/codeblocks/diffs.mako:641
8338 #: rhodecode/templates/codeblocks/diffs.mako:650
8041 msgid "Unified"
8339 msgid "Unified"
8042 msgstr ""
8340 msgstr ""
8043
8341
8044 #: rhodecode/templates/codeblocks/diffs.mako:651
8342 #: rhodecode/templates/codeblocks/diffs.mako:660
8045 msgid "Expand All Files"
8343 msgid "Expand All Files"
8046 msgstr ""
8344 msgstr ""
8047
8345
8048 #: rhodecode/templates/codeblocks/diffs.mako:655
8346 #: rhodecode/templates/codeblocks/diffs.mako:664
8049 msgid "Collapse All Files"
8347 msgid "Collapse All Files"
8050 msgstr ""
8348 msgstr ""
8051
8349
8052 #: rhodecode/templates/codeblocks/diffs.mako:659
8350 #: rhodecode/templates/codeblocks/diffs.mako:668
8053 msgid "Wide Mode Diff"
8351 msgid "Wide Mode Diff"
8054 msgstr ""
8352 msgstr ""
8055
8353
8354 #: rhodecode/templates/codeblocks/source.mako:24
8355 msgid "view annotation from before this change"
8356 msgstr ""
8357
8056 #: rhodecode/templates/compare/compare_commits.mako:5
8358 #: rhodecode/templates/compare/compare_commits.mako:5
8057 msgid "Common Ancestor Commit"
8359 msgid "Common Ancestor Commit"
8058 msgstr ""
8360 msgstr ""
@@ -8062,7 +8364,7 b' msgid "Compare was calculated based on t'
8062 msgstr ""
8364 msgstr ""
8063
8365
8064 #: rhodecode/templates/compare/compare_commits.mako:16
8366 #: rhodecode/templates/compare/compare_commits.mako:16
8065 #: rhodecode/templates/pullrequests/pullrequest_show.mako:451
8367 #: rhodecode/templates/pullrequests/pullrequest_show.mako:456
8066 msgid "Time"
8368 msgid "Time"
8067 msgstr ""
8369 msgstr ""
8068
8370
@@ -8074,7 +8376,7 b' msgstr[0] ""'
8074 msgstr[1] ""
8376 msgstr[1] ""
8075
8377
8076 #: rhodecode/templates/compare/compare_commits.mako:68
8378 #: rhodecode/templates/compare/compare_commits.mako:68
8077 #: rhodecode/templates/pullrequests/pullrequest_show.mako:568
8379 #: rhodecode/templates/pullrequests/pullrequest_show.mako:573
8078 msgid "show it"
8380 msgid "show it"
8079 msgid_plural "show them"
8381 msgid_plural "show them"
8080 msgstr[0] ""
8382 msgstr[0] ""
@@ -8110,14 +8412,14 b' msgstr ""'
8110
8412
8111 #: rhodecode/templates/compare/compare_diff.mako:60
8413 #: rhodecode/templates/compare/compare_diff.mako:60
8112 #: rhodecode/templates/email_templates/pull_request_review.mako:74
8414 #: rhodecode/templates/email_templates/pull_request_review.mako:74
8113 #: rhodecode/templates/pullrequests/pullrequest_show.mako:98
8415 #: rhodecode/templates/pullrequests/pullrequest_show.mako:103
8114 msgid "Target"
8416 msgid "Target"
8115 msgstr ""
8417 msgstr ""
8116
8418
8117 #: rhodecode/templates/compare/compare_diff.mako:76
8419 #: rhodecode/templates/compare/compare_diff.mako:76
8118 #: rhodecode/templates/email_templates/pull_request_comment.mako:93
8420 #: rhodecode/templates/email_templates/pull_request_comment.mako:90
8119 #: rhodecode/templates/email_templates/pull_request_review.mako:73
8421 #: rhodecode/templates/email_templates/pull_request_review.mako:73
8120 #: rhodecode/templates/files/files_source.mako:20
8422 #: rhodecode/templates/files/files_source.mako:23
8121 msgid "Source"
8423 msgid "Source"
8122 msgstr ""
8424 msgstr ""
8123
8425
@@ -8340,125 +8642,139 b' msgstr ""'
8340 msgid "RhodeCode"
8642 msgid "RhodeCode"
8341 msgstr ""
8643 msgstr ""
8342
8644
8343 #: rhodecode/templates/email_templates/commit_comment.mako:16
8645 #: rhodecode/templates/email_templates/commit_comment.mako:18
8344 #: rhodecode/templates/email_templates/pull_request_comment.mako:18
8646 #: rhodecode/templates/email_templates/pull_request_comment.mako:19
8345 msgid "[mention]"
8647 msgid "[mention]"
8346 msgstr ""
8648 msgstr ""
8347
8649
8348 #: rhodecode/templates/email_templates/commit_comment.mako:19
8650 #: rhodecode/templates/email_templates/commit_comment.mako:21
8349 #, python-format
8651 #, python-format
8350 msgid "%(user)s commented on commit `%(commit_id)s` (file: `%(comment_file)s`)"
8652 msgid "%(user)s left %(comment_type)s on commit `%(commit_id)s` (file: `%(comment_file)s`)"
8351 msgstr ""
8653 msgstr ""
8352
8654
8353 #: rhodecode/templates/email_templates/commit_comment.mako:19
8655 #: rhodecode/templates/email_templates/commit_comment.mako:21
8354 #: rhodecode/templates/email_templates/commit_comment.mako:22
8355 #: rhodecode/templates/email_templates/commit_comment.mako:24
8656 #: rhodecode/templates/email_templates/commit_comment.mako:24
8657 #: rhodecode/templates/email_templates/commit_comment.mako:26
8356 #, python-format
8658 #, python-format
8357 msgid "in the %(repo_name)s repository"
8659 msgid "in the %(repo_name)s repository"
8358 msgstr ""
8660 msgstr ""
8359
8661
8360 #: rhodecode/templates/email_templates/commit_comment.mako:22
8361 #, python-format
8362 msgid "%(user)s commented on commit `%(commit_id)s` (status: %(status)s)"
8363 msgstr ""
8364
8365 #: rhodecode/templates/email_templates/commit_comment.mako:24
8662 #: rhodecode/templates/email_templates/commit_comment.mako:24
8366 #: rhodecode/templates/email_templates/commit_comment.mako:78
8663 #, python-format
8367 #, python-format
8664 msgid "%(user)s left %(comment_type)s on commit `%(commit_id)s` (status: %(status)s)"
8368 msgid "%(user)s commented on commit `%(commit_id)s`"
8665 msgstr ""
8369 msgstr ""
8666
8370
8667 #: rhodecode/templates/email_templates/commit_comment.mako:26
8371 #: rhodecode/templates/email_templates/commit_comment.mako:43
8668 #, python-format
8372 #: rhodecode/templates/email_templates/pull_request_comment.mako:44
8669 msgid "%(user)s left %(comment_type)s on commit `%(commit_id)s`"
8670 msgstr ""
8671
8672 #: rhodecode/templates/email_templates/commit_comment.mako:47
8673 #: rhodecode/templates/email_templates/pull_request_comment.mako:47
8373 msgid "Comment link"
8674 msgid "Comment link"
8374 msgstr ""
8675 msgstr ""
8375
8676
8376 #: rhodecode/templates/email_templates/commit_comment.mako:48
8677 #: rhodecode/templates/email_templates/commit_comment.mako:52
8377 #: rhodecode/templates/email_templates/pull_request_comment.mako:49
8678 #: rhodecode/templates/email_templates/pull_request_comment.mako:52
8378 #, python-format
8679 #, python-format
8379 msgid "File: %(comment_file)s on line %(comment_line)s"
8680 msgid "File: %(comment_file)s on line %(comment_line)s"
8380 msgstr ""
8681 msgstr ""
8381
8682
8382 #: rhodecode/templates/email_templates/commit_comment.mako:54
8683 #: rhodecode/templates/email_templates/commit_comment.mako:58
8383 msgid "Commit status was changed to"
8684 msgid "Commit status was changed to"
8384 msgstr ""
8685 msgstr ""
8385
8686
8386 #: rhodecode/templates/email_templates/commit_comment.mako:76
8687 #: rhodecode/templates/email_templates/commit_comment.mako:82
8387 #, python-format
8688 #, python-format
8388 msgid "%(user)s commented on commit `%(commit_id)s` (file:`%(comment_file)s`)"
8689 msgid "%(user)s commented on commit `%(commit_id)s` (file:`%(comment_file)s`)"
8389 msgstr ""
8690 msgstr ""
8390
8691
8391 #: rhodecode/templates/email_templates/commit_comment.mako:76
8692 #: rhodecode/templates/email_templates/commit_comment.mako:82
8392 #: rhodecode/templates/email_templates/commit_comment.mako:78
8693 #: rhodecode/templates/email_templates/commit_comment.mako:84
8393 #, python-format
8694 #, python-format
8394 msgid "in the %(repo)s repository"
8695 msgid "in the %(repo)s repository"
8395 msgstr ""
8696 msgstr ""
8396
8697
8397 #: rhodecode/templates/email_templates/commit_comment.mako:85
8698 #: rhodecode/templates/email_templates/commit_comment.mako:84
8699 #, python-format
8700 msgid "%(user)s commented on commit `%(commit_id)s`"
8701 msgstr ""
8702
8703 #: rhodecode/templates/email_templates/commit_comment.mako:92
8704 #: rhodecode/templates/email_templates/pull_request_comment.mako:94
8398 msgid "Status"
8705 msgid "Status"
8399 msgstr ""
8706 msgstr ""
8400
8707
8401 #: rhodecode/templates/email_templates/commit_comment.mako:85
8708 #: rhodecode/templates/email_templates/commit_comment.mako:93
8402 msgid "The commit status was changed to"
8709 msgid "The commit status was changed to"
8403 msgstr ""
8710 msgstr ""
8404
8711
8405 #: rhodecode/templates/email_templates/commit_comment.mako:87
8712 #: rhodecode/templates/email_templates/commit_comment.mako:99
8406 #: rhodecode/templates/email_templates/pull_request_comment.mako:97
8713 #: rhodecode/templates/email_templates/pull_request_comment.mako:107
8407 #, python-format
8714 #, python-format
8408 msgid "Comment on line: %(comment_line)s"
8715 msgid "TODO comment on line: %(comment_line)s"
8409 msgstr ""
8716 msgstr ""
8410
8717
8411 #: rhodecode/templates/email_templates/password_reset.mako:30
8718 #: rhodecode/templates/email_templates/commit_comment.mako:101
8719 #: rhodecode/templates/email_templates/pull_request_comment.mako:109
8720 #, python-format
8721 msgid "Note comment on line: %(comment_line)s"
8722 msgstr ""
8723
8724 #: rhodecode/templates/email_templates/commit_comment.mako:101
8725 #: rhodecode/templates/email_templates/pull_request_comment.mako:109
8726 msgid "Note comment"
8727 msgstr ""
8728
8729 #: rhodecode/templates/email_templates/password_reset.mako:31
8412 msgid "Generate new password here"
8730 msgid "Generate new password here"
8413 msgstr ""
8731 msgstr ""
8414
8732
8415 #: rhodecode/templates/email_templates/pull_request_comment.mako:21
8733 #: rhodecode/templates/email_templates/pull_request_comment.mako:22
8734 #, python-format
8735 msgid "%(user)s left %(comment_type)s on pull request #%(pr_id)s \"%(pr_title)s\" (file: `%(comment_file)s`)"
8736 msgstr ""
8737
8738 #: rhodecode/templates/email_templates/pull_request_comment.mako:25
8739 #, python-format
8740 msgid "%(user)s left %(comment_type)s on pull request #%(pr_id)s \"%(pr_title)s\" (status: %(status)s)"
8741 msgstr ""
8742
8743 #: rhodecode/templates/email_templates/pull_request_comment.mako:27
8744 #, python-format
8745 msgid "%(user)s left %(comment_type)s on pull request #%(pr_id)s \"%(pr_title)s\""
8746 msgstr ""
8747
8748 #: rhodecode/templates/email_templates/pull_request_comment.mako:49
8749 msgid "Source repository"
8750 msgstr ""
8751
8752 #: rhodecode/templates/email_templates/pull_request_comment.mako:58
8753 #, python-format
8754 msgid "%(user)s submitted pull request #%(pr_id)s status: *%(status)s*"
8755 msgstr ""
8756
8757 #: rhodecode/templates/email_templates/pull_request_comment.mako:60
8758 #, python-format
8759 msgid "%(user)s submitted pull request #%(pr_id)s status: *%(status)s and closed*"
8760 msgstr ""
8761
8762 #: rhodecode/templates/email_templates/pull_request_comment.mako:84
8416 #, python-format
8763 #, python-format
8417 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (file: `%(comment_file)s`)"
8764 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (file: `%(comment_file)s`)"
8418 msgstr ""
8765 msgstr ""
8419
8766
8420 #: rhodecode/templates/email_templates/pull_request_comment.mako:24
8767 #: rhodecode/templates/email_templates/pull_request_comment.mako:86
8421 #, python-format
8422 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (status: %(status)s)"
8423 msgstr ""
8424
8425 #: rhodecode/templates/email_templates/pull_request_comment.mako:26
8426 #: rhodecode/templates/email_templates/pull_request_comment.mako:83
8427 #, python-format
8768 #, python-format
8428 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\""
8769 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\""
8429 msgstr ""
8770 msgstr ""
8430
8771
8431 #: rhodecode/templates/email_templates/pull_request_comment.mako:46
8772 #: rhodecode/templates/email_templates/pull_request_comment.mako:97
8432 msgid "Source repository"
8773 msgid "Closed pull request with status"
8433 msgstr ""
8774 msgstr ""
8434
8775
8435 #: rhodecode/templates/email_templates/pull_request_comment.mako:55
8776 #: rhodecode/templates/email_templates/pull_request_comment.mako:99
8436 #, python-format
8777 msgid "Submitted review status"
8437 msgid "%(user)s submitted pull request #%(pr_id)s status: *%(status)s*"
8438 msgstr ""
8439
8440 #: rhodecode/templates/email_templates/pull_request_comment.mako:57
8441 #, python-format
8442 msgid "%(user)s submitted pull request #%(pr_id)s status: *%(status)s and closed*"
8443 msgstr ""
8444
8445 #: rhodecode/templates/email_templates/pull_request_comment.mako:81
8446 #, python-format
8447 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (file:`%(comment_file)s`)"
8448 msgstr ""
8449
8450 #: rhodecode/templates/email_templates/pull_request_comment.mako:87
8451 #, python-format
8452 msgid "submitted pull request status: %(status)s"
8453 msgstr ""
8454
8455 #: rhodecode/templates/email_templates/pull_request_comment.mako:89
8456 #, python-format
8457 msgid "submitted pull request status: %(status)s and closed"
8458 msgstr ""
8459
8460 #: rhodecode/templates/email_templates/pull_request_comment.mako:95
8461 msgid "Submitted status"
8462 msgstr ""
8778 msgstr ""
8463
8779
8464 #: rhodecode/templates/email_templates/pull_request_review.mako:14
8780 #: rhodecode/templates/email_templates/pull_request_review.mako:14
@@ -8523,12 +8839,6 b' msgstr ""'
8523 msgid "Full Name"
8839 msgid "Full Name"
8524 msgstr ""
8840 msgstr ""
8525
8841
8526 #: rhodecode/templates/email_templates/user_registration.mako:26
8527 #: rhodecode/templates/users/user.mako:29
8528 #: rhodecode/templates/users/user_profile.mako:5
8529 msgid "Profile"
8530 msgstr ""
8531
8532 #: rhodecode/templates/errors/error_document.mako:46
8842 #: rhodecode/templates/errors/error_document.mako:46
8533 #, python-format
8843 #, python-format
8534 msgid "You will be redirected to %s in %s seconds"
8844 msgid "You will be redirected to %s in %s seconds"
@@ -8685,13 +8995,13 b' msgid "Delete file"'
8685 msgstr ""
8995 msgstr ""
8686
8996
8687 #: rhodecode/templates/files/files_delete.mako:45
8997 #: rhodecode/templates/files/files_delete.mako:45
8688 #: rhodecode/templates/files/files_source.mako:51
8998 #: rhodecode/templates/files/files_source.mako:65
8689 #, python-format
8999 #, python-format
8690 msgid "Binary file (%s)"
9000 msgid "Binary file (%s)"
8691 msgstr ""
9001 msgstr ""
8692
9002
8693 #: rhodecode/templates/files/files_delete.mako:50
9003 #: rhodecode/templates/files/files_delete.mako:50
8694 #: rhodecode/templates/files/files_source.mako:73
9004 #: rhodecode/templates/files/files_source.mako:87
8695 msgid "File is too big to display"
9005 msgid "File is too big to display"
8696 msgstr ""
9006 msgstr ""
8697
9007
@@ -8704,19 +9014,19 b' msgstr ""'
8704 msgid "Commit Description"
9014 msgid "Commit Description"
8705 msgstr ""
9015 msgstr ""
8706
9016
8707 #: rhodecode/templates/files/files_detail.mako:35
9017 #: rhodecode/templates/files/files_detail.mako:32
8708 msgid "File last commit"
9018 msgid "File last commit"
8709 msgstr ""
9019 msgstr ""
8710
9020
8711 #: rhodecode/templates/files/files_detail.mako:51
9021 #: rhodecode/templates/files/files_detail.mako:46
8712 msgid "Show/Diff file"
9022 msgid "Show/Diff file"
8713 msgstr ""
9023 msgstr ""
8714
9024
8715 #: rhodecode/templates/files/files_detail.mako:66
9025 #: rhodecode/templates/files/files_detail.mako:61
8716 msgid "Diff to Commit"
9026 msgid "Diff to Commit"
8717 msgstr ""
9027 msgstr ""
8718
9028
8719 #: rhodecode/templates/files/files_detail.mako:67
9029 #: rhodecode/templates/files/files_detail.mako:62
8720 msgid "Show at Commit"
9030 msgid "Show at Commit"
8721 msgstr ""
9031 msgstr ""
8722
9032
@@ -8758,72 +9068,66 b' msgstr ""'
8758 msgid "Location"
9068 msgid "Location"
8759 msgstr ""
9069 msgstr ""
8760
9070
8761 #: rhodecode/templates/files/files_source.mako:7
9071 #: rhodecode/templates/files/files_source.mako:8
9072 msgid "This file is a pointer to large binary file"
9073 msgstr ""
9074
9075 #: rhodecode/templates/files/files_source.mako:8
9076 msgid "LargeFile"
9077 msgstr ""
9078
9079 #: rhodecode/templates/files/files_source.mako:10
8762 #: rhodecode/templates/search/search_content.mako:57
9080 #: rhodecode/templates/search/search_content.mako:57
8763 msgid "line"
9081 msgid "line"
8764 msgid_plural "lines"
9082 msgid_plural "lines"
8765 msgstr[0] ""
9083 msgstr[0] ""
8766 msgstr[1] ""
9084 msgstr[1] ""
8767
9085
8768 #: rhodecode/templates/files/files_source.mako:14
9086 #: rhodecode/templates/files/files_source.mako:17
8769 msgid "History"
9087 msgid "History"
8770 msgstr ""
9088 msgstr ""
8771
9089
8772 #: rhodecode/templates/files/files_source.mako:17
9090 #: rhodecode/templates/files/files_source.mako:20
8773 #: rhodecode/templates/search/search_content.mako:68
9091 #: rhodecode/templates/search/search_content.mako:68
8774 msgid "Show Full History"
9092 msgid "Show Full History"
8775 msgstr ""
9093 msgstr ""
8776
9094
8777 #: rhodecode/templates/files/files_source.mako:22
9095 #: rhodecode/templates/files/files_source.mako:25
8778 #: rhodecode/templates/search/search_content.mako:70
9096 #: rhodecode/templates/search/search_content.mako:70
8779 msgid "Annotation"
9097 msgid "Annotation"
8780 msgstr ""
9098 msgstr ""
8781
9099
8782 #: rhodecode/templates/files/files_source.mako:24
9100 #: rhodecode/templates/files/files_source.mako:27
8783 #: rhodecode/templates/search/search_content.mako:71
9101 #: rhodecode/templates/search/search_content.mako:71
8784 msgid "Raw"
9102 msgid "Raw"
8785 msgstr ""
9103 msgstr ""
8786
9104
8787 #: rhodecode/templates/files/files_source.mako:26
9105 #: rhodecode/templates/files/files_source.mako:31
9106 msgid "Download largefile"
9107 msgstr ""
9108
9109 #: rhodecode/templates/files/files_source.mako:35
8788 #: rhodecode/templates/search/search_content.mako:73
9110 #: rhodecode/templates/search/search_content.mako:73
8789 msgid "Download"
9111 msgid "Download"
8790 msgstr ""
9112 msgstr ""
8791
9113
8792 #: rhodecode/templates/files/files_source.mako:33
9114 #: rhodecode/templates/files/files_source.mako:43
8793 #, python-format
9115 #, python-format
8794 msgid "Edit on Branch:%s"
9116 msgid "Edit on Branch:%s"
8795 msgstr ""
9117 msgstr ""
8796
9118
8797 #: rhodecode/templates/files/files_source.mako:38
9119 #: rhodecode/templates/files/files_source.mako:48
8798 msgid "Editing binary files not allowed"
9120 msgid "Editing binary files not allowed"
8799 msgstr ""
9121 msgstr ""
8800
9122
8801 #: rhodecode/templates/files/files_source.mako:41
9123 #: rhodecode/templates/files/files_source.mako:51
8802 msgid "Editing files allowed only when on branch head commit"
9124 msgid "Editing files allowed only when on branch head commit"
8803 msgstr ""
9125 msgstr ""
8804
9126
8805 #: rhodecode/templates/files/files_source.mako:42
9127 #: rhodecode/templates/files/files_source.mako:52
8806 msgid "Deleting files allowed only when on branch head commit"
9128 msgid "Deleting files allowed only when on branch head commit"
8807 msgstr ""
9129 msgstr ""
8808
9130
8809 #: rhodecode/templates/followers/followers.mako:5
8810 #: rhodecode/templates/followers/followers.mako:27
8811 #, python-format
8812 msgid "%s Followers"
8813 msgstr ""
8814
8815 #: rhodecode/templates/followers/followers.mako:12
8816 msgid "Followers"
8817 msgstr ""
8818
8819 #: rhodecode/templates/followers/followers_data.mako:5
8820 msgid "Follower Name"
8821 msgstr ""
8822
8823 #: rhodecode/templates/followers/followers_data.mako:6
8824 msgid "Following Since"
8825 msgstr ""
8826
8827 #: rhodecode/templates/forks/fork.mako:5
9131 #: rhodecode/templates/forks/fork.mako:5
8828 #, python-format
9132 #, python-format
8829 msgid "Fork repository %s"
9133 msgid "Fork repository %s"
@@ -8904,98 +9208,99 b' msgstr ""'
8904 msgid "New pull request"
9208 msgid "New pull request"
8905 msgstr ""
9209 msgstr ""
8906
9210
8907 #: rhodecode/templates/pullrequests/pullrequest.mako:52
9211 #: rhodecode/templates/pullrequests/pullrequest.mako:51
8908 msgid "Write a short description on this pull request"
9212 msgid "Write a short description on this pull request"
8909 msgstr ""
9213 msgstr ""
8910
9214
8911 #: rhodecode/templates/pullrequests/pullrequest.mako:59
9215 #: rhodecode/templates/pullrequests/pullrequest.mako:57
8912 msgid "Commit flow"
9216 msgid "Commit flow"
8913 msgstr ""
9217 msgstr ""
8914
9218
8915 #: rhodecode/templates/pullrequests/pullrequest.mako:67
9219 #: rhodecode/templates/pullrequests/pullrequest.mako:65
8916 msgid "Origin repository"
9220 msgid "Origin repository"
8917 msgstr ""
9221 msgstr ""
8918
9222
8919 #: rhodecode/templates/pullrequests/pullrequest.mako:85
9223 #: rhodecode/templates/pullrequests/pullrequest.mako:83
8920 msgid "Loading refs..."
9224 msgid "Loading refs..."
8921 msgstr ""
9225 msgstr ""
8922
9226
8923 #: rhodecode/templates/pullrequests/pullrequest.mako:96
9227 #: rhodecode/templates/pullrequests/pullrequest.mako:94
8924 msgid "Submit Pull Request"
9228 msgid "Submit Pull Request"
8925 msgstr ""
9229 msgstr ""
8926
9230
8927 #: rhodecode/templates/pullrequests/pullrequest.mako:109
9231 #: rhodecode/templates/pullrequests/pullrequest.mako:107
8928 #: rhodecode/templates/pullrequests/pullrequest_show.mako:317
9232 #: rhodecode/templates/pullrequests/pullrequest_show.mako:322
8929 msgid "Pull request reviewers"
9233 msgid "Pull request reviewers"
8930 msgstr ""
9234 msgstr ""
8931
9235
8932 #: rhodecode/templates/pullrequests/pullrequest.mako:110
9236 #: rhodecode/templates/pullrequests/pullrequest.mako:118
8933 msgid "loading..."
9237 #: rhodecode/templates/pullrequests/pullrequest_show.mako:366
8934 msgstr ""
8935
8936 #: rhodecode/templates/pullrequests/pullrequest.mako:120
8937 #: rhodecode/templates/pullrequests/pullrequest_show.mako:361
8938 msgid "Add reviewer"
9238 msgid "Add reviewer"
8939 msgstr ""
9239 msgstr ""
8940
9240
8941 #: rhodecode/templates/pullrequests/pullrequest.mako:299
9241 #: rhodecode/templates/pullrequests/pullrequest.mako:297
8942 #: rhodecode/templates/pullrequests/pullrequest.mako:572
9242 #: rhodecode/templates/pullrequests/pullrequest.mako:570
8943 msgid "Please select origin and destination"
9243 msgid "Please select origin and destination"
8944 msgstr ""
9244 msgstr ""
8945
9245
8946 #: rhodecode/templates/pullrequests/pullrequest.mako:305
9246 #: rhodecode/templates/pullrequests/pullrequest.mako:303
8947 msgid "Loading compare ..."
9247 msgid "Loading compare ..."
8948 msgstr ""
9248 msgstr ""
8949
9249
9250 #: rhodecode/templates/pullrequests/pullrequest.mako:350
8950 #: rhodecode/templates/pullrequests/pullrequest.mako:352
9251 #: rhodecode/templates/pullrequests/pullrequest.mako:352
8951 #: rhodecode/templates/pullrequests/pullrequest.mako:354
8952 msgid "This pull request will consist of __COMMITS__ commit."
9252 msgid "This pull request will consist of __COMMITS__ commit."
8953 msgid_plural "This pull request will consist of __COMMITS__ commits."
9253 msgid_plural "This pull request will consist of __COMMITS__ commits."
8954 msgstr[0] ""
9254 msgstr[0] ""
8955 msgstr[1] ""
9255 msgstr[1] ""
8956
9256
8957 #: rhodecode/templates/pullrequests/pullrequest.mako:357
9257 #: rhodecode/templates/pullrequests/pullrequest.mako:355
8958 msgid "Show detailed compare."
9258 msgid "Show detailed compare."
8959 msgstr ""
9259 msgstr ""
8960
9260
8961 #: rhodecode/templates/pullrequests/pullrequest.mako:364
9261 #: rhodecode/templates/pullrequests/pullrequest.mako:362
8962 msgid "There are no commits to merge."
9262 msgid "There are no commits to merge."
8963 msgstr ""
9263 msgstr ""
8964
9264
8965 #: rhodecode/templates/pullrequests/pullrequest.mako:464
9265 #: rhodecode/templates/pullrequests/pullrequest.mako:462
8966 msgid "Destination repository"
9266 msgid "Destination repository"
8967 msgstr ""
9267 msgstr ""
8968
9268
8969 #: rhodecode/templates/pullrequests/pullrequest.mako:475
9269 #: rhodecode/templates/pullrequests/pullrequest.mako:473
8970 msgid "Select commit reference"
9270 msgid "Select commit reference"
8971 msgstr ""
9271 msgstr ""
8972
9272
8973 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:8
9273 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:7
8974 msgid "This pull request can be merged automatically."
9274 msgid "This pull request can be merged automatically."
8975 msgstr ""
9275 msgstr ""
8976
9276
8977 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:13
9277 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:12
8978 msgid "Merge is not currently possible because of below failed checks."
9278 msgid "Merge is not currently possible because of below failed checks."
8979 msgstr ""
9279 msgstr ""
8980
9280
9281 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:37
9282 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:42
9283 msgid "refresh checks"
9284 msgstr ""
9285
8981 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:38
9286 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:38
8982 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:43
9287 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:43
8983 msgid "refresh checks"
8984 msgstr ""
8985
8986 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:39
8987 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:44
8988 msgid "Merge Pull Request"
9288 msgid "Merge Pull Request"
8989 msgstr ""
9289 msgstr ""
8990
9290
8991 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:44
9291 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:43
8992 msgid "You are not allowed to merge this pull request."
9292 msgid "You are not allowed to merge this pull request."
8993 msgstr ""
9293 msgstr ""
8994
9294
8995 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:46
9295 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:45
8996 msgid "Login to Merge this Pull Request"
9296 msgid "Login to Merge this Pull Request"
8997 msgstr ""
9297 msgstr ""
8998
9298
9299 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:54
9300 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:58
9301 msgid "Close with status {}"
9302 msgstr ""
9303
8999 #: rhodecode/templates/pullrequests/pullrequest_show.mako:5
9304 #: rhodecode/templates/pullrequests/pullrequest_show.mako:5
9000 #, python-format
9305 #, python-format
9001 msgid "%s Pull Request #%s"
9306 msgid "%s Pull Request #%s"
@@ -9013,163 +9318,167 b' msgstr ""'
9013 msgid "Origin"
9318 msgid "Origin"
9014 msgstr ""
9319 msgstr ""
9015
9320
9016 #: rhodecode/templates/pullrequests/pullrequest_show.mako:120
9321 #: rhodecode/templates/pullrequests/pullrequest_show.mako:88
9322 msgid "Common ancestor"
9323 msgstr ""
9324
9325 #: rhodecode/templates/pullrequests/pullrequest_show.mako:125
9017 msgid "Merge"
9326 msgid "Merge"
9018 msgstr ""
9327 msgstr ""
9019
9328
9020 #: rhodecode/templates/pullrequests/pullrequest_show.mako:133
9329 #: rhodecode/templates/pullrequests/pullrequest_show.mako:138
9021 msgid "Shadow repository data not available"
9330 msgid "Shadow repository data not available"
9022 msgstr ""
9331 msgstr ""
9023
9332
9024 #: rhodecode/templates/pullrequests/pullrequest_show.mako:141
9333 #: rhodecode/templates/pullrequests/pullrequest_show.mako:146
9025 msgid "Review"
9334 msgid "Review"
9026 msgstr ""
9335 msgstr ""
9027
9336
9028 #: rhodecode/templates/pullrequests/pullrequest_show.mako:152
9337 #: rhodecode/templates/pullrequests/pullrequest_show.mako:157
9029 #, python-format
9338 #, python-format
9030 msgid "calculated based on %s reviewer vote"
9339 msgid "calculated based on %s reviewer vote"
9031 msgid_plural "calculated based on %s reviewers votes"
9340 msgid_plural "calculated based on %s reviewers votes"
9032 msgstr[0] ""
9341 msgstr[0] ""
9033 msgstr[1] ""
9342 msgstr[1] ""
9034
9343
9035 #: rhodecode/templates/pullrequests/pullrequest_show.mako:170
9344 #: rhodecode/templates/pullrequests/pullrequest_show.mako:175
9036 msgid "Versions"
9345 msgid "Versions"
9037 msgstr ""
9346 msgstr ""
9038
9347
9039 #: rhodecode/templates/pullrequests/pullrequest_show.mako:181
9348 #: rhodecode/templates/pullrequests/pullrequest_show.mako:186
9040 #: rhodecode/templates/pullrequests/pullrequest_show.mako:183
9349 #: rhodecode/templates/pullrequests/pullrequest_show.mako:188
9041 msgid "{} version available for this pull request, show it."
9350 msgid "{} version available for this pull request, show it."
9042 msgid_plural "{} versions available for this pull request, show them."
9351 msgid_plural "{} versions available for this pull request, show them."
9043 msgstr[0] ""
9352 msgstr[0] ""
9044 msgstr[1] ""
9353 msgstr[1] ""
9045
9354
9046 #: rhodecode/templates/pullrequests/pullrequest_show.mako:182
9355 #: rhodecode/templates/pullrequests/pullrequest_show.mako:187
9047 msgid "Hide all versions of this pull request"
9356 msgid "Hide all versions of this pull request"
9048 msgstr ""
9357 msgstr ""
9049
9358
9050 #: rhodecode/templates/pullrequests/pullrequest_show.mako:207
9359 #: rhodecode/templates/pullrequests/pullrequest_show.mako:212
9051 msgid "Your review status at this version"
9360 msgid "Your review status at this version"
9052 msgstr ""
9361 msgstr ""
9053
9362
9054 #: rhodecode/templates/pullrequests/pullrequest_show.mako:213
9363 #: rhodecode/templates/pullrequests/pullrequest_show.mako:218
9055 msgid "Comment from pull request version {0}, general:{1} inline:{2}"
9364 msgid "Comment from pull request version {0}, general:{1} inline:{2}"
9056 msgstr ""
9365 msgstr ""
9057
9366
9058 #: rhodecode/templates/pullrequests/pullrequest_show.mako:230
9367 #: rhodecode/templates/pullrequests/pullrequest_show.mako:235
9059 #: rhodecode/templates/pullrequests/pullrequest_show.mako:234
9368 #: rhodecode/templates/pullrequests/pullrequest_show.mako:239
9060 msgid "select versions to show changes"
9369 msgid "select versions to show changes"
9061 msgstr ""
9370 msgstr ""
9062
9371
9063 #: rhodecode/templates/pullrequests/pullrequest_show.mako:231
9372 #: rhodecode/templates/pullrequests/pullrequest_show.mako:236
9064 msgid "show changes between versions"
9373 msgid "show changes between versions"
9065 msgstr ""
9374 msgstr ""
9066
9375
9067 #: rhodecode/templates/pullrequests/pullrequest_show.mako:232
9376 #: rhodecode/templates/pullrequests/pullrequest_show.mako:237
9068 msgid "show pull request for this version"
9377 msgid "show pull request for this version"
9069 msgstr ""
9378 msgstr ""
9070
9379
9071 #: rhodecode/templates/pullrequests/pullrequest_show.mako:247
9380 #: rhodecode/templates/pullrequests/pullrequest_show.mako:252
9072 msgid "Comments at this version"
9381 msgid "Comments at this version"
9073 msgstr ""
9382 msgstr ""
9074
9383
9075 #: rhodecode/templates/pullrequests/pullrequest_show.mako:251
9076 msgid "Comments for this pull request"
9077 msgstr ""
9078
9079 #: rhodecode/templates/pullrequests/pullrequest_show.mako:256
9384 #: rhodecode/templates/pullrequests/pullrequest_show.mako:256
9080 #: rhodecode/templates/pullrequests/pullrequest_show.mako:258
9385 msgid "Comments for this pull request"
9386 msgstr ""
9387
9388 #: rhodecode/templates/pullrequests/pullrequest_show.mako:261
9389 #: rhodecode/templates/pullrequests/pullrequest_show.mako:263
9081 #, python-format
9390 #, python-format
9082 msgid "%d General "
9391 msgid "%d General "
9083 msgstr ""
9392 msgstr ""
9084
9393
9085 #: rhodecode/templates/pullrequests/pullrequest_show.mako:262
9394 #: rhodecode/templates/pullrequests/pullrequest_show.mako:267
9086 #: rhodecode/templates/pullrequests/pullrequest_show.mako:264
9395 #: rhodecode/templates/pullrequests/pullrequest_show.mako:269
9087 #, python-format
9396 #, python-format
9088 msgid "%d Inline"
9397 msgid "%d Inline"
9089 msgstr ""
9398 msgstr ""
9090
9399
9091 #: rhodecode/templates/pullrequests/pullrequest_show.mako:268
9400 #: rhodecode/templates/pullrequests/pullrequest_show.mako:273
9092 #: rhodecode/templates/pullrequests/pullrequest_show.mako:272
9401 #: rhodecode/templates/pullrequests/pullrequest_show.mako:277
9093 #, python-format
9402 #, python-format
9094 msgid "%d Outdated"
9403 msgid "%d Outdated"
9095 msgstr ""
9404 msgstr ""
9096
9405
9097 #: rhodecode/templates/pullrequests/pullrequest_show.mako:269
9406 #: rhodecode/templates/pullrequests/pullrequest_show.mako:274
9098 msgid "show outdated comments"
9407 msgid "show outdated comments"
9099 msgstr ""
9408 msgstr ""
9100
9409
9101 #: rhodecode/templates/pullrequests/pullrequest_show.mako:270
9410 #: rhodecode/templates/pullrequests/pullrequest_show.mako:275
9102 msgid "hide outdated comments"
9411 msgid "hide outdated comments"
9103 msgstr ""
9412 msgstr ""
9104
9413
9105 #: rhodecode/templates/pullrequests/pullrequest_show.mako:281
9414 #: rhodecode/templates/pullrequests/pullrequest_show.mako:286
9106 msgid "Pull request versions not available"
9415 msgid "Pull request versions not available"
9107 msgstr ""
9416 msgstr ""
9108
9417
9109 #: rhodecode/templates/pullrequests/pullrequest_show.mako:295
9418 #: rhodecode/templates/pullrequests/pullrequest_show.mako:300
9110 #: rhodecode/templates/pullrequests/pullrequest_show.mako:365
9419 #: rhodecode/templates/pullrequests/pullrequest_show.mako:370
9111 msgid "Save Changes"
9420 msgid "Save Changes"
9112 msgstr ""
9421 msgstr ""
9113
9422
9114 #: rhodecode/templates/pullrequests/pullrequest_show.mako:382
9423 #: rhodecode/templates/pullrequests/pullrequest_show.mako:387
9115 msgid "Missing requirements:"
9424 msgid "Missing requirements:"
9116 msgstr ""
9425 msgstr ""
9117
9426
9118 #: rhodecode/templates/pullrequests/pullrequest_show.mako:383
9427 #: rhodecode/templates/pullrequests/pullrequest_show.mako:388
9119 msgid "These commits cannot be displayed, because this repository uses the Mercurial largefiles extension, which was not enabled."
9428 msgid "These commits cannot be displayed, because this repository uses the Mercurial largefiles extension, which was not enabled."
9120 msgstr ""
9429 msgstr ""
9121
9430
9122 #: rhodecode/templates/pullrequests/pullrequest_show.mako:391
9431 #: rhodecode/templates/pullrequests/pullrequest_show.mako:396
9123 msgid "Missing commits"
9432 msgid "Missing commits"
9124 msgstr ""
9433 msgstr ""
9125
9434
9126 #: rhodecode/templates/pullrequests/pullrequest_show.mako:392
9435 #: rhodecode/templates/pullrequests/pullrequest_show.mako:397
9127 msgid "This pull request cannot be displayed, because one or more commits no longer exist in the source repository."
9436 msgid "This pull request cannot be displayed, because one or more commits no longer exist in the source repository."
9128 msgstr ""
9437 msgstr ""
9129
9438
9130 #: rhodecode/templates/pullrequests/pullrequest_show.mako:393
9439 #: rhodecode/templates/pullrequests/pullrequest_show.mako:398
9131 msgid "Please update this pull request, push the commits back into the source repository, or consider closing this pull request."
9440 msgid "Please update this pull request, push the commits back into the source repository, or consider closing this pull request."
9132 msgstr ""
9441 msgstr ""
9133
9442
9134 #: rhodecode/templates/pullrequests/pullrequest_show.mako:404
9443 #: rhodecode/templates/pullrequests/pullrequest_show.mako:409
9135 #, python-format
9444 #, python-format
9136 msgid "Showing changes at v%d, commenting is disabled."
9445 msgid "Showing changes at v%d, commenting is disabled."
9137 msgstr ""
9446 msgstr ""
9138
9447
9139 #: rhodecode/templates/pullrequests/pullrequest_show.mako:427
9448 #: rhodecode/templates/pullrequests/pullrequest_show.mako:432
9140 #: rhodecode/templates/pullrequests/pullrequest_show.mako:429
9449 #: rhodecode/templates/pullrequests/pullrequest_show.mako:434
9141 msgid "Update commits"
9450 msgid "Update commits"
9142 msgstr ""
9451 msgstr ""
9143
9452
9144 #: rhodecode/templates/pullrequests/pullrequest_show.mako:429
9453 #: rhodecode/templates/pullrequests/pullrequest_show.mako:434
9145 msgid "Update is disabled for current view"
9454 msgid "Update is disabled for current view"
9146 msgstr ""
9455 msgstr ""
9147
9456
9148 #: rhodecode/templates/pullrequests/pullrequest_show.mako:440
9457 #: rhodecode/templates/pullrequests/pullrequest_show.mako:445
9149 msgid "Commits and changes between v{ver_from} and {ver_to} of this pull request, commenting is disabled"
9458 msgid "Commits and changes between v{ver_from} and {ver_to} of this pull request, commenting is disabled"
9150 msgstr ""
9459 msgstr ""
9151
9460
9152 #: rhodecode/templates/pullrequests/pullrequest_show.mako:444
9461 #: rhodecode/templates/pullrequests/pullrequest_show.mako:449
9153 msgid "commits added: {}, removed: {}"
9462 msgid "commits added: {}, removed: {}"
9154 msgstr ""
9463 msgstr ""
9155
9464
9156 #: rhodecode/templates/pullrequests/pullrequest_show.mako:462
9465 #: rhodecode/templates/pullrequests/pullrequest_show.mako:467
9157 msgid "Commit added in displayed changes"
9466 msgid "Commit added in displayed changes"
9158 msgstr ""
9467 msgstr ""
9159
9468
9160 #: rhodecode/templates/pullrequests/pullrequest_show.mako:464
9469 #: rhodecode/templates/pullrequests/pullrequest_show.mako:469
9161 msgid "Commit removed in displayed changes"
9470 msgid "Commit removed in displayed changes"
9162 msgstr ""
9471 msgstr ""
9163
9472
9164 #: rhodecode/templates/pullrequests/pullrequest_show.mako:567
9473 #: rhodecode/templates/pullrequests/pullrequest_show.mako:572
9165 msgid "there is {num} general comment from older versions"
9474 msgid "there is {num} general comment from older versions"
9166 msgstr ""
9475 msgstr ""
9167
9476
9168 #: rhodecode/templates/pullrequests/pullrequest_show.mako:570
9477 #: rhodecode/templates/pullrequests/pullrequest_show.mako:575
9169 msgid "there are {num} general comments from older versions"
9478 msgid "there are {num} general comments from older versions"
9170 msgstr ""
9479 msgstr ""
9171
9480
9172 #: rhodecode/templates/pullrequests/pullrequest_show.mako:571
9481 #: rhodecode/templates/pullrequests/pullrequest_show.mako:576
9173 msgid "show them"
9482 msgid "show them"
9174 msgstr ""
9483 msgstr ""
9175
9484
@@ -19,12 +19,14 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 from __future__ import unicode_literals
21 from __future__ import unicode_literals
22 import re
23 import time
24 import textwrap
25 import logging
26
22 import deform
27 import deform
23 import re
24 import logging
25 import requests
28 import requests
26 import colander
29 import colander
27 import textwrap
28 from celery.task import task
30 from celery.task import task
29 from mako.template import Template
31 from mako.template import Template
30
32
@@ -85,17 +87,6 b' class SlackSettingsSchema(colander.Schem'
85 )
87 )
86
88
87
89
88 repo_push_template = Template(r'''
89 *${data['actor']['username']}* pushed to repo <${data['repo']['url']}|${data['repo']['repo_name']}>:
90 %for branch, branch_commits in branches_commits.items():
91 branch: <${branch_commits['branch']['url']}|${branch_commits['branch']['name']}>
92 %for commit in branch_commits['commits']:
93 > <${commit['url']}|${commit['short_id']}> - ${commit['message_html']|html_to_slack_links}
94 %endfor
95 %endfor
96 ''')
97
98
99 class SlackIntegrationType(IntegrationTypeBase):
90 class SlackIntegrationType(IntegrationTypeBase):
100 key = 'slack'
91 key = 'slack'
101 display_name = _('Slack')
92 display_name = _('Slack')
@@ -124,25 +115,31 b' class SlackIntegrationType(IntegrationTy'
124
115
125 data = event.as_dict()
116 data = event.as_dict()
126
117
118 # defaults
119 title = '*%s* caused a *%s* event' % (
120 data['actor']['username'], event.name)
127 text = '*%s* caused a *%s* event' % (
121 text = '*%s* caused a *%s* event' % (
128 data['actor']['username'], event.name)
122 data['actor']['username'], event.name)
123 fields = None
124 overrides = None
129
125
130 log.debug('handling slack event for %s' % event.name)
126 log.debug('handling slack event for %s' % event.name)
131
127
132 if isinstance(event, events.PullRequestCommentEvent):
128 if isinstance(event, events.PullRequestCommentEvent):
133 text = self.format_pull_request_comment_event(event, data)
129 (title, text, fields, overrides) \
130 = self.format_pull_request_comment_event(event, data)
134 elif isinstance(event, events.PullRequestReviewEvent):
131 elif isinstance(event, events.PullRequestReviewEvent):
135 text = self.format_pull_request_review_event(event, data)
132 title, text = self.format_pull_request_review_event(event, data)
136 elif isinstance(event, events.PullRequestEvent):
133 elif isinstance(event, events.PullRequestEvent):
137 text = self.format_pull_request_event(event, data)
134 title, text = self.format_pull_request_event(event, data)
138 elif isinstance(event, events.RepoPushEvent):
135 elif isinstance(event, events.RepoPushEvent):
139 text = self.format_repo_push_event(data)
136 title, text = self.format_repo_push_event(data)
140 elif isinstance(event, events.RepoCreateEvent):
137 elif isinstance(event, events.RepoCreateEvent):
141 text = self.format_repo_create_event(data)
138 title, text = self.format_repo_create_event(data)
142 else:
139 else:
143 log.error('unhandled event type: %r' % event)
140 log.error('unhandled event type: %r' % event)
144
141
145 run_task(post_text_to_slack, self.settings, text)
142 run_task(post_text_to_slack, self.settings, title, text, fields, overrides)
146
143
147 def settings_schema(self):
144 def settings_schema(self):
148 schema = SlackSettingsSchema()
145 schema = SlackSettingsSchema()
@@ -167,37 +164,60 b' class SlackIntegrationType(IntegrationTy'
167 comment_url=data['comment']['url'],
164 comment_url=data['comment']['url'],
168 )
165 )
169
166
170 comment_status = ''
167 fields = None
168 overrides = None
169 status_text = None
170
171 if data['comment']['status']:
171 if data['comment']['status']:
172 comment_status = '[{}]: '.format(data['comment']['status'])
172 status_color = {
173 'approved': '#0ac878',
174 'rejected': '#e85e4d'}.get(data['comment']['status'])
175
176 if status_color:
177 overrides = {"color": status_color}
178
179 status_text = data['comment']['status']
180
181 if data['comment']['file']:
182 fields = [
183 {
184 "title": "file",
185 "value": data['comment']['file']
186 },
187 {
188 "title": "line",
189 "value": data['comment']['line']
190 }
191 ]
173
192
174 return (textwrap.dedent(
193 title = Template(textwrap.dedent(r'''
175 '''
194 *${data['actor']['username']}* left ${data['comment']['type']} on pull request <${data['pullrequest']['url']}|#${data['pullrequest']['pull_request_id']}>:
176 *{user}* commented on pull request <{pr_url}|#{number}> - {pr_title}:
195 ''')).render(data=data, comment=event.comment)
177 >>> {comment_status}{comment_text}
196
178 ''').format(
197 text = Template(textwrap.dedent(r'''
179 comment_status=comment_status,
198 *pull request title*: ${pr_title}
180 user=data['actor']['username'],
199 % if status_text:
181 number=data['pullrequest']['pull_request_id'],
200 *submitted status*: `${status_text}`
182 pr_url=data['pullrequest']['url'],
201 % endif
183 pr_status=data['pullrequest']['status'],
202 >>> ${comment_text}
203 ''')).render(comment_text=comment_text,
184 pr_title=data['pullrequest']['title'],
204 pr_title=data['pullrequest']['title'],
185 comment_text=comment_text
205 status_text=status_text)
186 )
206
207 return title, text, fields, overrides
208
209 def format_pull_request_review_event(self, event, data):
210 title = Template(textwrap.dedent(r'''
211 *${data['actor']['username']}* changed status of pull request <${data['pullrequest']['url']}|#${data['pullrequest']['pull_request_id']} to `${data['pullrequest']['status']}`>:
212 ''')).render(data=data)
213
214 text = Template(textwrap.dedent(r'''
215 *pull request title*: ${pr_title}
216 ''')).render(
217 pr_title=data['pullrequest']['title'],
187 )
218 )
188
219
189 def format_pull_request_review_event(self, event, data):
220 return title, text
190 return (textwrap.dedent(
191 '''
192 Status changed to {pr_status} for pull request <{pr_url}|#{number}> - {pr_title}
193 ''').format(
194 user=data['actor']['username'],
195 number=data['pullrequest']['pull_request_id'],
196 pr_url=data['pullrequest']['url'],
197 pr_status=data['pullrequest']['status'],
198 pr_title=data['pullrequest']['title'],
199 )
200 )
201
221
202 def format_pull_request_event(self, event, data):
222 def format_pull_request_event(self, event, data):
203 action = {
223 action = {
@@ -207,15 +227,22 b' class SlackIntegrationType(IntegrationTy'
207 events.PullRequestCreateEvent: 'created',
227 events.PullRequestCreateEvent: 'created',
208 }.get(event.__class__, str(event.__class__))
228 }.get(event.__class__, str(event.__class__))
209
229
210 return ('Pull request <{url}|#{number}> - {title} '
230 title = Template(textwrap.dedent(r'''
211 '`{action}` by *{user}*').format(
231 *${data['actor']['username']}* `${action}` pull request <${data['pullrequest']['url']}|#${data['pullrequest']['pull_request_id']}>:
212 user=data['actor']['username'],
232 ''')).render(data=data, action=action)
213 number=data['pullrequest']['pull_request_id'],
233
214 url=data['pullrequest']['url'],
234 text = Template(textwrap.dedent(r'''
215 title=data['pullrequest']['title'],
235 *pull request title*: ${pr_title}
216 action=action
236 %if data['pullrequest']['commits']:
237 *commits*: ${len(data['pullrequest']['commits'])}
238 %endif
239 ''')).render(
240 pr_title=data['pullrequest']['title'],
241 data=data
217 )
242 )
218
243
244 return title, text
245
219 def format_repo_push_event(self, data):
246 def format_repo_push_event(self, data):
220 branch_data = {branch['name']: branch
247 branch_data = {branch['name']: branch
221 for branch in data['push']['branches']}
248 for branch in data['push']['branches']}
@@ -230,20 +257,38 b' class SlackIntegrationType(IntegrationTy'
230 branch_commits = branches_commits[commit['branch']]
257 branch_commits = branches_commits[commit['branch']]
231 branch_commits['commits'].append(commit)
258 branch_commits['commits'].append(commit)
232
259
233 result = repo_push_template.render(
260 title = Template(r'''
261 *${data['actor']['username']}* pushed to repo <${data['repo']['url']}|${data['repo']['repo_name']}>:
262 ''').render(data=data)
263
264 repo_push_template = Template(textwrap.dedent(r'''
265 %for branch, branch_commits in branches_commits.items():
266 ${len(branch_commits['commits'])} ${'commit' if len(branch_commits['commits']) == 1 else 'commits'} on branch: <${branch_commits['branch']['url']}|${branch_commits['branch']['name']}>
267 %for commit in branch_commits['commits']:
268 `<${commit['url']}|${commit['short_id']}>` - ${commit['message_html_title']|html_to_slack_links}
269 %endfor
270 %endfor
271 '''))
272
273 text = repo_push_template.render(
234 data=data,
274 data=data,
235 branches_commits=branches_commits,
275 branches_commits=branches_commits,
236 html_to_slack_links=html_to_slack_links,
276 html_to_slack_links=html_to_slack_links,
237 )
277 )
238 return result
278
279 return title, text
239
280
240 def format_repo_create_event(self, data):
281 def format_repo_create_event(self, data):
241 return '<{}|{}> ({}) repository created by *{}*'.format(
282 title = Template(r'''
242 data['repo']['url'],
283 *${data['actor']['username']}* created new repository ${data['repo']['repo_name']}:
243 data['repo']['repo_name'],
284 ''').render(data=data)
244 data['repo']['repo_type'],
285
245 data['actor']['username'],
286 text = Template(textwrap.dedent(r'''
246 )
287 repo_url: ${data['repo']['url']}
288 repo_type: ${data['repo']['repo_type']}
289 ''')).render(data=data)
290
291 return title, text
247
292
248
293
249 def html_to_slack_links(message):
294 def html_to_slack_links(message):
@@ -252,12 +297,38 b' def html_to_slack_links(message):'
252
297
253
298
254 @task(ignore_result=True)
299 @task(ignore_result=True)
255 def post_text_to_slack(settings, text):
300 def post_text_to_slack(settings, title, text, fields=None, overrides=None):
256 log.debug('sending %s to slack %s' % (text, settings['service']))
301 log.debug('sending %s (%s) to slack %s' % (
257 resp = requests.post(settings['service'], json={
302 title, text, settings['service']))
303
304 fields = fields or []
305 overrides = overrides or {}
306
307 message_data = {
308 "fallback": text,
309 "color": "#427cc9",
310 "pretext": title,
311 #"author_name": "Bobby Tables",
312 #"author_link": "http://flickr.com/bobby/",
313 #"author_icon": "http://flickr.com/icons/bobby.jpg",
314 #"title": "Slack API Documentation",
315 #"title_link": "https://api.slack.com/",
316 "text": text,
317 "fields": fields,
318 #"image_url": "http://my-website.com/path/to/image.jpg",
319 #"thumb_url": "http://example.com/path/to/thumb.png",
320 "footer": "RhodeCode",
321 #"footer_icon": "",
322 "ts": time.time(),
323 "mrkdwn_in": ["pretext", "text"]
324 }
325 message_data.update(overrides)
326 json_message = {
327 "icon_emoji": settings.get('icon_emoji', ':studio_microphone:'),
258 "channel": settings.get('channel', ''),
328 "channel": settings.get('channel', ''),
259 "username": settings.get('username', 'Rhodecode'),
329 "username": settings.get('username', 'Rhodecode'),
260 "text": text,
330 "attachments": [message_data]
261 "icon_emoji": settings.get('icon_emoji', ':studio_microphone:')
331 }
262 })
332
333 resp = requests.post(settings['service'], json=json_message)
263 resp.raise_for_status() # raise exception on a failed request
334 resp.raise_for_status() # raise exception on a failed request
@@ -29,6 +29,7 b' from pyramid.httpexceptions import HTTPF'
29 from pyramid.renderers import render
29 from pyramid.renderers import render
30 from pyramid.response import Response
30 from pyramid.response import Response
31
31
32 from rhodecode.apps.admin.navigation import navigation_list
32 from rhodecode.lib import auth
33 from rhodecode.lib import auth
33 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
34 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
34 from rhodecode.lib.utils2 import safe_int
35 from rhodecode.lib.utils2 import safe_int
@@ -36,7 +37,6 b' from rhodecode.lib.helpers import Page'
36 from rhodecode.model.db import Repository, RepoGroup, Session, Integration
37 from rhodecode.model.db import Repository, RepoGroup, Session, Integration
37 from rhodecode.model.scm import ScmModel
38 from rhodecode.model.scm import ScmModel
38 from rhodecode.model.integration import IntegrationModel
39 from rhodecode.model.integration import IntegrationModel
39 from rhodecode.admin.navigation import navigation_list
40 from rhodecode.translation import _
40 from rhodecode.translation import _
41 from rhodecode.integrations import integration_type_registry
41 from rhodecode.integrations import integration_type_registry
42 from rhodecode.model.validation_schema.schemas.integration_schema import (
42 from rhodecode.model.validation_schema.schemas.integration_schema import (
@@ -79,7 +79,6 b' class IntegrationSettingsViewBase(object'
79 repo_group_name = request.matchdict['repo_group_name']
79 repo_group_name = request.matchdict['repo_group_name']
80 self.repo_group = RepoGroup.get_by_group_name(repo_group_name)
80 self.repo_group = RepoGroup.get_by_group_name(repo_group_name)
81
81
82
83 if 'integration' in request.matchdict: # integration type context
82 if 'integration' in request.matchdict: # integration type context
84 integration_type = request.matchdict['integration']
83 integration_type = request.matchdict['integration']
85 self.IntegrationType = integration_type_registry[integration_type]
84 self.IntegrationType = integration_type_registry[integration_type]
@@ -380,12 +379,12 b' class GlobalIntegrationsView(Integration'
380
379
381 class RepoIntegrationsView(IntegrationSettingsViewBase):
380 class RepoIntegrationsView(IntegrationSettingsViewBase):
382 def perm_check(self, user):
381 def perm_check(self, user):
383 return auth.HasRepoPermissionAll('repository.admin'
382 return auth.HasRepoPermissionAll('repository.admin')(
384 )(repo_name=self.repo.repo_name, user=user)
383 repo_name=self.repo.repo_name, user=user)
385
384
386
385
387 class RepoGroupIntegrationsView(IntegrationSettingsViewBase):
386 class RepoGroupIntegrationsView(IntegrationSettingsViewBase):
388 def perm_check(self, user):
387 def perm_check(self, user):
389 return auth.HasRepoGroupPermissionAll('group.admin'
388 return auth.HasRepoGroupPermissionAll('group.admin')(
390 )(group_name=self.repo_group.group_name, user=user)
389 group_name=self.repo_group.group_name, user=user)
391
390
@@ -22,24 +22,22 b''
22 authentication and permission libraries
22 authentication and permission libraries
23 """
23 """
24
24
25 import os
25 import inspect
26 import inspect
26 import collections
27 import collections
27 import fnmatch
28 import fnmatch
28 import hashlib
29 import hashlib
29 import itertools
30 import itertools
30 import logging
31 import logging
31 import os
32 import random
32 import random
33 import time
34 import traceback
33 import traceback
35 from functools import wraps
34 from functools import wraps
36
35
37 import ipaddress
36 import ipaddress
38 from pyramid.httpexceptions import HTTPForbidden
37 from pyramid.httpexceptions import HTTPForbidden, HTTPFound
39 from pylons import url, request
38 from pylons import url, request
40 from pylons.controllers.util import abort, redirect
39 from pylons.controllers.util import abort, redirect
41 from pylons.i18n.translation import _
40 from pylons.i18n.translation import _
42 from sqlalchemy import or_
43 from sqlalchemy.orm.exc import ObjectDeletedError
41 from sqlalchemy.orm.exc import ObjectDeletedError
44 from sqlalchemy.orm import joinedload
42 from sqlalchemy.orm import joinedload
45 from zope.cachedescriptors.property import Lazy as LazyProperty
43 from zope.cachedescriptors.property import Lazy as LazyProperty
@@ -99,6 +97,7 b' class PasswordGenerator(object):'
99
97
100
98
101 class _RhodeCodeCryptoBase(object):
99 class _RhodeCodeCryptoBase(object):
100 ENC_PREF = None
102
101
103 def hash_create(self, str_):
102 def hash_create(self, str_):
104 """
103 """
@@ -139,6 +138,7 b' class _RhodeCodeCryptoBase(object):'
139
138
140
139
141 class _RhodeCodeCryptoBCrypt(_RhodeCodeCryptoBase):
140 class _RhodeCodeCryptoBCrypt(_RhodeCodeCryptoBase):
141 ENC_PREF = '$2a$10'
142
142
143 def hash_create(self, str_):
143 def hash_create(self, str_):
144 self._assert_bytes(str_)
144 self._assert_bytes(str_)
@@ -194,6 +194,7 b' class _RhodeCodeCryptoBCrypt(_RhodeCodeC'
194
194
195
195
196 class _RhodeCodeCryptoSha256(_RhodeCodeCryptoBase):
196 class _RhodeCodeCryptoSha256(_RhodeCodeCryptoBase):
197 ENC_PREF = '_'
197
198
198 def hash_create(self, str_):
199 def hash_create(self, str_):
199 self._assert_bytes(str_)
200 self._assert_bytes(str_)
@@ -211,6 +212,7 b' class _RhodeCodeCryptoSha256(_RhodeCodeC'
211
212
212
213
213 class _RhodeCodeCryptoMd5(_RhodeCodeCryptoBase):
214 class _RhodeCodeCryptoMd5(_RhodeCodeCryptoBase):
215 ENC_PREF = '_'
214
216
215 def hash_create(self, str_):
217 def hash_create(self, str_):
216 self._assert_bytes(str_)
218 self._assert_bytes(str_)
@@ -567,8 +569,14 b' class PermissionCalculator(object):'
567 # on given user group
569 # on given user group
568 for perm in self.default_user_group_perms:
570 for perm in self.default_user_group_perms:
569 u_k = perm.UserUserGroupToPerm.user_group.users_group_name
571 u_k = perm.UserUserGroupToPerm.user_group.users_group_name
572 o = PermOrigin.USERGROUP_DEFAULT
573 if perm.UserGroup.user_id == self.user_id:
574 # set admin if owner
575 p = 'usergroup.admin'
576 o = PermOrigin.USERGROUP_OWNER
577 else:
570 p = perm.Permission.permission_name
578 p = perm.Permission.permission_name
571 o = PermOrigin.USERGROUP_DEFAULT
579
572 # if we decide this user isn't inheriting permissions from default
580 # if we decide this user isn't inheriting permissions from default
573 # user we set him to .none so only explicit permissions work
581 # user we set him to .none so only explicit permissions work
574 if not user_inherit_object_permissions:
582 if not user_inherit_object_permissions:
@@ -647,7 +655,7 b' class PermissionCalculator(object):'
647 multiple_counter[g_k] += 1
655 multiple_counter[g_k] += 1
648 p = perm.Permission.permission_name
656 p = perm.Permission.permission_name
649 if perm.RepoGroup.user_id == self.user_id:
657 if perm.RepoGroup.user_id == self.user_id:
650 # set admin if owner
658 # set admin if owner, even for member of other user group
651 p = 'group.admin'
659 p = 'group.admin'
652 o = PermOrigin.REPOGROUP_OWNER
660 o = PermOrigin.REPOGROUP_OWNER
653 else:
661 else:
@@ -683,7 +691,7 b' class PermissionCalculator(object):'
683 # user group for user group permissions
691 # user group for user group permissions
684 user_group_from_user_group = Permission\
692 user_group_from_user_group = Permission\
685 .get_default_user_group_perms_from_user_group(
693 .get_default_user_group_perms_from_user_group(
686 self.user_id, self.scope_repo_group_id)
694 self.user_id, self.scope_user_group_id)
687
695
688 multiple_counter = collections.defaultdict(int)
696 multiple_counter = collections.defaultdict(int)
689 for perm in user_group_from_user_group:
697 for perm in user_group_from_user_group:
@@ -694,6 +702,12 b' class PermissionCalculator(object):'
694 o = PermOrigin.USERGROUP_USERGROUP % u_k
702 o = PermOrigin.USERGROUP_USERGROUP % u_k
695 multiple_counter[g_k] += 1
703 multiple_counter[g_k] += 1
696 p = perm.Permission.permission_name
704 p = perm.Permission.permission_name
705
706 if perm.UserGroup.user_id == self.user_id:
707 # set admin if owner, even for member of other user group
708 p = 'usergroup.admin'
709 o = PermOrigin.USERGROUP_OWNER
710 else:
697 if multiple_counter[g_k] > 1:
711 if multiple_counter[g_k] > 1:
698 cur_perm = self.permissions_user_groups[g_k]
712 cur_perm = self.permissions_user_groups[g_k]
699 p = self._choose_permission(p, cur_perm)
713 p = self._choose_permission(p, cur_perm)
@@ -705,8 +719,14 b' class PermissionCalculator(object):'
705 for perm in user_user_groups_perms:
719 for perm in user_user_groups_perms:
706 ug_k = perm.UserUserGroupToPerm.user_group.users_group_name
720 ug_k = perm.UserUserGroupToPerm.user_group.users_group_name
707 u_k = perm.UserUserGroupToPerm.user.username
721 u_k = perm.UserUserGroupToPerm.user.username
722 o = PermOrigin.USERGROUP_USER % u_k
723
724 if perm.UserGroup.user_id == self.user_id:
725 # set admin if owner
726 p = 'usergroup.admin'
727 o = PermOrigin.USERGROUP_OWNER
728 else:
708 p = perm.Permission.permission_name
729 p = perm.Permission.permission_name
709 o = PermOrigin.USERGROUP_USER % u_k
710 if not self.explicit:
730 if not self.explicit:
711 cur_perm = self.permissions_user_groups.get(
731 cur_perm = self.permissions_user_groups.get(
712 ug_k, 'usergroup.none')
732 ug_k, 'usergroup.none')
@@ -831,10 +851,6 b' class AuthUser(object):'
831 self._permissions_scoped_cache[cache_key] = res
851 self._permissions_scoped_cache[cache_key] = res
832 return self._permissions_scoped_cache[cache_key]
852 return self._permissions_scoped_cache[cache_key]
833
853
834 @property
835 def auth_tokens(self):
836 return self.get_auth_tokens()
837
838 def get_instance(self):
854 def get_instance(self):
839 return User.get(self.user_id)
855 return User.get(self.user_id)
840
856
@@ -925,16 +941,6 b' class AuthUser(object):'
925 log.debug('PERMISSION tree computed %s' % (result_repr,))
941 log.debug('PERMISSION tree computed %s' % (result_repr,))
926 return result
942 return result
927
943
928 def get_auth_tokens(self):
929 auth_tokens = [self.api_key]
930 for api_key in UserApiKeys.query()\
931 .filter(UserApiKeys.user_id == self.user_id)\
932 .filter(or_(UserApiKeys.expires == -1,
933 UserApiKeys.expires >= time.time())).all():
934 auth_tokens.append(api_key.api_key)
935
936 return auth_tokens
937
938 @property
944 @property
939 def is_default(self):
945 def is_default(self):
940 return self.username == User.DEFAULT_USER
946 return self.username == User.DEFAULT_USER
@@ -952,7 +958,8 b' class AuthUser(object):'
952 """
958 """
953 Returns list of repositories you're an admin of
959 Returns list of repositories you're an admin of
954 """
960 """
955 return [x[0] for x in self.permissions['repositories'].iteritems()
961 return [
962 x[0] for x in self.permissions['repositories'].iteritems()
956 if x[1] == 'repository.admin']
963 if x[1] == 'repository.admin']
957
964
958 @property
965 @property
@@ -960,8 +967,8 b' class AuthUser(object):'
960 """
967 """
961 Returns list of repository groups you're an admin of
968 Returns list of repository groups you're an admin of
962 """
969 """
963 return [x[0]
970 return [
964 for x in self.permissions['repositories_groups'].iteritems()
971 x[0] for x in self.permissions['repositories_groups'].iteritems()
965 if x[1] == 'group.admin']
972 if x[1] == 'group.admin']
966
973
967 @property
974 @property
@@ -969,7 +976,8 b' class AuthUser(object):'
969 """
976 """
970 Returns list of user groups you're an admin of
977 Returns list of user groups you're an admin of
971 """
978 """
972 return [x[0] for x in self.permissions['user_groups'].iteritems()
979 return [
980 x[0] for x in self.permissions['user_groups'].iteritems()
973 if x[1] == 'usergroup.admin']
981 if x[1] == 'usergroup.admin']
974
982
975 @property
983 @property
@@ -1171,7 +1179,7 b' class LoginRequired(object):'
1171 :param api_access: if enabled this checks only for valid auth token
1179 :param api_access: if enabled this checks only for valid auth token
1172 and grants access based on valid token
1180 and grants access based on valid token
1173 """
1181 """
1174 def __init__(self, auth_token_access=False):
1182 def __init__(self, auth_token_access=None):
1175 self.auth_token_access = auth_token_access
1183 self.auth_token_access = auth_token_access
1176
1184
1177 def __call__(self, func):
1185 def __call__(self, func):
@@ -1191,7 +1199,7 b' class LoginRequired(object):'
1191 ip_access_valid = False
1199 ip_access_valid = False
1192
1200
1193 # check if we used an APIKEY and it's a valid one
1201 # check if we used an APIKEY and it's a valid one
1194 # defined whitelist of controllers which API access will be enabled
1202 # defined white-list of controllers which API access will be enabled
1195 _auth_token = request.GET.get(
1203 _auth_token = request.GET.get(
1196 'auth_token', '') or request.GET.get('api_key', '')
1204 'auth_token', '') or request.GET.get('api_key', '')
1197 auth_token_access_valid = allowed_auth_token_access(
1205 auth_token_access_valid = allowed_auth_token_access(
@@ -1200,8 +1208,20 b' class LoginRequired(object):'
1200 # explicit controller is enabled or API is in our whitelist
1208 # explicit controller is enabled or API is in our whitelist
1201 if self.auth_token_access or auth_token_access_valid:
1209 if self.auth_token_access or auth_token_access_valid:
1202 log.debug('Checking AUTH TOKEN access for %s' % (cls,))
1210 log.debug('Checking AUTH TOKEN access for %s' % (cls,))
1211 db_user = user.get_instance()
1203
1212
1204 if _auth_token and _auth_token in user.auth_tokens:
1213 if db_user:
1214 if self.auth_token_access:
1215 roles = self.auth_token_access
1216 else:
1217 roles = [UserApiKeys.ROLE_HTTP]
1218 token_match = db_user.authenticate_by_token(
1219 _auth_token, roles=roles)
1220 else:
1221 log.debug('Unable to fetch db instance for auth user: %s', user)
1222 token_match = False
1223
1224 if _auth_token and token_match:
1205 auth_token_access_valid = True
1225 auth_token_access_valid = True
1206 log.debug('AUTH TOKEN ****%s is VALID' % (_auth_token[-4:],))
1226 log.debug('AUTH TOKEN ****%s is VALID' % (_auth_token[-4:],))
1207 else:
1227 else:
@@ -1234,7 +1254,6 b' class LoginRequired(object):'
1234 auth_token_access_valid))
1254 auth_token_access_valid))
1235 # we preserve the get PARAM
1255 # we preserve the get PARAM
1236 came_from = request.path_qs
1256 came_from = request.path_qs
1237
1238 log.debug('redirecting to login page with %s' % (came_from,))
1257 log.debug('redirecting to login page with %s' % (came_from,))
1239 return redirect(
1258 return redirect(
1240 h.route_path('login', _query={'came_from': came_from}))
1259 h.route_path('login', _query={'came_from': came_from}))
@@ -1249,6 +1268,7 b' class NotAnonymous(object):'
1249 return get_cython_compat_decorator(self.__wrapper, func)
1268 return get_cython_compat_decorator(self.__wrapper, func)
1250
1269
1251 def __wrapper(self, func, *fargs, **fkwargs):
1270 def __wrapper(self, func, *fargs, **fkwargs):
1271 import rhodecode.lib.helpers as h
1252 cls = fargs[0]
1272 cls = fargs[0]
1253 self.user = cls._rhodecode_user
1273 self.user = cls._rhodecode_user
1254
1274
@@ -1258,8 +1278,6 b' class NotAnonymous(object):'
1258
1278
1259 if anonymous:
1279 if anonymous:
1260 came_from = request.path_qs
1280 came_from = request.path_qs
1261
1262 import rhodecode.lib.helpers as h
1263 h.flash(_('You need to be a registered user to '
1281 h.flash(_('You need to be a registered user to '
1264 'perform this action'),
1282 'perform this action'),
1265 category='warning')
1283 category='warning')
@@ -1296,6 +1314,7 b' class HasAcceptedRepoType(object):'
1296 return get_cython_compat_decorator(self.__wrapper, func)
1314 return get_cython_compat_decorator(self.__wrapper, func)
1297
1315
1298 def __wrapper(self, func, *fargs, **fkwargs):
1316 def __wrapper(self, func, *fargs, **fkwargs):
1317 import rhodecode.lib.helpers as h
1299 cls = fargs[0]
1318 cls = fargs[0]
1300 rhodecode_repo = cls.rhodecode_repo
1319 rhodecode_repo = cls.rhodecode_repo
1301
1320
@@ -1306,7 +1325,6 b' class HasAcceptedRepoType(object):'
1306 if rhodecode_repo.alias in self.repo_type_list:
1325 if rhodecode_repo.alias in self.repo_type_list:
1307 return func(*fargs, **fkwargs)
1326 return func(*fargs, **fkwargs)
1308 else:
1327 else:
1309 import rhodecode.lib.helpers as h
1310 h.flash(h.literal(
1328 h.flash(h.literal(
1311 _('Action not supported for %s.' % rhodecode_repo.alias)),
1329 _('Action not supported for %s.' % rhodecode_repo.alias)),
1312 category='warning')
1330 category='warning')
@@ -1326,7 +1344,22 b' class PermsDecorator(object):'
1326 def __call__(self, func):
1344 def __call__(self, func):
1327 return get_cython_compat_decorator(self.__wrapper, func)
1345 return get_cython_compat_decorator(self.__wrapper, func)
1328
1346
1347 def _get_request(self):
1348 from pyramid.threadlocal import get_current_request
1349 pyramid_request = get_current_request()
1350 if not pyramid_request:
1351 # return global request of pylons in case pyramid isn't available
1352 return request
1353 return pyramid_request
1354
1355 def _get_came_from(self):
1356 _request = self._get_request()
1357
1358 # both pylons/pyramid has this attribute
1359 return _request.path_qs
1360
1329 def __wrapper(self, func, *fargs, **fkwargs):
1361 def __wrapper(self, func, *fargs, **fkwargs):
1362 import rhodecode.lib.helpers as h
1330 cls = fargs[0]
1363 cls = fargs[0]
1331 _user = cls._rhodecode_user
1364 _user = cls._rhodecode_user
1332
1365
@@ -1342,17 +1375,15 b' class PermsDecorator(object):'
1342 anonymous = _user.username == User.DEFAULT_USER
1375 anonymous = _user.username == User.DEFAULT_USER
1343
1376
1344 if anonymous:
1377 if anonymous:
1345 came_from = request.path_qs
1378 came_from = self._get_came_from()
1346
1347 import rhodecode.lib.helpers as h
1348 h.flash(_('You need to be signed in to view this page'),
1379 h.flash(_('You need to be signed in to view this page'),
1349 category='warning')
1380 category='warning')
1350 return redirect(
1381 raise HTTPFound(
1351 h.route_path('login', _query={'came_from': came_from}))
1382 h.route_path('login', _query={'came_from': came_from}))
1352
1383
1353 else:
1384 else:
1354 # redirect with forbidden ret code
1385 # redirect with forbidden ret code
1355 return abort(403)
1386 raise HTTPForbidden()
1356
1387
1357 def check_permissions(self, user):
1388 def check_permissions(self, user):
1358 """Dummy function for overriding"""
1389 """Dummy function for overriding"""
@@ -1391,10 +1422,13 b' class HasRepoPermissionAllDecorator(Perm'
1391 Checks for access permission for all given predicates for specific
1422 Checks for access permission for all given predicates for specific
1392 repository. All of them have to be meet in order to fulfill the request
1423 repository. All of them have to be meet in order to fulfill the request
1393 """
1424 """
1425 def _get_repo_name(self):
1426 _request = self._get_request()
1427 return get_repo_slug(_request)
1394
1428
1395 def check_permissions(self, user):
1429 def check_permissions(self, user):
1396 perms = user.permissions
1430 perms = user.permissions
1397 repo_name = get_repo_slug(request)
1431 repo_name = self._get_repo_name()
1398 try:
1432 try:
1399 user_perms = set([perms['repositories'][repo_name]])
1433 user_perms = set([perms['repositories'][repo_name]])
1400 except KeyError:
1434 except KeyError:
@@ -1409,10 +1443,13 b' class HasRepoPermissionAnyDecorator(Perm'
1409 Checks for access permission for any of given predicates for specific
1443 Checks for access permission for any of given predicates for specific
1410 repository. In order to fulfill the request any of predicates must be meet
1444 repository. In order to fulfill the request any of predicates must be meet
1411 """
1445 """
1446 def _get_repo_name(self):
1447 _request = self._get_request()
1448 return get_repo_slug(_request)
1412
1449
1413 def check_permissions(self, user):
1450 def check_permissions(self, user):
1414 perms = user.permissions
1451 perms = user.permissions
1415 repo_name = get_repo_slug(request)
1452 repo_name = self._get_repo_name()
1416 try:
1453 try:
1417 user_perms = set([perms['repositories'][repo_name]])
1454 user_perms = set([perms['repositories'][repo_name]])
1418 except KeyError:
1455 except KeyError:
@@ -1429,10 +1466,13 b' class HasRepoGroupPermissionAllDecorator'
1429 repository group. All of them have to be meet in order to
1466 repository group. All of them have to be meet in order to
1430 fulfill the request
1467 fulfill the request
1431 """
1468 """
1469 def _get_repo_group_name(self):
1470 _request = self._get_request()
1471 return get_repo_group_slug(_request)
1432
1472
1433 def check_permissions(self, user):
1473 def check_permissions(self, user):
1434 perms = user.permissions
1474 perms = user.permissions
1435 group_name = get_repo_group_slug(request)
1475 group_name = self._get_repo_group_name()
1436 try:
1476 try:
1437 user_perms = set([perms['repositories_groups'][group_name]])
1477 user_perms = set([perms['repositories_groups'][group_name]])
1438 except KeyError:
1478 except KeyError:
@@ -1449,10 +1489,13 b' class HasRepoGroupPermissionAnyDecorator'
1449 repository group. In order to fulfill the request any
1489 repository group. In order to fulfill the request any
1450 of predicates must be met
1490 of predicates must be met
1451 """
1491 """
1492 def _get_repo_group_name(self):
1493 _request = self._get_request()
1494 return get_repo_group_slug(_request)
1452
1495
1453 def check_permissions(self, user):
1496 def check_permissions(self, user):
1454 perms = user.permissions
1497 perms = user.permissions
1455 group_name = get_repo_group_slug(request)
1498 group_name = self._get_repo_group_name()
1456 try:
1499 try:
1457 user_perms = set([perms['repositories_groups'][group_name]])
1500 user_perms = set([perms['repositories_groups'][group_name]])
1458 except KeyError:
1501 except KeyError:
@@ -1468,10 +1511,13 b' class HasUserGroupPermissionAllDecorator'
1468 Checks for access permission for all given predicates for specific
1511 Checks for access permission for all given predicates for specific
1469 user group. All of them have to be meet in order to fulfill the request
1512 user group. All of them have to be meet in order to fulfill the request
1470 """
1513 """
1514 def _get_user_group_name(self):
1515 _request = self._get_request()
1516 return get_user_group_slug(_request)
1471
1517
1472 def check_permissions(self, user):
1518 def check_permissions(self, user):
1473 perms = user.permissions
1519 perms = user.permissions
1474 group_name = get_user_group_slug(request)
1520 group_name = self._get_user_group_name()
1475 try:
1521 try:
1476 user_perms = set([perms['user_groups'][group_name]])
1522 user_perms = set([perms['user_groups'][group_name]])
1477 except KeyError:
1523 except KeyError:
@@ -1487,10 +1533,13 b' class HasUserGroupPermissionAnyDecorator'
1487 Checks for access permission for any of given predicates for specific
1533 Checks for access permission for any of given predicates for specific
1488 user group. In order to fulfill the request any of predicates must be meet
1534 user group. In order to fulfill the request any of predicates must be meet
1489 """
1535 """
1536 def _get_user_group_name(self):
1537 _request = self._get_request()
1538 return get_user_group_slug(_request)
1490
1539
1491 def check_permissions(self, user):
1540 def check_permissions(self, user):
1492 perms = user.permissions
1541 perms = user.permissions
1493 group_name = get_user_group_slug(request)
1542 group_name = self._get_user_group_name()
1494 try:
1543 try:
1495 user_perms = set([perms['user_groups'][group_name]])
1544 user_perms = set([perms['user_groups'][group_name]])
1496 except KeyError:
1545 except KeyError:
@@ -1553,6 +1602,14 b' class PermsFunction(object):'
1553 check_scope, user, check_location)
1602 check_scope, user, check_location)
1554 return False
1603 return False
1555
1604
1605 def _get_request(self):
1606 from pyramid.threadlocal import get_current_request
1607 pyramid_request = get_current_request()
1608 if not pyramid_request:
1609 # return global request of pylons incase pyramid one isn't available
1610 return request
1611 return pyramid_request
1612
1556 def _get_check_scope(self, cls_name):
1613 def _get_check_scope(self, cls_name):
1557 return {
1614 return {
1558 'HasPermissionAll': 'GLOBAL',
1615 'HasPermissionAll': 'GLOBAL',
@@ -1591,10 +1648,14 b' class HasRepoPermissionAll(PermsFunction'
1591 self.repo_name = repo_name
1648 self.repo_name = repo_name
1592 return super(HasRepoPermissionAll, self).__call__(check_location, user)
1649 return super(HasRepoPermissionAll, self).__call__(check_location, user)
1593
1650
1594 def check_permissions(self, user):
1651 def _get_repo_name(self):
1595 if not self.repo_name:
1652 if not self.repo_name:
1596 self.repo_name = get_repo_slug(request)
1653 _request = self._get_request()
1654 self.repo_name = get_repo_slug(_request)
1655 return self.repo_name
1597
1656
1657 def check_permissions(self, user):
1658 self.repo_name = self._get_repo_name()
1598 perms = user.permissions
1659 perms = user.permissions
1599 try:
1660 try:
1600 user_perms = set([perms['repositories'][self.repo_name]])
1661 user_perms = set([perms['repositories'][self.repo_name]])
@@ -1610,10 +1671,13 b' class HasRepoPermissionAny(PermsFunction'
1610 self.repo_name = repo_name
1671 self.repo_name = repo_name
1611 return super(HasRepoPermissionAny, self).__call__(check_location, user)
1672 return super(HasRepoPermissionAny, self).__call__(check_location, user)
1612
1673
1613 def check_permissions(self, user):
1674 def _get_repo_name(self):
1614 if not self.repo_name:
1675 if not self.repo_name:
1615 self.repo_name = get_repo_slug(request)
1676 self.repo_name = get_repo_slug(request)
1677 return self.repo_name
1616
1678
1679 def check_permissions(self, user):
1680 self.repo_name = self._get_repo_name()
1617 perms = user.permissions
1681 perms = user.permissions
1618 try:
1682 try:
1619 user_perms = set([perms['repositories'][self.repo_name]])
1683 user_perms = set([perms['repositories'][self.repo_name]])
@@ -1905,3 +1969,5 b' def get_cython_compat_decorator(wrapper,'
1905 return wrapper(func, *args, **kwds)
1969 return wrapper(func, *args, **kwds)
1906 local_wrapper.__wrapped__ = func
1970 local_wrapper.__wrapped__ = func
1907 return local_wrapper
1971 return local_wrapper
1972
1973
@@ -209,11 +209,12 b' def vcs_operation_context('
209 class BasicAuth(AuthBasicAuthenticator):
209 class BasicAuth(AuthBasicAuthenticator):
210
210
211 def __init__(self, realm, authfunc, registry, auth_http_code=None,
211 def __init__(self, realm, authfunc, registry, auth_http_code=None,
212 initial_call_detection=False):
212 initial_call_detection=False, acl_repo_name=None):
213 self.realm = realm
213 self.realm = realm
214 self.initial_call = initial_call_detection
214 self.initial_call = initial_call_detection
215 self.authfunc = authfunc
215 self.authfunc = authfunc
216 self.registry = registry
216 self.registry = registry
217 self.acl_repo_name = acl_repo_name
217 self._rc_auth_http_code = auth_http_code
218 self._rc_auth_http_code = auth_http_code
218
219
219 def _get_response_from_code(self, http_code):
220 def _get_response_from_code(self, http_code):
@@ -247,7 +248,7 b' class BasicAuth(AuthBasicAuthenticator):'
247 username, password = _parts
248 username, password = _parts
248 if self.authfunc(
249 if self.authfunc(
249 username, password, environ, VCS_TYPE,
250 username, password, environ, VCS_TYPE,
250 registry=self.registry):
251 registry=self.registry, acl_repo_name=self.acl_repo_name):
251 return username
252 return username
252 if username and password:
253 if username and password:
253 # we mark that we actually executed authentication once, at
254 # we mark that we actually executed authentication once, at
@@ -488,19 +489,10 b' class BaseController(WSGIController):'
488 _route_name)
489 _route_name)
489 )
490 )
490
491
491 # TODO: Maybe this should be move to pyramid to cover all views.
492 # check user attributes for password change flag
493 user_obj = auth_user.get_instance()
492 user_obj = auth_user.get_instance()
494 if user_obj and user_obj.user_data.get('force_password_change'):
493 if user_obj and user_obj.user_data.get('force_password_change'):
495 h.flash('You are required to change your password', 'warning',
494 h.flash('You are required to change your password', 'warning',
496 ignore_duplicate=True)
495 ignore_duplicate=True)
497
498 skip_user_check_urls = [
499 'error.document', 'login.logout', 'login.index',
500 'admin/my_account.my_account_password',
501 'admin/my_account.my_account_password_update'
502 ]
503 if _route_name not in skip_user_check_urls:
504 return self._dispatch_redirect(
496 return self._dispatch_redirect(
505 url('my_account_password'), environ, start_response)
497 url('my_account_password'), environ, start_response)
506
498
@@ -226,7 +226,6 b' def vcsconnection(func):'
226 for alias in rhodecode.BACKENDS.keys():
226 for alias in rhodecode.BACKENDS.keys():
227 if alias not in backends:
227 if alias not in backends:
228 del rhodecode.BACKENDS[alias]
228 del rhodecode.BACKENDS[alias]
229 utils.configure_pyro4(settings)
230 utils.configure_vcs(settings)
229 utils.configure_vcs(settings)
231 connect_vcs(
230 connect_vcs(
232 settings['vcs.server'],
231 settings['vcs.server'],
@@ -25,7 +25,7 b' from itertools import groupby'
25 from pygments import lex
25 from pygments import lex
26 from pygments.formatters.html import _get_ttype_class as pygment_token_class
26 from pygments.formatters.html import _get_ttype_class as pygment_token_class
27 from rhodecode.lib.helpers import (
27 from rhodecode.lib.helpers import (
28 get_lexer_for_filenode, html_escape)
28 get_lexer_for_filenode, html_escape, get_custom_lexer)
29 from rhodecode.lib.utils2 import AttributeDict
29 from rhodecode.lib.utils2 import AttributeDict
30 from rhodecode.lib.vcs.nodes import FileNode
30 from rhodecode.lib.vcs.nodes import FileNode
31 from rhodecode.lib.diff_match_patch import diff_match_patch
31 from rhodecode.lib.diff_match_patch import diff_match_patch
@@ -407,8 +407,12 b' class DiffSet(object):'
407 if filename not in self._lexer_cache:
407 if filename not in self._lexer_cache:
408 if filenode:
408 if filenode:
409 lexer = filenode.lexer
409 lexer = filenode.lexer
410 extension = filenode.extension
410 else:
411 else:
411 lexer = FileNode.get_lexer(filename=filename)
412 lexer = FileNode.get_lexer(filename=filename)
413 extension = filename.split('.')[-1]
414
415 lexer = get_custom_lexer(extension) or lexer
412 self._lexer_cache[filename] = lexer
416 self._lexer_cache[filename] = lexer
413 return self._lexer_cache[filename]
417 return self._lexer_cache[filename]
414
418
@@ -292,13 +292,13 b' class DbManage(object):'
292 TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR2_EMAIL
292 TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR2_EMAIL
293
293
294 self.create_user(TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS,
294 self.create_user(TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS,
295 TEST_USER_ADMIN_EMAIL, True)
295 TEST_USER_ADMIN_EMAIL, True, api_key=True)
296
296
297 self.create_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,
297 self.create_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,
298 TEST_USER_REGULAR_EMAIL, False)
298 TEST_USER_REGULAR_EMAIL, False, api_key=True)
299
299
300 self.create_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS,
300 self.create_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS,
301 TEST_USER_REGULAR2_EMAIL, False)
301 TEST_USER_REGULAR2_EMAIL, False, api_key=True)
302
302
303 def create_ui_settings(self, repo_store_path):
303 def create_ui_settings(self, repo_store_path):
304 """
304 """
@@ -306,6 +306,8 b' class DbManage(object):'
306 and disables dotencode
306 and disables dotencode
307 """
307 """
308 settings_model = SettingsModel(sa=self.sa)
308 settings_model = SettingsModel(sa=self.sa)
309 from rhodecode.lib.vcs.backends.hg import largefiles_store
310 from rhodecode.lib.vcs.backends.git import lfs_store
309
311
310 # Build HOOKS
312 # Build HOOKS
311 hooks = [
313 hooks = [
@@ -315,6 +317,7 b' class DbManage(object):'
315 (RhodeCodeUi.HOOK_PRE_PULL, 'python:vcsserver.hooks.pre_pull'),
317 (RhodeCodeUi.HOOK_PRE_PULL, 'python:vcsserver.hooks.pre_pull'),
316 (RhodeCodeUi.HOOK_PULL, 'python:vcsserver.hooks.log_pull_action'),
318 (RhodeCodeUi.HOOK_PULL, 'python:vcsserver.hooks.log_pull_action'),
317 (RhodeCodeUi.HOOK_PRE_PUSH, 'python:vcsserver.hooks.pre_push'),
319 (RhodeCodeUi.HOOK_PRE_PUSH, 'python:vcsserver.hooks.pre_push'),
320 (RhodeCodeUi.HOOK_PRETX_PUSH, 'python:vcsserver.hooks.pre_push'),
318 (RhodeCodeUi.HOOK_PUSH, 'python:vcsserver.hooks.log_push_action'),
321 (RhodeCodeUi.HOOK_PUSH, 'python:vcsserver.hooks.log_push_action'),
319
322
320 ]
323 ]
@@ -335,14 +338,23 b' class DbManage(object):'
335 self.sa.add(largefiles)
338 self.sa.add(largefiles)
336
339
337 # set default largefiles cache dir, defaults to
340 # set default largefiles cache dir, defaults to
338 # /repo location/.cache/largefiles
341 # /repo_store_location/.cache/largefiles
339 largefiles = RhodeCodeUi()
342 largefiles = RhodeCodeUi()
340 largefiles.ui_section = 'largefiles'
343 largefiles.ui_section = 'largefiles'
341 largefiles.ui_key = 'usercache'
344 largefiles.ui_key = 'usercache'
342 largefiles.ui_value = os.path.join(repo_store_path, '.cache',
345 largefiles.ui_value = largefiles_store(repo_store_path)
343 'largefiles')
346
344 self.sa.add(largefiles)
347 self.sa.add(largefiles)
345
348
349 # set default lfs cache dir, defaults to
350 # /repo_store_location/.cache/lfs_store
351 lfsstore = RhodeCodeUi()
352 lfsstore.ui_section = 'vcs_git_lfs'
353 lfsstore.ui_key = 'store_location'
354 lfsstore.ui_value = lfs_store(repo_store_path)
355
356 self.sa.add(lfsstore)
357
346 # enable hgsubversion disabled by default
358 # enable hgsubversion disabled by default
347 hgsubversion = RhodeCodeUi()
359 hgsubversion = RhodeCodeUi()
348 hgsubversion.ui_section = 'extensions'
360 hgsubversion.ui_section = 'extensions'
@@ -506,12 +518,12 b' class DbManage(object):'
506 self.create_ui_settings(path)
518 self.create_ui_settings(path)
507
519
508 ui_config = [
520 ui_config = [
509 ('web', 'push_ssl', 'false'),
521 ('web', 'push_ssl', 'False'),
510 ('web', 'allow_archive', 'gz zip bz2'),
522 ('web', 'allow_archive', 'gz zip bz2'),
511 ('web', 'allow_push', '*'),
523 ('web', 'allow_push', '*'),
512 ('web', 'baseurl', '/'),
524 ('web', 'baseurl', '/'),
513 ('paths', '/', path),
525 ('paths', '/', path),
514 ('phases', 'publish', 'true')
526 ('phases', 'publish', 'True')
515 ]
527 ]
516 for section, key, value in ui_config:
528 for section, key, value in ui_config:
517 ui_conf = RhodeCodeUi()
529 ui_conf = RhodeCodeUi()
@@ -560,7 +572,9 b' class DbManage(object):'
560
572
561 if api_key:
573 if api_key:
562 log.info('setting a provided api key for the user %s', username)
574 log.info('setting a provided api key for the user %s', username)
563 user.api_key = api_key
575 from rhodecode.model.auth_token import AuthTokenModel
576 AuthTokenModel().create(
577 user=user, description='BUILTIN TOKEN')
564
578
565 def create_default_user(self):
579 def create_default_user(self):
566 log.info('creating default user')
580 log.info('creating default user')
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: 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 copied from rhodecode/templates/admin/user_groups/user_groups.mako to rhodecode/templates/admin/users/user_edit_groups.mako
NO CONTENT: file copied from rhodecode/templates/admin/user_groups/user_groups.mako to rhodecode/templates/admin/users/user_edit_groups.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
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