##// END OF EJS Templates
merged with stable
super-admin -
r4699:59f63a52 merge default
parent child Browse files
Show More
@@ -0,0 +1,40 b''
1 |RCE| 4.25.1 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2021-04-06
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13
14
15 General
16 ^^^^^^^
17
18
19
20 Security
21 ^^^^^^^^
22
23
24
25 Performance
26 ^^^^^^^^^^^
27
28
29
30 Fixes
31 ^^^^^
32
33 - Artifacts: fixed admin panel bad urls generated for the new artifacts admin view in CE edition.
34
35
36
37 Upgrade notes
38 ^^^^^^^^^^^^^
39
40 - Un-scheduled release addressing problems in 4.25.X releases.
@@ -0,0 +1,53 b''
1 |RCE| 4.25.2 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2021-04-14
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13
14
15 General
16 ^^^^^^^
17
18 - Comments: refresh on draft sidebar on draft submit.
19 - Vcsserver: log exceptions into the logs
20 - Archiving: make it explicit archiving a repo is irreversible.
21 - My-account: updated bookmarks UX
22 - Pull requests: added awaiting my review filter for users pull-requests.
23 Additionally the awaiting my review now properly filters pull requests that have no review votes on them.
24
25
26 Security
27 ^^^^^^^^
28
29
30
31 Performance
32 ^^^^^^^^^^^
33
34
35
36 Fixes
37 ^^^^^
38
39 - Draft comments: fixed logic in toggle all draft for submit.
40 - Draft comments: when submitting edited drafts also clear the history to prevent DB problems.
41 - Mercurial: fixed a case of lookup branches that had 40 characters in length.
42 - Gists: block id input for public gists.
43 - Pull requests: fixed problems with unicode characters in branches.
44 - Pull requests: small ui fix for grid.
45 - Summary: fixed ui on summary page for non-admins.
46 The setup instructions were broken if user had no write permissions.
47 - Users: make user data loading more resilient to errors.
48
49
50 Upgrade notes
51 ^^^^^^^^^^^^^
52
53 - Scheduled release addressing problems in 4.25.X releases.
@@ -0,0 +1,40 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2020 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 rhodecode.apps._base import BaseAppView, DataGridAppView
24 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
25
26 log = logging.getLogger(__name__)
27
28
29 class AdminArtifactsView(BaseAppView, DataGridAppView):
30
31 def load_default_context(self):
32 c = self._get_local_tmpl_context()
33 return c
34
35 @LoginRequired()
36 @HasPermissionAllDecorator('hg.admin')
37 def artifacts(self):
38 c = self.load_default_context()
39 c.active = 'artifacts'
40 return self._get_template_context(c)
@@ -0,0 +1,39 b''
1 ## -*- coding: utf-8 -*-
2 <%inherit file="/base/base.mako"/>
3
4 <%def name="title()">
5 ${_('Artifacts Admin')}
6 %if c.rhodecode_name:
7 &middot; ${h.branding(c.rhodecode_name)}
8 %endif
9 </%def>
10
11 <%def name="breadcrumbs_links()"></%def>
12
13 <%def name="menu_bar_nav()">
14 ${self.menu_items(active='admin')}
15 </%def>
16
17 <%def name="menu_bar_subnav()">
18 ${self.admin_menu(active='artifacts')}
19 </%def>
20
21 <%def name="main()">
22
23 <div class="box">
24
25 <div class="panel panel-default">
26 <div class="panel-heading">
27 <h3 class="panel-title">${_('Artifacts Administration.')}</h3>
28 </div>
29 <div class="panel-body">
30 <h4>${_('This feature is available in RhodeCode EE edition only. Contact {sales_email} to obtain a trial license.').format(sales_email='<a href="mailto:sales@rhodecode.com">sales@rhodecode.com</a>')|n}</h4>
31
32 </div>
33 </div>
34
35 </div>
36
37
38 </%def>
39
@@ -1,5 +1,6 b''
1 1 [bumpversion]
2 current_version = 4.25.0
2 current_version = 4.25.2
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
6
@@ -75,3 +75,6 b' 56310d93b33b97535908ef9c7b0985b89bb7fad2'
75 75 7637c38528fa38c1eabc1fde6a869c20995a0da7 v4.23.2
76 76 6aeb4ac3ef7f0ac699c914740dad3688c9495e83 v4.24.0
77 77 6eaf953da06e468a4c4e5239d3d0e700bda6b163 v4.24.1
78 f8161cbc2d94a935d3c395a0e758d9a094287169 v4.25.0
79 77fe47b5b39338e71b2c040de2c0359b529b6251 v4.25.1
80 27475bd8a718b9a00a37a8563c4927120865ad85 v4.25.2
@@ -21,7 +21,7 b' done = true'
21 21
22 22 [release]
23 23 state = prepared
24 version = 4.11.6
24 version = 4.25.2
25 25
26 26 [task:updated_translation]
27 27
@@ -9,6 +9,8 b' Release Notes'
9 9 .. toctree::
10 10 :maxdepth: 1
11 11
12 release-notes-4.25.2.rst
13 release-notes-4.25.1.rst
12 14 release-notes-4.25.0.rst
13 15 release-notes-4.24.1.rst
14 16 release-notes-4.24.0.rst
@@ -1883,7 +1883,7 b' self: super: {'
1883 1883 };
1884 1884 };
1885 1885 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1886 name = "rhodecode-enterprise-ce-4.25.0";
1886 name = "rhodecode-enterprise-ce-4.25.2";
1887 1887 buildInputs = [
1888 1888 self."pytest"
1889 1889 self."py"
@@ -1,1 +1,1 b''
1 4.25.0 No newline at end of file
1 4.25.2 No newline at end of file
@@ -232,6 +232,9 b' def create_repo_group('
232 232 user=apiuser)
233 233
234 234 Session().commit()
235
236 PermissionModel().trigger_permission_flush()
237
235 238 return {
236 239 'msg': 'Created new repo group `%s`' % validated_group_name,
237 240 'repo_group': repo_group.get_api_data()
@@ -27,6 +27,7 b' def admin_routes(config):'
27 27 Admin prefixed routes
28 28 """
29 29 from rhodecode.apps.admin.views.audit_logs import AdminAuditLogsView
30 from rhodecode.apps.admin.views.artifacts import AdminArtifactsView
30 31 from rhodecode.apps.admin.views.defaults import AdminDefaultSettingsView
31 32 from rhodecode.apps.admin.views.exception_tracker import ExceptionsTrackerView
32 33 from rhodecode.apps.admin.views.main_views import AdminMainView
@@ -60,6 +61,34 b' def admin_routes(config):'
60 61 route_name='admin_audit_log_entry', request_method='GET',
61 62 renderer='rhodecode:templates/admin/admin_audit_log_entry.mako')
62 63
64 # Artifacts EE feature
65 config.add_route(
66 'admin_artifacts',
67 pattern=ADMIN_PREFIX + '/artifacts')
68 config.add_route(
69 'admin_artifacts_show_all',
70 pattern=ADMIN_PREFIX + '/artifacts')
71 config.add_view(
72 AdminArtifactsView,
73 attr='artifacts',
74 route_name='admin_artifacts', request_method='GET',
75 renderer='rhodecode:templates/admin/artifacts/artifacts.mako')
76 config.add_view(
77 AdminArtifactsView,
78 attr='artifacts',
79 route_name='admin_artifacts_show_all', request_method='GET',
80 renderer='rhodecode:templates/admin/artifacts/artifacts.mako')
81 # EE views
82 config.add_route(
83 name='admin_artifacts_show_info',
84 pattern=ADMIN_PREFIX + '/artifacts/{uid}')
85 config.add_route(
86 name='admin_artifacts_delete',
87 pattern=ADMIN_PREFIX + '/artifacts/{uid}/delete')
88 config.add_route(
89 name='admin_artifacts_update',
90 pattern=ADMIN_PREFIX + '/artifacts/{uid}/update')
91
63 92 config.add_route(
64 93 name='admin_settings_open_source',
65 94 pattern='/settings/open_source')
@@ -349,13 +349,7 b' class AdminRepoGroupsView(BaseAppView, D'
349 349 % repo_group_name, category='error')
350 350 raise HTTPFound(h.route_path('home'))
351 351
352 affected_user_ids = [self._rhodecode_user.user_id]
353 if copy_permissions:
354 user_group_perms = repo_group.permissions(expand_from_user_groups=True)
355 copy_perms = [perm['user_id'] for perm in user_group_perms]
356 # also include those newly created by copy
357 affected_user_ids.extend(copy_perms)
358 PermissionModel().trigger_permission_flush(affected_user_ids)
352 PermissionModel().trigger_permission_flush()
359 353
360 354 raise HTTPFound(
361 355 h.route_path('repo_group_home',
@@ -242,11 +242,7 b' class AdminReposView(BaseAppView, DataGr'
242 242
243 243 repo_name = form_result.get('repo_name_full')
244 244
245 affected_user_ids = [self._rhodecode_user.user_id]
246 if copy_permissions:
247 # permission flush is done in repo creating
248 pass
249 PermissionModel().trigger_permission_flush(affected_user_ids)
245 PermissionModel().trigger_permission_flush()
250 246
251 247 raise HTTPFound(
252 248 h.route_path('repo_creating', repo_name=repo_name,
@@ -76,7 +76,11 b' class TestMyAccountEdit(TestController):'
76 76 'requests requiring your participation.')
77 77
78 78 @pytest.mark.backends("git", "hg")
79 def test_my_account_my_pullrequests_data(self, pr_util, xhr_header):
79 @pytest.mark.parametrize('params, expected_title', [
80 ({'closed': 1}, 'Closed'),
81 ({'awaiting_my_review': 1}, 'Awaiting my review'),
82 ])
83 def test_my_account_my_pullrequests_data(self, pr_util, xhr_header, params, expected_title):
80 84 self.log_user()
81 85 response = self.app.get(route_path('my_account_pullrequests_data'),
82 86 extra_environ=xhr_header)
@@ -43,7 +43,7 b' from rhodecode.model.comment import Comm'
43 43 from rhodecode.model.db import (
44 44 IntegrityError, or_, in_filter_generator,
45 45 Repository, UserEmailMap, UserApiKeys, UserFollowing,
46 PullRequest, UserBookmark, RepoGroup)
46 PullRequest, UserBookmark, RepoGroup, ChangesetStatus)
47 47 from rhodecode.model.meta import Session
48 48 from rhodecode.model.pull_request import PullRequestModel
49 49 from rhodecode.model.user import UserModel
@@ -654,21 +654,31 b' class MyAccountView(BaseAppView, DataGri'
654 654 Session().commit()
655 655 return user.user_data['notification_status']
656 656
657 def _get_pull_requests_list(self, statuses):
657 def _get_pull_requests_list(self, statuses, filter_type=None):
658 658 draw, start, limit = self._extract_chunk(self.request)
659 659 search_q, order_by, order_dir = self._extract_ordering(self.request)
660 660
661 661 _render = self.request.get_partial_renderer(
662 662 'rhodecode:templates/data_table/_dt_elements.mako')
663 663
664 pull_requests = PullRequestModel().get_im_participating_in(
665 user_id=self._rhodecode_user.user_id,
666 statuses=statuses, query=search_q,
667 offset=start, length=limit, order_by=order_by,
668 order_dir=order_dir)
664 if filter_type == 'awaiting_my_review':
665 pull_requests = PullRequestModel().get_im_participating_in_for_review(
666 user_id=self._rhodecode_user.user_id,
667 statuses=statuses, query=search_q,
668 offset=start, length=limit, order_by=order_by,
669 order_dir=order_dir)
669 670
670 pull_requests_total_count = PullRequestModel().count_im_participating_in(
671 user_id=self._rhodecode_user.user_id, statuses=statuses, query=search_q)
671 pull_requests_total_count = PullRequestModel().count_im_participating_in_for_review(
672 user_id=self._rhodecode_user.user_id, statuses=statuses, query=search_q)
673 else:
674 pull_requests = PullRequestModel().get_im_participating_in(
675 user_id=self._rhodecode_user.user_id,
676 statuses=statuses, query=search_q,
677 offset=start, length=limit, order_by=order_by,
678 order_dir=order_dir)
679
680 pull_requests_total_count = PullRequestModel().count_im_participating_in(
681 user_id=self._rhodecode_user.user_id, statuses=statuses, query=search_q)
672 682
673 683 data = []
674 684 comments_model = CommentsModel()
@@ -678,6 +688,12 b' class MyAccountView(BaseAppView, DataGri'
678 688 repo_id, pull_request=pr, include_drafts=False, count_only=True)
679 689 owned = pr.user_id == self._rhodecode_user.user_id
680 690
691 review_statuses = pr.reviewers_statuses(user=self._rhodecode_db_user)
692 my_review_status = ChangesetStatus.STATUS_NOT_REVIEWED
693 if review_statuses and review_statuses[4]:
694 _review_obj, _user, _reasons, _mandatory, statuses = review_statuses
695 my_review_status = statuses[0][1].status
696
681 697 data.append({
682 698 'target_repo': _render('pullrequest_target_repo',
683 699 pr.target_repo.repo_name),
@@ -688,6 +704,8 b' class MyAccountView(BaseAppView, DataGri'
688 704 'name_raw': pr.pull_request_id,
689 705 'status': _render('pullrequest_status',
690 706 pr.calculated_review_status()),
707 'my_status': _render('pullrequest_status',
708 my_review_status),
691 709 'title': _render('pullrequest_title', pr.title, pr.description),
692 710 'description': h.escape(pr.description),
693 711 'updated_on': _render('pullrequest_updated_on',
@@ -723,7 +741,14 b' class MyAccountView(BaseAppView, DataGri'
723 741 c.active = 'pullrequests'
724 742 req_get = self.request.GET
725 743
726 c.closed = str2bool(req_get.get('pr_show_closed'))
744 c.closed = str2bool(req_get.get('closed'))
745 c.awaiting_my_review = str2bool(req_get.get('awaiting_my_review'))
746
747 c.selected_filter = 'all'
748 if c.closed:
749 c.selected_filter = 'all_closed'
750 if c.awaiting_my_review:
751 c.selected_filter = 'awaiting_my_review'
727 752
728 753 return self._get_template_context(c)
729 754
@@ -732,13 +757,19 b' class MyAccountView(BaseAppView, DataGri'
732 757 def my_account_pullrequests_data(self):
733 758 self.load_default_context()
734 759 req_get = self.request.GET
760
761 awaiting_my_review = str2bool(req_get.get('awaiting_my_review'))
735 762 closed = str2bool(req_get.get('closed'))
736 763
737 764 statuses = [PullRequest.STATUS_NEW, PullRequest.STATUS_OPEN]
738 765 if closed:
739 766 statuses += [PullRequest.STATUS_CLOSED]
740 767
741 data = self._get_pull_requests_list(statuses=statuses)
768 filter_type = \
769 'awaiting_my_review' if awaiting_my_review \
770 else None
771
772 data = self._get_pull_requests_list(statuses=statuses, filter_type=filter_type)
742 773 return data
743 774
744 775 @LoginRequired()
@@ -41,7 +41,7 b' class TestPullRequestList(object):'
41 41
42 42 @pytest.mark.parametrize('params, expected_title', [
43 43 ({'source': 0, 'closed': 1}, 'Closed'),
44 ({'source': 0, 'my': 1}, 'Opened by me'),
44 ({'source': 0, 'my': 1}, 'Created by me'),
45 45 ({'source': 0, 'awaiting_review': 1}, 'Awaiting review'),
46 46 ({'source': 0, 'awaiting_my_review': 1}, 'Awaiting my review'),
47 47 ({'source': 1}, 'From this repo'),
@@ -539,8 +539,14 b' class RepoCommitsView(RepoAppView):'
539 539 @CSRFRequired()
540 540 def repo_commit_comment_history_view(self):
541 541 c = self.load_default_context()
542 comment_history_id = self.request.matchdict['comment_history_id']
542 543
543 comment_history_id = self.request.matchdict['comment_history_id']
544 comment = ChangesetComment.get_or_404(comment_history_id)
545 comment_owner = (comment.author.user_id == self._rhodecode_db_user.user_id)
546 if comment.draft and not comment_owner:
547 # if we see draft comments history, we only allow this for owner
548 raise HTTPNotFound()
549
544 550 comment_history = ChangesetCommentHistory.get_or_404(comment_history_id)
545 551 is_repo_comment = comment_history.comment.repo.repo_id == self.db_repo.repo_id
546 552
@@ -549,8 +555,7 b' class RepoCommitsView(RepoAppView):'
549 555
550 556 rendered_comment = render(
551 557 'rhodecode:templates/changeset/comment_history.mako',
552 self._get_template_context(c)
553 , self.request)
558 self._get_template_context(c), self.request)
554 559 return rendered_comment
555 560 else:
556 561 log.warning('No permissions for user %s to show comment_history_id: %s',
@@ -39,7 +39,7 b' from rhodecode.lib.ext_json import json'
39 39 from rhodecode.lib.auth import (
40 40 LoginRequired, HasRepoPermissionAny, HasRepoPermissionAnyDecorator,
41 41 NotAnonymous, CSRFRequired)
42 from rhodecode.lib.utils2 import str2bool, safe_str, safe_unicode, safe_int, aslist
42 from rhodecode.lib.utils2 import str2bool, safe_str, safe_unicode, safe_int, aslist, retry
43 43 from rhodecode.lib.vcs.backends.base import (
44 44 EmptyCommit, UpdateFailureReason, unicode_to_reference)
45 45 from rhodecode.lib.vcs.exceptions import (
@@ -79,21 +79,20 b' class RepoPullRequestsView(RepoAppView, '
79 79
80 80 if filter_type == 'awaiting_review':
81 81 pull_requests = PullRequestModel().get_awaiting_review(
82 repo_name, search_q=search_q, source=source, opened_by=opened_by,
83 statuses=statuses, offset=start, length=limit,
84 order_by=order_by, order_dir=order_dir)
82 repo_name,
83 search_q=search_q, statuses=statuses,
84 offset=start, length=limit, order_by=order_by, order_dir=order_dir)
85 85 pull_requests_total_count = PullRequestModel().count_awaiting_review(
86 repo_name, search_q=search_q, source=source, statuses=statuses,
87 opened_by=opened_by)
86 repo_name,
87 search_q=search_q, statuses=statuses)
88 88 elif filter_type == 'awaiting_my_review':
89 89 pull_requests = PullRequestModel().get_awaiting_my_review(
90 repo_name, search_q=search_q, source=source, opened_by=opened_by,
91 user_id=self._rhodecode_user.user_id, statuses=statuses,
92 offset=start, length=limit, order_by=order_by,
93 order_dir=order_dir)
90 repo_name, self._rhodecode_user.user_id,
91 search_q=search_q, statuses=statuses,
92 offset=start, length=limit, order_by=order_by, order_dir=order_dir)
94 93 pull_requests_total_count = PullRequestModel().count_awaiting_my_review(
95 repo_name, search_q=search_q, source=source, user_id=self._rhodecode_user.user_id,
96 statuses=statuses, opened_by=opened_by)
94 repo_name, self._rhodecode_user.user_id,
95 search_q=search_q, statuses=statuses)
97 96 else:
98 97 pull_requests = PullRequestModel().get_all(
99 98 repo_name, search_q=search_q, source=source, opened_by=opened_by,
@@ -110,6 +109,12 b' class RepoPullRequestsView(RepoAppView, '
110 109 self.db_repo.repo_id, pull_request=pr,
111 110 include_drafts=False, count_only=True)
112 111
112 review_statuses = pr.reviewers_statuses(user=self._rhodecode_db_user)
113 my_review_status = ChangesetStatus.STATUS_NOT_REVIEWED
114 if review_statuses and review_statuses[4]:
115 _review_obj, _user, _reasons, _mandatory, statuses = review_statuses
116 my_review_status = statuses[0][1].status
117
113 118 data.append({
114 119 'name': _render('pullrequest_name',
115 120 pr.pull_request_id, pr.pull_request_state,
@@ -118,6 +123,8 b' class RepoPullRequestsView(RepoAppView, '
118 123 'name_raw': pr.pull_request_id,
119 124 'status': _render('pullrequest_status',
120 125 pr.calculated_review_status()),
126 'my_status': _render('pullrequest_status',
127 my_review_status),
121 128 'title': _render('pullrequest_title', pr.title, pr.description),
122 129 'description': h.escape(pr.description),
123 130 'updated_on': _render('pullrequest_updated_on',
@@ -1346,9 +1353,13 b' class RepoPullRequestsView(RepoAppView, '
1346 1353 def _update_commits(self, c, pull_request):
1347 1354 _ = self.request.translate
1348 1355
1356 @retry(exception=Exception, n_tries=3)
1357 def commits_update():
1358 return PullRequestModel().update_commits(
1359 pull_request, self._rhodecode_db_user)
1360
1349 1361 with pull_request.set_state(PullRequest.STATE_UPDATING):
1350 resp = PullRequestModel().update_commits(
1351 pull_request, self._rhodecode_db_user)
1362 resp = commits_update() # retry x3
1352 1363
1353 1364 if resp.executed:
1354 1365
This diff has been collapsed as it changes many lines, (635 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.24.0\n"
9 "Project-Id-Version: rhodecode-enterprise-ce 4.25.0\n"
10 10 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
11 "POT-Creation-Date: 2021-01-14 15:36+0000\n"
11 "POT-Creation-Date: 2021-04-05 19:29+0000\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"
@@ -111,7 +111,7 b' msgstr ""'
111 111 #: rhodecode/apps/admin/views/settings.py:156
112 112 #: rhodecode/apps/admin/views/settings.py:291
113 113 #: rhodecode/apps/admin/views/settings.py:360
114 #: rhodecode/apps/admin/views/settings.py:663
114 #: rhodecode/apps/admin/views/settings.py:664
115 115 #: rhodecode/apps/repository/views/repo_settings_vcs.py:116
116 116 msgid "Some form inputs contain invalid data."
117 117 msgstr ""
@@ -135,54 +135,54 b' msgstr ""'
135 135 msgid "Updated application settings"
136 136 msgstr ""
137 137
138 #: rhodecode/apps/admin/views/settings.py:399
138 #: rhodecode/apps/admin/views/settings.py:400
139 139 msgid "Updated visualisation settings"
140 140 msgstr ""
141 141
142 #: rhodecode/apps/admin/views/settings.py:402
142 #: rhodecode/apps/admin/views/settings.py:403
143 143 msgid "Error occurred during updating visualisation settings"
144 144 msgstr ""
145 145
146 #: rhodecode/apps/admin/views/settings.py:464
146 #: rhodecode/apps/admin/views/settings.py:465
147 147 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:115
148 148 msgid "Invalid issue tracker pattern: {}"
149 149 msgstr ""
150 150
151 #: rhodecode/apps/admin/views/settings.py:481
151 #: rhodecode/apps/admin/views/settings.py:482
152 152 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:124
153 153 msgid "Updated issue tracker entries"
154 154 msgstr ""
155 155
156 #: rhodecode/apps/admin/views/settings.py:498
156 #: rhodecode/apps/admin/views/settings.py:499
157 157 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:82
158 158 msgid "Removed issue tracker entry."
159 159 msgstr ""
160 160
161 #: rhodecode/apps/admin/views/settings.py:530
161 #: rhodecode/apps/admin/views/settings.py:531
162 162 msgid "Please enter email address"
163 163 msgstr ""
164 164
165 #: rhodecode/apps/admin/views/settings.py:546
165 #: rhodecode/apps/admin/views/settings.py:547
166 166 msgid "Send email task created"
167 167 msgstr ""
168 168
169 #: rhodecode/apps/admin/views/settings.py:587
169 #: rhodecode/apps/admin/views/settings.py:588
170 170 msgid "Added new hook"
171 171 msgstr ""
172 172
173 #: rhodecode/apps/admin/views/settings.py:602
173 #: rhodecode/apps/admin/views/settings.py:603
174 174 msgid "Updated hooks"
175 175 msgstr ""
176 176
177 #: rhodecode/apps/admin/views/settings.py:606
177 #: rhodecode/apps/admin/views/settings.py:607
178 178 msgid "Error occurred during hook creation"
179 179 msgstr ""
180 180
181 #: rhodecode/apps/admin/views/settings.py:687
181 #: rhodecode/apps/admin/views/settings.py:688
182 182 msgid "Error occurred during updating labs settings"
183 183 msgstr ""
184 184
185 #: rhodecode/apps/admin/views/settings.py:692
185 #: rhodecode/apps/admin/views/settings.py:693
186 186 msgid "Updated Labs settings"
187 187 msgstr ""
188 188
@@ -592,7 +592,7 b' msgstr ""'
592 592 msgid "1 month"
593 593 msgstr ""
594 594
595 #: rhodecode/apps/gist/views.py:63 rhodecode/public/js/scripts.js:48529
595 #: rhodecode/apps/gist/views.py:63 rhodecode/public/js/scripts.js:48670
596 596 #: rhodecode/public/js/scripts.min.js:1
597 597 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
598 598 #: rhodecode/public/js/src/rhodecode.js:634
@@ -653,8 +653,8 b' msgstr ""'
653 653 #: rhodecode/templates/admin/repos/repo_add.mako:19
654 654 #: rhodecode/templates/admin/users/user_edit_advanced.mako:12
655 655 #: rhodecode/templates/base/base.mako:114
656 #: rhodecode/templates/base/base.mako:133
657 #: rhodecode/templates/base/base.mako:1191
656 #: rhodecode/templates/base/base.mako:134
657 #: rhodecode/templates/base/base.mako:1192
658 658 msgid "Repositories"
659 659 msgstr ""
660 660
@@ -894,104 +894,104 b' msgstr ""'
894 894 msgid "No such commit exists for this repository. Commit: {}"
895 895 msgstr ""
896 896
897 #: rhodecode/apps/repository/views/repo_files.py:358
897 #: rhodecode/apps/repository/views/repo_files.py:359
898 898 msgid "Downloads disabled"
899 899 msgstr ""
900 900
901 #: rhodecode/apps/repository/views/repo_files.py:364
901 #: rhodecode/apps/repository/views/repo_files.py:365
902 902 msgid "Unknown archive type for: `{}`"
903 903 msgstr ""
904 904
905 #: rhodecode/apps/repository/views/repo_files.py:370
905 #: rhodecode/apps/repository/views/repo_files.py:371
906 906 msgid "Unknown commit_id {}"
907 907 msgstr ""
908 908
909 #: rhodecode/apps/repository/views/repo_files.py:373
909 #: rhodecode/apps/repository/views/repo_files.py:374
910 910 msgid "Empty repository"
911 911 msgstr ""
912 912
913 #: rhodecode/apps/repository/views/repo_files.py:378
913 #: rhodecode/apps/repository/views/repo_files.py:384
914 914 msgid "No node at path {} for this repository"
915 915 msgstr ""
916 916
917 #: rhodecode/apps/repository/views/repo_files.py:429
917 #: rhodecode/apps/repository/views/repo_files.py:436
918 918 msgid "Unknown archive type"
919 919 msgstr ""
920 920
921 #: rhodecode/apps/repository/views/repo_files.py:986
921 #: rhodecode/apps/repository/views/repo_files.py:993
922 922 msgid "Changesets"
923 923 msgstr ""
924 924
925 #: rhodecode/apps/repository/views/repo_files.py:1007
926 #: rhodecode/apps/repository/views/repo_summary.py:243
927 #: rhodecode/model/pull_request.py:1910 rhodecode/model/scm.py:999
925 #: rhodecode/apps/repository/views/repo_files.py:1014
926 #: rhodecode/apps/repository/views/repo_summary.py:239
927 #: rhodecode/model/pull_request.py:1912 rhodecode/model/scm.py:999
928 928 #: rhodecode/templates/base/vcs_settings.mako:235
929 929 #: rhodecode/templates/summary/components.mako:10
930 930 msgid "Branches"
931 931 msgstr ""
932 932
933 #: rhodecode/apps/repository/views/repo_files.py:1011
933 #: rhodecode/apps/repository/views/repo_files.py:1018
934 934 #: rhodecode/model/scm.py:1016 rhodecode/templates/base/vcs_settings.mako:260
935 935 #: rhodecode/templates/summary/components.mako:34
936 936 msgid "Tags"
937 937 msgstr ""
938 938
939 #: rhodecode/apps/repository/views/repo_files.py:1155
940 #: rhodecode/apps/repository/views/repo_files.py:1181
939 #: rhodecode/apps/repository/views/repo_files.py:1162
940 #: rhodecode/apps/repository/views/repo_files.py:1188
941 941 msgid "Deleted file {} via RhodeCode Enterprise"
942 942 msgstr ""
943 943
944 #: rhodecode/apps/repository/views/repo_files.py:1202
944 #: rhodecode/apps/repository/views/repo_files.py:1209
945 945 msgid "Successfully deleted file `{}`"
946 946 msgstr ""
947 947
948 #: rhodecode/apps/repository/views/repo_files.py:1206
948 #: rhodecode/apps/repository/views/repo_files.py:1213
949 #: rhodecode/apps/repository/views/repo_files.py:1326
950 #: rhodecode/apps/repository/views/repo_files.py:1450
951 #: rhodecode/apps/repository/views/repo_files.py:1571
952 msgid "Error occurred during commit"
953 msgstr ""
954
955 #: rhodecode/apps/repository/views/repo_files.py:1243
956 #: rhodecode/apps/repository/views/repo_files.py:1272
957 msgid "Edited file {} via RhodeCode Enterprise"
958 msgstr ""
959
960 #: rhodecode/apps/repository/views/repo_files.py:1295
961 msgid "No changes detected on {}"
962 msgstr ""
963
949 964 #: rhodecode/apps/repository/views/repo_files.py:1319
950 #: rhodecode/apps/repository/views/repo_files.py:1443
951 #: rhodecode/apps/repository/views/repo_files.py:1564
952 msgid "Error occurred during commit"
953 msgstr ""
954
955 #: rhodecode/apps/repository/views/repo_files.py:1236
956 #: rhodecode/apps/repository/views/repo_files.py:1265
957 msgid "Edited file {} via RhodeCode Enterprise"
958 msgstr ""
959
960 #: rhodecode/apps/repository/views/repo_files.py:1288
961 msgid "No changes detected on {}"
962 msgstr ""
963
964 #: rhodecode/apps/repository/views/repo_files.py:1312
965 965 msgid "Successfully committed changes to file `{}`"
966 966 msgstr ""
967 967
968 #: rhodecode/apps/repository/views/repo_files.py:1348
969 #: rhodecode/apps/repository/views/repo_files.py:1387
968 #: rhodecode/apps/repository/views/repo_files.py:1355
969 #: rhodecode/apps/repository/views/repo_files.py:1394
970 970 msgid "Added file via RhodeCode Enterprise"
971 971 msgstr ""
972 972
973 #: rhodecode/apps/repository/views/repo_files.py:1403
973 #: rhodecode/apps/repository/views/repo_files.py:1410
974 974 msgid "No filename specified"
975 975 msgstr ""
976 976
977 #: rhodecode/apps/repository/views/repo_files.py:1428
977 #: rhodecode/apps/repository/views/repo_files.py:1435
978 978 msgid "Successfully committed new file `{}`"
979 979 msgstr ""
980 980
981 #: rhodecode/apps/repository/views/repo_files.py:1436
982 #: rhodecode/apps/repository/views/repo_files.py:1546
981 #: rhodecode/apps/repository/views/repo_files.py:1443
982 #: rhodecode/apps/repository/views/repo_files.py:1553
983 983 msgid "The location specified must be a relative path and must not contain .. in the path"
984 984 msgstr ""
985 985
986 #: rhodecode/apps/repository/views/repo_files.py:1491
986 #: rhodecode/apps/repository/views/repo_files.py:1498
987 987 msgid "Uploaded file via RhodeCode Enterprise"
988 988 msgstr ""
989 989
990 #: rhodecode/apps/repository/views/repo_files.py:1535
990 #: rhodecode/apps/repository/views/repo_files.py:1542
991 991 msgid "Successfully committed {} new files"
992 992 msgstr ""
993 993
994 #: rhodecode/apps/repository/views/repo_files.py:1537
994 #: rhodecode/apps/repository/views/repo_files.py:1544
995 995 msgid "Successfully committed 1 new file"
996 996 msgstr ""
997 997
@@ -1215,23 +1215,23 b' msgstr ""'
1215 1215 msgid "Error occurred during updating repository VCS settings"
1216 1216 msgstr ""
1217 1217
1218 #: rhodecode/apps/repository/views/repo_summary.py:222
1218 #: rhodecode/apps/repository/views/repo_summary.py:218
1219 1219 #: rhodecode/templates/admin/permissions/permissions.mako:42
1220 1220 #: rhodecode/templates/summary/components.mako:8
1221 1221 msgid "Branch"
1222 1222 msgstr ""
1223 1223
1224 #: rhodecode/apps/repository/views/repo_summary.py:223
1224 #: rhodecode/apps/repository/views/repo_summary.py:219
1225 1225 #: rhodecode/templates/summary/components.mako:32
1226 1226 msgid "Tag"
1227 1227 msgstr ""
1228 1228
1229 #: rhodecode/apps/repository/views/repo_summary.py:224
1229 #: rhodecode/apps/repository/views/repo_summary.py:220
1230 1230 #: rhodecode/templates/summary/components.mako:44
1231 1231 msgid "Bookmark"
1232 1232 msgstr ""
1233 1233
1234 #: rhodecode/apps/repository/views/repo_summary.py:244
1234 #: rhodecode/apps/repository/views/repo_summary.py:240
1235 1235 msgid "Closed branches"
1236 1236 msgstr ""
1237 1237
@@ -1291,9 +1291,9 b' msgid "Enable or disable this authentica'
1291 1291 msgstr ""
1292 1292
1293 1293 #: rhodecode/authentication/schema.py:38 rhodecode/integrations/schema.py:32
1294 #: rhodecode/model/permission.py:110 rhodecode/model/permission.py:114
1295 #: rhodecode/model/permission.py:118 rhodecode/model/permission.py:122
1296 #: rhodecode/model/permission.py:126 rhodecode/model/permission.py:130
1294 #: rhodecode/model/permission.py:112 rhodecode/model/permission.py:116
1295 #: rhodecode/model/permission.py:120 rhodecode/model/permission.py:124
1296 #: rhodecode/model/permission.py:128 rhodecode/model/permission.py:132
1297 1297 #: rhodecode/model/validation_schema/schemas/integration_schema.py:195
1298 1298 #: rhodecode/templates/admin/auth/auth_settings.mako:64
1299 1299 #: rhodecode/templates/admin/integrations/list.mako:71
@@ -1806,7 +1806,7 b' msgstr ""'
1806 1806 #: rhodecode/templates/admin/settings/settings_issuetracker.mako:16
1807 1807 #: rhodecode/templates/admin/settings/settings_labs.mako:49
1808 1808 #: rhodecode/templates/admin/settings/settings_vcs.mako:14
1809 #: rhodecode/templates/admin/settings/settings_visual.mako:215
1809 #: rhodecode/templates/admin/settings/settings_visual.mako:218
1810 1810 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:217
1811 1811 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:107
1812 1812 #: rhodecode/templates/admin/users/user_edit_emails.mako:66
@@ -1841,7 +1841,7 b' msgstr ""'
1841 1841 #: rhodecode/templates/changeset/changeset_file_comment.mako:236
1842 1842 #: rhodecode/templates/changeset/changeset_file_comment.mako:250
1843 1843 #: rhodecode/templates/changeset/changeset_file_comment.mako:259
1844 #: rhodecode/templates/data_table/_dt_elements.mako:439
1844 #: rhodecode/templates/data_table/_dt_elements.mako:445
1845 1845 #: rhodecode/templates/debug_style/buttons.html:132
1846 1846 #: rhodecode/templates/files/files_source.mako:40
1847 1847 #: rhodecode/templates/files/files_source.mako:47
@@ -2229,15 +2229,15 b' msgstr ""'
2229 2229 msgid "Commit not found"
2230 2230 msgstr ""
2231 2231
2232 #: rhodecode/lib/auth.py:1769
2232 #: rhodecode/lib/auth.py:1771
2233 2233 msgid "IP {} not allowed"
2234 2234 msgstr ""
2235 2235
2236 #: rhodecode/lib/auth.py:1861
2236 #: rhodecode/lib/auth.py:1863
2237 2237 msgid "You need to be a registered user to perform this action"
2238 2238 msgstr ""
2239 2239
2240 #: rhodecode/lib/auth.py:1905
2240 #: rhodecode/lib/auth.py:1907
2241 2241 msgid "You need to be signed in to view this page"
2242 2242 msgstr ""
2243 2243
@@ -2249,7 +2249,7 b' msgstr ""'
2249 2249 msgid "Click to select line"
2250 2250 msgstr ""
2251 2251
2252 #: rhodecode/lib/helpers.py:1878
2252 #: rhodecode/lib/helpers.py:1883
2253 2253 msgid ""
2254 2254 "Example filter terms:\n"
2255 2255 " repository:vcs\n"
@@ -2271,7 +2271,7 b' msgid ""'
2271 2271 " \"username:test AND repository:test*\"\n"
2272 2272 msgstr ""
2273 2273
2274 #: rhodecode/lib/helpers.py:1902
2274 #: rhodecode/lib/helpers.py:1907
2275 2275 #, python-format
2276 2276 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"
2277 2277 msgstr ""
@@ -2760,7 +2760,7 b' msgstr ""'
2760 2760 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3011
2761 2761 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3012
2762 2762 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3230 rhodecode/model/db.py:3997
2763 #: rhodecode/public/js/scripts.js:42595 rhodecode/public/js/scripts.min.js:1
2763 #: rhodecode/public/js/scripts.js:42733 rhodecode/public/js/scripts.min.js:1
2764 2764 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72
2765 2765 #: rhodecode/public/js/src/rhodecode/pullrequests.js:396
2766 2766 msgid "Not Reviewed"
@@ -3520,7 +3520,7 b' msgstr ""'
3520 3520 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2358
3521 3521 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2359
3522 3522 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2559 rhodecode/model/db.py:3174
3523 #: rhodecode/model/permission.py:105
3523 #: rhodecode/model/permission.py:107
3524 3524 msgid "Manual activation of external account"
3525 3525 msgstr ""
3526 3526
@@ -3560,7 +3560,7 b' msgstr ""'
3560 3560 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2359
3561 3561 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2360
3562 3562 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2560 rhodecode/model/db.py:3175
3563 #: rhodecode/model/permission.py:106
3563 #: rhodecode/model/permission.py:108
3564 3564 msgid "Automatic activation of external account"
3565 3565 msgstr ""
3566 3566
@@ -3986,51 +3986,51 b' msgstr ""'
3986 3986 msgid "Commit index"
3987 3987 msgstr ""
3988 3988
3989 #: rhodecode/lib/vcs/backends/base.py:186
3989 #: rhodecode/lib/vcs/backends/base.py:190
3990 3990 msgid "This pull request can be automatically merged."
3991 3991 msgstr ""
3992 3992
3993 #: rhodecode/lib/vcs/backends/base.py:188
3993 #: rhodecode/lib/vcs/backends/base.py:192
3994 3994 msgid "This pull request cannot be merged because of an unhandled exception. {exception}"
3995 3995 msgstr ""
3996 3996
3997 #: rhodecode/lib/vcs/backends/base.py:191
3997 #: rhodecode/lib/vcs/backends/base.py:195
3998 3998 msgid "This pull request cannot be merged because of merge conflicts. {unresolved_files}"
3999 3999 msgstr ""
4000 4000
4001 #: rhodecode/lib/vcs/backends/base.py:193
4001 #: rhodecode/lib/vcs/backends/base.py:197
4002 4002 msgid "This pull request could not be merged because push to target:`{target}@{merge_commit}` failed."
4003 4003 msgstr ""
4004 4004
4005 #: rhodecode/lib/vcs/backends/base.py:196
4005 #: rhodecode/lib/vcs/backends/base.py:200
4006 4006 msgid "This pull request cannot be merged because the target `{target_ref.name}` is not a head."
4007 4007 msgstr ""
4008 4008
4009 #: rhodecode/lib/vcs/backends/base.py:199
4009 #: rhodecode/lib/vcs/backends/base.py:203
4010 4010 msgid "This pull request cannot be merged because the source contains more branches than the target."
4011 4011 msgstr ""
4012 4012
4013 #: rhodecode/lib/vcs/backends/base.py:202
4013 #: rhodecode/lib/vcs/backends/base.py:206
4014 4014 msgid "This pull request cannot be merged because the target `{target_ref.name}` has multiple heads: `{heads}`."
4015 4015 msgstr ""
4016 4016
4017 #: rhodecode/lib/vcs/backends/base.py:205
4018 msgid "This pull request cannot be merged because the target repository is locked by {locked_by}."
4019 msgstr ""
4020
4021 4017 #: rhodecode/lib/vcs/backends/base.py:209
4018 msgid "This pull request cannot be merged because the target repository is locked by {locked_by}."
4019 msgstr ""
4020
4021 #: rhodecode/lib/vcs/backends/base.py:213
4022 4022 msgid "This pull request cannot be merged because the target reference `{target_ref.name}` is missing."
4023 4023 msgstr ""
4024 4024
4025 #: rhodecode/lib/vcs/backends/base.py:212
4025 #: rhodecode/lib/vcs/backends/base.py:216
4026 4026 msgid "This pull request cannot be merged because the source reference `{source_ref.name}` is missing."
4027 4027 msgstr ""
4028 4028
4029 #: rhodecode/lib/vcs/backends/base.py:215
4029 #: rhodecode/lib/vcs/backends/base.py:219
4030 4030 msgid "This pull request cannot be merged because of conflicts related to sub repositories."
4031 4031 msgstr ""
4032 4032
4033 #: rhodecode/lib/vcs/backends/base.py:220
4033 #: rhodecode/lib/vcs/backends/base.py:224
4034 4034 msgid "This pull request cannot be merged because the target or the source reference is missing."
4035 4035 msgstr ""
4036 4036
@@ -4138,8 +4138,8 b' msgstr ""'
4138 4138 msgid "%(user)s commented on pull request at %(date_or_age)s"
4139 4139 msgstr ""
4140 4140
4141 #: rhodecode/model/permission.py:71 rhodecode/model/permission.py:77
4142 #: rhodecode/model/permission.py:83
4141 #: rhodecode/model/permission.py:73 rhodecode/model/permission.py:79
4142 #: rhodecode/model/permission.py:85
4143 4143 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:11
4144 4144 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:217
4145 4145 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:11
@@ -4147,27 +4147,27 b' msgstr ""'
4147 4147 msgid "None"
4148 4148 msgstr ""
4149 4149
4150 #: rhodecode/model/permission.py:72 rhodecode/model/permission.py:78
4151 #: rhodecode/model/permission.py:84
4150 #: rhodecode/model/permission.py:74 rhodecode/model/permission.py:80
4151 #: rhodecode/model/permission.py:86
4152 4152 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:12
4153 4153 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:12
4154 4154 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:16
4155 4155 msgid "Read"
4156 4156 msgstr ""
4157 4157
4158 #: rhodecode/model/permission.py:73 rhodecode/model/permission.py:79
4159 #: rhodecode/model/permission.py:85
4158 #: rhodecode/model/permission.py:75 rhodecode/model/permission.py:81
4159 #: rhodecode/model/permission.py:87
4160 4160 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:13
4161 4161 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:13
4162 4162 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:17
4163 4163 #: rhodecode/templates/changeset/changeset_file_comment.mako:392
4164 4164 #: rhodecode/templates/changeset/changeset_file_comment.mako:443
4165 #: rhodecode/templates/data_table/_dt_elements.mako:453
4165 #: rhodecode/templates/data_table/_dt_elements.mako:460
4166 4166 msgid "Write"
4167 4167 msgstr ""
4168 4168
4169 #: rhodecode/model/permission.py:74 rhodecode/model/permission.py:80
4170 #: rhodecode/model/permission.py:86
4169 #: rhodecode/model/permission.py:76 rhodecode/model/permission.py:82
4170 #: rhodecode/model/permission.py:88
4171 4171 #: rhodecode/templates/admin/auth/plugin_settings.mako:12
4172 4172 #: rhodecode/templates/admin/defaults/defaults.mako:12
4173 4173 #: rhodecode/templates/admin/integrations/base.mako:21
@@ -4189,51 +4189,51 b' msgstr ""'
4189 4189 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:18
4190 4190 #: rhodecode/templates/admin/users/user_add.mako:11
4191 4191 #: rhodecode/templates/admin/users/user_edit.mako:12
4192 #: rhodecode/templates/base/base.mako:838
4192 #: rhodecode/templates/base/base.mako:839
4193 4193 msgid "Admin"
4194 4194 msgstr ""
4195 4195
4196 #: rhodecode/model/permission.py:89
4197 msgid "Protected/No Access"
4198 msgstr ""
4199
4200 #: rhodecode/model/permission.py:90
4201 msgid "Web merge"
4202 msgstr ""
4203
4204 4196 #: rhodecode/model/permission.py:91
4205 msgid "Push"
4197 msgid "Protected/No Access"
4206 4198 msgstr ""
4207 4199
4208 4200 #: rhodecode/model/permission.py:92
4201 msgid "Web merge"
4202 msgstr ""
4203
4204 #: rhodecode/model/permission.py:93
4205 msgid "Push"
4206 msgstr ""
4207
4208 #: rhodecode/model/permission.py:94
4209 4209 msgid "Force Push"
4210 4210 msgstr ""
4211 4211
4212 #: rhodecode/model/permission.py:95 rhodecode/model/permission.py:109
4213 #: rhodecode/model/permission.py:113 rhodecode/model/permission.py:117
4214 #: rhodecode/model/permission.py:121 rhodecode/model/permission.py:125
4215 #: rhodecode/model/permission.py:129
4212 #: rhodecode/model/permission.py:97 rhodecode/model/permission.py:111
4213 #: rhodecode/model/permission.py:115 rhodecode/model/permission.py:119
4214 #: rhodecode/model/permission.py:123 rhodecode/model/permission.py:127
4215 #: rhodecode/model/permission.py:131
4216 4216 #: rhodecode/templates/admin/my_account/my_account_notifications.mako:27
4217 4217 msgid "Disabled"
4218 4218 msgstr ""
4219 4219
4220 #: rhodecode/model/permission.py:96
4220 #: rhodecode/model/permission.py:98
4221 4221 msgid "Allowed with manual account activation"
4222 4222 msgstr ""
4223 4223
4224 #: rhodecode/model/permission.py:97
4224 #: rhodecode/model/permission.py:99
4225 4225 msgid "Allowed with automatic account activation"
4226 4226 msgstr ""
4227 4227
4228 #: rhodecode/model/permission.py:100
4229 msgid "Allow password recovery"
4230 msgstr ""
4231
4232 #: rhodecode/model/permission.py:101
4233 msgid "Hide password recovery link"
4234 msgstr ""
4235
4236 4228 #: rhodecode/model/permission.py:102
4229 msgid "Allow password recovery"
4230 msgstr ""
4231
4232 #: rhodecode/model/permission.py:103
4233 msgid "Hide password recovery link"
4234 msgstr ""
4235
4236 #: rhodecode/model/permission.py:104
4237 4237 msgid "Disable password recovery"
4238 4238 msgstr ""
4239 4239
@@ -4261,79 +4261,79 b' msgstr ""'
4261 4261 msgid "This pull request cannot be updated because the source reference is missing."
4262 4262 msgstr ""
4263 4263
4264 #: rhodecode/model/pull_request.py:1688
4264 #: rhodecode/model/pull_request.py:1690
4265 4265 msgid "Server-side pull request merging is disabled."
4266 4266 msgstr ""
4267 4267
4268 #: rhodecode/model/pull_request.py:1691
4268 #: rhodecode/model/pull_request.py:1693
4269 4269 msgid "This pull request is closed."
4270 4270 msgstr ""
4271 4271
4272 #: rhodecode/model/pull_request.py:1705
4272 #: rhodecode/model/pull_request.py:1707
4273 4273 msgid "Pull request merging is not supported."
4274 4274 msgstr ""
4275 4275
4276 #: rhodecode/model/pull_request.py:1722
4276 #: rhodecode/model/pull_request.py:1724
4277 4277 msgid "Target repository large files support is disabled."
4278 4278 msgstr ""
4279 4279
4280 #: rhodecode/model/pull_request.py:1725
4280 #: rhodecode/model/pull_request.py:1727
4281 4281 msgid "Source repository large files support is disabled."
4282 4282 msgstr ""
4283 4283
4284 #: rhodecode/model/pull_request.py:1909 rhodecode/model/scm.py:1008
4284 #: rhodecode/model/pull_request.py:1911 rhodecode/model/scm.py:1008
4285 4285 #: rhodecode/templates/admin/my_account/my_account.mako:32
4286 #: rhodecode/templates/base/base.mako:638
4286 #: rhodecode/templates/base/base.mako:639
4287 4287 #: rhodecode/templates/summary/components.mako:46
4288 4288 msgid "Bookmarks"
4289 4289 msgstr ""
4290 4290
4291 #: rhodecode/model/pull_request.py:1914
4291 #: rhodecode/model/pull_request.py:1916
4292 4292 msgid "Commit IDs"
4293 4293 msgstr ""
4294 4294
4295 #: rhodecode/model/pull_request.py:1917
4295 #: rhodecode/model/pull_request.py:1919
4296 4296 #: rhodecode/templates/summary/components.mako:22
4297 4297 msgid "Closed Branches"
4298 4298 msgstr ""
4299 4299
4300 #: rhodecode/model/pull_request.py:2103
4300 #: rhodecode/model/pull_request.py:2105
4301 4301 msgid "WIP marker in title prevents from accidental merge."
4302 4302 msgstr ""
4303 4303
4304 #: rhodecode/model/pull_request.py:2113
4304 #: rhodecode/model/pull_request.py:2115
4305 4305 msgid "User `{}` not allowed to perform merge."
4306 4306 msgstr ""
4307 4307
4308 #: rhodecode/model/pull_request.py:2131
4308 #: rhodecode/model/pull_request.py:2133
4309 4309 msgid "Target branch `{}` changes rejected by rule {}."
4310 4310 msgstr ""
4311 4311
4312 #: rhodecode/model/pull_request.py:2146
4312 #: rhodecode/model/pull_request.py:2148
4313 4313 msgid "Pull request reviewer approval is pending."
4314 4314 msgstr ""
4315 4315
4316 #: rhodecode/model/pull_request.py:2160
4316 #: rhodecode/model/pull_request.py:2162
4317 4317 msgid "Cannot merge, {} TODO still not resolved."
4318 4318 msgstr ""
4319 4319
4320 #: rhodecode/model/pull_request.py:2163
4320 #: rhodecode/model/pull_request.py:2165
4321 4321 msgid "Cannot merge, {} TODOs still not resolved."
4322 4322 msgstr ""
4323 4323
4324 #: rhodecode/model/pull_request.py:2218
4324 #: rhodecode/model/pull_request.py:2220
4325 4325 msgid "Merge strategy: rebase"
4326 4326 msgstr ""
4327 4327
4328 #: rhodecode/model/pull_request.py:2223
4328 #: rhodecode/model/pull_request.py:2225
4329 4329 msgid "Merge strategy: explicit merge commit"
4330 4330 msgstr ""
4331 4331
4332 #: rhodecode/model/pull_request.py:2231
4333 msgid "Source branch will be closed before the merge."
4334 msgstr ""
4335
4336 4332 #: rhodecode/model/pull_request.py:2233
4333 msgid "Source branch will be closed before the merge."
4334 msgstr ""
4335
4336 #: rhodecode/model/pull_request.py:2235
4337 4337 msgid "Source branch will be deleted after the merge."
4338 4338 msgstr ""
4339 4339
@@ -4880,129 +4880,133 b' msgstr ""'
4880 4880 msgid "Note Comment"
4881 4881 msgstr ""
4882 4882
4883 #: rhodecode/public/js/scripts.js:39599 rhodecode/public/js/scripts.js:39987
4883 #: rhodecode/public/js/scripts.js:39599 rhodecode/public/js/scripts.js:39985
4884 4884 #: rhodecode/public/js/scripts.min.js:1
4885 4885 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:103
4886 4886 #: rhodecode/public/js/src/rhodecode/codemirror.js:730
4887 #: rhodecode/public/js/src/rhodecode/comments.js:267
4887 #: rhodecode/public/js/src/rhodecode/comments.js:265
4888 4888 msgid "Status Review"
4889 4889 msgstr ""
4890 4890
4891 #: rhodecode/public/js/scripts.js:39614 rhodecode/public/js/scripts.js:40004
4891 #: rhodecode/public/js/scripts.js:39614 rhodecode/public/js/scripts.js:40002
4892 4892 #: rhodecode/public/js/scripts.min.js:1
4893 4893 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:24
4894 4894 #: rhodecode/public/js/src/rhodecode/codemirror.js:745
4895 #: rhodecode/public/js/src/rhodecode/comments.js:284
4895 #: rhodecode/public/js/src/rhodecode/comments.js:282
4896 4896 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
4897 4897 msgstr ""
4898 4898
4899 #: rhodecode/public/js/scripts.js:39695 rhodecode/public/js/scripts.js:40213
4900 #: rhodecode/public/js/scripts.js:41745 rhodecode/public/js/scripts.min.js:1
4899 #: rhodecode/public/js/scripts.js:39695 rhodecode/public/js/scripts.js:40211
4900 #: rhodecode/public/js/scripts.js:41883 rhodecode/public/js/scripts.min.js:1
4901 4901 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49
4902 4902 #: rhodecode/public/js/src/rhodecode/codemirror.js:826
4903 #: rhodecode/public/js/src/rhodecode/comments.js:493
4903 #: rhodecode/public/js/src/rhodecode/comments.js:491
4904 4904 #: rhodecode/public/js/src/rhodecode/files.js:499
4905 4905 #: rhodecode/templates/files/files_browser_tree.mako:57
4906 4906 msgid "Loading ..."
4907 4907 msgstr ""
4908 4908
4909 #: rhodecode/public/js/scripts.js:39860 rhodecode/public/js/scripts.min.js:1
4909 #: rhodecode/public/js/scripts.js:39859 rhodecode/public/js/scripts.min.js:1
4910 4910 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:123
4911 #: rhodecode/public/js/src/rhodecode/comments.js:140
4911 #: rhodecode/public/js/src/rhodecode/comments.js:139
4912 4912 msgid "Update Comment"
4913 4913 msgstr ""
4914 4914
4915 #: rhodecode/public/js/scripts.js:39884 rhodecode/public/js/scripts.min.js:1
4915 #: rhodecode/public/js/scripts.js:39883 rhodecode/public/js/scripts.min.js:1
4916 4916 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:150
4917 #: rhodecode/public/js/src/rhodecode/comments.js:164
4917 #: rhodecode/public/js/src/rhodecode/comments.js:163
4918 4918 msgid "resolve comment"
4919 4919 msgstr ""
4920 4920
4921 #: rhodecode/public/js/scripts.js:40155 rhodecode/public/js/scripts.min.js:1
4922 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
4923 #: rhodecode/public/js/src/rhodecode/comments.js:435
4924 msgid "Saving Draft..."
4925 msgstr ""
4926
4921 4927 #: rhodecode/public/js/scripts.js:40157 rhodecode/public/js/scripts.min.js:1
4922 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
4928 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:108
4923 4929 #: rhodecode/public/js/src/rhodecode/comments.js:437
4924 msgid "Saving Draft..."
4925 msgstr ""
4926
4927 #: rhodecode/public/js/scripts.js:40159 rhodecode/public/js/scripts.min.js:1
4928 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:108
4929 #: rhodecode/public/js/src/rhodecode/comments.js:439
4930 4930 msgid "Submitting..."
4931 4931 msgstr ""
4932 4932
4933 #: rhodecode/public/js/scripts.js:40481 rhodecode/public/js/scripts.min.js:1
4933 #: rhodecode/public/js/scripts.js:40479 rhodecode/public/js/scripts.min.js:1
4934 4934 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:131
4935 #: rhodecode/public/js/src/rhodecode/comments.js:761
4935 #: rhodecode/public/js/src/rhodecode/comments.js:759
4936 4936 msgid "Yes, delete comment #{0}!"
4937 4937 msgstr ""
4938 4938
4939 #: rhodecode/public/js/scripts.js:40526 rhodecode/public/js/scripts.min.js:1
4939 #: rhodecode/public/js/scripts.js:40524 rhodecode/public/js/scripts.min.js:1
4940 4940 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:106
4941 #: rhodecode/public/js/src/rhodecode/comments.js:806
4941 #: rhodecode/public/js/src/rhodecode/comments.js:804
4942 4942 msgid "Submit {0} draft comment."
4943 4943 msgstr ""
4944 4944
4945 #: rhodecode/public/js/scripts.js:40529 rhodecode/public/js/scripts.min.js:1
4945 #: rhodecode/public/js/scripts.js:40527 rhodecode/public/js/scripts.js:41225
4946 #: rhodecode/public/js/scripts.min.js:1
4946 4947 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:130
4947 #: rhodecode/public/js/src/rhodecode/comments.js:809
4948 #: rhodecode/public/js/src/rhodecode/comments.js:807
4949 #: rhodecode/public/js/src/rhodecode/comments.js:1505
4948 4950 msgid "Yes"
4949 4951 msgstr ""
4950 4952
4951 #: rhodecode/public/js/scripts.js:40621 rhodecode/public/js/scripts.min.js:1
4953 #: rhodecode/public/js/scripts.js:40619 rhodecode/public/js/scripts.min.js:1
4952 4954 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
4953 #: rhodecode/public/js/src/rhodecode/comments.js:901
4955 #: rhodecode/public/js/src/rhodecode/comments.js:899
4954 4956 msgid "Leave a resolution comment, or click resolve button to resolve TODO comment #{0}"
4955 4957 msgstr ""
4956 4958
4957 #: rhodecode/public/js/scripts.js:40825 rhodecode/public/js/scripts.min.js:1
4959 #: rhodecode/public/js/scripts.js:40823 rhodecode/public/js/scripts.min.js:1
4958 4960 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
4959 #: rhodecode/public/js/src/rhodecode/comments.js:1105
4961 #: rhodecode/public/js/src/rhodecode/comments.js:1103
4960 4962 msgid "Comment body was not changed."
4961 4963 msgstr ""
4962 4964
4963 #: rhodecode/public/js/scripts.js:41071 rhodecode/public/js/scripts.min.js:1
4965 #: rhodecode/public/js/scripts.js:41074 rhodecode/public/js/scripts.min.js:1
4964 4966 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
4965 #: rhodecode/public/js/src/rhodecode/comments.js:1351
4967 #: rhodecode/public/js/src/rhodecode/comments.js:1354
4966 4968 msgid "Leave a comment on file {0} line {1}."
4967 4969 msgstr ""
4968 4970
4969 #: rhodecode/public/js/scripts.js:41212 rhodecode/public/js/scripts.min.js:1
4971 #: rhodecode/public/js/scripts.js:41214 rhodecode/public/js/scripts.js:41267
4972 #: rhodecode/public/js/scripts.min.js:1
4970 4973 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:113
4971 #: rhodecode/public/js/src/rhodecode/comments.js:1492
4974 #: rhodecode/public/js/src/rhodecode/comments.js:1494
4975 #: rhodecode/public/js/src/rhodecode/comments.js:1547
4972 4976 msgid "TODO from comment {0} was fixed."
4973 4977 msgstr ""
4974 4978
4975 #: rhodecode/public/js/scripts.js:41494 rhodecode/public/js/scripts.min.js:1
4979 #: rhodecode/public/js/scripts.js:41632 rhodecode/public/js/scripts.min.js:1
4976 4980 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:154
4977 4981 #: rhodecode/public/js/src/rhodecode/files.js:248
4978 4982 msgid "truncated result"
4979 4983 msgstr ""
4980 4984
4981 #: rhodecode/public/js/scripts.js:41496 rhodecode/public/js/scripts.min.js:1
4985 #: rhodecode/public/js/scripts.js:41634 rhodecode/public/js/scripts.min.js:1
4982 4986 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:155
4983 4987 #: rhodecode/public/js/src/rhodecode/files.js:250
4984 4988 msgid "truncated results"
4985 4989 msgstr ""
4986 4990
4987 #: rhodecode/public/js/scripts.js:41505 rhodecode/public/js/scripts.min.js:1
4991 #: rhodecode/public/js/scripts.js:41643 rhodecode/public/js/scripts.min.js:1
4988 4992 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
4989 4993 #: rhodecode/public/js/src/rhodecode/files.js:259
4990 4994 msgid "No matching files"
4991 4995 msgstr ""
4992 4996
4993 #: rhodecode/public/js/scripts.js:41563 rhodecode/public/js/scripts.min.js:1
4997 #: rhodecode/public/js/scripts.js:41701 rhodecode/public/js/scripts.min.js:1
4994 4998 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86
4995 4999 #: rhodecode/public/js/src/rhodecode/files.js:317
4996 5000 msgid "Selection link"
4997 5001 msgstr ""
4998 5002
4999 #: rhodecode/public/js/scripts.js:41660 rhodecode/public/js/scripts.min.js:1
5003 #: rhodecode/public/js/scripts.js:41798 rhodecode/public/js/scripts.min.js:1
5000 5004 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10
5001 5005 #: rhodecode/public/js/src/rhodecode/files.js:414
5002 5006 msgid "All Authors"
5003 5007 msgstr ""
5004 5008
5005 #: rhodecode/public/js/scripts.js:41810 rhodecode/public/js/scripts.js:41813
5009 #: rhodecode/public/js/scripts.js:41948 rhodecode/public/js/scripts.js:41951
5006 5010 #: rhodecode/public/js/scripts.min.js:1
5007 5011 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
5008 5012 #: rhodecode/public/js/src/rhodecode/files.js:564
@@ -5010,141 +5014,141 b' msgstr ""'
5010 5014 msgid "File `{0}` has a newer version available, or has been removed. Click {1} to see the latest version."
5011 5015 msgstr ""
5012 5016
5013 #: rhodecode/public/js/scripts.js:41816 rhodecode/public/js/scripts.min.js:1
5017 #: rhodecode/public/js/scripts.js:41954 rhodecode/public/js/scripts.min.js:1
5014 5018 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:117
5015 5019 #: rhodecode/public/js/src/rhodecode/files.js:570
5016 5020 msgid "There is an existing path `{0}` at this commit."
5017 5021 msgstr ""
5018 5022
5019 #: rhodecode/public/js/scripts.js:41819 rhodecode/public/js/scripts.min.js:1
5023 #: rhodecode/public/js/scripts.js:41957 rhodecode/public/js/scripts.min.js:1
5020 5024 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:116
5021 5025 #: rhodecode/public/js/src/rhodecode/files.js:573
5022 5026 msgid "There is a later version of file tree available. Click {0} to create a file at the latest tree."
5023 5027 msgstr ""
5024 5028
5025 #: rhodecode/public/js/scripts.js:41873 rhodecode/public/js/scripts.min.js:1
5029 #: rhodecode/public/js/scripts.js:42011 rhodecode/public/js/scripts.min.js:1
5026 5030 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:105
5027 5031 #: rhodecode/public/js/src/rhodecode/followers.js:26
5028 5032 msgid "Stopped watching this repository"
5029 5033 msgstr ""
5030 5034
5031 #: rhodecode/public/js/scripts.js:41874 rhodecode/public/js/scripts.min.js:1
5035 #: rhodecode/public/js/scripts.js:42012 rhodecode/public/js/scripts.min.js:1
5032 5036 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:129
5033 5037 #: rhodecode/public/js/src/rhodecode/followers.js:27
5034 #: rhodecode/templates/base/base.mako:310
5038 #: rhodecode/templates/base/base.mako:311
5035 5039 msgid "Watch"
5036 5040 msgstr ""
5037 5041
5038 #: rhodecode/public/js/scripts.js:41877 rhodecode/public/js/scripts.min.js:1
5042 #: rhodecode/public/js/scripts.js:42015 rhodecode/public/js/scripts.min.js:1
5039 5043 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:102
5040 5044 #: rhodecode/public/js/src/rhodecode/followers.js:30
5041 5045 msgid "Started watching this repository"
5042 5046 msgstr ""
5043 5047
5044 #: rhodecode/public/js/scripts.js:41878 rhodecode/public/js/scripts.min.js:1
5048 #: rhodecode/public/js/scripts.js:42016 rhodecode/public/js/scripts.min.js:1
5045 5049 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:122
5046 5050 #: rhodecode/public/js/src/rhodecode/followers.js:31
5047 #: rhodecode/templates/base/base.mako:308
5051 #: rhodecode/templates/base/base.mako:309
5048 5052 msgid "Unwatch"
5049 5053 msgstr ""
5050 5054
5051 #: rhodecode/public/js/scripts.js:42384 rhodecode/public/js/scripts.min.js:1
5055 #: rhodecode/public/js/scripts.js:42522 rhodecode/public/js/scripts.min.js:1
5052 5056 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12
5053 5057 #: rhodecode/public/js/src/rhodecode/pullrequests.js:185
5054 5058 msgid "All reviewers must vote."
5055 5059 msgstr ""
5056 5060
5057 #: rhodecode/public/js/scripts.js:42408 rhodecode/public/js/scripts.min.js:1
5061 #: rhodecode/public/js/scripts.js:42546 rhodecode/public/js/scripts.min.js:1
5058 5062 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
5059 5063 #: rhodecode/public/js/src/rhodecode/pullrequests.js:209
5060 5064 msgid "No additional review rules set."
5061 5065 msgstr ""
5062 5066
5063 #: rhodecode/public/js/scripts.js:42454 rhodecode/public/js/scripts.min.js:1
5067 #: rhodecode/public/js/scripts.js:42592 rhodecode/public/js/scripts.min.js:1
5064 5068 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
5065 5069 #: rhodecode/public/js/src/rhodecode/pullrequests.js:255
5066 5070 msgid "Loading diff ..."
5067 5071 msgstr ""
5068 5072
5069 #: rhodecode/public/js/scripts.js:42507 rhodecode/public/js/scripts.min.js:1
5073 #: rhodecode/public/js/scripts.js:42645 rhodecode/public/js/scripts.min.js:1
5070 5074 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:115
5071 5075 #: rhodecode/public/js/src/rhodecode/pullrequests.js:308
5072 5076 msgid "There are no commits to merge."
5073 5077 msgstr ""
5074 5078
5075 #: rhodecode/public/js/scripts.js:42579 rhodecode/public/js/scripts.min.js:1
5079 #: rhodecode/public/js/scripts.js:42717 rhodecode/public/js/scripts.min.js:1
5076 5080 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:128
5077 5081 #: rhodecode/public/js/src/rhodecode/pullrequests.js:380
5078 5082 msgid "User `{0}` not allowed to be a reviewer"
5079 5083 msgstr ""
5080 5084
5081 #: rhodecode/public/js/scripts.js:42585 rhodecode/public/js/scripts.min.js:1
5085 #: rhodecode/public/js/scripts.js:42723 rhodecode/public/js/scripts.min.js:1
5082 5086 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:127
5083 5087 #: rhodecode/public/js/src/rhodecode/pullrequests.js:386
5084 5088 msgid "User `{0}` already in reviewers/observers"
5085 5089 msgstr ""
5086 5090
5087 #: rhodecode/public/js/scripts.js:42699 rhodecode/public/js/scripts.min.js:1
5091 #: rhodecode/public/js/scripts.js:42838 rhodecode/public/js/scripts.min.js:1
5088 5092 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:135
5089 5093 #: rhodecode/public/js/src/rhodecode/pullrequests.js:501
5090 5094 msgid "added manually by \"{0}\""
5091 5095 msgstr ""
5092 5096
5093 #: rhodecode/public/js/scripts.js:42704 rhodecode/public/js/scripts.min.js:1
5097 #: rhodecode/public/js/scripts.js:42843 rhodecode/public/js/scripts.min.js:1
5094 5098 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:147
5095 5099 #: rhodecode/public/js/src/rhodecode/pullrequests.js:506
5096 5100 msgid "member of \"{0}\""
5097 5101 msgstr ""
5098 5102
5099 #: rhodecode/public/js/scripts.js:42937 rhodecode/public/js/scripts.min.js:1
5103 #: rhodecode/public/js/scripts.js:43076 rhodecode/public/js/scripts.min.js:1
5100 5104 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:125
5101 5105 #: rhodecode/public/js/src/rhodecode/pullrequests.js:739
5102 5106 msgid "Updating..."
5103 5107 msgstr ""
5104 5108
5105 #: rhodecode/public/js/scripts.js:42947 rhodecode/public/js/scripts.min.js:1
5109 #: rhodecode/public/js/scripts.js:43086 rhodecode/public/js/scripts.min.js:1
5106 5110 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
5107 5111 #: rhodecode/public/js/src/rhodecode/pullrequests.js:749
5108 5112 msgid "Force updating..."
5109 5113 msgstr ""
5110 5114
5111 #: rhodecode/public/js/scripts.js:47812 rhodecode/public/js/scripts.min.js:1
5115 #: rhodecode/public/js/scripts.js:47953 rhodecode/public/js/scripts.min.js:1
5112 5116 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:98
5113 5117 #: rhodecode/public/js/src/rhodecode/users.js:54
5114 5118 msgid "Show this authentication token?"
5115 5119 msgstr ""
5116 5120
5117 #: rhodecode/public/js/scripts.js:47814 rhodecode/public/js/scripts.min.js:1
5121 #: rhodecode/public/js/scripts.js:47955 rhodecode/public/js/scripts.min.js:1
5118 5122 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:90
5119 5123 #: rhodecode/public/js/src/rhodecode/users.js:56
5120 5124 msgid "Show"
5121 5125 msgstr ""
5122 5126
5123 #: rhodecode/public/js/scripts.js:47850 rhodecode/public/js/scripts.min.js:1
5127 #: rhodecode/public/js/scripts.js:47991 rhodecode/public/js/scripts.min.js:1
5124 5128 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:16
5125 5129 #: rhodecode/public/js/src/rhodecode/users.js:92
5126 5130 msgid "Authentication Token"
5127 5131 msgstr ""
5128 5132
5129 #: rhodecode/public/js/scripts.js:48039 rhodecode/public/js/scripts.min.js:1
5133 #: rhodecode/public/js/scripts.js:48180 rhodecode/public/js/scripts.min.js:1
5130 5134 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:139
5131 5135 #: rhodecode/public/js/src/rhodecode.js:144
5132 5136 msgid "file"
5133 5137 msgstr ""
5134 5138
5135 #: rhodecode/public/js/scripts.js:48183 rhodecode/public/js/scripts.min.js:1
5139 #: rhodecode/public/js/scripts.js:48324 rhodecode/public/js/scripts.min.js:1
5136 5140 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
5137 5141 #: rhodecode/public/js/src/rhodecode.js:288
5138 5142 msgid "Loading..."
5139 5143 msgstr ""
5140 5144
5141 #: rhodecode/public/js/scripts.js:48565 rhodecode/public/js/scripts.min.js:1
5145 #: rhodecode/public/js/scripts.js:48706 rhodecode/public/js/scripts.min.js:1
5142 5146 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:136
5143 5147 #: rhodecode/public/js/src/rhodecode.js:670
5144 5148 msgid "date not in future"
5145 5149 msgstr ""
5146 5150
5147 #: rhodecode/public/js/scripts.js:48573 rhodecode/public/js/scripts.min.js:1
5151 #: rhodecode/public/js/scripts.js:48714 rhodecode/public/js/scripts.min.js:1
5148 5152 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:100
5149 5153 #: rhodecode/public/js/src/rhodecode.js:678
5150 5154 msgid "Specified expiration date"
@@ -5737,8 +5741,8 b' msgid "%s Repository group dashboard"'
5737 5741 msgstr ""
5738 5742
5739 5743 #: rhodecode/templates/index_repo_group.mako:13
5740 #: rhodecode/templates/base/base.mako:810
5741 5744 #: rhodecode/templates/base/base.mako:811
5745 #: rhodecode/templates/base/base.mako:812
5742 5746 msgid "Home"
5743 5747 msgstr ""
5744 5748
@@ -5933,9 +5937,9 b' msgstr ""'
5933 5937 #: rhodecode/templates/admin/admin_log_base.mako:10
5934 5938 #: rhodecode/templates/admin/defaults/defaults.mako:32
5935 5939 #: rhodecode/templates/admin/permissions/permissions_objects.mako:16
5936 #: rhodecode/templates/base/base.mako:658
5937 #: rhodecode/templates/base/base.mako:660
5938 #: rhodecode/templates/base/base.mako:662
5940 #: rhodecode/templates/base/base.mako:659
5941 #: rhodecode/templates/base/base.mako:661
5942 #: rhodecode/templates/base/base.mako:663
5939 5943 #: rhodecode/templates/search/search_commit.mako:8
5940 5944 #: rhodecode/templates/search/search_path.mako:7
5941 5945 msgid "Repository"
@@ -6261,7 +6265,7 b' msgid "Expires"'
6261 6265 msgstr ""
6262 6266
6263 6267 #: rhodecode/templates/admin/gists/gist_new.mako:5
6264 #: rhodecode/templates/base/base.mako:577
6268 #: rhodecode/templates/base/base.mako:578
6265 6269 msgid "New Gist"
6266 6270 msgstr ""
6267 6271
@@ -6353,7 +6357,7 b' msgstr ""'
6353 6357 #: rhodecode/templates/admin/integrations/new.mako:15
6354 6358 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:33
6355 6359 #: rhodecode/templates/admin/repos/repo_edit.mako:74
6356 #: rhodecode/templates/base/base.mako:120
6360 #: rhodecode/templates/base/base.mako:121
6357 6361 msgid "Integrations"
6358 6362 msgstr ""
6359 6363
@@ -6368,7 +6372,7 b' msgstr ""'
6368 6372 #: rhodecode/templates/admin/settings/settings.mako:14
6369 6373 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:34
6370 6374 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:9
6371 #: rhodecode/templates/base/base.mako:122
6375 #: rhodecode/templates/base/base.mako:123
6372 6376 msgid "Settings"
6373 6377 msgstr ""
6374 6378
@@ -6469,7 +6473,7 b' msgid "No description available"'
6469 6473 msgstr ""
6470 6474
6471 6475 #: rhodecode/templates/admin/my_account/my_account.mako:5
6472 #: rhodecode/templates/base/base.mako:622
6476 #: rhodecode/templates/base/base.mako:623
6473 6477 msgid "My account"
6474 6478 msgstr ""
6475 6479
@@ -6520,15 +6524,15 b' msgstr ""'
6520 6524
6521 6525 #: rhodecode/templates/admin/my_account/my_account.mako:45
6522 6526 #: rhodecode/templates/admin/notifications/notifications_show_all.mako:42
6523 #: rhodecode/templates/base/base.mako:385
6524 #: rhodecode/templates/base/base.mako:626
6527 #: rhodecode/templates/base/base.mako:386
6528 #: rhodecode/templates/base/base.mako:627
6525 6529 msgid "Pull Requests"
6526 6530 msgstr ""
6527 6531
6528 6532 #: rhodecode/templates/admin/my_account/my_account.mako:46
6529 6533 #: rhodecode/templates/admin/permissions/permissions.mako:14
6530 6534 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:35
6531 #: rhodecode/templates/base/base.mako:118
6535 #: rhodecode/templates/base/base.mako:119
6532 6536 msgid "Permissions"
6533 6537 msgstr ""
6534 6538
@@ -7047,7 +7051,7 b' msgstr ""'
7047 7051 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14
7048 7052 #: rhodecode/templates/admin/users/user_edit_advanced.mako:13
7049 7053 #: rhodecode/templates/base/base.mako:115
7050 #: rhodecode/templates/base/base.mako:136
7054 #: rhodecode/templates/base/base.mako:137
7051 7055 msgid "Repository groups"
7052 7056 msgstr ""
7053 7057
@@ -7062,7 +7066,7 b' msgstr ""'
7062 7066 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:25
7063 7067 #: rhodecode/templates/admin/repos/repo_add_base.mako:43
7064 7068 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:33
7065 #: rhodecode/templates/base/base.mako:671
7069 #: rhodecode/templates/base/base.mako:672
7066 7070 #: rhodecode/templates/data_table/_dt_elements.mako:217
7067 7071 #: rhodecode/templates/forks/fork.mako:41
7068 7072 msgid "Repository group"
@@ -7312,7 +7316,7 b' msgid "Import Existing Repository ?"'
7312 7316 msgstr ""
7313 7317
7314 7318 #: rhodecode/templates/admin/repos/repo_add_base.mako:23
7315 #: rhodecode/templates/base/base.mako:332
7319 #: rhodecode/templates/base/base.mako:333
7316 7320 msgid "Clone from"
7317 7321 msgstr ""
7318 7322
@@ -8024,7 +8028,7 b' msgstr ""'
8024 8028 #: rhodecode/templates/admin/settings/settings_global.mako:140
8025 8029 #: rhodecode/templates/admin/settings/settings_labs.mako:48
8026 8030 #: rhodecode/templates/admin/settings/settings_vcs.mako:13
8027 #: rhodecode/templates/admin/settings/settings_visual.mako:214
8031 #: rhodecode/templates/admin/settings/settings_visual.mako:217
8028 8032 msgid "Save settings"
8029 8033 msgstr ""
8030 8034
@@ -8550,7 +8554,7 b' msgstr ""'
8550 8554 msgid "Clone URL templates"
8551 8555 msgstr ""
8552 8556
8553 #: rhodecode/templates/admin/settings/settings_visual.mako:181
8557 #: rhodecode/templates/admin/settings/settings_visual.mako:184
8554 8558 msgid ""
8555 8559 "Schema of clone url construction eg. '{scheme}://{user}@{netloc}/{repo}', available vars:\n"
8556 8560 " {scheme} 'http' or 'https' sent from running RhodeCode server,\n"
@@ -8562,11 +8566,11 b' msgid ""'
8562 8566 " {repoid} ID of repository, can be used to contruct clone-by-id"
8563 8567 msgstr ""
8564 8568
8565 #: rhodecode/templates/admin/settings/settings_visual.mako:196
8569 #: rhodecode/templates/admin/settings/settings_visual.mako:199
8566 8570 msgid "Custom Support Link"
8567 8571 msgstr ""
8568 8572
8569 #: rhodecode/templates/admin/settings/settings_visual.mako:204
8573 #: rhodecode/templates/admin/settings/settings_visual.mako:207
8570 8574 #, python-format
8571 8575 msgid ""
8572 8576 "Custom url for the support link located at the bottom.\n"
@@ -8582,7 +8586,7 b' msgstr ""'
8582 8586 #: rhodecode/templates/admin/user_groups/user_group_add.mako:13
8583 8587 #: rhodecode/templates/admin/users/user_edit_advanced.mako:14
8584 8588 #: rhodecode/templates/base/base.mako:117
8585 #: rhodecode/templates/base/base.mako:139
8589 #: rhodecode/templates/base/base.mako:140
8586 8590 msgid "User groups"
8587 8591 msgstr ""
8588 8592
@@ -9090,16 +9094,21 b' msgstr ""'
9090 9094 msgid "Delegated Admin Panel"
9091 9095 msgstr ""
9092 9096
9093 #: rhodecode/templates/base/base.mako:119
9097 #: rhodecode/templates/base/base.mako:118
9098 #: rhodecode/templates/base/base.mako:395
9099 msgid "Artifacts"
9100 msgstr ""
9101
9102 #: rhodecode/templates/base/base.mako:120
9094 9103 msgid "Authentication"
9095 9104 msgstr ""
9096 9105
9097 #: rhodecode/templates/base/base.mako:121
9106 #: rhodecode/templates/base/base.mako:122
9098 9107 msgid "Defaults"
9099 9108 msgstr ""
9100 9109
9101 #: rhodecode/templates/base/base.mako:161
9102 #: rhodecode/templates/base/base.mako:201
9110 #: rhodecode/templates/base/base.mako:162
9111 #: rhodecode/templates/base/base.mako:202
9103 9112 #: rhodecode/templates/changeset/changeset.mako:140
9104 9113 #: rhodecode/templates/files/files_source_header.mako:57
9105 9114 #: rhodecode/templates/files/files_tree_header.mako:44
@@ -9107,40 +9116,40 b' msgstr ""'
9107 9116 msgid "Show More"
9108 9117 msgstr ""
9109 9118
9110 #: rhodecode/templates/base/base.mako:304
9111 #: rhodecode/templates/base/base.mako:315
9119 #: rhodecode/templates/base/base.mako:305
9120 #: rhodecode/templates/base/base.mako:316
9112 9121 msgid "RSS Feed"
9113 9122 msgstr ""
9114 9123
9115 #: rhodecode/templates/base/base.mako:306
9124 #: rhodecode/templates/base/base.mako:307
9116 9125 msgid "Watch this Repository and actions on it in your personalized journal"
9117 9126 msgstr ""
9118 9127
9119 #: rhodecode/templates/base/base.mako:324
9128 #: rhodecode/templates/base/base.mako:325
9120 9129 msgid "Fork of"
9121 9130 msgstr ""
9122 9131
9123 #: rhodecode/templates/base/base.mako:341
9132 #: rhodecode/templates/base/base.mako:342
9124 9133 #, python-format
9125 9134 msgid "Repository locked by %(user)s"
9126 9135 msgstr ""
9127 9136
9128 #: rhodecode/templates/base/base.mako:346
9137 #: rhodecode/templates/base/base.mako:347
9129 9138 msgid "Repository not locked. Pull repository to lock it."
9130 9139 msgstr ""
9131 9140
9132 #: rhodecode/templates/base/base.mako:362
9141 #: rhodecode/templates/base/base.mako:363
9133 9142 msgid "This repository has been archived. It is now read-only."
9134 9143 msgstr ""
9135 9144
9136 #: rhodecode/templates/base/base.mako:375
9145 #: rhodecode/templates/base/base.mako:376
9137 9146 #: rhodecode/templates/data_table/_dt_elements.mako:58
9138 9147 #: rhodecode/templates/data_table/_dt_elements.mako:59
9139 9148 #: rhodecode/templates/data_table/_dt_elements.mako:207
9140 9149 msgid "Summary"
9141 9150 msgstr ""
9142 9151
9143 #: rhodecode/templates/base/base.mako:376
9152 #: rhodecode/templates/base/base.mako:377
9144 9153 #: rhodecode/templates/data_table/_dt_elements.mako:63
9145 9154 #: rhodecode/templates/data_table/_dt_elements.mako:64
9146 9155 #: rhodecode/templates/files/file_authors_box.mako:30
@@ -9150,7 +9159,7 b' msgstr ""'
9150 9159 msgid "Commits"
9151 9160 msgstr ""
9152 9161
9153 #: rhodecode/templates/base/base.mako:377
9162 #: rhodecode/templates/base/base.mako:378
9154 9163 #: rhodecode/templates/data_table/_dt_elements.mako:68
9155 9164 #: rhodecode/templates/data_table/_dt_elements.mako:69
9156 9165 #: rhodecode/templates/files/files.mako:15
@@ -9158,87 +9167,83 b' msgstr ""'
9158 9167 msgid "Files"
9159 9168 msgstr ""
9160 9169
9161 #: rhodecode/templates/base/base.mako:378
9170 #: rhodecode/templates/base/base.mako:379
9162 9171 #: rhodecode/templates/bookmarks/bookmarks.mako:78
9163 9172 #: rhodecode/templates/branches/branches.mako:77
9164 9173 #: rhodecode/templates/tags/tags.mako:78
9165 9174 msgid "Compare"
9166 9175 msgstr ""
9167 9176
9168 #: rhodecode/templates/base/base.mako:383
9177 #: rhodecode/templates/base/base.mako:384
9169 9178 #, python-format
9170 9179 msgid "Show Pull Requests for %s"
9171 9180 msgstr ""
9172 9181
9173 #: rhodecode/templates/base/base.mako:394
9174 msgid "Artifacts"
9175 msgstr ""
9176
9177 #: rhodecode/templates/base/base.mako:400
9182 #: rhodecode/templates/base/base.mako:401
9178 9183 msgid "Repository Settings"
9179 9184 msgstr ""
9180 9185
9181 #: rhodecode/templates/base/base.mako:406
9186 #: rhodecode/templates/base/base.mako:407
9182 9187 msgid "Options"
9183 9188 msgstr ""
9184 9189
9185 #: rhodecode/templates/base/base.mako:411
9190 #: rhodecode/templates/base/base.mako:412
9186 9191 msgid "Unlock Repository"
9187 9192 msgstr ""
9188 9193
9189 #: rhodecode/templates/base/base.mako:413
9194 #: rhodecode/templates/base/base.mako:414
9190 9195 msgid "Lock Repository"
9191 9196 msgstr ""
9192 9197
9193 #: rhodecode/templates/base/base.mako:466
9198 #: rhodecode/templates/base/base.mako:467
9194 9199 msgid "Group Home"
9195 9200 msgstr ""
9196 9201
9197 #: rhodecode/templates/base/base.mako:470
9202 #: rhodecode/templates/base/base.mako:471
9198 9203 msgid "You have admin right to this group, and can edit it"
9199 9204 msgstr ""
9200 9205
9201 #: rhodecode/templates/base/base.mako:470
9206 #: rhodecode/templates/base/base.mako:471
9202 9207 msgid "Group Settings"
9203 9208 msgstr ""
9204 9209
9205 #: rhodecode/templates/base/base.mako:521
9210 #: rhodecode/templates/base/base.mako:522
9206 9211 msgid "This Repository"
9207 9212 msgstr ""
9208 9213
9209 #: rhodecode/templates/base/base.mako:523
9214 #: rhodecode/templates/base/base.mako:524
9210 9215 msgid "Create Pull Request"
9211 9216 msgstr ""
9212 9217
9213 #: rhodecode/templates/base/base.mako:527
9218 #: rhodecode/templates/base/base.mako:528
9214 9219 msgid "Fork this repository"
9215 9220 msgstr ""
9216 9221
9217 #: rhodecode/templates/base/base.mako:534
9222 #: rhodecode/templates/base/base.mako:535
9218 9223 msgid "This Repository Group"
9219 9224 msgstr ""
9220 9225
9221 #: rhodecode/templates/base/base.mako:538
9222 #: rhodecode/templates/base/base.mako:554
9223 #: rhodecode/templates/base/base.mako:566
9226 #: rhodecode/templates/base/base.mako:539
9227 #: rhodecode/templates/base/base.mako:555
9228 #: rhodecode/templates/base/base.mako:567
9224 9229 msgid "New Repository"
9225 9230 msgstr ""
9226 9231
9227 #: rhodecode/templates/base/base.mako:544
9228 #: rhodecode/templates/base/base.mako:558
9229 #: rhodecode/templates/base/base.mako:572
9232 #: rhodecode/templates/base/base.mako:545
9233 #: rhodecode/templates/base/base.mako:559
9234 #: rhodecode/templates/base/base.mako:573
9230 9235 msgid "New Repository Group"
9231 9236 msgstr ""
9232 9237
9233 #: rhodecode/templates/base/base.mako:599
9238 #: rhodecode/templates/base/base.mako:600
9234 9239 msgid "Sign in"
9235 9240 msgstr ""
9236 9241
9237 #: rhodecode/templates/base/base.mako:624
9242 #: rhodecode/templates/base/base.mako:625
9238 9243 msgid "My personal group"
9239 9244 msgstr ""
9240 9245
9241 #: rhodecode/templates/base/base.mako:630
9246 #: rhodecode/templates/base/base.mako:631
9242 9247 #: rhodecode/templates/debug_style/alerts.html:5
9243 9248 #: rhodecode/templates/debug_style/buttons.html:5
9244 9249 #: rhodecode/templates/debug_style/code-block.html:6
@@ -9261,62 +9266,62 b' msgstr ""'
9261 9266 msgid "Style"
9262 9267 msgstr ""
9263 9268
9264 #: rhodecode/templates/base/base.mako:631
9269 #: rhodecode/templates/base/base.mako:632
9265 9270 msgid "[Style]"
9266 9271 msgstr ""
9267 9272
9268 #: rhodecode/templates/base/base.mako:648
9273 #: rhodecode/templates/base/base.mako:649
9269 9274 msgid "No Bookmarks yet."
9270 9275 msgstr ""
9271 9276
9272 #: rhodecode/templates/base/base.mako:686
9277 #: rhodecode/templates/base/base.mako:687
9273 9278 msgid "Sign Out"
9274 9279 msgstr ""
9275 9280
9276 #: rhodecode/templates/base/base.mako:731
9281 #: rhodecode/templates/base/base.mako:732
9277 9282 #: rhodecode/templates/changeset/changeset_file_comment.mako:538
9278 9283 msgid "dismiss"
9279 9284 msgstr ""
9280 9285
9281 #: rhodecode/templates/base/base.mako:772
9286 #: rhodecode/templates/base/base.mako:773
9282 9287 msgid "search / go to..."
9283 9288 msgstr ""
9284 9289
9285 #: rhodecode/templates/base/base.mako:817
9286 msgid "Show activity journal"
9287 msgstr ""
9288
9289 9290 #: rhodecode/templates/base/base.mako:818
9291 msgid "Show activity journal"
9292 msgstr ""
9293
9294 #: rhodecode/templates/base/base.mako:819
9290 9295 #: rhodecode/templates/journal/journal.mako:4
9291 9296 #: rhodecode/templates/journal/journal.mako:14
9292 9297 msgid "Journal"
9293 9298 msgstr ""
9294 9299
9295 #: rhodecode/templates/base/base.mako:823
9296 msgid "Show Public activity journal"
9297 msgstr ""
9298
9299 9300 #: rhodecode/templates/base/base.mako:824
9301 msgid "Show Public activity journal"
9302 msgstr ""
9303
9304 #: rhodecode/templates/base/base.mako:825
9300 9305 msgid "Public journal"
9301 9306 msgstr ""
9302 9307
9303 #: rhodecode/templates/base/base.mako:830
9304 msgid "Show Gists"
9305 msgstr ""
9306
9307 9308 #: rhodecode/templates/base/base.mako:831
9309 msgid "Show Gists"
9310 msgstr ""
9311
9312 #: rhodecode/templates/base/base.mako:832
9308 9313 msgid "Gists"
9309 9314 msgstr ""
9310 9315
9311 #: rhodecode/templates/base/base.mako:837
9316 #: rhodecode/templates/base/base.mako:838
9312 9317 msgid "Admin settings"
9313 9318 msgstr ""
9314 9319
9315 #: rhodecode/templates/base/base.mako:1154
9320 #: rhodecode/templates/base/base.mako:1155
9316 9321 msgid "Keyboard shortcuts"
9317 9322 msgstr ""
9318 9323
9319 #: rhodecode/templates/base/base.mako:1162
9324 #: rhodecode/templates/base/base.mako:1163
9320 9325 msgid "Site-wide shortcuts"
9321 9326 msgstr ""
9322 9327
@@ -9357,7 +9362,7 b' msgid "Repository Forking"'
9357 9362 msgstr ""
9358 9363
9359 9364 #: rhodecode/templates/base/default_perms_box.mako:65
9360 msgid "Permission to create root level repository forks. When disabled, users can still fork repositories inside their own repository groups."
9365 msgid "Permission to create repository forks. Root level forks will only work if repository creation is enabled."
9361 9366 msgstr ""
9362 9367
9363 9368 #: rhodecode/templates/base/default_perms_box.mako:70
@@ -9418,7 +9423,7 b' msgstr ""'
9418 9423 #: rhodecode/templates/base/issue_tracker_settings.mako:300
9419 9424 #: rhodecode/templates/changeset/changeset_file_comment.mako:395
9420 9425 #: rhodecode/templates/changeset/changeset_file_comment.mako:446
9421 #: rhodecode/templates/data_table/_dt_elements.mako:456
9426 #: rhodecode/templates/data_table/_dt_elements.mako:463
9422 9427 #: rhodecode/templates/files/files_add.mako:59
9423 9428 #: rhodecode/templates/files/files_edit.mako:61
9424 9429 msgid "Preview"
@@ -10481,11 +10486,11 b' msgstr ""'
10481 10486 msgid "Work in progress"
10482 10487 msgstr ""
10483 10488
10484 #: rhodecode/templates/data_table/_dt_elements.mako:432
10489 #: rhodecode/templates/data_table/_dt_elements.mako:438
10485 10490 msgid "Info"
10486 10491 msgstr ""
10487 10492
10488 #: rhodecode/templates/data_table/_dt_elements.mako:473
10493 #: rhodecode/templates/data_table/_dt_elements.mako:480
10489 10494 #, python-format
10490 10495 msgid "Parsed using %s syntax"
10491 10496 msgstr ""
@@ -10645,7 +10650,7 b' msgid "{mention_prefix}{user} left a {co'
10645 10650 msgstr ""
10646 10651
10647 10652 #: rhodecode/templates/email_templates/commit_comment.mako:54
10648 #: rhodecode/templates/email_templates/pull_request_comment.mako:63
10653 #: rhodecode/templates/email_templates/pull_request_comment.mako:62
10649 10654 msgid "Comment link"
10650 10655 msgstr ""
10651 10656
@@ -10662,26 +10667,26 b' msgid "Commit message"'
10662 10667 msgstr ""
10663 10668
10664 10669 #: rhodecode/templates/email_templates/commit_comment.mako:65
10665 #: rhodecode/templates/email_templates/pull_request_comment.mako:77
10670 #: rhodecode/templates/email_templates/pull_request_comment.mako:76
10666 10671 msgid "File: {comment_file} on line {comment_line}"
10667 10672 msgstr ""
10668 10673
10669 10674 #: rhodecode/templates/email_templates/commit_comment.mako:69
10670 10675 #: rhodecode/templates/email_templates/commit_comment.mako:161
10671 #: rhodecode/templates/email_templates/pull_request_comment.mako:81
10672 #: rhodecode/templates/email_templates/pull_request_comment.mako:191
10676 #: rhodecode/templates/email_templates/pull_request_comment.mako:80
10677 #: rhodecode/templates/email_templates/pull_request_comment.mako:190
10673 10678 msgid "`TODO` number"
10674 10679 msgstr ""
10675 10680
10676 10681 #: rhodecode/templates/email_templates/commit_comment.mako:71
10677 10682 #: rhodecode/templates/email_templates/commit_comment.mako:163
10678 #: rhodecode/templates/email_templates/pull_request_comment.mako:83
10679 #: rhodecode/templates/email_templates/pull_request_comment.mako:193
10683 #: rhodecode/templates/email_templates/pull_request_comment.mako:82
10684 #: rhodecode/templates/email_templates/pull_request_comment.mako:192
10680 10685 msgid "`Note` number"
10681 10686 msgstr ""
10682 10687
10683 10688 #: rhodecode/templates/email_templates/commit_comment.mako:104
10684 #: rhodecode/templates/email_templates/pull_request_comment.mako:124
10689 #: rhodecode/templates/email_templates/pull_request_comment.mako:123
10685 10690 msgid "left a"
10686 10691 msgstr ""
10687 10692
@@ -10702,18 +10707,18 b' msgid "Commit Status"'
10702 10707 msgstr ""
10703 10708
10704 10709 #: rhodecode/templates/email_templates/commit_comment.mako:153
10705 #: rhodecode/templates/email_templates/pull_request_comment.mako:183
10710 #: rhodecode/templates/email_templates/pull_request_comment.mako:182
10706 10711 #: rhodecode/templates/search/search_path.mako:9
10707 10712 msgid "File"
10708 10713 msgstr ""
10709 10714
10710 10715 #: rhodecode/templates/email_templates/commit_comment.mako:154
10711 #: rhodecode/templates/email_templates/pull_request_comment.mako:184
10716 #: rhodecode/templates/email_templates/pull_request_comment.mako:183
10712 10717 msgid "`{comment_file}` on line {comment_line}"
10713 10718 msgstr ""
10714 10719
10715 10720 #: rhodecode/templates/email_templates/commit_comment.mako:173
10716 #: rhodecode/templates/email_templates/pull_request_comment.mako:203
10721 #: rhodecode/templates/email_templates/pull_request_comment.mako:202
10717 10722 msgid "Reply"
10718 10723 msgstr ""
10719 10724
@@ -10729,35 +10734,35 b' msgstr ""'
10729 10734 msgid "{mention_prefix}{user} left a {comment_type} on pull request !{pr_id}: \"{pr_title}\""
10730 10735 msgstr ""
10731 10736
10732 #: rhodecode/templates/email_templates/pull_request_comment.mako:65
10737 #: rhodecode/templates/email_templates/pull_request_comment.mako:64
10733 10738 #: rhodecode/templates/hovercards/hovercard_pull_request.mako:24
10734 10739 msgid "Pull Request"
10735 10740 msgstr ""
10736 10741
10737 #: rhodecode/templates/email_templates/pull_request_comment.mako:67
10742 #: rhodecode/templates/email_templates/pull_request_comment.mako:66
10738 10743 #: rhodecode/templates/email_templates/pull_request_review.mako:45
10739 10744 #: rhodecode/templates/email_templates/pull_request_update.mako:41
10740 10745 msgid "Commit flow: {source_ref_type}:{source_ref_name} of {source_repo_url} into {target_ref_type}:{target_ref_name} of {target_repo_url}"
10741 10746 msgstr ""
10742 10747
10743 #: rhodecode/templates/email_templates/pull_request_comment.mako:70
10748 #: rhodecode/templates/email_templates/pull_request_comment.mako:69
10744 10749 msgid "{user} submitted pull request !{pr_id} status: *{status}*"
10745 10750 msgstr ""
10746 10751
10747 #: rhodecode/templates/email_templates/pull_request_comment.mako:73
10752 #: rhodecode/templates/email_templates/pull_request_comment.mako:72
10748 10753 msgid "{user} submitted pull request !{pr_id} status: *{status} and closed*"
10749 10754 msgstr ""
10750 10755
10751 #: rhodecode/templates/email_templates/pull_request_comment.mako:127
10756 #: rhodecode/templates/email_templates/pull_request_comment.mako:126
10752 10757 msgid "{comment_type} on file `{comment_file}` in pull request."
10753 10758 msgstr ""
10754 10759
10755 #: rhodecode/templates/email_templates/pull_request_comment.mako:129
10760 #: rhodecode/templates/email_templates/pull_request_comment.mako:128
10756 10761 msgid "{comment_type} on pull request."
10757 10762 msgstr ""
10758 10763
10759 #: rhodecode/templates/email_templates/pull_request_comment.mako:134
10760 #: rhodecode/templates/email_templates/pull_request_comment.mako:164
10764 #: rhodecode/templates/email_templates/pull_request_comment.mako:133
10765 #: rhodecode/templates/email_templates/pull_request_comment.mako:163
10761 10766 #: rhodecode/templates/email_templates/pull_request_review.mako:100
10762 10767 #: rhodecode/templates/email_templates/pull_request_review.mako:116
10763 10768 #: rhodecode/templates/email_templates/pull_request_update.mako:104
@@ -10765,26 +10770,26 b' msgstr ""'
10765 10770 msgid "Pull request"
10766 10771 msgstr ""
10767 10772
10768 #: rhodecode/templates/email_templates/pull_request_comment.mako:153
10773 #: rhodecode/templates/email_templates/pull_request_comment.mako:152
10769 10774 msgid "Review Status"
10770 10775 msgstr ""
10771 10776
10772 #: rhodecode/templates/email_templates/pull_request_comment.mako:156
10777 #: rhodecode/templates/email_templates/pull_request_comment.mako:155
10773 10778 msgid "Closed pull request with status"
10774 10779 msgstr ""
10775 10780
10776 #: rhodecode/templates/email_templates/pull_request_comment.mako:158
10781 #: rhodecode/templates/email_templates/pull_request_comment.mako:157
10777 10782 msgid "Submitted review status"
10778 10783 msgstr ""
10779 10784
10780 #: rhodecode/templates/email_templates/pull_request_comment.mako:173
10785 #: rhodecode/templates/email_templates/pull_request_comment.mako:172
10781 10786 #: rhodecode/templates/email_templates/pull_request_review.mako:125
10782 10787 #: rhodecode/templates/email_templates/pull_request_update.mako:130
10783 10788 msgid "Commit Flow"
10784 10789 msgstr ""
10785 10790
10786 #: rhodecode/templates/email_templates/pull_request_comment.mako:175
10787 #: rhodecode/templates/email_templates/pull_request_comment.mako:177
10791 #: rhodecode/templates/email_templates/pull_request_comment.mako:174
10792 #: rhodecode/templates/email_templates/pull_request_comment.mako:176
10788 10793 #: rhodecode/templates/email_templates/pull_request_review.mako:127
10789 10794 #: rhodecode/templates/email_templates/pull_request_review.mako:129
10790 10795 #: rhodecode/templates/email_templates/pull_request_update.mako:132
@@ -11447,12 +11452,12 b' msgstr ""'
11447 11452 msgid "In pull request description"
11448 11453 msgstr ""
11449 11454
11450 #: rhodecode/templates/pullrequests/pullrequest_show.mako:838
11451 #: rhodecode/templates/pullrequests/pullrequest_show.mako:857
11455 #: rhodecode/templates/pullrequests/pullrequest_show.mako:840
11456 #: rhodecode/templates/pullrequests/pullrequest_show.mako:860
11452 11457 msgid "No Ticket data found."
11453 11458 msgstr ""
11454 11459
11455 #: rhodecode/templates/pullrequests/pullrequest_show.mako:843
11460 #: rhodecode/templates/pullrequests/pullrequest_show.mako:845
11456 11461 msgid "In commit messages"
11457 11462 msgstr ""
11458 11463
@@ -131,7 +131,7 b' class IntegrationTypeBase(object):'
131 131 :param event:
132 132 :return: bool
133 133 """
134 allowed_events = self.settings['events']
134 allowed_events = self.settings.get('events') or []
135 135 if event.name not in allowed_events:
136 136 log.debug('event ignored: %r event %s not in allowed set of events %s',
137 137 event, event.name, allowed_events)
@@ -38,6 +38,7 b' from rhodecode.lib import hooks_base'
38 38 from rhodecode.lib.utils2 import safe_int, str2bool, aslist
39 39 from rhodecode.model.db import (
40 40 Session, IntegrityError, true, Repository, RepoGroup, User)
41 from rhodecode.model.permission import PermissionModel
41 42
42 43
43 44 @async_task(ignore_result=True, base=RequestContextTask)
@@ -216,6 +217,9 b' def create_repo(form_data, cur_user):'
216 217 repo=audit_logger.RepoWrap(repo_name=repo_name, repo_id=repo_id))
217 218
218 219 Session().commit()
220
221 PermissionModel().trigger_permission_flush()
222
219 223 except Exception as e:
220 224 log.warning('Exception occurred when creating repository, '
221 225 'doing cleanup...', exc_info=True)
@@ -35,7 +35,7 b' import urllib'
35 35 import urlobject
36 36 import uuid
37 37 import getpass
38 from functools import update_wrapper, partial
38 from functools import update_wrapper, partial, wraps
39 39
40 40 import pygments.lexers
41 41 import sqlalchemy
@@ -1038,16 +1038,17 b' class CachedProperty(object):'
1038 1038 """
1039 1039 Lazy Attributes. With option to invalidate the cache by running a method
1040 1040
1041 class Foo():
1041 >>> class Foo(object):
1042 ...
1043 ... @CachedProperty
1044 ... def heavy_func(self):
1045 ... return 'super-calculation'
1046 ...
1047 ... foo = Foo()
1048 ... foo.heavy_func() # first computation
1049 ... foo.heavy_func() # fetch from cache
1050 ... foo._invalidate_prop_cache('heavy_func')
1042 1051
1043 @CachedProperty
1044 def heavy_func():
1045 return 'super-calculation'
1046
1047 foo = Foo()
1048 foo.heavy_func() # first computions
1049 foo.heavy_func() # fetch from cache
1050 foo._invalidate_prop_cache('heavy_func')
1051 1052 # at this point calling foo.heavy_func() will be re-computed
1052 1053 """
1053 1054
@@ -1072,3 +1073,76 b' class CachedProperty(object):'
1072 1073
1073 1074 def _invalidate_prop_cache(self, inst, name):
1074 1075 inst.__dict__.pop(name, None)
1076
1077
1078 def retry(func=None, exception=Exception, n_tries=5, delay=5, backoff=1, logger=True):
1079 """
1080 Retry decorator with exponential backoff.
1081
1082 Parameters
1083 ----------
1084 func : typing.Callable, optional
1085 Callable on which the decorator is applied, by default None
1086 exception : Exception or tuple of Exceptions, optional
1087 Exception(s) that invoke retry, by default Exception
1088 n_tries : int, optional
1089 Number of tries before giving up, by default 5
1090 delay : int, optional
1091 Initial delay between retries in seconds, by default 5
1092 backoff : int, optional
1093 Backoff multiplier e.g. value of 2 will double the delay, by default 1
1094 logger : bool, optional
1095 Option to log or print, by default False
1096
1097 Returns
1098 -------
1099 typing.Callable
1100 Decorated callable that calls itself when exception(s) occur.
1101
1102 Examples
1103 --------
1104 >>> import random
1105 >>> @retry(exception=Exception, n_tries=3)
1106 ... def test_random(text):
1107 ... x = random.random()
1108 ... if x < 0.5:
1109 ... raise Exception("Fail")
1110 ... else:
1111 ... print("Success: ", text)
1112 >>> test_random("It works!")
1113 """
1114
1115 if func is None:
1116 return partial(
1117 retry,
1118 exception=exception,
1119 n_tries=n_tries,
1120 delay=delay,
1121 backoff=backoff,
1122 logger=logger,
1123 )
1124
1125 @wraps(func)
1126 def wrapper(*args, **kwargs):
1127 _n_tries, n_delay = n_tries, delay
1128 log = logging.getLogger('rhodecode.retry')
1129
1130 while _n_tries > 1:
1131 try:
1132 return func(*args, **kwargs)
1133 except exception as e:
1134 e_details = repr(e)
1135 msg = "Exception on calling func {func}: {e}, " \
1136 "Retrying in {n_delay} seconds..."\
1137 .format(func=func, e=e_details, n_delay=n_delay)
1138 if logger:
1139 log.warning(msg)
1140 else:
1141 print(msg)
1142 time.sleep(n_delay)
1143 _n_tries -= 1
1144 n_delay *= backoff
1145
1146 return func(*args, **kwargs)
1147
1148 return wrapper
@@ -311,6 +311,7 b' class BaseRepository(object):'
311 311 DEFAULT_CONTACT = u"Unknown"
312 312 DEFAULT_DESCRIPTION = u"unknown"
313 313 EMPTY_COMMIT_ID = '0' * 40
314 COMMIT_ID_PAT = re.compile(r'[0-9a-fA-F]{40}')
314 315
315 316 path = None
316 317
@@ -618,7 +618,7 b' class GitRepository(BaseRepository):'
618 618 else:
619 619 output, __ = self.run_git_command(
620 620 ['merge-base', commit_id1, commit_id2])
621 ancestor_id = re.findall(r'[0-9a-fA-F]{40}', output)[0]
621 ancestor_id = self.COMMIT_ID_PAT.findall(output)[0]
622 622
623 623 log.debug('Found common ancestor with sha: %s', ancestor_id)
624 624
@@ -642,7 +642,7 b' class GitRepository(BaseRepository):'
642 642 '%s..%s' % (commit_id1, commit_id2)])
643 643 commits = [
644 644 repo1.get_commit(commit_id=commit_id, pre_load=pre_load)
645 for commit_id in re.findall(r'[0-9a-fA-F]{40}', output)]
645 for commit_id in self.COMMIT_ID_PAT.findall(output)]
646 646
647 647 return commits
648 648
@@ -354,7 +354,7 b' class ChangesetStatusModel(BaseModel):'
354 354 Session().add(new_status)
355 355 return new_statuses
356 356
357 def aggregate_votes_by_user(self, commit_statuses, reviewers_data):
357 def aggregate_votes_by_user(self, commit_statuses, reviewers_data, user=None):
358 358
359 359 commit_statuses_map = collections.defaultdict(list)
360 360 for st in commit_statuses:
@@ -368,6 +368,10 b' class ChangesetStatusModel(BaseModel):'
368 368 for obj in reviewers_data:
369 369 if not obj.user:
370 370 continue
371 if user and obj.user.username != user.username:
372 # single user filter
373 continue
374
371 375 statuses = commit_statuses_map.get(obj.user.username, None)
372 376 if statuses:
373 377 status_groups = itertools.groupby(
@@ -376,16 +380,19 b' class ChangesetStatusModel(BaseModel):'
376 380
377 381 reviewers.append((obj, obj.user, obj.reasons, obj.mandatory, statuses))
378 382
379 return reviewers
383 if user:
384 return reviewers[0] if reviewers else reviewers
385 else:
386 return reviewers
380 387
381 def reviewers_statuses(self, pull_request):
388 def reviewers_statuses(self, pull_request, user=None):
382 389 _commit_statuses = self.get_statuses(
383 390 pull_request.source_repo,
384 391 pull_request=pull_request,
385 392 with_revisions=True)
386 393 reviewers = pull_request.get_pull_request_reviewers(
387 394 role=PullRequestReviewers.ROLE_REVIEWER)
388 return self.aggregate_votes_by_user(_commit_statuses, reviewers)
395 return self.aggregate_votes_by_user(_commit_statuses, reviewers, user=user)
389 396
390 397 def calculated_review_status(self, pull_request):
391 398 """
@@ -41,10 +41,10 b' from sqlalchemy import ('
41 41 Index, Sequence, UniqueConstraint, ForeignKey, CheckConstraint, Column,
42 42 Boolean, String, Unicode, UnicodeText, DateTime, Integer, LargeBinary,
43 43 Text, Float, PickleType, BigInteger)
44 from sqlalchemy.sql.expression import true, false, case
44 from sqlalchemy.sql.expression import true, false, case, null
45 45 from sqlalchemy.sql.functions import coalesce, count # pragma: no cover
46 46 from sqlalchemy.orm import (
47 relationship, joinedload, class_mapper, validates, aliased)
47 relationship, lazyload, joinedload, class_mapper, validates, aliased)
48 48 from sqlalchemy.ext.declarative import declared_attr
49 49 from sqlalchemy.ext.hybrid import hybrid_property
50 50 from sqlalchemy.exc import IntegrityError # pragma: no cover
@@ -911,7 +911,7 b' class User(Base, BaseModel):'
911 911 return {}
912 912
913 913 try:
914 return json.loads(self._user_data)
914 return json.loads(self._user_data) or {}
915 915 except TypeError:
916 916 return {}
917 917
@@ -4062,7 +4062,7 b' class _SetState(object):'
4062 4062 return self
4063 4063
4064 4064 def __exit__(self, exc_type, exc_val, exc_tb):
4065 if exc_val is not None:
4065 if exc_val is not None or exc_type is not None:
4066 4066 log.error(traceback.format_exc(exc_tb))
4067 4067 return None
4068 4068
@@ -4479,9 +4479,9 b' class PullRequest(Base, _PullRequestBase'
4479 4479 from rhodecode.model.changeset_status import ChangesetStatusModel
4480 4480 return ChangesetStatusModel().calculated_review_status(self)
4481 4481
4482 def reviewers_statuses(self):
4482 def reviewers_statuses(self, user=None):
4483 4483 from rhodecode.model.changeset_status import ChangesetStatusModel
4484 return ChangesetStatusModel().reviewers_statuses(self)
4484 return ChangesetStatusModel().reviewers_statuses(self, user=user)
4485 4485
4486 4486 def get_pull_request_reviewers(self, role=None):
4487 4487 qry = PullRequestReviewers.query()\
@@ -56,7 +56,7 b' from rhodecode.model import BaseModel'
56 56 from rhodecode.model.changeset_status import ChangesetStatusModel
57 57 from rhodecode.model.comment import CommentsModel
58 58 from rhodecode.model.db import (
59 or_, String, cast, PullRequest, PullRequestReviewers, ChangesetStatus,
59 aliased, null, lazyload, and_, or_, func, String, cast, PullRequest, PullRequestReviewers, ChangesetStatus,
60 60 PullRequestVersion, ChangesetComment, Repository, RepoReviewRule, User)
61 61 from rhodecode.model.meta import Session
62 62 from rhodecode.model.notification import NotificationModel, \
@@ -319,7 +319,7 b' class PullRequestModel(BaseModel):'
319 319
320 320 if search_q:
321 321 like_expression = u'%{}%'.format(safe_unicode(search_q))
322 q = q.join(User)
322 q = q.join(User, User.user_id == PullRequest.user_id)
323 323 q = q.filter(or_(
324 324 cast(PullRequest.pull_request_id, String).ilike(like_expression),
325 325 User.username.ilike(like_expression),
@@ -405,36 +405,30 b' class PullRequestModel(BaseModel):'
405 405
406 406 return pull_requests
407 407
408 def count_awaiting_review(self, repo_name, search_q=None, source=False, statuses=None,
409 opened_by=None):
408 def count_awaiting_review(self, repo_name, search_q=None, statuses=None):
410 409 """
411 410 Count the number of pull requests for a specific repository that are
412 411 awaiting review.
413 412
414 413 :param repo_name: target or source repo
415 414 :param search_q: filter by text
416 :param source: boolean flag to specify if repo_name refers to source
417 415 :param statuses: list of pull request statuses
418 :param opened_by: author user of the pull request
419 416 :returns: int number of pull requests
420 417 """
421 418 pull_requests = self.get_awaiting_review(
422 repo_name, search_q=search_q, source=source, statuses=statuses, opened_by=opened_by)
419 repo_name, search_q=search_q, statuses=statuses)
423 420
424 421 return len(pull_requests)
425 422
426 def get_awaiting_review(self, repo_name, search_q=None, source=False, statuses=None,
427 opened_by=None, offset=0, length=None,
428 order_by=None, order_dir='desc'):
423 def get_awaiting_review(self, repo_name, search_q=None, statuses=None,
424 offset=0, length=None, order_by=None, order_dir='desc'):
429 425 """
430 426 Get all pull requests for a specific repository that are awaiting
431 427 review.
432 428
433 429 :param repo_name: target or source repo
434 430 :param search_q: filter by text
435 :param source: boolean flag to specify if repo_name refers to source
436 431 :param statuses: list of pull request statuses
437 :param opened_by: author user of the pull request
438 432 :param offset: pagination offset
439 433 :param length: length of returned list
440 434 :param order_by: order of the returned list
@@ -442,8 +436,8 b' class PullRequestModel(BaseModel):'
442 436 :returns: list of pull requests
443 437 """
444 438 pull_requests = self.get_all(
445 repo_name, search_q=search_q, source=source, statuses=statuses,
446 opened_by=opened_by, order_by=order_by, order_dir=order_dir)
439 repo_name, search_q=search_q, statuses=statuses,
440 order_by=order_by, order_dir=order_dir)
447 441
448 442 _filtered_pull_requests = []
449 443 for pr in pull_requests:
@@ -456,68 +450,117 b' class PullRequestModel(BaseModel):'
456 450 else:
457 451 return _filtered_pull_requests
458 452
459 def count_awaiting_my_review(self, repo_name, search_q=None, source=False, statuses=None,
460 opened_by=None, user_id=None):
453 def _prepare_awaiting_my_review_review_query(
454 self, repo_name, user_id, search_q=None, statuses=None,
455 order_by=None, order_dir='desc'):
456
457 for_review_statuses = [
458 ChangesetStatus.STATUS_UNDER_REVIEW, ChangesetStatus.STATUS_NOT_REVIEWED
459 ]
460
461 pull_request_alias = aliased(PullRequest)
462 status_alias = aliased(ChangesetStatus)
463 reviewers_alias = aliased(PullRequestReviewers)
464 repo_alias = aliased(Repository)
465
466 last_ver_subq = Session()\
467 .query(func.min(ChangesetStatus.version)) \
468 .filter(ChangesetStatus.pull_request_id == reviewers_alias.pull_request_id)\
469 .filter(ChangesetStatus.user_id == reviewers_alias.user_id) \
470 .subquery()
471
472 q = Session().query(pull_request_alias) \
473 .options(lazyload(pull_request_alias.author)) \
474 .join(reviewers_alias,
475 reviewers_alias.pull_request_id == pull_request_alias.pull_request_id) \
476 .join(repo_alias,
477 repo_alias.repo_id == pull_request_alias.target_repo_id) \
478 .outerjoin(status_alias,
479 and_(status_alias.user_id == reviewers_alias.user_id,
480 status_alias.pull_request_id == reviewers_alias.pull_request_id)) \
481 .filter(or_(status_alias.version == null(),
482 status_alias.version == last_ver_subq)) \
483 .filter(reviewers_alias.user_id == user_id) \
484 .filter(repo_alias.repo_name == repo_name) \
485 .filter(or_(status_alias.status == null(), status_alias.status.in_(for_review_statuses))) \
486 .group_by(pull_request_alias)
487
488 # closed,opened
489 if statuses:
490 q = q.filter(pull_request_alias.status.in_(statuses))
491
492 if search_q:
493 like_expression = u'%{}%'.format(safe_unicode(search_q))
494 q = q.join(User, User.user_id == pull_request_alias.user_id)
495 q = q.filter(or_(
496 cast(pull_request_alias.pull_request_id, String).ilike(like_expression),
497 User.username.ilike(like_expression),
498 pull_request_alias.title.ilike(like_expression),
499 pull_request_alias.description.ilike(like_expression),
500 ))
501
502 if order_by:
503 order_map = {
504 'name_raw': pull_request_alias.pull_request_id,
505 'title': pull_request_alias.title,
506 'updated_on_raw': pull_request_alias.updated_on,
507 'target_repo': pull_request_alias.target_repo_id
508 }
509 if order_dir == 'asc':
510 q = q.order_by(order_map[order_by].asc())
511 else:
512 q = q.order_by(order_map[order_by].desc())
513
514 return q
515
516 def count_awaiting_my_review(self, repo_name, user_id, search_q=None, statuses=None):
461 517 """
462 518 Count the number of pull requests for a specific repository that are
463 519 awaiting review from a specific user.
464 520
465 521 :param repo_name: target or source repo
522 :param user_id: reviewer user of the pull request
466 523 :param search_q: filter by text
467 :param source: boolean flag to specify if repo_name refers to source
468 524 :param statuses: list of pull request statuses
469 :param opened_by: author user of the pull request
470 :param user_id: reviewer user of the pull request
471 525 :returns: int number of pull requests
472 526 """
473 pull_requests = self.get_awaiting_my_review(
474 repo_name, search_q=search_q, source=source, statuses=statuses,
475 opened_by=opened_by, user_id=user_id)
527 q = self._prepare_awaiting_my_review_review_query(
528 repo_name, user_id, search_q=search_q, statuses=statuses)
529 return q.count()
476 530
477 return len(pull_requests)
478
479 def get_awaiting_my_review(self, repo_name, search_q=None, source=False, statuses=None,
480 opened_by=None, user_id=None, offset=0,
481 length=None, order_by=None, order_dir='desc'):
531 def get_awaiting_my_review(self, repo_name, user_id, search_q=None, statuses=None,
532 offset=0, length=None, order_by=None, order_dir='desc'):
482 533 """
483 534 Get all pull requests for a specific repository that are awaiting
484 535 review from a specific user.
485 536
486 537 :param repo_name: target or source repo
538 :param user_id: reviewer user of the pull request
487 539 :param search_q: filter by text
488 :param source: boolean flag to specify if repo_name refers to source
489 540 :param statuses: list of pull request statuses
490 :param opened_by: author user of the pull request
491 :param user_id: reviewer user of the pull request
492 541 :param offset: pagination offset
493 542 :param length: length of returned list
494 543 :param order_by: order of the returned list
495 544 :param order_dir: 'asc' or 'desc' ordering direction
496 545 :returns: list of pull requests
497 546 """
498 pull_requests = self.get_all(
499 repo_name, search_q=search_q, source=source, statuses=statuses,
500 opened_by=opened_by, order_by=order_by, order_dir=order_dir)
501 547
502 _my = PullRequestModel().get_not_reviewed(user_id)
503 my_participation = []
504 for pr in pull_requests:
505 if pr in _my:
506 my_participation.append(pr)
507 _filtered_pull_requests = my_participation
548 q = self._prepare_awaiting_my_review_review_query(
549 repo_name, user_id, search_q=search_q, statuses=statuses,
550 order_by=order_by, order_dir=order_dir)
551
508 552 if length:
509 return _filtered_pull_requests[offset:offset+length]
553 pull_requests = q.limit(length).offset(offset).all()
510 554 else:
511 return _filtered_pull_requests
555 pull_requests = q.all()
556
557 return pull_requests
512 558
513 def get_not_reviewed(self, user_id):
514 return [
515 x.pull_request for x in PullRequestReviewers.query().filter(
516 PullRequestReviewers.user_id == user_id).all()
517 ]
518
519 def _prepare_participating_query(self, user_id=None, statuses=None, query='',
520 order_by=None, order_dir='desc'):
559 def _prepare_im_participating_query(self, user_id=None, statuses=None, query='',
560 order_by=None, order_dir='desc'):
561 """
562 return a query of pull-requests user is an creator, or he's added as a reviewer
563 """
521 564 q = PullRequest.query()
522 565 if user_id:
523 566 reviewers_subquery = Session().query(
@@ -535,7 +578,7 b' class PullRequestModel(BaseModel):'
535 578
536 579 if query:
537 580 like_expression = u'%{}%'.format(safe_unicode(query))
538 q = q.join(User)
581 q = q.join(User, User.user_id == PullRequest.user_id)
539 582 q = q.filter(or_(
540 583 cast(PullRequest.pull_request_id, String).ilike(like_expression),
541 584 User.username.ilike(like_expression),
@@ -557,17 +600,97 b' class PullRequestModel(BaseModel):'
557 600 return q
558 601
559 602 def count_im_participating_in(self, user_id=None, statuses=None, query=''):
560 q = self._prepare_participating_query(user_id, statuses=statuses, query=query)
603 q = self._prepare_im_participating_query(user_id, statuses=statuses, query=query)
561 604 return q.count()
562 605
563 606 def get_im_participating_in(
564 607 self, user_id=None, statuses=None, query='', offset=0,
565 608 length=None, order_by=None, order_dir='desc'):
566 609 """
567 Get all Pull requests that i'm participating in, or i have opened
610 Get all Pull requests that i'm participating in as a reviewer, or i have opened
568 611 """
569 612
570 q = self._prepare_participating_query(
613 q = self._prepare_im_participating_query(
614 user_id, statuses=statuses, query=query, order_by=order_by,
615 order_dir=order_dir)
616
617 if length:
618 pull_requests = q.limit(length).offset(offset).all()
619 else:
620 pull_requests = q.all()
621
622 return pull_requests
623
624 def _prepare_participating_in_for_review_query(
625 self, user_id, statuses=None, query='', order_by=None, order_dir='desc'):
626
627 for_review_statuses = [
628 ChangesetStatus.STATUS_UNDER_REVIEW, ChangesetStatus.STATUS_NOT_REVIEWED
629 ]
630
631 pull_request_alias = aliased(PullRequest)
632 status_alias = aliased(ChangesetStatus)
633 reviewers_alias = aliased(PullRequestReviewers)
634
635 last_ver_subq = Session()\
636 .query(func.min(ChangesetStatus.version)) \
637 .filter(ChangesetStatus.pull_request_id == reviewers_alias.pull_request_id)\
638 .filter(ChangesetStatus.user_id == reviewers_alias.user_id) \
639 .subquery()
640
641 q = Session().query(pull_request_alias) \
642 .options(lazyload(pull_request_alias.author)) \
643 .join(reviewers_alias,
644 reviewers_alias.pull_request_id == pull_request_alias.pull_request_id) \
645 .outerjoin(status_alias,
646 and_(status_alias.user_id == reviewers_alias.user_id,
647 status_alias.pull_request_id == reviewers_alias.pull_request_id)) \
648 .filter(or_(status_alias.version == null(),
649 status_alias.version == last_ver_subq)) \
650 .filter(reviewers_alias.user_id == user_id) \
651 .filter(or_(status_alias.status == null(), status_alias.status.in_(for_review_statuses))) \
652 .group_by(pull_request_alias)
653
654 # closed,opened
655 if statuses:
656 q = q.filter(pull_request_alias.status.in_(statuses))
657
658 if query:
659 like_expression = u'%{}%'.format(safe_unicode(query))
660 q = q.join(User, User.user_id == pull_request_alias.user_id)
661 q = q.filter(or_(
662 cast(pull_request_alias.pull_request_id, String).ilike(like_expression),
663 User.username.ilike(like_expression),
664 pull_request_alias.title.ilike(like_expression),
665 pull_request_alias.description.ilike(like_expression),
666 ))
667
668 if order_by:
669 order_map = {
670 'name_raw': pull_request_alias.pull_request_id,
671 'title': pull_request_alias.title,
672 'updated_on_raw': pull_request_alias.updated_on,
673 'target_repo': pull_request_alias.target_repo_id
674 }
675 if order_dir == 'asc':
676 q = q.order_by(order_map[order_by].asc())
677 else:
678 q = q.order_by(order_map[order_by].desc())
679
680 return q
681
682 def count_im_participating_in_for_review(self, user_id, statuses=None, query=''):
683 q = self._prepare_participating_in_for_review_query(user_id, statuses=statuses, query=query)
684 return q.count()
685
686 def get_im_participating_in_for_review(
687 self, user_id, statuses=None, query='', offset=0,
688 length=None, order_by=None, order_dir='desc'):
689 """
690 Get all Pull requests that needs user approval or rejection
691 """
692
693 q = self._prepare_participating_in_for_review_query(
571 694 user_id, statuses=statuses, query=query, order_by=order_by,
572 695 order_dir=order_dir)
573 696
@@ -618,13 +618,13 b' input[type="reset"] {'
618 618 text-align: right;
619 619
620 620 li {
621
622
621 list-style: none;
622 text-align: right;
623 display: inline-block;
623 624 }
624 625
625 li.active {
626 background-color: @grey6;
627 .border ( @border-thickness, @grey4 );
626 a.active {
627 border: 2px solid @rcblue;
628 628 }
629 629
630 630 }
@@ -44,7 +44,7 b''
44 44 padding: @panel-padding;
45 45
46 46 &.panel-body-min-height {
47 min-height: 150px
47 min-height: 200px
48 48 }
49 49 }
50 50
@@ -791,6 +791,11 b' var CommentsController = function() {'
791 791 refreshDraftComments()
792 792 }
793 793
794 if (window.refreshAllComments !== undefined) {
795 // if we have this handler, run it, and refresh all comments boxes
796 refreshAllComments()
797 }
798
794 799 return false;
795 800 };
796 801
@@ -27,13 +27,13 b''
27 27
28 28 <ul class="button-links">
29 29 % if c.is_super_admin:
30 <li class="btn ${h.is_active('all', c.active)}"><a href="${h.route_path('gists_show', _query={'all': 1})}">${_('All gists')}</a></li>
30 <li><a class="btn ${h.is_active('all', c.active)}" href="${h.route_path('gists_show', _query={'all': 1})}">${_('All gists')}</a></li>
31 31 %endif
32 <li class="btn ${h.is_active('public', c.active)}"><a href="${h.route_path('gists_show')}">${_('All public')}</a></li>
32 <li><a class="btn ${h.is_active('public', c.active)}" href="${h.route_path('gists_show')}">${_('All public')}</a></li>
33 33 %if c.rhodecode_user.username != h.DEFAULT_USER:
34 <li class="btn ${h.is_active('my_all', c.active)}"><a href="${h.route_path('gists_show', _query={'public':1, 'private': 1})}">${_('My gists')}</a></li>
35 <li class="btn ${h.is_active('my_private', c.active)}"><a href="${h.route_path('gists_show', _query={'private': 1})}">${_('My private')}</a></li>
36 <li class="btn ${h.is_active('my_public', c.active)}"><a href="${h.route_path('gists_show', _query={'public': 1})}">${_('My public')}</a></li>
34 <li><a class="btn ${h.is_active('my_all', c.active)}" href="${h.route_path('gists_show', _query={'public':1, 'private': 1})}">${_('My gists')}</a></li>
35 <li><a class="btn ${h.is_active('my_private', c.active)}" href="${h.route_path('gists_show', _query={'private': 1})}">${_('My private')}</a></li>
36 <li><a class="btn ${h.is_active('my_public', c.active)}" href="${h.route_path('gists_show', _query={'public': 1})}">${_('My public')}</a></li>
37 37 %endif
38 38 </ul>
39 39
@@ -65,11 +65,11 b''
65 65 <fieldset>
66 66 <div class="gist-type-fields-wrapper">
67 67
68 <input type="radio" id="private_gist" checked="" name="gist_type" value="private">
68 <input type="radio" id="private_gist" checked="" name="gist_type" value="private" onchange="setGistId('private')">
69 69 <label for="private_gist">${_('Private Gist')}</label>
70 70 <span class="tooltip label" title="${_('Private Gists are not listed and only accessible through their secret url.')}">${_('Private Gist')}</span>
71 71
72 <input type="radio" id="public_gist" name="gist_type" value="public">
72 <input type="radio" id="public_gist" name="gist_type" value="public" onchange="setGistId('public')">
73 73 <label for="public_gist">${_('Public Gist')}</label>
74 74 <span class="tooltip label" title="${_('Public Gists are accessible to anyone and listed in Gists page.')}">${_('Public Gist')}</span>
75 75 </div>
@@ -99,5 +99,14 b''
99 99 setCodeMirrorModeFromInput(
100 100 modes_select, filename_selector, myCodeMirror, null);
101 101
102 setGistId = function(gistType) {
103 if (gistType === 'private') {
104 $('#gistid').removeAttr('disabled');
105 }
106 else {
107 $('#gistid').val('');
108 $('#gistid').attr('disabled', 'disabled')
109 }
110 }
102 111 </script>
103 112 </%def>
@@ -26,50 +26,41 b''
26 26 </div>
27 27 </div>
28 28 </div>
29 <p class="help-block help-block-inline" >
30 ${_('Server URL is available as ${server_url} variable. E.g. Redirect url: ${server_url}/_admin/exception_tracker')}
31 </p>
32 29
33 <div class="label">
30 <div class="label" style="margin-top:10px">
34 31 <label for="redirect_url">${_('Redirect URL')}:</label>
35 32 </div>
36 33 <div class="input">
37 34 <input type="text" name="redirect_url" value="${redirect_url}" style="width: 600px"/>
38 35 </div>
39
36 <p class="help-block help-block-inline">
37 ${_('Server URL is available as ${server_url} variable. E.g. Redirect url: ${server_url}/_admin/exception_tracker')}
38 </p>
40 39
41 <div class="select">
40 <div class="select" style="margin-top:5px">
41 <div class="label">
42 <label for="redirect_url">${_('Templates')}:</label>
43 </div>
44
42 45 % if repo:
43 <div class="label">
44 <label for="redirect_url">${_('Repository template')}:</label>
45 </div>
46 46 ${dt.repo_name(name=repo.repo_name, rtype=repo.repo_type,rstate=None,private=None,archived=False,fork_of=False)}
47 47 ${h.hidden('bookmark_repo', repo.repo_id)}
48 48 % elif repo_group:
49 <div class="label">
50 <label for="redirect_url">${_('Repository group template')}:</label>
51 </div>
52 49 ${dt.repo_group_name(repo_group.group_name)}
53 50 ${h.hidden('bookmark_repo_group', repo_group.group_id)}
54 51 % else:
55 <div class="label">
56 <label for="redirect_url">${_('Template Repository or Repository group')}:</label>
52 <div>
53 ${h.hidden('bookmark_repo', class_='bookmark_repo')}
54 <p class="help-block help-block-inline">${_('Available as ${repo_url} e.g. Redirect url: ${repo_url}/changelog')}</p>
57 55 </div>
58 ${h.hidden('bookmark_repo', class_='bookmark_repo')}
59 <span style="padding-right:15px">OR</span>
60 ${h.hidden('bookmark_repo_group', class_='bookmark_repo_group')}
56 <div style="margin-top:5px">
57 ${h.hidden('bookmark_repo_group', class_='bookmark_repo_group')}
58 <p class="help-block help-block-inline">${_('Available as ${repo_group_url} e.g. Redirect url: ${repo_group_url}')}</p>
59 </div>
60
61 61 % endif
62 62 </div>
63 63
64 <p class="help-block help-block-inline" >
65 % if repo:
66 ${_('Available as ${repo_url} e.g. Redirect url: ${repo_url}/changelog')}
67 % elif repo_group:
68 ${_('Available as ${repo_group_url} e.g. Redirect url: ${repo_group_url}')}
69 % else:
70 ${_('Available as full url variables in redirect url. i.e: ${repo_url}, ${repo_group_url}.')}
71 % endif
72 </p>
73 64 </td>
74 65
75 66 </tr>
@@ -1,17 +1,29 b''
1 1 <%namespace name="base" file="/base/base.mako"/>
2 2
3 3 <div class="panel panel-default">
4 <div class="panel-body">
5 <div style="height: 35px">
6 <%
7 selected_filter = 'all'
8 if c.closed:
9 selected_filter = 'all_closed'
10 %>
4 <div class="panel-heading">
5 <h3 class="panel-title">${_('Pull Requests You Participate In')}</h3>
6 </div>
11 7
8 <div class="panel-body panel-body-min-height">
9 <div class="title">
12 10 <ul class="button-links">
13 <li class="btn ${h.is_active('all', selected_filter)}"><a href="${h.route_path('my_account_pullrequests')}">${_('All')}</a></li>
14 <li class="btn ${h.is_active('all_closed', selected_filter)}"><a href="${h.route_path('my_account_pullrequests', _query={'pr_show_closed':1})}">${_('All + Closed')}</a></li>
11 <li><a class="btn ${h.is_active('all', c.selected_filter)}"
12 href="${h.route_path('my_account_pullrequests', _query={})}">
13 ${_('Open')}
14 </a>
15 </li>
16 <li><a class="btn ${h.is_active('all_closed', c.selected_filter)}"
17 href="${h.route_path('my_account_pullrequests', _query={'closed':1})}">
18 ${_('All + Closed')}
19 </a>
20 </li>
21 <li><a class="btn ${h.is_active('awaiting_my_review', c.selected_filter)}"
22 href="${h.route_path('my_account_pullrequests', _query={'awaiting_my_review':1})}">
23
24 ${_('Awaiting my review')}
25 </a>
26 </li>
15 27 </ul>
16 28
17 29 <div class="grid-quick-filter">
@@ -20,19 +32,13 b''
20 32 <i class="icon-search"></i>
21 33 </li>
22 34 <li class="grid-filter-box-input">
23 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
35 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter"
36 placeholder="${_('quick filter...')}" value=""/>
24 37 </li>
25 38 </ul>
26 39 </div>
27 </div>
28 </div>
29 </div>
40 </div>
30 41
31 <div class="panel panel-default">
32 <div class="panel-heading">
33 <h3 class="panel-title">${_('Pull Requests You Participate In')}</h3>
34 </div>
35 <div class="panel-body panel-body-min-height">
36 42 <table id="pull_request_list_table" class="rctable table-bordered"></table>
37 43 </div>
38 44 </div>
@@ -52,6 +58,7 b''
52 58 "url": "${h.route_path('my_account_pullrequests_data')}",
53 59 "data": function (d) {
54 60 d.closed = "${c.closed}";
61 d.awaiting_my_review = "${c.awaiting_my_review}";
55 62 },
56 63 "dataSrc": function (json) {
57 64 return json.data;
@@ -60,13 +67,19 b''
60 67
61 68 dom: 'rtp',
62 69 pageLength: ${c.visual.dashboard_items},
63 order: [[1, "desc"]],
70 order: [[2, "desc"]],
64 71 columns: [
65 72 {
66 73 data: {
67 74 "_": "status",
68 75 "sort": "status"
69 }, title: "", className: "td-status", orderable: false
76 }, title: "PR", className: "td-status", orderable: false
77 },
78 {
79 data: {
80 "_": "my_status",
81 "sort": "status"
82 }, title: "You", className: "td-status", orderable: false
70 83 },
71 84 {
72 85 data: {
@@ -171,7 +171,7 b''
171 171 This repository is already archived. Only super-admin users can un-archive this repository.
172 172 % else:
173 173 <button class="btn btn-small btn-warning" type="submit"
174 onclick="submitConfirm(event, this, _gettext('Confirm to archive this repository'), _gettext('Archive'), '${c.rhodecode_db_repo.repo_name}')"
174 onclick="submitConfirm(event, this, _gettext('Confirm to archive this repository. <br/>This action is irreversible !'), _gettext('Archive'), '${c.rhodecode_db_repo.repo_name}')"
175 175 >
176 176 ${_('Archive this repository')}
177 177 </button>
@@ -180,6 +180,9 b''
180 180 </div>
181 181 <div class="field">
182 182 <span class="help-block">
183 <strong>
184 ${_('This action is irreversible')} !
185 </strong><br/>
183 186 ${_('Archiving the repository will make it entirely read-only. The repository cannot be committed to.'
184 187 'It is hidden from the search results and dashboard. ')}
185 188 </span>
@@ -63,7 +63,7 b''
63 63 </tr>
64 64 %endfor
65 65 <tr class="compare_select_hidden" style="${('' if c.collapse_all_commits else 'display: none')}">
66 <td colspan="5">
66 <td colspan="7">
67 67 ${_ungettext('{} commit hidden, click expand to show them.', '{} commits hidden, click expand to show them.', len(c.commit_ranges)).format(len(c.commit_ranges))}
68 68 </td>
69 69 </tr>
@@ -171,9 +171,9 b' data = {'
171 171 <tr>
172 172 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
173 173 <td style="line-height:20px;">
174 <code>${'{}:{}'.format(data['source_ref_type'], pull_request.source_ref_parts.name)}</code> ${_('of')} ${data['source_repo_url']}
174 <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']}
175 175 &rarr;
176 <code>${'{}:{}'.format(data['target_ref_type'], pull_request.target_ref_parts.name)}</code> ${_('of')} ${data['target_repo_url']}
176 <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']}
177 177 </td>
178 178 </tr>
179 179
@@ -124,9 +124,9 b' data = {'
124 124 <tr>
125 125 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
126 126 <td style="line-height:20px;">
127 <code>${'{}:{}'.format(data['source_ref_type'], pull_request.source_ref_parts.name)}</code> ${_('of')} ${data['source_repo_url']}
127 <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']}
128 128 &rarr;
129 <code>${'{}:{}'.format(data['target_ref_type'], pull_request.target_ref_parts.name)}</code> ${_('of')} ${data['target_repo_url']}
129 <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']}
130 130 </td>
131 131 </tr>
132 132
@@ -129,9 +129,9 b' data = {'
129 129 <tr>
130 130 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
131 131 <td style="line-height:20px;">
132 <code>${'{}:{}'.format(data['source_ref_type'], pull_request.source_ref_parts.name)}</code> ${_('of')} ${data['source_repo_url']}
132 <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']}
133 133 &rarr;
134 <code>${'{}:{}'.format(data['target_ref_type'], pull_request.target_ref_parts.name)}</code> ${_('of')} ${data['target_repo_url']}
134 <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']}
135 135 </td>
136 136 </tr>
137 137
@@ -143,9 +143,9 b''
143 143 ## pull url
144 144 <li>
145 145 %if h.is_hg(c.pull_request.source_repo):
146 <% clone_url = 'hg pull -r {} {}'.format(h.short_id(c.source_ref), c.pull_request.source_repo.clone_url()) %>
146 <% clone_url = u'hg pull -r {} {}'.format(h.short_id(c.source_ref), c.pull_request.source_repo.clone_url()) %>
147 147 %elif h.is_git(c.pull_request.source_repo):
148 <% clone_url = 'git pull {} {}'.format(c.pull_request.source_repo.clone_url(), c.pull_request.source_ref_parts.name) %>
148 <% clone_url = u'git pull {} {}'.format(c.pull_request.source_repo.clone_url(), c.pull_request.source_ref_parts.name) %>
149 149 %endif
150 150
151 151 <span>${_('Pull changes from source')}</span>: <input type="text" class="input-monospace pr-pullinfo" value="${clone_url}" readonly="readonly">
@@ -560,7 +560,7 b''
560 560
561 561 <div class="right-sidebar-expanded-state pr-details-title">
562 562 <span style="padding-left: 2px">
563 <input name="select_all_drafts" type="checkbox" onclick="$('[name=submit_draft]').prop('checked', !$('[name=submit_draft]').prop('checked'))">
563 <input name="select_all_drafts" type="checkbox" onclick="selectDraftComments(event)">
564 564 </span>
565 565 <span class="sidebar-heading noselect" onclick="refreshDraftComments(); return false">
566 566 <i class="icon-comment icon-draft"></i>
@@ -942,6 +942,11 b' window.setObserversData = ${c.pull_reque'
942 942 }
943 943 }
944 944
945 window.selectDraftComments = function (event) {
946 var $target = $(event.currentTarget);
947 $('[name=submit_draft]').prop('checked', $target.prop('checked'))
948 }
949
945 950 window.closePullRequest = function (status) {
946 951 if (!confirm(_gettext('Are you sure to close this pull request without merging?'))) {
947 952 return false;
@@ -23,13 +23,14 b''
23 23
24 24 <div class="box">
25 25 <div class="title">
26
26 27 <ul class="button-links">
27 <li class="btn ${h.is_active('open', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0})}">${_('Opened')}</a></li>
28 <li class="btn ${h.is_active('my', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'my':1})}">${_('Opened by me')}</a></li>
29 <li class="btn ${h.is_active('awaiting', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'awaiting_review':1})}">${_('Awaiting review')}</a></li>
30 <li class="btn ${h.is_active('awaiting_my', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'awaiting_my_review':1})}">${_('Awaiting my review')}</a></li>
31 <li class="btn ${h.is_active('closed', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'closed':1})}">${_('Closed')}</a></li>
32 <li class="btn ${h.is_active('source', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':1})}">${_('From this repo')}</a></li>
28 <li><a class="btn ${h.is_active('open', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'open':1})}">${_('Open')}</a></li>
29 <li><a class="btn ${h.is_active('my', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'my':1})}">${_('Created by me')}</a></li>
30 <li><a class="btn ${h.is_active('awaiting', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'awaiting_review':1})}">${_('Awaiting review')}</a></li>
31 <li><a class="btn ${h.is_active('awaiting_my', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'awaiting_my_review':1})}">${_('Awaiting my review')}</a></li>
32 <li><a class="btn ${h.is_active('closed', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'closed':1})}">${_('Closed')}</a></li>
33 <li><a class="btn ${h.is_active('source', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':1})}">${_('From this repo')}</a></li>
33 34 </ul>
34 35
35 36 <ul class="links">
@@ -88,20 +89,50 b''
88 89 },
89 90 dom: 'rtp',
90 91 pageLength: ${c.visual.dashboard_items},
91 order: [[ 1, "desc" ]],
92 order: [[ 2, "desc" ]],
92 93 columns: [
93 { data: {"_": "status",
94 "sort": "status"}, title: "", className: "td-status", orderable: false},
95 { data: {"_": "name",
96 "sort": "name_raw"}, title: "${_('Id')}", className: "td-componentname", "type": "num" },
97 { data: {"_": "title",
98 "sort": "title"}, title: "${_('Title')}", className: "td-description" },
99 { data: {"_": "author",
100 "sort": "author_raw"}, title: "${_('Author')}", className: "td-user", orderable: false },
101 { data: {"_": "comments",
102 "sort": "comments_raw"}, title: "", className: "td-comments", orderable: false},
103 { data: {"_": "updated_on",
104 "sort": "updated_on_raw"}, title: "${_('Last Update')}", className: "td-time" }
94 {
95 data: {
96 "_": "status",
97 "sort": "status"
98 }, title: "PR", className: "td-status", orderable: false
99 },
100 {
101 data: {
102 "_": "my_status",
103 "sort": "status"
104 }, title: "You", className: "td-status", orderable: false
105 },
106 {
107 data: {
108 "_": "name",
109 "sort": "name_raw"
110 }, title: "${_('Id')}", className: "td-componentname", "type": "num"
111 },
112 {
113 data: {
114 "_": "title",
115 "sort": "title"
116 }, title: "${_('Title')}", className: "td-description"
117 },
118 {
119 data: {
120 "_": "author",
121 "sort": "author_raw"
122 }, title: "${_('Author')}", className: "td-user", orderable: false
123 },
124 {
125 data: {
126 "_": "comments",
127 "sort": "comments_raw"
128 }, title: "", className: "td-comments", orderable: false
129 },
130 {
131 data: {
132 "_": "updated_on",
133 "sort": "updated_on_raw"
134 }, title: "${_('Last Update')}", className: "td-time"
135 }
105 136 ],
106 137 language: {
107 138 paginate: DEFAULT_GRID_PAGINATION,
@@ -111,9 +111,10 b''
111 111 </div>
112 112 %else:
113 113
114 %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name):
114
115 115 <div class="quick_start">
116 116 <div class="fieldset">
117 %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name):
117 118 <p><b>${_('Add or upload files directly via RhodeCode:')}</b></p>
118 119 <div class="pull-left">
119 120 <a href="${h.route_path('repo_files_add_file',repo_name=c.repo_name,commit_id=0, f_path='')}" class="btn btn-default">${_('Add New File')}</a>
@@ -124,6 +125,7 b''
124 125 %endif
125 126 </div>
126 127
128
127 129 <div class="fieldset">
128 130 <p><b>${_('Push new repo:')}</b></p>
129 131 <pre>
General Comments 0
You need to be logged in to leave comments. Login now