##// 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
@@ -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
@@ -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
@@ -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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,5 +1,5 b''
1 1 [bumpversion]
2 current_version = 4.6.1
2 current_version = 4.7.0
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
@@ -10,6 +10,8 b' include ='
10 10 omit =
11 11 rhodecode/lib/vcs/remote/*
12 12 rhodecode/lib/dbmigrate/*
13 rhodecode/lib/paster_commands/*
14 rhodecode/tests/*
13 15
14 16 [report]
15 17
@@ -4,26 +4,21 b' done = false'
4 4 [task:bump_version]
5 5 done = true
6 6
7 [task:rc_tools_pinned]
8 done = true
9
10 7 [task:fixes_on_stable]
11 done = true
12 8
13 9 [task:pip2nix_generated]
14 done = true
15 10
16 11 [task:changelog_updated]
17 done = true
18 12
19 13 [task:generate_api_docs]
20 done = true
14
15 [task:updated_translation]
21 16
22 17 [release]
23 state = prepared
24 version = 4.6.1
18 state = in_progress
19 version = 4.7.0
25 20
26 [task:updated_translation]
21 [task:rc_tools_pinned]
27 22
28 23 [task:generate_js_routes]
29 24
@@ -1,5 +1,5 b''
1 1 # top level files
2 include test.ini
2
3 3 include MANIFEST.in
4 4 include README.rst
5 5 include CHANGES.rst
@@ -539,18 +539,15 b' vcs.server = localhost:9900'
539 539
540 540 ## Web server connectivity protocol, responsible for web based VCS operatations
541 541 ## Available protocols are:
542 ## `pyro4` - use pyro4 server
543 542 ## `http` - use http-rpc backend (default)
544 543 vcs.server.protocol = http
545 544
546 545 ## Push/Pull operations protocol, available options are:
547 ## `pyro4` - use pyro4 server
548 546 ## `http` - use http-rpc backend (default)
549 547 ##
550 548 vcs.scm_app_implementation = http
551 549
552 550 ## Push/Pull operations hooks protocol, available options are:
553 ## `pyro4` - use pyro4 server
554 551 ## `http` - use http-rpc backend (default)
555 552 vcs.hooks.protocol = http
556 553
@@ -666,7 +663,7 b' formatter = color_formatter_sql'
666 663 ################
667 664
668 665 [formatter_generic]
669 class = rhodecode.lib.logging_formatter.Pyro4AwareFormatter
666 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
670 667 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
671 668 datefmt = %Y-%m-%d %H:%M:%S
672 669
@@ -36,7 +36,7 b' tmp_upload_dir = None'
36 36
37 37 # Custom log format
38 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 41 # self adjust workers based on CPU count
42 42 # workers = multiprocessing.cpu_count() * 2 + 1
@@ -508,18 +508,15 b' vcs.server = localhost:9900'
508 508
509 509 ## Web server connectivity protocol, responsible for web based VCS operatations
510 510 ## Available protocols are:
511 ## `pyro4` - use pyro4 server
512 511 ## `http` - use http-rpc backend (default)
513 512 vcs.server.protocol = http
514 513
515 514 ## Push/Pull operations protocol, available options are:
516 ## `pyro4` - use pyro4 server
517 515 ## `http` - use http-rpc backend (default)
518 516 ##
519 517 vcs.scm_app_implementation = http
520 518
521 519 ## Push/Pull operations hooks protocol, available options are:
522 ## `pyro4` - use pyro4 server
523 520 ## `http` - use http-rpc backend (default)
524 521 vcs.hooks.protocol = http
525 522
@@ -635,7 +632,7 b' formatter = generic'
635 632 ################
636 633
637 634 [formatter_generic]
638 class = rhodecode.lib.logging_formatter.Pyro4AwareFormatter
635 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
639 636 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
640 637 datefmt = %Y-%m-%d %H:%M:%S
641 638
@@ -124,6 +124,7 b' let'
124 124 name = "rhodecode-enterprise-ce-${version}";
125 125 releaseName = "RhodeCodeEnterpriseCE-${version}";
126 126 src = rhodecode-enterprise-ce-src;
127 dontStrip = true; # prevent strip, we don't need it.
127 128
128 129 buildInputs =
129 130 attrs.buildInputs ++
@@ -225,8 +226,8 b' let'
225 226 rhodecode-testdata-src = sources.rhodecode-testdata or (
226 227 pkgs.fetchhg {
227 228 url = "https://code.rhodecode.com/upstream/rc_testdata";
228 rev = "v0.9.0";
229 sha256 = "0k0ccb7cncd6mmzwckfbr6l7fsymcympwcm948qc3i0f0m6bbg1y";
229 rev = "v0.10.0";
230 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
230 231 });
231 232
232 233 # Apply all overrides and fix the final package set
@@ -17,7 +17,6 b' implemented in :mod:`rhodecode.lib.middl'
17 17 .. toctree::
18 18 :maxdepth: 2
19 19
20 http-transition
21 20 middleware
22 21 vcsserver
23 22 subversion
@@ -59,7 +59,7 b' Below config if for an Apache Reverse Pr'
59 59
60 60 # Url to running RhodeCode instance. This is shown as `- URL:` when
61 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 63 ProxyPassReverse / http://127.0.0.1:10002/
64 64
65 65 # strict http prevents from https -> http downgrade
@@ -47,7 +47,7 b' the ``debug`` level.'
47 47 ### LOGGING CONFIGURATION ####
48 48 ################################
49 49 [loggers]
50 keys = root, routes, rhodecode, sqlalchemy, beaker, pyro4, templates
50 keys = root, routes, rhodecode, sqlalchemy, beaker, templates
51 51
52 52 [handlers]
53 53 keys = console, console_sql, file, file_rotating
@@ -75,12 +75,6 b' the ``debug`` level.'
75 75 qualname = beaker.container
76 76 propagate = 1
77 77
78 [logger_pyro4]
79 level = DEBUG
80 handlers =
81 qualname = Pyro4
82 propagate = 1
83
84 78 [logger_templates]
85 79 level = INFO
86 80 handlers =
@@ -114,8 +114,20 b' 4. Add the following configuration optio'
114 114
115 115 This would create a special template file called ```mod_dav_svn.conf```. We
116 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
118 :menuselection:`Admin --> Settings --> VCS` page.
117 It's also possible to manually generate the config from the
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 133 Using |svn|
@@ -7,26 +7,8 b' Change the |hg| Large Files Location'
7 7 :file:`/home/{user}/repos/.cache/largefiles`. If you wish to change this, use
8 8 the following steps:
9 9
10 1. Open ishell from the terminal and use it to log into the |RCE| database by
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:
10 1. Open :menuselection:`Admin --> Settings --> VCS` as super-admin.
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 17 tuning-mount-cache-memory
18 18 tuning-change-encoding
19 19 tuning-change-large-file-dir
20 tuning-change-lfs-dir
20 21 tuning-hg-auth-loop
21 22
@@ -232,7 +232,7 b' For a more detailed explanation of the l'
232 232 ### LOGGING CONFIGURATION ####
233 233 ################################
234 234 [loggers]
235 keys = root, vcsserver, pyro4, beaker
235 keys = root, vcsserver, beaker
236 236
237 237 [handlers]
238 238 keys = console
@@ -259,12 +259,6 b' For a more detailed explanation of the l'
259 259 qualname = beaker
260 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 264 ## HANDLERS ##
@@ -75,7 +75,7 b' Example call for auto pulling from remot'
75 75 .. code-block:: bash
76 76
77 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 80 Provide those parameters:
81 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 25 .. code-block:: bash
26 26
27 27 "id": <id_given_in_input>,
28 "result":
29 {
28 "result": {
30 29 "pull_request_id": "<int>",
31 30 "closed": "<bool>"
32 31 },
@@ -68,13 +67,12 b' comment_pull_request'
68 67 .. code-block:: bash
69 68
70 69 id : <id_given_in_input>
71 result :
72 {
70 result : {
73 71 "pull_request_id": "<Integer>",
74 72 "comment_id": "<Integer>",
75 73 "status": {"given": <given_status>,
76 74 "was_changed": <bool status_was_actually_changed> },
77 }
75 },
78 76 error : null
79 77
80 78
@@ -109,9 +107,8 b' create_pull_request'
109 107 :param reviewers: Set the new pull request reviewers list.
110 108 :type reviewers: Optional(list)
111 109 Accepts username strings or objects of the format:
112 {
113 'username': 'nick', 'reasons': ['original author']
114 }
110
111 {'username': 'nick', 'reasons': ['original author']}
115 112
116 113
117 114 get_pull_request
@@ -306,8 +303,7 b' merge_pull_request'
306 303 .. code-block:: bash
307 304
308 305 "id": <id_given_in_input>,
309 "result":
310 {
306 "result": {
311 307 "executed": "<bool>",
312 308 "failure_reason": "<int>",
313 309 "merge_commit_id": "<merge_commit_id>",
@@ -350,8 +346,7 b' update_pull_request'
350 346 .. code-block:: bash
351 347
352 348 id : <id_given_in_input>
353 result :
354 {
349 result : {
355 350 "msg": "Updated pull request `63`",
356 351 "pull_request": <pull_request_object>,
357 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 140 get_server_info
89 141 ---------------
90 142
@@ -41,6 +41,7 b' create_user'
41 41 :type force_password_change: Optional(``True`` | ``False``)
42 42 :param create_personal_repo_group: Create personal repo group for this user
43 43 :type create_personal_repo_group: Optional(``True`` | ``False``)
44
44 45 Example output:
45 46
46 47 .. code-block:: bash
@@ -145,8 +146,8 b' get_user'
145 146 "result": {
146 147 "active": true,
147 148 "admin": false,
148 "api_key": "api-key",
149 149 "api_keys": [ list of keys ],
150 "auth_tokens": [ list of tokens with details ],
150 151 "email": "user@example.com",
151 152 "emails": [
152 153 "user@example.com"
@@ -157,6 +158,7 b' get_user'
157 158 "ip_addresses": [],
158 159 "language": null,
159 160 "last_login": "Timestamp",
161 "last_activity": "Timestamp",
160 162 "lastname": "surnae",
161 163 "permissions": {
162 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 214 get_user_locks
187 215 --------------
188 216
@@ -19,4 +19,11 b' authentication.'
19 19 # Set the Active Directory user surname
20 20 Last Name Attribute = user_surname
21 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 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 113 .. _RFC 2254: http://www.rfc-base.org/rfc-2254.html No newline at end of file
@@ -114,6 +114,30 b' following command from inside the cloned'
114 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 142 Creating a Development Configuration
119 143 ------------------------------------
@@ -21,7 +21,7 b' New Features'
21 21 - Pull request reviewers (EE only): added new default reviewers functionality.
22 22 Allows picking users or user groups defined as reviewers for new pull request.
23 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 25 Master branch -> repo owner, fixes #1131.
26 26 - Pull request reviewers: store and show reasons why given person is a reviewer.
27 27 Manually adding reviewers after creating a PR will now be also indicated
@@ -85,7 +85,7 b' General'
85 85 input for text box.
86 86 - Api: WARNING DEPRECATION, refactor repository group schemas. Fixes #4133.
87 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 89 This is the only way to add resource under another repository group.
90 90 Furthermore giving non-existing path will no longer create the missing
91 91 structure. This change makes the api more consistent, it better validates
@@ -9,6 +9,7 b' Release Notes'
9 9 .. toctree::
10 10 :maxdepth: 1
11 11
12 release-notes-4.7.0.rst
12 13 release-notes-4.6.1.rst
13 14 release-notes-4.6.0.rst
14 15 release-notes-4.5.2.rst
@@ -9,6 +9,36 b' has a large files extension which tracks'
9 9 means that the large files are only downloaded when they are needed as part
10 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 42 To find out more, see the |hg| `Large Files Extensions Documentation`_.
13 43
14 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 13 deploy-from-host
14 14 hg-large-ext
15 git-lfs-ext
15 16 multi-instance-setup
16 17 scaling-best-practices
17 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 58 ipython = super.ipython.override (attrs: {
52 59 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
53 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 72 kombu = super.kombu.override (attrs: {
58 73 # The current version of kombu needs some patching to work with the
59 74 # other libs. Should be removed once we update celery and kombu.
@@ -197,19 +197,6 b''
197 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 200 Routes = super.buildPythonPackage {
214 201 name = "Routes-1.13";
215 202 buildInputs = with self; [];
@@ -444,6 +431,19 b''
444 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 447 bottle = super.buildPythonPackage {
448 448 name = "bottle-0.12.8";
449 449 buildInputs = with self; [];
@@ -535,6 +535,19 b''
535 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 551 cov-core = super.buildPythonPackage {
539 552 name = "cov-core-1.15.0";
540 553 buildInputs = with self; [];
@@ -562,29 +575,29 b''
562 575 };
563 576 };
564 577 cssselect = super.buildPythonPackage {
565 name = "cssselect-0.9.1";
578 name = "cssselect-1.0.1";
566 579 buildInputs = with self; [];
567 580 doCheck = false;
568 581 propagatedBuildInputs = with self; [];
569 582 src = fetchurl {
570 url = "https://pypi.python.org/packages/aa/e5/9ee1460d485b94a6d55732eb7ad5b6c084caf73dd6f9cb0bb7d2a78fafe8/cssselect-0.9.1.tar.gz";
571 md5 = "c74f45966277dc7a0f768b9b0f3522ac";
583 url = "https://pypi.python.org/packages/77/ff/9c865275cd19290feba56344eba570e719efb7ca5b34d67ed12b22ebbb0d/cssselect-1.0.1.tar.gz";
584 md5 = "3fa03bf82a9f0b1223c0f1eb1369e139";
572 585 };
573 586 meta = {
574 587 license = [ pkgs.lib.licenses.bsdOriginal ];
575 588 };
576 589 };
577 590 decorator = super.buildPythonPackage {
578 name = "decorator-3.4.2";
591 name = "decorator-4.0.11";
579 592 buildInputs = with self; [];
580 593 doCheck = false;
581 594 propagatedBuildInputs = with self; [];
582 595 src = fetchurl {
583 url = "https://pypi.python.org/packages/35/3a/42566eb7a2cbac774399871af04e11d7ae3fc2579e7dae85213b8d1d1c57/decorator-3.4.2.tar.gz";
584 md5 = "9e0536870d2b83ae27d58dbf22582f4d";
596 url = "https://pypi.python.org/packages/cc/ac/5a16f1fc0506ff72fcc8fd4e858e3a1c231f224ab79bb7c4c9b2094cc570/decorator-4.0.11.tar.gz";
597 md5 = "73644c8f0bd4983d1b6a34b49adec0ae";
585 598 };
586 599 meta = {
587 license = [ pkgs.lib.licenses.bsdOriginal ];
600 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "new BSD License"; } ];
588 601 };
589 602 };
590 603 deform = super.buildPythonPackage {
@@ -678,6 +691,19 b''
678 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 707 enum34 = super.buildPythonPackage {
682 708 name = "enum34-1.1.6";
683 709 buildInputs = with self; [];
@@ -691,6 +717,19 b''
691 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 733 future = super.buildPythonPackage {
695 734 name = "future-0.14.3";
696 735 buildInputs = with self; [];
@@ -782,6 +821,19 b''
782 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 837 infrae.cache = super.buildPythonPackage {
786 838 name = "infrae.cache-1.0.1";
787 839 buildInputs = with self; [];
@@ -873,6 +925,45 b''
873 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 967 kombu = super.buildPythonPackage {
877 968 name = "kombu-1.5.1";
878 969 buildInputs = with self; [];
@@ -887,13 +978,13 b''
887 978 };
888 979 };
889 980 lxml = super.buildPythonPackage {
890 name = "lxml-3.4.4";
981 name = "lxml-3.7.3";
891 982 buildInputs = with self; [];
892 983 doCheck = false;
893 984 propagatedBuildInputs = with self; [];
894 985 src = fetchurl {
895 url = "https://pypi.python.org/packages/63/c7/4f2a2a4ad6c6fa99b14be6b3c1cece9142e2d915aa7c43c908677afc8fa4/lxml-3.4.4.tar.gz";
896 md5 = "a9a65972afc173ec7a39c585f4eea69c";
986 url = "https://pypi.python.org/packages/39/e8/a8e0b1fa65dd021d48fe21464f71783655f39a41f218293c1c590d54eb82/lxml-3.7.3.tar.gz";
987 md5 = "075692ce442e69bbd604d44e21c02753";
897 988 };
898 989 meta = {
899 990 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -912,6 +1003,19 b''
912 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 1019 mock = super.buildPythonPackage {
916 1020 name = "mock-1.0.1";
917 1021 buildInputs = with self; [];
@@ -938,6 +1042,32 b''
938 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 1071 nose = super.buildPythonPackage {
942 1072 name = "nose-1.3.6";
943 1073 buildInputs = with self; [];
@@ -977,6 +1107,19 b''
977 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 1123 paramiko = super.buildPythonPackage {
981 1124 name = "paramiko-1.15.1";
982 1125 buildInputs = with self; [];
@@ -1043,13 +1186,13 b''
1043 1186 };
1044 1187 };
1045 1188 prompt-toolkit = super.buildPythonPackage {
1046 name = "prompt-toolkit-1.0.9";
1189 name = "prompt-toolkit-1.0.13";
1047 1190 buildInputs = with self; [];
1048 1191 doCheck = false;
1049 1192 propagatedBuildInputs = with self; [six wcwidth];
1050 1193 src = fetchurl {
1051 url = "https://pypi.python.org/packages/83/14/5ac258da6c530eca02852ee25c7a9ff3ca78287bb4c198d0d0055845d856/prompt_toolkit-1.0.9.tar.gz";
1052 md5 = "a39f91a54308fb7446b1a421c11f227c";
1194 url = "https://pypi.python.org/packages/23/be/4876b52d5cc159cbd4b0ff6e7aa419a26470849a43a8f647857a4a24467b/prompt_toolkit-1.0.13.tar.gz";
1195 md5 = "427b496d2c147bd3819bc3a7f6e0d493";
1053 1196 };
1054 1197 meta = {
1055 1198 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -1199,13 +1342,13 b''
1199 1342 };
1200 1343 };
1201 1344 pyramid = super.buildPythonPackage {
1202 name = "pyramid-1.6.1";
1345 name = "pyramid-1.7.4";
1203 1346 buildInputs = with self; [];
1204 1347 doCheck = false;
1205 1348 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
1206 1349 src = fetchurl {
1207 url = "https://pypi.python.org/packages/30/b3/fcc4a2a4800cbf21989e00454b5828cf1f7fe35c63e0810b350e56d4c475/pyramid-1.6.1.tar.gz";
1208 md5 = "b18688ff3cc33efdbb098a35b45dd122";
1350 url = "https://pypi.python.org/packages/33/91/55f5c661f8923902cd1f68d75f2b937c45e7682857356cf18f0be5493899/pyramid-1.7.4.tar.gz";
1351 md5 = "6ef1dfdcff9136d04490410757c4c446";
1209 1352 };
1210 1353 meta = {
1211 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 1370 pyramid-debugtoolbar = super.buildPythonPackage {
1228 name = "pyramid-debugtoolbar-2.4.2";
1371 name = "pyramid-debugtoolbar-3.0.5";
1229 1372 buildInputs = with self; [];
1230 1373 doCheck = false;
1231 1374 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
1232 1375 src = fetchurl {
1233 url = "https://pypi.python.org/packages/89/00/ed5426ee41ed747ba3ffd30e8230841a6878286ea67d480b1444d24f06a2/pyramid_debugtoolbar-2.4.2.tar.gz";
1234 md5 = "073ea67086cc4bd5decc3a000853642d";
1376 url = "https://pypi.python.org/packages/64/0e/df00bfb55605900e7a2f7e4a18dd83575a6651688e297d5a0aa4c208fd7d/pyramid_debugtoolbar-3.0.5.tar.gz";
1377 md5 = "aebab8c3bfdc6f89e4d3adc1d126538e";
1235 1378 };
1236 1379 meta = {
1237 1380 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
@@ -1368,16 +1511,16 b''
1368 1511 };
1369 1512 };
1370 1513 python-dateutil = super.buildPythonPackage {
1371 name = "python-dateutil-1.5";
1514 name = "python-dateutil-2.1";
1372 1515 buildInputs = with self; [];
1373 1516 doCheck = false;
1374 propagatedBuildInputs = with self; [];
1517 propagatedBuildInputs = with self; [six];
1375 1518 src = fetchurl {
1376 url = "https://pypi.python.org/packages/b4/7c/df59c89a753eb33c7c44e1dd42de0e9bc2ccdd5a4d576e0bfad97cc280cb/python-dateutil-1.5.tar.gz";
1377 md5 = "0dcb1de5e5cad69490a3b6ab63f0cfa5";
1519 url = "https://pypi.python.org/packages/65/52/9c18dac21f174ad31b65e22d24297864a954e6fe65876eba3f5773d2da43/python-dateutil-2.1.tar.gz";
1520 md5 = "1534bb15cf311f07afaa3aacba1c028b";
1378 1521 };
1379 1522 meta = {
1380 license = [ pkgs.lib.licenses.psfl ];
1523 license = [ { fullName = "Simplified BSD"; } ];
1381 1524 };
1382 1525 };
1383 1526 python-editor = super.buildPythonPackage {
@@ -1498,10 +1641,10 b''
1498 1641 };
1499 1642 };
1500 1643 rhodecode-enterprise-ce = super.buildPythonPackage {
1501 name = "rhodecode-enterprise-ce-4.6.1";
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];
1644 name = "rhodecode-enterprise-ce-4.7.0";
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 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 1648 src = ./.;
1506 1649 meta = {
1507 1650 license = [ { fullName = "Affero GNU General Public License v3 or later (AGPLv3+)"; } { fullName = "AGPLv3, and Commercial License"; } ];
@@ -1520,19 +1663,6 b''
1520 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 1666 setproctitle = super.buildPythonPackage {
1537 1667 name = "setproctitle-1.1.8";
1538 1668 buildInputs = with self; [];
@@ -1650,14 +1780,27 b''
1650 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 1796 traitlets = super.buildPythonPackage {
1654 name = "traitlets-4.3.1";
1797 name = "traitlets-4.3.2";
1655 1798 buildInputs = with self; [];
1656 1799 doCheck = false;
1657 1800 propagatedBuildInputs = with self; [ipython-genutils six decorator enum34];
1658 1801 src = fetchurl {
1659 url = "https://pypi.python.org/packages/b1/d6/5b5aa6d5c474691909b91493da1e8972e309c9f01ecfe4aeafd272eb3234/traitlets-4.3.1.tar.gz";
1660 md5 = "dd0b1b6e5d31ce446d55a4b5e5083c98";
1802 url = "https://pypi.python.org/packages/a5/98/7f5ef2fe9e9e071813aaf9cb91d1a732e0a68b6c44a32b38cb8e14c3f069/traitlets-4.3.2.tar.gz";
1803 md5 = "3068663f2f38fd939a9eb3a500ccc154";
1661 1804 };
1662 1805 meta = {
1663 1806 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -2,7 +2,6 b''
2 2 testpaths = ./rhodecode
3 3 pylons_config = rhodecode/tests/rhodecode.ini
4 4 vcsserver_protocol = http
5 vcsserver_config_pyro4 = rhodecode/tests/vcsserver_pyro4.ini
6 5 vcsserver_config_http = rhodecode/tests/vcsserver_http.ini
7 6 norecursedirs = tests/scripts
8 7 addopts = -k "not _BaseTest"
@@ -14,7 +14,8 b' channelstream==0.5.2'
14 14 click==5.1
15 15 colander==1.2
16 16 configobj==5.0.6
17 decorator==3.4.2
17 cssselect==1.0.1
18 decorator==4.0.11
18 19 deform==2.0a2
19 20 docutils==0.12
20 21 dogpile.cache==0.6.1
@@ -29,6 +30,7 b' iso8601==0.1.11'
29 30 itsdangerous==0.24
30 31 Jinja2==2.7.3
31 32 kombu==1.5.1
33 lxml==3.7.3
32 34 Mako==1.0.6
33 35 Markdown==2.6.7
34 36 MarkupSafe==0.23
@@ -42,6 +44,7 b' paramiko==1.15.1'
42 44 Paste==2.0.3
43 45 PasteDeploy==1.5.2
44 46 PasteScript==1.7.5
47 pathlib2==2.1.0
45 48 psutil==4.3.1
46 49 psycopg2==2.6.1
47 50 py-bcrypt==0.4
@@ -52,12 +55,12 b' pygments-markdown-lexer==0.1.0.dev39'
52 55 Pygments==2.2.0
53 56 pyparsing==1.5.7
54 57 pyramid-beaker==0.8
55 pyramid-debugtoolbar==2.4.2
58 pyramid-debugtoolbar==3.0.5
56 59 pyramid-jinja2==2.5
57 60 pyramid-mako==1.0.2
58 pyramid==1.6.1
61 pyramid==1.7.4
59 62 pysqlite==2.6.3
60 python-dateutil==1.5
63 python-dateutil==2.1
61 64 python-ldap==2.4.19
62 65 python-memcached==1.57
63 66 python-pam==1.8.2
@@ -97,6 +100,12 b' https://code.rhodecode.com/upstream/pylo'
97 100 # not released py-gfm==0.1.3
98 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 110 ## cli tools
102 111 alembic==0.8.4
@@ -123,9 +132,5 b' https://code.rhodecode.com/rhodecode-too'
123 132 ## appenlight
124 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 135 ## test related requirements
131 136 -r requirements_test.txt
@@ -13,5 +13,3 b' mock==1.0.1'
13 13 WebTest==1.4.3
14 14 cov-core==1.15.0
15 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 51 EXTENSIONS = {}
52 52
53 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 55 __platform__ = platform.system()
56 56 __license__ = 'AGPLv3, and Commercial License'
57 57 __author__ = 'RhodeCode GmbH'
@@ -22,6 +22,7 b' import inspect'
22 22 import itertools
23 23 import logging
24 24 import types
25 import fnmatch
25 26
26 27 import decorator
27 28 import venusian
@@ -47,6 +48,18 b" DEFAULT_RENDERER = 'jsonrpc_renderer'"
47 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 63 class ExtJsonRenderer(object):
51 64 """
52 65 Custom renderer that mkaes use of our ext_json lib
@@ -143,7 +156,19 b' def exception_view(exc, request):'
143 156 log.debug('json-rpc method `%s` not found in list of '
144 157 'api calls: %s, rpc_id:%s',
145 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 173 return jsonrpc_error(request, fault_message, rpc_id)
149 174
@@ -184,18 +209,18 b' def request_view(request):'
184 209 request.rpc_user = auth_u
185 210
186 211 # now check if token is valid for API
187 role = UserApiKeys.ROLE_API
188 extra_auth_tokens = [
189 x.api_key for x in User.extra_valid_auth_tokens(api_user, role=role)]
190 active_tokens = [api_user.api_key] + extra_auth_tokens
212 auth_token = request.rpc_api_key
213 token_match = api_user.authenticate_by_token(
214 auth_token, roles=[UserApiKeys.ROLE_API])
215 invalid_token = not token_match
191 216
192 log.debug('Checking if API key has proper role')
193 if request.rpc_api_key not in active_tokens:
217 log.debug('Checking if API KEY is valid with proper role')
218 if invalid_token:
194 219 return jsonrpc_error(
195 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 224 log.exception('Error on API AUTH')
200 225 return jsonrpc_error(
201 226 request, retid=request.rpc_id, message='Invalid API KEY')
@@ -351,9 +376,10 b' class RoutePredicate(object):'
351 376 class NotFoundPredicate(object):
352 377 def __init__(self, val, config):
353 378 self.val = val
379 self.methods = config.registry.jsonrpc_methods
354 380
355 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 384 phash = text
359 385
@@ -22,14 +22,19 b' import pytest'
22 22
23 23 from rhodecode.model.meta import Session
24 24 from rhodecode.model.user import UserModel
25 from rhodecode.model.auth_token import AuthTokenModel
25 26 from rhodecode.tests import TEST_USER_ADMIN_LOGIN
26 27
27 28
28 29 @pytest.fixture(scope="class")
29 30 def testuser_api(request, pylonsapp):
30 31 cls = request.cls
32
33 # ADMIN USER
31 34 cls.usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
32 35 cls.apikey = cls.usr.api_key
36
37 # REGULAR USER
33 38 cls.test_user = UserModel().create_or_update(
34 39 username='test-api',
35 40 password='test',
@@ -37,6 +42,11 b' def testuser_api(request, pylonsapp):'
37 42 firstname='first',
38 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 50 Session().commit()
41 51 cls.TEST_USER_LOGIN = cls.test_user.username
42 52 cls.apikey_regular = cls.test_user.api_key
@@ -80,7 +80,13 b' class TestApi(object):'
80 80 def test_api_non_existing_method(self, request):
81 81 id_, params = build_data(self.apikey, 'not_existing', args='xx')
82 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 90 assert_error(id_, expected, given=response.body)
85 91
86 92 def test_api_disabled_user(self, request):
@@ -29,6 +29,7 b' from rhodecode.api.tests.utils import ('
29 29
30 30 @pytest.mark.usefixtures("testuser_api", "app")
31 31 class TestClosePullRequest(object):
32
32 33 @pytest.mark.backends("git", "hg")
33 34 def test_api_close_pull_request(self, pr_util):
34 35 pull_request = pr_util.create_pull_request()
@@ -53,11 +53,10 b' class TestApiDeleteRepo(object):'
53 53 }
54 54 assert_ok(id_, expected, given=response.body)
55 55
56 def test_api_delete_repo_by_non_admin_no_permission(
57 self, backend, user_regular):
56 def test_api_delete_repo_by_non_admin_no_permission(self, backend):
58 57 repo = backend.create_repo()
59 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 60 response = api_call(self.app, params)
62 61 expected = 'repository `%s` does not exist' % (repo.repo_name)
63 62 assert_error(id_, expected, given=response.body)
@@ -23,7 +23,7 b' import pytest'
23 23
24 24 from rhodecode.model.user import UserModel
25 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 27 from rhodecode.api.tests.utils import (
28 28 build_data, api_call, assert_error, assert_ok, crash, jsonify)
29 29
@@ -33,7 +33,8 b' class TestUpdateUserGroup(object):'
33 33 @pytest.mark.parametrize("changing_attr, updates", [
34 34 ('group_name', {'group_name': 'new_group_name'}),
35 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 38 ('active', {'active': False}),
38 39 ('active', {'active': True})
39 40 ])
@@ -59,7 +60,8 b' class TestUpdateUserGroup(object):'
59 60 # TODO: mikhail: decide if we need to test against the commented params
60 61 # ('group_name', {'group_name': 'new_group_name'}),
61 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 65 ('active', {'active': False}),
64 66 ('active', {'active': True})
65 67 ])
@@ -181,17 +181,40 b' class TestGetRefHash(object):'
181 181 class TestUserByNameOrError(object):
182 182 def test_user_found_by_id(self):
183 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 197 patcher = patch('rhodecode.model.user.UserModel.get_user')
185 198 with patcher as get_user:
186 199 get_user.return_value = fake_user
187 result = utils.get_user_or_error('123')
188 assert result == fake_user
200 patcher = patch('rhodecode.model.user.UserModel.get_by_username')
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 207 def test_user_found_by_name(self):
191 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 214 patcher = patch('rhodecode.model.user.UserModel.get_by_username')
193 215 with patcher as get_by_username:
194 216 get_by_username.return_value = fake_user
217
195 218 result = utils.get_user_or_error('test')
196 219 assert result == fake_user
197 220
@@ -199,8 +222,12 b' class TestUserByNameOrError(object):'
199 222 patcher = patch('rhodecode.model.user.UserModel.get_user')
200 223 with patcher as get_user:
201 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 229 with pytest.raises(JSONRPCError) as excinfo:
203 utils.get_user_or_error('123')
230 utils.get_user_or_error(123)
204 231
205 232 expected_message = 'user `123` does not exist'
206 233 assert excinfo.value.message == expected_message
@@ -216,8 +243,7 b' class TestUserByNameOrError(object):'
216 243 assert excinfo.value.message == expected_message
217 244
218 245
219 class TestGetCommitDict:
220
246 class TestGetCommitDict(object):
221 247 @pytest.mark.parametrize('filename, expected', [
222 248 (b'sp\xc3\xa4cial', u'sp\xe4cial'),
223 249 (b'sp\xa4cial', u'sp\ufffdcial'),
@@ -213,15 +213,19 b' def get_user_or_error(userid):'
213 213 :param userid:
214 214 """
215 215 from rhodecode.model.user import UserModel
216 user_model = UserModel()
216 217
217 user_model = UserModel()
218 if isinstance(userid, (int, long)):
218 219 try:
219 user = user_model.get_user(int(userid))
220 user = user_model.get_user(userid)
220 221 except ValueError:
222 user = None
223 else:
221 224 user = user_model.get_by_username(userid)
222 225
223 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 229 return user
226 230
227 231
@@ -232,10 +236,19 b' def get_repo_or_error(repoid):'
232 236 :param repoid:
233 237 """
234 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 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 252 return repo
240 253
241 254
@@ -246,8 +259,16 b' def get_repo_group_or_error(repogroupid)'
246 259 :param repogroupid:
247 260 """
248 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 272 if repo_group is None:
252 273 raise JSONRPCError(
253 274 'repository group `%s` does not exist' % (repogroupid,))
@@ -261,10 +282,19 b' def get_user_group_or_error(usergroupid)'
261 282 :param usergroupid:
262 283 """
263 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 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 298 return user_group
269 299
270 300
@@ -245,8 +245,7 b' def merge_pull_request(request, apiuser,'
245 245 .. code-block:: bash
246 246
247 247 "id": <id_given_in_input>,
248 "result":
249 {
248 "result": {
250 249 "executed": "<bool>",
251 250 "failure_reason": "<int>",
252 251 "merge_commit_id": "<merge_commit_id>",
@@ -258,7 +257,6 b' def merge_pull_request(request, apiuser,'
258 257 }
259 258 },
260 259 "error": null
261
262 260 """
263 261 repo = get_repo_or_error(repoid)
264 262 if not isinstance(userid, Optional):
@@ -322,8 +320,7 b' def close_pull_request(request, apiuser,'
322 320 .. code-block:: bash
323 321
324 322 "id": <id_given_in_input>,
325 "result":
326 {
323 "result": {
327 324 "pull_request_id": "<int>",
328 325 "closed": "<bool>"
329 326 },
@@ -397,13 +394,12 b' def comment_pull_request('
397 394 .. code-block:: bash
398 395
399 396 id : <id_given_in_input>
400 result :
401 {
397 result : {
402 398 "pull_request_id": "<Integer>",
403 399 "comment_id": "<Integer>",
404 400 "status": {"given": <given_status>,
405 401 "was_changed": <bool status_was_actually_changed> },
406 }
402 },
407 403 error : null
408 404 """
409 405 repo = get_repo_or_error(repoid)
@@ -535,9 +531,8 b' def create_pull_request('
535 531 :param reviewers: Set the new pull request reviewers list.
536 532 :type reviewers: Optional(list)
537 533 Accepts username strings or objects of the format:
538 {
539 'username': 'nick', 'reasons': ['original author']
540 }
534
535 {'username': 'nick', 'reasons': ['original author']}
541 536 """
542 537
543 538 source = get_repo_or_error(source_repo)
@@ -634,8 +629,7 b' def update_pull_request('
634 629 .. code-block:: bash
635 630
636 631 id : <id_given_in_input>
637 result :
638 {
632 result : {
639 633 "msg": "Updated pull request `63`",
640 634 "pull_request": <pull_request_object>,
641 635 "updated_reviewers": {
@@ -18,10 +18,12 b''
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21
21 import inspect
22 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 28 from rhodecode.api.utils import (
27 29 Optional, OAttr, has_superadmin_permission, get_user_or_error)
@@ -243,3 +245,77 b' def cleanup_sessions(request, apiuser, o'
243 245 raise JSONRPCError(
244 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 29 from rhodecode.model.db import Session, User, Repository
30 30 from rhodecode.model.user import UserModel
31 31
32
33 32 log = logging.getLogger(__name__)
34 33
35 34
@@ -62,8 +61,8 b' def get_user(request, apiuser, userid=Op'
62 61 "result": {
63 62 "active": true,
64 63 "admin": false,
65 "api_key": "api-key",
66 64 "api_keys": [ list of keys ],
65 "auth_tokens": [ list of tokens with details ],
67 66 "email": "user@example.com",
68 67 "emails": [
69 68 "user@example.com"
@@ -74,6 +73,7 b' def get_user(request, apiuser, userid=Op'
74 73 "ip_addresses": [],
75 74 "language": null,
76 75 "last_login": "Timestamp",
76 "last_activity": "Timestamp",
77 77 "lastname": "surnae",
78 78 "permissions": {
79 79 "global": [
@@ -191,6 +191,7 b' def create_user(request, apiuser, userna'
191 191 :type force_password_change: Optional(``True`` | ``False``)
192 192 :param create_personal_repo_group: Create personal repo group for this user
193 193 :type create_personal_repo_group: Optional(``True`` | ``False``)
194
194 195 Example output:
195 196
196 197 .. code-block:: bash
@@ -470,3 +471,45 b' def get_user_locks(request, apiuser, use'
470 471 ret.append(_api_data)
471 472
472 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 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 23 from rhodecode.config.routing import ADMIN_PREFIX
24 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 88 def includeme(config):
28 89 settings = config.get_settings()
29 90
@@ -32,26 +93,7 b' def includeme(config):'
32 93 navigation_registry = NavigationRegistry(labs_active=labs_active)
33 94 config.registry.registerUtility(navigation_registry)
34 95
35 config.add_route(
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')
96 config.include(admin_routes, route_prefix=ADMIN_PREFIX)
55 97
56 98 # Scan module for configuration decorators.
57 99 config.scan()
1 NO CONTENT: file renamed from rhodecode/admin/interfaces.py to rhodecode/apps/admin/interfaces.py
@@ -25,7 +25,7 b' import collections'
25 25 from pylons import url
26 26 from zope.interface import implementer
27 27
28 from rhodecode.admin.interfaces import IAdminNavigationRegistry
28 from rhodecode.apps.admin.interfaces import IAdminNavigationRegistry
29 29 from rhodecode.lib.utils import get_registry
30 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
@@ -24,15 +24,15 b' import logging'
24 24 from pylons import tmpl_context as c
25 25 from pyramid.view import view_config
26 26
27 from rhodecode.admin.views.base import AdminSettingsView
28 from rhodecode.admin.navigation import navigation_list
27 from rhodecode.apps._base import BaseAppView
28 from rhodecode.apps.admin.navigation import navigation_list
29 29 from rhodecode.lib.auth import (LoginRequired, HasPermissionAllDecorator)
30 30 from rhodecode.lib.utils import read_opensource_licenses
31 31
32 32 log = logging.getLogger(__name__)
33 33
34 34
35 class OpenSourceLicensesAdminSettingsView(AdminSettingsView):
35 class OpenSourceLicensesAdminSettingsView(BaseAppView):
36 36
37 37 @LoginRequired()
38 38 @HasPermissionAllDecorator('hg.admin')
@@ -24,9 +24,8 b' from pylons import tmpl_context as c'
24 24 from pyramid.view import view_config
25 25 from pyramid.httpexceptions import HTTPFound
26 26
27 from rhodecode.translation import _
28
29 from rhodecode.admin.views.base import AdminSettingsView
27 from rhodecode.apps._base import BaseAppView
28 from rhodecode.apps.admin.navigation import navigation_list
30 29 from rhodecode.lib.auth import (
31 30 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
32 31 from rhodecode.lib.utils2 import safe_int
@@ -34,13 +33,10 b' from rhodecode.lib import system_info'
34 33 from rhodecode.lib import user_sessions
35 34
36 35
37 from rhodecode.admin.navigation import navigation_list
38
39
40 36 log = logging.getLogger(__name__)
41 37
42 38
43 class AdminSessionSettingsView(AdminSettingsView):
39 class AdminSessionSettingsView(BaseAppView):
44 40
45 41 @LoginRequired()
46 42 @HasPermissionAllDecorator('hg.admin')
@@ -22,16 +22,15 b' import logging'
22 22
23 23 from pyramid.view import view_config
24 24
25 from rhodecode.svn_support.utils import generate_mod_dav_svn_config
26
27 from rhodecode.admin.views.base import AdminSettingsView
25 from rhodecode.apps._base import BaseAppView
26 from rhodecode.apps.svn_support.utils import generate_mod_dav_svn_config
28 27 from rhodecode.lib.auth import (
29 28 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
30 29
31 30 log = logging.getLogger(__name__)
32 31
33 32
34 class SvnConfigAdminSettingsView(AdminSettingsView):
33 class SvnConfigAdminSettingsView(BaseAppView):
35 34
36 35 @LoginRequired()
37 36 @CSRFRequired()
@@ -26,20 +26,19 b' from pylons import tmpl_context as c'
26 26 from pyramid.view import view_config
27 27
28 28 import rhodecode
29 from rhodecode.apps._base import BaseAppView
30 from rhodecode.apps.admin.navigation import navigation_list
29 31 from rhodecode.lib import helpers as h
30 32 from rhodecode.lib.auth import (LoginRequired, HasPermissionAllDecorator)
31 33 from rhodecode.lib.utils2 import str2bool
32 34 from rhodecode.lib import system_info
33 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 36 from rhodecode.model.settings import SettingsModel
38 37
39 38 log = logging.getLogger(__name__)
40 39
41 40
42 class AdminSystemInfoSettingsView(AdminSettingsView):
41 class AdminSystemInfoSettingsView(BaseAppView):
43 42
44 43 @staticmethod
45 44 def get_update_data(update_url):
@@ -107,6 +106,8 b' class AdminSystemInfoSettingsView(AdminS'
107 106 (_('RhodeCode Server IP'), val('server')['server_ip'], state('server')),
108 107 (_('RhodeCode Server ID'), val('server')['server_id'], state('server')),
109 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 111 ('', '', ''), # spacer
111 112
112 113 # Database
@@ -122,7 +123,7 b' class AdminSystemInfoSettingsView(AdminS'
122 123 ('', '', ''), # spacer
123 124
124 125 # Systems stats
125 (_('CPU'), val('cpu'), state('cpu')),
126 (_('CPU'), val('cpu')['text'], state('cpu')),
126 127 (_('Load'), val('load')['text'], state('load')),
127 128 (_('Memory'), val('memory')['text'], state('memory')),
128 129 (_('Uptime'), val('uptime')['text'], state('uptime')),
@@ -85,4 +85,6 b' def includeme(config):'
85 85 config.add_route(
86 86 name='channelstream_proxy',
87 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
1 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
@@ -22,8 +22,9 b''
22 22 import mock
23 23 import pytest
24 24
25 from rhodecode.apps.login.views import LoginView, CaptchaData
25 26 from rhodecode.config.routing import ADMIN_PREFIX
26 from rhodecode.login.views import LoginView, CaptchaData
27 from rhodecode.lib.utils2 import AttributeDict
27 28 from rhodecode.model.settings import SettingsModel
28 29 from rhodecode.tests.utils import AssertResponse
29 30
@@ -40,7 +41,7 b' class RhodeCodeSetting(object):'
40 41 model.create_or_update_setting(name=self.name, val=self.value)
41 42 return self
42 43
43 def __exit__(self, type, value, traceback):
44 def __exit__(self, exc_type, exc_val, exc_tb):
44 45 model = SettingsModel()
45 46 if self.old_setting:
46 47 model.create_or_update_setting(
@@ -57,8 +58,12 b' class TestRegisterCaptcha(object):'
57 58 ('privkey', '', CaptchaData(True, 'privkey', '')),
58 59 ('privkey', 'pubkey', CaptchaData(True, 'privkey', 'pubkey')),
59 60 ])
60 def test_get_captcha_data(self, private_key, public_key, expected, db):
61 login_view = LoginView(mock.Mock(), mock.Mock())
61 def test_get_captcha_data(self, private_key, public_key, expected, db,
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 67 with RhodeCodeSetting('captcha_private_key', private_key):
63 68 with RhodeCodeSetting('captcha_public_key', public_key):
64 69 captcha = login_view._get_captcha_data()
@@ -92,7 +97,7 b' class TestRegisterCaptcha(object):'
92 97 assertr.no_element_exists('#recaptcha_field')
93 98
94 99 @pytest.mark.parametrize('valid', [False, True])
95 @mock.patch('rhodecode.login.views.submit')
100 @mock.patch('rhodecode.apps.login.views.submit')
96 101 @mock.patch.object(LoginView, '_get_captcha_data')
97 102 def test_register_with_active_captcha(
98 103 self, m_get_captcha_data, m_submit, valid, app, csrf_token):
@@ -18,6 +18,7 b''
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 import time
21 22 import collections
22 23 import datetime
23 24 import formencode
@@ -29,6 +30,7 b' from pyramid.httpexceptions import HTTPF'
29 30 from pyramid.view import view_config
30 31 from recaptcha.client.captcha import submit
31 32
33 from rhodecode.apps._base import BaseAppView
32 34 from rhodecode.authentication.base import authenticate, HTTP_TYPE
33 35 from rhodecode.events import UserRegistered
34 36 from rhodecode.lib import helpers as h
@@ -37,9 +39,10 b' from rhodecode.lib.auth import ('
37 39 from rhodecode.lib.base import get_ip_addr
38 40 from rhodecode.lib.exceptions import UserCreationError
39 41 from rhodecode.lib.utils2 import safe_str
40 from rhodecode.model.db import User
42 from rhodecode.model.db import User, UserApiKeys
41 43 from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
42 44 from rhodecode.model.meta import Session
45 from rhodecode.model.auth_token import AuthTokenModel
43 46 from rhodecode.model.settings import SettingsModel
44 47 from rhodecode.model.user import UserModel
45 48 from rhodecode.translation import _
@@ -103,20 +106,13 b' def get_came_from(request):'
103 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):
109 self.request = request
110 self.context = context
111 self.session = request.session
112 self._rhodecode_user = request.user
113
114 def _get_template_context(self):
115 return {
116 'came_from': get_came_from(self.request),
117 'defaults': {},
118 'errors': {},
119 }
111 def load_default_context(self):
112 c = self._get_local_tmpl_context()
113 c.came_from = get_came_from(self.request)
114 self._register_global_c(c)
115 return c
120 116
121 117 def _get_captcha_data(self):
122 118 settings = SettingsModel().get_all_settings()
@@ -130,12 +126,13 b' class LoginView(object):'
130 126 route_name='login', request_method='GET',
131 127 renderer='rhodecode:templates/login.mako')
132 128 def login(self):
133 came_from = get_came_from(self.request)
134 user = self.request.user
129 c = self.load_default_context()
130 auth_user = self._rhodecode_user
135 131
136 132 # redirect if already logged in
137 if user.is_authenticated and not user.is_default and user.ip_allowed:
138 raise HTTPFound(came_from)
133 if (auth_user.is_authenticated and
134 not auth_user.is_default and auth_user.ip_allowed):
135 raise HTTPFound(c.came_from)
139 136
140 137 # check if we use headers plugin, and try to login using it.
141 138 try:
@@ -145,18 +142,18 b' class LoginView(object):'
145 142 if auth_info:
146 143 headers = _store_user_in_session(
147 144 self.session, auth_info.get('username'))
148 raise HTTPFound(came_from, headers=headers)
145 raise HTTPFound(c.came_from, headers=headers)
149 146 except UserCreationError as e:
150 147 log.error(e)
151 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 152 @view_config(
156 153 route_name='login', request_method='POST',
157 154 renderer='rhodecode:templates/login.mako')
158 155 def login_post(self):
159 came_from = get_came_from(self.request)
156 c = self.load_default_context()
160 157
161 158 login_form = LoginForm()()
162 159
@@ -168,13 +165,13 b' class LoginView(object):'
168 165 self.session,
169 166 username=form_result['username'],
170 167 remember=form_result['remember'])
171 log.debug('Redirecting to "%s" after login.', came_from)
172 raise HTTPFound(came_from, headers=headers)
168 log.debug('Redirecting to "%s" after login.', c.came_from)
169 raise HTTPFound(c.came_from, headers=headers)
173 170 except formencode.Invalid as errors:
174 171 defaults = errors.value
175 172 # remove password from filling in form again
176 173 defaults.pop('password', None)
177 render_ctx = self._get_template_context()
174 render_ctx = self._get_template_context(c)
178 175 render_ctx.update({
179 176 'errors': errors.error_dict,
180 177 'defaults': defaults,
@@ -187,13 +184,13 b' class LoginView(object):'
187 184 # with user creation, explanation should be provided in
188 185 # Exception itself
189 186 self.session.flash(e, queue='error')
190 return self._get_template_context()
187 return self._get_template_context(c)
191 188
192 189 @CSRFRequired()
193 190 @view_config(route_name='logout', request_method='POST')
194 191 def logout(self):
195 user = self.request.user
196 log.info('Deleting session for user: `%s`', user)
192 auth_user = self._rhodecode_user
193 log.info('Deleting session for user: `%s`', auth_user)
197 194 self.session.delete()
198 195 return HTTPFound(url('home'))
199 196
@@ -203,6 +200,7 b' class LoginView(object):'
203 200 route_name='register', request_method='GET',
204 201 renderer='rhodecode:templates/register.mako',)
205 202 def register(self, defaults=None, errors=None):
203 c = self.load_default_context()
206 204 defaults = defaults or {}
207 205 errors = errors or {}
208 206
@@ -212,7 +210,7 b' class LoginView(object):'
212 210 auto_active = 'hg.register.auto_activate' in User.get_default_user()\
213 211 .AuthUser.permissions['global']
214 212
215 render_ctx = self._get_template_context()
213 render_ctx = self._get_template_context(c)
216 214 render_ctx.update({
217 215 'defaults': defaults,
218 216 'errors': errors,
@@ -289,17 +287,24 b' class LoginView(object):'
289 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 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 302 password_reset_form = PasswordResetForm()()
294 303 try:
295 304 form_result = password_reset_form.to_python(
296 305 self.request.params)
297 if h.HasPermissionAny('hg.password_reset.disabled')():
298 log.error('Failed attempt to reset password for %s.', form_result['email'] )
299 self.session.flash(
300 _('Password reset has been disabled.'),
301 queue='error')
302 return HTTPFound(self.request.route_path('reset_password'))
306 user_email = form_result['email']
307
303 308 if captcha.active:
304 309 response = submit(
305 310 self.request.params.get('recaptcha_challenge_field'),
@@ -310,43 +315,76 b' class LoginView(object):'
310 315 _value = form_result
311 316 _msg = _('Bad captcha')
312 317 error_dict = {'recaptcha_field': _msg}
313 raise formencode.Invalid(_msg, _value, None,
314 error_dict=error_dict)
318 raise formencode.Invalid(
319 _msg, _value, None, error_dict=error_dict)
315 320
316 321 # Generate reset URL and send mail.
317 user_email = form_result['email']
318 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 334 password_reset_url = self.request.route_url(
320 335 'reset_password_confirmation',
321 _query={'key': user.api_key})
336 _query={'key': reset_token.api_key})
322 337 UserModel().reset_password_link(
323 338 form_result, password_reset_url)
324
325 339 # Display success message and redirect.
326 self.session.flash(
327 _('Your password reset link was sent'),
328 queue='success')
329 return HTTPFound(self.request.route_path('login'))
340 self.session.flash(msg, queue='success')
341 return HTTPFound(self.request.route_path('reset_password'))
330 342
331 343 except formencode.Invalid as errors:
332 344 render_ctx.update({
333 345 'defaults': errors.value,
334 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 362 return render_ctx
338 363
339 364 @view_config(route_name='reset_password_confirmation',
340 365 request_method='GET')
341 366 def password_reset_confirmation(self):
367
342 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 384 try:
344 user = User.get_by_auth_token(self.request.GET.get('key'))
345 password_reset_url = self.request.route_url(
346 'reset_password_confirmation',
347 _query={'key': user.api_key})
348 data = {'email': user.email}
349 UserModel().reset_password(data, password_reset_url)
385 owner = token.user
386 data = {'email': owner.email, 'token': token.api_key}
387 UserModel().reset_password(data)
350 388 self.session.flash(
351 389 _('Your password reset was successful, '
352 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
1 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
1 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
@@ -25,7 +25,7 b' import re'
25 25
26 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 31 class TestModDavSvnConfig(object):
@@ -81,7 +81,7 b' def _render_mod_dav_svn_config('
81 81 }
82 82
83 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 85 return render(template, context)
86 86
87 87
@@ -91,6 +91,11 b' class RhodeCodeAuthPluginBase(object):'
91 91 # set on authenticate() method and via set_auth_type func.
92 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 99 # List of setting names to store encrypted. Plugins may override this list
95 100 # to store settings encrypted.
96 101 _settings_encrypted = []
@@ -268,6 +273,9 b' class RhodeCodeAuthPluginBase(object):'
268 273 def set_auth_type(self, auth_type):
269 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 279 def allows_authentication_from(
272 280 self, user, allows_non_existing_user=True,
273 281 allowed_auth_plugins=None, allowed_auth_sources=None):
@@ -332,6 +340,8 b' class RhodeCodeAuthPluginBase(object):'
332 340 log.debug('provided username:`%s` is empty skipping...', username)
333 341 if not user:
334 342 log.debug('User `%s` not found in database', username)
343 else:
344 log.debug('Got DB user:%s', user)
335 345 return user
336 346
337 347 def user_activation_state(self):
@@ -518,7 +528,7 b' def get_auth_cache_manager(custom_ttl=No'
518 528
519 529
520 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 533 Authentication function used for access control,
524 534 It tries to authenticate based on enabled authentication modules.
@@ -538,6 +548,7 b' def authenticate(username, password, env'
538 548 authn_registry = get_authn_registry(registry)
539 549 for plugin in authn_registry.get_plugins_for_authentication():
540 550 plugin.set_auth_type(auth_type)
551 plugin.set_calling_scope_repo(acl_repo_name)
541 552 user = plugin.get_user(username)
542 553 display_user = user.username if user else username
543 554
@@ -627,3 +638,21 b' def authenticate(username, password, env'
627 638 log.debug("User `%s` failed to authenticate against %s",
628 639 display_user, plugin.get_id())
629 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 28 import logging
29 29 import urllib2
30 30
31 from pylons.i18n.translation import lazy_ugettext as _
32 from sqlalchemy.ext.hybrid import hybrid_property
33
34 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
31 from rhodecode.translation import _
32 from rhodecode.authentication.base import (
33 RhodeCodeExternalAuthPlugin, hybrid_property)
35 34 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
36 35 from rhodecode.authentication.routes import AuthnPluginResourceBase
37 36 from rhodecode.lib.colander_utils import strip_whitespace
@@ -21,15 +21,14 b''
21 21 import colander
22 22 import logging
23 23
24 from sqlalchemy.ext.hybrid import hybrid_property
25
26 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
24 from rhodecode.translation import _
25 from rhodecode.authentication.base import (
26 RhodeCodeExternalAuthPlugin, hybrid_property)
27 27 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
28 28 from rhodecode.authentication.routes import AuthnPluginResourceBase
29 29 from rhodecode.lib.colander_utils import strip_whitespace
30 30 from rhodecode.lib.utils2 import str2bool, safe_unicode
31 31 from rhodecode.model.db import User
32 from rhodecode.translation import _
33 32
34 33
35 34 log = logging.getLogger(__name__)
@@ -30,10 +30,9 b' import rhodecode'
30 30 import urllib
31 31 import urllib2
32 32
33 from pylons.i18n.translation import lazy_ugettext as _
34 from sqlalchemy.ext.hybrid import hybrid_property
35
36 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
33 from rhodecode.translation import _
34 from rhodecode.authentication.base import (
35 RhodeCodeExternalAuthPlugin, hybrid_property)
37 36 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
38 37 from rhodecode.authentication.routes import AuthnPluginResourceBase
39 38 from rhodecode.lib.colander_utils import strip_whitespace
@@ -27,10 +27,9 b' import colander'
27 27 import logging
28 28 import traceback
29 29
30 from pylons.i18n.translation import lazy_ugettext as _
31 from sqlalchemy.ext.hybrid import hybrid_property
32
33 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
30 from rhodecode.translation import _
31 from rhodecode.authentication.base import (
32 RhodeCodeExternalAuthPlugin, chop_at, hybrid_property)
34 33 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
35 34 from rhodecode.authentication.routes import AuthnPluginResourceBase
36 35 from rhodecode.lib.colander_utils import strip_whitespace
@@ -72,14 +71,15 b' class LdapSettingsSchema(AuthnPluginSett'
72 71 host = colander.SchemaNode(
73 72 colander.String(),
74 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 76 preparer=strip_whitespace,
77 77 title=_('LDAP Host'),
78 78 widget='string')
79 79 port = colander.SchemaNode(
80 80 colander.Int(),
81 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 83 preparer=strip_whitespace,
84 84 title=_('Port'),
85 85 validator=colander.Range(min=0, max=65536),
@@ -87,7 +87,9 b' class LdapSettingsSchema(AuthnPluginSett'
87 87 dn_user = colander.SchemaNode(
88 88 colander.String(),
89 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 93 missing='',
92 94 preparer=strip_whitespace,
93 95 title=_('Account'),
@@ -95,7 +97,7 b' class LdapSettingsSchema(AuthnPluginSett'
95 97 dn_pass = colander.SchemaNode(
96 98 colander.String(),
97 99 default='',
98 description=_('Password to connect to LDAP'),
100 description=_('Password to authenticate for given user DN.'),
99 101 missing='',
100 102 preparer=strip_whitespace,
101 103 title=_('Password'),
@@ -117,7 +119,9 b' class LdapSettingsSchema(AuthnPluginSett'
117 119 base_dn = colander.SchemaNode(
118 120 colander.String(),
119 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 125 missing='',
122 126 preparer=strip_whitespace,
123 127 title=_('Base DN'),
@@ -125,22 +129,25 b' class LdapSettingsSchema(AuthnPluginSett'
125 129 filter = colander.SchemaNode(
126 130 colander.String(),
127 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 135 missing='',
130 136 preparer=strip_whitespace,
131 137 title=_('LDAP Search Filter'),
132 138 widget='string')
139
133 140 search_scope = colander.SchemaNode(
134 141 colander.String(),
135 default=search_scope_choices[0],
136 description=_('How deep to search LDAP'),
142 default=search_scope_choices[2],
143 description=_('How deep to search LDAP. If unsure set to SUBTREE'),
137 144 title=_('LDAP Search Scope'),
138 145 validator=colander.OneOf(search_scope_choices),
139 146 widget='select')
140 147 attr_login = colander.SchemaNode(
141 148 colander.String(),
142 default='',
143 description=_('LDAP Attribute to map to user name'),
149 default='uid',
150 description=_('LDAP Attribute to map to user name (e.g., uid, or sAMAccountName)'),
144 151 preparer=strip_whitespace,
145 152 title=_('Login Attribute'),
146 153 missing_msg=_('The LDAP Login attribute of the CN must be specified'),
@@ -148,7 +155,7 b' class LdapSettingsSchema(AuthnPluginSett'
148 155 attr_firstname = colander.SchemaNode(
149 156 colander.String(),
150 157 default='',
151 description=_('LDAP Attribute to map to first name'),
158 description=_('LDAP Attribute to map to first name (e.g., givenName)'),
152 159 missing='',
153 160 preparer=strip_whitespace,
154 161 title=_('First Name Attribute'),
@@ -156,7 +163,7 b' class LdapSettingsSchema(AuthnPluginSett'
156 163 attr_lastname = colander.SchemaNode(
157 164 colander.String(),
158 165 default='',
159 description=_('LDAP Attribute to map to last name'),
166 description=_('LDAP Attribute to map to last name (e.g., sn)'),
160 167 missing='',
161 168 preparer=strip_whitespace,
162 169 title=_('Last Name Attribute'),
@@ -164,7 +171,9 b' class LdapSettingsSchema(AuthnPluginSett'
164 171 attr_email = colander.SchemaNode(
165 172 colander.String(),
166 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 177 missing='',
169 178 preparer=strip_whitespace,
170 179 title=_('Email Attribute'),
@@ -182,7 +191,7 b' class AuthLdap(object):'
182 191 def __init__(self, server, base_dn, port=389, bind_dn='', bind_pass='',
183 192 tls_kind='PLAIN', tls_reqcert='DEMAND', ldap_version=3,
184 193 search_scope='SUBTREE', attr_login='uid',
185 ldap_filter='(&(objectClass=user)(!(objectClass=computer)))'):
194 ldap_filter=None):
186 195 if ldap == Missing:
187 196 raise LdapImportError("Missing or incompatible ldap library")
188 197
@@ -236,14 +245,13 b' class AuthLdap(object):'
236 245 server.start_tls_s()
237 246
238 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 249 self.LDAP_BIND_DN)
241 250 server.simple_bind_s(self.LDAP_BIND_DN, self.LDAP_BIND_PASS)
242 251
243 252 return server
244 253
245 254 def get_uid(self, username):
246 from rhodecode.lib.helpers import chop_at
247 255 uid = username
248 256 for server_addr in self.SERVER_ADDRESSES:
249 257 uid = chop_at(username, "@%s" % server_addr)
@@ -292,8 +300,11 b' class AuthLdap(object):'
292 300 self.BASE_DN, self.SEARCH_SCOPE, filter_)
293 301
294 302 if not lobjects:
303 log.debug("No matching LDAP objects for authentication "
304 "of UID:'%s' username:(%s)", uid, username)
295 305 raise ldap.NO_SUCH_OBJECT()
296 306
307 log.debug('Found matching ldap object, trying to authenticate')
297 308 for (dn, _attrs) in lobjects:
298 309 if dn is None:
299 310 continue
@@ -304,15 +315,13 b' class AuthLdap(object):'
304 315 break
305 316
306 317 else:
307 log.debug("No matching LDAP objects for authentication "
308 "of '%s' (%s)", uid, username)
309 318 raise LdapPasswordError('Failed to authenticate user '
310 319 'with given password')
311 320
312 321 except ldap.NO_SUCH_OBJECT:
313 322 log.debug("LDAP says no such user '%s' (%s), org_exc:",
314 323 uid, username, exc_info=True)
315 raise LdapUsernameError()
324 raise LdapUsernameError('Unable to find user')
316 325 except ldap.SERVER_DOWN:
317 326 org_exc = traceback.format_exc()
318 327 raise LdapConnectionError(
@@ -447,7 +456,7 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
447 456 'email': get_ldap_attr('attr_email') or email,
448 457 'admin': admin,
449 458 'active': active,
450 "active_from_extern": None,
459 'active_from_extern': None,
451 460 'extern_name': user_dn,
452 461 'extern_type': extern_type,
453 462 }
@@ -17,6 +17,7 b''
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20 21 """
21 22 RhodeCode authentication library for PAM
22 23 """
@@ -29,10 +30,9 b' import pwd'
29 30 import re
30 31 import socket
31 32
32 from pylons.i18n.translation import lazy_ugettext as _
33 from sqlalchemy.ext.hybrid import hybrid_property
34
35 from rhodecode.authentication.base import RhodeCodeExternalAuthPlugin
33 from rhodecode.translation import _
34 from rhodecode.authentication.base import (
35 RhodeCodeExternalAuthPlugin, hybrid_property)
36 36 from rhodecode.authentication.schema import AuthnPluginSettingsSchemaBase
37 37 from rhodecode.authentication.routes import AuthnPluginResourceBase
38 38 from rhodecode.lib.colander_utils import strip_whitespace
@@ -25,9 +25,8 b' RhodeCode authentication plugin for buil'
25 25 import logging
26 26
27 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 30 from rhodecode.authentication.routes import AuthnPluginResourceBase
32 31 from rhodecode.lib.utils2 import safe_str
33 32 from rhodecode.model.db import User
@@ -24,12 +24,11 b' RhodeCode authentication token plugin fo'
24 24
25 25 import logging
26 26
27 from sqlalchemy.ext.hybrid import hybrid_property
28
29 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 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 34 log = logging.getLogger(__name__)
@@ -122,10 +121,17 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
122 121
123 122 log.debug('Authenticating user with args %s', user_attrs)
124 123 if userobj.active:
125 role = UserApiKeys.ROLE_VCS
126 active_tokens = [x.api_key for x in
127 User.extra_valid_auth_tokens(userobj, role=role)]
128 if userobj.username == username and password in active_tokens:
124 # calling context repo for token scopes
125 scope_repo_id = None
126 if self.acl_repo_name:
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 135 log.info(
130 136 'user `%s` successfully authenticated via %s',
131 137 user_attrs['username'], self.name)
@@ -40,10 +40,11 b' class AuthnPluginSettingsSchemaBase(cola'
40 40 cache_ttl = colander.SchemaNode(
41 41 colander.Int(),
42 42 default=0,
43 description=_('Amount of seconds to cache the authentication '
44 'call for this plugin. Useful for long calls like '
45 'LDAP to improve the responsiveness of the '
46 'authentication system (0 means disabled).'),
43 description=_('Amount of seconds to cache the authentication response'
44 'call for this plugin. \n'
45 'Useful for long calls like LDAP to improve the '
46 'performance of the authentication system '
47 '(0 means disabled).'),
47 48 missing=0,
48 49 title=_('Auth Cache TTL'),
49 50 validator=colander.Range(min=0, max=None),
@@ -87,15 +87,6 b' def load_environment(global_conf, app_co'
87 87
88 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 90 config['pylons.app_globals'] = app_globals.Globals(config)
100 91 config['pylons.h'] = helpers
101 92 rhodecode.CONFIG = config
@@ -184,7 +175,6 b' def load_pyramid_environment(global_conf'
184 175 protocol=utils.get_vcs_server_protocol(settings),
185 176 log_level=settings['vcs.server.log_level'])
186 177
187 utils.configure_pyro4(settings)
188 178 utils.configure_vcs(settings)
189 179 if vcs_server_enabled:
190 180 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(settings))
@@ -41,9 +41,6 b''
41 41 "python2.7-Pylons-1.0.1-patch1": {
42 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 44 "python2.7-Routes-1.13": {
48 45 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
49 46 },
@@ -215,9 +212,6 b''
215 212 "python2.7-requests-2.9.1": {
216 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 215 "python2.7-setuptools-19.4": {
222 216 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0",
223 217 "Zope Public License 2.0": "http://spdx.org/licenses/ZPL-2.0"
@@ -32,7 +32,7 b' from pyramid.config import Configurator'
32 32 from pyramid.settings import asbool, aslist
33 33 from pyramid.wsgi import wsgiapp
34 34 from pyramid.httpexceptions import (
35 HTTPError, HTTPInternalServerError, HTTPFound)
35 HTTPException, HTTPError, HTTPInternalServerError, HTTPFound)
36 36 from pyramid.events import ApplicationCreated
37 37 from pyramid.renderers import render_to_response
38 38 from routes.middleware import RoutesMiddleware
@@ -53,7 +53,8 b' from rhodecode.lib.middleware.vcs import'
53 53 from rhodecode.lib.plugins.utils import register_rhodecode_plugin
54 54 from rhodecode.lib.utils2 import aslist as rhodecode_aslist
55 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 60 log = logging.getLogger(__name__)
@@ -219,18 +220,14 b' def add_pylons_compat_data(registry, glo'
219 220
220 221
221 222 def error_handler(exception, request):
222 from rhodecode.model.settings import SettingsModel
223 import rhodecode
223 224 from rhodecode.lib.utils2 import AttributeDict
224 225
225 try:
226 rc_config = SettingsModel().get_all_settings()
227 except Exception:
228 log.exception('failed to fetch settings')
229 rc_config = {}
226 rhodecode_title = rhodecode.CONFIG.get('rhodecode_title') or 'RhodeCode'
230 227
231 228 base_response = HTTPInternalServerError()
232 229 # prefer original exception for the response since it may have headers set
233 if isinstance(exception, HTTPError):
230 if isinstance(exception, HTTPException):
234 231 base_response = exception
235 232
236 233 def is_http_error(response):
@@ -251,7 +248,7 b' def error_handler(exception, request):'
251 248 request.route_url('rhodecode_support')
252 249 )
253 250 c.redirect_time = 0
254 c.rhodecode_name = rc_config.get('rhodecode_title', '')
251 c.rhodecode_name = rhodecode_title
255 252 if not c.rhodecode_name:
256 253 c.rhodecode_name = 'Rhodecode'
257 254
@@ -281,14 +278,24 b' def includeme(config):'
281 278 # Includes which are required. The application would fail without them.
282 279 config.include('pyramid_mako')
283 280 config.include('pyramid_beaker')
284 config.include('rhodecode.channelstream')
285 config.include('rhodecode.admin')
281
286 282 config.include('rhodecode.authentication')
287 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 296 config.include('rhodecode.tweens')
290 297 config.include('rhodecode.api')
291 config.include('rhodecode.svn_support')
298
292 299 config.add_route(
293 300 'rhodecode_support', 'https://rhodecode.com/help/', static=True)
294 301
@@ -298,6 +305,7 b' def includeme(config):'
298 305 # Add subscribers.
299 306 config.add_subscriber(scan_repositories_if_enabled, ApplicationCreated)
300 307 config.add_subscriber(write_metadata_if_needed, ApplicationCreated)
308 config.add_subscriber(write_js_routes_if_enabled, ApplicationCreated)
301 309
302 310 # Set the authorization policy.
303 311 authz_policy = ACLAuthorizationPolicy()
@@ -92,7 +92,7 b' class JSRoutesMapper(Mapper):'
92 92 def _extract_route_information(self, route):
93 93 """
94 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 97 routepath = route.routepath
98 98 def replace(matchobj):
@@ -198,10 +198,6 b' def make_map(config):'
198 198 rmap.connect('user_group_autocomplete_data', '/_user_groups', controller='home',
199 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 201 # TODO: johbo: Static links, to be replaced by our redirection mechanism
206 202 rmap.connect('rst_help',
207 203 'http://docutils.sourceforge.net/docs/user/rst/quickref.html',
@@ -296,8 +292,6 b' def make_map(config):'
296 292 controller='admin/users') as m:
297 293 m.connect('users', '/users',
298 294 action='create', conditions={'method': ['POST']})
299 m.connect('users', '/users',
300 action='index', conditions={'method': ['GET']})
301 295 m.connect('new_user', '/users/new',
302 296 action='new', conditions={'method': ['GET']})
303 297 m.connect('update_user', '/users/{user_id}',
@@ -319,13 +313,6 b' def make_map(config):'
319 313 m.connect('edit_user_advanced', '/users/{user_id}/edit/advanced',
320 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 316 m.connect('edit_user_global_perms', '/users/{user_id}/edit/global_permissions',
330 317 action='edit_global_perms', conditions={'method': ['GET']})
331 318 m.connect('edit_user_global_perms', '/users/{user_id}/edit/global_permissions',
@@ -387,6 +374,10 b' def make_map(config):'
387 374 '/user_groups/{user_group_id}/edit/advanced',
388 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 381 m.connect('edit_user_group_members',
391 382 '/user_groups/{user_group_id}/edit/members', jsroute=True,
392 383 action='user_group_members', conditions={'method': ['GET']})
@@ -518,15 +509,15 b' def make_map(config):'
518 509 with rmap.submapper(path_prefix=ADMIN_PREFIX,
519 510 controller='admin/my_account') as m:
520 511
521 m.connect('my_account', '/my_account',
522 action='my_account', conditions={'method': ['GET']})
523 512 m.connect('my_account_edit', '/my_account/edit',
524 513 action='my_account_edit', conditions={'method': ['GET']})
525 m.connect('my_account', '/my_account',
514 m.connect('my_account', '/my_account/update',
526 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 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 522 m.connect('my_account_repos', '/my_account/repos',
532 523 action='my_account_repos', conditions={'method': ['GET']})
@@ -547,12 +538,6 b' def make_map(config):'
547 538 m.connect('my_account_emails', '/my_account/emails',
548 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 541 m.connect('my_account_notifications', '/my_account/notifications',
557 542 action='my_notifications',
558 543 conditions={'method': ['GET']})
@@ -1066,6 +1051,12 b' def make_map(config):'
1066 1051 f_path='', annotate=True, conditions={'function': check_repo},
1067 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 1060 rmap.connect('files_edit',
1070 1061 '/{repo_name}/edit/{revision}/{f_path}',
1071 1062 controller='files', action='edit', revision='tip',
@@ -1137,11 +1128,6 b' def make_map(config):'
1137 1128 conditions={'function': check_repo},
1138 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 1131 # must be here for proper group/repo catching pattern
1146 1132 _connect_with_slash(
1147 1133 rmap, 'repo_group_home', '/{group_name}',
@@ -20,29 +20,11 b''
20 20
21 21 import os
22 22 import shlex
23 import Pyro4
24 23 import platform
25 24
26 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 29 def configure_vcs(config):
48 30 """
@@ -77,9 +59,16 b' def initialize_test_environment(settings'
77 59 create_test_directory, create_test_database, create_test_repositories,
78 60 create_test_index)
79 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 65 # test repos
81 66 if test_env:
82 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 72 create_test_database(TESTS_TMP_PATH, settings)
84 73 create_test_repositories(TESTS_TMP_PATH, settings)
85 74 create_test_index(TESTS_TMP_PATH, settings)
@@ -28,101 +28,17 b' import logging'
28 28 from pylons import request, tmpl_context as c, url
29 29 from pylons.controllers.util import redirect
30 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 32 from rhodecode.model.db import UserLog, PullRequest
33 from rhodecode.lib.user_log_filter import user_log_filter
37 34 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
38 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 37 from rhodecode.lib.helpers import Page
41 38
42 39
43 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 43 class AdminController(BaseController):
128 44
@@ -139,7 +55,7 b' class AdminController(BaseController):'
139 55 # FILTERING
140 56 c.search_term = request.GET.get('filter')
141 57 try:
142 users_log = _journal_filter(users_log, c.search_term)
58 users_log = user_log_filter(users_log, c.search_term)
143 59 except Exception:
144 60 # we want this to crash for now
145 61 raise
@@ -29,32 +29,30 b' import datetime'
29 29 import formencode
30 30 from formencode import htmlfill
31 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 35 from pylons.controllers.util import redirect
34 36 from pylons.i18n.translation import _
35 37 from sqlalchemy.orm import joinedload
36 from webob.exc import HTTPBadGateway
37 38
38 from rhodecode import forms
39 39 from rhodecode.lib import helpers as h
40 40 from rhodecode.lib import auth
41 41 from rhodecode.lib.auth import (
42 LoginRequired, NotAnonymous, AuthUser, generate_auth_token)
42 LoginRequired, NotAnonymous, AuthUser)
43 43 from rhodecode.lib.base import BaseController, render
44 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 46 from rhodecode.lib.ext_json import json
47 47 from rhodecode.lib.channelstream import channelstream_request, \
48 48 ChannelstreamException
49 49
50 from rhodecode.model.validation_schema.schemas import user_schema
51 50 from rhodecode.model.db import (
52 51 Repository, PullRequest, UserEmailMap, User, UserFollowing)
53 52 from rhodecode.model.forms import UserForm
54 53 from rhodecode.model.scm import RepoList
55 54 from rhodecode.model.user import UserModel
56 55 from rhodecode.model.repo import RepoModel
57 from rhodecode.model.auth_token import AuthTokenModel
58 56 from rhodecode.model.meta import Session
59 57 from rhodecode.model.pull_request import PullRequestModel
60 58 from rhodecode.model.comment import CommentsModel
@@ -79,7 +77,7 b' class MyAccountController(BaseController'
79 77 if c.user.username == User.DEFAULT_USER:
80 78 h.flash(_("You can't edit this user since it's"
81 79 " crucial for entire application"), category='warning')
82 return redirect(url('users'))
80 return redirect(h.route_path('users'))
83 81
84 82 c.auth_user = AuthUser(
85 83 user_id=c.rhodecode_user.user_id, ip_addr=self.ip_addr)
@@ -156,7 +154,7 b' class MyAccountController(BaseController'
156 154 % form_result.get('username'), category='error')
157 155
158 156 if update:
159 return redirect('my_account')
157 raise HTTPFound(h.route_path('my_account_profile'))
160 158
161 159 return htmlfill.render(
162 160 render('admin/my_account/my_account.mako'),
@@ -165,19 +163,6 b' class MyAccountController(BaseController'
165 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 166 def my_account_edit(self):
182 167 """
183 168 GET /_admin/my_account/edit Displays edit form of my account
@@ -196,47 +181,6 b' class MyAccountController(BaseController'
196 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 184 def my_account_repos(self):
241 185 c.active = 'repos'
242 186 self.__load_data()
@@ -376,54 +320,6 b' class MyAccountController(BaseController'
376 320 else:
377 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 323 def my_notifications(self):
428 324 c.active = 'notifications'
429 325 return render('admin/my_account/my_account.mako')
@@ -36,7 +36,8 b' from pyramid.threadlocal import get_curr'
36 36 from webob.exc import HTTPBadRequest
37 37
38 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 41 from rhodecode.lib import auth
41 42 from rhodecode.lib import helpers as h
42 43 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
@@ -62,7 +63,6 b' from rhodecode.model.settings import ('
62 63 SettingsModel)
63 64
64 65 from rhodecode.model.supervisor import SupervisorModel, SUPERVISOR_MASTER
65 from rhodecode.svn_support.config_keys import generate_config
66 66
67 67
68 68 log = logging.getLogger(__name__)
@@ -82,7 +82,7 b' class SettingsController(BaseController)'
82 82 rhodecode.CONFIG.get('labs_settings_active', 'true'))
83 83 c.navlist = navigation_list(request)
84 84
85 def _get_hg_ui_settings(self):
85 def _get_ui_settings(self):
86 86 ret = RhodeCodeUi.query().all()
87 87
88 88 if not ret:
@@ -94,7 +94,7 b' class SettingsController(BaseController)'
94 94 if k == '/':
95 95 k = 'root_path'
96 96
97 if k in ['push_ssl', 'publish']:
97 if k in ['push_ssl', 'publish', 'enabled']:
98 98 v = str2bool(v)
99 99
100 100 if k.find('.') != -1:
@@ -165,6 +165,7 b' class SettingsController(BaseController)'
165 165
166 166 model.create_or_update_global_svn_settings(form_result)
167 167 model.create_or_update_global_hg_settings(form_result)
168 model.create_or_update_global_git_settings(form_result)
168 169 model.create_or_update_global_pr_settings(form_result)
169 170 except Exception:
170 171 log.exception("Exception while updating settings")
@@ -668,7 +669,8 b' class SettingsController(BaseController)'
668 669
669 670 def _form_defaults(self):
670 671 defaults = SettingsModel().get_all_settings()
671 defaults.update(self._get_hg_ui_settings())
672 defaults.update(self._get_ui_settings())
673
672 674 defaults.update({
673 675 'new_svn_branch': '',
674 676 'new_svn_tag': '',
@@ -117,7 +117,7 b' class UserGroupsController(BaseControlle'
117 117 def user_group_actions(user_group_id, user_group_name):
118 118 return _render("user_group_actions", user_group_id, user_group_name)
119 119
120 ## json generate
120 # json generate
121 121 group_iter = UserGroupList(UserGroup.query().all(),
122 122 perm_set=['usergroup.admin'])
123 123
@@ -129,6 +129,7 b' class UserGroupsController(BaseControlle'
129 129 "group_name_raw": user_gr.users_group_name,
130 130 "desc": h.escape(user_gr.user_group_description),
131 131 "members": len(user_gr.members),
132 "sync": user_gr.group_data.get('extern_type'),
132 133 "active": h.bool2icon(user_gr.users_group_active),
133 134 "owner": h.escape(h.link_to_user(user_gr.user.username)),
134 135 "action": user_group_actions(
@@ -431,7 +432,6 b' class UserGroupsController(BaseControlle'
431 432 prefix_error=False,
432 433 encoding="UTF-8",
433 434 force_defaults=False)
434
435 435 except Exception:
436 436 log.exception("Exception during permissions saving")
437 437 h.flash(_('An error occurred during permissions saving'),
@@ -459,6 +459,36 b' class UserGroupsController(BaseControlle'
459 459 return render('admin/user_groups/user_group_edit.mako')
460 460
461 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 492 @XHRRequired()
463 493 @jsonify
464 494 def user_group_members(self, user_group_id):
@@ -50,7 +50,6 b' from rhodecode.model.user import UserMod'
50 50 from rhodecode.model.meta import Session
51 51 from rhodecode.model.permission import PermissionModel
52 52 from rhodecode.lib.utils import action_logger
53 from rhodecode.lib.ext_json import json
54 53 from rhodecode.lib.utils2 import datetime_to_time, safe_int, AttributeDict
55 54
56 55 log = logging.getLogger(__name__)
@@ -76,51 +75,6 b' class UsersController(BaseController):'
76 75 ]
77 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 78 def _get_personal_repo_group_template_vars(self):
125 79 DummyUser = AttributeDict({
126 80 'username': '${username}',
@@ -135,7 +89,6 b' class UsersController(BaseController):'
135 89 @auth.CSRFRequired()
136 90 def create(self):
137 91 """POST /users: Create a new item"""
138 # url('users')
139 92 c.default_extern_type = auth_rhodecode.RhodeCodeAuthPlugin.name
140 93 user_model = UserModel()
141 94 user_form = UserForm()()
@@ -168,7 +121,7 b' class UsersController(BaseController):'
168 121 log.exception("Exception creation of user")
169 122 h.flash(_('Error occurred during creation of user %s')
170 123 % request.POST.get('username'), category='error')
171 return redirect(url('users'))
124 return redirect(h.route_path('users'))
172 125
173 126 @HasPermissionAllDecorator('hg.admin')
174 127 def new(self):
@@ -312,7 +265,7 b' class UsersController(BaseController):'
312 265 log.exception("Exception during deletion of user")
313 266 h.flash(_('An error occurred during deletion of user'),
314 267 category='error')
315 return redirect(url('users'))
268 return redirect(h.route_path('users'))
316 269
317 270 @HasPermissionAllDecorator('hg.admin')
318 271 @auth.CSRFRequired()
@@ -404,7 +357,7 b' class UsersController(BaseController):'
404 357 c.user = User.get_or_404(user_id)
405 358 if c.user.username == User.DEFAULT_USER:
406 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 362 c.active = 'profile'
410 363 c.extern_type = c.user.extern_type
@@ -425,7 +378,7 b' class UsersController(BaseController):'
425 378 user = c.user = User.get_or_404(user_id)
426 379 if user.username == User.DEFAULT_USER:
427 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 383 c.active = 'advanced'
431 384 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
@@ -452,83 +405,12 b' class UsersController(BaseController):'
452 405 force_defaults=False)
453 406
454 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 408 def edit_global_perms(self, user_id):
527 409 user_id = safe_int(user_id)
528 410 c.user = User.get_or_404(user_id)
529 411 if c.user.username == User.DEFAULT_USER:
530 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 415 c.active = 'global_perms'
534 416
@@ -602,7 +484,7 b' class UsersController(BaseController):'
602 484 c.user = User.get_or_404(user_id)
603 485 if c.user.username == User.DEFAULT_USER:
604 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 489 c.active = 'perms_summary'
608 490 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
@@ -615,7 +497,7 b' class UsersController(BaseController):'
615 497 c.user = User.get_or_404(user_id)
616 498 if c.user.username == User.DEFAULT_USER:
617 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 502 c.active = 'emails'
621 503 c.user_email_map = UserEmailMap.query() \
@@ -673,7 +555,7 b' class UsersController(BaseController):'
673 555 c.user = User.get_or_404(user_id)
674 556 if c.user.username == User.DEFAULT_USER:
675 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 560 c.active = 'ips'
679 561 c.user_ip_map = UserIpMap.query() \
@@ -28,12 +28,11 b' import pytz'
28 28 from pylons import url, response, tmpl_context as c
29 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 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 35 from rhodecode.lib import helpers as h
36 from rhodecode.lib import caches
37 36 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
38 37 from rhodecode.lib.base import BaseRepoController
39 38 from rhodecode.lib.diffs import DiffProcessor, LimitedDiffContainer
@@ -62,7 +61,7 b' class FeedController(BaseRepoController)'
62 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 65 def __before__(self):
67 66 super(FeedController, self).__before__()
68 67 config = self._get_config()
@@ -223,6 +223,8 b' class FilesController(BaseRepoController'
223 223 c.file_author = True
224 224 c.file_tree = ''
225 225 if c.file.is_file():
226 c.lf_node = c.file.get_largefile_node()
227
226 228 c.file_source_page = 'true'
227 229 c.file_last_commit = c.file.last_commit
228 230 if c.file.size < self.cut_off_limit_file:
@@ -239,7 +241,11 b' class FilesController(BaseRepoController'
239 241
240 242 c.on_branch_head = self._is_valid_head(
241 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 250 author = c.file_last_commit.author
245 251 c.authors = [(h.email(author),
@@ -260,6 +266,32 b' class FilesController(BaseRepoController'
260 266 return render('files/files.mako')
261 267
262 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 295 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
264 296 'repository.admin')
265 297 @jsonify
@@ -317,6 +349,14 b' class FilesController(BaseRepoController'
317 349 commit = self.__get_commit_or_redirect(revision, repo_name)
318 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 360 response.content_disposition = 'attachment; filename=%s' % \
321 361 safe_str(f_path.split(Repository.NAME_SEP)[-1])
322 362
@@ -352,6 +392,7 b' class FilesController(BaseRepoController'
352 392 'image/png': ('image/png', 'inline'),
353 393 'image/gif': ('image/gif', 'inline'),
354 394 'image/jpeg': ('image/jpeg', 'inline'),
395 'application/pdf': ('application/pdf', 'inline'),
355 396 }
356 397
357 398 mimetype = file_node.mimetype
@@ -34,8 +34,8 b' from webob.exc import HTTPBadRequest'
34 34 from pylons import request, tmpl_context as c, response, url
35 35 from pylons.i18n.translation import _
36 36
37 from rhodecode.controllers.admin.admin import _journal_filter
38 from rhodecode.model.db import UserLog, UserFollowing, User
37 from rhodecode.controllers.admin.admin import user_log_filter
38 from rhodecode.model.db import UserLog, UserFollowing, User, UserApiKeys
39 39 from rhodecode.model.meta import Session
40 40 import rhodecode.lib.helpers as h
41 41 from rhodecode.lib.helpers import Page
@@ -89,7 +89,7 b' class JournalController(BaseController):'
89 89 .options(joinedload(UserLog.repository))
90 90 #filter
91 91 try:
92 journal = _journal_filter(journal, c.search_term)
92 journal = user_log_filter(journal, c.search_term)
93 93 except Exception:
94 94 # we want this to crash for now
95 95 raise
@@ -211,7 +211,7 b' class JournalController(BaseController):'
211 211
212 212 return render('journal/journal.mako')
213 213
214 @LoginRequired(auth_token_access=True)
214 @LoginRequired(auth_token_access=[UserApiKeys.ROLE_FEED])
215 215 @NotAnonymous()
216 216 def journal_atom(self):
217 217 """
@@ -223,7 +223,7 b' class JournalController(BaseController):'
223 223 .all()
224 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 227 @NotAnonymous()
228 228 def journal_rss(self):
229 229 """
@@ -281,7 +281,7 b' class JournalController(BaseController):'
281 281 return c.journal_data
282 282 return render('journal/public_journal.mako')
283 283
284 @LoginRequired(auth_token_access=True)
284 @LoginRequired(auth_token_access=[UserApiKeys.ROLE_FEED])
285 285 def public_journal_atom(self):
286 286 """
287 287 Produce an atom-1.0 feed via feedgenerator module
@@ -293,7 +293,7 b' class JournalController(BaseController):'
293 293
294 294 return self._atom_feed(c.following)
295 295
296 @LoginRequired(auth_token_access=True)
296 @LoginRequired(auth_token_access=[UserApiKeys.ROLE_FEED])
297 297 def public_journal_rss(self):
298 298 """
299 299 Produce an rss2 feed via feedgenerator module
@@ -69,6 +69,8 b' class PullrequestsController(BaseRepoCon'
69 69
70 70 def __before__(self):
71 71 super(PullrequestsController, self).__before__()
72 c.REVIEW_STATUS_APPROVED = ChangesetStatus.STATUS_APPROVED
73 c.REVIEW_STATUS_REJECTED = ChangesetStatus.STATUS_REJECTED
72 74
73 75 def _extract_ordering(self, request):
74 76 column_index = safe_int(request.GET.get('order[0][column]'))
@@ -440,13 +442,25 b' class PullrequestsController(BaseRepoCon'
440 442 resp = PullRequestModel().update_commits(pull_request)
441 443
442 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 455 msg = _(
444 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 459 msg = msg.format(
447 460 source_commit_id=pull_request.source_ref_parts.commit_id,
448 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 464 h.flash(msg, category='success')
451 465
452 466 registry = get_current_registry()
@@ -562,13 +576,21 b' class PullrequestsController(BaseRepoCon'
562 576 def delete(self, repo_name, pull_request_id):
563 577 pull_request_id = safe_int(pull_request_id)
564 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 584 # only owner can delete it !
566 if pull_request.author.user_id == c.rhodecode_user.user_id:
585 if allowed_to_delete:
567 586 PullRequestModel().delete(pull_request)
568 587 Session().commit()
569 588 h.flash(_('Successfully deleted pull request'),
570 589 category='success')
571 590 return redirect(url('my_account_pullrequests'))
591
592 h.flash(_('Your are not allowed to delete this pull request'),
593 category='error')
572 594 raise HTTPForbidden()
573 595
574 596 def _get_pr_version(self, pull_request_id, version=None):
@@ -642,6 +664,13 b' class PullrequestsController(BaseRepoCon'
642 664 pull_request_display_obj,
643 665 at_version) = self._get_pr_version(
644 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 674 versions = pull_request_display_obj.versions()
646 675
647 676 c.at_version = at_version
@@ -675,20 +704,21 b' class PullrequestsController(BaseRepoCon'
675 704 c.shadow_clone_url = PullRequestModel().get_shadow_clone_url(
676 705 pull_request_at_ver)
677 706
678 c.ancestor = None # empty ancestor hidden in display
679 707 c.pull_request = pull_request_display_obj
680 708 c.pull_request_latest = pull_request_latest
681 709
682 pr_closed = pull_request_latest.is_closed()
683 710 if compare or (at_version and not at_version == 'latest'):
684 711 c.allowed_to_change_status = False
685 712 c.allowed_to_update = False
686 713 c.allowed_to_merge = False
687 714 c.allowed_to_delete = False
688 715 c.allowed_to_comment = False
716 c.allowed_to_close = False
689 717 else:
690 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 722 c.allowed_to_update = PullRequestModel().check_user_update(
693 723 pull_request_latest, c.rhodecode_user) and not pr_closed
694 724 c.allowed_to_merge = PullRequestModel().check_user_merge(
@@ -696,6 +726,7 b' class PullrequestsController(BaseRepoCon'
696 726 c.allowed_to_delete = PullRequestModel().check_user_delete(
697 727 pull_request_latest, c.rhodecode_user) and not pr_closed
698 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 731 # check merge capabilities
701 732 _merge_check = MergeCheck.validate(
@@ -704,6 +735,7 b' class PullrequestsController(BaseRepoCon'
704 735 c.pr_merge_possible = not _merge_check.failed
705 736 c.pr_merge_message = _merge_check.merge_msg
706 737
738 c.pull_request_review_status = _merge_check.review_status
707 739 if merge_checks:
708 740 return render('/pullrequests/pullrequest_merge_checks.mako')
709 741
@@ -712,7 +744,6 b' class PullrequestsController(BaseRepoCon'
712 744 # reviewers and statuses
713 745 c.pull_request_reviewers = pull_request_at_ver.reviewers_statuses()
714 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 748 # GENERAL COMMENTS with versions #
718 749 q = comments_model._all_general_comments_of_pull_request(pull_request_latest)
@@ -789,12 +820,15 b' class PullrequestsController(BaseRepoCon'
789 820 target_commit = EmptyCommit()
790 821 c.missing_requirements = False
791 822
823 source_scm = source_repo.scm_instance()
824 target_scm = target_repo.scm_instance()
825
792 826 # try first shadow repo, fallback to regular repo
793 827 try:
794 828 commits_source_repo = pull_request_latest.get_shadow_repo()
795 829 except Exception:
796 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 833 c.commits_source_repo = commits_source_repo
800 834 commit_cache = {}
@@ -818,6 +852,15 b' class PullrequestsController(BaseRepoCon'
818 852 'Failed to get all required data from repo', exc_info=True)
819 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 864 c.statuses = source_repo.statuses(
822 865 [x.raw_id for x in c.commit_ranges])
823 866
@@ -860,12 +903,7 b' class PullrequestsController(BaseRepoCon'
860 903 # We need to swap that here to generate it properly on the html side
861 904 c.target_repo = c.source_repo
862 905
863 if c.allowed_to_update:
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
906 c.commit_statuses = ChangesetStatus.STATUSES
869 907
870 908 c.show_version_changes = not pr_closed
871 909 if c.show_version_changes:
@@ -924,22 +962,21 b' class PullrequestsController(BaseRepoCon'
924 962 if pull_request.is_closed():
925 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 965 status = request.POST.get('changeset_status', None)
930 966 text = request.POST.get('text')
931 967 comment_type = request.POST.get('comment_type')
932 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 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 978 else:
938 close_pr = False
939
940 forced = (status == 'forced')
941 if forced:
942 status = 'rejected'
979 status = ChangesetStatus.STATUS_REJECTED
943 980
944 981 allowed_to_change_status = PullRequestModel().check_user_change_status(
945 982 pull_request, c.rhodecode_user)
@@ -995,7 +1032,7 b' class PullrequestsController(BaseRepoCon'
995 1032 status_completed = (
996 1033 calculated_status in [ChangesetStatus.STATUS_APPROVED,
997 1034 ChangesetStatus.STATUS_REJECTED])
998 if forced or status_completed:
1035 if close_pull_request or status_completed:
999 1036 PullRequestModel().close_pull_request(
1000 1037 pull_request_id, c.rhodecode_user)
1001 1038 else:
@@ -38,7 +38,7 b' from rhodecode.lib.utils2 import safe_st'
38 38 from rhodecode.lib.auth import (
39 39 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, XHRRequired)
40 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 42 from rhodecode.lib.ext_json import json
43 43 from rhodecode.lib.vcs.backends.base import EmptyCommit
44 44 from rhodecode.lib.vcs.exceptions import (
@@ -70,7 +70,12 b' class SummaryController(BaseRepoControll'
70 70 log.debug("Searching for a README file.")
71 71 readme_node = ReadmeFinder(default_renderer).search(commit)
72 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 79 readme_filename = readme_node.path
75 80 return readme_data, readme_filename
76 81
@@ -95,13 +100,16 b' class SummaryController(BaseRepoControll'
95 100 log.exception(
96 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 104 log.debug(
100 105 'Found README file `%s` rendering...', readme_node.path)
101 106 renderer = MarkupRenderer()
102 107 try:
103 return renderer.render(
108 html_source = renderer.render(
104 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 113 except Exception:
106 114 log.exception(
107 115 "Exception while trying to render the README")
@@ -56,8 +56,15 b' class RhodecodeEvent(object):'
56 56 @property
57 57 def actor(self):
58 58 auth_user = self.auth_user
59
59 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 68 return SYSTEM_USER
62 69
63 70 @property
@@ -128,6 +128,9 b' class PullRequestCommentEvent(PullReques'
128 128 'comment': {
129 129 'status': status,
130 130 'text': self.comment.text,
131 'type': self.comment.comment_type,
132 'file': self.comment.f_path,
133 'line': self.comment.line_no,
131 134 'url': CommentsModel().get_url(self.comment)
132 135 }
133 136 })
@@ -34,10 +34,9 b' def _commits_as_dict(commit_ids, repos):'
34 34 :param repos: list of repos to check
35 35 """
36 36 from rhodecode.lib.utils2 import extract_mentioned_users
37 from rhodecode.model.db import Repository
38 37 from rhodecode.lib import helpers as h
39 from rhodecode.lib.helpers import process_patterns
40 from rhodecode.lib.helpers import urlify_commit_message
38 from rhodecode.lib.helpers import (
39 urlify_commit_message, process_patterns, chop_at_smart)
41 40
42 41 if not repos:
43 42 raise Exception('no repo defined')
@@ -78,14 +77,15 b' def _commits_as_dict(commit_ids, repos):'
78 77 cs_data['issues'] = issues_data
79 78 cs_data['message_html'] = urlify_commit_message(cs_data['message'],
80 79 repo.repo_name)
80 cs_data['message_html_title'] = chop_at_smart(cs_data['message'], '\n', suffix_if_chopped='...')
81 81 commits.append(cs_data)
82 82
83 83 needed_commits.remove(commit_id)
84 84
85 85 except Exception as e:
86 86 log.exception(e)
87 # we don't send any commits when crash happens, only full list matters
88 # we short circuit then.
87 # we don't send any commits when crash happens, only full list
88 # matters we short circuit then.
89 89 return []
90 90
91 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 6 #, fuzzy
7 7 msgid ""
8 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 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 12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 14 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,51 +17,52 b' msgstr ""'
17 17 "Content-Transfer-Encoding: 8bit\n"
18 18 "Generated-By: Babel 1.3\n"
19 19
20 #: rhodecode/admin/navigation.py:83 rhodecode/authentication/routes.py:60
21 #: rhodecode/integrations/views.py:167
20 #: rhodecode/apps/admin/navigation.py:83 rhodecode/authentication/routes.py:60
21 #: rhodecode/integrations/views.py:166
22 22 #: rhodecode/templates/admin/permissions/permissions.mako:36
23 23 msgid "Global"
24 24 msgstr ""
25 25
26 #: rhodecode/admin/navigation.py:84
26 #: rhodecode/apps/admin/navigation.py:84
27 27 #: rhodecode/templates/admin/repos/repo_edit.mako:52
28 28 msgid "VCS"
29 29 msgstr ""
30 30
31 #: rhodecode/admin/navigation.py:85
31 #: rhodecode/apps/admin/navigation.py:85
32 32 msgid "Visual"
33 33 msgstr ""
34 34
35 #: rhodecode/admin/navigation.py:86
35 #: rhodecode/apps/admin/navigation.py:86
36 36 msgid "Remap and Rescan"
37 37 msgstr ""
38 38
39 #: rhodecode/admin/navigation.py:87
39 #: rhodecode/apps/admin/navigation.py:87
40 40 #: rhodecode/templates/admin/repos/repo_edit.mako:58
41 41 msgid "Issue Tracker"
42 42 msgstr ""
43 43
44 #: rhodecode/admin/navigation.py:89 rhodecode/integrations/types/email.py:232
45 #: rhodecode/templates/register.mako:75
44 #: rhodecode/apps/admin/navigation.py:89
45 #: rhodecode/integrations/types/email.py:232
46 #: rhodecode/templates/register.mako:76
46 47 #: rhodecode/templates/admin/my_account/my_account_profile.mako:48
47 48 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:97
48 49 #: rhodecode/templates/admin/users/user_add.mako:86
49 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 52 #: rhodecode/templates/email_templates/user_registration.mako:25
52 53 #: rhodecode/templates/users/user_profile.mako:51
53 54 msgid "Email"
54 55 msgstr ""
55 56
56 #: rhodecode/admin/navigation.py:90
57 #: rhodecode/apps/admin/navigation.py:90
57 58 msgid "Hooks"
58 59 msgstr ""
59 60
60 #: rhodecode/admin/navigation.py:91
61 #: rhodecode/apps/admin/navigation.py:91
61 62 msgid "Full Text Search"
62 63 msgstr ""
63 64
64 #: rhodecode/admin/navigation.py:93
65 #: rhodecode/apps/admin/navigation.py:93
65 66 #: rhodecode/templates/admin/integrations/base.mako:23
66 67 #: rhodecode/templates/admin/integrations/form.mako:8
67 68 #: rhodecode/templates/admin/integrations/form.mako:21
@@ -75,175 +76,286 b' msgstr ""'
75 76 #: rhodecode/templates/admin/integrations/new.mako:23
76 77 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:51
77 78 #: rhodecode/templates/admin/repos/repo_edit.mako:72
78 #: rhodecode/templates/base/base.mako:79
79 #: rhodecode/templates/base/base.mako:82
79 80 msgid "Integrations"
80 81 msgstr ""
81 82
82 #: rhodecode/admin/navigation.py:95
83 #: rhodecode/apps/admin/navigation.py:95
83 84 #: rhodecode/templates/admin/settings/settings_system.mako:9
84 85 msgid "System Info"
85 86 msgstr ""
86 87
87 #: rhodecode/admin/navigation.py:97
88 #: rhodecode/apps/admin/navigation.py:97
88 89 msgid "User Sessions"
89 90 msgstr ""
90 91
91 #: rhodecode/admin/navigation.py:99
92 #: rhodecode/apps/admin/navigation.py:99
92 93 msgid "Open Source Licenses"
93 94 msgstr ""
94 95
95 #: rhodecode/admin/navigation.py:107
96 #: rhodecode/apps/admin/navigation.py:107
96 97 msgid "Labs"
97 98 msgstr ""
98 99
99 #: rhodecode/admin/views/sessions.py:90
100 #: rhodecode/apps/admin/views/sessions.py:86
100 101 msgid "Cleaned up old sessions"
101 102 msgstr ""
102 103
103 #: rhodecode/admin/views/sessions.py:96
104 #: rhodecode/apps/admin/views/sessions.py:92
104 105 msgid "Failed to cleanup up old sessions"
105 106 msgstr ""
106 107
107 #: rhodecode/admin/views/svn_config.py:47
108 #: rhodecode/apps/admin/views/svn_config.py:46
108 109 msgid "Apache configuration for Subversion generated."
109 110 msgstr ""
110 111
111 #: rhodecode/admin/views/svn_config.py:55
112 #: rhodecode/apps/admin/views/svn_config.py:54
112 113 msgid "Failed to generate the Apache configuration for Subversion."
113 114 msgstr ""
114 115
115 #: rhodecode/admin/views/system_info.py:96
116 #: rhodecode/apps/admin/views/system_info.py:95
116 117 msgid "Note: please make sure this server can access `${url}` for the update link to work"
117 118 msgstr ""
118 119
119 #: rhodecode/admin/views/system_info.py:99
120 #: rhodecode/apps/admin/views/system_info.py:98
120 121 msgid "Update info"
121 122 msgstr ""
122 123
123 #: rhodecode/admin/views/system_info.py:101
124 #: rhodecode/apps/admin/views/system_info.py:100
124 125 msgid "Check for updates"
125 126 msgstr ""
126 127
127 #: rhodecode/admin/views/system_info.py:106
128 #: rhodecode/apps/admin/views/system_info.py:105
128 129 msgid "RhodeCode Version"
129 130 msgstr ""
130 131
131 #: rhodecode/admin/views/system_info.py:107
132 #: rhodecode/apps/admin/views/system_info.py:106
132 133 msgid "RhodeCode Server IP"
133 134 msgstr ""
134 135
135 #: rhodecode/admin/views/system_info.py:108
136 #: rhodecode/apps/admin/views/system_info.py:107
136 137 msgid "RhodeCode Server ID"
137 138 msgstr ""
138 139
139 #: rhodecode/admin/views/system_info.py:109
140 #: rhodecode/apps/admin/views/system_info.py:108
140 141 msgid "RhodeCode Configuration"
141 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 153 msgid "Database"
145 154 msgstr ""
146 155
147 #: rhodecode/admin/views/system_info.py:114
156 #: rhodecode/apps/admin/views/system_info.py:115
148 157 msgid "Database version"
149 158 msgstr ""
150 159
151 #: rhodecode/admin/views/system_info.py:118
160 #: rhodecode/apps/admin/views/system_info.py:119
152 161 msgid "Platform"
153 162 msgstr ""
154 163
155 #: rhodecode/admin/views/system_info.py:119
164 #: rhodecode/apps/admin/views/system_info.py:120
156 165 msgid "Platform UUID"
157 166 msgstr ""
158 167
159 #: rhodecode/admin/views/system_info.py:120
168 #: rhodecode/apps/admin/views/system_info.py:121
160 169 msgid "Python version"
161 170 msgstr ""
162 171
163 #: rhodecode/admin/views/system_info.py:121
172 #: rhodecode/apps/admin/views/system_info.py:122
164 173 msgid "Python path"
165 174 msgstr ""
166 175
167 #: rhodecode/admin/views/system_info.py:125
176 #: rhodecode/apps/admin/views/system_info.py:126
168 177 msgid "CPU"
169 178 msgstr ""
170 179
171 #: rhodecode/admin/views/system_info.py:126
180 #: rhodecode/apps/admin/views/system_info.py:127
172 181 msgid "Load"
173 182 msgstr ""
174 183
175 #: rhodecode/admin/views/system_info.py:127
184 #: rhodecode/apps/admin/views/system_info.py:128
176 185 msgid "Memory"
177 186 msgstr ""
178 187
179 #: rhodecode/admin/views/system_info.py:128
188 #: rhodecode/apps/admin/views/system_info.py:129
180 189 msgid "Uptime"
181 190 msgstr ""
182 191
183 #: rhodecode/admin/views/system_info.py:132
192 #: rhodecode/apps/admin/views/system_info.py:133
184 193 msgid "Storage location"
185 194 msgstr ""
186 195
187 #: rhodecode/admin/views/system_info.py:133
196 #: rhodecode/apps/admin/views/system_info.py:134
188 197 msgid "Storage info"
189 198 msgstr ""
190 199
191 #: rhodecode/admin/views/system_info.py:134
200 #: rhodecode/apps/admin/views/system_info.py:135
192 201 msgid "Storage inodes"
193 202 msgstr ""
194 203
195 #: rhodecode/admin/views/system_info.py:136
204 #: rhodecode/apps/admin/views/system_info.py:137
196 205 msgid "Gist storage location"
197 206 msgstr ""
198 207
199 #: rhodecode/admin/views/system_info.py:137
208 #: rhodecode/apps/admin/views/system_info.py:138
200 209 msgid "Gist storage info"
201 210 msgstr ""
202 211
203 #: rhodecode/admin/views/system_info.py:139
212 #: rhodecode/apps/admin/views/system_info.py:140
204 213 msgid "Archive cache storage location"
205 214 msgstr ""
206 215
207 #: rhodecode/admin/views/system_info.py:140
216 #: rhodecode/apps/admin/views/system_info.py:141
208 217 msgid "Archive cache info"
209 218 msgstr ""
210 219
211 #: rhodecode/admin/views/system_info.py:142
220 #: rhodecode/apps/admin/views/system_info.py:143
212 221 msgid "Temp storage location"
213 222 msgstr ""
214 223
215 #: rhodecode/admin/views/system_info.py:143
224 #: rhodecode/apps/admin/views/system_info.py:144
216 225 msgid "Temp storage info"
217 226 msgstr ""
218 227
219 #: rhodecode/admin/views/system_info.py:145
228 #: rhodecode/apps/admin/views/system_info.py:146
220 229 msgid "Search info"
221 230 msgstr ""
222 231
223 #: rhodecode/admin/views/system_info.py:146
232 #: rhodecode/apps/admin/views/system_info.py:147
224 233 msgid "Search location"
225 234 msgstr ""
226 235
227 #: rhodecode/admin/views/system_info.py:150
236 #: rhodecode/apps/admin/views/system_info.py:151
228 237 msgid "VCS Backends"
229 238 msgstr ""
230 239
231 #: rhodecode/admin/views/system_info.py:151
240 #: rhodecode/apps/admin/views/system_info.py:152
232 241 msgid "VCS Server"
233 242 msgstr ""
234 243
235 #: rhodecode/admin/views/system_info.py:152
244 #: rhodecode/apps/admin/views/system_info.py:153
236 245 msgid "GIT"
237 246 msgstr ""
238 247
239 #: rhodecode/admin/views/system_info.py:153
248 #: rhodecode/apps/admin/views/system_info.py:154
240 249 msgid "HG"
241 250 msgstr ""
242 251
243 #: rhodecode/admin/views/system_info.py:154
252 #: rhodecode/apps/admin/views/system_info.py:155
244 253 msgid "SVN"
245 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 359 #: rhodecode/authentication/schema.py:35
248 360 msgid "Enable or disable this authentication plugin."
249 361 msgstr ""
@@ -258,10 +370,12 b' msgid "Enabled"'
258 370 msgstr ""
259 371
260 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)."
262 msgstr ""
263
264 #: rhodecode/authentication/schema.py:48
373 msgid ""
374 "Amount of seconds to cache the authentication responsecall for this plugin. \n"
375 "Useful for long calls like LDAP to improve the performance of the authentication system (0 means disabled)."
376 msgstr ""
377
378 #: rhodecode/authentication/schema.py:49
265 379 msgid "Auth Cache TTL"
266 380 msgstr ""
267 381
@@ -281,94 +395,96 b' msgstr ""'
281 395 msgid "Error occurred during update of auth settings."
282 396 msgstr ""
283 397
284 #: rhodecode/authentication/plugins/auth_crowd.py:61
398 #: rhodecode/authentication/plugins/auth_crowd.py:60
285 399 msgid "The FQDN or IP of the Atlassian CROWD Server"
286 400 msgstr ""
287 401
288 #: rhodecode/authentication/plugins/auth_crowd.py:63
402 #: rhodecode/authentication/plugins/auth_crowd.py:62
289 403 msgid "Host"
290 404 msgstr ""
291 405
292 #: rhodecode/authentication/plugins/auth_crowd.py:68
406 #: rhodecode/authentication/plugins/auth_crowd.py:67
293 407 msgid "The Port in use by the Atlassian CROWD Server"
294 408 msgstr ""
295 409
296 #: rhodecode/authentication/plugins/auth_crowd.py:70
410 #: rhodecode/authentication/plugins/auth_crowd.py:69
297 411 #: rhodecode/authentication/plugins/auth_ldap.py:84
298 412 msgid "Port"
299 413 msgstr ""
300 414
301 #: rhodecode/authentication/plugins/auth_crowd.py:76
415 #: rhodecode/authentication/plugins/auth_crowd.py:75
302 416 msgid "The Application Name to authenticate to CROWD"
303 417 msgstr ""
304 418
305 #: rhodecode/authentication/plugins/auth_crowd.py:78
419 #: rhodecode/authentication/plugins/auth_crowd.py:77
306 420 msgid "Application Name"
307 421 msgstr ""
308 422
309 #: rhodecode/authentication/plugins/auth_crowd.py:83
423 #: rhodecode/authentication/plugins/auth_crowd.py:82
310 424 msgid "The password to authenticate to CROWD"
311 425 msgstr ""
312 426
313 #: rhodecode/authentication/plugins/auth_crowd.py:85
427 #: rhodecode/authentication/plugins/auth_crowd.py:84
314 428 msgid "Application Password"
315 429 msgstr ""
316 430
317 #: rhodecode/authentication/plugins/auth_crowd.py:90
431 #: rhodecode/authentication/plugins/auth_crowd.py:89
318 432 msgid "A comma separated list of group names that identify users as RhodeCode Administrators"
319 433 msgstr ""
320 434
321 #: rhodecode/authentication/plugins/auth_crowd.py:94
435 #: rhodecode/authentication/plugins/auth_crowd.py:93
322 436 msgid "Admin Groups"
323 437 msgstr ""
324 438
325 #: rhodecode/authentication/plugins/auth_crowd.py:216
439 #: rhodecode/authentication/plugins/auth_crowd.py:215
326 440 msgid "CROWD"
327 441 msgstr ""
328 442
329 #: rhodecode/authentication/plugins/auth_headers.py:55
443 #: rhodecode/authentication/plugins/auth_headers.py:54
330 444 msgid "Header to extract the user from"
331 445 msgstr ""
332 446
333 #: rhodecode/authentication/plugins/auth_headers.py:57
447 #: rhodecode/authentication/plugins/auth_headers.py:56
334 448 msgid "Header"
335 449 msgstr ""
336 450
337 #: rhodecode/authentication/plugins/auth_headers.py:62
451 #: rhodecode/authentication/plugins/auth_headers.py:61
338 452 msgid "Header to extract the user from when main one fails"
339 453 msgstr ""
340 454
341 #: rhodecode/authentication/plugins/auth_headers.py:64
455 #: rhodecode/authentication/plugins/auth_headers.py:63
342 456 msgid "Fallback header"
343 457 msgstr ""
344 458
345 #: rhodecode/authentication/plugins/auth_headers.py:69
459 #: rhodecode/authentication/plugins/auth_headers.py:68
346 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 461 msgstr ""
348 462
349 #: rhodecode/authentication/plugins/auth_headers.py:74
463 #: rhodecode/authentication/plugins/auth_headers.py:73
350 464 msgid "Clean username"
351 465 msgstr ""
352 466
353 #: rhodecode/authentication/plugins/auth_headers.py:99
467 #: rhodecode/authentication/plugins/auth_headers.py:98
354 468 msgid "Headers"
355 469 msgstr ""
356 470
357 #: rhodecode/authentication/plugins/auth_jasig_cas.py:63
471 #: rhodecode/authentication/plugins/auth_jasig_cas.py:62
358 472 msgid "The url of the Jasig CAS REST service"
359 473 msgstr ""
360 474
361 #: rhodecode/authentication/plugins/auth_jasig_cas.py:65
475 #: rhodecode/authentication/plugins/auth_jasig_cas.py:64
362 476 #: rhodecode/templates/admin/gists/show.mako:21
363 477 msgid "URL"
364 478 msgstr ""
365 479
366 #: rhodecode/authentication/plugins/auth_jasig_cas.py:93
480 #: rhodecode/authentication/plugins/auth_jasig_cas.py:92
367 481 msgid "Jasig-CAS"
368 482 msgstr ""
369 483
370 #: rhodecode/authentication/plugins/auth_ldap.py:75
371 msgid "Host of the LDAP Server"
484 #: rhodecode/authentication/plugins/auth_ldap.py:74
485 msgid ""
486 "Host of the LDAP Server \n"
487 "(e.g., 192.168.2.154, or ldap-server.domain.com"
372 488 msgstr ""
373 489
374 490 #: rhodecode/authentication/plugins/auth_ldap.py:77
@@ -376,107 +492,117 b' msgid "LDAP Host"'
376 492 msgstr ""
377 493
378 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 496 msgstr ""
381 497
382 498 #: rhodecode/authentication/plugins/auth_ldap.py:90
383 msgid "User to connect to LDAP"
384 msgstr ""
385
386 #: rhodecode/authentication/plugins/auth_ldap.py:93
499 msgid ""
500 "Optional user DN/account to connect to LDAP if authentication is required. \n"
501 "e.g., cn=admin,dc=mydomain,dc=com, or uid=root,cn=users,dc=mydomain,dc=com, or admin@mydomain.com"
502 msgstr ""
503
504 #: rhodecode/authentication/plugins/auth_ldap.py:95
387 505 msgid "Account"
388 506 msgstr ""
389 507
390 #: rhodecode/authentication/plugins/auth_ldap.py:98
391 msgid "Password to connect to LDAP"
392 msgstr ""
393
394 #: rhodecode/authentication/plugins/auth_ldap.py:101
395 #: rhodecode/templates/login.mako:49 rhodecode/templates/register.mako:47
508 #: rhodecode/authentication/plugins/auth_ldap.py:100
509 msgid "Password to authenticate for given user DN."
510 msgstr ""
511
512 #: rhodecode/authentication/plugins/auth_ldap.py:103
513 #: rhodecode/templates/login.mako:50 rhodecode/templates/register.mako:48
396 514 #: rhodecode/templates/admin/my_account/my_account.mako:30
397 515 #: rhodecode/templates/admin/users/user_add.mako:44
398 #: rhodecode/templates/base/base.mako:310
516 #: rhodecode/templates/base/base.mako:313
399 517 #: rhodecode/templates/debug_style/login.html:45
400 518 msgid "Password"
401 519 msgstr ""
402 520
403 #: rhodecode/authentication/plugins/auth_ldap.py:106
521 #: rhodecode/authentication/plugins/auth_ldap.py:108
404 522 msgid "TLS Type"
405 523 msgstr ""
406 524
407 #: rhodecode/authentication/plugins/auth_ldap.py:107
525 #: rhodecode/authentication/plugins/auth_ldap.py:109
408 526 msgid "Connection Security"
409 527 msgstr ""
410 528
411 #: rhodecode/authentication/plugins/auth_ldap.py:113
529 #: rhodecode/authentication/plugins/auth_ldap.py:115
412 530 msgid "Require Cert over TLS?"
413 531 msgstr ""
414 532
415 #: rhodecode/authentication/plugins/auth_ldap.py:114
533 #: rhodecode/authentication/plugins/auth_ldap.py:116
416 534 msgid "Certificate Checks"
417 535 msgstr ""
418 536
419 #: rhodecode/authentication/plugins/auth_ldap.py:120
420 msgid "Base DN to search (e.g., dc=mydomain,dc=com)"
421 msgstr ""
422
423 #: rhodecode/authentication/plugins/auth_ldap.py:123
537 #: rhodecode/authentication/plugins/auth_ldap.py:122
538 msgid ""
539 "Base DN to search. Dynamic bind is supported. Add `$login` marker in it to be replaced with current user credentials \n"
540 "(e.g., dc=mydomain,dc=com, or ou=Users,dc=mydomain,dc=com)"
541 msgstr ""
542
543 #: rhodecode/authentication/plugins/auth_ldap.py:127
424 544 msgid "Base DN"
425 545 msgstr ""
426 546
427 #: rhodecode/authentication/plugins/auth_ldap.py:128
428 msgid "Filter to narrow results (e.g., ou=Users, etc)"
429 msgstr ""
430
431 #: rhodecode/authentication/plugins/auth_ldap.py:131
432 msgid "LDAP Search Filter"
433 msgstr ""
434
435 #: rhodecode/authentication/plugins/auth_ldap.py:136
436 msgid "How deep to search LDAP"
547 #: rhodecode/authentication/plugins/auth_ldap.py:132
548 msgid ""
549 "Filter to narrow results \n"
550 "(e.g., (&(objectCategory=Person)(objectClass=user)), or \n"
551 "(memberof=cn=rc-login,ou=groups,ou=company,dc=mydomain,dc=com)))"
437 552 msgstr ""
438 553
439 554 #: rhodecode/authentication/plugins/auth_ldap.py:137
440 msgid "LDAP Search Scope"
555 msgid "LDAP Search Filter"
441 556 msgstr ""
442 557
443 558 #: rhodecode/authentication/plugins/auth_ldap.py:143
444 msgid "LDAP Attribute to map to user name"
445 msgstr ""
446
447 #: rhodecode/authentication/plugins/auth_ldap.py:145
559 msgid "How deep to search LDAP. If unsure set to SUBTREE"
560 msgstr ""
561
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 571 msgid "Login Attribute"
449 572 msgstr ""
450 573
451 #: rhodecode/authentication/plugins/auth_ldap.py:146
574 #: rhodecode/authentication/plugins/auth_ldap.py:153
452 575 msgid "The LDAP Login attribute of the CN must be specified"
453 576 msgstr ""
454 577
455 #: rhodecode/authentication/plugins/auth_ldap.py:151
456 msgid "LDAP Attribute to map to first name"
457 msgstr ""
458
459 #: rhodecode/authentication/plugins/auth_ldap.py:154
578 #: rhodecode/authentication/plugins/auth_ldap.py:158
579 msgid "LDAP Attribute to map to first name (e.g., givenName)"
580 msgstr ""
581
582 #: rhodecode/authentication/plugins/auth_ldap.py:161
460 583 msgid "First Name Attribute"
461 584 msgstr ""
462 585
463 #: rhodecode/authentication/plugins/auth_ldap.py:159
464 msgid "LDAP Attribute to map to last name"
465 msgstr ""
466
467 #: rhodecode/authentication/plugins/auth_ldap.py:162
586 #: rhodecode/authentication/plugins/auth_ldap.py:166
587 msgid "LDAP Attribute to map to last name (e.g., sn)"
588 msgstr ""
589
590 #: rhodecode/authentication/plugins/auth_ldap.py:169
468 591 msgid "Last Name Attribute"
469 592 msgstr ""
470 593
471 #: rhodecode/authentication/plugins/auth_ldap.py:167
472 msgid "LDAP Attribute to map to email address"
473 msgstr ""
474
475 #: rhodecode/authentication/plugins/auth_ldap.py:170
594 #: rhodecode/authentication/plugins/auth_ldap.py:174
595 msgid ""
596 "LDAP Attribute to map to email address (e.g., mail).\n"
597 "Emails are a crucial part of RhodeCode. \n"
598 "If possible add a valid email attribute to ldap users."
599 msgstr ""
600
601 #: rhodecode/authentication/plugins/auth_ldap.py:179
476 602 msgid "Email Attribute"
477 603 msgstr ""
478 604
479 #: rhodecode/authentication/plugins/auth_ldap.py:351
605 #: rhodecode/authentication/plugins/auth_ldap.py:360
480 606 msgid "LDAP"
481 607 msgstr ""
482 608
@@ -500,16 +626,16 b' msgstr ""'
500 626 msgid "PAM"
501 627 msgstr ""
502 628
503 #: rhodecode/authentication/plugins/auth_rhodecode.py:68
629 #: rhodecode/authentication/plugins/auth_rhodecode.py:67
504 630 msgid "Rhodecode"
505 631 msgstr ""
506 632
507 #: rhodecode/authentication/plugins/auth_token.py:71
633 #: rhodecode/authentication/plugins/auth_token.py:70
508 634 msgid "Rhodecode Token Auth"
509 635 msgstr ""
510 636
511 637 #: rhodecode/controllers/changelog.py:91 rhodecode/controllers/compare.py:64
512 #: rhodecode/controllers/pullrequests.py:202
638 #: rhodecode/controllers/pullrequests.py:204
513 639 msgid "There are no commits yet"
514 640 msgstr ""
515 641
@@ -543,8 +669,8 b' msgid "No such commit exists for this re'
543 669 msgstr ""
544 670
545 671 #: rhodecode/controllers/changeset.py:344
546 #: rhodecode/controllers/pullrequests.py:948
547 #: rhodecode/model/pull_request.py:1009
672 #: rhodecode/controllers/pullrequests.py:985
673 #: rhodecode/model/pull_request.py:1055
548 674 #, python-format
549 675 msgid "Status change %(transition_icon)s %(status)s"
550 676 msgstr ""
@@ -580,12 +706,12 b' msgstr ""'
580 706 msgid "Repositories unrelated. Cannot compare commit %(commit1)s from repository %(repo1)s with commit %(commit2)s from repository %(repo2)s."
581 707 msgstr ""
582 708
583 #: rhodecode/controllers/feed.py:70
709 #: rhodecode/controllers/feed.py:69
584 710 #, python-format
585 711 msgid "Changes on %s repository"
586 712 msgstr ""
587 713
588 #: rhodecode/controllers/feed.py:71
714 #: rhodecode/controllers/feed.py:70
589 715 #, python-format
590 716 msgid "%s %s feed"
591 717 msgstr ""
@@ -599,91 +725,91 b' msgstr ""'
599 725 msgid "There are no files yet. %s"
600 726 msgstr ""
601 727
602 #: rhodecode/controllers/files.py:394 rhodecode/controllers/files.py:447
603 #: rhodecode/controllers/files.py:478 rhodecode/controllers/files.py:553
604 #: rhodecode/controllers/files.py:598 rhodecode/controllers/files.py:689
728 #: rhodecode/controllers/files.py:435 rhodecode/controllers/files.py:488
729 #: rhodecode/controllers/files.py:519 rhodecode/controllers/files.py:594
730 #: rhodecode/controllers/files.py:639 rhodecode/controllers/files.py:730
605 731 #, python-format
606 732 msgid "This repository has been locked by %s on %s"
607 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 736 msgid "You can only delete files with revision being a valid branch "
611 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 740 #, python-format
615 741 msgid "Deleted file %s via RhodeCode Enterprise"
616 742 msgstr ""
617 743
618 #: rhodecode/controllers/files.py:431
744 #: rhodecode/controllers/files.py:472
619 745 #, python-format
620 746 msgid "Successfully deleted file %s"
621 747 msgstr ""
622 748
623 #: rhodecode/controllers/files.py:434 rhodecode/controllers/files.py:540
624 #: rhodecode/controllers/files.py:677
749 #: rhodecode/controllers/files.py:475 rhodecode/controllers/files.py:581
750 #: rhodecode/controllers/files.py:718
625 751 msgid "Error occurred during commit"
626 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 755 msgid "You can only edit files with revision being a valid branch "
630 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 759 #, python-format
634 760 msgid "Edited file %s via RhodeCode Enterprise"
635 761 msgstr ""
636 762
637 #: rhodecode/controllers/files.py:515
763 #: rhodecode/controllers/files.py:556
638 764 msgid "No changes"
639 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 768 #, python-format
643 769 msgid "Successfully committed to %s"
644 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 773 msgid "Added file via RhodeCode Enterprise"
648 774 msgstr ""
649 775
650 #: rhodecode/controllers/files.py:636
776 #: rhodecode/controllers/files.py:677
651 777 msgid "No filename"
652 778 msgstr ""
653 779
654 #: rhodecode/controllers/files.py:669
780 #: rhodecode/controllers/files.py:710
655 781 msgid "The location specified must be a relative path and must not contain .. in the path"
656 782 msgstr ""
657 783
658 #: rhodecode/controllers/files.py:723
784 #: rhodecode/controllers/files.py:764
659 785 msgid "Downloads disabled"
660 786 msgstr ""
661 787
662 #: rhodecode/controllers/files.py:729
788 #: rhodecode/controllers/files.py:770
663 789 #, python-format
664 790 msgid "Unknown revision %s"
665 791 msgstr ""
666 792
667 #: rhodecode/controllers/files.py:731
793 #: rhodecode/controllers/files.py:772
668 794 msgid "Empty repository"
669 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 798 msgid "Unknown archive type"
673 799 msgstr ""
674 800
675 #: rhodecode/controllers/files.py:952
801 #: rhodecode/controllers/files.py:993
676 802 msgid "Changesets"
677 803 msgstr ""
678 804
679 #: rhodecode/controllers/files.py:973 rhodecode/controllers/summary.py:269
680 #: rhodecode/model/pull_request.py:1234 rhodecode/model/scm.py:782
681 #: rhodecode/templates/base/vcs_settings.mako:193
805 #: rhodecode/controllers/files.py:1014 rhodecode/controllers/summary.py:277
806 #: rhodecode/model/pull_request.py:1280 rhodecode/model/scm.py:782
807 #: rhodecode/templates/base/vcs_settings.mako:242
682 808 msgid "Branches"
683 809 msgstr ""
684 810
685 #: rhodecode/controllers/files.py:977 rhodecode/model/scm.py:797
686 #: rhodecode/templates/base/vcs_settings.mako:218
811 #: rhodecode/controllers/files.py:1018 rhodecode/model/scm.py:797
812 #: rhodecode/templates/base/vcs_settings.mako:267
687 813 msgid "Tags"
688 814 msgstr ""
689 815
@@ -692,22 +818,23 b' msgstr ""'
692 818 msgid "An error occurred during repository forking %s"
693 819 msgstr ""
694 820
695 #: rhodecode/controllers/home.py:205
821 #: rhodecode/controllers/home.py:207
696 822 msgid "Groups"
697 823 msgstr ""
698 824
699 #: rhodecode/controllers/home.py:212 rhodecode/controllers/home.py:247
700 #: rhodecode/controllers/pullrequests.py:308
825 #: rhodecode/controllers/home.py:214 rhodecode/controllers/home.py:249
826 #: rhodecode/controllers/pullrequests.py:310
827 #: rhodecode/templates/admin/my_account/my_account.mako:38
701 828 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:128
702 829 #: rhodecode/templates/admin/repos/repo_add.mako:15
703 830 #: rhodecode/templates/admin/repos/repo_add.mako:19
704 831 #: rhodecode/templates/admin/users/user_edit_advanced.mako:11
705 #: rhodecode/templates/base/base.mako:73 rhodecode/templates/base/base.mako:145
706 #: rhodecode/templates/base/base.mako:569
832 #: rhodecode/templates/base/base.mako:76 rhodecode/templates/base/base.mako:148
833 #: rhodecode/templates/base/base.mako:572
707 834 msgid "Repositories"
708 835 msgstr ""
709 836
710 #: rhodecode/controllers/home.py:225
837 #: rhodecode/controllers/home.py:227
711 838 #, python-format
712 839 msgid "Commits in %(repo)s"
713 840 msgstr ""
@@ -720,77 +847,77 b' msgstr ""'
720 847 msgid "journal"
721 848 msgstr ""
722 849
723 #: rhodecode/controllers/pullrequests.py:216
850 #: rhodecode/controllers/pullrequests.py:218
724 851 msgid "Commit does not exist"
725 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 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 859 msgid "Error creating pull request: {}"
733 860 msgstr ""
734 861
735 #: rhodecode/controllers/pullrequests.py:383
862 #: rhodecode/controllers/pullrequests.py:385
736 863 msgid "Successfully opened new pull request"
737 864 msgstr ""
738 865
739 #: rhodecode/controllers/pullrequests.py:386
866 #: rhodecode/controllers/pullrequests.py:388
740 867 msgid "Error occurred during sending pull request"
741 868 msgstr ""
742 869
743 #: rhodecode/controllers/pullrequests.py:429
870 #: rhodecode/controllers/pullrequests.py:431
744 871 msgid "Cannot update closed pull requests."
745 872 msgstr ""
746 873
747 #: rhodecode/controllers/pullrequests.py:435
874 #: rhodecode/controllers/pullrequests.py:437
748 875 msgid "Pull request title & description updated."
749 876 msgstr ""
750 877
751 #: rhodecode/controllers/pullrequests.py:443
752 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits."
753 msgstr ""
754
755 #: rhodecode/controllers/pullrequests.py:458
878 #: rhodecode/controllers/pullrequests.py:455
879 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits. Source of changes: {change_source}"
880 msgstr ""
881
882 #: rhodecode/controllers/pullrequests.py:472
756 883 msgid "Reload page"
757 884 msgstr ""
758 885
759 #: rhodecode/controllers/pullrequests.py:532
886 #: rhodecode/controllers/pullrequests.py:546
760 887 msgid "Pull request was successfully merged and closed."
761 888 msgstr ""
762 889
763 #: rhodecode/controllers/pullrequests.py:569
890 #: rhodecode/controllers/pullrequests.py:588
764 891 msgid "Successfully deleted pull request"
765 892 msgstr ""
766 893
767 #: rhodecode/controllers/pullrequests.py:864
768 msgid "Close Pull Request"
769 msgstr ""
770
771 #: rhodecode/controllers/pullrequests.py:952
772 #: rhodecode/model/pull_request.py:1013
894 #: rhodecode/controllers/pullrequests.py:592
895 msgid "Your are not allowed to delete this pull request"
896 msgstr ""
897
898 #: rhodecode/controllers/pullrequests.py:989
899 #: rhodecode/model/pull_request.py:1059
773 900 msgid "Closing with"
774 901 msgstr ""
775 902
776 #: rhodecode/controllers/pullrequests.py:1002
903 #: rhodecode/controllers/pullrequests.py:1039
777 904 #, python-format
778 905 msgid "Closing pull request on other statuses than rejected or approved is forbidden. Calculated status from all reviewers is currently: %s"
779 906 msgstr ""
780 907
781 #: rhodecode/controllers/summary.py:243
908 #: rhodecode/controllers/summary.py:251
782 909 msgid "Branch"
783 910 msgstr ""
784 911
785 #: rhodecode/controllers/summary.py:244
912 #: rhodecode/controllers/summary.py:252
786 913 msgid "Tag"
787 914 msgstr ""
788 915
789 #: rhodecode/controllers/summary.py:245
916 #: rhodecode/controllers/summary.py:253
790 917 msgid "Bookmark"
791 918 msgstr ""
792 919
793 #: rhodecode/controllers/summary.py:270
920 #: rhodecode/controllers/summary.py:278
794 921 msgid "Closed branches"
795 922 msgstr ""
796 923
@@ -802,42 +929,6 b' msgstr ""'
802 929 msgid "Error occurred during update of default values"
803 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 932 #: rhodecode/controllers/admin/gists.py:72
842 933 msgid "Requires registered account"
843 934 msgstr ""
@@ -874,10 +965,8 b' msgstr ""'
874 965
875 966 #: rhodecode/controllers/admin/gists.py:343
876 967 #: rhodecode/templates/admin/gists/show.mako:67
877 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:23
878 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:46
879 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:20
880 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:42
968 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:35
969 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:31
881 970 #: rhodecode/templates/data_table/_dt_elements.mako:263
882 971 msgid "never"
883 972 msgstr ""
@@ -887,65 +976,36 b' msgstr ""'
887 976 msgid "%(expiry)s - current value"
888 977 msgstr ""
889 978
890 #: rhodecode/controllers/admin/my_account.py:80
979 #: rhodecode/controllers/admin/my_account.py:78
891 980 msgid "You can't edit this user since it's crucial for entire application"
892 981 msgstr ""
893 982
894 #: rhodecode/controllers/admin/my_account.py:140
983 #: rhodecode/controllers/admin/my_account.py:138
895 984 msgid "Your account was updated successfully"
896 985 msgstr ""
897 986
898 #: rhodecode/controllers/admin/my_account.py:155
899 #: rhodecode/controllers/admin/users.py:231
987 #: rhodecode/controllers/admin/my_account.py:153
988 #: rhodecode/controllers/admin/users.py:184
900 989 #, python-format
901 990 msgid "Error occurred during update of user %s"
902 991 msgstr ""
903 992
904 #: rhodecode/controllers/admin/my_account.py:221
905 #: rhodecode/controllers/admin/my_account.py:227
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
993 #: rhodecode/controllers/admin/my_account.py:222
994 #: rhodecode/controllers/admin/users.py:527
915 995 #, python-format
916 996 msgid "Added new email address `%s` for user account"
917 997 msgstr ""
918 998
919 #: rhodecode/controllers/admin/my_account.py:285
920 #: rhodecode/controllers/admin/users.py:652
999 #: rhodecode/controllers/admin/my_account.py:229
1000 #: rhodecode/controllers/admin/users.py:534
921 1001 msgid "An error occurred during email saving"
922 1002 msgstr ""
923 1003
924 #: rhodecode/controllers/admin/my_account.py:295
925 #: rhodecode/controllers/admin/users.py:667
1004 #: rhodecode/controllers/admin/my_account.py:239
1005 #: rhodecode/controllers/admin/users.py:549
926 1006 msgid "Removed email address from user account"
927 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 1009 #: rhodecode/controllers/admin/permissions.py:112
950 1010 msgid "Application permissions updated successfully"
951 1011 msgstr ""
@@ -1009,7 +1069,7 b' msgid "Error occurred during deletion of'
1009 1069 msgstr ""
1010 1070
1011 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 1073 msgid "Cannot change permission for yourself as admin"
1014 1074 msgstr ""
1015 1075
@@ -1161,18 +1221,18 b' msgid "Error occurred during deleting is'
1161 1221 msgstr ""
1162 1222
1163 1223 #: rhodecode/controllers/admin/repos.py:728
1164 #: rhodecode/controllers/admin/settings.py:380
1224 #: rhodecode/controllers/admin/settings.py:381
1165 1225 msgid "Removed issue tracker entry"
1166 1226 msgstr ""
1167 1227
1168 1228 #: rhodecode/controllers/admin/repos.py:758
1169 #: rhodecode/controllers/admin/settings.py:427
1229 #: rhodecode/controllers/admin/settings.py:428
1170 1230 msgid "Updated issue tracker entries"
1171 1231 msgstr ""
1172 1232
1173 1233 #: rhodecode/controllers/admin/repos.py:819
1174 1234 #: rhodecode/controllers/admin/settings.py:147
1175 #: rhodecode/controllers/admin/settings.py:618
1235 #: rhodecode/controllers/admin/settings.py:619
1176 1236 msgid "Some form inputs contain invalid data."
1177 1237 msgstr ""
1178 1238
@@ -1181,279 +1241,275 b' msgid "Error occurred during updating re'
1181 1241 msgstr ""
1182 1242
1183 1243 #: rhodecode/controllers/admin/repos.py:841
1184 #: rhodecode/controllers/admin/settings.py:175
1244 #: rhodecode/controllers/admin/settings.py:176
1185 1245 msgid "Updated VCS settings"
1186 1246 msgstr ""
1187 1247
1188 #: rhodecode/controllers/admin/settings.py:171
1189 #: rhodecode/controllers/admin/settings.py:282
1248 #: rhodecode/controllers/admin/settings.py:172
1249 #: rhodecode/controllers/admin/settings.py:283
1190 1250 msgid "Error occurred during updating application settings"
1191 1251 msgstr ""
1192 1252
1193 #: rhodecode/controllers/admin/settings.py:222
1253 #: rhodecode/controllers/admin/settings.py:223
1194 1254 #, python-format
1195 1255 msgid "Repositories successfully rescanned added: %s ; removed: %s"
1196 1256 msgstr ""
1197 1257
1198 #: rhodecode/controllers/admin/settings.py:278
1258 #: rhodecode/controllers/admin/settings.py:279
1199 1259 msgid "Updated application settings"
1200 1260 msgstr ""
1201 1261
1202 #: rhodecode/controllers/admin/settings.py:344
1262 #: rhodecode/controllers/admin/settings.py:345
1203 1263 msgid "Updated visualisation settings"
1204 1264 msgstr ""
1205 1265
1206 #: rhodecode/controllers/admin/settings.py:347
1266 #: rhodecode/controllers/admin/settings.py:348
1207 1267 msgid "Error occurred during updating visualisation settings"
1208 1268 msgstr ""
1209 1269
1210 #: rhodecode/controllers/admin/settings.py:440
1270 #: rhodecode/controllers/admin/settings.py:441
1211 1271 msgid "Please enter email address"
1212 1272 msgstr ""
1213 1273
1214 #: rhodecode/controllers/admin/settings.py:458
1274 #: rhodecode/controllers/admin/settings.py:459
1215 1275 msgid "Send email task created"
1216 1276 msgstr ""
1217 1277
1218 #: rhodecode/controllers/admin/settings.py:491
1278 #: rhodecode/controllers/admin/settings.py:492
1219 1279 msgid "Added new hook"
1220 1280 msgstr ""
1221 1281
1222 #: rhodecode/controllers/admin/settings.py:506
1282 #: rhodecode/controllers/admin/settings.py:507
1223 1283 msgid "Updated hooks"
1224 1284 msgstr ""
1225 1285
1226 #: rhodecode/controllers/admin/settings.py:510
1286 #: rhodecode/controllers/admin/settings.py:511
1227 1287 msgid "Error occurred during hook creation"
1228 1288 msgstr ""
1229 1289
1230 #: rhodecode/controllers/admin/settings.py:639
1290 #: rhodecode/controllers/admin/settings.py:640
1231 1291 msgid "Error occurred during updating labs settings"
1232 1292 msgstr ""
1233 1293
1234 #: rhodecode/controllers/admin/settings.py:644
1294 #: rhodecode/controllers/admin/settings.py:645
1235 1295 msgid "Updated Labs settings"
1236 1296 msgstr ""
1237 1297
1238 #: rhodecode/controllers/admin/user_groups.py:164
1298 #: rhodecode/controllers/admin/user_groups.py:165
1239 1299 #, python-format
1240 1300 msgid "Created user group %(user_group_link)s"
1241 1301 msgstr ""
1242 1302
1243 #: rhodecode/controllers/admin/user_groups.py:178
1303 #: rhodecode/controllers/admin/user_groups.py:179
1244 1304 #, python-format
1245 1305 msgid "Error occurred during creation of user group %s"
1246 1306 msgstr ""
1247 1307
1248 #: rhodecode/controllers/admin/user_groups.py:219
1308 #: rhodecode/controllers/admin/user_groups.py:220
1249 1309 #, python-format
1250 1310 msgid "Updated user group %s"
1251 1311 msgstr ""
1252 1312
1253 #: rhodecode/controllers/admin/user_groups.py:235
1313 #: rhodecode/controllers/admin/user_groups.py:236
1254 1314 #, python-format
1255 1315 msgid "Error occurred during update of user group %s"
1256 1316 msgstr ""
1257 1317
1258 #: rhodecode/controllers/admin/user_groups.py:257
1318 #: rhodecode/controllers/admin/user_groups.py:258
1259 1319 msgid "Successfully deleted user group"
1260 1320 msgstr ""
1261 1321
1262 #: rhodecode/controllers/admin/user_groups.py:262
1322 #: rhodecode/controllers/admin/user_groups.py:263
1263 1323 msgid "An error occurred during deletion of user group"
1264 1324 msgstr ""
1265 1325
1266 #: rhodecode/controllers/admin/user_groups.py:330
1326 #: rhodecode/controllers/admin/user_groups.py:331
1267 1327 msgid "Target group cannot be the same"
1268 1328 msgstr ""
1269 1329
1270 #: rhodecode/controllers/admin/user_groups.py:336
1330 #: rhodecode/controllers/admin/user_groups.py:337
1271 1331 msgid "User Group permissions updated"
1272 1332 msgstr ""
1273 1333
1274 #: rhodecode/controllers/admin/user_groups.py:421
1334 #: rhodecode/controllers/admin/user_groups.py:422
1275 1335 msgid "User Group global permissions updated successfully"
1276 1336 msgstr ""
1277 1337
1278 1338 #: rhodecode/controllers/admin/user_groups.py:437
1279 #: rhodecode/controllers/admin/users.py:595
1339 #: rhodecode/controllers/admin/users.py:477
1280 1340 msgid "An error occurred during permissions saving"
1281 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 1352 #, python-format
1285 1353 msgid "Created user %(user_link)s"
1286 1354 msgstr ""
1287 1355
1288 #: rhodecode/controllers/admin/users.py:169
1356 #: rhodecode/controllers/admin/users.py:122
1289 1357 #, python-format
1290 1358 msgid "Error occurred during creation of user %s"
1291 1359 msgstr ""
1292 1360
1293 #: rhodecode/controllers/admin/users.py:214
1361 #: rhodecode/controllers/admin/users.py:167
1294 1362 msgid "User updated successfully"
1295 1363 msgstr ""
1296 1364
1297 #: rhodecode/controllers/admin/users.py:265
1365 #: rhodecode/controllers/admin/users.py:218
1298 1366 #, python-format
1299 1367 msgid "Detached %s repositories"
1300 1368 msgstr ""
1301 1369
1302 #: rhodecode/controllers/admin/users.py:270
1370 #: rhodecode/controllers/admin/users.py:223
1303 1371 #, python-format
1304 1372 msgid "Deleted %s repositories"
1305 1373 msgstr ""
1306 1374
1307 #: rhodecode/controllers/admin/users.py:278
1375 #: rhodecode/controllers/admin/users.py:231
1308 1376 #, python-format
1309 1377 msgid "Detached %s repository groups"
1310 1378 msgstr ""
1311 1379
1312 #: rhodecode/controllers/admin/users.py:283
1380 #: rhodecode/controllers/admin/users.py:236
1313 1381 #, python-format
1314 1382 msgid "Deleted %s repository groups"
1315 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 1411 #: rhodecode/controllers/admin/users.py:291
1318 #, python-format
1319 msgid "Detached %s user groups"
1320 msgstr ""
1321
1322 #: rhodecode/controllers/admin/users.py:296
1323 #, python-format
1324 msgid "Deleted %s user groups"
1325 msgstr ""
1326
1327 #: rhodecode/controllers/admin/users.py:307
1328 msgid "Successfully deleted user"
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"
1412 msgid "An error occurred during password reset for user"
1413 msgstr ""
1414
1415 #: rhodecode/controllers/admin/users.py:324
1416 #, python-format
1417 msgid "Linked repository group `%s` as personal"
1418 msgstr ""
1419
1420 #: rhodecode/controllers/admin/users.py:330
1421 #, python-format
1422 msgid "Created repository group `%s`"
1337 1423 msgstr ""
1338 1424
1339 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 1426 #, python-format
1359 1427 msgid "Repository group `%s` is already taken"
1360 1428 msgstr ""
1361 1429
1362 #: rhodecode/controllers/admin/users.py:386
1430 #: rhodecode/controllers/admin/users.py:339
1363 1431 msgid "An error occurred during repository group creation for user"
1364 1432 msgstr ""
1365 1433
1366 #: rhodecode/controllers/admin/users.py:406
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
1434 #: rhodecode/controllers/admin/users.py:396
1379 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 1436 msgstr ""
1381 1437
1382 #: rhodecode/controllers/admin/users.py:579
1438 #: rhodecode/controllers/admin/users.py:461
1383 1439 msgid "User global permissions updated successfully"
1384 1440 msgstr ""
1385 1441
1386 #: rhodecode/controllers/admin/users.py:707
1442 #: rhodecode/controllers/admin/users.py:589
1387 1443 #, python-format
1388 1444 msgid "An error occurred during ip saving:%s"
1389 1445 msgstr ""
1390 1446
1391 #: rhodecode/controllers/admin/users.py:722
1447 #: rhodecode/controllers/admin/users.py:604
1392 1448 msgid "An error occurred during ip saving"
1393 1449 msgstr ""
1394 1450
1395 #: rhodecode/controllers/admin/users.py:726
1451 #: rhodecode/controllers/admin/users.py:608
1396 1452 #, python-format
1397 1453 msgid "Added ips %s to user whitelist"
1398 1454 msgstr ""
1399 1455
1400 #: rhodecode/controllers/admin/users.py:744
1456 #: rhodecode/controllers/admin/users.py:626
1401 1457 msgid "Removed ip address from user whitelist"
1402 1458 msgstr ""
1403 1459
1404 #: rhodecode/events/pullrequest.py:65
1460 #: rhodecode/events/pullrequest.py:68
1405 1461 msgid "pullrequest created"
1406 1462 msgstr ""
1407 1463
1408 #: rhodecode/events/pullrequest.py:74
1464 #: rhodecode/events/pullrequest.py:77
1409 1465 msgid "pullrequest closed"
1410 1466 msgstr ""
1411 1467
1412 #: rhodecode/events/pullrequest.py:83
1468 #: rhodecode/events/pullrequest.py:86
1413 1469 msgid "pullrequest commits updated"
1414 1470 msgstr ""
1415 1471
1416 #: rhodecode/events/pullrequest.py:92
1472 #: rhodecode/events/pullrequest.py:95
1417 1473 msgid "pullrequest review changed"
1418 1474 msgstr ""
1419 1475
1420 #: rhodecode/events/pullrequest.py:101
1476 #: rhodecode/events/pullrequest.py:104
1421 1477 msgid "pullrequest merged"
1422 1478 msgstr ""
1423 1479
1424 #: rhodecode/events/pullrequest.py:110
1480 #: rhodecode/events/pullrequest.py:113
1425 1481 msgid "pullrequest commented"
1426 1482 msgstr ""
1427 1483
1428 #: rhodecode/events/repo.py:136
1484 #: rhodecode/events/repo.py:138
1429 1485 msgid "repository pre create"
1430 1486 msgstr ""
1431 1487
1432 #: rhodecode/events/repo.py:145
1488 #: rhodecode/events/repo.py:147
1433 1489 msgid "repository created"
1434 1490 msgstr ""
1435 1491
1436 #: rhodecode/events/repo.py:154
1492 #: rhodecode/events/repo.py:156
1437 1493 msgid "repository pre delete"
1438 1494 msgstr ""
1439 1495
1440 #: rhodecode/events/repo.py:163
1496 #: rhodecode/events/repo.py:165
1441 1497 msgid "repository deleted"
1442 1498 msgstr ""
1443 1499
1444 #: rhodecode/events/repo.py:199
1500 #: rhodecode/events/repo.py:201
1445 1501 msgid "repository pre pull"
1446 1502 msgstr ""
1447 1503
1448 #: rhodecode/events/repo.py:208
1504 #: rhodecode/events/repo.py:210
1449 1505 msgid "repository pull"
1450 1506 msgstr ""
1451 1507
1452 #: rhodecode/events/repo.py:217
1508 #: rhodecode/events/repo.py:219
1453 1509 msgid "repository pre push"
1454 1510 msgstr ""
1455 1511
1456 #: rhodecode/events/repo.py:228
1512 #: rhodecode/events/repo.py:230
1457 1513 msgid "repository push"
1458 1514 msgstr ""
1459 1515
@@ -1469,25 +1525,24 b' msgstr ""'
1469 1525 msgid "repository group update"
1470 1526 msgstr ""
1471 1527
1472 #: rhodecode/events/user.py:34
1528 #: rhodecode/events/user.py:37
1473 1529 msgid "user registered"
1474 1530 msgstr ""
1475 1531
1476 #: rhodecode/events/user.py:48
1532 #: rhodecode/events/user.py:52
1477 1533 msgid "user pre create"
1478 1534 msgstr ""
1479 1535
1480 #: rhodecode/events/user.py:61
1536 #: rhodecode/events/user.py:66
1481 1537 msgid "user post create"
1482 1538 msgstr ""
1483 1539
1484 #: rhodecode/events/user.py:74
1540 #: rhodecode/events/user.py:80
1485 1541 msgid "user pre update"
1486 1542 msgstr ""
1487 1543
1488 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
1490 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:88
1545 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:87
1491 1546 #: rhodecode/templates/admin/my_account/my_account_emails.mako:65
1492 1547 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:107
1493 1548 #: rhodecode/templates/admin/permissions/permissions_application.mako:60
@@ -1499,15 +1554,14 b' msgstr ""'
1499 1554 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:80
1500 1555 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:111
1501 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 1558 #: rhodecode/templates/admin/settings/settings_global.mako:140
1504 1559 #: rhodecode/templates/admin/settings/settings_issuetracker.mako:16
1505 1560 #: rhodecode/templates/admin/settings/settings_labs.mako:49
1506 1561 #: rhodecode/templates/admin/settings/settings_vcs.mako:14
1507 1562 #: rhodecode/templates/admin/settings/settings_visual.mako:222
1508 1563 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:121
1509 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:27
1510 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:85
1564 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:83
1511 1565 #: rhodecode/templates/admin/users/user_edit_emails.mako:63
1512 1566 #: rhodecode/templates/admin/users/user_edit_ips.mako:70
1513 1567 #: rhodecode/templates/admin/users/user_edit_profile.mako:135
@@ -1517,17 +1571,17 b' msgstr ""'
1517 1571
1518 1572 #: rhodecode/forms/__init__.py:33 rhodecode/templates/admin/gists/show.mako:49
1519 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 1575 #: rhodecode/templates/admin/my_account/my_account_emails.mako:32
1522 1576 #: rhodecode/templates/admin/permissions/permissions_ips.mako:26
1523 1577 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:25
1524 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 1580 #: rhodecode/templates/admin/users/user_edit_emails.mako:31
1527 1581 #: rhodecode/templates/admin/users/user_edit_ips.mako:34
1528 #: rhodecode/templates/base/issue_tracker_settings.mako:70
1529 #: rhodecode/templates/base/vcs_settings.mako:202
1530 #: rhodecode/templates/base/vcs_settings.mako:227
1582 #: rhodecode/templates/base/issue_tracker_settings.mako:69
1583 #: rhodecode/templates/base/vcs_settings.mako:251
1584 #: rhodecode/templates/base/vcs_settings.mako:276
1531 1585 #: rhodecode/templates/changeset/changeset_file_comment.mako:137
1532 1586 #: rhodecode/templates/changeset/changeset_file_comment.mako:139
1533 1587 #: rhodecode/templates/changeset/changeset_file_comment.mako:142
@@ -1536,9 +1590,9 b' msgstr ""'
1536 1590 #: rhodecode/templates/data_table/_dt_elements.mako:198
1537 1591 #: rhodecode/templates/data_table/_dt_elements.mako:210
1538 1592 #: rhodecode/templates/debug_style/buttons.html:132
1539 #: rhodecode/templates/files/files_source.mako:35
1540 #: rhodecode/templates/files/files_source.mako:39
1541 #: rhodecode/templates/files/files_source.mako:42
1593 #: rhodecode/templates/files/files_source.mako:45
1594 #: rhodecode/templates/files/files_source.mako:49
1595 #: rhodecode/templates/files/files_source.mako:52
1542 1596 #: rhodecode/templates/pullrequests/pullrequest_show.mako:56
1543 1597 #: rhodecode/templates/pullrequests/pullrequest_show.mako:60
1544 1598 msgid "Delete"
@@ -1575,27 +1629,27 b' msgstr ""'
1575 1629 msgid "Root repositories only"
1576 1630 msgstr ""
1577 1631
1578 #: rhodecode/integrations/views.py:161
1632 #: rhodecode/integrations/views.py:160
1579 1633 msgid "{repo_name} repository"
1580 1634 msgstr ""
1581 1635
1582 #: rhodecode/integrations/views.py:164
1636 #: rhodecode/integrations/views.py:163
1583 1637 msgid "{repo_group_name} repo group"
1584 1638 msgstr ""
1585 1639
1586 #: rhodecode/integrations/views.py:171
1640 #: rhodecode/integrations/views.py:170
1587 1641 msgid "{name} integration"
1588 1642 msgstr ""
1589 1643
1590 #: rhodecode/integrations/views.py:185
1644 #: rhodecode/integrations/views.py:184
1591 1645 msgid "Integration {integration_name} deleted successfully."
1592 1646 msgstr ""
1593 1647
1594 #: rhodecode/integrations/views.py:265
1648 #: rhodecode/integrations/views.py:264
1595 1649 msgid "Errors exist when saving integration settings. Please check the form inputs."
1596 1650 msgstr ""
1597 1651
1598 #: rhodecode/integrations/views.py:290
1652 #: rhodecode/integrations/views.py:289
1599 1653 msgid "Integration {integration_name} updated successfully."
1600 1654 msgstr ""
1601 1655
@@ -1668,56 +1722,57 b' msgstr ""'
1668 1722 msgid "Send events such as repo pushes and pull requests to your hipchat channel."
1669 1723 msgstr ""
1670 1724
1671 #: rhodecode/integrations/types/slack.py:44
1725 #: rhodecode/integrations/types/slack.py:46
1672 1726 msgid "Slack service URL"
1673 1727 msgstr ""
1674 1728
1675 #: rhodecode/integrations/types/slack.py:45
1729 #: rhodecode/integrations/types/slack.py:47
1676 1730 msgid "This can be setup at the <a href=\"https://my.slack.com/services/new/incoming-webhook/\">slack app manager</a>"
1677 1731 msgstr ""
1678 1732
1679 #: rhodecode/integrations/types/slack.py:58 rhodecode/templates/login.mako:42
1680 #: rhodecode/templates/register.mako:40
1733 #: rhodecode/integrations/types/slack.py:60 rhodecode/templates/login.mako:43
1734 #: rhodecode/templates/register.mako:41
1681 1735 #: rhodecode/templates/admin/admin_log.mako:7
1682 1736 #: rhodecode/templates/admin/my_account/my_account_profile.mako:24
1683 1737 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:24
1684 1738 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:69
1685 1739 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:70
1686 1740 #: rhodecode/templates/admin/users/user_add.mako:35
1741 #: rhodecode/templates/admin/users/user_edit_audit.mako:22
1687 1742 #: rhodecode/templates/admin/users/user_edit_profile.mako:39
1688 #: rhodecode/templates/admin/users/users.mako:90
1689 #: rhodecode/templates/base/base.mako:301
1743 #: rhodecode/templates/admin/users/users.mako:62
1744 #: rhodecode/templates/base/base.mako:304
1690 1745 #: rhodecode/templates/debug_style/login.html:36
1691 1746 #: rhodecode/templates/email_templates/user_registration.mako:23
1692 1747 #: rhodecode/templates/users/user_profile.mako:27
1693 1748 msgid "Username"
1694 1749 msgstr ""
1695 1750
1696 #: rhodecode/integrations/types/slack.py:59
1751 #: rhodecode/integrations/types/slack.py:61
1697 1752 msgid "Username to show notifications coming from."
1698 1753 msgstr ""
1699 1754
1700 #: rhodecode/integrations/types/slack.py:68
1755 #: rhodecode/integrations/types/slack.py:70
1701 1756 msgid "Channel"
1702 1757 msgstr ""
1703 1758
1704 #: rhodecode/integrations/types/slack.py:69
1759 #: rhodecode/integrations/types/slack.py:71
1705 1760 msgid "Channel to send notifications to."
1706 1761 msgstr ""
1707 1762
1708 #: rhodecode/integrations/types/slack.py:78
1763 #: rhodecode/integrations/types/slack.py:80
1709 1764 msgid "Emoji"
1710 1765 msgstr ""
1711 1766
1712 #: rhodecode/integrations/types/slack.py:79
1767 #: rhodecode/integrations/types/slack.py:81
1713 1768 msgid "Emoji to use eg. :studio_microphone:"
1714 1769 msgstr ""
1715 1770
1716 #: rhodecode/integrations/types/slack.py:101
1771 #: rhodecode/integrations/types/slack.py:92
1717 1772 msgid "Slack"
1718 1773 msgstr ""
1719 1774
1720 #: rhodecode/integrations/types/slack.py:102
1775 #: rhodecode/integrations/types/slack.py:93
1721 1776 msgid "Send events such as repo pushes and pull requests to your slack channel."
1722 1777 msgstr ""
1723 1778
@@ -1876,25 +1931,25 b' msgstr ""'
1876 1931 msgid "Commit not found"
1877 1932 msgstr ""
1878 1933
1879 #: rhodecode/lib/auth.py:1189
1934 #: rhodecode/lib/auth.py:1197
1880 1935 #, python-format
1881 1936 msgid "IP %s not allowed"
1882 1937 msgstr ""
1883 1938
1884 #: rhodecode/lib/auth.py:1263
1939 #: rhodecode/lib/auth.py:1281
1885 1940 msgid "You need to be a registered user to perform this action"
1886 1941 msgstr ""
1887 1942
1888 #: rhodecode/lib/auth.py:1311
1943 #: rhodecode/lib/auth.py:1329
1889 1944 #, python-format
1890 1945 msgid "Action not supported for %s."
1891 1946 msgstr ""
1892 1947
1893 #: rhodecode/lib/auth.py:1348
1948 #: rhodecode/lib/auth.py:1379
1894 1949 msgid "You need to be signed in to view this page"
1895 1950 msgstr ""
1896 1951
1897 #: rhodecode/lib/base.py:557
1952 #: rhodecode/lib/base.py:549
1898 1953 #, python-format
1899 1954 msgid "The repository at %(repo_name)s cannot be located."
1900 1955 msgstr ""
@@ -1919,36 +1974,16 b' msgstr ""'
1919 1974 msgid "Click to select line"
1920 1975 msgstr ""
1921 1976
1922 #: rhodecode/lib/helpers.py:1515
1977 #: rhodecode/lib/helpers.py:1517
1923 1978 #, python-format
1924 1979 msgid " and %s more"
1925 1980 msgstr ""
1926 1981
1927 #: rhodecode/lib/helpers.py:1519
1982 #: rhodecode/lib/helpers.py:1521
1928 1983 msgid "No Files"
1929 1984 msgstr ""
1930 1985
1931 #: rhodecode/lib/helpers.py:1592
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
1986 #: rhodecode/lib/helpers.py:1800
1952 1987 msgid ""
1953 1988 "Example filter terms:\n"
1954 1989 " repository:vcs\n"
@@ -1967,7 +2002,7 b' msgid ""'
1967 2002 " \"username:test AND repository:test*\"\n"
1968 2003 msgstr ""
1969 2004
1970 #: rhodecode/lib/helpers.py:1873
2005 #: rhodecode/lib/helpers.py:1820
1971 2006 #, python-format
1972 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 2008 msgstr ""
@@ -2005,9 +2040,9 b' msgid "in ${val} and ${detail}"'
2005 2040 msgstr ""
2006 2041
2007 2042 #: rhodecode/lib/utils2.py:515
2008 #: rhodecode/public/js/rhodecode-components.js:33194
2009 #: rhodecode/public/js/scripts.js:25042
2010 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:65
2043 #: rhodecode/public/js/rhodecode-components.js:33659
2044 #: rhodecode/public/js/scripts.js:25507
2045 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:66
2011 2046 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:174
2012 2047 msgid "just now"
2013 2048 msgstr ""
@@ -2039,7 +2074,9 b' msgstr ""'
2039 2074 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2285
2040 2075 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2285
2041 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 2080 msgid "Repository no access"
2044 2081 msgstr ""
2045 2082
@@ -2070,7 +2107,9 b' msgstr ""'
2070 2107 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2286
2071 2108 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2286
2072 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 2113 msgid "Repository read access"
2075 2114 msgstr ""
2076 2115
@@ -2101,7 +2140,9 b' msgstr ""'
2101 2140 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2287
2102 2141 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2287
2103 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 2146 msgid "Repository write access"
2106 2147 msgstr ""
2107 2148
@@ -2132,7 +2173,9 b' msgstr ""'
2132 2173 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2288
2133 2174 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2288
2134 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 2179 msgid "Repository admin access"
2137 2180 msgstr ""
2138 2181
@@ -2203,7 +2246,9 b' msgstr ""'
2203 2246 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2306
2204 2247 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2306
2205 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 2252 msgid "Repository creation disabled"
2208 2253 msgstr ""
2209 2254
@@ -2234,7 +2279,9 b' msgstr ""'
2234 2279 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2307
2235 2280 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2307
2236 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 2285 msgid "Repository creation enabled"
2239 2286 msgstr ""
2240 2287
@@ -2265,7 +2312,9 b' msgstr ""'
2265 2312 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2311
2266 2313 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2311
2267 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 2318 msgid "Repository forking disabled"
2270 2319 msgstr ""
2271 2320
@@ -2296,7 +2345,9 b' msgstr ""'
2296 2345 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2312
2297 2346 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2312
2298 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 2351 msgid "Repository forking enabled"
2301 2352 msgstr ""
2302 2353
@@ -2348,7 +2399,9 b' msgstr ""'
2348 2399 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2946
2349 2400 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2946
2350 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 2405 msgid "Not Reviewed"
2353 2406 msgstr ""
2354 2407
@@ -2379,7 +2432,9 b' msgstr ""'
2379 2432 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2947
2380 2433 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2947
2381 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 2438 msgid "Approved"
2384 2439 msgstr ""
2385 2440
@@ -2410,7 +2465,9 b' msgstr ""'
2410 2465 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2948
2411 2466 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2948
2412 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 2471 msgid "Rejected"
2415 2472 msgstr ""
2416 2473
@@ -2441,7 +2498,9 b' msgstr ""'
2441 2498 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2949
2442 2499 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2949
2443 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 2504 msgid "Under Review"
2446 2505 msgstr ""
2447 2506
@@ -2469,7 +2528,9 b' msgstr ""'
2469 2528 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2290
2470 2529 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2290
2471 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 2534 msgid "Repository group no access"
2474 2535 msgstr ""
2475 2536
@@ -2497,7 +2558,9 b' msgstr ""'
2497 2558 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2291
2498 2559 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2291
2499 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 2564 msgid "Repository group read access"
2502 2565 msgstr ""
2503 2566
@@ -2525,7 +2588,9 b' msgstr ""'
2525 2588 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2292
2526 2589 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2292
2527 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 2594 msgid "Repository group write access"
2530 2595 msgstr ""
2531 2596
@@ -2553,7 +2618,9 b' msgstr ""'
2553 2618 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2293
2554 2619 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2293
2555 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 2624 msgid "Repository group admin access"
2558 2625 msgstr ""
2559 2626
@@ -2580,7 +2647,9 b' msgstr ""'
2580 2647 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2295
2581 2648 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2295
2582 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 2653 msgid "User group no access"
2585 2654 msgstr ""
2586 2655
@@ -2607,7 +2676,9 b' msgstr ""'
2607 2676 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2296
2608 2677 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2296
2609 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 2682 msgid "User group read access"
2612 2683 msgstr ""
2613 2684
@@ -2634,7 +2705,9 b' msgstr ""'
2634 2705 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2297
2635 2706 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2297
2636 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 2711 msgid "User group write access"
2639 2712 msgstr ""
2640 2713
@@ -2661,7 +2734,9 b' msgstr ""'
2661 2734 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2298
2662 2735 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2298
2663 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 2740 msgid "User group admin access"
2666 2741 msgstr ""
2667 2742
@@ -2688,7 +2763,9 b' msgstr ""'
2688 2763 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2300
2689 2764 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2300
2690 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 2769 msgid "Repository Group creation disabled"
2693 2770 msgstr ""
2694 2771
@@ -2715,7 +2792,9 b' msgstr ""'
2715 2792 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2301
2716 2793 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2301
2717 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 2798 msgid "Repository Group creation enabled"
2720 2799 msgstr ""
2721 2800
@@ -2742,7 +2821,9 b' msgstr ""'
2742 2821 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2303
2743 2822 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2303
2744 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 2827 msgid "User Group creation disabled"
2747 2828 msgstr ""
2748 2829
@@ -2769,7 +2850,9 b' msgstr ""'
2769 2850 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2304
2770 2851 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2304
2771 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 2856 msgid "User Group creation enabled"
2774 2857 msgstr ""
2775 2858
@@ -2796,7 +2879,9 b' msgstr ""'
2796 2879 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2314
2797 2880 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2314
2798 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 2885 msgid "Registration disabled"
2801 2886 msgstr ""
2802 2887
@@ -2823,7 +2908,9 b' msgstr ""'
2823 2908 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2315
2824 2909 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2315
2825 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 2914 msgid "User Registration with manual account activation"
2828 2915 msgstr ""
2829 2916
@@ -2850,7 +2937,9 b' msgstr ""'
2850 2937 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2316
2851 2938 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2316
2852 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 2943 msgid "User Registration with automatic account activation"
2855 2944 msgstr ""
2856 2945
@@ -2877,7 +2966,9 b' msgstr ""'
2877 2966 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2318
2878 2967 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2318
2879 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 2972 #: rhodecode/model/permission.py:95
2882 2973 msgid "Manual activation of external account"
2883 2974 msgstr ""
@@ -2905,7 +2996,9 b' msgstr ""'
2905 2996 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2319
2906 2997 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2319
2907 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 3002 #: rhodecode/model/permission.py:96
2910 3003 msgid "Automatic activation of external account"
2911 3004 msgstr ""
@@ -2927,7 +3020,9 b' msgstr ""'
2927 3020 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2308
2928 3021 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2308
2929 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 3026 msgid "Repository creation enabled with write permission to a repository group"
2932 3027 msgstr ""
2933 3028
@@ -2948,7 +3043,9 b' msgstr ""'
2948 3043 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2309
2949 3044 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2309
2950 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 3049 msgid "Repository creation disabled with write permission to a repository group"
2953 3050 msgstr ""
2954 3051
@@ -2966,7 +3063,9 b' msgstr ""'
2966 3063 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2283
2967 3064 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2283
2968 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 3069 msgid "RhodeCode Super Administrator"
2971 3070 msgstr ""
2972 3071
@@ -2982,7 +3081,9 b' msgstr ""'
2982 3081 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2321
2983 3082 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2321
2984 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 3087 msgid "Inherit object permissions from default user disabled"
2987 3088 msgstr ""
2988 3089
@@ -2998,7 +3099,9 b' msgstr ""'
2998 3099 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2322
2999 3100 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2322
3000 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 3105 msgid "Inherit object permissions from default user enabled"
3003 3106 msgstr ""
3004 3107
@@ -3006,7 +3109,9 b' msgstr ""'
3006 3109 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:910
3007 3110 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:910
3008 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 3115 msgid "all"
3011 3116 msgstr ""
3012 3117
@@ -3014,7 +3119,9 b' msgstr ""'
3014 3119 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:911
3015 3120 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:911
3016 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 3125 msgid "http/web interface"
3019 3126 msgstr ""
3020 3127
@@ -3022,7 +3129,9 b' msgstr ""'
3022 3129 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:912
3023 3130 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:912
3024 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 3135 msgid "vcs (git/hg/svn protocol)"
3027 3136 msgstr ""
3028 3137
@@ -3030,7 +3139,9 b' msgstr ""'
3030 3139 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:913
3031 3140 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:913
3032 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 3145 msgid "api calls"
3035 3146 msgstr ""
3036 3147
@@ -3038,7 +3149,9 b' msgstr ""'
3038 3149 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:914
3039 3150 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:914
3040 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 3155 msgid "feed access"
3043 3156 msgstr ""
3044 3157
@@ -3046,82 +3159,67 b' msgstr ""'
3046 3159 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2061
3047 3160 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2061
3048 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 3165 msgid "No parent"
3051 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 3184 msgid "Invalid search query. Try quoting it."
3055 3185 msgstr ""
3056 3186
3057 #: rhodecode/lib/index/whoosh.py:150
3187 #: rhodecode/lib/index/whoosh.py:151
3058 3188 msgid "There is no index to search in. Please run whoosh indexer"
3059 3189 msgstr ""
3060 3190
3061 #: rhodecode/lib/index/whoosh.py:155
3191 #: rhodecode/lib/index/whoosh.py:156
3062 3192 msgid "An error occurred during this search operation"
3063 3193 msgstr ""
3064 3194
3065 #: rhodecode/lib/index/whoosh.py:163
3066 msgid "Index Type"
3067 msgstr ""
3068
3069 3195 #: rhodecode/lib/index/whoosh.py:164
3196 msgid "Index Type"
3197 msgstr ""
3198
3199 #: rhodecode/lib/index/whoosh.py:165
3070 3200 msgid "File Index"
3071 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 3204 msgid "Indexed documents"
3075 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 3208 msgid "Last update"
3079 3209 msgstr ""
3080 3210
3081 #: rhodecode/lib/index/whoosh.py:169
3211 #: rhodecode/lib/index/whoosh.py:170
3082 3212 msgid "Commit index"
3083 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 3215 #: rhodecode/model/comment.py:368
3216 msgid "made a comment"
3217 msgstr ""
3218
3219 #: rhodecode/model/comment.py:369
3110 3220 msgid "Show it now"
3111 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 3223 #: rhodecode/model/forms.py:85
3126 3224 msgid "Please enter a login"
3127 3225 msgstr ""
@@ -3256,9 +3354,9 b' msgstr ""'
3256 3354 #: rhodecode/templates/admin/users/user_add.mako:11
3257 3355 #: rhodecode/templates/admin/users/user_edit.mako:12
3258 3356 #: rhodecode/templates/admin/users/users.mako:13
3259 #: rhodecode/templates/admin/users/users.mako:103
3260 #: rhodecode/templates/base/base.mako:406
3261 #: rhodecode/templates/base/base.mako:413
3357 #: rhodecode/templates/admin/users/users.mako:75
3358 #: rhodecode/templates/base/base.mako:409
3359 #: rhodecode/templates/base/base.mako:416
3262 3360 msgid "Admin"
3263 3361 msgstr ""
3264 3362
@@ -3289,64 +3387,64 b' msgstr ""'
3289 3387 msgid "Disable password recovery"
3290 3388 msgstr ""
3291 3389
3292 #: rhodecode/model/pull_request.py:77
3390 #: rhodecode/model/pull_request.py:78
3293 3391 msgid "This pull request can be automatically merged."
3294 3392 msgstr ""
3295 3393
3296 #: rhodecode/model/pull_request.py:79
3394 #: rhodecode/model/pull_request.py:80
3297 3395 msgid "This pull request cannot be merged because of an unhandled exception."
3298 3396 msgstr ""
3299 3397
3300 #: rhodecode/model/pull_request.py:82
3398 #: rhodecode/model/pull_request.py:83
3301 3399 msgid "This pull request cannot be merged because of merge conflicts."
3302 3400 msgstr ""
3303 3401
3304 #: rhodecode/model/pull_request.py:84
3402 #: rhodecode/model/pull_request.py:85
3305 3403 msgid "This pull request could not be merged because push to target failed."
3306 3404 msgstr ""
3307 3405
3308 #: rhodecode/model/pull_request.py:87
3406 #: rhodecode/model/pull_request.py:88
3309 3407 msgid "This pull request cannot be merged because the target is not a head."
3310 3408 msgstr ""
3311 3409
3312 #: rhodecode/model/pull_request.py:90
3410 #: rhodecode/model/pull_request.py:91
3313 3411 msgid "This pull request cannot be merged because the source contains more branches than the target."
3314 3412 msgstr ""
3315 3413
3316 #: rhodecode/model/pull_request.py:93
3414 #: rhodecode/model/pull_request.py:94
3317 3415 msgid "This pull request cannot be merged because the target has multiple heads."
3318 3416 msgstr ""
3319 3417
3320 #: rhodecode/model/pull_request.py:96
3418 #: rhodecode/model/pull_request.py:97
3321 3419 msgid "This pull request cannot be merged because the target repository is locked."
3322 3420 msgstr ""
3323 3421
3324 #: rhodecode/model/pull_request.py:99
3422 #: rhodecode/model/pull_request.py:100
3325 3423 msgid "This pull request cannot be merged because the target or the source reference is missing."
3326 3424 msgstr ""
3327 3425
3328 #: rhodecode/model/pull_request.py:102
3426 #: rhodecode/model/pull_request.py:103
3329 3427 msgid "This pull request cannot be merged because the target reference is missing."
3330 3428 msgstr ""
3331 3429
3332 #: rhodecode/model/pull_request.py:105
3430 #: rhodecode/model/pull_request.py:106
3333 3431 msgid "This pull request cannot be merged because the source reference is missing."
3334 3432 msgstr ""
3335 3433
3336 #: rhodecode/model/pull_request.py:108
3434 #: rhodecode/model/pull_request.py:109
3337 3435 msgid "This pull request cannot be merged because of conflicts related to sub repositories."
3338 3436 msgstr ""
3339 3437
3340 #: rhodecode/model/pull_request.py:114
3438 #: rhodecode/model/pull_request.py:115
3341 3439 msgid "Pull request update successful."
3342 3440 msgstr ""
3343 3441
3344 #: rhodecode/model/pull_request.py:116
3442 #: rhodecode/model/pull_request.py:117
3345 3443 msgid "Pull request update failed because of an unknown error."
3346 3444 msgstr ""
3347 3445
3348 #: rhodecode/model/pull_request.py:118
3349 msgid "No update needed because the source reference is already up to date."
3446 #: rhodecode/model/pull_request.py:119
3447 msgid "No update needed because the source and target have not changed."
3350 3448 msgstr ""
3351 3449
3352 3450 #: rhodecode/model/pull_request.py:121
@@ -3373,51 +3471,51 b' msgstr ""'
3373 3471 msgid "Pull request merged and closed"
3374 3472 msgstr ""
3375 3473
3376 #: rhodecode/model/pull_request.py:1041
3474 #: rhodecode/model/pull_request.py:1087
3377 3475 msgid "Server-side pull request merging is disabled."
3378 3476 msgstr ""
3379 3477
3380 #: rhodecode/model/pull_request.py:1043
3478 #: rhodecode/model/pull_request.py:1089
3381 3479 msgid "This pull request is closed."
3382 3480 msgstr ""
3383 3481
3384 #: rhodecode/model/pull_request.py:1055
3482 #: rhodecode/model/pull_request.py:1101
3385 3483 msgid "Pull request merging is not supported."
3386 3484 msgstr ""
3387 3485
3388 #: rhodecode/model/pull_request.py:1073
3486 #: rhodecode/model/pull_request.py:1119
3389 3487 msgid "Target repository large files support is disabled."
3390 3488 msgstr ""
3391 3489
3392 #: rhodecode/model/pull_request.py:1076
3490 #: rhodecode/model/pull_request.py:1122
3393 3491 msgid "Source repository large files support is disabled."
3394 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 3495 msgid "Bookmarks"
3398 3496 msgstr ""
3399 3497
3400 #: rhodecode/model/pull_request.py:1238
3498 #: rhodecode/model/pull_request.py:1284
3401 3499 msgid "Commit IDs"
3402 3500 msgstr ""
3403 3501
3404 #: rhodecode/model/pull_request.py:1241
3502 #: rhodecode/model/pull_request.py:1287
3405 3503 msgid "Closed Branches"
3406 3504 msgstr ""
3407 3505
3408 #: rhodecode/model/pull_request.py:1364
3506 #: rhodecode/model/pull_request.py:1411
3409 3507 msgid "User `{}` not allowed to perform merge."
3410 3508 msgstr ""
3411 3509
3412 #: rhodecode/model/pull_request.py:1375
3510 #: rhodecode/model/pull_request.py:1424
3413 3511 msgid "Pull request reviewer approval is pending."
3414 3512 msgstr ""
3415 3513
3416 #: rhodecode/model/pull_request.py:1390
3514 #: rhodecode/model/pull_request.py:1439
3417 3515 msgid "Cannot merge, {} TODO still not resolved."
3418 3516 msgstr ""
3419 3517
3420 #: rhodecode/model/pull_request.py:1393
3518 #: rhodecode/model/pull_request.py:1442
3421 3519 msgid "Cannot merge, {} TODOs still not resolved."
3422 3520 msgstr ""
3423 3521
@@ -3425,30 +3523,30 b' msgstr ""'
3425 3523 msgid "latest tip"
3426 3524 msgstr ""
3427 3525
3428 #: rhodecode/model/user.py:125
3526 #: rhodecode/model/user.py:126
3429 3527 msgid "You can't Edit this user since it's crucial for entire application"
3430 3528 msgstr ""
3431 3529
3432 #: rhodecode/model/user.py:291
3530 #: rhodecode/model/user.py:292
3433 3531 #, python-format
3434 3532 msgid "You can't edit this user (`%(username)s`) since it's crucial for entire application"
3435 3533 msgstr ""
3436 3534
3437 #: rhodecode/model/user.py:464
3535 #: rhodecode/model/user.py:462
3438 3536 msgid "You can't remove this user since it's crucial for entire application"
3439 3537 msgstr ""
3440 3538
3441 #: rhodecode/model/user.py:472
3539 #: rhodecode/model/user.py:470
3442 3540 #, python-format
3443 3541 msgid "user \"%s\" still owns %s repositories and cannot be removed. Switch owners or remove those repositories:%s"
3444 3542 msgstr ""
3445 3543
3446 #: rhodecode/model/user.py:481
3544 #: rhodecode/model/user.py:479
3447 3545 #, python-format
3448 3546 msgid "user \"%s\" still owns %s repository groups and cannot be removed. Switch owners or remove those repository groups:%s"
3449 3547 msgstr ""
3450 3548
3451 #: rhodecode/model/user.py:490
3549 #: rhodecode/model/user.py:488
3452 3550 #, python-format
3453 3551 msgid "user \"%s\" still owns %s user groups and cannot be removed. Switch owners or remove those user groups:%s"
3454 3552 msgstr ""
@@ -3767,367 +3865,369 b' msgstr ""'
3767 3865 msgid "New password must be different to old password"
3768 3866 msgstr ""
3769 3867
3770 #: rhodecode/public/js/rhodecode-components.js:31198
3771 #: rhodecode/public/js/scripts.js:23046
3868 #: rhodecode/public/js/rhodecode-components.js:31663
3869 #: rhodecode/public/js/scripts.js:23511
3772 3870 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
3773 3871 #: rhodecode/public/js/src/plugins/jquery.autocomplete.js:87
3774 3872 msgid "No results"
3775 3873 msgstr ""
3776 3874
3777 #: rhodecode/public/js/rhodecode-components.js:33129
3778 #: rhodecode/public/js/scripts.js:24977
3779 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:85
3875 #: rhodecode/public/js/rhodecode-components.js:33594
3876 #: rhodecode/public/js/scripts.js:25442
3877 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:88
3780 3878 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:109
3781 3879 msgid "{0} year"
3782 3880 msgstr ""
3783 3881
3784 #: rhodecode/public/js/rhodecode-components.js:33130
3785 #: rhodecode/public/js/scripts.js:24978
3786 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:81
3882 #: rhodecode/public/js/rhodecode-components.js:33595
3883 #: rhodecode/public/js/scripts.js:25443
3884 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
3787 3885 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:110
3788 3886 msgid "{0} month"
3789 3887 msgstr ""
3790 3888
3791 #: rhodecode/public/js/rhodecode-components.js:33131
3792 #: rhodecode/public/js/scripts.js:24979
3793 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:76
3889 #: rhodecode/public/js/rhodecode-components.js:33596
3890 #: rhodecode/public/js/scripts.js:25444
3891 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:78
3794 3892 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:111
3795 3893 msgid "{0} day"
3796 3894 msgstr ""
3797 3895
3798 #: rhodecode/public/js/rhodecode-components.js:33132
3799 #: rhodecode/public/js/scripts.js:24980
3800 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:78
3896 #: rhodecode/public/js/rhodecode-components.js:33597
3897 #: rhodecode/public/js/scripts.js:25445
3898 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:80
3801 3899 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:112
3802 3900 msgid "{0} hour"
3803 3901 msgstr ""
3804 3902
3805 #: rhodecode/public/js/rhodecode-components.js:33133
3806 #: rhodecode/public/js/scripts.js:24981
3807 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:80
3903 #: rhodecode/public/js/rhodecode-components.js:33598
3904 #: rhodecode/public/js/scripts.js:25446
3905 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:82
3808 3906 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:113
3809 3907 msgid "{0} min"
3810 3908 msgstr ""
3811 3909
3812 #: rhodecode/public/js/rhodecode-components.js:33134
3813 #: rhodecode/public/js/scripts.js:24982
3814 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:84
3910 #: rhodecode/public/js/rhodecode-components.js:33599
3911 #: rhodecode/public/js/scripts.js:25447
3912 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:87
3815 3913 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:114
3816 3914 msgid "{0} sec"
3817 3915 msgstr ""
3818 3916
3819 #: rhodecode/public/js/rhodecode-components.js:33154
3820 #: rhodecode/public/js/scripts.js:25002
3821 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:62
3917 #: rhodecode/public/js/rhodecode-components.js:33619
3918 #: rhodecode/public/js/scripts.js:25467
3919 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:63
3822 3920 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:134
3823 3921 msgid "in {0}"
3824 3922 msgstr ""
3825 3923
3826 #: rhodecode/public/js/rhodecode-components.js:33162
3827 #: rhodecode/public/js/scripts.js:25010
3828 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:73
3924 #: rhodecode/public/js/rhodecode-components.js:33627
3925 #: rhodecode/public/js/scripts.js:25475
3926 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:75
3829 3927 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:142
3830 3928 msgid "{0} ago"
3831 3929 msgstr ""
3832 3930
3833 #: rhodecode/public/js/rhodecode-components.js:33174
3834 #: rhodecode/public/js/scripts.js:25022
3835 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:87
3931 #: rhodecode/public/js/rhodecode-components.js:33639
3932 #: rhodecode/public/js/scripts.js:25487
3933 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:90
3836 3934 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:154
3837 3935 msgid "{0}, {1} ago"
3838 3936 msgstr ""
3839 3937
3840 #: rhodecode/public/js/rhodecode-components.js:33176
3841 #: rhodecode/public/js/scripts.js:25024
3842 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:64
3938 #: rhodecode/public/js/rhodecode-components.js:33641
3939 #: rhodecode/public/js/scripts.js:25489
3940 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:65
3843 3941 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:156
3844 3942 msgid "in {0}, {1}"
3845 3943 msgstr ""
3846 3944
3847 #: rhodecode/public/js/rhodecode-components.js:33180
3848 #: rhodecode/public/js/scripts.js:25028
3849 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:74
3945 #: rhodecode/public/js/rhodecode-components.js:33645
3946 #: rhodecode/public/js/scripts.js:25493
3947 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:76
3850 3948 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:160
3851 3949 msgid "{0} and {1}"
3852 3950 msgstr ""
3853 3951
3854 #: rhodecode/public/js/rhodecode-components.js:33182
3855 #: rhodecode/public/js/scripts.js:25030
3856 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:75
3952 #: rhodecode/public/js/rhodecode-components.js:33647
3953 #: rhodecode/public/js/scripts.js:25495
3954 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:77
3857 3955 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:162
3858 3956 msgid "{0} and {1} ago"
3859 3957 msgstr ""
3860 3958
3861 #: rhodecode/public/js/rhodecode-components.js:33184
3862 #: rhodecode/public/js/scripts.js:25032
3863 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:63
3959 #: rhodecode/public/js/rhodecode-components.js:33649
3960 #: rhodecode/public/js/scripts.js:25497
3961 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:64
3864 3962 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:164
3865 3963 msgid "in {0} and {1}"
3866 3964 msgstr ""
3867 3965
3868 #: rhodecode/public/js/rhodecode-components.js:47027
3869 #: rhodecode/public/js/scripts.js:38875
3966 #: rhodecode/public/js/rhodecode-components.js:47492
3967 #: rhodecode/public/js/scripts.js:39340
3870 3968 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:14
3871 3969 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:4
3872 3970 msgid "Loading more results..."
3873 3971 msgstr ""
3874 3972
3875 #: rhodecode/public/js/rhodecode-components.js:47030
3876 #: rhodecode/public/js/scripts.js:38878
3877 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:35
3973 #: rhodecode/public/js/rhodecode-components.js:47495
3974 #: rhodecode/public/js/scripts.js:39343
3975 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:36
3878 3976 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:7
3879 3977 msgid "Searching..."
3880 3978 msgstr ""
3881 3979
3882 #: rhodecode/public/js/rhodecode-components.js:47033
3883 #: rhodecode/public/js/scripts.js:38881
3980 #: rhodecode/public/js/rhodecode-components.js:47498
3981 #: rhodecode/public/js/scripts.js:39346
3884 3982 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:18
3885 3983 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:10
3886 3984 msgid "No matches found"
3887 3985 msgstr ""
3888 3986
3889 #: rhodecode/public/js/rhodecode-components.js:47036
3890 #: rhodecode/public/js/scripts.js:38884
3987 #: rhodecode/public/js/rhodecode-components.js:47501
3988 #: rhodecode/public/js/scripts.js:39349
3891 3989 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:13
3892 3990 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:13
3893 3991 msgid "Loading failed"
3894 3992 msgstr ""
3895 3993
3896 #: rhodecode/public/js/rhodecode-components.js:47040
3897 #: rhodecode/public/js/scripts.js:38888
3994 #: rhodecode/public/js/rhodecode-components.js:47505
3995 #: rhodecode/public/js/scripts.js:39353
3898 3996 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:28
3899 3997 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:17
3900 3998 msgid "One result is available, press enter to select it."
3901 3999 msgstr ""
3902 4000
3903 #: rhodecode/public/js/rhodecode-components.js:47042
3904 #: rhodecode/public/js/scripts.js:38890
3905 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
4001 #: rhodecode/public/js/rhodecode-components.js:47507
4002 #: rhodecode/public/js/scripts.js:39355
4003 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86
3906 4004 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:19
3907 4005 msgid "{0} results are available, use up and down arrow keys to navigate."
3908 4006 msgstr ""
3909 4007
3910 #: rhodecode/public/js/rhodecode-components.js:47047
3911 #: rhodecode/public/js/scripts.js:38895
4008 #: rhodecode/public/js/rhodecode-components.js:47512
4009 #: rhodecode/public/js/scripts.js:39360
3912 4010 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:33
3913 4011 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:24
3914 4012 msgid "Please enter {0} or more character"
3915 4013 msgstr ""
3916 4014
3917 #: rhodecode/public/js/rhodecode-components.js:47049
3918 #: rhodecode/public/js/scripts.js:38897
4015 #: rhodecode/public/js/rhodecode-components.js:47514
4016 #: rhodecode/public/js/scripts.js:39362
3919 4017 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:34
3920 4018 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:26
3921 4019 msgid "Please enter {0} or more characters"
3922 4020 msgstr ""
3923 4021
3924 #: rhodecode/public/js/rhodecode-components.js:47054
3925 #: rhodecode/public/js/scripts.js:38902
4022 #: rhodecode/public/js/rhodecode-components.js:47519
4023 #: rhodecode/public/js/scripts.js:39367
3926 4024 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:31
3927 4025 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:31
3928 4026 msgid "Please delete {0} character"
3929 4027 msgstr ""
3930 4028
3931 #: rhodecode/public/js/rhodecode-components.js:47056
3932 #: rhodecode/public/js/scripts.js:38904
4029 #: rhodecode/public/js/rhodecode-components.js:47521
4030 #: rhodecode/public/js/scripts.js:39369
3933 4031 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:32
3934 4032 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:33
3935 4033 msgid "Please delete {0} characters"
3936 4034 msgstr ""
3937 4035
3938 #: rhodecode/public/js/rhodecode-components.js:47060
3939 #: rhodecode/public/js/scripts.js:38908
3940 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:55
4036 #: rhodecode/public/js/rhodecode-components.js:47525
4037 #: rhodecode/public/js/scripts.js:39373
4038 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:56
3941 4039 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:37
3942 4040 msgid "You can only select {0} item"
3943 4041 msgstr ""
3944 4042
3945 #: rhodecode/public/js/rhodecode-components.js:47062
3946 #: rhodecode/public/js/scripts.js:38910
3947 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:56
4043 #: rhodecode/public/js/rhodecode-components.js:47527
4044 #: rhodecode/public/js/scripts.js:39375
4045 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:57
3948 4046 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:39
3949 4047 msgid "You can only select {0} items"
3950 4048 msgstr ""
3951 4049
3952 #: rhodecode/public/js/rhodecode-components.js:47991
3953 #: rhodecode/public/js/scripts.js:39839
3954 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:67
4050 #: rhodecode/public/js/rhodecode-components.js:48456
4051 #: rhodecode/public/js/scripts.js:40304
4052 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:69
3955 4053 #: rhodecode/public/js/src/rhodecode/changelog.js:35
3956 4054 msgid "showing {0} out of {1} commit"
3957 4055 msgstr ""
3958 4056
3959 #: rhodecode/public/js/rhodecode-components.js:47993
3960 #: rhodecode/public/js/scripts.js:39841
3961 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:68
4057 #: rhodecode/public/js/rhodecode-components.js:48458
4058 #: rhodecode/public/js/scripts.js:40306
4059 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:70
3962 4060 #: rhodecode/public/js/src/rhodecode/changelog.js:37
3963 4061 msgid "showing {0} out of {1} commits"
3964 4062 msgstr ""
3965 4063
3966 #: rhodecode/public/js/rhodecode-components.js:48426
3967 #: rhodecode/public/js/scripts.js:40274
3968 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
4064 #: rhodecode/public/js/rhodecode-components.js:48891
4065 #: rhodecode/public/js/scripts.js:40739
4066 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:39
3969 4067 #: rhodecode/public/js/src/rhodecode/codemirror.js:296
3970 4068 msgid "Set status to Approved"
3971 4069 msgstr ""
3972 4070
3973 #: rhodecode/public/js/rhodecode-components.js:48445
3974 #: rhodecode/public/js/scripts.js:40293
3975 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:39
4071 #: rhodecode/public/js/rhodecode-components.js:48910
4072 #: rhodecode/public/js/scripts.js:40758
4073 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
3976 4074 #: rhodecode/public/js/src/rhodecode/codemirror.js:315
3977 4075 msgid "Set status to Rejected"
3978 4076 msgstr ""
3979 4077
3980 #: rhodecode/public/js/rhodecode-components.js:48464
3981 #: rhodecode/public/js/scripts.js:40312
3982 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
4078 #: rhodecode/public/js/rhodecode-components.js:48929
4079 #: rhodecode/public/js/scripts.js:40777
4080 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:51
3983 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 4084 msgid "TODO comment"
3985 4085 msgstr ""
3986 4086
3987 #: rhodecode/public/js/rhodecode-components.js:48484
3988 #: rhodecode/public/js/scripts.js:40332
4087 #: rhodecode/public/js/rhodecode-components.js:48949
4088 #: rhodecode/public/js/scripts.js:40797
3989 4089 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:27
3990 4090 #: rhodecode/public/js/src/rhodecode/codemirror.js:354
3991 4091 msgid "Note Comment"
3992 4092 msgstr ""
3993 4093
3994 #: rhodecode/public/js/rhodecode-components.js:48848
3995 #: rhodecode/public/js/scripts.js:40696
3996 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:66
3997 #: rhodecode/public/js/src/rhodecode/comments.js:123
4094 #: rhodecode/public/js/rhodecode-components.js:49315
4095 #: rhodecode/public/js/scripts.js:41163
4096 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:68
4097 #: rhodecode/public/js/src/rhodecode/comments.js:125
3998 4098 msgid "resolve comment"
3999 4099 msgstr ""
4000 4100
4001 #: rhodecode/public/js/rhodecode-components.js:48927
4002 #: rhodecode/public/js/scripts.js:40775
4003 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:45
4004 #: rhodecode/public/js/src/rhodecode/comments.js:202
4101 #: rhodecode/public/js/rhodecode-components.js:49399
4102 #: rhodecode/public/js/scripts.js:41247
4103 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:46
4104 #: rhodecode/public/js/src/rhodecode/comments.js:209
4005 4105 msgid "Status Review"
4006 4106 msgstr ""
4007 4107
4008 #: rhodecode/public/js/rhodecode-components.js:48941
4009 #: rhodecode/public/js/scripts.js:40789
4108 #: rhodecode/public/js/rhodecode-components.js:49414
4109 #: rhodecode/public/js/scripts.js:41262
4010 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 4112 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
4013 4113 msgstr ""
4014 4114
4015 #: rhodecode/public/js/rhodecode-components.js:49089
4016 #: rhodecode/public/js/scripts.js:40937
4017 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
4018 #: rhodecode/public/js/src/rhodecode/comments.js:364
4115 #: rhodecode/public/js/rhodecode-components.js:49571
4116 #: rhodecode/public/js/scripts.js:41419
4117 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
4118 #: rhodecode/public/js/src/rhodecode/comments.js:381
4019 4119 msgid "Submitting..."
4020 4120 msgstr ""
4021 4121
4022 #: rhodecode/public/js/rhodecode-components.js:49140
4023 #: rhodecode/public/js/scripts.js:40988
4122 #: rhodecode/public/js/rhodecode-components.js:49622
4123 #: rhodecode/public/js/scripts.js:41470
4024 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 4126 #: rhodecode/templates/files/files_browser_tree.mako:51
4027 4127 msgid "Loading ..."
4028 4128 msgstr ""
4029 4129
4030 #: rhodecode/public/js/rhodecode-components.js:49245
4031 #: rhodecode/public/js/scripts.js:41093
4130 #: rhodecode/public/js/rhodecode-components.js:49727
4131 #: rhodecode/public/js/scripts.js:41575
4032 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 4134 msgid "Delete this comment?"
4035 4135 msgstr ""
4036 4136
4037 #: rhodecode/public/js/rhodecode-components.js:49316
4038 #: rhodecode/public/js/scripts.js:41164
4137 #: rhodecode/public/js/rhodecode-components.js:49798
4138 #: rhodecode/public/js/scripts.js:41646
4039 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 4141 msgid "Leave a comment, or click resolve button to resolve TODO comment #{0}"
4042 4142 msgstr ""
4043 4143
4044 #: rhodecode/public/js/rhodecode-components.js:49393
4045 #: rhodecode/public/js/scripts.js:41241
4144 #: rhodecode/public/js/rhodecode-components.js:49875
4145 #: rhodecode/public/js/scripts.js:41723
4046 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 4148 msgid "Leave a comment on line {0}."
4049 4149 msgstr ""
4050 4150
4051 #: rhodecode/public/js/rhodecode-components.js:49507
4052 #: rhodecode/public/js/scripts.js:41355
4053 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:51
4054 #: rhodecode/public/js/src/rhodecode/comments.js:782
4151 #: rhodecode/public/js/rhodecode-components.js:49989
4152 #: rhodecode/public/js/scripts.js:41837
4153 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:52
4154 #: rhodecode/public/js/src/rhodecode/comments.js:799
4055 4155 msgid "TODO from comment {0} was fixed."
4056 4156 msgstr ""
4057 4157
4058 #: rhodecode/public/js/rhodecode-components.js:49713
4059 #: rhodecode/public/js/scripts.js:41561
4060 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:70
4158 #: rhodecode/public/js/rhodecode-components.js:50195
4159 #: rhodecode/public/js/scripts.js:42043
4160 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72
4061 4161 #: rhodecode/public/js/src/rhodecode/files.js:150
4062 4162 msgid "truncated result"
4063 4163 msgstr ""
4064 4164
4065 #: rhodecode/public/js/rhodecode-components.js:49715
4066 #: rhodecode/public/js/scripts.js:41563
4067 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:71
4165 #: rhodecode/public/js/rhodecode-components.js:50197
4166 #: rhodecode/public/js/scripts.js:42045
4167 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:73
4068 4168 #: rhodecode/public/js/src/rhodecode/files.js:152
4069 4169 msgid "truncated results"
4070 4170 msgstr ""
4071 4171
4072 #: rhodecode/public/js/rhodecode-components.js:49724
4073 #: rhodecode/public/js/scripts.js:41572
4172 #: rhodecode/public/js/rhodecode-components.js:50206
4173 #: rhodecode/public/js/scripts.js:42054
4074 4174 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:19
4075 4175 #: rhodecode/public/js/src/rhodecode/files.js:161
4076 4176 msgid "No matching files"
4077 4177 msgstr ""
4078 4178
4079 #: rhodecode/public/js/rhodecode-components.js:49859
4080 #: rhodecode/public/js/scripts.js:41707
4081 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:36
4179 #: rhodecode/public/js/rhodecode-components.js:50341
4180 #: rhodecode/public/js/scripts.js:42189
4181 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:37
4082 4182 #: rhodecode/public/js/src/rhodecode/files.js:296
4083 4183 msgid "Selection link"
4084 4184 msgstr ""
4085 4185
4086 #: rhodecode/public/js/rhodecode-components.js:49899
4087 #: rhodecode/public/js/scripts.js:41747
4088 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:46
4186 #: rhodecode/public/js/rhodecode-components.js:50381
4187 #: rhodecode/public/js/scripts.js:42229
4188 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
4089 4189 #: rhodecode/public/js/src/rhodecode/followers.js:26
4090 4190 msgid "Stop following this repository"
4091 4191 msgstr ""
4092 4192
4093 #: rhodecode/public/js/rhodecode-components.js:49900
4094 #: rhodecode/public/js/scripts.js:41748
4095 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
4193 #: rhodecode/public/js/rhodecode-components.js:50382
4194 #: rhodecode/public/js/scripts.js:42230
4195 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
4096 4196 #: rhodecode/public/js/src/rhodecode/followers.js:27
4097 4197 msgid "Unfollow"
4098 4198 msgstr ""
4099 4199
4100 #: rhodecode/public/js/rhodecode-components.js:49909
4101 #: rhodecode/public/js/scripts.js:41757
4102 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
4200 #: rhodecode/public/js/rhodecode-components.js:50391
4201 #: rhodecode/public/js/scripts.js:42239
4202 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:45
4103 4203 #: rhodecode/public/js/src/rhodecode/followers.js:36
4104 4204 msgid "Start following this repository"
4105 4205 msgstr ""
4106 4206
4107 #: rhodecode/public/js/rhodecode-components.js:49910
4108 #: rhodecode/public/js/scripts.js:41758
4207 #: rhodecode/public/js/rhodecode-components.js:50392
4208 #: rhodecode/public/js/scripts.js:42240
4109 4209 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:8
4110 4210 #: rhodecode/public/js/src/rhodecode/followers.js:37
4111 4211 msgid "Follow"
4112 4212 msgstr ""
4113 4213
4114 #: rhodecode/public/js/rhodecode-components.js:50366
4115 #: rhodecode/public/js/scripts.js:42214
4116 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:57
4117 #: rhodecode/public/js/src/rhodecode/pullrequests.js:212
4214 #: rhodecode/public/js/rhodecode-components.js:50849
4215 #: rhodecode/public/js/scripts.js:42697
4216 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:58
4217 #: rhodecode/public/js/src/rhodecode/pullrequests.js:213
4118 4218 msgid "added manually by \"{0}\""
4119 4219 msgstr ""
4120 4220
4121 #: rhodecode/public/js/rhodecode-components.js:50937
4122 #: rhodecode/public/js/scripts.js:42785
4123 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
4221 #: rhodecode/public/js/rhodecode-components.js:51420
4222 #: rhodecode/public/js/scripts.js:43268
4223 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:61
4124 4224 #: rhodecode/public/js/src/rhodecode.js:142
4125 4225 msgid "file"
4126 4226 msgstr ""
4127 4227
4128 #: rhodecode/public/js/rhodecode-components.js:50957
4129 #: rhodecode/public/js/scripts.js:42805
4130 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:41
4228 #: rhodecode/public/js/rhodecode-components.js:51440
4229 #: rhodecode/public/js/scripts.js:43288
4230 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:42
4131 4231 #: rhodecode/public/js/src/rhodecode.js:162
4132 4232 msgid "Show more"
4133 4233 msgstr ""
@@ -4137,14 +4237,14 b' msgid "(from usergroup {0})"'
4137 4237 msgstr ""
4138 4238
4139 4239 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:3
4140 #: rhodecode/templates/codeblocks/diffs.mako:479
4141 #: rhodecode/templates/codeblocks/diffs.mako:484
4240 #: rhodecode/templates/codeblocks/diffs.mako:488
4241 #: rhodecode/templates/codeblocks/diffs.mako:493
4142 4242 msgid "Add another comment"
4143 4243 msgstr ""
4144 4244
4145 4245 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:4
4146 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 4248 msgid "Close"
4149 4249 msgstr ""
4150 4250
@@ -4202,80 +4302,101 b' msgstr ""'
4202 4302 msgid "Open new pull request for selected commit"
4203 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 4310 #: rhodecode/public/js/src/i18n_messages.js:6
4207 4311 #: rhodecode/templates/admin/settings/settings_email.mako:48
4208 4312 msgid "Send"
4209 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 4316 msgid "Show at Commit "
4213 4317 msgstr ""
4214 4318
4215 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:42
4216 msgid "Show selected commit __S"
4217 msgstr ""
4218
4219 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 4324 msgid "Show selected commits __S ... __E"
4221 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 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 4333 #: rhodecode/public/js/src/i18n_messages.js:8
4230 4334 msgid "Switch to comment"
4231 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 4338 msgid "There are currently no open pull requests requiring your participation."
4235 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 4342 msgid "Updating..."
4239 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 4345 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:59
4247 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 4352 msgid "enabled"
4249 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 4356 msgid "files"
4253 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 4365 msgid "specify commit"
4257 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 4369 msgid "{0} active out of {1} users"
4261 4370 msgstr ""
4262 4371
4263 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:77
4264 msgid "{0} days"
4265 msgstr ""
4266
4267 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 4377 msgid "{0} hours"
4269 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 4381 msgid "{0} months"
4273 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 4389 msgid "{0} years"
4277 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 4400 #: rhodecode/public/js/vendors/webcomponentsjs/webcomponents.min.js:11
4280 4401 msgid "UIEvent"
4281 4402 msgstr ""
@@ -4292,10 +4413,6 b' msgstr ""'
4292 4413 msgid "FocusEvent"
4293 4414 msgstr ""
4294 4415
4295 #: rhodecode/svn_support/events.py:30
4296 msgid "Configuration for Apaache mad_dav_svn changed."
4297 msgstr ""
4298
4299 4416 #: rhodecode/templates/index.mako:5
4300 4417 msgid "Dashboard"
4301 4418 msgstr ""
@@ -4353,6 +4470,7 b' msgstr ""'
4353 4470 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:15
4354 4471 #: rhodecode/templates/admin/repos/repos.mako:54
4355 4472 #: rhodecode/templates/admin/user_groups/user_groups.mako:55
4473 #: rhodecode/templates/admin/users/user_edit_groups.mako:54
4356 4474 #: rhodecode/templates/base/perms_summary.mako:102
4357 4475 #: rhodecode/templates/bookmarks/bookmarks.mako:59
4358 4476 #: rhodecode/templates/branches/branches.mako:58
@@ -4365,22 +4483,25 b' msgstr ""'
4365 4483 #: rhodecode/templates/index_base.mako:100
4366 4484 #: rhodecode/templates/index_base.mako:125
4367 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 4488 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:45
4370 4489 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:42
4371 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 4492 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:29
4374 4493 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:98
4375 4494 #: rhodecode/templates/admin/repos/repos.mako:57
4376 4495 #: rhodecode/templates/admin/user_groups/user_group_add.mako:43
4377 4496 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:42
4378 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 4501 #: rhodecode/templates/base/issue_tracker_settings.mako:10
4381 4502 #: rhodecode/templates/changeset/changeset.mako:53
4382 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 4505 #: rhodecode/templates/email_templates/pull_request_review.mako:41
4385 4506 #: rhodecode/templates/email_templates/pull_request_review.mako:75
4386 4507 #: rhodecode/templates/files/file_tree_detail.mako:5
@@ -4388,8 +4509,8 b' msgstr ""'
4388 4509 #: rhodecode/templates/forks/fork.mako:48
4389 4510 #: rhodecode/templates/forks/forks_data.mako:9
4390 4511 #: rhodecode/templates/pullrequests/pullrequest.mako:47
4391 #: rhodecode/templates/pullrequests/pullrequest_show.mako:158
4392 #: rhodecode/templates/pullrequests/pullrequest_show.mako:455
4512 #: rhodecode/templates/pullrequests/pullrequest_show.mako:163
4513 #: rhodecode/templates/pullrequests/pullrequest_show.mako:460
4393 4514 #: rhodecode/templates/summary/components.mako:73
4394 4515 msgid "Description"
4395 4516 msgstr ""
@@ -4404,7 +4525,8 b' msgstr ""'
4404 4525 #: rhodecode/templates/admin/repos/repos.mako:65
4405 4526 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:5
4406 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 4530 #: rhodecode/templates/forks/forks_data.mako:7
4409 4531 #: rhodecode/templates/summary/components.mako:195
4410 4532 msgid "Owner"
@@ -4425,9 +4547,9 b' msgstr ""'
4425 4547 #: rhodecode/templates/changelog/changelog_summary_data.mako:8
4426 4548 #: rhodecode/templates/changeset/changeset.mako:36
4427 4549 #: rhodecode/templates/compare/compare_commits.mako:18
4428 #: rhodecode/templates/email_templates/commit_comment.mako:45
4429 #: rhodecode/templates/email_templates/commit_comment.mako:81
4430 #: rhodecode/templates/pullrequests/pullrequest_show.mako:453
4550 #: rhodecode/templates/email_templates/commit_comment.mako:49
4551 #: rhodecode/templates/email_templates/commit_comment.mako:88
4552 #: rhodecode/templates/pullrequests/pullrequest_show.mako:458
4431 4553 #: rhodecode/templates/search/search_commit.mako:6
4432 4554 #: rhodecode/templates/tags/tags.mako:66
4433 4555 msgid "Commit"
@@ -4442,41 +4564,41 b' msgstr ""'
4442 4564 msgid "Home"
4443 4565 msgstr ""
4444 4566
4445 #: rhodecode/templates/login.mako:5 rhodecode/templates/login.mako:34
4446 #: rhodecode/templates/login.mako:75 rhodecode/templates/base/base.mako:326
4567 #: rhodecode/templates/login.mako:5 rhodecode/templates/login.mako:35
4568 #: rhodecode/templates/login.mako:75 rhodecode/templates/base/base.mako:329
4447 4569 #: rhodecode/templates/debug_style/login.html:60
4448 4570 msgid "Sign In"
4449 4571 msgstr ""
4450 4572
4451 #: rhodecode/templates/login.mako:36
4573 #: rhodecode/templates/login.mako:37
4452 4574 msgid "Go to the registration page to create a new account."
4453 4575 msgstr ""
4454 4576
4455 #: rhodecode/templates/login.mako:57
4577 #: rhodecode/templates/login.mako:58
4456 4578 msgid "Remember me"
4457 4579 msgstr ""
4458 4580
4459 #: rhodecode/templates/login.mako:61
4581 #: rhodecode/templates/login.mako:62
4460 4582 msgid "Forgot your password?"
4461 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 4586 msgid "Password reset is disabled. Please contact "
4465 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 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 4596 #: rhodecode/templates/files/files_add.mako:54
4475 4597 #: rhodecode/templates/files/files_add.mako:65
4476 4598 msgid "or"
4477 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 4602 msgid "an administrator if you need help."
4481 4603 msgstr ""
4482 4604
@@ -4484,28 +4606,28 b' msgstr ""'
4484 4606 msgid "Reset Password"
4485 4607 msgstr ""
4486 4608
4487 #: rhodecode/templates/password_reset.mako:46
4609 #: rhodecode/templates/password_reset.mako:47
4488 4610 msgid "Reset your Password"
4489 4611 msgstr ""
4490 4612
4491 #: rhodecode/templates/password_reset.mako:47
4613 #: rhodecode/templates/password_reset.mako:48
4492 4614 msgid "Go to the login page to sign in."
4493 4615 msgstr ""
4494 4616
4495 #: rhodecode/templates/password_reset.mako:51
4617 #: rhodecode/templates/password_reset.mako:52
4496 4618 msgid "Email Address"
4497 4619 msgstr ""
4498 4620
4499 #: rhodecode/templates/password_reset.mako:60
4500 #: rhodecode/templates/register.mako:84
4621 #: rhodecode/templates/password_reset.mako:61
4622 #: rhodecode/templates/register.mako:85
4501 4623 msgid "Captcha"
4502 4624 msgstr ""
4503 4625
4504 #: rhodecode/templates/password_reset.mako:70
4505 msgid "Send password reset email"
4506 msgstr ""
4507
4508 4626 #: rhodecode/templates/password_reset.mako:71
4627 msgid "Send password reset email"
4628 msgstr ""
4629
4630 #: rhodecode/templates/password_reset.mako:72
4509 4631 msgid "Password reset link will be sent to matching email address"
4510 4632 msgstr ""
4511 4633
@@ -4513,49 +4635,49 b' msgstr ""'
4513 4635 msgid "Create an Account"
4514 4636 msgstr ""
4515 4637
4516 #: rhodecode/templates/register.mako:34
4638 #: rhodecode/templates/register.mako:35
4517 4639 msgid "Create an account"
4518 4640 msgstr ""
4519 4641
4520 #: rhodecode/templates/register.mako:35
4642 #: rhodecode/templates/register.mako:36
4521 4643 msgid "Go to the login page to sign in with an existing account."
4522 4644 msgstr ""
4523 4645
4524 #: rhodecode/templates/register.mako:54
4646 #: rhodecode/templates/register.mako:55
4525 4647 msgid "Re-enter password"
4526 4648 msgstr ""
4527 4649
4528 #: rhodecode/templates/register.mako:61
4650 #: rhodecode/templates/register.mako:62
4529 4651 #: rhodecode/templates/admin/my_account/my_account_profile.mako:32
4530 4652 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:33
4531 4653 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:79
4532 4654 #: rhodecode/templates/admin/users/user_add.mako:68
4533 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 4657 msgid "First Name"
4536 4658 msgstr ""
4537 4659
4538 #: rhodecode/templates/register.mako:68
4660 #: rhodecode/templates/register.mako:69
4539 4661 #: rhodecode/templates/admin/my_account/my_account_profile.mako:40
4540 4662 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:42
4541 4663 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:88
4542 4664 #: rhodecode/templates/admin/users/user_add.mako:77
4543 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 4667 msgid "Last Name"
4546 4668 msgstr ""
4547 4669
4548 #: rhodecode/templates/register.mako:96
4670 #: rhodecode/templates/register.mako:97
4549 4671 msgid "Account activation requires admin approval."
4550 4672 msgstr ""
4551 4673
4552 #: rhodecode/templates/register.mako:103
4674 #: rhodecode/templates/register.mako:104
4553 4675 msgid "Create Account"
4554 4676 msgstr ""
4555 4677
4556 4678 #: rhodecode/templates/admin/admin.mako:5
4557 4679 #: rhodecode/templates/admin/admin.mako:15
4558 #: rhodecode/templates/base/base.mako:72
4680 #: rhodecode/templates/base/base.mako:75
4559 4681 msgid "Admin journal"
4560 4682 msgstr ""
4561 4683
@@ -4564,6 +4686,7 b' msgid "journal filter..."'
4564 4686 msgstr ""
4565 4687
4566 4688 #: rhodecode/templates/admin/admin.mako:14
4689 #: rhodecode/templates/admin/users/user_edit_audit.mako:15
4567 4690 msgid "filter"
4568 4691 msgstr ""
4569 4692
@@ -4576,31 +4699,38 b' msgstr[0] ""'
4576 4699 msgstr[1] ""
4577 4700
4578 4701 #: rhodecode/templates/admin/admin.mako:17
4702 #: rhodecode/templates/admin/users/user_edit_audit.mako:17
4579 4703 #: rhodecode/templates/journal/journal.mako:17
4580 4704 msgid "Example Queries"
4581 4705 msgstr ""
4582 4706
4583 4707 #: rhodecode/templates/admin/admin_log.mako:8
4708 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:18
4584 4709 #: rhodecode/templates/admin/my_account/my_account_repos.mako:37
4585 4710 #: rhodecode/templates/admin/repo_groups/repo_groups.mako:62
4586 4711 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:13
4587 4712 #: rhodecode/templates/admin/repos/repos.mako:69
4588 4713 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:71
4589 #: rhodecode/templates/admin/user_groups/user_groups.mako:66
4590 #: rhodecode/templates/admin/users/users.mako:107
4591 #: rhodecode/templates/files/files_detail.mako:63
4714 #: rhodecode/templates/admin/user_groups/user_groups.mako:68
4715 #: rhodecode/templates/admin/users/user_edit_audit.mako:23
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 4720 msgid "Action"
4593 4721 msgstr ""
4594 4722
4595 4723 #: rhodecode/templates/admin/admin_log.mako:9
4596 4724 #: rhodecode/templates/admin/defaults/defaults.mako:31
4597 4725 #: rhodecode/templates/admin/permissions/permissions_objects.mako:13
4726 #: rhodecode/templates/admin/users/user_edit_audit.mako:24
4598 4727 #: rhodecode/templates/search/search_commit.mako:5
4599 4728 #: rhodecode/templates/search/search_path.mako:3
4600 4729 msgid "Repository"
4601 4730 msgstr ""
4602 4731
4603 4732 #: rhodecode/templates/admin/admin_log.mako:10
4733 #: rhodecode/templates/admin/users/user_edit_audit.mako:25
4604 4734 #: rhodecode/templates/bookmarks/bookmarks.mako:61
4605 4735 #: rhodecode/templates/branches/branches.mako:60
4606 4736 #: rhodecode/templates/tags/tags.mako:61
@@ -4608,10 +4738,12 b' msgid "Date"'
4608 4738 msgstr ""
4609 4739
4610 4740 #: rhodecode/templates/admin/admin_log.mako:11
4741 #: rhodecode/templates/admin/users/user_edit_audit.mako:26
4611 4742 msgid "From IP"
4612 4743 msgstr ""
4613 4744
4614 4745 #: rhodecode/templates/admin/admin_log.mako:46
4746 #: rhodecode/templates/admin/users/user_edit_audit.mako:61
4615 4747 msgid "No actions yet"
4616 4748 msgstr ""
4617 4749
@@ -4650,7 +4782,7 b' msgstr ""'
4650 4782 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:72
4651 4783 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:135
4652 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 4786 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:79
4655 4787 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:110
4656 4788 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:160
@@ -4660,6 +4792,7 b' msgstr ""'
4660 4792 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:120
4661 4793 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:102
4662 4794 #: rhodecode/templates/admin/users/user_add.mako:128
4795 #: rhodecode/templates/admin/users/user_edit_groups.mako:27
4663 4796 #: rhodecode/templates/admin/users/user_edit_profile.mako:134
4664 4797 #: rhodecode/templates/base/default_perms_box.mako:88
4665 4798 msgid "Save"
@@ -4681,18 +4814,18 b' msgstr ""'
4681 4814 #: rhodecode/templates/admin/defaults/defaults_repositories.mako:14
4682 4815 #: rhodecode/templates/admin/gists/index.mako:110
4683 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 4818 #: rhodecode/templates/admin/repos/repo_edit_fields.mako:12
4686 4819 msgid "Type"
4687 4820 msgstr ""
4688 4821
4689 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 4824 msgid "Private Repository"
4692 4825 msgstr ""
4693 4826
4694 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 4829 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:112
4697 4830 #: rhodecode/templates/forks/fork.mako:87
4698 4831 msgid "Private repositories are only visible to people explicitly added as collaborators."
@@ -4754,7 +4887,7 b' msgid "Update Gist"'
4754 4887 msgstr ""
4755 4888
4756 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 4891 #: rhodecode/templates/changeset/changeset_file_comment.mako:385
4759 4892 #: rhodecode/templates/codeblocks/diffs.mako:76
4760 4893 #: rhodecode/templates/files/files_add.mako:102
@@ -4828,8 +4961,8 b' msgstr ""'
4828 4961 #: rhodecode/templates/changeset/changeset.mako:180
4829 4962 #: rhodecode/templates/compare/compare_commits.mako:17
4830 4963 #: rhodecode/templates/files/files_browser_tree.mako:9
4831 #: rhodecode/templates/pullrequests/pullrequest_show.mako:304
4832 #: rhodecode/templates/pullrequests/pullrequest_show.mako:452
4964 #: rhodecode/templates/pullrequests/pullrequest_show.mako:309
4965 #: rhodecode/templates/pullrequests/pullrequest_show.mako:457
4833 4966 #: rhodecode/templates/pullrequests/pullrequests.mako:102
4834 4967 #: rhodecode/templates/search/search_commit.mako:16
4835 4968 #: rhodecode/templates/tags/tags.mako:63
@@ -4886,7 +5019,7 b' msgstr ""'
4886 5019 #: rhodecode/templates/admin/gists/show.mako:56
4887 5020 #: rhodecode/templates/admin/integrations/list.mako:204
4888 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 5023 #: rhodecode/templates/data_table/_dt_elements.mako:118
4891 5024 #: rhodecode/templates/data_table/_dt_elements.mako:180
4892 5025 #: rhodecode/templates/data_table/_dt_elements.mako:193
@@ -4894,10 +5027,10 b' msgstr ""'
4894 5027 #: rhodecode/templates/debug_style/buttons.html:128
4895 5028 #: rhodecode/templates/files/files_add.mako:204
4896 5029 #: rhodecode/templates/files/files_edit.mako:165
4897 #: rhodecode/templates/files/files_source.mako:38
4898 #: rhodecode/templates/files/files_source.mako:41
5030 #: rhodecode/templates/files/files_source.mako:48
5031 #: rhodecode/templates/files/files_source.mako:51
4899 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 5034 #: rhodecode/templates/users/user_profile.mako:7
4902 5035 msgid "Edit"
4903 5036 msgstr ""
@@ -4916,7 +5049,7 b' msgstr ""'
4916 5049
4917 5050 #: rhodecode/templates/admin/gists/show.mako:91
4918 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 5053 msgid "Show as raw"
4921 5054 msgstr ""
4922 5055
@@ -4941,7 +5074,7 b' msgstr ""'
4941 5074 #: rhodecode/templates/admin/repos/repo_edit.mako:43
4942 5075 #: rhodecode/templates/admin/settings/settings.mako:14
4943 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 5078 msgid "Settings"
4946 5079 msgstr ""
4947 5080
@@ -4973,6 +5106,8 b' msgid "Create new integration"'
4973 5106 msgstr ""
4974 5107
4975 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 5111 msgid "Scope"
4977 5112 msgstr ""
4978 5113
@@ -5042,7 +5177,7 b' msgid "No description available"'
5042 5177 msgstr ""
5043 5178
5044 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 5181 msgid "My account"
5047 5182 msgstr ""
5048 5183
@@ -5051,9 +5186,10 b' msgid "My Account"'
5051 5186 msgstr ""
5052 5187
5053 5188 #: rhodecode/templates/admin/my_account/my_account.mako:29
5054 #: rhodecode/templates/admin/my_account/my_account_profile.mako:4
5055 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:4
5056 msgid "My Profile"
5189 #: rhodecode/templates/email_templates/user_registration.mako:26
5190 #: rhodecode/templates/users/user.mako:29
5191 #: rhodecode/templates/users/user_profile.mako:5
5192 msgid "Profile"
5057 5193 msgstr ""
5058 5194
5059 5195 #: rhodecode/templates/admin/my_account/my_account.mako:31
@@ -5065,11 +5201,8 b' msgid "OAuth Identities"'
5065 5201 msgstr ""
5066 5202
5067 5203 #: rhodecode/templates/admin/my_account/my_account.mako:37
5068 msgid "My Emails"
5069 msgstr ""
5070
5071 #: rhodecode/templates/admin/my_account/my_account.mako:38
5072 msgid "My Repositories"
5204 #: rhodecode/templates/admin/users/user_edit.mako:38
5205 msgid "Emails"
5073 5206 msgstr ""
5074 5207
5075 5208 #: rhodecode/templates/admin/my_account/my_account.mako:39
@@ -5078,79 +5211,79 b' msgstr ""'
5078 5211
5079 5212 #: rhodecode/templates/admin/my_account/my_account.mako:40
5080 5213 #: rhodecode/templates/admin/notifications/notifications.mako:33
5081 #: rhodecode/templates/base/base.mako:238
5214 #: rhodecode/templates/base/base.mako:241
5082 5215 msgid "Pull Requests"
5083 5216 msgstr ""
5084 5217
5085 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 5225 msgstr ""
5088 5226
5089 5227 #: rhodecode/templates/admin/my_account/my_account.mako:42
5090 msgid "My Live Notifications"
5228 msgid "Live Notifications"
5091 5229 msgstr ""
5092 5230
5093 5231 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:3
5232 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:3
5094 5233 msgid "Authentication Tokens"
5095 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 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."
5103 msgstr ""
5104
5105 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:14
5106 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:11
5107 msgid "Built-in"
5108 msgstr ""
5109
5110 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:23
5111 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:46
5112 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:51
5113 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:20
5114 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:42
5115 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:47
5116 msgid "expires"
5117 msgstr ""
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
5237 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:8
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."
5239 msgstr ""
5240
5241 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:13
5242 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:13
5243 msgid "Token"
5244 msgstr ""
5245
5246 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:17
5247 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:17
5248 msgid "Expiration"
5249 msgstr ""
5250
5251 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:48
5252 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:44
5132 5253 #, python-format
5133 5254 msgid "Confirm to remove this auth token: %s"
5134 5255 msgstr ""
5135 5256
5136 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:67
5137 msgid "No additional auth token specified"
5138 msgstr ""
5139
5140 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:78
5257 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:56
5258 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:52
5259 msgid "No additional auth tokens specified"
5260 msgstr ""
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 5264 msgid "New authentication token"
5142 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 5273 #: rhodecode/templates/admin/my_account/my_account_emails.mako:64
5146 5274 #: rhodecode/templates/admin/permissions/permissions_ips.mako:60
5147 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 5277 #: rhodecode/templates/admin/users/user_edit_emails.mako:62
5150 5278 #: rhodecode/templates/admin/users/user_edit_ips.mako:69
5151 5279 msgid "Add"
5152 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 5287 #: rhodecode/templates/admin/my_account/my_account_emails.mako:5
5155 5288 msgid "Account Emails"
5156 5289 msgstr ""
@@ -5202,6 +5335,11 b' msgstr ""'
5202 5335 msgid "Source type"
5203 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 5343 #: rhodecode/templates/admin/my_account/my_account_profile.mako:11
5206 5344 #: rhodecode/templates/admin/my_account/my_account_profile_edit.mako:55
5207 5345 #: rhodecode/templates/admin/users/user_edit_profile.mako:25
@@ -5291,14 +5429,6 b' msgstr ""'
5291 5429 msgid "Permissions Administration"
5292 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 5432 #: rhodecode/templates/admin/permissions/permissions.mako:33
5303 5433 msgid "Application"
5304 5434 msgstr ""
@@ -5421,7 +5551,7 b' msgstr ""'
5421 5551
5422 5552 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14
5423 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 5555 msgid "Repository groups"
5426 5556 msgstr ""
5427 5557
@@ -5435,7 +5565,7 b' msgid "Group Parent"'
5435 5565 msgstr ""
5436 5566
5437 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 5569 msgid "Copy Parent Group Permissions"
5440 5570 msgstr ""
5441 5571
@@ -5552,7 +5682,7 b' msgstr ""'
5552 5682 #: rhodecode/templates/admin/repo_groups/repo_group_edit_perms.mako:118
5553 5683 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:107
5554 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 5686 msgid "Add new"
5557 5687 msgstr ""
5558 5688
@@ -5610,51 +5740,47 b' msgid "Import Existing Repository ?"'
5610 5740 msgstr ""
5611 5741
5612 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 5744 msgid "Clone from"
5615 5745 msgstr ""
5616 5746
5617 #: rhodecode/templates/admin/repos/repo_add_base.mako:27
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
5747 #: rhodecode/templates/admin/repos/repo_add_base.mako:47
5622 5748 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:102
5623 5749 #: rhodecode/templates/forks/fork.mako:52
5624 5750 msgid "Keep it short and to the point. Use a README file for longer descriptions."
5625 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 5754 msgid "Repository Group"
5629 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 5758 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:62
5633 5759 #: rhodecode/templates/forks/fork.mako:64
5634 5760 #, python-format
5635 5761 msgid "Select my personal group (%(repo_group_name)s)"
5636 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 5765 #: rhodecode/templates/forks/fork.mako:67
5640 5766 msgid "Optionally select a group to put this repository into."
5641 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 5770 msgid "Copy permission set from the parent repository group."
5645 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 5774 msgid "Set the type of repository to create."
5649 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 5778 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:70
5653 5779 #: rhodecode/templates/forks/fork.mako:73
5654 5780 msgid "Landing commit"
5655 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 5784 msgid "The default commit for file pages, downloads, full text search index, and README generation."
5659 5785 msgstr ""
5660 5786
@@ -5694,7 +5820,16 b' msgstr ""'
5694 5820 msgid "Statistics"
5695 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 5833 msgid "Reviewers"
5699 5834 msgstr ""
5700 5835
@@ -5721,12 +5856,10 b' msgid "This repository is a fork of %(re'
5721 5856 msgstr ""
5722 5857
5723 5858 #: rhodecode/templates/admin/repos/repo_edit_advanced.mako:36
5724 #: rhodecode/templates/admin/repos/repo_edit_fork.mako:5
5725 5859 msgid "Set"
5726 5860 msgstr ""
5727 5861
5728 5862 #: rhodecode/templates/admin/repos/repo_edit_advanced.mako:39
5729 #: rhodecode/templates/admin/repos/repo_edit_fork.mako:9
5730 5863 msgid "Manually set this repository as a fork of another from the list"
5731 5864 msgstr ""
5732 5865
@@ -5852,10 +5985,11 b' msgstr ""'
5852 5985 #: rhodecode/templates/admin/repos/repo_edit_caches.mako:37
5853 5986 #: rhodecode/templates/admin/user_groups/user_group_add.mako:52
5854 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 5989 #: rhodecode/templates/admin/users/user_add.mako:97
5990 #: rhodecode/templates/admin/users/user_edit_groups.mako:64
5857 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 5993 msgid "Active"
5860 5994 msgstr ""
5861 5995
@@ -5929,6 +6063,22 b' msgstr ""'
5929 6063 msgid "Test Patterns"
5930 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 6082 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:5
5933 6083 msgid "Repository Permissions"
5934 6084 msgstr ""
@@ -5949,16 +6099,20 b' msgstr ""'
5949 6099 msgid "Remote mirror url"
5950 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 6106 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:22
6107 #: rhodecode/templates/admin/repos/repo_edit_remote.mako:30
5954 6108 msgid "Pull changes from remote location"
5955 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 6112 msgid "Confirm to pull changes from remote side"
5959 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 6116 msgid "This repository does not have any remote mirror url set."
5963 6117 msgstr ""
5964 6118
@@ -6078,11 +6232,79 b' msgstr ""'
6078 6232 msgid "Confirm to remove current statistics"
6079 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 6304 msgid "Select to inherit global vcs settings."
6083 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 6308 #: rhodecode/templates/admin/settings/settings_global.mako:139
6087 6309 #: rhodecode/templates/admin/settings/settings_labs.mako:48
6088 6310 #: rhodecode/templates/admin/settings/settings_vcs.mako:13
@@ -6588,7 +6810,7 b' msgstr ""'
6588 6810
6589 6811 #: rhodecode/templates/admin/user_groups/user_group_add.mako:13
6590 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 6814 msgid "User groups"
6593 6815 msgstr ""
6594 6816
@@ -6629,29 +6851,69 b' msgid "Members"'
6629 6851 msgstr ""
6630 6852
6631 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 6858 msgid "Assigned to repositories"
6633 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 6862 msgid "Assigned to repo groups"
6637 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 6866 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:6
6641 6867 #, python-format
6642 6868 msgid "User Group: %s"
6643 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 6908 msgid "Delete User Group"
6647 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 6912 #, python-format
6651 6913 msgid "Confirm to delete user group `%(ugroup)s` with all permission assignments"
6652 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 6917 msgid "Delete This User Group"
6656 6918 msgstr ""
6657 6919
@@ -6677,6 +6939,7 b' msgid "No members yet"'
6677 6939 msgstr ""
6678 6940
6679 6941 #: rhodecode/templates/admin/user_groups/user_groups.mako:5
6942 #: rhodecode/templates/admin/users/user_edit_groups.mako:6
6680 6943 msgid "User groups administration"
6681 6944 msgstr ""
6682 6945
@@ -6684,18 +6947,22 b' msgstr ""'
6684 6947 msgid "user groups"
6685 6948 msgstr ""
6686 6949
6950 #: rhodecode/templates/admin/user_groups/user_groups.mako:62
6951 msgid "Sync"
6952 msgstr ""
6953
6687 6954 #: rhodecode/templates/admin/users/user_add.mako:5
6688 6955 msgid "Add user"
6689 6956 msgstr ""
6690 6957
6691 6958 #: rhodecode/templates/admin/users/user_add.mako:13
6692 6959 #: rhodecode/templates/admin/users/user_edit.mako:14
6693 #: rhodecode/templates/base/base.mako:75
6960 #: rhodecode/templates/base/base.mako:78
6694 6961 msgid "Users"
6695 6962 msgstr ""
6696 6963
6697 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 6966 msgid "Add User"
6700 6967 msgstr ""
6701 6968
@@ -6747,14 +7014,18 b' msgstr ""'
6747 7014 msgid "Auth tokens"
6748 7015 msgstr ""
6749 7016
6750 #: rhodecode/templates/admin/users/user_edit.mako:38
6751 msgid "Emails"
6752 msgstr ""
6753
6754 7017 #: rhodecode/templates/admin/users/user_edit.mako:39
6755 7018 msgid "Ip Whitelist"
6756 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 7029 #: rhodecode/templates/admin/users/user_edit_advanced.mako:6
6759 7030 #: rhodecode/templates/admin/users/user_edit_profile.mako:106
6760 7031 msgid "Source of Record"
@@ -6765,7 +7036,7 b' msgid "Last login"'
6765 7036 msgstr ""
6766 7037
6767 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 7040 msgid "Last activity"
6770 7041 msgstr ""
6771 7042
@@ -6868,22 +7139,23 b' msgstr ""'
6868 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 7140 msgstr ""
6870 7141
6871 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:3
6872 msgid "Authentication Access Tokens"
6873 msgstr ""
6874
6875 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:63
6876 msgid "No additional auth tokens specified"
6877 msgstr ""
6878
6879 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:75
6880 msgid "New auth token"
7142 #: rhodecode/templates/admin/users/user_edit_audit.mako:7
7143 msgid "User Audit Logs"
7144 msgstr ""
7145
7146 #: rhodecode/templates/admin/users/user_edit_audit.mako:14
7147 msgid "audit filter..."
6881 7148 msgstr ""
6882 7149
6883 7150 #: rhodecode/templates/admin/users/user_edit_emails.mako:5
6884 7151 msgid "Additional Email Addresses"
6885 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 7159 #: rhodecode/templates/admin/users/user_edit_ips.mako:3
6888 7160 msgid "Custom IP Whitelist"
6889 7161 msgstr ""
@@ -6938,98 +7210,98 b' msgstr ""'
6938 7210 msgid "Users administration"
6939 7211 msgstr ""
6940 7212
6941 #: rhodecode/templates/admin/users/users.mako:105
7213 #: rhodecode/templates/admin/users/users.mako:77
6942 7214 msgid "Auth type"
6943 7215 msgstr ""
6944 7216
6945 #: rhodecode/templates/base/base.mako:50
7217 #: rhodecode/templates/base/base.mako:53
6946 7218 #, python-format
6947 7219 msgid "RhodeCode instance id: %s"
6948 7220 msgstr ""
6949 7221
6950 #: rhodecode/templates/base/base.mako:78
7222 #: rhodecode/templates/base/base.mako:81
6951 7223 msgid "Authentication"
6952 7224 msgstr ""
6953 7225
6954 #: rhodecode/templates/base/base.mako:80
7226 #: rhodecode/templates/base/base.mako:83
6955 7227 msgid "Defaults"
6956 7228 msgstr ""
6957 7229
6958 #: rhodecode/templates/base/base.mako:98
7230 #: rhodecode/templates/base/base.mako:101
6959 7231 #: rhodecode/templates/files/files_pjax.mako:24
6960 7232 #: rhodecode/templates/summary/components.mako:42
6961 7233 msgid "Show More"
6962 7234 msgstr ""
6963 7235
6964 #: rhodecode/templates/base/base.mako:185
7236 #: rhodecode/templates/base/base.mako:188
6965 7237 msgid "Fork of"
6966 7238 msgstr ""
6967 7239
6968 #: rhodecode/templates/base/base.mako:202
7240 #: rhodecode/templates/base/base.mako:205
6969 7241 #, python-format
6970 7242 msgid "Repository locked by %(user)s"
6971 7243 msgstr ""
6972 7244
6973 #: rhodecode/templates/base/base.mako:207
7245 #: rhodecode/templates/base/base.mako:210
6974 7246 msgid "Repository not locked. Pull repository to lock it."
6975 7247 msgstr ""
6976 7248
6977 #: rhodecode/templates/base/base.mako:225
7249 #: rhodecode/templates/base/base.mako:228
6978 7250 #: rhodecode/templates/data_table/_dt_elements.mako:12
6979 7251 #: rhodecode/templates/data_table/_dt_elements.mako:13
6980 7252 #: rhodecode/templates/data_table/_dt_elements.mako:153
6981 7253 msgid "Summary"
6982 7254 msgstr ""
6983 7255
6984 #: rhodecode/templates/base/base.mako:226
7256 #: rhodecode/templates/base/base.mako:229
6985 7257 #: rhodecode/templates/data_table/_dt_elements.mako:17
6986 7258 #: rhodecode/templates/data_table/_dt_elements.mako:18
6987 7259 msgid "Changelog"
6988 7260 msgstr ""
6989 7261
6990 #: rhodecode/templates/base/base.mako:227
7262 #: rhodecode/templates/base/base.mako:230
6991 7263 #: rhodecode/templates/data_table/_dt_elements.mako:22
6992 7264 #: rhodecode/templates/data_table/_dt_elements.mako:23
6993 7265 #: rhodecode/templates/files/files.mako:15
6994 7266 msgid "Files"
6995 7267 msgstr ""
6996 7268
6997 #: rhodecode/templates/base/base.mako:229
7269 #: rhodecode/templates/base/base.mako:232
6998 7270 #: rhodecode/templates/bookmarks/bookmarks.mako:68
6999 7271 #: rhodecode/templates/branches/branches.mako:67
7000 7272 #: rhodecode/templates/tags/tags.mako:68
7001 7273 msgid "Compare"
7002 7274 msgstr ""
7003 7275
7004 #: rhodecode/templates/base/base.mako:234
7276 #: rhodecode/templates/base/base.mako:237
7005 7277 #, python-format
7006 7278 msgid "Show Pull Requests for %s"
7007 7279 msgstr ""
7008 7280
7009 #: rhodecode/templates/base/base.mako:243
7281 #: rhodecode/templates/base/base.mako:246
7010 7282 msgid "Options"
7011 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 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 7292 #: rhodecode/templates/search/search.mako:64
7021 7293 msgid "Search"
7022 7294 msgstr ""
7023 7295
7024 #: rhodecode/templates/base/base.mako:257
7296 #: rhodecode/templates/base/base.mako:260
7025 7297 msgid "Unlock"
7026 7298 msgstr ""
7027 7299
7028 #: rhodecode/templates/base/base.mako:259
7300 #: rhodecode/templates/base/base.mako:262
7029 7301 msgid "Lock"
7030 7302 msgstr ""
7031 7303
7032 #: rhodecode/templates/base/base.mako:264
7304 #: rhodecode/templates/base/base.mako:267
7033 7305 #: rhodecode/templates/data_table/_dt_elements.mako:27
7034 7306 #: rhodecode/templates/data_table/_dt_elements.mako:28
7035 7307 #: rhodecode/templates/forks/forks_data.mako:8
@@ -7039,77 +7311,77 b' msgid_plural "Forks"'
7039 7311 msgstr[0] ""
7040 7312 msgstr[1] ""
7041 7313
7042 #: rhodecode/templates/base/base.mako:265
7314 #: rhodecode/templates/base/base.mako:268
7043 7315 msgid "Create Pull Request"
7044 7316 msgstr ""
7045 7317
7046 #: rhodecode/templates/base/base.mako:287
7318 #: rhodecode/templates/base/base.mako:290
7047 7319 msgid "Sign in"
7048 7320 msgstr ""
7049 7321
7050 #: rhodecode/templates/base/base.mako:295
7322 #: rhodecode/templates/base/base.mako:298
7051 7323 #: rhodecode/templates/debug_style/login.html:28
7052 7324 msgid "Sign in to your account"
7053 7325 msgstr ""
7054 7326
7055 #: rhodecode/templates/base/base.mako:312
7327 #: rhodecode/templates/base/base.mako:315
7056 7328 #: rhodecode/templates/debug_style/login.html:46
7057 7329 msgid "(Forgot password?)"
7058 7330 msgstr ""
7059 7331
7060 #: rhodecode/templates/base/base.mako:322
7332 #: rhodecode/templates/base/base.mako:325
7061 7333 #: rhodecode/templates/debug_style/login.html:56
7062 7334 msgid "Don't have an account ?"
7063 7335 msgstr ""
7064 7336
7065 #: rhodecode/templates/base/base.mako:342
7337 #: rhodecode/templates/base/base.mako:345
7066 7338 msgid "My personal group"
7067 7339 msgstr ""
7068 7340
7069 #: rhodecode/templates/base/base.mako:346
7341 #: rhodecode/templates/base/base.mako:349
7070 7342 msgid "Sign Out"
7071 7343 msgstr ""
7072 7344
7073 #: rhodecode/templates/base/base.mako:382
7345 #: rhodecode/templates/base/base.mako:385
7074 7346 msgid "Show activity journal"
7075 7347 msgstr ""
7076 7348
7077 #: rhodecode/templates/base/base.mako:383
7349 #: rhodecode/templates/base/base.mako:386
7078 7350 #: rhodecode/templates/journal/journal.mako:4
7079 7351 #: rhodecode/templates/journal/journal.mako:14
7080 7352 msgid "Journal"
7081 7353 msgstr ""
7082 7354
7083 #: rhodecode/templates/base/base.mako:388
7355 #: rhodecode/templates/base/base.mako:391
7084 7356 msgid "Show Public activity journal"
7085 7357 msgstr ""
7086 7358
7087 #: rhodecode/templates/base/base.mako:389
7359 #: rhodecode/templates/base/base.mako:392
7088 7360 msgid "Public journal"
7089 7361 msgstr ""
7090 7362
7091 #: rhodecode/templates/base/base.mako:394
7363 #: rhodecode/templates/base/base.mako:397
7092 7364 msgid "Show Gists"
7093 7365 msgstr ""
7094 7366
7095 #: rhodecode/templates/base/base.mako:395
7367 #: rhodecode/templates/base/base.mako:398
7096 7368 msgid "Gists"
7097 7369 msgstr ""
7098 7370
7099 #: rhodecode/templates/base/base.mako:399
7371 #: rhodecode/templates/base/base.mako:402
7100 7372 msgid "Search in repositories you have access to"
7101 7373 msgstr ""
7102 7374
7103 #: rhodecode/templates/base/base.mako:405
7375 #: rhodecode/templates/base/base.mako:408
7104 7376 msgid "Admin settings"
7105 7377 msgstr ""
7106 7378
7107 #: rhodecode/templates/base/base.mako:412
7379 #: rhodecode/templates/base/base.mako:415
7108 7380 msgid "Delegated Admin settings"
7109 7381 msgstr ""
7110 7382
7111 #: rhodecode/templates/base/base.mako:422
7112 #: rhodecode/templates/base/base.mako:423
7383 #: rhodecode/templates/base/base.mako:425
7384 #: rhodecode/templates/base/base.mako:426
7113 7385 #: rhodecode/templates/debug_style/alerts.html:5
7114 7386 #: rhodecode/templates/debug_style/buttons.html:5
7115 7387 #: rhodecode/templates/debug_style/code-block.html:6
@@ -7131,15 +7403,15 b' msgstr ""'
7131 7403 msgid "Style"
7132 7404 msgstr ""
7133 7405
7134 #: rhodecode/templates/base/base.mako:480
7406 #: rhodecode/templates/base/base.mako:483
7135 7407 msgid "Go to"
7136 7408 msgstr ""
7137 7409
7138 #: rhodecode/templates/base/base.mako:533
7410 #: rhodecode/templates/base/base.mako:536
7139 7411 msgid "Keyboard shortcuts"
7140 7412 msgstr ""
7141 7413
7142 #: rhodecode/templates/base/base.mako:541
7414 #: rhodecode/templates/base/base.mako:544
7143 7415 msgid "Site-wide shortcuts"
7144 7416 msgstr ""
7145 7417
@@ -7196,7 +7468,7 b' msgid "User Group Creation"'
7196 7468 msgstr ""
7197 7469
7198 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 7472 msgstr ""
7201 7473
7202 7474 #: rhodecode/templates/base/default_perms_box.mako:78
@@ -7218,19 +7490,19 b' msgid ""'
7218 7490 "permission by members of user groups."
7219 7491 msgstr ""
7220 7492
7221 #: rhodecode/templates/base/issue_tracker_settings.mako:22
7493 #: rhodecode/templates/base/issue_tracker_settings.mako:21
7222 7494 msgid "Read more"
7223 7495 msgstr ""
7224 7496
7225 #: rhodecode/templates/base/issue_tracker_settings.mako:92
7497 #: rhodecode/templates/base/issue_tracker_settings.mako:91
7226 7498 msgid "New Entry"
7227 7499 msgstr ""
7228 7500
7229 #: rhodecode/templates/base/issue_tracker_settings.mako:96
7501 #: rhodecode/templates/base/issue_tracker_settings.mako:95
7230 7502 msgid "Confirm to remove this pattern:"
7231 7503 msgstr ""
7232 7504
7233 #: rhodecode/templates/base/issue_tracker_settings.mako:192
7505 #: rhodecode/templates/base/issue_tracker_settings.mako:191
7234 7506 #: rhodecode/templates/changeset/changeset_file_comment.mako:269
7235 7507 #: rhodecode/templates/changeset/changeset_file_comment.mako:319
7236 7508 #: rhodecode/templates/files/files_add.mako:78
@@ -7240,7 +7512,7 b' msgstr ""'
7240 7512 msgid "Preview"
7241 7513 msgstr ""
7242 7514
7243 #: rhodecode/templates/base/issue_tracker_settings.mako:193
7515 #: rhodecode/templates/base/issue_tracker_settings.mako:192
7244 7516 msgid "Test Pattern Preview"
7245 7517 msgstr ""
7246 7518
@@ -7378,99 +7650,127 b' msgstr ""'
7378 7650 msgid "Enable largefiles extension"
7379 7651 msgstr ""
7380 7652
7381 #: rhodecode/templates/base/vcs_settings.mako:99
7653 #: rhodecode/templates/base/vcs_settings.mako:100
7382 7654 msgid "Enable Largefiles extensions for all repositories."
7383 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 7666 msgid "Set repositories as publishing"
7387 7667 msgstr ""
7388 7668
7389 #: rhodecode/templates/base/vcs_settings.mako:103
7669 #: rhodecode/templates/base/vcs_settings.mako:119
7390 7670 msgid "Set repository as publishing"
7391 7671 msgstr ""
7392 7672
7393 #: rhodecode/templates/base/vcs_settings.mako:106
7673 #: rhodecode/templates/base/vcs_settings.mako:122
7394 7674 msgid "When this is enabled all commits in the repository are seen as public commits by clients."
7395 7675 msgstr ""
7396 7676
7397 #: rhodecode/templates/base/vcs_settings.mako:111
7677 #: rhodecode/templates/base/vcs_settings.mako:127
7398 7678 msgid "Enable hgsubversion extension"
7399 7679 msgstr ""
7400 7680
7401 #: rhodecode/templates/base/vcs_settings.mako:114
7681 #: rhodecode/templates/base/vcs_settings.mako:130
7402 7682 msgid "Requires hgsubversion library to be installed. Allows cloning remote SVN repositories and migrates them to Mercurial type."
7403 7683 msgstr ""
7404 7684
7405 #: rhodecode/templates/base/vcs_settings.mako:123
7685 #: rhodecode/templates/base/vcs_settings.mako:139
7406 7686 msgid "Mercurial Labs Settings"
7407 7687 msgstr ""
7408 7688
7409 #: rhodecode/templates/base/vcs_settings.mako:123
7689 #: rhodecode/templates/base/vcs_settings.mako:139
7410 7690 msgid "These features are considered experimental and may not work as expected."
7411 7691 msgstr ""
7412 7692
7413 #: rhodecode/templates/base/vcs_settings.mako:129
7693 #: rhodecode/templates/base/vcs_settings.mako:145
7414 7694 msgid "Use rebase as merge strategy"
7415 7695 msgstr ""
7416 7696
7417 #: rhodecode/templates/base/vcs_settings.mako:132
7697 #: rhodecode/templates/base/vcs_settings.mako:148
7418 7698 msgid "Use rebase instead of creating a merge commit when merging via web interface."
7419 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 7722 msgid "Global Subversion Settings"
7423 7723 msgstr ""
7424 7724
7425 #: rhodecode/templates/base/vcs_settings.mako:150
7725 #: rhodecode/templates/base/vcs_settings.mako:199
7426 7726 msgid "Proxy subversion HTTP requests"
7427 7727 msgstr ""
7428 7728
7429 #: rhodecode/templates/base/vcs_settings.mako:154
7729 #: rhodecode/templates/base/vcs_settings.mako:203
7430 7730 msgid "Subversion HTTP Support. Enables communication with SVN over HTTP protocol."
7431 7731 msgstr ""
7432 7732
7433 #: rhodecode/templates/base/vcs_settings.mako:155
7733 #: rhodecode/templates/base/vcs_settings.mako:204
7434 7734 msgid "SVN Protocol setup Documentation"
7435 7735 msgstr ""
7436 7736
7437 #: rhodecode/templates/base/vcs_settings.mako:161
7737 #: rhodecode/templates/base/vcs_settings.mako:210
7438 7738 msgid "Subversion HTTP Server URL"
7439 7739 msgstr ""
7440 7740
7441 #: rhodecode/templates/base/vcs_settings.mako:167
7741 #: rhodecode/templates/base/vcs_settings.mako:216
7442 7742 msgid "Generate Apache Config"
7443 7743 msgstr ""
7444 7744
7445 #: rhodecode/templates/base/vcs_settings.mako:179
7745 #: rhodecode/templates/base/vcs_settings.mako:228
7446 7746 msgid "Subversion Settings"
7447 7747 msgstr ""
7448 7748
7449 #: rhodecode/templates/base/vcs_settings.mako:184
7749 #: rhodecode/templates/base/vcs_settings.mako:233
7450 7750 msgid "Repository patterns"
7451 7751 msgstr ""
7452 7752
7453 #: rhodecode/templates/base/vcs_settings.mako:188
7753 #: rhodecode/templates/base/vcs_settings.mako:237
7454 7754 msgid "Patterns for identifying SVN branches and tags. For recursive search, use \"*\". Eg.: \"/branches/*\""
7455 7755 msgstr ""
7456 7756
7457 #: rhodecode/templates/base/vcs_settings.mako:254
7757 #: rhodecode/templates/base/vcs_settings.mako:301
7458 7758 msgid "Pull Request Settings"
7459 7759 msgstr ""
7460 7760
7461 #: rhodecode/templates/base/vcs_settings.mako:259
7761 #: rhodecode/templates/base/vcs_settings.mako:306
7462 7762 msgid "Enable server-side merge for pull requests"
7463 7763 msgstr ""
7464 7764
7465 #: rhodecode/templates/base/vcs_settings.mako:262
7765 #: rhodecode/templates/base/vcs_settings.mako:309
7466 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 7767 msgstr ""
7468 7768
7469 #: rhodecode/templates/base/vcs_settings.mako:266
7769 #: rhodecode/templates/base/vcs_settings.mako:313
7470 7770 msgid "Invalidate and relocate inline comments during update"
7471 7771 msgstr ""
7472 7772
7473 #: rhodecode/templates/base/vcs_settings.mako:269
7773 #: rhodecode/templates/base/vcs_settings.mako:316
7474 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 7775 msgstr ""
7476 7776
@@ -7605,7 +7905,7 b' msgstr ""'
7605 7905
7606 7906 #: rhodecode/templates/changelog/changelog_elements.mako:53
7607 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 7909 #: rhodecode/templates/search/search_commit.mako:36
7610 7910 msgid "Expand commit message"
7611 7911 msgstr ""
@@ -7698,8 +7998,8 b' msgid "Diff options"'
7698 7998 msgstr ""
7699 7999
7700 8000 #: rhodecode/templates/changeset/changeset.mako:119
7701 #: rhodecode/templates/codeblocks/diffs.mako:436
7702 #: rhodecode/templates/codeblocks/diffs.mako:439
8001 #: rhodecode/templates/codeblocks/diffs.mako:445
8002 #: rhodecode/templates/codeblocks/diffs.mako:448
7703 8003 msgid "Raw diff"
7704 8004 msgstr ""
7705 8005
@@ -7716,8 +8016,8 b' msgid "Patch Diff"'
7716 8016 msgstr ""
7717 8017
7718 8018 #: rhodecode/templates/changeset/changeset.mako:127
7719 #: rhodecode/templates/codeblocks/diffs.mako:443
7720 #: rhodecode/templates/codeblocks/diffs.mako:446
8019 #: rhodecode/templates/codeblocks/diffs.mako:452
8020 #: rhodecode/templates/codeblocks/diffs.mako:455
7721 8021 msgid "Download diff"
7722 8022 msgstr ""
7723 8023
@@ -7727,7 +8027,7 b' msgstr ""'
7727 8027
7728 8028 #: rhodecode/templates/changeset/changeset.mako:145
7729 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 8031 #, python-format
7732 8032 msgid "%d Commit comment"
7733 8033 msgid_plural "%d Commit comments"
@@ -7736,7 +8036,7 b' msgstr[1] ""'
7736 8036
7737 8037 #: rhodecode/templates/changeset/changeset.mako:150
7738 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 8040 #, python-format
7741 8041 msgid "%d Inline Comment"
7742 8042 msgid_plural "%d Inline Comments"
@@ -7841,18 +8141,16 b' msgstr ""'
7841 8141
7842 8142 #: rhodecode/templates/changeset/changeset_file_comment.mako:363
7843 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 8145 #: rhodecode/templates/pullrequests/pullrequests.mako:52
7846 8146 msgid "Closed"
7847 8147 msgstr ""
7848 8148
7849 #: rhodecode/templates/changeset/changeset_file_comment.mako:388
8149 #: rhodecode/templates/changeset/changeset_file_comment.mako:393
7850 8150 #: rhodecode/templates/compare/compare_diff.mako:104
7851 8151 #: rhodecode/templates/compare/compare_diff.mako:112
7852 8152 #: rhodecode/templates/compare/compare_diff.mako:120
7853 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 8154 msgid "Comment"
7857 8155 msgstr ""
7858 8156
@@ -7887,7 +8185,7 b' msgstr ""'
7887 8185
7888 8186 #: rhodecode/templates/changeset/changeset_range.mako:99
7889 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 8189 #, python-format
7892 8190 msgid "Expand %s commit"
7893 8191 msgid_plural "Expand %s commits"
@@ -7896,7 +8194,7 b' msgstr[1] ""'
7896 8194
7897 8195 #: rhodecode/templates/changeset/changeset_range.mako:105
7898 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 8198 #, python-format
7901 8199 msgid "Collapse %s commit"
7902 8200 msgid_plural "Collapse %s commits"
@@ -7995,64 +8293,68 b' msgstr ""'
7995 8293 msgid "File was deleted in this version, and outdated comments were made on it"
7996 8294 msgstr ""
7997 8295
7998 #: rhodecode/templates/codeblocks/diffs.mako:406
7999 #: rhodecode/templates/codeblocks/diffs.mako:422
8296 #: rhodecode/templates/codeblocks/diffs.mako:415
8297 #: rhodecode/templates/codeblocks/diffs.mako:431
8000 8298 #, python-format
8001 8299 msgid "Show file at commit: %(commit_id)s"
8002 8300 msgstr ""
8003 8301
8004 #: rhodecode/templates/codeblocks/diffs.mako:408
8005 #: rhodecode/templates/codeblocks/diffs.mako:415
8302 #: rhodecode/templates/codeblocks/diffs.mako:417
8303 #: rhodecode/templates/codeblocks/diffs.mako:424
8006 8304 msgid "Show file before"
8007 8305 msgstr ""
8008 8306
8009 #: rhodecode/templates/codeblocks/diffs.mako:413
8010 #: rhodecode/templates/codeblocks/diffs.mako:429
8307 #: rhodecode/templates/codeblocks/diffs.mako:422
8308 #: rhodecode/templates/codeblocks/diffs.mako:438
8011 8309 #, python-format
8012 8310 msgid "File no longer present at commit: %(commit_id)s"
8013 8311 msgstr ""
8014 8312
8015 #: rhodecode/templates/codeblocks/diffs.mako:424
8016 #: rhodecode/templates/codeblocks/diffs.mako:431
8313 #: rhodecode/templates/codeblocks/diffs.mako:433
8314 #: rhodecode/templates/codeblocks/diffs.mako:440
8017 8315 msgid "Show file after"
8018 8316 msgstr ""
8019 8317
8020 #: rhodecode/templates/codeblocks/diffs.mako:462
8318 #: rhodecode/templates/codeblocks/diffs.mako:471
8021 8319 msgid "Show comments"
8022 8320 msgstr ""
8023 8321
8024 #: rhodecode/templates/codeblocks/diffs.mako:462
8322 #: rhodecode/templates/codeblocks/diffs.mako:471
8025 8323 msgid "Hide comments"
8026 8324 msgstr ""
8027 8325
8028 #: rhodecode/templates/codeblocks/diffs.mako:634
8326 #: rhodecode/templates/codeblocks/diffs.mako:643
8029 8327 msgid "View side by side"
8030 8328 msgstr ""
8031 8329
8032 #: rhodecode/templates/codeblocks/diffs.mako:636
8330 #: rhodecode/templates/codeblocks/diffs.mako:645
8033 8331 msgid "Side by Side"
8034 8332 msgstr ""
8035 8333
8036 #: rhodecode/templates/codeblocks/diffs.mako:640
8334 #: rhodecode/templates/codeblocks/diffs.mako:649
8037 8335 msgid "View unified"
8038 8336 msgstr ""
8039 8337
8040 #: rhodecode/templates/codeblocks/diffs.mako:641
8338 #: rhodecode/templates/codeblocks/diffs.mako:650
8041 8339 msgid "Unified"
8042 8340 msgstr ""
8043 8341
8044 #: rhodecode/templates/codeblocks/diffs.mako:651
8342 #: rhodecode/templates/codeblocks/diffs.mako:660
8045 8343 msgid "Expand All Files"
8046 8344 msgstr ""
8047 8345
8048 #: rhodecode/templates/codeblocks/diffs.mako:655
8346 #: rhodecode/templates/codeblocks/diffs.mako:664
8049 8347 msgid "Collapse All Files"
8050 8348 msgstr ""
8051 8349
8052 #: rhodecode/templates/codeblocks/diffs.mako:659
8350 #: rhodecode/templates/codeblocks/diffs.mako:668
8053 8351 msgid "Wide Mode Diff"
8054 8352 msgstr ""
8055 8353
8354 #: rhodecode/templates/codeblocks/source.mako:24
8355 msgid "view annotation from before this change"
8356 msgstr ""
8357
8056 8358 #: rhodecode/templates/compare/compare_commits.mako:5
8057 8359 msgid "Common Ancestor Commit"
8058 8360 msgstr ""
@@ -8062,7 +8364,7 b' msgid "Compare was calculated based on t'
8062 8364 msgstr ""
8063 8365
8064 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 8368 msgid "Time"
8067 8369 msgstr ""
8068 8370
@@ -8074,7 +8376,7 b' msgstr[0] ""'
8074 8376 msgstr[1] ""
8075 8377
8076 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 8380 msgid "show it"
8079 8381 msgid_plural "show them"
8080 8382 msgstr[0] ""
@@ -8110,14 +8412,14 b' msgstr ""'
8110 8412
8111 8413 #: rhodecode/templates/compare/compare_diff.mako:60
8112 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 8416 msgid "Target"
8115 8417 msgstr ""
8116 8418
8117 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 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 8423 msgid "Source"
8122 8424 msgstr ""
8123 8425
@@ -8340,125 +8642,139 b' msgstr ""'
8340 8642 msgid "RhodeCode"
8341 8643 msgstr ""
8342 8644
8343 #: rhodecode/templates/email_templates/commit_comment.mako:16
8344 #: rhodecode/templates/email_templates/pull_request_comment.mako:18
8645 #: rhodecode/templates/email_templates/commit_comment.mako:18
8646 #: rhodecode/templates/email_templates/pull_request_comment.mako:19
8345 8647 msgid "[mention]"
8346 8648 msgstr ""
8347 8649
8348 #: rhodecode/templates/email_templates/commit_comment.mako:19
8349 #, python-format
8350 msgid "%(user)s commented on commit `%(commit_id)s` (file: `%(comment_file)s`)"
8351 msgstr ""
8352
8353 #: rhodecode/templates/email_templates/commit_comment.mako:19
8354 #: rhodecode/templates/email_templates/commit_comment.mako:22
8650 #: rhodecode/templates/email_templates/commit_comment.mako:21
8651 #, python-format
8652 msgid "%(user)s left %(comment_type)s on commit `%(commit_id)s` (file: `%(comment_file)s`)"
8653 msgstr ""
8654
8655 #: rhodecode/templates/email_templates/commit_comment.mako:21
8355 8656 #: rhodecode/templates/email_templates/commit_comment.mako:24
8657 #: rhodecode/templates/email_templates/commit_comment.mako:26
8356 8658 #, python-format
8357 8659 msgid "in the %(repo_name)s repository"
8358 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 8662 #: rhodecode/templates/email_templates/commit_comment.mako:24
8366 #: rhodecode/templates/email_templates/commit_comment.mako:78
8367 #, python-format
8368 msgid "%(user)s commented on commit `%(commit_id)s`"
8369 msgstr ""
8370
8371 #: rhodecode/templates/email_templates/commit_comment.mako:43
8372 #: rhodecode/templates/email_templates/pull_request_comment.mako:44
8663 #, python-format
8664 msgid "%(user)s left %(comment_type)s on commit `%(commit_id)s` (status: %(status)s)"
8665 msgstr ""
8666
8667 #: rhodecode/templates/email_templates/commit_comment.mako:26
8668 #, python-format
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 8674 msgid "Comment link"
8374 8675 msgstr ""
8375 8676
8376 #: rhodecode/templates/email_templates/commit_comment.mako:48
8377 #: rhodecode/templates/email_templates/pull_request_comment.mako:49
8677 #: rhodecode/templates/email_templates/commit_comment.mako:52
8678 #: rhodecode/templates/email_templates/pull_request_comment.mako:52
8378 8679 #, python-format
8379 8680 msgid "File: %(comment_file)s on line %(comment_line)s"
8380 8681 msgstr ""
8381 8682
8382 #: rhodecode/templates/email_templates/commit_comment.mako:54
8683 #: rhodecode/templates/email_templates/commit_comment.mako:58
8383 8684 msgid "Commit status was changed to"
8384 8685 msgstr ""
8385 8686
8386 #: rhodecode/templates/email_templates/commit_comment.mako:76
8687 #: rhodecode/templates/email_templates/commit_comment.mako:82
8387 8688 #, python-format
8388 8689 msgid "%(user)s commented on commit `%(commit_id)s` (file:`%(comment_file)s`)"
8389 8690 msgstr ""
8390 8691
8391 #: rhodecode/templates/email_templates/commit_comment.mako:76
8392 #: rhodecode/templates/email_templates/commit_comment.mako:78
8692 #: rhodecode/templates/email_templates/commit_comment.mako:82
8693 #: rhodecode/templates/email_templates/commit_comment.mako:84
8393 8694 #, python-format
8394 8695 msgid "in the %(repo)s repository"
8395 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 8705 msgid "Status"
8399 8706 msgstr ""
8400 8707
8401 #: rhodecode/templates/email_templates/commit_comment.mako:85
8708 #: rhodecode/templates/email_templates/commit_comment.mako:93
8402 8709 msgid "The commit status was changed to"
8403 8710 msgstr ""
8404 8711
8405 #: rhodecode/templates/email_templates/commit_comment.mako:87
8406 #: rhodecode/templates/email_templates/pull_request_comment.mako:97
8407 #, python-format
8408 msgid "Comment on line: %(comment_line)s"
8409 msgstr ""
8410
8411 #: rhodecode/templates/email_templates/password_reset.mako:30
8712 #: rhodecode/templates/email_templates/commit_comment.mako:99
8713 #: rhodecode/templates/email_templates/pull_request_comment.mako:107
8714 #, python-format
8715 msgid "TODO comment on line: %(comment_line)s"
8716 msgstr ""
8717
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 8730 msgid "Generate new password here"
8413 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 8763 #, python-format
8417 8764 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\" (file: `%(comment_file)s`)"
8418 8765 msgstr ""
8419 8766
8420 #: rhodecode/templates/email_templates/pull_request_comment.mako:24
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
8767 #: rhodecode/templates/email_templates/pull_request_comment.mako:86
8427 8768 #, python-format
8428 8769 msgid "%(user)s commented on pull request #%(pr_id)s \"%(pr_title)s\""
8429 8770 msgstr ""
8430 8771
8431 #: rhodecode/templates/email_templates/pull_request_comment.mako:46
8432 msgid "Source repository"
8433 msgstr ""
8434
8435 #: rhodecode/templates/email_templates/pull_request_comment.mako:55
8436 #, python-format
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"
8772 #: rhodecode/templates/email_templates/pull_request_comment.mako:97
8773 msgid "Closed pull request with status"
8774 msgstr ""
8775
8776 #: rhodecode/templates/email_templates/pull_request_comment.mako:99
8777 msgid "Submitted review status"
8462 8778 msgstr ""
8463 8779
8464 8780 #: rhodecode/templates/email_templates/pull_request_review.mako:14
@@ -8523,12 +8839,6 b' msgstr ""'
8523 8839 msgid "Full Name"
8524 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 8842 #: rhodecode/templates/errors/error_document.mako:46
8533 8843 #, python-format
8534 8844 msgid "You will be redirected to %s in %s seconds"
@@ -8685,13 +8995,13 b' msgid "Delete file"'
8685 8995 msgstr ""
8686 8996
8687 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 8999 #, python-format
8690 9000 msgid "Binary file (%s)"
8691 9001 msgstr ""
8692 9002
8693 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 9005 msgid "File is too big to display"
8696 9006 msgstr ""
8697 9007
@@ -8704,19 +9014,19 b' msgstr ""'
8704 9014 msgid "Commit Description"
8705 9015 msgstr ""
8706 9016
8707 #: rhodecode/templates/files/files_detail.mako:35
9017 #: rhodecode/templates/files/files_detail.mako:32
8708 9018 msgid "File last commit"
8709 9019 msgstr ""
8710 9020
8711 #: rhodecode/templates/files/files_detail.mako:51
9021 #: rhodecode/templates/files/files_detail.mako:46
8712 9022 msgid "Show/Diff file"
8713 9023 msgstr ""
8714 9024
8715 #: rhodecode/templates/files/files_detail.mako:66
9025 #: rhodecode/templates/files/files_detail.mako:61
8716 9026 msgid "Diff to Commit"
8717 9027 msgstr ""
8718 9028
8719 #: rhodecode/templates/files/files_detail.mako:67
9029 #: rhodecode/templates/files/files_detail.mako:62
8720 9030 msgid "Show at Commit"
8721 9031 msgstr ""
8722 9032
@@ -8758,72 +9068,66 b' msgstr ""'
8758 9068 msgid "Location"
8759 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 9080 #: rhodecode/templates/search/search_content.mako:57
8763 9081 msgid "line"
8764 9082 msgid_plural "lines"
8765 9083 msgstr[0] ""
8766 9084 msgstr[1] ""
8767 9085
8768 #: rhodecode/templates/files/files_source.mako:14
9086 #: rhodecode/templates/files/files_source.mako:17
8769 9087 msgid "History"
8770 9088 msgstr ""
8771 9089
8772 #: rhodecode/templates/files/files_source.mako:17
9090 #: rhodecode/templates/files/files_source.mako:20
8773 9091 #: rhodecode/templates/search/search_content.mako:68
8774 9092 msgid "Show Full History"
8775 9093 msgstr ""
8776 9094
8777 #: rhodecode/templates/files/files_source.mako:22
9095 #: rhodecode/templates/files/files_source.mako:25
8778 9096 #: rhodecode/templates/search/search_content.mako:70
8779 9097 msgid "Annotation"
8780 9098 msgstr ""
8781 9099
8782 #: rhodecode/templates/files/files_source.mako:24
9100 #: rhodecode/templates/files/files_source.mako:27
8783 9101 #: rhodecode/templates/search/search_content.mako:71
8784 9102 msgid "Raw"
8785 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 9110 #: rhodecode/templates/search/search_content.mako:73
8789 9111 msgid "Download"
8790 9112 msgstr ""
8791 9113
8792 #: rhodecode/templates/files/files_source.mako:33
9114 #: rhodecode/templates/files/files_source.mako:43
8793 9115 #, python-format
8794 9116 msgid "Edit on Branch:%s"
8795 9117 msgstr ""
8796 9118
8797 #: rhodecode/templates/files/files_source.mako:38
9119 #: rhodecode/templates/files/files_source.mako:48
8798 9120 msgid "Editing binary files not allowed"
8799 9121 msgstr ""
8800 9122
8801 #: rhodecode/templates/files/files_source.mako:41
9123 #: rhodecode/templates/files/files_source.mako:51
8802 9124 msgid "Editing files allowed only when on branch head commit"
8803 9125 msgstr ""
8804 9126
8805 #: rhodecode/templates/files/files_source.mako:42
9127 #: rhodecode/templates/files/files_source.mako:52
8806 9128 msgid "Deleting files allowed only when on branch head commit"
8807 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 9131 #: rhodecode/templates/forks/fork.mako:5
8828 9132 #, python-format
8829 9133 msgid "Fork repository %s"
@@ -8904,98 +9208,99 b' msgstr ""'
8904 9208 msgid "New pull request"
8905 9209 msgstr ""
8906 9210
8907 #: rhodecode/templates/pullrequests/pullrequest.mako:52
9211 #: rhodecode/templates/pullrequests/pullrequest.mako:51
8908 9212 msgid "Write a short description on this pull request"
8909 9213 msgstr ""
8910 9214
8911 #: rhodecode/templates/pullrequests/pullrequest.mako:59
9215 #: rhodecode/templates/pullrequests/pullrequest.mako:57
8912 9216 msgid "Commit flow"
8913 9217 msgstr ""
8914 9218
8915 #: rhodecode/templates/pullrequests/pullrequest.mako:67
9219 #: rhodecode/templates/pullrequests/pullrequest.mako:65
8916 9220 msgid "Origin repository"
8917 9221 msgstr ""
8918 9222
8919 #: rhodecode/templates/pullrequests/pullrequest.mako:85
9223 #: rhodecode/templates/pullrequests/pullrequest.mako:83
8920 9224 msgid "Loading refs..."
8921 9225 msgstr ""
8922 9226
8923 #: rhodecode/templates/pullrequests/pullrequest.mako:96
9227 #: rhodecode/templates/pullrequests/pullrequest.mako:94
8924 9228 msgid "Submit Pull Request"
8925 9229 msgstr ""
8926 9230
8927 #: rhodecode/templates/pullrequests/pullrequest.mako:109
8928 #: rhodecode/templates/pullrequests/pullrequest_show.mako:317
9231 #: rhodecode/templates/pullrequests/pullrequest.mako:107
9232 #: rhodecode/templates/pullrequests/pullrequest_show.mako:322
8929 9233 msgid "Pull request reviewers"
8930 9234 msgstr ""
8931 9235
8932 #: rhodecode/templates/pullrequests/pullrequest.mako:110
8933 msgid "loading..."
8934 msgstr ""
8935
8936 #: rhodecode/templates/pullrequests/pullrequest.mako:120
8937 #: rhodecode/templates/pullrequests/pullrequest_show.mako:361
9236 #: rhodecode/templates/pullrequests/pullrequest.mako:118
9237 #: rhodecode/templates/pullrequests/pullrequest_show.mako:366
8938 9238 msgid "Add reviewer"
8939 9239 msgstr ""
8940 9240
8941 #: rhodecode/templates/pullrequests/pullrequest.mako:299
8942 #: rhodecode/templates/pullrequests/pullrequest.mako:572
9241 #: rhodecode/templates/pullrequests/pullrequest.mako:297
9242 #: rhodecode/templates/pullrequests/pullrequest.mako:570
8943 9243 msgid "Please select origin and destination"
8944 9244 msgstr ""
8945 9245
8946 #: rhodecode/templates/pullrequests/pullrequest.mako:305
9246 #: rhodecode/templates/pullrequests/pullrequest.mako:303
8947 9247 msgid "Loading compare ..."
8948 9248 msgstr ""
8949 9249
9250 #: rhodecode/templates/pullrequests/pullrequest.mako:350
8950 9251 #: rhodecode/templates/pullrequests/pullrequest.mako:352
8951 #: rhodecode/templates/pullrequests/pullrequest.mako:354
8952 9252 msgid "This pull request will consist of __COMMITS__ commit."
8953 9253 msgid_plural "This pull request will consist of __COMMITS__ commits."
8954 9254 msgstr[0] ""
8955 9255 msgstr[1] ""
8956 9256
8957 #: rhodecode/templates/pullrequests/pullrequest.mako:357
9257 #: rhodecode/templates/pullrequests/pullrequest.mako:355
8958 9258 msgid "Show detailed compare."
8959 9259 msgstr ""
8960 9260
8961 #: rhodecode/templates/pullrequests/pullrequest.mako:364
9261 #: rhodecode/templates/pullrequests/pullrequest.mako:362
8962 9262 msgid "There are no commits to merge."
8963 9263 msgstr ""
8964 9264
8965 #: rhodecode/templates/pullrequests/pullrequest.mako:464
9265 #: rhodecode/templates/pullrequests/pullrequest.mako:462
8966 9266 msgid "Destination repository"
8967 9267 msgstr ""
8968 9268
8969 #: rhodecode/templates/pullrequests/pullrequest.mako:475
9269 #: rhodecode/templates/pullrequests/pullrequest.mako:473
8970 9270 msgid "Select commit reference"
8971 9271 msgstr ""
8972 9272
8973 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:8
9273 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:7
8974 9274 msgid "This pull request can be merged automatically."
8975 9275 msgstr ""
8976 9276
8977 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:13
9277 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:12
8978 9278 msgid "Merge is not currently possible because of below failed checks."
8979 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 9286 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:38
8982 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 9288 msgid "Merge Pull Request"
8989 9289 msgstr ""
8990 9290
8991 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:44
9291 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:43
8992 9292 msgid "You are not allowed to merge this pull request."
8993 9293 msgstr ""
8994 9294
8995 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:46
9295 #: rhodecode/templates/pullrequests/pullrequest_merge_checks.mako:45
8996 9296 msgid "Login to Merge this Pull Request"
8997 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 9304 #: rhodecode/templates/pullrequests/pullrequest_show.mako:5
9000 9305 #, python-format
9001 9306 msgid "%s Pull Request #%s"
@@ -9013,163 +9318,167 b' msgstr ""'
9013 9318 msgid "Origin"
9014 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 9326 msgid "Merge"
9018 9327 msgstr ""
9019 9328
9020 #: rhodecode/templates/pullrequests/pullrequest_show.mako:133
9329 #: rhodecode/templates/pullrequests/pullrequest_show.mako:138
9021 9330 msgid "Shadow repository data not available"
9022 9331 msgstr ""
9023 9332
9024 #: rhodecode/templates/pullrequests/pullrequest_show.mako:141
9333 #: rhodecode/templates/pullrequests/pullrequest_show.mako:146
9025 9334 msgid "Review"
9026 9335 msgstr ""
9027 9336
9028 #: rhodecode/templates/pullrequests/pullrequest_show.mako:152
9337 #: rhodecode/templates/pullrequests/pullrequest_show.mako:157
9029 9338 #, python-format
9030 9339 msgid "calculated based on %s reviewer vote"
9031 9340 msgid_plural "calculated based on %s reviewers votes"
9032 9341 msgstr[0] ""
9033 9342 msgstr[1] ""
9034 9343
9035 #: rhodecode/templates/pullrequests/pullrequest_show.mako:170
9344 #: rhodecode/templates/pullrequests/pullrequest_show.mako:175
9036 9345 msgid "Versions"
9037 9346 msgstr ""
9038 9347
9039 #: rhodecode/templates/pullrequests/pullrequest_show.mako:181
9040 #: rhodecode/templates/pullrequests/pullrequest_show.mako:183
9348 #: rhodecode/templates/pullrequests/pullrequest_show.mako:186
9349 #: rhodecode/templates/pullrequests/pullrequest_show.mako:188
9041 9350 msgid "{} version available for this pull request, show it."
9042 9351 msgid_plural "{} versions available for this pull request, show them."
9043 9352 msgstr[0] ""
9044 9353 msgstr[1] ""
9045 9354
9046 #: rhodecode/templates/pullrequests/pullrequest_show.mako:182
9355 #: rhodecode/templates/pullrequests/pullrequest_show.mako:187
9047 9356 msgid "Hide all versions of this pull request"
9048 9357 msgstr ""
9049 9358
9050 #: rhodecode/templates/pullrequests/pullrequest_show.mako:207
9359 #: rhodecode/templates/pullrequests/pullrequest_show.mako:212
9051 9360 msgid "Your review status at this version"
9052 9361 msgstr ""
9053 9362
9054 #: rhodecode/templates/pullrequests/pullrequest_show.mako:213
9363 #: rhodecode/templates/pullrequests/pullrequest_show.mako:218
9055 9364 msgid "Comment from pull request version {0}, general:{1} inline:{2}"
9056 9365 msgstr ""
9057 9366
9058 #: rhodecode/templates/pullrequests/pullrequest_show.mako:230
9059 #: rhodecode/templates/pullrequests/pullrequest_show.mako:234
9367 #: rhodecode/templates/pullrequests/pullrequest_show.mako:235
9368 #: rhodecode/templates/pullrequests/pullrequest_show.mako:239
9060 9369 msgid "select versions to show changes"
9061 9370 msgstr ""
9062 9371
9063 #: rhodecode/templates/pullrequests/pullrequest_show.mako:231
9372 #: rhodecode/templates/pullrequests/pullrequest_show.mako:236
9064 9373 msgid "show changes between versions"
9065 9374 msgstr ""
9066 9375
9067 #: rhodecode/templates/pullrequests/pullrequest_show.mako:232
9376 #: rhodecode/templates/pullrequests/pullrequest_show.mako:237
9068 9377 msgid "show pull request for this version"
9069 9378 msgstr ""
9070 9379
9071 #: rhodecode/templates/pullrequests/pullrequest_show.mako:247
9380 #: rhodecode/templates/pullrequests/pullrequest_show.mako:252
9072 9381 msgid "Comments at this version"
9073 9382 msgstr ""
9074 9383
9075 #: rhodecode/templates/pullrequests/pullrequest_show.mako:251
9076 msgid "Comments for this pull request"
9077 msgstr ""
9078
9079 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 9390 #, python-format
9082 9391 msgid "%d General "
9083 9392 msgstr ""
9084 9393
9085 #: rhodecode/templates/pullrequests/pullrequest_show.mako:262
9086 #: rhodecode/templates/pullrequests/pullrequest_show.mako:264
9394 #: rhodecode/templates/pullrequests/pullrequest_show.mako:267
9395 #: rhodecode/templates/pullrequests/pullrequest_show.mako:269
9087 9396 #, python-format
9088 9397 msgid "%d Inline"
9089 9398 msgstr ""
9090 9399
9091 #: rhodecode/templates/pullrequests/pullrequest_show.mako:268
9092 #: rhodecode/templates/pullrequests/pullrequest_show.mako:272
9400 #: rhodecode/templates/pullrequests/pullrequest_show.mako:273
9401 #: rhodecode/templates/pullrequests/pullrequest_show.mako:277
9093 9402 #, python-format
9094 9403 msgid "%d Outdated"
9095 9404 msgstr ""
9096 9405
9097 #: rhodecode/templates/pullrequests/pullrequest_show.mako:269
9406 #: rhodecode/templates/pullrequests/pullrequest_show.mako:274
9098 9407 msgid "show outdated comments"
9099 9408 msgstr ""
9100 9409
9101 #: rhodecode/templates/pullrequests/pullrequest_show.mako:270
9410 #: rhodecode/templates/pullrequests/pullrequest_show.mako:275
9102 9411 msgid "hide outdated comments"
9103 9412 msgstr ""
9104 9413
9105 #: rhodecode/templates/pullrequests/pullrequest_show.mako:281
9414 #: rhodecode/templates/pullrequests/pullrequest_show.mako:286
9106 9415 msgid "Pull request versions not available"
9107 9416 msgstr ""
9108 9417
9109 #: rhodecode/templates/pullrequests/pullrequest_show.mako:295
9110 #: rhodecode/templates/pullrequests/pullrequest_show.mako:365
9418 #: rhodecode/templates/pullrequests/pullrequest_show.mako:300
9419 #: rhodecode/templates/pullrequests/pullrequest_show.mako:370
9111 9420 msgid "Save Changes"
9112 9421 msgstr ""
9113 9422
9114 #: rhodecode/templates/pullrequests/pullrequest_show.mako:382
9423 #: rhodecode/templates/pullrequests/pullrequest_show.mako:387
9115 9424 msgid "Missing requirements:"
9116 9425 msgstr ""
9117 9426
9118 #: rhodecode/templates/pullrequests/pullrequest_show.mako:383
9427 #: rhodecode/templates/pullrequests/pullrequest_show.mako:388
9119 9428 msgid "These commits cannot be displayed, because this repository uses the Mercurial largefiles extension, which was not enabled."
9120 9429 msgstr ""
9121 9430
9122 #: rhodecode/templates/pullrequests/pullrequest_show.mako:391
9431 #: rhodecode/templates/pullrequests/pullrequest_show.mako:396
9123 9432 msgid "Missing commits"
9124 9433 msgstr ""
9125 9434
9126 #: rhodecode/templates/pullrequests/pullrequest_show.mako:392
9435 #: rhodecode/templates/pullrequests/pullrequest_show.mako:397
9127 9436 msgid "This pull request cannot be displayed, because one or more commits no longer exist in the source repository."
9128 9437 msgstr ""
9129 9438
9130 #: rhodecode/templates/pullrequests/pullrequest_show.mako:393
9439 #: rhodecode/templates/pullrequests/pullrequest_show.mako:398
9131 9440 msgid "Please update this pull request, push the commits back into the source repository, or consider closing this pull request."
9132 9441 msgstr ""
9133 9442
9134 #: rhodecode/templates/pullrequests/pullrequest_show.mako:404
9443 #: rhodecode/templates/pullrequests/pullrequest_show.mako:409
9135 9444 #, python-format
9136 9445 msgid "Showing changes at v%d, commenting is disabled."
9137 9446 msgstr ""
9138 9447
9139 #: rhodecode/templates/pullrequests/pullrequest_show.mako:427
9140 #: rhodecode/templates/pullrequests/pullrequest_show.mako:429
9448 #: rhodecode/templates/pullrequests/pullrequest_show.mako:432
9449 #: rhodecode/templates/pullrequests/pullrequest_show.mako:434
9141 9450 msgid "Update commits"
9142 9451 msgstr ""
9143 9452
9144 #: rhodecode/templates/pullrequests/pullrequest_show.mako:429
9453 #: rhodecode/templates/pullrequests/pullrequest_show.mako:434
9145 9454 msgid "Update is disabled for current view"
9146 9455 msgstr ""
9147 9456
9148 #: rhodecode/templates/pullrequests/pullrequest_show.mako:440
9457 #: rhodecode/templates/pullrequests/pullrequest_show.mako:445
9149 9458 msgid "Commits and changes between v{ver_from} and {ver_to} of this pull request, commenting is disabled"
9150 9459 msgstr ""
9151 9460
9152 #: rhodecode/templates/pullrequests/pullrequest_show.mako:444
9461 #: rhodecode/templates/pullrequests/pullrequest_show.mako:449
9153 9462 msgid "commits added: {}, removed: {}"
9154 9463 msgstr ""
9155 9464
9156 #: rhodecode/templates/pullrequests/pullrequest_show.mako:462
9465 #: rhodecode/templates/pullrequests/pullrequest_show.mako:467
9157 9466 msgid "Commit added in displayed changes"
9158 9467 msgstr ""
9159 9468
9160 #: rhodecode/templates/pullrequests/pullrequest_show.mako:464
9469 #: rhodecode/templates/pullrequests/pullrequest_show.mako:469
9161 9470 msgid "Commit removed in displayed changes"
9162 9471 msgstr ""
9163 9472
9164 #: rhodecode/templates/pullrequests/pullrequest_show.mako:567
9473 #: rhodecode/templates/pullrequests/pullrequest_show.mako:572
9165 9474 msgid "there is {num} general comment from older versions"
9166 9475 msgstr ""
9167 9476
9168 #: rhodecode/templates/pullrequests/pullrequest_show.mako:570
9477 #: rhodecode/templates/pullrequests/pullrequest_show.mako:575
9169 9478 msgid "there are {num} general comments from older versions"
9170 9479 msgstr ""
9171 9480
9172 #: rhodecode/templates/pullrequests/pullrequest_show.mako:571
9481 #: rhodecode/templates/pullrequests/pullrequest_show.mako:576
9173 9482 msgid "show them"
9174 9483 msgstr ""
9175 9484
@@ -19,12 +19,14 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 from __future__ import unicode_literals
22 import re
23 import time
24 import textwrap
25 import logging
26
22 27 import deform
23 import re
24 import logging
25 28 import requests
26 29 import colander
27 import textwrap
28 30 from celery.task import task
29 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 90 class SlackIntegrationType(IntegrationTypeBase):
100 91 key = 'slack'
101 92 display_name = _('Slack')
@@ -124,25 +115,31 b' class SlackIntegrationType(IntegrationTy'
124 115
125 116 data = event.as_dict()
126 117
118 # defaults
119 title = '*%s* caused a *%s* event' % (
120 data['actor']['username'], event.name)
127 121 text = '*%s* caused a *%s* event' % (
128 122 data['actor']['username'], event.name)
123 fields = None
124 overrides = None
129 125
130 126 log.debug('handling slack event for %s' % event.name)
131 127
132 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 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 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 135 elif isinstance(event, events.RepoPushEvent):
139 text = self.format_repo_push_event(data)
136 title, text = self.format_repo_push_event(data)
140 137 elif isinstance(event, events.RepoCreateEvent):
141 text = self.format_repo_create_event(data)
138 title, text = self.format_repo_create_event(data)
142 139 else:
143 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 144 def settings_schema(self):
148 145 schema = SlackSettingsSchema()
@@ -167,37 +164,60 b' class SlackIntegrationType(IntegrationTy'
167 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 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(
175 '''
176 *{user}* commented on pull request <{pr_url}|#{number}> - {pr_title}:
177 >>> {comment_status}{comment_text}
178 ''').format(
179 comment_status=comment_status,
180 user=data['actor']['username'],
181 number=data['pullrequest']['pull_request_id'],
182 pr_url=data['pullrequest']['url'],
183 pr_status=data['pullrequest']['status'],
193 title = Template(textwrap.dedent(r'''
194 *${data['actor']['username']}* left ${data['comment']['type']} on pull request <${data['pullrequest']['url']}|#${data['pullrequest']['pull_request_id']}>:
195 ''')).render(data=data, comment=event.comment)
196
197 text = Template(textwrap.dedent(r'''
198 *pull request title*: ${pr_title}
199 % if status_text:
200 *submitted status*: `${status_text}`
201 % endif
202 >>> ${comment_text}
203 ''')).render(comment_text=comment_text,
184 204 pr_title=data['pullrequest']['title'],
185 comment_text=comment_text
186 )
205 status_text=status_text)
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):
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 )
220 return title, text
201 221
202 222 def format_pull_request_event(self, event, data):
203 223 action = {
@@ -207,15 +227,22 b' class SlackIntegrationType(IntegrationTy'
207 227 events.PullRequestCreateEvent: 'created',
208 228 }.get(event.__class__, str(event.__class__))
209 229
210 return ('Pull request <{url}|#{number}> - {title} '
211 '`{action}` by *{user}*').format(
212 user=data['actor']['username'],
213 number=data['pullrequest']['pull_request_id'],
214 url=data['pullrequest']['url'],
215 title=data['pullrequest']['title'],
216 action=action
230 title = Template(textwrap.dedent(r'''
231 *${data['actor']['username']}* `${action}` pull request <${data['pullrequest']['url']}|#${data['pullrequest']['pull_request_id']}>:
232 ''')).render(data=data, action=action)
233
234 text = Template(textwrap.dedent(r'''
235 *pull request title*: ${pr_title}
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 246 def format_repo_push_event(self, data):
220 247 branch_data = {branch['name']: branch
221 248 for branch in data['push']['branches']}
@@ -230,20 +257,38 b' class SlackIntegrationType(IntegrationTy'
230 257 branch_commits = branches_commits[commit['branch']]
231 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 274 data=data,
235 275 branches_commits=branches_commits,
236 276 html_to_slack_links=html_to_slack_links,
237 277 )
238 return result
278
279 return title, text
239 280
240 281 def format_repo_create_event(self, data):
241 return '<{}|{}> ({}) repository created by *{}*'.format(
242 data['repo']['url'],
243 data['repo']['repo_name'],
244 data['repo']['repo_type'],
245 data['actor']['username'],
246 )
282 title = Template(r'''
283 *${data['actor']['username']}* created new repository ${data['repo']['repo_name']}:
284 ''').render(data=data)
285
286 text = Template(textwrap.dedent(r'''
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 294 def html_to_slack_links(message):
@@ -252,12 +297,38 b' def html_to_slack_links(message):'
252 297
253 298
254 299 @task(ignore_result=True)
255 def post_text_to_slack(settings, text):
256 log.debug('sending %s to slack %s' % (text, settings['service']))
257 resp = requests.post(settings['service'], json={
300 def post_text_to_slack(settings, title, text, fields=None, overrides=None):
301 log.debug('sending %s (%s) to slack %s' % (
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 328 "channel": settings.get('channel', ''),
259 329 "username": settings.get('username', 'Rhodecode'),
260 "text": text,
261 "icon_emoji": settings.get('icon_emoji', ':studio_microphone:')
262 })
330 "attachments": [message_data]
331 }
332
333 resp = requests.post(settings['service'], json=json_message)
263 334 resp.raise_for_status() # raise exception on a failed request
@@ -29,6 +29,7 b' from pyramid.httpexceptions import HTTPF'
29 29 from pyramid.renderers import render
30 30 from pyramid.response import Response
31 31
32 from rhodecode.apps.admin.navigation import navigation_list
32 33 from rhodecode.lib import auth
33 34 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
34 35 from rhodecode.lib.utils2 import safe_int
@@ -36,7 +37,6 b' from rhodecode.lib.helpers import Page'
36 37 from rhodecode.model.db import Repository, RepoGroup, Session, Integration
37 38 from rhodecode.model.scm import ScmModel
38 39 from rhodecode.model.integration import IntegrationModel
39 from rhodecode.admin.navigation import navigation_list
40 40 from rhodecode.translation import _
41 41 from rhodecode.integrations import integration_type_registry
42 42 from rhodecode.model.validation_schema.schemas.integration_schema import (
@@ -79,7 +79,6 b' class IntegrationSettingsViewBase(object'
79 79 repo_group_name = request.matchdict['repo_group_name']
80 80 self.repo_group = RepoGroup.get_by_group_name(repo_group_name)
81 81
82
83 82 if 'integration' in request.matchdict: # integration type context
84 83 integration_type = request.matchdict['integration']
85 84 self.IntegrationType = integration_type_registry[integration_type]
@@ -380,12 +379,12 b' class GlobalIntegrationsView(Integration'
380 379
381 380 class RepoIntegrationsView(IntegrationSettingsViewBase):
382 381 def perm_check(self, user):
383 return auth.HasRepoPermissionAll('repository.admin'
384 )(repo_name=self.repo.repo_name, user=user)
382 return auth.HasRepoPermissionAll('repository.admin')(
383 repo_name=self.repo.repo_name, user=user)
385 384
386 385
387 386 class RepoGroupIntegrationsView(IntegrationSettingsViewBase):
388 387 def perm_check(self, user):
389 return auth.HasRepoGroupPermissionAll('group.admin'
390 )(group_name=self.repo_group.group_name, user=user)
388 return auth.HasRepoGroupPermissionAll('group.admin')(
389 group_name=self.repo_group.group_name, user=user)
391 390
@@ -22,24 +22,22 b''
22 22 authentication and permission libraries
23 23 """
24 24
25 import os
25 26 import inspect
26 27 import collections
27 28 import fnmatch
28 29 import hashlib
29 30 import itertools
30 31 import logging
31 import os
32 32 import random
33 import time
34 33 import traceback
35 34 from functools import wraps
36 35
37 36 import ipaddress
38 from pyramid.httpexceptions import HTTPForbidden
37 from pyramid.httpexceptions import HTTPForbidden, HTTPFound
39 38 from pylons import url, request
40 39 from pylons.controllers.util import abort, redirect
41 40 from pylons.i18n.translation import _
42 from sqlalchemy import or_
43 41 from sqlalchemy.orm.exc import ObjectDeletedError
44 42 from sqlalchemy.orm import joinedload
45 43 from zope.cachedescriptors.property import Lazy as LazyProperty
@@ -99,6 +97,7 b' class PasswordGenerator(object):'
99 97
100 98
101 99 class _RhodeCodeCryptoBase(object):
100 ENC_PREF = None
102 101
103 102 def hash_create(self, str_):
104 103 """
@@ -139,6 +138,7 b' class _RhodeCodeCryptoBase(object):'
139 138
140 139
141 140 class _RhodeCodeCryptoBCrypt(_RhodeCodeCryptoBase):
141 ENC_PREF = '$2a$10'
142 142
143 143 def hash_create(self, str_):
144 144 self._assert_bytes(str_)
@@ -194,6 +194,7 b' class _RhodeCodeCryptoBCrypt(_RhodeCodeC'
194 194
195 195
196 196 class _RhodeCodeCryptoSha256(_RhodeCodeCryptoBase):
197 ENC_PREF = '_'
197 198
198 199 def hash_create(self, str_):
199 200 self._assert_bytes(str_)
@@ -211,6 +212,7 b' class _RhodeCodeCryptoSha256(_RhodeCodeC'
211 212
212 213
213 214 class _RhodeCodeCryptoMd5(_RhodeCodeCryptoBase):
215 ENC_PREF = '_'
214 216
215 217 def hash_create(self, str_):
216 218 self._assert_bytes(str_)
@@ -567,8 +569,14 b' class PermissionCalculator(object):'
567 569 # on given user group
568 570 for perm in self.default_user_group_perms:
569 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 578 p = perm.Permission.permission_name
571 o = PermOrigin.USERGROUP_DEFAULT
579
572 580 # if we decide this user isn't inheriting permissions from default
573 581 # user we set him to .none so only explicit permissions work
574 582 if not user_inherit_object_permissions:
@@ -647,7 +655,7 b' class PermissionCalculator(object):'
647 655 multiple_counter[g_k] += 1
648 656 p = perm.Permission.permission_name
649 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 659 p = 'group.admin'
652 660 o = PermOrigin.REPOGROUP_OWNER
653 661 else:
@@ -683,7 +691,7 b' class PermissionCalculator(object):'
683 691 # user group for user group permissions
684 692 user_group_from_user_group = Permission\
685 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 696 multiple_counter = collections.defaultdict(int)
689 697 for perm in user_group_from_user_group:
@@ -694,6 +702,12 b' class PermissionCalculator(object):'
694 702 o = PermOrigin.USERGROUP_USERGROUP % u_k
695 703 multiple_counter[g_k] += 1
696 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 711 if multiple_counter[g_k] > 1:
698 712 cur_perm = self.permissions_user_groups[g_k]
699 713 p = self._choose_permission(p, cur_perm)
@@ -705,8 +719,14 b' class PermissionCalculator(object):'
705 719 for perm in user_user_groups_perms:
706 720 ug_k = perm.UserUserGroupToPerm.user_group.users_group_name
707 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 729 p = perm.Permission.permission_name
709 o = PermOrigin.USERGROUP_USER % u_k
710 730 if not self.explicit:
711 731 cur_perm = self.permissions_user_groups.get(
712 732 ug_k, 'usergroup.none')
@@ -831,10 +851,6 b' class AuthUser(object):'
831 851 self._permissions_scoped_cache[cache_key] = res
832 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 854 def get_instance(self):
839 855 return User.get(self.user_id)
840 856
@@ -925,16 +941,6 b' class AuthUser(object):'
925 941 log.debug('PERMISSION tree computed %s' % (result_repr,))
926 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 944 @property
939 945 def is_default(self):
940 946 return self.username == User.DEFAULT_USER
@@ -952,7 +958,8 b' class AuthUser(object):'
952 958 """
953 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 963 if x[1] == 'repository.admin']
957 964
958 965 @property
@@ -960,8 +967,8 b' class AuthUser(object):'
960 967 """
961 968 Returns list of repository groups you're an admin of
962 969 """
963 return [x[0]
964 for x in self.permissions['repositories_groups'].iteritems()
970 return [
971 x[0] for x in self.permissions['repositories_groups'].iteritems()
965 972 if x[1] == 'group.admin']
966 973
967 974 @property
@@ -969,7 +976,8 b' class AuthUser(object):'
969 976 """
970 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 981 if x[1] == 'usergroup.admin']
974 982
975 983 @property
@@ -1171,7 +1179,7 b' class LoginRequired(object):'
1171 1179 :param api_access: if enabled this checks only for valid auth token
1172 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 1183 self.auth_token_access = auth_token_access
1176 1184
1177 1185 def __call__(self, func):
@@ -1191,7 +1199,7 b' class LoginRequired(object):'
1191 1199 ip_access_valid = False
1192 1200
1193 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 1203 _auth_token = request.GET.get(
1196 1204 'auth_token', '') or request.GET.get('api_key', '')
1197 1205 auth_token_access_valid = allowed_auth_token_access(
@@ -1200,8 +1208,20 b' class LoginRequired(object):'
1200 1208 # explicit controller is enabled or API is in our whitelist
1201 1209 if self.auth_token_access or auth_token_access_valid:
1202 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 1225 auth_token_access_valid = True
1206 1226 log.debug('AUTH TOKEN ****%s is VALID' % (_auth_token[-4:],))
1207 1227 else:
@@ -1234,7 +1254,6 b' class LoginRequired(object):'
1234 1254 auth_token_access_valid))
1235 1255 # we preserve the get PARAM
1236 1256 came_from = request.path_qs
1237
1238 1257 log.debug('redirecting to login page with %s' % (came_from,))
1239 1258 return redirect(
1240 1259 h.route_path('login', _query={'came_from': came_from}))
@@ -1249,6 +1268,7 b' class NotAnonymous(object):'
1249 1268 return get_cython_compat_decorator(self.__wrapper, func)
1250 1269
1251 1270 def __wrapper(self, func, *fargs, **fkwargs):
1271 import rhodecode.lib.helpers as h
1252 1272 cls = fargs[0]
1253 1273 self.user = cls._rhodecode_user
1254 1274
@@ -1258,8 +1278,6 b' class NotAnonymous(object):'
1258 1278
1259 1279 if anonymous:
1260 1280 came_from = request.path_qs
1261
1262 import rhodecode.lib.helpers as h
1263 1281 h.flash(_('You need to be a registered user to '
1264 1282 'perform this action'),
1265 1283 category='warning')
@@ -1296,6 +1314,7 b' class HasAcceptedRepoType(object):'
1296 1314 return get_cython_compat_decorator(self.__wrapper, func)
1297 1315
1298 1316 def __wrapper(self, func, *fargs, **fkwargs):
1317 import rhodecode.lib.helpers as h
1299 1318 cls = fargs[0]
1300 1319 rhodecode_repo = cls.rhodecode_repo
1301 1320
@@ -1306,7 +1325,6 b' class HasAcceptedRepoType(object):'
1306 1325 if rhodecode_repo.alias in self.repo_type_list:
1307 1326 return func(*fargs, **fkwargs)
1308 1327 else:
1309 import rhodecode.lib.helpers as h
1310 1328 h.flash(h.literal(
1311 1329 _('Action not supported for %s.' % rhodecode_repo.alias)),
1312 1330 category='warning')
@@ -1326,7 +1344,22 b' class PermsDecorator(object):'
1326 1344 def __call__(self, func):
1327 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 1361 def __wrapper(self, func, *fargs, **fkwargs):
1362 import rhodecode.lib.helpers as h
1330 1363 cls = fargs[0]
1331 1364 _user = cls._rhodecode_user
1332 1365
@@ -1342,17 +1375,15 b' class PermsDecorator(object):'
1342 1375 anonymous = _user.username == User.DEFAULT_USER
1343 1376
1344 1377 if anonymous:
1345 came_from = request.path_qs
1346
1347 import rhodecode.lib.helpers as h
1378 came_from = self._get_came_from()
1348 1379 h.flash(_('You need to be signed in to view this page'),
1349 1380 category='warning')
1350 return redirect(
1381 raise HTTPFound(
1351 1382 h.route_path('login', _query={'came_from': came_from}))
1352 1383
1353 1384 else:
1354 1385 # redirect with forbidden ret code
1355 return abort(403)
1386 raise HTTPForbidden()
1356 1387
1357 1388 def check_permissions(self, user):
1358 1389 """Dummy function for overriding"""
@@ -1391,10 +1422,13 b' class HasRepoPermissionAllDecorator(Perm'
1391 1422 Checks for access permission for all given predicates for specific
1392 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 1429 def check_permissions(self, user):
1396 1430 perms = user.permissions
1397 repo_name = get_repo_slug(request)
1431 repo_name = self._get_repo_name()
1398 1432 try:
1399 1433 user_perms = set([perms['repositories'][repo_name]])
1400 1434 except KeyError:
@@ -1409,10 +1443,13 b' class HasRepoPermissionAnyDecorator(Perm'
1409 1443 Checks for access permission for any of given predicates for specific
1410 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 1450 def check_permissions(self, user):
1414 1451 perms = user.permissions
1415 repo_name = get_repo_slug(request)
1452 repo_name = self._get_repo_name()
1416 1453 try:
1417 1454 user_perms = set([perms['repositories'][repo_name]])
1418 1455 except KeyError:
@@ -1429,10 +1466,13 b' class HasRepoGroupPermissionAllDecorator'
1429 1466 repository group. All of them have to be meet in order to
1430 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 1473 def check_permissions(self, user):
1434 1474 perms = user.permissions
1435 group_name = get_repo_group_slug(request)
1475 group_name = self._get_repo_group_name()
1436 1476 try:
1437 1477 user_perms = set([perms['repositories_groups'][group_name]])
1438 1478 except KeyError:
@@ -1449,10 +1489,13 b' class HasRepoGroupPermissionAnyDecorator'
1449 1489 repository group. In order to fulfill the request any
1450 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 1496 def check_permissions(self, user):
1454 1497 perms = user.permissions
1455 group_name = get_repo_group_slug(request)
1498 group_name = self._get_repo_group_name()
1456 1499 try:
1457 1500 user_perms = set([perms['repositories_groups'][group_name]])
1458 1501 except KeyError:
@@ -1468,10 +1511,13 b' class HasUserGroupPermissionAllDecorator'
1468 1511 Checks for access permission for all given predicates for specific
1469 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 1518 def check_permissions(self, user):
1473 1519 perms = user.permissions
1474 group_name = get_user_group_slug(request)
1520 group_name = self._get_user_group_name()
1475 1521 try:
1476 1522 user_perms = set([perms['user_groups'][group_name]])
1477 1523 except KeyError:
@@ -1487,10 +1533,13 b' class HasUserGroupPermissionAnyDecorator'
1487 1533 Checks for access permission for any of given predicates for specific
1488 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 1540 def check_permissions(self, user):
1492 1541 perms = user.permissions
1493 group_name = get_user_group_slug(request)
1542 group_name = self._get_user_group_name()
1494 1543 try:
1495 1544 user_perms = set([perms['user_groups'][group_name]])
1496 1545 except KeyError:
@@ -1553,6 +1602,14 b' class PermsFunction(object):'
1553 1602 check_scope, user, check_location)
1554 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 1613 def _get_check_scope(self, cls_name):
1557 1614 return {
1558 1615 'HasPermissionAll': 'GLOBAL',
@@ -1591,10 +1648,14 b' class HasRepoPermissionAll(PermsFunction'
1591 1648 self.repo_name = repo_name
1592 1649 return super(HasRepoPermissionAll, self).__call__(check_location, user)
1593 1650
1594 def check_permissions(self, user):
1651 def _get_repo_name(self):
1595 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 1659 perms = user.permissions
1599 1660 try:
1600 1661 user_perms = set([perms['repositories'][self.repo_name]])
@@ -1610,10 +1671,13 b' class HasRepoPermissionAny(PermsFunction'
1610 1671 self.repo_name = repo_name
1611 1672 return super(HasRepoPermissionAny, self).__call__(check_location, user)
1612 1673
1613 def check_permissions(self, user):
1674 def _get_repo_name(self):
1614 1675 if not self.repo_name:
1615 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 1681 perms = user.permissions
1618 1682 try:
1619 1683 user_perms = set([perms['repositories'][self.repo_name]])
@@ -1905,3 +1969,5 b' def get_cython_compat_decorator(wrapper,'
1905 1969 return wrapper(func, *args, **kwds)
1906 1970 local_wrapper.__wrapped__ = func
1907 1971 return local_wrapper
1972
1973
@@ -209,11 +209,12 b' def vcs_operation_context('
209 209 class BasicAuth(AuthBasicAuthenticator):
210 210
211 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 213 self.realm = realm
214 214 self.initial_call = initial_call_detection
215 215 self.authfunc = authfunc
216 216 self.registry = registry
217 self.acl_repo_name = acl_repo_name
217 218 self._rc_auth_http_code = auth_http_code
218 219
219 220 def _get_response_from_code(self, http_code):
@@ -247,7 +248,7 b' class BasicAuth(AuthBasicAuthenticator):'
247 248 username, password = _parts
248 249 if self.authfunc(
249 250 username, password, environ, VCS_TYPE,
250 registry=self.registry):
251 registry=self.registry, acl_repo_name=self.acl_repo_name):
251 252 return username
252 253 if username and password:
253 254 # we mark that we actually executed authentication once, at
@@ -488,19 +489,10 b' class BaseController(WSGIController):'
488 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 492 user_obj = auth_user.get_instance()
494 493 if user_obj and user_obj.user_data.get('force_password_change'):
495 494 h.flash('You are required to change your password', 'warning',
496 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 496 return self._dispatch_redirect(
505 497 url('my_account_password'), environ, start_response)
506 498
@@ -226,7 +226,6 b' def vcsconnection(func):'
226 226 for alias in rhodecode.BACKENDS.keys():
227 227 if alias not in backends:
228 228 del rhodecode.BACKENDS[alias]
229 utils.configure_pyro4(settings)
230 229 utils.configure_vcs(settings)
231 230 connect_vcs(
232 231 settings['vcs.server'],
@@ -25,7 +25,7 b' from itertools import groupby'
25 25 from pygments import lex
26 26 from pygments.formatters.html import _get_ttype_class as pygment_token_class
27 27 from rhodecode.lib.helpers import (
28 get_lexer_for_filenode, html_escape)
28 get_lexer_for_filenode, html_escape, get_custom_lexer)
29 29 from rhodecode.lib.utils2 import AttributeDict
30 30 from rhodecode.lib.vcs.nodes import FileNode
31 31 from rhodecode.lib.diff_match_patch import diff_match_patch
@@ -407,8 +407,12 b' class DiffSet(object):'
407 407 if filename not in self._lexer_cache:
408 408 if filenode:
409 409 lexer = filenode.lexer
410 extension = filenode.extension
410 411 else:
411 412 lexer = FileNode.get_lexer(filename=filename)
413 extension = filename.split('.')[-1]
414
415 lexer = get_custom_lexer(extension) or lexer
412 416 self._lexer_cache[filename] = lexer
413 417 return self._lexer_cache[filename]
414 418
@@ -292,13 +292,13 b' class DbManage(object):'
292 292 TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR2_EMAIL
293 293
294 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 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 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 303 def create_ui_settings(self, repo_store_path):
304 304 """
@@ -306,6 +306,8 b' class DbManage(object):'
306 306 and disables dotencode
307 307 """
308 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 312 # Build HOOKS
311 313 hooks = [
@@ -315,6 +317,7 b' class DbManage(object):'
315 317 (RhodeCodeUi.HOOK_PRE_PULL, 'python:vcsserver.hooks.pre_pull'),
316 318 (RhodeCodeUi.HOOK_PULL, 'python:vcsserver.hooks.log_pull_action'),
317 319 (RhodeCodeUi.HOOK_PRE_PUSH, 'python:vcsserver.hooks.pre_push'),
320 (RhodeCodeUi.HOOK_PRETX_PUSH, 'python:vcsserver.hooks.pre_push'),
318 321 (RhodeCodeUi.HOOK_PUSH, 'python:vcsserver.hooks.log_push_action'),
319 322
320 323 ]
@@ -335,14 +338,23 b' class DbManage(object):'
335 338 self.sa.add(largefiles)
336 339
337 340 # set default largefiles cache dir, defaults to
338 # /repo location/.cache/largefiles
341 # /repo_store_location/.cache/largefiles
339 342 largefiles = RhodeCodeUi()
340 343 largefiles.ui_section = 'largefiles'
341 344 largefiles.ui_key = 'usercache'
342 largefiles.ui_value = os.path.join(repo_store_path, '.cache',
343 'largefiles')
345 largefiles.ui_value = largefiles_store(repo_store_path)
346
344 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 358 # enable hgsubversion disabled by default
347 359 hgsubversion = RhodeCodeUi()
348 360 hgsubversion.ui_section = 'extensions'
@@ -506,12 +518,12 b' class DbManage(object):'
506 518 self.create_ui_settings(path)
507 519
508 520 ui_config = [
509 ('web', 'push_ssl', 'false'),
521 ('web', 'push_ssl', 'False'),
510 522 ('web', 'allow_archive', 'gz zip bz2'),
511 523 ('web', 'allow_push', '*'),
512 524 ('web', 'baseurl', '/'),
513 525 ('paths', '/', path),
514 ('phases', 'publish', 'true')
526 ('phases', 'publish', 'True')
515 527 ]
516 528 for section, key, value in ui_config:
517 529 ui_conf = RhodeCodeUi()
@@ -560,7 +572,9 b' class DbManage(object):'
560 572
561 573 if api_key:
562 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 579 def create_default_user(self):
566 580 log.info('creating default user')
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 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
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
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