##// END OF EJS Templates
release: merge back stable branch into default
marcink -
r4528:5055a30b merge default
parent child Browse files
Show More
@@ -0,0 +1,54 b''
1 |RCE| 4.21.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2020-09-28
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Pull requests: overhaul of the UX/UI by adding new sidebar
14 - Pull requests: new live reviewer present indicator (requires channelstream enabled)
15 - Pull requests: new live new comments indicator (requires channelstream enabled)
16 - Pull requests: new sidebar with comments/todos/referenced tickets navigation
17 - Commits page: Introduced sidebar for single commits pages
18
19
20 General
21 ^^^^^^^
22
23 - API: allow repo admins to get/set settings.
24 Previously it was only super-admins that could do that.
25 - Sessions: patch baker to take expire time for redis for auto session cleanup feature.
26 - Git: bumped git version to 2.27.0
27 - Packages: bumped to channelstream==0.6.14
28
29
30 Security
31 ^^^^^^^^
32
33 - Issue trackers: fix XSS with description field.
34
35
36 Performance
37 ^^^^^^^^^^^
38
39 - Artifacts: speed-up of artifacts download request processing.
40
41
42 Fixes
43 ^^^^^
44
45 - Pull requests: properly save merge failure metadata.
46 In rare cases merge check reported conflicts which there were none.
47 - Sessions: fixed cleanup with corrupted session data issue.
48
49
50 Upgrade notes
51 ^^^^^^^^^^^^^
52
53 - Scheduled feature release.
54 - Git version was bumped to 2.27.0
@@ -0,0 +1,55 b''
1 |RCE| 4.22.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2020-10-12
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Reviewers: added observers as another role for reviewers.
14 Observers is a role that doesn't require voting, but still gets notified about
15 PR and should participate in review process.
16 - Issue trackers: implemented more sophisticated ticket data extraction based on
17 advanced regex module. This allows using ticket references without false positives
18 like catching ticket data in an URL.
19 - Channelstream: Notification about updates and comments now works via API, and both
20 Pull-requests and individual commits.
21
22
23 General
24 ^^^^^^^
25
26 - Data tables: unified tables look for main pages of rhodecode repo pages.
27 - Users: autocomplete now sorts by matched username to show best matches first.
28 - Pull requests: only allow actual reviewers to leave status/votes in order to not
29 confuse others users about voting from people who aren't actual reviewers.
30
31 Security
32 ^^^^^^^^
33
34
35
36 Performance
37 ^^^^^^^^^^^
38
39 - Default reviewers: optimize diff data, and creation of PR with advanced default reviewers
40 - default-reviewers: diff data should load more things lazy for better performance.
41 - Pull requests: limit the amount of data saved in default reviewers data for better memory usage
42 - DB: don't use lazy loaders on PR related objects, to optimize memory usage on large
43 Pull requests with lots of comments, and commits.
44
45 Fixes
46 ^^^^^
47
48 - Quick search bar: fixes #5634, crash when search on non-ascii characters.
49 - Sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
50
51 Upgrade notes
52 ^^^^^^^^^^^^^
53
54 - Scheduled feature release.
55
@@ -0,0 +1,68 b''
1 # -*- coding: utf-8 -*-
2
3 import logging
4 from sqlalchemy import *
5
6 from alembic.migration import MigrationContext
7 from alembic.operations import Operations
8
9 from rhodecode.lib.dbmigrate.versions import _reset_base
10 from rhodecode.model import meta, init_model_encryption
11
12
13 log = logging.getLogger(__name__)
14
15
16 def upgrade(migrate_engine):
17 """
18 Upgrade operations go here.
19 Don't create your own engine; bind migrate_engine to your metadata
20 """
21 _reset_base(migrate_engine)
22 from rhodecode.lib.dbmigrate.schema import db_4_20_0_0 as db
23
24 init_model_encryption(db)
25
26 context = MigrationContext.configure(migrate_engine.connect())
27 op = Operations(context)
28
29 table = db.RepoReviewRuleUser.__table__
30 with op.batch_alter_table(table.name) as batch_op:
31 new_column = Column('role', Unicode(255), nullable=True)
32 batch_op.add_column(new_column)
33
34 _fill_rule_user_role(op, meta.Session)
35
36 table = db.RepoReviewRuleUserGroup.__table__
37 with op.batch_alter_table(table.name) as batch_op:
38 new_column = Column('role', Unicode(255), nullable=True)
39 batch_op.add_column(new_column)
40
41 _fill_rule_user_group_role(op, meta.Session)
42
43
44 def downgrade(migrate_engine):
45 meta = MetaData()
46 meta.bind = migrate_engine
47
48
49 def fixups(models, _SESSION):
50 pass
51
52
53 def _fill_rule_user_role(op, session):
54 params = {'role': 'reviewer'}
55 query = text(
56 'UPDATE repo_review_rules_users SET role = :role'
57 ).bindparams(**params)
58 op.execute(query)
59 session().commit()
60
61
62 def _fill_rule_user_group_role(op, session):
63 params = {'role': 'reviewer'}
64 query = text(
65 'UPDATE repo_review_rules_users_groups SET role = :role'
66 ).bindparams(**params)
67 op.execute(query)
68 session().commit()
@@ -0,0 +1,35 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-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
22 def html(info):
23 """
24 Custom string as html content_type renderer for pyramid
25 """
26 def _render(value, system):
27 request = system.get('request')
28 if request is not None:
29 response = request.response
30 ct = response.content_type
31 if ct == response.default_content_type:
32 response.content_type = 'text/html'
33 return value
34
35 return _render
@@ -68,3 +68,5 b' 7ac623a4a2405917e2af660d645ded662011e40d'
68 ef7ffda65eeb90c3ba88590a6cb816ef9b0bc232 v4.19.3
68 ef7ffda65eeb90c3ba88590a6cb816ef9b0bc232 v4.19.3
69 3e635489bb7961df93b01e42454ad1a8730ae968 v4.20.0
69 3e635489bb7961df93b01e42454ad1a8730ae968 v4.20.0
70 7e2eb896a02ca7cd2cd9f0f853ef3dac3f0039e3 v4.20.1
70 7e2eb896a02ca7cd2cd9f0f853ef3dac3f0039e3 v4.20.1
71 8bb5fece08ab65986225b184e46f53d2a71729cb v4.21.0
72 90734aac31ee4563bbe665a43ff73190cc762275 v4.22.0
@@ -90,7 +90,7 b' comment_pull_request'
90 create_pull_request
90 create_pull_request
91 -------------------
91 -------------------
92
92
93 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, owner=<Optional:<OptionalAttr:apiuser>>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>)
93 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, owner=<Optional:<OptionalAttr:apiuser>>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>, observers=<Optional:None>)
94
94
95 Creates a new pull request.
95 Creates a new pull request.
96
96
@@ -128,6 +128,13 b' create_pull_request'
128 Accepts username strings or objects of the format:
128 Accepts username strings or objects of the format:
129
129
130 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
130 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
131 :param observers: Set the new pull request observers list.
132 Reviewer defined by review rules will be added automatically to the
133 defined list. This feature is only available in RhodeCode EE
134 :type observers: Optional(list)
135 Accepts username strings or objects of the format:
136
137 [{'username': 'nick', 'reasons': ['original author']}]
131
138
132
139
133 get_pull_request
140 get_pull_request
@@ -392,7 +399,7 b' merge_pull_request'
392 update_pull_request
399 update_pull_request
393 -------------------
400 -------------------
394
401
395 .. py:function:: update_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>)
402 .. py:function:: update_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>, observers=<Optional:None>, update_commits=<Optional:None>)
396
403
397 Updates a pull request.
404 Updates a pull request.
398
405
@@ -414,7 +421,11 b' update_pull_request'
414 Accepts username strings or objects of the format:
421 Accepts username strings or objects of the format:
415
422
416 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
423 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
424 :param observers: Update pull request observers list with new value.
425 :type observers: Optional(list)
426 Accepts username strings or objects of the format:
417
427
428 [{'username': 'nick', 'reasons': ['should be aware about this PR']}]
418 :param update_commits: Trigger update of commits for this pull request
429 :param update_commits: Trigger update of commits for this pull request
419 :type: update_commits: Optional(bool)
430 :type: update_commits: Optional(bool)
420
431
@@ -432,6 +443,12 b' update_pull_request'
432 ],
443 ],
433 "removed": []
444 "removed": []
434 },
445 },
446 "updated_observers": {
447 "added": [
448 "username"
449 ],
450 "removed": []
451 },
435 "updated_commits": {
452 "updated_commits": {
436 "added": [
453 "added": [
437 "<sha1_hash>"
454 "<sha1_hash>"
@@ -9,6 +9,8 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.22.0.rst
13 release-notes-4.21.0.rst
12 release-notes-4.20.1.rst
14 release-notes-4.20.1.rst
13 release-notes-4.20.0.rst
15 release-notes-4.20.0.rst
14 release-notes-4.19.3.rst
16 release-notes-4.19.3.rst
@@ -1816,6 +1816,17 b' self: super: {'
1816 license = [ pkgs.lib.licenses.mit ];
1816 license = [ pkgs.lib.licenses.mit ];
1817 };
1817 };
1818 };
1818 };
1819 "regex" = super.buildPythonPackage {
1820 name = "regex-2020.9.27";
1821 doCheck = false;
1822 src = fetchurl {
1823 url = "https://files.pythonhosted.org/packages/93/8c/17f45cdfb39b13d4b5f909e4b4c2917abcbdef9c0036919a0399769148cf/regex-2020.9.27.tar.gz";
1824 sha256 = "179ngfzwbsjvn5vhyzdahvmg0f7acahkwwy9bpjy1pv08bm2mwx6";
1825 };
1826 meta = {
1827 license = [ pkgs.lib.licenses.psfl ];
1828 };
1829 };
1819 "redis" = super.buildPythonPackage {
1830 "redis" = super.buildPythonPackage {
1820 name = "redis-3.4.1";
1831 name = "redis-3.4.1";
1821 doCheck = false;
1832 doCheck = false;
@@ -1872,7 +1883,7 b' self: super: {'
1872 };
1883 };
1873 };
1884 };
1874 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1885 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1875 name = "rhodecode-enterprise-ce-4.20.0";
1886 name = "rhodecode-enterprise-ce-4.22.0";
1876 buildInputs = [
1887 buildInputs = [
1877 self."pytest"
1888 self."pytest"
1878 self."py"
1889 self."py"
@@ -1946,6 +1957,7 b' self: super: {'
1946 self."tzlocal"
1957 self."tzlocal"
1947 self."pyzmq"
1958 self."pyzmq"
1948 self."py-gfm"
1959 self."py-gfm"
1960 self."regex"
1949 self."redis"
1961 self."redis"
1950 self."repoze.lru"
1962 self."repoze.lru"
1951 self."requests"
1963 self."requests"
@@ -56,6 +56,7 b' pytz==2019.3'
56 tzlocal==1.5.1
56 tzlocal==1.5.1
57 pyzmq==14.6.0
57 pyzmq==14.6.0
58 py-gfm==0.1.4
58 py-gfm==0.1.4
59 regex==2020.9.27
59 redis==3.4.1
60 redis==3.4.1
60 repoze.lru==0.7
61 repoze.lru==0.7
61 requests==2.22.0
62 requests==2.22.0
@@ -48,7 +48,7 b' PYRAMID_SETTINGS = {}'
48 EXTENSIONS = {}
48 EXTENSIONS = {}
49
49
50 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
50 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
51 __dbversion__ = 109 # defines current db version for migrations
51 __dbversion__ = 110 # defines current db version for migrations
52 __platform__ = platform.system()
52 __platform__ = platform.system()
53 __license__ = 'AGPLv3, and Commercial License'
53 __license__ = 'AGPLv3, and Commercial License'
54 __author__ = 'RhodeCode GmbH'
54 __author__ = 'RhodeCode GmbH'
@@ -320,7 +320,7 b' class TestCreatePullRequestApi(object):'
320 id_, params = build_data(
320 id_, params = build_data(
321 self.apikey_regular, 'create_pull_request', **data)
321 self.apikey_regular, 'create_pull_request', **data)
322 response = api_call(self.app, params)
322 response = api_call(self.app, params)
323 expected_message = 'no commits found'
323 expected_message = 'no commits found for merge between specified references'
324 assert_error(id_, expected_message, given=response.body)
324 assert_error(id_, expected_message, given=response.body)
325
325
326 @pytest.mark.backends("git", "hg")
326 @pytest.mark.backends("git", "hg")
@@ -29,6 +29,7 b' from rhodecode.api.tests.utils import ('
29
29
30 @pytest.mark.usefixtures("testuser_api", "app")
30 @pytest.mark.usefixtures("testuser_api", "app")
31 class TestGetPullRequest(object):
31 class TestGetPullRequest(object):
32
32 @pytest.mark.backends("git", "hg")
33 @pytest.mark.backends("git", "hg")
33 def test_api_get_pull_requests(self, pr_util):
34 def test_api_get_pull_requests(self, pr_util):
34 pull_request = pr_util.create_pull_request()
35 pull_request = pr_util.create_pull_request()
@@ -40,6 +41,7 b' class TestGetPullRequest(object):'
40 target_ref=pull_request.target_ref,
41 target_ref=pull_request.target_ref,
41 revisions=pull_request.revisions,
42 revisions=pull_request.revisions,
42 reviewers=(),
43 reviewers=(),
44 observers=(),
43 title=pull_request.title,
45 title=pull_request.title,
44 description=pull_request.description,
46 description=pull_request.description,
45 )
47 )
@@ -51,6 +51,7 b' class TestUpdatePullRequest(object):'
51 "pull_request": response.json['result']['pull_request'],
51 "pull_request": response.json['result']['pull_request'],
52 "updated_commits": {"added": [], "common": [], "removed": []},
52 "updated_commits": {"added": [], "common": [], "removed": []},
53 "updated_reviewers": {"added": [], "removed": []},
53 "updated_reviewers": {"added": [], "removed": []},
54 "updated_observers": {"added": [], "removed": []},
54 }
55 }
55
56
56 response_json = response.json['result']
57 response_json = response.json['result']
@@ -111,6 +112,7 b' class TestUpdatePullRequest(object):'
111 "total": total_commits,
112 "total": total_commits,
112 "removed": []},
113 "removed": []},
113 "updated_reviewers": {"added": [], "removed": []},
114 "updated_reviewers": {"added": [], "removed": []},
115 "updated_observers": {"added": [], "removed": []},
114 }
116 }
115
117
116 assert_ok(id_, expected, response.body)
118 assert_ok(id_, expected, response.body)
@@ -122,7 +124,7 b' class TestUpdatePullRequest(object):'
122 b = user_util.create_user()
124 b = user_util.create_user()
123 c = user_util.create_user()
125 c = user_util.create_user()
124 new_reviewers = [
126 new_reviewers = [
125 {'username': b.username,'reasons': ['updated via API'],
127 {'username': b.username, 'reasons': ['updated via API'],
126 'mandatory':False},
128 'mandatory':False},
127 {'username': c.username, 'reasons': ['updated via API'],
129 {'username': c.username, 'reasons': ['updated via API'],
128 'mandatory':False},
130 'mandatory':False},
@@ -132,7 +134,7 b' class TestUpdatePullRequest(object):'
132 removed = [a.username]
134 removed = [a.username]
133
135
134 pull_request = pr_util.create_pull_request(
136 pull_request = pr_util.create_pull_request(
135 reviewers=[(a.username, ['added via API'], False, [])])
137 reviewers=[(a.username, ['added via API'], False, 'reviewer', [])])
136
138
137 id_, params = build_data(
139 id_, params = build_data(
138 self.apikey, 'update_pull_request',
140 self.apikey, 'update_pull_request',
@@ -146,6 +148,7 b' class TestUpdatePullRequest(object):'
146 "pull_request": response.json['result']['pull_request'],
148 "pull_request": response.json['result']['pull_request'],
147 "updated_commits": {"added": [], "common": [], "removed": []},
149 "updated_commits": {"added": [], "common": [], "removed": []},
148 "updated_reviewers": {"added": added, "removed": removed},
150 "updated_reviewers": {"added": added, "removed": removed},
151 "updated_observers": {"added": [], "removed": []},
149 }
152 }
150
153
151 assert_ok(id_, expected, response.body)
154 assert_ok(id_, expected, response.body)
@@ -26,12 +26,15 b' from rhodecode.api.utils import ('
26 has_superadmin_permission, Optional, OAttr, get_repo_or_error,
26 has_superadmin_permission, Optional, OAttr, get_repo_or_error,
27 get_pull_request_or_error, get_commit_or_error, get_user_or_error,
27 get_pull_request_or_error, get_commit_or_error, get_user_or_error,
28 validate_repo_permissions, resolve_ref_or_error, validate_set_owner_permissions)
28 validate_repo_permissions, resolve_ref_or_error, validate_set_owner_permissions)
29 from rhodecode.lib import channelstream
29 from rhodecode.lib.auth import (HasRepoPermissionAnyApi)
30 from rhodecode.lib.auth import (HasRepoPermissionAnyApi)
30 from rhodecode.lib.base import vcs_operation_context
31 from rhodecode.lib.base import vcs_operation_context
31 from rhodecode.lib.utils2 import str2bool
32 from rhodecode.lib.utils2 import str2bool
33 from rhodecode.lib.vcs.backends.base import unicode_to_reference
32 from rhodecode.model.changeset_status import ChangesetStatusModel
34 from rhodecode.model.changeset_status import ChangesetStatusModel
33 from rhodecode.model.comment import CommentsModel
35 from rhodecode.model.comment import CommentsModel
34 from rhodecode.model.db import Session, ChangesetStatus, ChangesetComment, PullRequest
36 from rhodecode.model.db import (
37 Session, ChangesetStatus, ChangesetComment, PullRequest, PullRequestReviewers)
35 from rhodecode.model.pull_request import PullRequestModel, MergeCheck
38 from rhodecode.model.pull_request import PullRequestModel, MergeCheck
36 from rhodecode.model.settings import SettingsModel
39 from rhodecode.model.settings import SettingsModel
37 from rhodecode.model.validation_schema import Invalid
40 from rhodecode.model.validation_schema import Invalid
@@ -502,16 +505,19 b' def comment_pull_request('
502 },
505 },
503 error : null
506 error : null
504 """
507 """
508 _ = request.translate
509
505 pull_request = get_pull_request_or_error(pullrequestid)
510 pull_request = get_pull_request_or_error(pullrequestid)
506 if Optional.extract(repoid):
511 if Optional.extract(repoid):
507 repo = get_repo_or_error(repoid)
512 repo = get_repo_or_error(repoid)
508 else:
513 else:
509 repo = pull_request.target_repo
514 repo = pull_request.target_repo
510
515
516 db_repo_name = repo.repo_name
511 auth_user = apiuser
517 auth_user = apiuser
512 if not isinstance(userid, Optional):
518 if not isinstance(userid, Optional):
513 is_repo_admin = HasRepoPermissionAnyApi('repository.admin')(
519 is_repo_admin = HasRepoPermissionAnyApi('repository.admin')(
514 user=apiuser, repo_name=repo.repo_name)
520 user=apiuser, repo_name=db_repo_name)
515 if has_superadmin_permission(apiuser) or is_repo_admin:
521 if has_superadmin_permission(apiuser) or is_repo_admin:
516 apiuser = get_user_or_error(userid)
522 apiuser = get_user_or_error(userid)
517 auth_user = apiuser.AuthUser()
523 auth_user = apiuser.AuthUser()
@@ -596,6 +602,7 b' def comment_pull_request('
596 extra_recipients=extra_recipients,
602 extra_recipients=extra_recipients,
597 send_email=send_email
603 send_email=send_email
598 )
604 )
605 is_inline = comment.is_inline
599
606
600 if allowed_to_change_status and status:
607 if allowed_to_change_status and status:
601 old_calculated_status = pull_request.calculated_review_status()
608 old_calculated_status = pull_request.calculated_review_status()
@@ -628,14 +635,39 b' def comment_pull_request('
628 'comment_id': comment.comment_id if comment else None,
635 'comment_id': comment.comment_id if comment else None,
629 'status': {'given': status, 'was_changed': status_change},
636 'status': {'given': status, 'was_changed': status_change},
630 }
637 }
638
639 comment_broadcast_channel = channelstream.comment_channel(
640 db_repo_name, pull_request_obj=pull_request)
641
642 comment_data = data
643 comment_type = 'inline' if is_inline else 'general'
644 channelstream.comment_channelstream_push(
645 request, comment_broadcast_channel, apiuser,
646 _('posted a new {} comment').format(comment_type),
647 comment_data=comment_data)
648
631 return data
649 return data
632
650
651 def _reviewers_validation(obj_list):
652 schema = ReviewerListSchema()
653 try:
654 reviewer_objects = schema.deserialize(obj_list)
655 except Invalid as err:
656 raise JSONRPCValidationError(colander_exc=err)
657
658 # validate users
659 for reviewer_object in reviewer_objects:
660 user = get_user_or_error(reviewer_object['username'])
661 reviewer_object['user_id'] = user.user_id
662 return reviewer_objects
663
633
664
634 @jsonrpc_method()
665 @jsonrpc_method()
635 def create_pull_request(
666 def create_pull_request(
636 request, apiuser, source_repo, target_repo, source_ref, target_ref,
667 request, apiuser, source_repo, target_repo, source_ref, target_ref,
637 owner=Optional(OAttr('apiuser')), title=Optional(''), description=Optional(''),
668 owner=Optional(OAttr('apiuser')), title=Optional(''), description=Optional(''),
638 description_renderer=Optional(''), reviewers=Optional(None)):
669 description_renderer=Optional(''),
670 reviewers=Optional(None), observers=Optional(None)):
639 """
671 """
640 Creates a new pull request.
672 Creates a new pull request.
641
673
@@ -673,6 +705,13 b' def create_pull_request('
673 Accepts username strings or objects of the format:
705 Accepts username strings or objects of the format:
674
706
675 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
707 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
708 :param observers: Set the new pull request observers list.
709 Reviewer defined by review rules will be added automatically to the
710 defined list. This feature is only available in RhodeCode EE
711 :type observers: Optional(list)
712 Accepts username strings or objects of the format:
713
714 [{'username': 'nick', 'reasons': ['original author']}]
676 """
715 """
677
716
678 source_db_repo = get_repo_or_error(source_repo)
717 source_db_repo = get_repo_or_error(source_repo)
@@ -686,34 +725,39 b' def create_pull_request('
686 full_source_ref = resolve_ref_or_error(source_ref, source_db_repo)
725 full_source_ref = resolve_ref_or_error(source_ref, source_db_repo)
687 full_target_ref = resolve_ref_or_error(target_ref, target_db_repo)
726 full_target_ref = resolve_ref_or_error(target_ref, target_db_repo)
688
727
689 source_commit = get_commit_or_error(full_source_ref, source_db_repo)
728 get_commit_or_error(full_source_ref, source_db_repo)
690 target_commit = get_commit_or_error(full_target_ref, target_db_repo)
729 get_commit_or_error(full_target_ref, target_db_repo)
691
730
692 reviewer_objects = Optional.extract(reviewers) or []
731 reviewer_objects = Optional.extract(reviewers) or []
732 observer_objects = Optional.extract(observers) or []
693
733
694 # serialize and validate passed in given reviewers
734 # serialize and validate passed in given reviewers
695 if reviewer_objects:
735 if reviewer_objects:
696 schema = ReviewerListSchema()
736 reviewer_objects = _reviewers_validation(reviewer_objects)
697 try:
737
698 reviewer_objects = schema.deserialize(reviewer_objects)
738 if observer_objects:
699 except Invalid as err:
739 observer_objects = _reviewers_validation(reviewer_objects)
700 raise JSONRPCValidationError(colander_exc=err)
701
740
702 # validate users
741 get_default_reviewers_data, validate_default_reviewers, validate_observers = \
703 for reviewer_object in reviewer_objects:
742 PullRequestModel().get_reviewer_functions()
704 user = get_user_or_error(reviewer_object['username'])
705 reviewer_object['user_id'] = user.user_id
706
743
707 get_default_reviewers_data, validate_default_reviewers = \
744 source_ref_obj = unicode_to_reference(full_source_ref)
708 PullRequestModel().get_reviewer_functions()
745 target_ref_obj = unicode_to_reference(full_target_ref)
709
746
710 # recalculate reviewers logic, to make sure we can validate this
747 # recalculate reviewers logic, to make sure we can validate this
711 default_reviewers_data = get_default_reviewers_data(
748 default_reviewers_data = get_default_reviewers_data(
712 owner, source_db_repo,
749 owner,
713 source_commit, target_db_repo, target_commit)
750 source_db_repo,
751 source_ref_obj,
752 target_db_repo,
753 target_ref_obj,
754 )
714
755
715 # now MERGE our given with the calculated
756 # now MERGE our given with the calculated from the default rules
716 reviewer_objects = default_reviewers_data['reviewers'] + reviewer_objects
757 just_reviewers = [
758 x for x in default_reviewers_data['reviewers']
759 if x['role'] == PullRequestReviewers.ROLE_REVIEWER]
760 reviewer_objects = just_reviewers + reviewer_objects
717
761
718 try:
762 try:
719 reviewers = validate_default_reviewers(
763 reviewers = validate_default_reviewers(
@@ -721,9 +765,21 b' def create_pull_request('
721 except ValueError as e:
765 except ValueError as e:
722 raise JSONRPCError('Reviewers Validation: {}'.format(e))
766 raise JSONRPCError('Reviewers Validation: {}'.format(e))
723
767
768 # now MERGE our given with the calculated from the default rules
769 just_observers = [
770 x for x in default_reviewers_data['reviewers']
771 if x['role'] == PullRequestReviewers.ROLE_OBSERVER]
772 observer_objects = just_observers + observer_objects
773
774 try:
775 observers = validate_observers(
776 observer_objects, default_reviewers_data)
777 except ValueError as e:
778 raise JSONRPCError('Observer Validation: {}'.format(e))
779
724 title = Optional.extract(title)
780 title = Optional.extract(title)
725 if not title:
781 if not title:
726 title_source_ref = source_ref.split(':', 2)[1]
782 title_source_ref = source_ref_obj.name
727 title = PullRequestModel().generate_pullrequest_title(
783 title = PullRequestModel().generate_pullrequest_title(
728 source=source_repo,
784 source=source_repo,
729 source_ref=title_source_ref,
785 source_ref=title_source_ref,
@@ -732,20 +788,17 b' def create_pull_request('
732
788
733 diff_info = default_reviewers_data['diff_info']
789 diff_info = default_reviewers_data['diff_info']
734 common_ancestor_id = diff_info['ancestor']
790 common_ancestor_id = diff_info['ancestor']
735 commits = diff_info['commits']
791 # NOTE(marcink): reversed is consistent with how we open it in the WEB interface
792 commits = [commit['commit_id'] for commit in reversed(diff_info['commits'])]
736
793
737 if not common_ancestor_id:
794 if not common_ancestor_id:
738 raise JSONRPCError('no common ancestor found')
795 raise JSONRPCError('no common ancestor found between specified references')
739
796
740 if not commits:
797 if not commits:
741 raise JSONRPCError('no commits found')
798 raise JSONRPCError('no commits found for merge between specified references')
742
743 # NOTE(marcink): reversed is consistent with how we open it in the WEB interface
744 revisions = [commit.raw_id for commit in reversed(commits)]
745
799
746 # recalculate target ref based on ancestor
800 # recalculate target ref based on ancestor
747 target_ref_type, target_ref_name, __ = full_target_ref.split(':')
801 full_target_ref = ':'.join((target_ref_obj.type, target_ref_obj.name, common_ancestor_id))
748 full_target_ref = ':'.join((target_ref_type, target_ref_name, common_ancestor_id))
749
802
750 # fetch renderer, if set fallback to plain in case of PR
803 # fetch renderer, if set fallback to plain in case of PR
751 rc_config = SettingsModel().get_all_settings()
804 rc_config = SettingsModel().get_all_settings()
@@ -760,8 +813,9 b' def create_pull_request('
760 target_repo=target_repo,
813 target_repo=target_repo,
761 target_ref=full_target_ref,
814 target_ref=full_target_ref,
762 common_ancestor_id=common_ancestor_id,
815 common_ancestor_id=common_ancestor_id,
763 revisions=revisions,
816 revisions=commits,
764 reviewers=reviewers,
817 reviewers=reviewers,
818 observers=observers,
765 title=title,
819 title=title,
766 description=description,
820 description=description,
767 description_renderer=description_renderer,
821 description_renderer=description_renderer,
@@ -781,7 +835,7 b' def create_pull_request('
781 def update_pull_request(
835 def update_pull_request(
782 request, apiuser, pullrequestid, repoid=Optional(None),
836 request, apiuser, pullrequestid, repoid=Optional(None),
783 title=Optional(''), description=Optional(''), description_renderer=Optional(''),
837 title=Optional(''), description=Optional(''), description_renderer=Optional(''),
784 reviewers=Optional(None), update_commits=Optional(None)):
838 reviewers=Optional(None), observers=Optional(None), update_commits=Optional(None)):
785 """
839 """
786 Updates a pull request.
840 Updates a pull request.
787
841
@@ -803,7 +857,11 b' def update_pull_request('
803 Accepts username strings or objects of the format:
857 Accepts username strings or objects of the format:
804
858
805 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
859 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
860 :param observers: Update pull request observers list with new value.
861 :type observers: Optional(list)
862 Accepts username strings or objects of the format:
806
863
864 [{'username': 'nick', 'reasons': ['should be aware about this PR']}]
807 :param update_commits: Trigger update of commits for this pull request
865 :param update_commits: Trigger update of commits for this pull request
808 :type: update_commits: Optional(bool)
866 :type: update_commits: Optional(bool)
809
867
@@ -821,6 +879,12 b' def update_pull_request('
821 ],
879 ],
822 "removed": []
880 "removed": []
823 },
881 },
882 "updated_observers": {
883 "added": [
884 "username"
885 ],
886 "removed": []
887 },
824 "updated_commits": {
888 "updated_commits": {
825 "added": [
889 "added": [
826 "<sha1_hash>"
890 "<sha1_hash>"
@@ -852,36 +916,14 b' def update_pull_request('
852 pullrequestid,))
916 pullrequestid,))
853
917
854 reviewer_objects = Optional.extract(reviewers) or []
918 reviewer_objects = Optional.extract(reviewers) or []
855
919 observer_objects = Optional.extract(observers) or []
856 if reviewer_objects:
857 schema = ReviewerListSchema()
858 try:
859 reviewer_objects = schema.deserialize(reviewer_objects)
860 except Invalid as err:
861 raise JSONRPCValidationError(colander_exc=err)
862
863 # validate users
864 for reviewer_object in reviewer_objects:
865 user = get_user_or_error(reviewer_object['username'])
866 reviewer_object['user_id'] = user.user_id
867
868 get_default_reviewers_data, get_validated_reviewers = \
869 PullRequestModel().get_reviewer_functions()
870
871 # re-use stored rules
872 reviewer_rules = pull_request.reviewer_data
873 try:
874 reviewers = get_validated_reviewers(
875 reviewer_objects, reviewer_rules)
876 except ValueError as e:
877 raise JSONRPCError('Reviewers Validation: {}'.format(e))
878 else:
879 reviewers = []
880
920
881 title = Optional.extract(title)
921 title = Optional.extract(title)
882 description = Optional.extract(description)
922 description = Optional.extract(description)
883 description_renderer = Optional.extract(description_renderer)
923 description_renderer = Optional.extract(description_renderer)
884
924
925 # Update title/description
926 title_changed = False
885 if title or description:
927 if title or description:
886 PullRequestModel().edit(
928 PullRequestModel().edit(
887 pull_request,
929 pull_request,
@@ -890,8 +932,12 b' def update_pull_request('
890 description_renderer or pull_request.description_renderer,
932 description_renderer or pull_request.description_renderer,
891 apiuser)
933 apiuser)
892 Session().commit()
934 Session().commit()
935 title_changed = True
893
936
894 commit_changes = {"added": [], "common": [], "removed": []}
937 commit_changes = {"added": [], "common": [], "removed": []}
938
939 # Update commits
940 commits_changed = False
895 if str2bool(Optional.extract(update_commits)):
941 if str2bool(Optional.extract(update_commits)):
896
942
897 if pull_request.pull_request_state != PullRequest.STATE_CREATED:
943 if pull_request.pull_request_state != PullRequest.STATE_CREATED:
@@ -907,12 +953,44 b' def update_pull_request('
907 pull_request, db_user)
953 pull_request, db_user)
908 commit_changes = update_response.changes or commit_changes
954 commit_changes = update_response.changes or commit_changes
909 Session().commit()
955 Session().commit()
956 commits_changed = True
910
957
958 # Update reviewers
959 # serialize and validate passed in given reviewers
960 if reviewer_objects:
961 reviewer_objects = _reviewers_validation(reviewer_objects)
962
963 if observer_objects:
964 observer_objects = _reviewers_validation(reviewer_objects)
965
966 # re-use stored rules
967 default_reviewers_data = pull_request.reviewer_data
968
969 __, validate_default_reviewers, validate_observers = \
970 PullRequestModel().get_reviewer_functions()
971
972 if reviewer_objects:
973 try:
974 reviewers = validate_default_reviewers(reviewer_objects, default_reviewers_data)
975 except ValueError as e:
976 raise JSONRPCError('Reviewers Validation: {}'.format(e))
977 else:
978 reviewers = []
979
980 if observer_objects:
981 try:
982 observers = validate_default_reviewers(reviewer_objects, default_reviewers_data)
983 except ValueError as e:
984 raise JSONRPCError('Observer Validation: {}'.format(e))
985 else:
986 observers = []
987
988 reviewers_changed = False
911 reviewers_changes = {"added": [], "removed": []}
989 reviewers_changes = {"added": [], "removed": []}
912 if reviewers:
990 if reviewers:
913 old_calculated_status = pull_request.calculated_review_status()
991 old_calculated_status = pull_request.calculated_review_status()
914 added_reviewers, removed_reviewers = \
992 added_reviewers, removed_reviewers = \
915 PullRequestModel().update_reviewers(pull_request, reviewers, apiuser)
993 PullRequestModel().update_reviewers(pull_request, reviewers, apiuser.get_instance())
916
994
917 reviewers_changes['added'] = sorted(
995 reviewers_changes['added'] = sorted(
918 [get_user_or_error(n).username for n in added_reviewers])
996 [get_user_or_error(n).username for n in added_reviewers])
@@ -926,13 +1004,35 b' def update_pull_request('
926 PullRequestModel().trigger_pull_request_hook(
1004 PullRequestModel().trigger_pull_request_hook(
927 pull_request, apiuser, 'review_status_change',
1005 pull_request, apiuser, 'review_status_change',
928 data={'status': calculated_status})
1006 data={'status': calculated_status})
1007 reviewers_changed = True
1008
1009 observers_changed = False
1010 observers_changes = {"added": [], "removed": []}
1011 if observers:
1012 added_observers, removed_observers = \
1013 PullRequestModel().update_observers(pull_request, observers, apiuser.get_instance())
1014
1015 observers_changes['added'] = sorted(
1016 [get_user_or_error(n).username for n in added_observers])
1017 observers_changes['removed'] = sorted(
1018 [get_user_or_error(n).username for n in removed_observers])
1019 Session().commit()
1020
1021 reviewers_changed = True
1022
1023 # push changed to channelstream
1024 if commits_changed or reviewers_changed or observers_changed:
1025 pr_broadcast_channel = channelstream.pr_channel(pull_request)
1026 msg = 'Pull request was updated.'
1027 channelstream.pr_update_channelstream_push(
1028 request, pr_broadcast_channel, apiuser, msg)
929
1029
930 data = {
1030 data = {
931 'msg': 'Updated pull request `{}`'.format(
1031 'msg': 'Updated pull request `{}`'.format(pull_request.pull_request_id),
932 pull_request.pull_request_id),
933 'pull_request': pull_request.get_api_data(),
1032 'pull_request': pull_request.get_api_data(),
934 'updated_commits': commit_changes,
1033 'updated_commits': commit_changes,
935 'updated_reviewers': reviewers_changes
1034 'updated_reviewers': reviewers_changes,
1035 'updated_observers': observers_changes,
936 }
1036 }
937
1037
938 return data
1038 return data
@@ -29,7 +29,7 b' from rhodecode.api.utils import ('
29 get_user_group_or_error, get_user_or_error, validate_repo_permissions,
29 get_user_group_or_error, get_user_or_error, validate_repo_permissions,
30 get_perm_or_error, parse_args, get_origin, build_commit_data,
30 get_perm_or_error, parse_args, get_origin, build_commit_data,
31 validate_set_owner_permissions)
31 validate_set_owner_permissions)
32 from rhodecode.lib import audit_logger, rc_cache
32 from rhodecode.lib import audit_logger, rc_cache, channelstream
33 from rhodecode.lib import repo_maintenance
33 from rhodecode.lib import repo_maintenance
34 from rhodecode.lib.auth import (
34 from rhodecode.lib.auth import (
35 HasPermissionAnyApi, HasUserGroupPermissionAnyApi,
35 HasPermissionAnyApi, HasUserGroupPermissionAnyApi,
@@ -1597,10 +1597,13 b' def comment_commit('
1597 }
1597 }
1598
1598
1599 """
1599 """
1600 _ = request.translate
1601
1600 repo = get_repo_or_error(repoid)
1602 repo = get_repo_or_error(repoid)
1601 if not has_superadmin_permission(apiuser):
1603 if not has_superadmin_permission(apiuser):
1602 _perms = ('repository.read', 'repository.write', 'repository.admin')
1604 _perms = ('repository.read', 'repository.write', 'repository.admin')
1603 validate_repo_permissions(apiuser, repoid, repo, _perms)
1605 validate_repo_permissions(apiuser, repoid, repo, _perms)
1606 db_repo_name = repo.repo_name
1604
1607
1605 try:
1608 try:
1606 commit = repo.scm_instance().get_commit(commit_id=commit_id)
1609 commit = repo.scm_instance().get_commit(commit_id=commit_id)
@@ -1650,6 +1653,8 b' def comment_commit('
1650 extra_recipients=extra_recipients,
1653 extra_recipients=extra_recipients,
1651 send_email=send_email
1654 send_email=send_email
1652 )
1655 )
1656 is_inline = comment.is_inline
1657
1653 if status:
1658 if status:
1654 # also do a status change
1659 # also do a status change
1655 try:
1660 try:
@@ -1669,6 +1674,17 b' def comment_commit('
1669 data={'comment': comment, 'commit': commit})
1674 data={'comment': comment, 'commit': commit})
1670
1675
1671 Session().commit()
1676 Session().commit()
1677
1678 comment_broadcast_channel = channelstream.comment_channel(
1679 db_repo_name, commit_obj=commit)
1680
1681 comment_data = {'comment': comment, 'comment_id': comment.comment_id}
1682 comment_type = 'inline' if is_inline else 'general'
1683 channelstream.comment_channelstream_push(
1684 request, comment_broadcast_channel, apiuser,
1685 _('posted a new {} comment').format(comment_type),
1686 comment_data=comment_data)
1687
1672 return {
1688 return {
1673 'msg': (
1689 'msg': (
1674 'Commented on commit `%s` for repository `%s`' % (
1690 'Commented on commit `%s` for repository `%s`' % (
@@ -474,9 +474,18 b' class AdminSettingsView(BaseAppView):'
474 route_name='admin_settings_issuetracker_test', request_method='POST',
474 route_name='admin_settings_issuetracker_test', request_method='POST',
475 renderer='string', xhr=True)
475 renderer='string', xhr=True)
476 def settings_issuetracker_test(self):
476 def settings_issuetracker_test(self):
477 return h.urlify_commit_message(
477 error_container = []
478
479 urlified_commit = h.urlify_commit_message(
478 self.request.POST.get('test_text', ''),
480 self.request.POST.get('test_text', ''),
479 'repo_group/test_repo1')
481 'repo_group/test_repo1', error_container=error_container)
482 if error_container:
483 def converter(inp):
484 return h.html_escape(unicode(inp))
485
486 return 'ERRORS: ' + '\n'.join(map(converter, error_container))
487
488 return urlified_commit
480
489
481 @LoginRequired()
490 @LoginRequired()
482 @HasPermissionAllDecorator('hg.admin')
491 @HasPermissionAllDecorator('hg.admin')
@@ -34,6 +34,7 b' log = logging.getLogger(__name__)'
34
34
35
35
36 class DebugStyleView(BaseAppView):
36 class DebugStyleView(BaseAppView):
37
37 def load_default_context(self):
38 def load_default_context(self):
38 c = self._get_local_tmpl_context()
39 c = self._get_local_tmpl_context()
39
40
@@ -75,6 +76,7 b' Check if we should use full-topic or min'
75 source_ref_parts=AttributeDict(type='branch', name='fix-ticket-2000'),
76 source_ref_parts=AttributeDict(type='branch', name='fix-ticket-2000'),
76 target_ref_parts=AttributeDict(type='branch', name='master'),
77 target_ref_parts=AttributeDict(type='branch', name='master'),
77 )
78 )
79
78 target_repo = AttributeDict(repo_name='repo_group/target_repo')
80 target_repo = AttributeDict(repo_name='repo_group/target_repo')
79 source_repo = AttributeDict(repo_name='repo_group/source_repo')
81 source_repo = AttributeDict(repo_name='repo_group/source_repo')
80 user = User.get_by_username(self.request.GET.get('user')) or self._rhodecode_db_user
82 user = User.get_by_username(self.request.GET.get('user')) or self._rhodecode_db_user
@@ -83,6 +85,7 b' Check if we should use full-topic or min'
83 'added': ['aaaaaaabbbbb', 'cccccccddddddd'],
85 'added': ['aaaaaaabbbbb', 'cccccccddddddd'],
84 'removed': ['eeeeeeeeeee'],
86 'removed': ['eeeeeeeeeee'],
85 })
87 })
88
86 file_changes = AttributeDict({
89 file_changes = AttributeDict({
87 'added': ['a/file1.md', 'file2.py'],
90 'added': ['a/file1.md', 'file2.py'],
88 'modified': ['b/modified_file.rst'],
91 'modified': ['b/modified_file.rst'],
@@ -97,15 +100,19 b' Check if we should use full-topic or min'
97 'exc_message': 'Traceback (most recent call last):\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/tweens.py", line 41, in excview_tween\n response = handler(request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/router.py", line 148, in handle_request\n registry, request, context, context_iface, view_name\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/view.py", line 667, in _call_view\n response = view_callable(context, request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/config/views.py", line 188, in attr_view\n return view(context, request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/config/views.py", line 214, in predicate_wrapper\n return view(context, request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/viewderivers.py", line 401, in viewresult_to_response\n result = view(context, request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/viewderivers.py", line 132, in _class_view\n response = getattr(inst, attr)()\n File "/mnt/hgfs/marcink/workspace/rhodecode-enterprise-ce/rhodecode/apps/debug_style/views.py", line 355, in render_email\n template_type, **email_kwargs.get(email_id, {}))\n File "/mnt/hgfs/marcink/workspace/rhodecode-enterprise-ce/rhodecode/model/notification.py", line 402, in render_email\n body = email_template.render(None, **_kwargs)\n File "/mnt/hgfs/marcink/workspace/rhodecode-enterprise-ce/rhodecode/lib/partial_renderer.py", line 95, in render\n return self._render_with_exc(tmpl, args, kwargs)\n File "/mnt/hgfs/marcink/workspace/rhodecode-enterprise-ce/rhodecode/lib/partial_renderer.py", line 79, in _render_with_exc\n return render_func.render(*args, **kwargs)\n File "/nix/store/dakh34sxz4yfr435c0cwjz0sd6hnd5g3-python2.7-mako-1.1.0/lib/python2.7/site-packages/mako/template.py", line 476, in render\n return runtime._render(self, self.callable_, args, data)\n File "/nix/store/dakh34sxz4yfr435c0cwjz0sd6hnd5g3-python2.7-mako-1.1.0/lib/python2.7/site-packages/mako/runtime.py", line 883, in _render\n **_kwargs_for_callable(callable_, data)\n File "/nix/store/dakh34sxz4yfr435c0cwjz0sd6hnd5g3-python2.7-mako-1.1.0/lib/python2.7/site-packages/mako/runtime.py", line 920, in _render_context\n _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)\n File "/nix/store/dakh34sxz4yfr435c0cwjz0sd6hnd5g3-python2.7-mako-1.1.0/lib/python2.7/site-packages/mako/runtime.py", line 947, in _exec_template\n callable_(context, *args, **kwargs)\n File "rhodecode_templates_email_templates_base_mako", line 63, in render_body\n File "rhodecode_templates_email_templates_exception_tracker_mako", line 43, in render_body\nAttributeError: \'str\' object has no attribute \'get\'\n',
100 'exc_message': 'Traceback (most recent call last):\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/tweens.py", line 41, in excview_tween\n response = handler(request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/router.py", line 148, in handle_request\n registry, request, context, context_iface, view_name\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/view.py", line 667, in _call_view\n response = view_callable(context, request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/config/views.py", line 188, in attr_view\n return view(context, request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/config/views.py", line 214, in predicate_wrapper\n return view(context, request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/viewderivers.py", line 401, in viewresult_to_response\n result = view(context, request)\n File "/nix/store/s43k2r9rysfbzmsjdqnxgzvvb7zjhkxb-python2.7-pyramid-1.10.4/lib/python2.7/site-packages/pyramid/viewderivers.py", line 132, in _class_view\n response = getattr(inst, attr)()\n File "/mnt/hgfs/marcink/workspace/rhodecode-enterprise-ce/rhodecode/apps/debug_style/views.py", line 355, in render_email\n template_type, **email_kwargs.get(email_id, {}))\n File "/mnt/hgfs/marcink/workspace/rhodecode-enterprise-ce/rhodecode/model/notification.py", line 402, in render_email\n body = email_template.render(None, **_kwargs)\n File "/mnt/hgfs/marcink/workspace/rhodecode-enterprise-ce/rhodecode/lib/partial_renderer.py", line 95, in render\n return self._render_with_exc(tmpl, args, kwargs)\n File "/mnt/hgfs/marcink/workspace/rhodecode-enterprise-ce/rhodecode/lib/partial_renderer.py", line 79, in _render_with_exc\n return render_func.render(*args, **kwargs)\n File "/nix/store/dakh34sxz4yfr435c0cwjz0sd6hnd5g3-python2.7-mako-1.1.0/lib/python2.7/site-packages/mako/template.py", line 476, in render\n return runtime._render(self, self.callable_, args, data)\n File "/nix/store/dakh34sxz4yfr435c0cwjz0sd6hnd5g3-python2.7-mako-1.1.0/lib/python2.7/site-packages/mako/runtime.py", line 883, in _render\n **_kwargs_for_callable(callable_, data)\n File "/nix/store/dakh34sxz4yfr435c0cwjz0sd6hnd5g3-python2.7-mako-1.1.0/lib/python2.7/site-packages/mako/runtime.py", line 920, in _render_context\n _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)\n File "/nix/store/dakh34sxz4yfr435c0cwjz0sd6hnd5g3-python2.7-mako-1.1.0/lib/python2.7/site-packages/mako/runtime.py", line 947, in _exec_template\n callable_(context, *args, **kwargs)\n File "rhodecode_templates_email_templates_base_mako", line 63, in render_body\n File "rhodecode_templates_email_templates_exception_tracker_mako", line 43, in render_body\nAttributeError: \'str\' object has no attribute \'get\'\n',
98 'exc_type': 'AttributeError'
101 'exc_type': 'AttributeError'
99 }
102 }
103
100 email_kwargs = {
104 email_kwargs = {
101 'test': {},
105 'test': {},
106
102 'message': {
107 'message': {
103 'body': 'message body !'
108 'body': 'message body !'
104 },
109 },
110
105 'email_test': {
111 'email_test': {
106 'user': user,
112 'user': user,
107 'date': datetime.datetime.now(),
113 'date': datetime.datetime.now(),
108 },
114 },
115
109 'exception': {
116 'exception': {
110 'email_prefix': '[RHODECODE ERROR]',
117 'email_prefix': '[RHODECODE ERROR]',
111 'exc_id': exc_traceback['exc_id'],
118 'exc_id': exc_traceback['exc_id'],
@@ -113,6 +120,7 b' Check if we should use full-topic or min'
113 'exc_type_name': 'NameError',
120 'exc_type_name': 'NameError',
114 'exc_traceback': exc_traceback,
121 'exc_traceback': exc_traceback,
115 },
122 },
123
116 'password_reset': {
124 'password_reset': {
117 'password_reset_url': 'http://example.com/reset-rhodecode-password/token',
125 'password_reset_url': 'http://example.com/reset-rhodecode-password/token',
118
126
@@ -121,6 +129,7 b' Check if we should use full-topic or min'
121 'email': 'test@rhodecode.com',
129 'email': 'test@rhodecode.com',
122 'first_admin_email': User.get_first_super_admin().email
130 'first_admin_email': User.get_first_super_admin().email
123 },
131 },
132
124 'password_reset_confirmation': {
133 'password_reset_confirmation': {
125 'new_password': 'new-password-example',
134 'new_password': 'new-password-example',
126 'user': user,
135 'user': user,
@@ -128,6 +137,7 b' Check if we should use full-topic or min'
128 'email': 'test@rhodecode.com',
137 'email': 'test@rhodecode.com',
129 'first_admin_email': User.get_first_super_admin().email
138 'first_admin_email': User.get_first_super_admin().email
130 },
139 },
140
131 'registration': {
141 'registration': {
132 'user': user,
142 'user': user,
133 'date': datetime.datetime.now(),
143 'date': datetime.datetime.now(),
@@ -161,6 +171,7 b' Check if we should use full-topic or min'
161 'mention': True,
171 'mention': True,
162
172
163 },
173 },
174
164 'pull_request_comment+status': {
175 'pull_request_comment+status': {
165 'user': user,
176 'user': user,
166
177
@@ -201,6 +212,7 b' def db():'
201 'mention': True,
212 'mention': True,
202
213
203 },
214 },
215
204 'pull_request_comment+file': {
216 'pull_request_comment+file': {
205 'user': user,
217 'user': user,
206
218
@@ -303,6 +315,7 b' This should work better !'
303 'renderer_type': 'markdown',
315 'renderer_type': 'markdown',
304 'mention': True,
316 'mention': True,
305 },
317 },
318
306 'cs_comment+status': {
319 'cs_comment+status': {
307 'user': user,
320 'user': user,
308 'commit': AttributeDict(idx=123, raw_id='a' * 40, message='Commit message'),
321 'commit': AttributeDict(idx=123, raw_id='a' * 40, message='Commit message'),
@@ -328,6 +341,7 b' This is a multiline comment :)'
328 'renderer_type': 'markdown',
341 'renderer_type': 'markdown',
329 'mention': True,
342 'mention': True,
330 },
343 },
344
331 'cs_comment+file': {
345 'cs_comment+file': {
332 'user': user,
346 'user': user,
333 'commit': AttributeDict(idx=123, raw_id='a' * 40, message='Commit message'),
347 'commit': AttributeDict(idx=123, raw_id='a' * 40, message='Commit message'),
@@ -348,12 +362,37 b' This is a multiline comment :)'
348 'renderer_type': 'markdown',
362 'renderer_type': 'markdown',
349 'mention': True,
363 'mention': True,
350 },
364 },
351
365
352 'pull_request': {
366 'pull_request': {
353 'user': user,
367 'user': user,
354 'pull_request': pr,
368 'pull_request': pr,
355 'pull_request_commits': [
369 'pull_request_commits': [
356 ('472d1df03bf7206e278fcedc6ac92b46b01c4e21', '''\
370 ('472d1df03bf7206e278fcedc6ac92b46b01c4e21', '''\
371 my-account: moved email closer to profile as it's similar data just moved outside.
372 '''),
373 ('cbfa3061b6de2696c7161ed15ba5c6a0045f90a7', '''\
374 users: description edit fixes
375
376 - tests
377 - added metatags info
378 '''),
379 ],
380
381 'pull_request_target_repo': target_repo,
382 'pull_request_target_repo_url': 'http://target-repo/url',
383
384 'pull_request_source_repo': source_repo,
385 'pull_request_source_repo_url': 'http://source-repo/url',
386
387 'pull_request_url': 'http://code.rhodecode.com/_pull-request/123',
388 'user_role': 'reviewer',
389 },
390
391 'pull_request+reviewer_role': {
392 'user': user,
393 'pull_request': pr,
394 'pull_request_commits': [
395 ('472d1df03bf7206e278fcedc6ac92b46b01c4e21', '''\
357 my-account: moved email closer to profile as it's similar data just moved outside.
396 my-account: moved email closer to profile as it's similar data just moved outside.
358 '''),
397 '''),
359 ('cbfa3061b6de2696c7161ed15ba5c6a0045f90a7', '''\
398 ('cbfa3061b6de2696c7161ed15ba5c6a0045f90a7', '''\
@@ -371,8 +410,33 b' users: description edit fixes'
371 'pull_request_source_repo_url': 'http://source-repo/url',
410 'pull_request_source_repo_url': 'http://source-repo/url',
372
411
373 'pull_request_url': 'http://code.rhodecode.com/_pull-request/123',
412 'pull_request_url': 'http://code.rhodecode.com/_pull-request/123',
413 'user_role': 'reviewer',
414 },
415
416 'pull_request+observer_role': {
417 'user': user,
418 'pull_request': pr,
419 'pull_request_commits': [
420 ('472d1df03bf7206e278fcedc6ac92b46b01c4e21', '''\
421 my-account: moved email closer to profile as it's similar data just moved outside.
422 '''),
423 ('cbfa3061b6de2696c7161ed15ba5c6a0045f90a7', '''\
424 users: description edit fixes
425
426 - tests
427 - added metatags info
428 '''),
429 ],
430
431 'pull_request_target_repo': target_repo,
432 'pull_request_target_repo_url': 'http://target-repo/url',
433
434 'pull_request_source_repo': source_repo,
435 'pull_request_source_repo_url': 'http://source-repo/url',
436
437 'pull_request_url': 'http://code.rhodecode.com/_pull-request/123',
438 'user_role': 'observer'
374 }
439 }
375
376 }
440 }
377
441
378 template_type = email_id.split('+')[0]
442 template_type = email_id.split('+')[0]
@@ -401,6 +465,7 b' users: description edit fixes'
401 c = self.load_default_context()
465 c = self.load_default_context()
402 c.active = os.path.splitext(t_path)[0]
466 c.active = os.path.splitext(t_path)[0]
403 c.came_from = ''
467 c.came_from = ''
468 # NOTE(marcink): extend the email types with variations based on data sets
404 c.email_types = {
469 c.email_types = {
405 'cs_comment+file': {},
470 'cs_comment+file': {},
406 'cs_comment+status': {},
471 'cs_comment+status': {},
@@ -409,6 +474,9 b' users: description edit fixes'
409 'pull_request_comment+status': {},
474 'pull_request_comment+status': {},
410
475
411 'pull_request_update': {},
476 'pull_request_update': {},
477
478 'pull_request+reviewer_role': {},
479 'pull_request+observer_role': {},
412 }
480 }
413 c.email_types.update(EmailNotificationModel.email_types)
481 c.email_types.update(EmailNotificationModel.email_types)
414
482
@@ -32,7 +32,7 b' from rhodecode.lib.auth import ('
32 HasRepoGroupPermissionAny, AuthUser)
32 HasRepoGroupPermissionAny, AuthUser)
33 from rhodecode.lib.codeblocks import filenode_as_lines_tokens
33 from rhodecode.lib.codeblocks import filenode_as_lines_tokens
34 from rhodecode.lib.index import searcher_from_config
34 from rhodecode.lib.index import searcher_from_config
35 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
35 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int, safe_str
36 from rhodecode.lib.vcs.nodes import FileNode
36 from rhodecode.lib.vcs.nodes import FileNode
37 from rhodecode.model.db import (
37 from rhodecode.model.db import (
38 func, true, or_, case, cast, in_filter_generator, String, Session,
38 func, true, or_, case, cast, in_filter_generator, String, Session,
@@ -331,7 +331,8 b' class HomeView(BaseAppView, DataGridAppV'
331 {
331 {
332 'id': obj.pull_request_id,
332 'id': obj.pull_request_id,
333 'value': org_query,
333 'value': org_query,
334 'value_display': 'pull request: `!{} - {}`'.format(obj.pull_request_id, obj.title[:50]),
334 'value_display': 'pull request: `!{} - {}`'.format(
335 obj.pull_request_id, safe_str(obj.title[:50])),
335 'type': 'pull_request',
336 'type': 'pull_request',
336 'url': h.route_path('pull_requests_global', pull_request_id=obj.pull_request_id)
337 'url': h.route_path('pull_requests_global', pull_request_id=obj.pull_request_id)
337 }
338 }
@@ -734,8 +734,8 b' class MyAccountView(BaseAppView, DataGri'
734 comments_model = CommentsModel()
734 comments_model = CommentsModel()
735 for pr in pull_requests:
735 for pr in pull_requests:
736 repo_id = pr.target_repo_id
736 repo_id = pr.target_repo_id
737 comments = comments_model.get_all_comments(
737 comments_count = comments_model.get_all_comments(
738 repo_id, pull_request=pr)
738 repo_id, pull_request=pr, count_only=True)
739 owned = pr.user_id == self._rhodecode_user.user_id
739 owned = pr.user_id == self._rhodecode_user.user_id
740
740
741 data.append({
741 data.append({
@@ -760,8 +760,8 b' class MyAccountView(BaseAppView, DataGri'
760 'author': _render('pullrequest_author',
760 'author': _render('pullrequest_author',
761 pr.author.full_contact, ),
761 pr.author.full_contact, ),
762 'author_raw': pr.author.full_name,
762 'author_raw': pr.author.full_name,
763 'comments': _render('pullrequest_comments', len(comments)),
763 'comments': _render('pullrequest_comments', comments_count),
764 'comments_raw': len(comments),
764 'comments_raw': comments_count,
765 'closed': pr.is_closed(),
765 'closed': pr.is_closed(),
766 'owned': owned
766 'owned': owned
767 })
767 })
@@ -523,7 +523,9 b' class TestPullrequestsView(object):'
523 pull_request = pr_util.create_pull_request()
523 pull_request = pr_util.create_pull_request()
524 pull_request_id = pull_request.pull_request_id
524 pull_request_id = pull_request.pull_request_id
525 PullRequestModel().update_reviewers(
525 PullRequestModel().update_reviewers(
526 pull_request_id, [(1, ['reason'], False, []), (2, ['reason2'], False, [])],
526 pull_request_id, [
527 (1, ['reason'], False, 'reviewer', []),
528 (2, ['reason2'], False, 'reviewer', [])],
527 pull_request.author)
529 pull_request.author)
528 author = pull_request.user_id
530 author = pull_request.user_id
529 repo = pull_request.target_repo.repo_id
531 repo = pull_request.target_repo.repo_id
@@ -906,12 +908,13 b' class TestPullrequestsView(object):'
906
908
907 # Change reviewers and check that a notification was made
909 # Change reviewers and check that a notification was made
908 PullRequestModel().update_reviewers(
910 PullRequestModel().update_reviewers(
909 pull_request.pull_request_id, [(1, [], False, [])],
911 pull_request.pull_request_id, [
912 (1, [], False, 'reviewer', [])
913 ],
910 pull_request.author)
914 pull_request.author)
911 assert len(notifications.all()) == 2
915 assert len(notifications.all()) == 2
912
916
913 def test_create_pull_request_stores_ancestor_commit_id(self, backend,
917 def test_create_pull_request_stores_ancestor_commit_id(self, backend, csrf_token):
914 csrf_token):
915 commits = [
918 commits = [
916 {'message': 'ancestor',
919 {'message': 'ancestor',
917 'added': [FileNode('file_A', content='content_of_ancestor')]},
920 'added': [FileNode('file_A', content='content_of_ancestor')]},
@@ -18,14 +18,16 b''
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 from rhodecode.lib import helpers as h
21 from rhodecode.lib import helpers as h, rc_cache
22 from rhodecode.lib.utils2 import safe_int
22 from rhodecode.lib.utils2 import safe_int
23 from rhodecode.model.pull_request import get_diff_info
23 from rhodecode.model.pull_request import get_diff_info
24
24 from rhodecode.model.db import PullRequestReviewers
25 REVIEWER_API_VERSION = 'V3'
25 # V3 - Reviewers, with default rules data
26 # v4 - Added observers metadata
27 REVIEWER_API_VERSION = 'V4'
26
28
27
29
28 def reviewer_as_json(user, reasons=None, mandatory=False, rules=None, user_group=None):
30 def reviewer_as_json(user, reasons=None, role=None, mandatory=False, rules=None, user_group=None):
29 """
31 """
30 Returns json struct of a reviewer for frontend
32 Returns json struct of a reviewer for frontend
31
33
@@ -33,11 +35,15 b' def reviewer_as_json(user, reasons=None,'
33 :param reasons: list of strings of why they are reviewers
35 :param reasons: list of strings of why they are reviewers
34 :param mandatory: bool, to set user as mandatory
36 :param mandatory: bool, to set user as mandatory
35 """
37 """
38 role = role or PullRequestReviewers.ROLE_REVIEWER
39 if role not in PullRequestReviewers.ROLES:
40 raise ValueError('role is not one of %s', PullRequestReviewers.ROLES)
36
41
37 return {
42 return {
38 'user_id': user.user_id,
43 'user_id': user.user_id,
39 'reasons': reasons or [],
44 'reasons': reasons or [],
40 'rules': rules or [],
45 'rules': rules or [],
46 'role': role,
41 'mandatory': mandatory,
47 'mandatory': mandatory,
42 'user_group': user_group,
48 'user_group': user_group,
43 'username': user.username,
49 'username': user.username,
@@ -48,21 +54,36 b' def reviewer_as_json(user, reasons=None,'
48 }
54 }
49
55
50
56
51 def get_default_reviewers_data(
57 def to_reviewers(e):
52 current_user, source_repo, source_commit, target_repo, target_commit):
58 if isinstance(e, (tuple, list)):
59 return map(reviewer_as_json, e)
60 else:
61 return reviewer_as_json(e)
62
63
64 def get_default_reviewers_data(current_user, source_repo, source_ref, target_repo, target_ref,
65 include_diff_info=True):
53 """
66 """
54 Return json for default reviewers of a repository
67 Return json for default reviewers of a repository
55 """
68 """
56
69
57 diff_info = get_diff_info(
70 diff_info = {}
58 source_repo, source_commit.raw_id, target_repo, target_commit.raw_id)
71 if include_diff_info:
72 diff_info = get_diff_info(
73 source_repo, source_ref.commit_id, target_repo, target_ref.commit_id)
59
74
60 reasons = ['Default reviewer', 'Repository owner']
75 reasons = ['Default reviewer', 'Repository owner']
61 json_reviewers = [reviewer_as_json(
76 json_reviewers = [reviewer_as_json(
62 user=target_repo.user, reasons=reasons, mandatory=False, rules=None)]
77 user=target_repo.user, reasons=reasons, mandatory=False, rules=None, role=None)]
78
79 compute_key = rc_cache.utils.compute_key_from_params(
80 current_user.user_id, source_repo.repo_id, source_ref.type, source_ref.name,
81 source_ref.commit_id, target_repo.repo_id, target_ref.type, target_ref.name,
82 target_ref.commit_id)
63
83
64 return {
84 return {
65 'api_ver': REVIEWER_API_VERSION, # define version for later possible schema upgrade
85 'api_ver': REVIEWER_API_VERSION, # define version for later possible schema upgrade
86 'compute_key': compute_key,
66 'diff_info': diff_info,
87 'diff_info': diff_info,
67 'reviewers': json_reviewers,
88 'reviewers': json_reviewers,
68 'rules': {},
89 'rules': {},
@@ -73,15 +94,18 b' def get_default_reviewers_data('
73 def validate_default_reviewers(review_members, reviewer_rules):
94 def validate_default_reviewers(review_members, reviewer_rules):
74 """
95 """
75 Function to validate submitted reviewers against the saved rules
96 Function to validate submitted reviewers against the saved rules
76
77 """
97 """
78 reviewers = []
98 reviewers = []
79 reviewer_by_id = {}
99 reviewer_by_id = {}
80 for r in review_members:
100 for r in review_members:
81 reviewer_user_id = safe_int(r['user_id'])
101 reviewer_user_id = safe_int(r['user_id'])
82 entry = (reviewer_user_id, r['reasons'], r['mandatory'], r['rules'])
102 entry = (reviewer_user_id, r['reasons'], r['mandatory'], r['role'], r['rules'])
83
103
84 reviewer_by_id[reviewer_user_id] = entry
104 reviewer_by_id[reviewer_user_id] = entry
85 reviewers.append(entry)
105 reviewers.append(entry)
86
106
87 return reviewers
107 return reviewers
108
109
110 def validate_observers(observer_members, reviewer_rules):
111 return {}
@@ -31,7 +31,7 b' from rhodecode.apps._base import RepoApp'
31 from rhodecode.apps.file_store import utils as store_utils
31 from rhodecode.apps.file_store import utils as store_utils
32 from rhodecode.apps.file_store.exceptions import FileNotAllowedException, FileOverSizeException
32 from rhodecode.apps.file_store.exceptions import FileNotAllowedException, FileOverSizeException
33
33
34 from rhodecode.lib import diffs, codeblocks
34 from rhodecode.lib import diffs, codeblocks, channelstream
35 from rhodecode.lib.auth import (
35 from rhodecode.lib.auth import (
36 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, CSRFRequired)
36 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, CSRFRequired)
37 from rhodecode.lib.ext_json import json
37 from rhodecode.lib.ext_json import json
@@ -170,7 +170,9 b' class RepoCommitsView(RepoAppView):'
170 )
170 )
171 reviewers_duplicates.add(_user_id)
171 reviewers_duplicates.add(_user_id)
172
172
173 c.allowed_reviewers = reviewers
173 c.reviewers_count = len(reviewers)
174 c.observers_count = 0
175
174 # from associated statuses, check the pull requests, and
176 # from associated statuses, check the pull requests, and
175 # show comments from them
177 # show comments from them
176 for pr in prs:
178 for pr in prs:
@@ -193,7 +195,7 b' class RepoCommitsView(RepoAppView):'
193
195
194 for review_obj, member, reasons, mandatory, status in review_statuses:
196 for review_obj, member, reasons, mandatory, status in review_statuses:
195 member_reviewer = h.reviewer_as_json(
197 member_reviewer = h.reviewer_as_json(
196 member, reasons=reasons, mandatory=mandatory,
198 member, reasons=reasons, mandatory=mandatory, role=None,
197 user_group=None
199 user_group=None
198 )
200 )
199
201
@@ -207,10 +209,7 b' class RepoCommitsView(RepoAppView):'
207
209
208 # NOTE(marcink): this uses the same voting logic as in pull-requests
210 # NOTE(marcink): this uses the same voting logic as in pull-requests
209 c.commit_review_status = ChangesetStatusModel().calculate_status(review_statuses)
211 c.commit_review_status = ChangesetStatusModel().calculate_status(review_statuses)
210 c.commit_broadcast_channel = u'/repo${}$/commit/{}'.format(
212 c.commit_broadcast_channel = channelstream.comment_channel(c.repo_name, commit_obj=commit)
211 c.repo_name,
212 commit.raw_id
213 )
214
213
215 diff = None
214 diff = None
216 # Iterate over ranges (default commit view is always one commit)
215 # Iterate over ranges (default commit view is always one commit)
@@ -414,6 +413,7 b' class RepoCommitsView(RepoAppView):'
414 resolves_comment_id=resolves_comment_id,
413 resolves_comment_id=resolves_comment_id,
415 auth_user=self._rhodecode_user
414 auth_user=self._rhodecode_user
416 )
415 )
416 is_inline = comment.is_inline
417
417
418 # get status if set !
418 # get status if set !
419 if status:
419 if status:
@@ -461,6 +461,16 b' class RepoCommitsView(RepoAppView):'
461 data.update(comment.get_dict())
461 data.update(comment.get_dict())
462 data.update({'rendered_text': rendered_comment})
462 data.update({'rendered_text': rendered_comment})
463
463
464 comment_broadcast_channel = channelstream.comment_channel(
465 self.db_repo_name, commit_obj=commit)
466
467 comment_data = data
468 comment_type = 'inline' if is_inline else 'general'
469 channelstream.comment_channelstream_push(
470 self.request, comment_broadcast_channel, self._rhodecode_user,
471 _('posted a new {} comment').format(comment_type),
472 comment_data=comment_data)
473
464 return data
474 return data
465
475
466 @LoginRequired()
476 @LoginRequired()
@@ -39,14 +39,16 b' from rhodecode.lib.ext_json import json'
39 from rhodecode.lib.auth import (
39 from rhodecode.lib.auth import (
40 LoginRequired, HasRepoPermissionAny, HasRepoPermissionAnyDecorator,
40 LoginRequired, HasRepoPermissionAny, HasRepoPermissionAnyDecorator,
41 NotAnonymous, CSRFRequired)
41 NotAnonymous, CSRFRequired)
42 from rhodecode.lib.utils2 import str2bool, safe_str, safe_unicode, safe_int
42 from rhodecode.lib.utils2 import str2bool, safe_str, safe_unicode, safe_int, aslist
43 from rhodecode.lib.vcs.backends.base import EmptyCommit, UpdateFailureReason
43 from rhodecode.lib.vcs.backends.base import (
44 EmptyCommit, UpdateFailureReason, unicode_to_reference)
44 from rhodecode.lib.vcs.exceptions import (
45 from rhodecode.lib.vcs.exceptions import (
45 CommitDoesNotExistError, RepositoryRequirementError, EmptyRepositoryError)
46 CommitDoesNotExistError, RepositoryRequirementError, EmptyRepositoryError)
46 from rhodecode.model.changeset_status import ChangesetStatusModel
47 from rhodecode.model.changeset_status import ChangesetStatusModel
47 from rhodecode.model.comment import CommentsModel
48 from rhodecode.model.comment import CommentsModel
48 from rhodecode.model.db import (
49 from rhodecode.model.db import (
49 func, or_, PullRequest, ChangesetComment, ChangesetStatus, Repository)
50 func, or_, PullRequest, ChangesetComment, ChangesetStatus, Repository,
51 PullRequestReviewers)
50 from rhodecode.model.forms import PullRequestForm
52 from rhodecode.model.forms import PullRequestForm
51 from rhodecode.model.meta import Session
53 from rhodecode.model.meta import Session
52 from rhodecode.model.pull_request import PullRequestModel, MergeCheck
54 from rhodecode.model.pull_request import PullRequestModel, MergeCheck
@@ -104,13 +106,14 b' class RepoPullRequestsView(RepoAppView, '
104 data = []
106 data = []
105 comments_model = CommentsModel()
107 comments_model = CommentsModel()
106 for pr in pull_requests:
108 for pr in pull_requests:
107 comments = comments_model.get_all_comments(
109 comments_count = comments_model.get_all_comments(
108 self.db_repo.repo_id, pull_request=pr)
110 self.db_repo.repo_id, pull_request=pr, count_only=True)
109
111
110 data.append({
112 data.append({
111 'name': _render('pullrequest_name',
113 'name': _render('pullrequest_name',
112 pr.pull_request_id, pr.pull_request_state,
114 pr.pull_request_id, pr.pull_request_state,
113 pr.work_in_progress, pr.target_repo.repo_name),
115 pr.work_in_progress, pr.target_repo.repo_name,
116 short=True),
114 'name_raw': pr.pull_request_id,
117 'name_raw': pr.pull_request_id,
115 'status': _render('pullrequest_status',
118 'status': _render('pullrequest_status',
116 pr.calculated_review_status()),
119 pr.calculated_review_status()),
@@ -126,8 +129,8 b' class RepoPullRequestsView(RepoAppView, '
126 'author': _render('pullrequest_author',
129 'author': _render('pullrequest_author',
127 pr.author.full_contact, ),
130 pr.author.full_contact, ),
128 'author_raw': pr.author.full_name,
131 'author_raw': pr.author.full_name,
129 'comments': _render('pullrequest_comments', len(comments)),
132 'comments': _render('pullrequest_comments', comments_count),
130 'comments_raw': len(comments),
133 'comments_raw': comments_count,
131 'closed': pr.is_closed(),
134 'closed': pr.is_closed(),
132 })
135 })
133
136
@@ -310,8 +313,7 b' class RepoPullRequestsView(RepoAppView, '
310 pull_request_id = pull_request.pull_request_id
313 pull_request_id = pull_request.pull_request_id
311
314
312 c.state_progressing = pull_request.is_state_changing()
315 c.state_progressing = pull_request.is_state_changing()
313 c.pr_broadcast_channel = '/repo${}$/pr/{}'.format(
316 c.pr_broadcast_channel = channelstream.pr_channel(pull_request)
314 pull_request.target_repo.repo_name, pull_request.pull_request_id)
315
317
316 _new_state = {
318 _new_state = {
317 'created': PullRequest.STATE_CREATED,
319 'created': PullRequest.STATE_CREATED,
@@ -454,15 +456,18 b' class RepoPullRequestsView(RepoAppView, '
454 'rhodecode:templates/pullrequests/pullrequest_merge_checks.mako'
456 'rhodecode:templates/pullrequests/pullrequest_merge_checks.mako'
455 return self._get_template_context(c)
457 return self._get_template_context(c)
456
458
457 c.allowed_reviewers = [obj.user_id for obj in pull_request.reviewers if obj.user]
459 c.reviewers_count = pull_request.reviewers_count
460 c.observers_count = pull_request.observers_count
458
461
459 # reviewers and statuses
462 # reviewers and statuses
460 c.pull_request_default_reviewers_data_json = json.dumps(pull_request.reviewer_data)
463 c.pull_request_default_reviewers_data_json = json.dumps(pull_request.reviewer_data)
461 c.pull_request_set_reviewers_data_json = collections.OrderedDict({'reviewers': []})
464 c.pull_request_set_reviewers_data_json = collections.OrderedDict({'reviewers': []})
465 c.pull_request_set_observers_data_json = collections.OrderedDict({'observers': []})
462
466
463 for review_obj, member, reasons, mandatory, status in pull_request_at_ver.reviewers_statuses():
467 for review_obj, member, reasons, mandatory, status in pull_request_at_ver.reviewers_statuses():
464 member_reviewer = h.reviewer_as_json(
468 member_reviewer = h.reviewer_as_json(
465 member, reasons=reasons, mandatory=mandatory,
469 member, reasons=reasons, mandatory=mandatory,
470 role=review_obj.role,
466 user_group=review_obj.rule_user_group_data()
471 user_group=review_obj.rule_user_group_data()
467 )
472 )
468
473
@@ -474,6 +479,17 b' class RepoPullRequestsView(RepoAppView, '
474
479
475 c.pull_request_set_reviewers_data_json = json.dumps(c.pull_request_set_reviewers_data_json)
480 c.pull_request_set_reviewers_data_json = json.dumps(c.pull_request_set_reviewers_data_json)
476
481
482 for observer_obj, member in pull_request_at_ver.observers():
483 member_observer = h.reviewer_as_json(
484 member, reasons=[], mandatory=False,
485 role=observer_obj.role,
486 user_group=observer_obj.rule_user_group_data()
487 )
488 member_observer['allowed_to_update'] = c.allowed_to_update
489 c.pull_request_set_observers_data_json['observers'].append(member_observer)
490
491 c.pull_request_set_observers_data_json = json.dumps(c.pull_request_set_observers_data_json)
492
477 general_comments, inline_comments = \
493 general_comments, inline_comments = \
478 self.register_comments_vars(c, pull_request_latest, versions)
494 self.register_comments_vars(c, pull_request_latest, versions)
479
495
@@ -745,7 +761,9 b' class RepoPullRequestsView(RepoAppView, '
745
761
746 # current user review statuses for each version
762 # current user review statuses for each version
747 c.review_versions = {}
763 c.review_versions = {}
748 if self._rhodecode_user.user_id in c.allowed_reviewers:
764 is_reviewer = PullRequestModel().is_user_reviewer(
765 pull_request, self._rhodecode_user)
766 if is_reviewer:
749 for co in general_comments:
767 for co in general_comments:
750 if co.author.user_id == self._rhodecode_user.user_id:
768 if co.author.user_id == self._rhodecode_user.user_id:
751 status = co.status_change
769 status = co.status_change
@@ -961,13 +979,16 b' class RepoPullRequestsView(RepoAppView, '
961 }
979 }
962 return data
980 return data
963
981
982 def _get_existing_ids(self, post_data):
983 return filter(lambda e: e, map(safe_int, aslist(post_data.get('comments'), ',')))
984
964 @LoginRequired()
985 @LoginRequired()
965 @NotAnonymous()
986 @NotAnonymous()
966 @HasRepoPermissionAnyDecorator(
987 @HasRepoPermissionAnyDecorator(
967 'repository.read', 'repository.write', 'repository.admin')
988 'repository.read', 'repository.write', 'repository.admin')
968 @view_config(
989 @view_config(
969 route_name='pullrequest_comments', request_method='POST',
990 route_name='pullrequest_comments', request_method='POST',
970 renderer='string', xhr=True)
991 renderer='string_html', xhr=True)
971 def pullrequest_comments(self):
992 def pullrequest_comments(self):
972 self.load_default_context()
993 self.load_default_context()
973
994
@@ -997,8 +1018,7 b' class RepoPullRequestsView(RepoAppView, '
997 self.register_comments_vars(c, pull_request_latest, versions)
1018 self.register_comments_vars(c, pull_request_latest, versions)
998 all_comments = c.inline_comments_flat + c.comments
1019 all_comments = c.inline_comments_flat + c.comments
999
1020
1000 existing_ids = filter(
1021 existing_ids = self._get_existing_ids(self.request.POST)
1001 lambda e: e, map(safe_int, self.request.POST.getall('comments[]')))
1002 return _render('comments_table', all_comments, len(all_comments),
1022 return _render('comments_table', all_comments, len(all_comments),
1003 existing_ids=existing_ids)
1023 existing_ids=existing_ids)
1004
1024
@@ -1008,7 +1028,7 b' class RepoPullRequestsView(RepoAppView, '
1008 'repository.read', 'repository.write', 'repository.admin')
1028 'repository.read', 'repository.write', 'repository.admin')
1009 @view_config(
1029 @view_config(
1010 route_name='pullrequest_todos', request_method='POST',
1030 route_name='pullrequest_todos', request_method='POST',
1011 renderer='string', xhr=True)
1031 renderer='string_html', xhr=True)
1012 def pullrequest_todos(self):
1032 def pullrequest_todos(self):
1013 self.load_default_context()
1033 self.load_default_context()
1014
1034
@@ -1040,8 +1060,7 b' class RepoPullRequestsView(RepoAppView, '
1040 .get_pull_request_resolved_todos(pull_request)
1060 .get_pull_request_resolved_todos(pull_request)
1041
1061
1042 all_comments = c.unresolved_comments + c.resolved_comments
1062 all_comments = c.unresolved_comments + c.resolved_comments
1043 existing_ids = filter(
1063 existing_ids = self._get_existing_ids(self.request.POST)
1044 lambda e: e, map(safe_int, self.request.POST.getall('comments[]')))
1045 return _render('comments_table', all_comments, len(c.unresolved_comments),
1064 return _render('comments_table', all_comments, len(c.unresolved_comments),
1046 todo_comments=True, existing_ids=existing_ids)
1065 todo_comments=True, existing_ids=existing_ids)
1047
1066
@@ -1128,30 +1147,35 b' class RepoPullRequestsView(RepoAppView, '
1128 source_scm = source_db_repo.scm_instance()
1147 source_scm = source_db_repo.scm_instance()
1129 target_scm = target_db_repo.scm_instance()
1148 target_scm = target_db_repo.scm_instance()
1130
1149
1131 source_commit = source_scm.get_commit(source_ref.split(':')[-1])
1150 source_ref_obj = unicode_to_reference(source_ref)
1132 target_commit = target_scm.get_commit(target_ref.split(':')[-1])
1151 target_ref_obj = unicode_to_reference(target_ref)
1152
1153 source_commit = source_scm.get_commit(source_ref_obj.commit_id)
1154 target_commit = target_scm.get_commit(target_ref_obj.commit_id)
1133
1155
1134 ancestor = source_scm.get_common_ancestor(
1156 ancestor = source_scm.get_common_ancestor(
1135 source_commit.raw_id, target_commit.raw_id, target_scm)
1157 source_commit.raw_id, target_commit.raw_id, target_scm)
1136
1158
1137 # recalculate target ref based on ancestor
1159 # recalculate target ref based on ancestor
1138 target_ref_type, target_ref_name, __ = _form['target_ref'].split(':')
1160 target_ref = ':'.join((target_ref_obj.type, target_ref_obj.name, ancestor))
1139 target_ref = ':'.join((target_ref_type, target_ref_name, ancestor))
1140
1161
1141 get_default_reviewers_data, validate_default_reviewers = \
1162 get_default_reviewers_data, validate_default_reviewers, validate_observers = \
1142 PullRequestModel().get_reviewer_functions()
1163 PullRequestModel().get_reviewer_functions()
1143
1164
1144 # recalculate reviewers logic, to make sure we can validate this
1165 # recalculate reviewers logic, to make sure we can validate this
1145 reviewer_rules = get_default_reviewers_data(
1166 reviewer_rules = get_default_reviewers_data(
1146 self._rhodecode_db_user, source_db_repo,
1167 self._rhodecode_db_user,
1147 source_commit, target_db_repo, target_commit)
1168 source_db_repo,
1169 source_ref_obj,
1170 target_db_repo,
1171 target_ref_obj,
1172 include_diff_info=False)
1148
1173
1149 given_reviewers = _form['review_members']
1174 reviewers = validate_default_reviewers(_form['review_members'], reviewer_rules)
1150 reviewers = validate_default_reviewers(
1175 observers = validate_observers(_form['observer_members'], reviewer_rules)
1151 given_reviewers, reviewer_rules)
1152
1176
1153 pullrequest_title = _form['pullrequest_title']
1177 pullrequest_title = _form['pullrequest_title']
1154 title_source_ref = source_ref.split(':', 2)[1]
1178 title_source_ref = source_ref_obj.name
1155 if not pullrequest_title:
1179 if not pullrequest_title:
1156 pullrequest_title = PullRequestModel().generate_pullrequest_title(
1180 pullrequest_title = PullRequestModel().generate_pullrequest_title(
1157 source=source_repo,
1181 source=source_repo,
@@ -1172,6 +1196,7 b' class RepoPullRequestsView(RepoAppView, '
1172 revisions=commit_ids,
1196 revisions=commit_ids,
1173 common_ancestor_id=common_ancestor_id,
1197 common_ancestor_id=common_ancestor_id,
1174 reviewers=reviewers,
1198 reviewers=reviewers,
1199 observers=observers,
1175 title=pullrequest_title,
1200 title=pullrequest_title,
1176 description=description,
1201 description=description,
1177 description_renderer=description_renderer,
1202 description_renderer=description_renderer,
@@ -1221,20 +1246,28 b' class RepoPullRequestsView(RepoAppView, '
1221 'redirect_url': redirect_url}
1246 'redirect_url': redirect_url}
1222
1247
1223 is_state_changing = pull_request.is_state_changing()
1248 is_state_changing = pull_request.is_state_changing()
1224 c.pr_broadcast_channel = '/repo${}$/pr/{}'.format(
1249 c.pr_broadcast_channel = channelstream.pr_channel(pull_request)
1225 pull_request.target_repo.repo_name, pull_request.pull_request_id)
1226
1250
1227 # only owner or admin can update it
1251 # only owner or admin can update it
1228 allowed_to_update = PullRequestModel().check_user_update(
1252 allowed_to_update = PullRequestModel().check_user_update(
1229 pull_request, self._rhodecode_user)
1253 pull_request, self._rhodecode_user)
1254
1230 if allowed_to_update:
1255 if allowed_to_update:
1231 controls = peppercorn.parse(self.request.POST.items())
1256 controls = peppercorn.parse(self.request.POST.items())
1232 force_refresh = str2bool(self.request.POST.get('force_refresh'))
1257 force_refresh = str2bool(self.request.POST.get('force_refresh'))
1233
1258
1234 if 'review_members' in controls:
1259 if 'review_members' in controls:
1235 self._update_reviewers(
1260 self._update_reviewers(
1261 c,
1236 pull_request, controls['review_members'],
1262 pull_request, controls['review_members'],
1237 pull_request.reviewer_data)
1263 pull_request.reviewer_data,
1264 PullRequestReviewers.ROLE_REVIEWER)
1265 elif 'observer_members' in controls:
1266 self._update_reviewers(
1267 c,
1268 pull_request, controls['observer_members'],
1269 pull_request.reviewer_data,
1270 PullRequestReviewers.ROLE_OBSERVER)
1238 elif str2bool(self.request.POST.get('update_commits', 'false')):
1271 elif str2bool(self.request.POST.get('update_commits', 'false')):
1239 if is_state_changing:
1272 if is_state_changing:
1240 log.debug('commits update: forbidden because pull request is in state %s',
1273 log.debug('commits update: forbidden because pull request is in state %s',
@@ -1255,6 +1288,7 b' class RepoPullRequestsView(RepoAppView, '
1255 elif str2bool(self.request.POST.get('edit_pull_request', 'false')):
1288 elif str2bool(self.request.POST.get('edit_pull_request', 'false')):
1256 self._edit_pull_request(pull_request)
1289 self._edit_pull_request(pull_request)
1257 else:
1290 else:
1291 log.error('Unhandled update data.')
1258 raise HTTPBadRequest()
1292 raise HTTPBadRequest()
1259
1293
1260 return {'response': True,
1294 return {'response': True,
@@ -1262,6 +1296,9 b' class RepoPullRequestsView(RepoAppView, '
1262 raise HTTPForbidden()
1296 raise HTTPForbidden()
1263
1297
1264 def _edit_pull_request(self, pull_request):
1298 def _edit_pull_request(self, pull_request):
1299 """
1300 Edit title and description
1301 """
1265 _ = self.request.translate
1302 _ = self.request.translate
1266
1303
1267 try:
1304 try:
@@ -1302,27 +1339,15 b' class RepoPullRequestsView(RepoAppView, '
1302
1339
1303 msg = _(u'Pull request updated to "{source_commit_id}" with '
1340 msg = _(u'Pull request updated to "{source_commit_id}" with '
1304 u'{count_added} added, {count_removed} removed commits. '
1341 u'{count_added} added, {count_removed} removed commits. '
1305 u'Source of changes: {change_source}')
1342 u'Source of changes: {change_source}.')
1306 msg = msg.format(
1343 msg = msg.format(
1307 source_commit_id=pull_request.source_ref_parts.commit_id,
1344 source_commit_id=pull_request.source_ref_parts.commit_id,
1308 count_added=len(resp.changes.added),
1345 count_added=len(resp.changes.added),
1309 count_removed=len(resp.changes.removed),
1346 count_removed=len(resp.changes.removed),
1310 change_source=changed)
1347 change_source=changed)
1311 h.flash(msg, category='success')
1348 h.flash(msg, category='success')
1312
1349 channelstream.pr_update_channelstream_push(
1313 message = msg + (
1350 self.request, c.pr_broadcast_channel, self._rhodecode_user, msg)
1314 ' - <a onclick="window.location.reload()">'
1315 '<strong>{}</strong></a>'.format(_('Reload page')))
1316
1317 message_obj = {
1318 'message': message,
1319 'level': 'success',
1320 'topic': '/notifications'
1321 }
1322
1323 channelstream.post_message(
1324 c.pr_broadcast_channel, message_obj, self._rhodecode_user.username,
1325 registry=self.request.registry)
1326 else:
1351 else:
1327 msg = PullRequestModel.UPDATE_STATUS_MESSAGES[resp.reason]
1352 msg = PullRequestModel.UPDATE_STATUS_MESSAGES[resp.reason]
1328 warning_reasons = [
1353 warning_reasons = [
@@ -1332,6 +1357,55 b' class RepoPullRequestsView(RepoAppView, '
1332 category = 'warning' if resp.reason in warning_reasons else 'error'
1357 category = 'warning' if resp.reason in warning_reasons else 'error'
1333 h.flash(msg, category=category)
1358 h.flash(msg, category=category)
1334
1359
1360 def _update_reviewers(self, c, pull_request, review_members, reviewer_rules, role):
1361 _ = self.request.translate
1362
1363 get_default_reviewers_data, validate_default_reviewers, validate_observers = \
1364 PullRequestModel().get_reviewer_functions()
1365
1366 if role == PullRequestReviewers.ROLE_REVIEWER:
1367 try:
1368 reviewers = validate_default_reviewers(review_members, reviewer_rules)
1369 except ValueError as e:
1370 log.error('Reviewers Validation: {}'.format(e))
1371 h.flash(e, category='error')
1372 return
1373
1374 old_calculated_status = pull_request.calculated_review_status()
1375 PullRequestModel().update_reviewers(
1376 pull_request, reviewers, self._rhodecode_db_user)
1377
1378 Session().commit()
1379
1380 msg = _('Pull request reviewers updated.')
1381 h.flash(msg, category='success')
1382 channelstream.pr_update_channelstream_push(
1383 self.request, c.pr_broadcast_channel, self._rhodecode_user, msg)
1384
1385 # trigger status changed if change in reviewers changes the status
1386 calculated_status = pull_request.calculated_review_status()
1387 if old_calculated_status != calculated_status:
1388 PullRequestModel().trigger_pull_request_hook(
1389 pull_request, self._rhodecode_user, 'review_status_change',
1390 data={'status': calculated_status})
1391
1392 elif role == PullRequestReviewers.ROLE_OBSERVER:
1393 try:
1394 observers = validate_observers(review_members, reviewer_rules)
1395 except ValueError as e:
1396 log.error('Observers Validation: {}'.format(e))
1397 h.flash(e, category='error')
1398 return
1399
1400 PullRequestModel().update_observers(
1401 pull_request, observers, self._rhodecode_db_user)
1402
1403 Session().commit()
1404 msg = _('Pull request observers updated.')
1405 h.flash(msg, category='success')
1406 channelstream.pr_update_channelstream_push(
1407 self.request, c.pr_broadcast_channel, self._rhodecode_user, msg)
1408
1335 @LoginRequired()
1409 @LoginRequired()
1336 @NotAnonymous()
1410 @NotAnonymous()
1337 @HasRepoPermissionAnyDecorator(
1411 @HasRepoPermissionAnyDecorator(
@@ -1408,32 +1482,6 b' class RepoPullRequestsView(RepoAppView, '
1408 msg = merge_resp.merge_status_message
1482 msg = merge_resp.merge_status_message
1409 h.flash(msg, category='error')
1483 h.flash(msg, category='error')
1410
1484
1411 def _update_reviewers(self, pull_request, review_members, reviewer_rules):
1412 _ = self.request.translate
1413
1414 get_default_reviewers_data, validate_default_reviewers = \
1415 PullRequestModel().get_reviewer_functions()
1416
1417 try:
1418 reviewers = validate_default_reviewers(review_members, reviewer_rules)
1419 except ValueError as e:
1420 log.error('Reviewers Validation: {}'.format(e))
1421 h.flash(e, category='error')
1422 return
1423
1424 old_calculated_status = pull_request.calculated_review_status()
1425 PullRequestModel().update_reviewers(
1426 pull_request, reviewers, self._rhodecode_user)
1427 h.flash(_('Pull request reviewers updated.'), category='success')
1428 Session().commit()
1429
1430 # trigger status changed if change in reviewers changes the status
1431 calculated_status = pull_request.calculated_review_status()
1432 if old_calculated_status != calculated_status:
1433 PullRequestModel().trigger_pull_request_hook(
1434 pull_request, self._rhodecode_user, 'review_status_change',
1435 data={'status': calculated_status})
1436
1437 @LoginRequired()
1485 @LoginRequired()
1438 @NotAnonymous()
1486 @NotAnonymous()
1439 @HasRepoPermissionAnyDecorator(
1487 @HasRepoPermissionAnyDecorator(
@@ -1488,8 +1536,7 b' class RepoPullRequestsView(RepoAppView, '
1488 allowed_to_comment = PullRequestModel().check_user_comment(
1536 allowed_to_comment = PullRequestModel().check_user_comment(
1489 pull_request, self._rhodecode_user)
1537 pull_request, self._rhodecode_user)
1490 if not allowed_to_comment:
1538 if not allowed_to_comment:
1491 log.debug(
1539 log.debug('comment: forbidden because pull request is from forbidden repo')
1492 'comment: forbidden because pull request is from forbidden repo')
1493 raise HTTPForbidden()
1540 raise HTTPForbidden()
1494
1541
1495 c = self.load_default_context()
1542 c = self.load_default_context()
@@ -1518,6 +1565,7 b' class RepoPullRequestsView(RepoAppView, '
1518 pull_request, self._rhodecode_user, self.db_repo, message=text,
1565 pull_request, self._rhodecode_user, self.db_repo, message=text,
1519 auth_user=self._rhodecode_user)
1566 auth_user=self._rhodecode_user)
1520 Session().flush()
1567 Session().flush()
1568 is_inline = comment.is_inline
1521
1569
1522 PullRequestModel().trigger_pull_request_hook(
1570 PullRequestModel().trigger_pull_request_hook(
1523 pull_request, self._rhodecode_user, 'comment',
1571 pull_request, self._rhodecode_user, 'comment',
@@ -1551,6 +1599,7 b' class RepoPullRequestsView(RepoAppView, '
1551 resolves_comment_id=resolves_comment_id,
1599 resolves_comment_id=resolves_comment_id,
1552 auth_user=self._rhodecode_user
1600 auth_user=self._rhodecode_user
1553 )
1601 )
1602 is_inline = comment.is_inline
1554
1603
1555 if allowed_to_change_status:
1604 if allowed_to_change_status:
1556 # calculate old status before we change it
1605 # calculate old status before we change it
@@ -1599,6 +1648,16 b' class RepoPullRequestsView(RepoAppView, '
1599 data.update(comment.get_dict())
1648 data.update(comment.get_dict())
1600 data.update({'rendered_text': rendered_comment})
1649 data.update({'rendered_text': rendered_comment})
1601
1650
1651 comment_broadcast_channel = channelstream.comment_channel(
1652 self.db_repo_name, pull_request_obj=pull_request)
1653
1654 comment_data = data
1655 comment_type = 'inline' if is_inline else 'general'
1656 channelstream.comment_channelstream_push(
1657 self.request, comment_broadcast_channel, self._rhodecode_user,
1658 _('posted a new {} comment').format(comment_type),
1659 comment_data=comment_data)
1660
1602 return data
1661 return data
1603
1662
1604 @LoginRequired()
1663 @LoginRequired()
@@ -25,6 +25,7 b' from pyramid.view import view_config'
25 from rhodecode.apps._base import RepoAppView
25 from rhodecode.apps._base import RepoAppView
26 from rhodecode.apps.repository.utils import get_default_reviewers_data
26 from rhodecode.apps.repository.utils import get_default_reviewers_data
27 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
27 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
28 from rhodecode.lib.vcs.backends.base import Reference
28 from rhodecode.model.db import Repository
29 from rhodecode.model.db import Repository
29
30
30 log = logging.getLogger(__name__)
31 log = logging.getLogger(__name__)
@@ -61,13 +62,28 b' class RepoReviewRulesView(RepoAppView):'
61 target_repo_name = request.GET.get('target_repo', source_repo_name)
62 target_repo_name = request.GET.get('target_repo', source_repo_name)
62 target_repo = Repository.get_by_repo_name(target_repo_name)
63 target_repo = Repository.get_by_repo_name(target_repo_name)
63
64
64 source_ref = request.GET['source_ref']
65 current_user = request.user.get_instance()
65 target_ref = request.GET['target_ref']
66
66 source_commit = source_repo.get_commit(source_ref)
67 source_commit_id = request.GET['source_ref']
67 target_commit = target_repo.get_commit(target_ref)
68 source_type = request.GET['source_ref_type']
69 source_name = request.GET['source_ref_name']
70
71 target_commit_id = request.GET['target_ref']
72 target_type = request.GET['target_ref_type']
73 target_name = request.GET['target_ref_name']
68
74
69 current_user = request.user.get_instance()
75 try:
70 review_data = get_default_reviewers_data(
76 review_data = get_default_reviewers_data(
71 current_user, source_repo, source_commit, target_repo, target_commit)
77 current_user,
78 source_repo,
79 Reference(source_type, source_name, source_commit_id),
80 target_repo,
81 Reference(target_type, target_name, target_commit_id)
82 )
83 except ValueError:
84 # No common ancestor
85 msg = "No Common ancestor found between target and source reference"
86 log.exception(msg)
87 return {'diff_info': {'error': msg}}
72
88
73 return review_data
89 return review_data
@@ -341,6 +341,10 b' def includeme(config):'
341 name='json_ext',
341 name='json_ext',
342 factory='rhodecode.lib.ext_json_renderer.pyramid_ext_json')
342 factory='rhodecode.lib.ext_json_renderer.pyramid_ext_json')
343
343
344 config.add_renderer(
345 name='string_html',
346 factory='rhodecode.lib.string_renderer.html')
347
344 # include RhodeCode plugins
348 # include RhodeCode plugins
345 includes = aslist(settings.get('rhodecode.includes', []))
349 includes = aslist(settings.get('rhodecode.includes', []))
346 for inc in includes:
350 for inc in includes:
@@ -408,6 +412,7 b' def sanitize_settings_and_apply_defaults'
408 """
412 """
409
413
410 settings.setdefault('rhodecode.edition', 'Community Edition')
414 settings.setdefault('rhodecode.edition', 'Community Edition')
415 settings.setdefault('rhodecode.edition_id', 'CE')
411
416
412 if 'mako.default_filters' not in settings:
417 if 'mako.default_filters' not in settings:
413 # set custom default filters if we don't have it defined
418 # set custom default filters if we don't have it defined
@@ -113,7 +113,7 b' def _commits_as_dict(event, commit_ids, '
113 cs_data['permalink_url'] = RepoModel().get_commit_url(
113 cs_data['permalink_url'] = RepoModel().get_commit_url(
114 repo, cs_data['raw_id'], request=event.request,
114 repo, cs_data['raw_id'], request=event.request,
115 permalink=True)
115 permalink=True)
116 urlified_message, issues_data = process_patterns(
116 urlified_message, issues_data, errors = process_patterns(
117 cs_data['message'], repo.repo_name)
117 cs_data['message'], repo.repo_name)
118 cs_data['issues'] = issues_data
118 cs_data['issues'] = issues_data
119 cs_data['message_html'] = urlify_commit_message(
119 cs_data['message_html'] = urlify_commit_message(
This diff has been collapsed as it changes many lines, (2262 lines changed) Show them Hide them
@@ -6,9 +6,9 b''
6 #, fuzzy
6 #, fuzzy
7 msgid ""
7 msgid ""
8 msgstr ""
8 msgstr ""
9 "Project-Id-Version: rhodecode-enterprise-ce 4.20.0\n"
9 "Project-Id-Version: rhodecode-enterprise-ce 4.21.0\n"
10 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
10 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
11 "POT-Creation-Date: 2020-07-20 11:46+0000\n"
11 "POT-Creation-Date: 2020-10-12 13:39+0000\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,6 +17,13 b' msgstr ""'
17 "Content-Transfer-Encoding: 8bit\n"
17 "Content-Transfer-Encoding: 8bit\n"
18 "Generated-By: Babel 1.3\n"
18 "Generated-By: Babel 1.3\n"
19
19
20 #: rhodecode/api/views/pull_request_api.py:646
21 #: rhodecode/api/views/repo_api.py:1685
22 #: rhodecode/apps/repository/views/repo_commits.py:471
23 #: rhodecode/apps/repository/views/repo_pull_requests.py:1658
24 msgid "posted a new {} comment"
25 msgstr ""
26
20 #: rhodecode/apps/admin/views/defaults.py:90
27 #: rhodecode/apps/admin/views/defaults.py:90
21 msgid "Default settings updated successfully"
28 msgid "Default settings updated successfully"
22 msgstr ""
29 msgstr ""
@@ -55,10 +62,10 b' msgstr ""'
55 #: rhodecode/templates/admin/gists/gist_show.mako:50
62 #: rhodecode/templates/admin/gists/gist_show.mako:50
56 #: rhodecode/templates/admin/integrations/list.mako:172
63 #: rhodecode/templates/admin/integrations/list.mako:172
57 #: rhodecode/templates/admin/my_account/my_account_profile.mako:7
64 #: rhodecode/templates/admin/my_account/my_account_profile.mako:7
58 #: rhodecode/templates/base/issue_tracker_settings.mako:137
65 #: rhodecode/templates/base/issue_tracker_settings.mako:138
59 #: rhodecode/templates/changeset/changeset_file_comment.mako:201
66 #: rhodecode/templates/changeset/changeset_file_comment.mako:213
60 #: rhodecode/templates/changeset/changeset_file_comment.mako:205
67 #: rhodecode/templates/changeset/changeset_file_comment.mako:221
61 #: rhodecode/templates/changeset/changeset_file_comment.mako:209
68 #: rhodecode/templates/changeset/changeset_file_comment.mako:230
62 #: rhodecode/templates/data_table/_dt_elements.mako:173
69 #: rhodecode/templates/data_table/_dt_elements.mako:173
63 #: rhodecode/templates/data_table/_dt_elements.mako:251
70 #: rhodecode/templates/data_table/_dt_elements.mako:251
64 #: rhodecode/templates/data_table/_dt_elements.mako:266
71 #: rhodecode/templates/data_table/_dt_elements.mako:266
@@ -69,8 +76,9 b' msgstr ""'
69 #: rhodecode/templates/files/files_edit.mako:57
76 #: rhodecode/templates/files/files_edit.mako:57
70 #: rhodecode/templates/files/files_source.mako:39
77 #: rhodecode/templates/files/files_source.mako:39
71 #: rhodecode/templates/files/files_source.mako:52
78 #: rhodecode/templates/files/files_source.mako:52
72 #: rhodecode/templates/pullrequests/pullrequest_show.mako:74
79 #: rhodecode/templates/pullrequests/pullrequest_show.mako:83
73 #: rhodecode/templates/pullrequests/pullrequest_show.mako:302
80 #: rhodecode/templates/pullrequests/pullrequest_show.mako:588
81 #: rhodecode/templates/pullrequests/pullrequest_show.mako:645
74 #: rhodecode/templates/user_group/profile.mako:8
82 #: rhodecode/templates/user_group/profile.mako:8
75 #: rhodecode/templates/users/user_profile.mako:8
83 #: rhodecode/templates/users/user_profile.mako:8
76 msgid "Edit"
84 msgid "Edit"
@@ -105,7 +113,7 b' msgstr ""'
105 #: rhodecode/apps/admin/views/settings.py:163
113 #: rhodecode/apps/admin/views/settings.py:163
106 #: rhodecode/apps/admin/views/settings.py:319
114 #: rhodecode/apps/admin/views/settings.py:319
107 #: rhodecode/apps/admin/views/settings.py:394
115 #: rhodecode/apps/admin/views/settings.py:394
108 #: rhodecode/apps/admin/views/settings.py:727
116 #: rhodecode/apps/admin/views/settings.py:736
109 #: rhodecode/apps/repository/views/repo_settings_vcs.py:124
117 #: rhodecode/apps/repository/views/repo_settings_vcs.py:124
110 msgid "Some form inputs contain invalid data."
118 msgid "Some form inputs contain invalid data."
111 msgstr ""
119 msgstr ""
@@ -137,46 +145,46 b' msgstr ""'
137 msgid "Error occurred during updating visualisation settings"
145 msgid "Error occurred during updating visualisation settings"
138 msgstr ""
146 msgstr ""
139
147
140 #: rhodecode/apps/admin/views/settings.py:498
148 #: rhodecode/apps/admin/views/settings.py:507
141 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:127
149 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:127
142 msgid "Invalid issue tracker pattern: {}"
150 msgid "Invalid issue tracker pattern: {}"
143 msgstr ""
151 msgstr ""
144
152
145 #: rhodecode/apps/admin/views/settings.py:515
153 #: rhodecode/apps/admin/views/settings.py:524
146 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:136
154 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:136
147 msgid "Updated issue tracker entries"
155 msgid "Updated issue tracker entries"
148 msgstr ""
156 msgstr ""
149
157
150 #: rhodecode/apps/admin/views/settings.py:535
158 #: rhodecode/apps/admin/views/settings.py:544
151 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:91
159 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:91
152 msgid "Removed issue tracker entry."
160 msgid "Removed issue tracker entry."
153 msgstr ""
161 msgstr ""
154
162
155 #: rhodecode/apps/admin/views/settings.py:573
163 #: rhodecode/apps/admin/views/settings.py:582
156 msgid "Please enter email address"
164 msgid "Please enter email address"
157 msgstr ""
165 msgstr ""
158
166
159 #: rhodecode/apps/admin/views/settings.py:589
167 #: rhodecode/apps/admin/views/settings.py:598
160 msgid "Send email task created"
168 msgid "Send email task created"
161 msgstr ""
169 msgstr ""
162
170
163 #: rhodecode/apps/admin/views/settings.py:639
171 #: rhodecode/apps/admin/views/settings.py:648
164 msgid "Added new hook"
172 msgid "Added new hook"
165 msgstr ""
173 msgstr ""
166
174
167 #: rhodecode/apps/admin/views/settings.py:654
175 #: rhodecode/apps/admin/views/settings.py:663
168 msgid "Updated hooks"
176 msgid "Updated hooks"
169 msgstr ""
177 msgstr ""
170
178
171 #: rhodecode/apps/admin/views/settings.py:658
179 #: rhodecode/apps/admin/views/settings.py:667
172 msgid "Error occurred during hook creation"
180 msgid "Error occurred during hook creation"
173 msgstr ""
181 msgstr ""
174
182
175 #: rhodecode/apps/admin/views/settings.py:751
183 #: rhodecode/apps/admin/views/settings.py:760
176 msgid "Error occurred during updating labs settings"
184 msgid "Error occurred during updating labs settings"
177 msgstr ""
185 msgstr ""
178
186
179 #: rhodecode/apps/admin/views/settings.py:756
187 #: rhodecode/apps/admin/views/settings.py:765
180 msgid "Updated Labs settings"
188 msgid "Updated Labs settings"
181 msgstr ""
189 msgstr ""
182
190
@@ -586,10 +594,10 b' msgstr ""'
586 msgid "1 month"
594 msgid "1 month"
587 msgstr ""
595 msgstr ""
588
596
589 #: rhodecode/apps/gist/views.py:64 rhodecode/public/js/scripts.js:47676
597 #: rhodecode/apps/gist/views.py:64 rhodecode/public/js/scripts.js:48330
590 #: rhodecode/public/js/scripts.min.js:1
598 #: rhodecode/public/js/scripts.min.js:1
591 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:42
599 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
592 #: rhodecode/public/js/src/rhodecode.js:625
600 #: rhodecode/public/js/src/rhodecode.js:634
593 msgid "Lifetime"
601 msgid "Lifetime"
594 msgstr ""
602 msgstr ""
595
603
@@ -640,19 +648,19 b' msgstr ""'
640 msgid "Error occurred during update of gist %s"
648 msgid "Error occurred during update of gist %s"
641 msgstr ""
649 msgstr ""
642
650
643 #: rhodecode/apps/home/views.py:452
651 #: rhodecode/apps/home/views.py:453
644 #: rhodecode/apps/repository/views/repo_pull_requests.py:930
652 #: rhodecode/apps/repository/views/repo_pull_requests.py:976
645 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:219
653 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:219
646 #: rhodecode/templates/admin/repos/repo_add.mako:15
654 #: rhodecode/templates/admin/repos/repo_add.mako:15
647 #: rhodecode/templates/admin/repos/repo_add.mako:19
655 #: rhodecode/templates/admin/repos/repo_add.mako:19
648 #: rhodecode/templates/admin/users/user_edit_advanced.mako:12
656 #: rhodecode/templates/admin/users/user_edit_advanced.mako:12
649 #: rhodecode/templates/base/base.mako:112
657 #: rhodecode/templates/base/base.mako:114
650 #: rhodecode/templates/base/base.mako:131
658 #: rhodecode/templates/base/base.mako:133
651 #: rhodecode/templates/base/base.mako:1192
659 #: rhodecode/templates/base/base.mako:1191
652 msgid "Repositories"
660 msgid "Repositories"
653 msgstr ""
661 msgstr ""
654
662
655 #: rhodecode/apps/home/views.py:479
663 #: rhodecode/apps/home/views.py:480
656 #: rhodecode/templates/admin/integrations/form.mako:17
664 #: rhodecode/templates/admin/integrations/form.mako:17
657 #: rhodecode/templates/admin/integrations/list.mako:10
665 #: rhodecode/templates/admin/integrations/list.mako:10
658 #: rhodecode/templates/admin/permissions/permissions_objects.mako:31
666 #: rhodecode/templates/admin/permissions/permissions_objects.mako:31
@@ -779,7 +787,7 b' msgstr ""'
779
787
780 #: rhodecode/apps/repository/views/repo_changelog.py:66
788 #: rhodecode/apps/repository/views/repo_changelog.py:66
781 #: rhodecode/apps/repository/views/repo_compare.py:64
789 #: rhodecode/apps/repository/views/repo_compare.py:64
782 #: rhodecode/apps/repository/views/repo_pull_requests.py:779
790 #: rhodecode/apps/repository/views/repo_pull_requests.py:825
783 msgid "There are no commits yet"
791 msgid "There are no commits yet"
784 msgstr ""
792 msgstr ""
785
793
@@ -807,13 +815,13 b' msgstr ""'
807 msgid "No such commit exists. Org exception: `{}`"
815 msgid "No such commit exists. Org exception: `{}`"
808 msgstr ""
816 msgstr ""
809
817
810 #: rhodecode/apps/repository/views/repo_commits.py:331
818 #: rhodecode/apps/repository/views/repo_commits.py:388
811 #: rhodecode/apps/repository/views/repo_pull_requests.py:1415
819 #: rhodecode/apps/repository/views/repo_pull_requests.py:1582
812 #, python-format
820 #, python-format
813 msgid "Status change %(transition_icon)s %(status)s"
821 msgid "Status change %(transition_icon)s %(status)s"
814 msgstr ""
822 msgstr ""
815
823
816 #: rhodecode/apps/repository/views/repo_commits.py:376
824 #: rhodecode/apps/repository/views/repo_commits.py:434
817 msgid "Changing the status of a commit associated with a closed pull request is not allowed"
825 msgid "Changing the status of a commit associated with a closed pull request is not allowed"
818 msgstr ""
826 msgstr ""
819
827
@@ -878,104 +886,104 b' msgstr ""'
878 msgid "No such commit exists for this repository. Commit: {}"
886 msgid "No such commit exists for this repository. Commit: {}"
879 msgstr ""
887 msgstr ""
880
888
881 #: rhodecode/apps/repository/views/repo_files.py:341
889 #: rhodecode/apps/repository/views/repo_files.py:345
882 msgid "Downloads disabled"
890 msgid "Downloads disabled"
883 msgstr ""
891 msgstr ""
884
892
885 #: rhodecode/apps/repository/views/repo_files.py:347
893 #: rhodecode/apps/repository/views/repo_files.py:351
886 msgid "Unknown archive type for: `{}`"
894 msgid "Unknown archive type for: `{}`"
887 msgstr ""
895 msgstr ""
888
896
889 #: rhodecode/apps/repository/views/repo_files.py:353
897 #: rhodecode/apps/repository/views/repo_files.py:357
890 msgid "Unknown commit_id {}"
898 msgid "Unknown commit_id {}"
891 msgstr ""
899 msgstr ""
892
900
893 #: rhodecode/apps/repository/views/repo_files.py:356
901 #: rhodecode/apps/repository/views/repo_files.py:360
894 msgid "Empty repository"
902 msgid "Empty repository"
895 msgstr ""
903 msgstr ""
896
904
897 #: rhodecode/apps/repository/views/repo_files.py:361
905 #: rhodecode/apps/repository/views/repo_files.py:365
898 msgid "No node at path {} for this repository"
906 msgid "No node at path {} for this repository"
899 msgstr ""
907 msgstr ""
900
908
901 #: rhodecode/apps/repository/views/repo_files.py:410
909 #: rhodecode/apps/repository/views/repo_files.py:414
902 msgid "Unknown archive type"
910 msgid "Unknown archive type"
903 msgstr ""
911 msgstr ""
904
912
905 #: rhodecode/apps/repository/views/repo_files.py:1005
913 #: rhodecode/apps/repository/views/repo_files.py:1010
906 msgid "Changesets"
914 msgid "Changesets"
907 msgstr ""
915 msgstr ""
908
916
909 #: rhodecode/apps/repository/views/repo_files.py:1026
917 #: rhodecode/apps/repository/views/repo_files.py:1031
910 #: rhodecode/apps/repository/views/repo_summary.py:264
918 #: rhodecode/apps/repository/views/repo_summary.py:264
911 #: rhodecode/model/pull_request.py:1740 rhodecode/model/scm.py:995
919 #: rhodecode/model/pull_request.py:1903 rhodecode/model/scm.py:995
912 #: rhodecode/templates/base/vcs_settings.mako:235
920 #: rhodecode/templates/base/vcs_settings.mako:235
913 #: rhodecode/templates/summary/components.mako:10
921 #: rhodecode/templates/summary/components.mako:10
914 msgid "Branches"
922 msgid "Branches"
915 msgstr ""
923 msgstr ""
916
924
917 #: rhodecode/apps/repository/views/repo_files.py:1030
925 #: rhodecode/apps/repository/views/repo_files.py:1035
918 #: rhodecode/model/scm.py:1012 rhodecode/templates/base/vcs_settings.mako:260
926 #: rhodecode/model/scm.py:1012 rhodecode/templates/base/vcs_settings.mako:260
919 #: rhodecode/templates/summary/components.mako:34
927 #: rhodecode/templates/summary/components.mako:34
920 msgid "Tags"
928 msgid "Tags"
921 msgstr ""
929 msgstr ""
922
930
923 #: rhodecode/apps/repository/views/repo_files.py:1184
931 #: rhodecode/apps/repository/views/repo_files.py:1191
924 #: rhodecode/apps/repository/views/repo_files.py:1212
932 #: rhodecode/apps/repository/views/repo_files.py:1220
925 msgid "Deleted file {} via RhodeCode Enterprise"
933 msgid "Deleted file {} via RhodeCode Enterprise"
926 msgstr ""
934 msgstr ""
927
935
928 #: rhodecode/apps/repository/views/repo_files.py:1233
936 #: rhodecode/apps/repository/views/repo_files.py:1241
929 msgid "Successfully deleted file `{}`"
937 msgid "Successfully deleted file `{}`"
930 msgstr ""
938 msgstr ""
931
939
932 #: rhodecode/apps/repository/views/repo_files.py:1237
940 #: rhodecode/apps/repository/views/repo_files.py:1245
933 #: rhodecode/apps/repository/views/repo_files.py:1354
941 #: rhodecode/apps/repository/views/repo_files.py:1364
934 #: rhodecode/apps/repository/views/repo_files.py:1485
942 #: rhodecode/apps/repository/views/repo_files.py:1497
935 #: rhodecode/apps/repository/views/repo_files.py:1608
943 #: rhodecode/apps/repository/views/repo_files.py:1621
936 msgid "Error occurred during commit"
944 msgid "Error occurred during commit"
937 msgstr ""
945 msgstr ""
938
946
939 #: rhodecode/apps/repository/views/repo_files.py:1269
947 #: rhodecode/apps/repository/views/repo_files.py:1278
940 #: rhodecode/apps/repository/views/repo_files.py:1300
948 #: rhodecode/apps/repository/views/repo_files.py:1310
941 msgid "Edited file {} via RhodeCode Enterprise"
949 msgid "Edited file {} via RhodeCode Enterprise"
942 msgstr ""
950 msgstr ""
943
951
944 #: rhodecode/apps/repository/views/repo_files.py:1323
952 #: rhodecode/apps/repository/views/repo_files.py:1333
945 msgid "No changes detected on {}"
953 msgid "No changes detected on {}"
946 msgstr ""
954 msgstr ""
947
955
948 #: rhodecode/apps/repository/views/repo_files.py:1347
956 #: rhodecode/apps/repository/views/repo_files.py:1357
949 msgid "Successfully committed changes to file `{}`"
957 msgid "Successfully committed changes to file `{}`"
950 msgstr ""
958 msgstr ""
951
959
952 #: rhodecode/apps/repository/views/repo_files.py:1388
960 #: rhodecode/apps/repository/views/repo_files.py:1399
953 #: rhodecode/apps/repository/views/repo_files.py:1429
961 #: rhodecode/apps/repository/views/repo_files.py:1441
954 msgid "Added file via RhodeCode Enterprise"
962 msgid "Added file via RhodeCode Enterprise"
955 msgstr ""
963 msgstr ""
956
964
957 #: rhodecode/apps/repository/views/repo_files.py:1445
965 #: rhodecode/apps/repository/views/repo_files.py:1457
958 msgid "No filename specified"
966 msgid "No filename specified"
959 msgstr ""
967 msgstr ""
960
968
961 #: rhodecode/apps/repository/views/repo_files.py:1470
969 #: rhodecode/apps/repository/views/repo_files.py:1482
962 msgid "Successfully committed new file `{}`"
970 msgid "Successfully committed new file `{}`"
963 msgstr ""
971 msgstr ""
964
972
965 #: rhodecode/apps/repository/views/repo_files.py:1478
973 #: rhodecode/apps/repository/views/repo_files.py:1490
966 #: rhodecode/apps/repository/views/repo_files.py:1590
974 #: rhodecode/apps/repository/views/repo_files.py:1603
967 msgid "The location specified must be a relative path and must not contain .. in the path"
975 msgid "The location specified must be a relative path and must not contain .. in the path"
968 msgstr ""
976 msgstr ""
969
977
970 #: rhodecode/apps/repository/views/repo_files.py:1535
978 #: rhodecode/apps/repository/views/repo_files.py:1548
971 msgid "Uploaded file via RhodeCode Enterprise"
979 msgid "Uploaded file via RhodeCode Enterprise"
972 msgstr ""
980 msgstr ""
973
981
974 #: rhodecode/apps/repository/views/repo_files.py:1579
982 #: rhodecode/apps/repository/views/repo_files.py:1592
975 msgid "Successfully committed {} new files"
983 msgid "Successfully committed {} new files"
976 msgstr ""
984 msgstr ""
977
985
978 #: rhodecode/apps/repository/views/repo_files.py:1581
986 #: rhodecode/apps/repository/views/repo_files.py:1594
979 msgid "Successfully committed 1 new file"
987 msgid "Successfully committed 1 new file"
980 msgstr ""
988 msgstr ""
981
989
@@ -989,7 +997,7 b' msgid "An error occurred during reposito'
989 msgstr ""
997 msgstr ""
990
998
991 #: rhodecode/apps/repository/views/repo_permissions.py:57
999 #: rhodecode/apps/repository/views/repo_permissions.py:57
992 msgid "Explicitly add user or user group with write+ permission to modify their branch permissions."
1000 msgid "Explicitly add user or user group with write or higher permission to modify their branch permissions."
993 msgstr ""
1001 msgstr ""
994
1002
995 #: rhodecode/apps/repository/views/repo_permissions.py:92
1003 #: rhodecode/apps/repository/views/repo_permissions.py:92
@@ -1005,72 +1013,72 b' msgstr ""'
1005 msgid "Error occurred during update of repository {}"
1013 msgid "Error occurred during update of repository {}"
1006 msgstr ""
1014 msgstr ""
1007
1015
1008 #: rhodecode/apps/repository/views/repo_pull_requests.py:291
1016 #: rhodecode/apps/repository/views/repo_pull_requests.py:325
1009 msgid "Pull Request state was force changed to `{}`"
1017 msgid "Pull Request state was force changed to `{}`"
1010 msgstr ""
1018 msgstr ""
1011
1019
1012 #: rhodecode/apps/repository/views/repo_pull_requests.py:809
1020 #: rhodecode/apps/repository/views/repo_pull_requests.py:855
1013 msgid "Commit does not exist"
1021 msgid "Commit does not exist"
1014 msgstr ""
1022 msgstr ""
1015
1023
1016 #: rhodecode/apps/repository/views/repo_pull_requests.py:961
1024 #: rhodecode/apps/repository/views/repo_pull_requests.py:1092
1017 msgid "Error creating pull request: {}"
1025 msgid "Error creating pull request: {}"
1018 msgstr ""
1026 msgstr ""
1019
1027
1020 #: rhodecode/apps/repository/views/repo_pull_requests.py:981
1028 #: rhodecode/apps/repository/views/repo_pull_requests.py:1112
1021 msgid "source_repo or target repo not found"
1029 msgid "source_repo or target repo not found"
1022 msgstr ""
1030 msgstr ""
1023
1031
1024 #: rhodecode/apps/repository/views/repo_pull_requests.py:992
1032 #: rhodecode/apps/repository/views/repo_pull_requests.py:1123
1025 msgid "Not Enough permissions to source repo `{}`."
1033 msgid "Not Enough permissions to source repo `{}`."
1026 msgstr ""
1034 msgstr ""
1027
1035
1028 #: rhodecode/apps/repository/views/repo_pull_requests.py:1007
1036 #: rhodecode/apps/repository/views/repo_pull_requests.py:1138
1029 msgid "Not Enough permissions to target repo `{}`."
1037 msgid "Not Enough permissions to target repo `{}`."
1030 msgstr ""
1038 msgstr ""
1031
1039
1032 #: rhodecode/apps/repository/views/repo_pull_requests.py:1071
1040 #: rhodecode/apps/repository/views/repo_pull_requests.py:1208
1033 msgid "Successfully opened new pull request"
1041 msgid "Successfully opened new pull request"
1034 msgstr ""
1042 msgstr ""
1035
1043
1036 #: rhodecode/apps/repository/views/repo_pull_requests.py:1074
1044 #: rhodecode/apps/repository/views/repo_pull_requests.py:1211
1037 msgid "Error occurred during creation of this pull request."
1045 msgid "Error occurred during creation of this pull request."
1038 msgstr ""
1046 msgstr ""
1039
1047
1040 #: rhodecode/apps/repository/views/repo_pull_requests.py:1106
1048 #: rhodecode/apps/repository/views/repo_pull_requests.py:1243
1041 #: rhodecode/apps/repository/views/repo_pull_requests.py:1161
1049 #: rhodecode/apps/repository/views/repo_pull_requests.py:1312
1042 msgid "Cannot update closed pull requests."
1050 msgid "Cannot update closed pull requests."
1043 msgstr ""
1051 msgstr ""
1044
1052
1045 #: rhodecode/apps/repository/views/repo_pull_requests.py:1128
1053 #: rhodecode/apps/repository/views/repo_pull_requests.py:1275
1046 msgid "Cannot update pull requests commits in state other than `{}`. Current state is: `{}`"
1054 msgid "Cannot update pull requests commits in state other than `{}`. Current state is: `{}`"
1047 msgstr ""
1055 msgstr ""
1048
1056
1049 #: rhodecode/apps/repository/views/repo_pull_requests.py:1167
1057 #: rhodecode/apps/repository/views/repo_pull_requests.py:1318
1050 msgid "Pull request title & description updated."
1058 msgid "Pull request title & description updated."
1051 msgstr ""
1059 msgstr ""
1052
1060
1053 #: rhodecode/apps/repository/views/repo_pull_requests.py:1189
1061 #: rhodecode/apps/repository/views/repo_pull_requests.py:1340
1054 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits. Source of changes: {change_source}"
1062 msgid "Pull request updated to \"{source_commit_id}\" with {count_added} added, {count_removed} removed commits. Source of changes: {change_source}."
1055 msgstr ""
1063 msgstr ""
1056
1064
1057 #: rhodecode/apps/repository/views/repo_pull_requests.py:1203
1065 #: rhodecode/apps/repository/views/repo_pull_requests.py:1380
1058 msgid "Reload page"
1066 msgid "Pull request reviewers updated."
1059 msgstr ""
1067 msgstr ""
1060
1068
1061 #: rhodecode/apps/repository/views/repo_pull_requests.py:1238
1069 #: rhodecode/apps/repository/views/repo_pull_requests.py:1404
1070 msgid "Pull request observers updated."
1071 msgstr ""
1072
1073 #: rhodecode/apps/repository/views/repo_pull_requests.py:1431
1062 msgid "Cannot merge pull requests in state other than `{}`. Current state is: `{}`"
1074 msgid "Cannot merge pull requests in state other than `{}`. Current state is: `{}`"
1063 msgstr ""
1075 msgstr ""
1064
1076
1065 #: rhodecode/apps/repository/views/repo_pull_requests.py:1284
1077 #: rhodecode/apps/repository/views/repo_pull_requests.py:1477
1066 msgid "Pull request was successfully merged and closed."
1078 msgid "Pull request was successfully merged and closed."
1067 msgstr ""
1079 msgstr ""
1068
1080
1069 #: rhodecode/apps/repository/views/repo_pull_requests.py:1308
1081 #: rhodecode/apps/repository/views/repo_pull_requests.py:1508
1070 msgid "Pull request reviewers updated."
1071 msgstr ""
1072
1073 #: rhodecode/apps/repository/views/repo_pull_requests.py:1341
1074 msgid "Successfully deleted pull request"
1082 msgid "Successfully deleted pull request"
1075 msgstr ""
1083 msgstr ""
1076
1084
@@ -1801,10 +1809,10 b' msgstr ""'
1801 msgid "Reset"
1809 msgid "Reset"
1802 msgstr ""
1810 msgstr ""
1803
1811
1804 #: rhodecode/forms/__init__.py:36 rhodecode/public/js/scripts.js:38311
1812 #: rhodecode/forms/__init__.py:36 rhodecode/public/js/scripts.js:38315
1805 #: rhodecode/public/js/scripts.min.js:1
1813 #: rhodecode/public/js/scripts.min.js:1
1806 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:24
1814 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:29
1807 #: rhodecode/public/js/src/rhodecode/utils/ajax.js:161
1815 #: rhodecode/public/js/src/rhodecode/utils/ajax.js:165
1808 #: rhodecode/templates/admin/gists/gist_show.mako:59
1816 #: rhodecode/templates/admin/gists/gist_show.mako:59
1809 #: rhodecode/templates/admin/integrations/list.mako:179
1817 #: rhodecode/templates/admin/integrations/list.mako:179
1810 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:65
1818 #: rhodecode/templates/admin/my_account/my_account_auth_tokens.mako:65
@@ -1819,12 +1827,12 b' msgstr ""'
1819 #: rhodecode/templates/admin/users/user_edit_emails.mako:34
1827 #: rhodecode/templates/admin/users/user_edit_emails.mako:34
1820 #: rhodecode/templates/admin/users/user_edit_ips.mako:40
1828 #: rhodecode/templates/admin/users/user_edit_ips.mako:40
1821 #: rhodecode/templates/admin/users/user_edit_ssh_keys.mako:35
1829 #: rhodecode/templates/admin/users/user_edit_ssh_keys.mako:35
1822 #: rhodecode/templates/base/issue_tracker_settings.mako:146
1830 #: rhodecode/templates/base/issue_tracker_settings.mako:147
1823 #: rhodecode/templates/base/vcs_settings.mako:244
1831 #: rhodecode/templates/base/vcs_settings.mako:244
1824 #: rhodecode/templates/base/vcs_settings.mako:269
1832 #: rhodecode/templates/base/vcs_settings.mako:269
1825 #: rhodecode/templates/changeset/changeset_file_comment.mako:203
1833 #: rhodecode/templates/changeset/changeset_file_comment.mako:216
1826 #: rhodecode/templates/changeset/changeset_file_comment.mako:206
1834 #: rhodecode/templates/changeset/changeset_file_comment.mako:224
1827 #: rhodecode/templates/changeset/changeset_file_comment.mako:210
1835 #: rhodecode/templates/changeset/changeset_file_comment.mako:233
1828 #: rhodecode/templates/data_table/_dt_elements.mako:436
1836 #: rhodecode/templates/data_table/_dt_elements.mako:436
1829 #: rhodecode/templates/debug_style/buttons.html:132
1837 #: rhodecode/templates/debug_style/buttons.html:132
1830 #: rhodecode/templates/files/files_source.mako:40
1838 #: rhodecode/templates/files/files_source.mako:40
@@ -2225,11 +2233,19 b' msgstr ""'
2225 msgid "You need to be signed in to view this page"
2233 msgid "You need to be signed in to view this page"
2226 msgstr ""
2234 msgstr ""
2227
2235
2236 #: rhodecode/lib/channelstream.py:318
2237 msgid " Reload page to load changes"
2238 msgstr ""
2239
2240 #: rhodecode/lib/channelstream.py:348
2241 msgid "Reload page to see new comments"
2242 msgstr ""
2243
2228 #: rhodecode/lib/diffs.py:903
2244 #: rhodecode/lib/diffs.py:903
2229 msgid "Click to select line"
2245 msgid "Click to select line"
2230 msgstr ""
2246 msgstr ""
2231
2247
2232 #: rhodecode/lib/helpers.py:1803
2248 #: rhodecode/lib/helpers.py:1878
2233 msgid ""
2249 msgid ""
2234 "Example filter terms:\n"
2250 "Example filter terms:\n"
2235 " repository:vcs\n"
2251 " repository:vcs\n"
@@ -2251,7 +2267,7 b' msgid ""'
2251 " \"username:test AND repository:test*\"\n"
2267 " \"username:test AND repository:test*\"\n"
2252 msgstr ""
2268 msgstr ""
2253
2269
2254 #: rhodecode/lib/helpers.py:1827
2270 #: rhodecode/lib/helpers.py:1902
2255 #, python-format
2271 #, python-format
2256 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"
2272 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"
2257 msgstr ""
2273 msgstr ""
@@ -2290,7 +2306,7 b' msgstr ""'
2290
2306
2291 #: rhodecode/lib/utils2.py:571 rhodecode/public/js/scripts.js:22612
2307 #: rhodecode/lib/utils2.py:571 rhodecode/public/js/scripts.js:22612
2292 #: rhodecode/public/js/scripts.min.js:1
2308 #: rhodecode/public/js/scripts.min.js:1
2293 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:127
2309 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:136
2294 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:174
2310 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:174
2295 msgid "just now"
2311 msgid "just now"
2296 msgstr ""
2312 msgstr ""
@@ -2326,6 +2342,7 b' msgstr ""'
2326 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2987
2342 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2987
2327 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3073
2343 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3073
2328 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3079
2344 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3079
2345 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3110
2329 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2275
2346 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2275
2330 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2267
2347 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2267
2331 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2266
2348 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2266
@@ -2333,7 +2350,7 b' msgstr ""'
2333 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2270
2350 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2270
2334 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2321
2351 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2321
2335 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2322
2352 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2322
2336 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2522 rhodecode/model/db.py:3110
2353 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2522 rhodecode/model/db.py:3111
2337 msgid "Repository no access"
2354 msgid "Repository no access"
2338 msgstr ""
2355 msgstr ""
2339
2356
@@ -2368,6 +2385,7 b' msgstr ""'
2368 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2988
2385 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2988
2369 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3074
2386 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3074
2370 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3080
2387 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3080
2388 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3111
2371 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2276
2389 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2276
2372 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2268
2390 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2268
2373 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2267
2391 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2267
@@ -2375,7 +2393,7 b' msgstr ""'
2375 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2271
2393 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2271
2376 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2322
2394 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2322
2377 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2323
2395 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2323
2378 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2523 rhodecode/model/db.py:3111
2396 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2523 rhodecode/model/db.py:3112
2379 msgid "Repository read access"
2397 msgid "Repository read access"
2380 msgstr ""
2398 msgstr ""
2381
2399
@@ -2410,6 +2428,7 b' msgstr ""'
2410 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2989
2428 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2989
2411 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3075
2429 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3075
2412 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3081
2430 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3081
2431 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3112
2413 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2277
2432 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2277
2414 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2269
2433 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2269
2415 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2268
2434 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2268
@@ -2417,7 +2436,7 b' msgstr ""'
2417 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2272
2436 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2272
2418 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2323
2437 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2323
2419 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2324
2438 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2324
2420 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2524 rhodecode/model/db.py:3112
2439 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2524 rhodecode/model/db.py:3113
2421 msgid "Repository write access"
2440 msgid "Repository write access"
2422 msgstr ""
2441 msgstr ""
2423
2442
@@ -2452,6 +2471,7 b' msgstr ""'
2452 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2990
2471 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2990
2453 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3076
2472 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3076
2454 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3082
2473 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3082
2474 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3113
2455 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2278
2475 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2278
2456 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2270
2476 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2270
2457 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2269
2477 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2269
@@ -2459,7 +2479,7 b' msgstr ""'
2459 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2273
2479 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2273
2460 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2324
2480 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2324
2461 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2325
2481 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2325
2462 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2525 rhodecode/model/db.py:3113
2482 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2525 rhodecode/model/db.py:3114
2463 msgid "Repository admin access"
2483 msgid "Repository admin access"
2464 msgstr ""
2484 msgstr ""
2465
2485
@@ -2534,6 +2554,7 b' msgstr ""'
2534 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3013
2554 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3013
2535 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3099
2555 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3099
2536 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3105
2556 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3105
2557 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3136
2537 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2296
2558 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2296
2538 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2288
2559 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2288
2539 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2287
2560 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2287
@@ -2541,7 +2562,7 b' msgstr ""'
2541 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2291
2562 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2291
2542 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2342
2563 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2342
2543 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2343
2564 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2343
2544 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2543 rhodecode/model/db.py:3136
2565 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2543 rhodecode/model/db.py:3137
2545 msgid "Repository creation disabled"
2566 msgid "Repository creation disabled"
2546 msgstr ""
2567 msgstr ""
2547
2568
@@ -2576,6 +2597,7 b' msgstr ""'
2576 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3014
2597 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3014
2577 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3100
2598 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3100
2578 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3106
2599 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3106
2600 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3137
2579 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2297
2601 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2297
2580 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2289
2602 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2289
2581 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2288
2603 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2288
@@ -2583,7 +2605,7 b' msgstr ""'
2583 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2292
2605 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2292
2584 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2343
2606 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2343
2585 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2344
2607 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2344
2586 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2544 rhodecode/model/db.py:3137
2608 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2544 rhodecode/model/db.py:3138
2587 msgid "Repository creation enabled"
2609 msgid "Repository creation enabled"
2588 msgstr ""
2610 msgstr ""
2589
2611
@@ -2618,6 +2640,7 b' msgstr ""'
2618 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3018
2640 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3018
2619 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3104
2641 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3104
2620 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3110
2642 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3110
2643 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3141
2621 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2301
2644 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2301
2622 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2293
2645 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2293
2623 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2292
2646 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2292
@@ -2625,7 +2648,7 b' msgstr ""'
2625 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2296
2648 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2296
2626 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2347
2649 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2347
2627 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2348
2650 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2348
2628 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2548 rhodecode/model/db.py:3141
2651 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2548 rhodecode/model/db.py:3142
2629 msgid "Repository forking disabled"
2652 msgid "Repository forking disabled"
2630 msgstr ""
2653 msgstr ""
2631
2654
@@ -2660,6 +2683,7 b' msgstr ""'
2660 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3019
2683 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3019
2661 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3105
2684 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3105
2662 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3111
2685 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3111
2686 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3142
2663 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2302
2687 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2302
2664 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2294
2688 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2294
2665 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2293
2689 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2293
@@ -2667,7 +2691,7 b' msgstr ""'
2667 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2297
2691 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2297
2668 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2348
2692 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2348
2669 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2349
2693 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2349
2670 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2549 rhodecode/model/db.py:3142
2694 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2549 rhodecode/model/db.py:3143
2671 msgid "Repository forking enabled"
2695 msgid "Repository forking enabled"
2672 msgstr ""
2696 msgstr ""
2673
2697
@@ -2723,6 +2747,7 b' msgstr ""'
2723 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3757
2747 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3757
2724 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3843
2748 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3843
2725 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3890
2749 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3890
2750 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3935
2726 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2915
2751 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2915
2727 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2907
2752 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2907
2728 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2907
2753 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2907
@@ -2730,10 +2755,10 b' msgstr ""'
2730 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2910
2755 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2910
2731 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3011
2756 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3011
2732 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3012
2757 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3012
2733 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3230 rhodecode/model/db.py:3935
2758 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3230 rhodecode/model/db.py:3971
2734 #: rhodecode/public/js/scripts.js:42219 rhodecode/public/js/scripts.min.js:1
2759 #: rhodecode/public/js/scripts.js:42424 rhodecode/public/js/scripts.min.js:1
2735 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:64
2760 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:70
2736 #: rhodecode/public/js/src/rhodecode/pullrequests.js:352
2761 #: rhodecode/public/js/src/rhodecode/pullrequests.js:445
2737 msgid "Not Reviewed"
2762 msgid "Not Reviewed"
2738 msgstr ""
2763 msgstr ""
2739
2764
@@ -2768,6 +2793,7 b' msgstr ""'
2768 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3758
2793 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3758
2769 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3844
2794 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3844
2770 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3891
2795 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3891
2796 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3936
2771 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2916
2797 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2916
2772 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2908
2798 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2908
2773 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2908
2799 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2908
@@ -2775,7 +2801,7 b' msgstr ""'
2775 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2911
2801 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2911
2776 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3012
2802 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3012
2777 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3013
2803 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3013
2778 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3231 rhodecode/model/db.py:3936
2804 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3231 rhodecode/model/db.py:3972
2779 msgid "Approved"
2805 msgid "Approved"
2780 msgstr ""
2806 msgstr ""
2781
2807
@@ -2810,6 +2836,7 b' msgstr ""'
2810 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3759
2836 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3759
2811 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3845
2837 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3845
2812 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3892
2838 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3892
2839 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3937
2813 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2917
2840 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2917
2814 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2909
2841 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2909
2815 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2909
2842 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2909
@@ -2817,7 +2844,7 b' msgstr ""'
2817 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2912
2844 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2912
2818 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3013
2845 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3013
2819 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3014
2846 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3014
2820 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3232 rhodecode/model/db.py:3937
2847 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3232 rhodecode/model/db.py:3973
2821 msgid "Rejected"
2848 msgid "Rejected"
2822 msgstr ""
2849 msgstr ""
2823
2850
@@ -2852,6 +2879,7 b' msgstr ""'
2852 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3760
2879 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3760
2853 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3846
2880 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3846
2854 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3893
2881 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3893
2882 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3938
2855 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2918
2883 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2918
2856 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2910
2884 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2910
2857 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2910
2885 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2910
@@ -2859,7 +2887,7 b' msgstr ""'
2859 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2913
2887 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2913
2860 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3014
2888 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3014
2861 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3015
2889 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3015
2862 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3233 rhodecode/model/db.py:3938
2890 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3233 rhodecode/model/db.py:3974
2863 msgid "Under Review"
2891 msgid "Under Review"
2864 msgstr ""
2892 msgstr ""
2865
2893
@@ -2891,6 +2919,7 b' msgstr ""'
2891 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2992
2919 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2992
2892 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3078
2920 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3078
2893 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3084
2921 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3084
2922 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3115
2894 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2280
2923 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2280
2895 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2272
2924 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2272
2896 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2271
2925 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2271
@@ -2898,7 +2927,7 b' msgstr ""'
2898 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2275
2927 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2275
2899 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2326
2928 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2326
2900 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2327
2929 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2327
2901 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2527 rhodecode/model/db.py:3115
2930 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2527 rhodecode/model/db.py:3116
2902 msgid "Repository group no access"
2931 msgid "Repository group no access"
2903 msgstr ""
2932 msgstr ""
2904
2933
@@ -2930,6 +2959,7 b' msgstr ""'
2930 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2993
2959 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2993
2931 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3079
2960 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3079
2932 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3085
2961 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3085
2962 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3116
2933 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2281
2963 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2281
2934 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2273
2964 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2273
2935 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2272
2965 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2272
@@ -2937,7 +2967,7 b' msgstr ""'
2937 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2276
2967 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2276
2938 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2327
2968 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2327
2939 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2328
2969 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2328
2940 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2528 rhodecode/model/db.py:3116
2970 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2528 rhodecode/model/db.py:3117
2941 msgid "Repository group read access"
2971 msgid "Repository group read access"
2942 msgstr ""
2972 msgstr ""
2943
2973
@@ -2969,6 +2999,7 b' msgstr ""'
2969 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2994
2999 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2994
2970 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3080
3000 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3080
2971 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3086
3001 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3086
3002 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3117
2972 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2282
3003 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2282
2973 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2274
3004 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2274
2974 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2273
3005 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2273
@@ -2976,7 +3007,7 b' msgstr ""'
2976 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2277
3007 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2277
2977 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2328
3008 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2328
2978 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2329
3009 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2329
2979 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2529 rhodecode/model/db.py:3117
3010 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2529 rhodecode/model/db.py:3118
2980 msgid "Repository group write access"
3011 msgid "Repository group write access"
2981 msgstr ""
3012 msgstr ""
2982
3013
@@ -3008,6 +3039,7 b' msgstr ""'
3008 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2995
3039 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2995
3009 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3081
3040 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3081
3010 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3087
3041 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3087
3042 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3118
3011 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2283
3043 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2283
3012 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2275
3044 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2275
3013 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2274
3045 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2274
@@ -3015,7 +3047,7 b' msgstr ""'
3015 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2278
3047 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2278
3016 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2329
3048 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2329
3017 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2330
3049 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2330
3018 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2530 rhodecode/model/db.py:3118
3050 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2530 rhodecode/model/db.py:3119
3019 msgid "Repository group admin access"
3051 msgid "Repository group admin access"
3020 msgstr ""
3052 msgstr ""
3021
3053
@@ -3046,6 +3078,7 b' msgstr ""'
3046 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2997
3078 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2997
3047 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3083
3079 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3083
3048 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3089
3080 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3089
3081 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3120
3049 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2285
3082 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2285
3050 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2277
3083 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2277
3051 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2276
3084 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2276
@@ -3053,7 +3086,7 b' msgstr ""'
3053 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2280
3086 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2280
3054 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2331
3087 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2331
3055 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2332
3088 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2332
3056 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2532 rhodecode/model/db.py:3120
3089 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2532 rhodecode/model/db.py:3121
3057 msgid "User group no access"
3090 msgid "User group no access"
3058 msgstr ""
3091 msgstr ""
3059
3092
@@ -3084,6 +3117,7 b' msgstr ""'
3084 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2998
3117 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2998
3085 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3084
3118 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3084
3086 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3090
3119 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3090
3120 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3121
3087 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2286
3121 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2286
3088 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2278
3122 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2278
3089 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2277
3123 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2277
@@ -3091,7 +3125,7 b' msgstr ""'
3091 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2281
3125 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2281
3092 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2332
3126 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2332
3093 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2333
3127 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2333
3094 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2533 rhodecode/model/db.py:3121
3128 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2533 rhodecode/model/db.py:3122
3095 msgid "User group read access"
3129 msgid "User group read access"
3096 msgstr ""
3130 msgstr ""
3097
3131
@@ -3122,6 +3156,7 b' msgstr ""'
3122 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2999
3156 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2999
3123 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3085
3157 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3085
3124 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3091
3158 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3091
3159 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3122
3125 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2287
3160 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2287
3126 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2279
3161 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2279
3127 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2278
3162 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2278
@@ -3129,7 +3164,7 b' msgstr ""'
3129 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2282
3164 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2282
3130 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2333
3165 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2333
3131 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2334
3166 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2334
3132 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2534 rhodecode/model/db.py:3122
3167 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2534 rhodecode/model/db.py:3123
3133 msgid "User group write access"
3168 msgid "User group write access"
3134 msgstr ""
3169 msgstr ""
3135
3170
@@ -3160,6 +3195,7 b' msgstr ""'
3160 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3000
3195 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3000
3161 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3086
3196 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3086
3162 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3092
3197 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3092
3198 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3123
3163 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2288
3199 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2288
3164 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2280
3200 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2280
3165 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2279
3201 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2279
@@ -3167,7 +3203,7 b' msgstr ""'
3167 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2283
3203 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2283
3168 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2334
3204 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2334
3169 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2335
3205 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2335
3170 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2535 rhodecode/model/db.py:3123
3206 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2535 rhodecode/model/db.py:3124
3171 msgid "User group admin access"
3207 msgid "User group admin access"
3172 msgstr ""
3208 msgstr ""
3173
3209
@@ -3198,6 +3234,7 b' msgstr ""'
3198 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3007
3234 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3007
3199 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3093
3235 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3093
3200 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3099
3236 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3099
3237 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3130
3201 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2290
3238 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2290
3202 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2282
3239 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2282
3203 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2281
3240 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2281
@@ -3205,7 +3242,7 b' msgstr ""'
3205 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2285
3242 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2285
3206 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2336
3243 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2336
3207 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2337
3244 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2337
3208 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2537 rhodecode/model/db.py:3130
3245 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2537 rhodecode/model/db.py:3131
3209 msgid "Repository Group creation disabled"
3246 msgid "Repository Group creation disabled"
3210 msgstr ""
3247 msgstr ""
3211
3248
@@ -3236,6 +3273,7 b' msgstr ""'
3236 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3008
3273 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3008
3237 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3094
3274 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3094
3238 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3100
3275 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3100
3276 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3131
3239 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2291
3277 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2291
3240 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2283
3278 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2283
3241 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2282
3279 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2282
@@ -3243,7 +3281,7 b' msgstr ""'
3243 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2286
3281 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2286
3244 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2337
3282 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2337
3245 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2338
3283 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2338
3246 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2538 rhodecode/model/db.py:3131
3284 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2538 rhodecode/model/db.py:3132
3247 msgid "Repository Group creation enabled"
3285 msgid "Repository Group creation enabled"
3248 msgstr ""
3286 msgstr ""
3249
3287
@@ -3274,6 +3312,7 b' msgstr ""'
3274 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3010
3312 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3010
3275 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3096
3313 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3096
3276 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3102
3314 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3102
3315 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3133
3277 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2293
3316 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2293
3278 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2285
3317 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2285
3279 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2284
3318 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2284
@@ -3281,7 +3320,7 b' msgstr ""'
3281 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2288
3320 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2288
3282 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2339
3321 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2339
3283 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2340
3322 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2340
3284 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2540 rhodecode/model/db.py:3133
3323 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2540 rhodecode/model/db.py:3134
3285 msgid "User Group creation disabled"
3324 msgid "User Group creation disabled"
3286 msgstr ""
3325 msgstr ""
3287
3326
@@ -3312,6 +3351,7 b' msgstr ""'
3312 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3011
3351 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3011
3313 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3097
3352 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3097
3314 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3103
3353 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3103
3354 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3134
3315 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2294
3355 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2294
3316 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2286
3356 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2286
3317 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2285
3357 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2285
@@ -3319,7 +3359,7 b' msgstr ""'
3319 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2289
3359 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2289
3320 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2340
3360 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2340
3321 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2341
3361 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2341
3322 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2541 rhodecode/model/db.py:3134
3362 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2541 rhodecode/model/db.py:3135
3323 msgid "User Group creation enabled"
3363 msgid "User Group creation enabled"
3324 msgstr ""
3364 msgstr ""
3325
3365
@@ -3350,6 +3390,7 b' msgstr ""'
3350 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3021
3390 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3021
3351 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3107
3391 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3107
3352 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3113
3392 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3113
3393 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3144
3353 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2304
3394 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2304
3354 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2296
3395 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2296
3355 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2295
3396 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2295
@@ -3357,7 +3398,7 b' msgstr ""'
3357 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2299
3398 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2299
3358 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2350
3399 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2350
3359 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2351
3400 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2351
3360 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2551 rhodecode/model/db.py:3144
3401 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2551 rhodecode/model/db.py:3145
3361 msgid "Registration disabled"
3402 msgid "Registration disabled"
3362 msgstr ""
3403 msgstr ""
3363
3404
@@ -3388,6 +3429,7 b' msgstr ""'
3388 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3022
3429 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3022
3389 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3108
3430 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3108
3390 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3114
3431 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3114
3432 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3145
3391 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2305
3433 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2305
3392 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2297
3434 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2297
3393 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2296
3435 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2296
@@ -3395,7 +3437,7 b' msgstr ""'
3395 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2300
3437 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2300
3396 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2351
3438 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2351
3397 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2352
3439 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2352
3398 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2552 rhodecode/model/db.py:3145
3440 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2552 rhodecode/model/db.py:3146
3399 msgid "User Registration with manual account activation"
3441 msgid "User Registration with manual account activation"
3400 msgstr ""
3442 msgstr ""
3401
3443
@@ -3426,6 +3468,7 b' msgstr ""'
3426 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3023
3468 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3023
3427 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3109
3469 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3109
3428 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3115
3470 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3115
3471 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3146
3429 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2306
3472 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2306
3430 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2298
3473 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2298
3431 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2297
3474 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2297
@@ -3433,7 +3476,7 b' msgstr ""'
3433 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2301
3476 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2301
3434 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2352
3477 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2352
3435 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2353
3478 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2353
3436 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2553 rhodecode/model/db.py:3146
3479 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2553 rhodecode/model/db.py:3147
3437 msgid "User Registration with automatic account activation"
3480 msgid "User Registration with automatic account activation"
3438 msgstr ""
3481 msgstr ""
3439
3482
@@ -3464,6 +3507,7 b' msgstr ""'
3464 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3029
3507 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3029
3465 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3115
3508 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3115
3466 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3121
3509 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3121
3510 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3152
3467 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2308
3511 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2308
3468 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2300
3512 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2300
3469 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2299
3513 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2299
@@ -3471,7 +3515,7 b' msgstr ""'
3471 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2303
3515 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2303
3472 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2358
3516 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2358
3473 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2359
3517 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2359
3474 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2559 rhodecode/model/db.py:3152
3518 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2559 rhodecode/model/db.py:3153
3475 #: rhodecode/model/permission.py:105
3519 #: rhodecode/model/permission.py:105
3476 msgid "Manual activation of external account"
3520 msgid "Manual activation of external account"
3477 msgstr ""
3521 msgstr ""
@@ -3503,6 +3547,7 b' msgstr ""'
3503 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3030
3547 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3030
3504 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3116
3548 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3116
3505 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3122
3549 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3122
3550 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3153
3506 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2309
3551 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2309
3507 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2301
3552 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2301
3508 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2300
3553 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2300
@@ -3510,7 +3555,7 b' msgstr ""'
3510 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2304
3555 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2304
3511 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2359
3556 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2359
3512 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2360
3557 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2360
3513 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2560 rhodecode/model/db.py:3153
3558 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2560 rhodecode/model/db.py:3154
3514 #: rhodecode/model/permission.py:106
3559 #: rhodecode/model/permission.py:106
3515 msgid "Automatic activation of external account"
3560 msgid "Automatic activation of external account"
3516 msgstr ""
3561 msgstr ""
@@ -3536,6 +3581,7 b' msgstr ""'
3536 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3015
3581 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3015
3537 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3101
3582 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3101
3538 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3107
3583 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3107
3584 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3138
3539 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2298
3585 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2298
3540 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2290
3586 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2290
3541 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2289
3587 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2289
@@ -3543,7 +3589,7 b' msgstr ""'
3543 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2293
3589 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2293
3544 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2344
3590 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2344
3545 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2345
3591 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2345
3546 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2545 rhodecode/model/db.py:3138
3592 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2545 rhodecode/model/db.py:3139
3547 msgid "Repository creation enabled with write permission to a repository group"
3593 msgid "Repository creation enabled with write permission to a repository group"
3548 msgstr ""
3594 msgstr ""
3549
3595
@@ -3568,6 +3614,7 b' msgstr ""'
3568 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3016
3614 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3016
3569 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3102
3615 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3102
3570 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3108
3616 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3108
3617 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3139
3571 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2299
3618 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2299
3572 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2291
3619 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2291
3573 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2290
3620 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2290
@@ -3575,7 +3622,7 b' msgstr ""'
3575 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2294
3622 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2294
3576 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2345
3623 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2345
3577 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2346
3624 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2346
3578 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2546 rhodecode/model/db.py:3139
3625 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2546 rhodecode/model/db.py:3140
3579 msgid "Repository creation disabled with write permission to a repository group"
3626 msgid "Repository creation disabled with write permission to a repository group"
3580 msgstr ""
3627 msgstr ""
3581
3628
@@ -3597,6 +3644,7 b' msgstr ""'
3597 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2985
3644 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2985
3598 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3071
3645 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3071
3599 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3077
3646 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3077
3647 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3108
3600 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2273
3648 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2273
3601 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2265
3649 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2265
3602 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2264
3650 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2264
@@ -3604,7 +3652,7 b' msgstr ""'
3604 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2268
3652 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2268
3605 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2319
3653 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2319
3606 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2320
3654 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2320
3607 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2520 rhodecode/model/db.py:3108
3655 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2520 rhodecode/model/db.py:3109
3608 msgid "RhodeCode Super Administrator"
3656 msgid "RhodeCode Super Administrator"
3609 msgstr ""
3657 msgstr ""
3610
3658
@@ -3624,6 +3672,7 b' msgstr ""'
3624 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3032
3672 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3032
3625 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3118
3673 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3118
3626 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3124
3674 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3124
3675 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3155
3627 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2311
3676 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2311
3628 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2303
3677 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2303
3629 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2302
3678 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2302
@@ -3631,7 +3680,7 b' msgstr ""'
3631 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2306
3680 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2306
3632 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2361
3681 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2361
3633 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2362
3682 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2362
3634 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2562 rhodecode/model/db.py:3155
3683 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2562 rhodecode/model/db.py:3156
3635 msgid "Inherit object permissions from default user disabled"
3684 msgid "Inherit object permissions from default user disabled"
3636 msgstr ""
3685 msgstr ""
3637
3686
@@ -3651,6 +3700,7 b' msgstr ""'
3651 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3033
3700 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3033
3652 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3119
3701 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3119
3653 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3125
3702 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3125
3703 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3156
3654 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2312
3704 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2312
3655 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2304
3705 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2304
3656 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2303
3706 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2303
@@ -3658,7 +3708,7 b' msgstr ""'
3658 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2307
3708 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2307
3659 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2362
3709 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2362
3660 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2363
3710 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2363
3661 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2563 rhodecode/model/db.py:3156
3711 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2563 rhodecode/model/db.py:3157
3662 msgid "Inherit object permissions from default user enabled"
3712 msgid "Inherit object permissions from default user enabled"
3663 msgstr ""
3713 msgstr ""
3664
3714
@@ -3670,6 +3720,7 b' msgstr ""'
3670 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1137
3720 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1137
3671 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1189
3721 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1189
3672 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1195
3722 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1195
3723 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1202
3673 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:910
3724 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:910
3674 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:911
3725 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:911
3675 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:910
3726 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:910
@@ -3677,7 +3728,7 b' msgstr ""'
3677 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:912
3728 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:912
3678 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:955
3729 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:955
3679 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:956
3730 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:956
3680 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1050 rhodecode/model/db.py:1202
3731 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1050 rhodecode/model/db.py:1203
3681 msgid "all"
3732 msgid "all"
3682 msgstr ""
3733 msgstr ""
3683
3734
@@ -3689,6 +3740,7 b' msgstr ""'
3689 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1138
3740 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1138
3690 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1190
3741 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1190
3691 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1196
3742 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1196
3743 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1203
3692 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:911
3744 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:911
3693 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:912
3745 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:912
3694 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:911
3746 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:911
@@ -3696,7 +3748,7 b' msgstr ""'
3696 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:913
3748 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:913
3697 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:956
3749 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:956
3698 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:957
3750 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:957
3699 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1051 rhodecode/model/db.py:1203
3751 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1051 rhodecode/model/db.py:1204
3700 msgid "http/web interface"
3752 msgid "http/web interface"
3701 msgstr ""
3753 msgstr ""
3702
3754
@@ -3708,6 +3760,7 b' msgstr ""'
3708 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1139
3760 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1139
3709 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1191
3761 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1191
3710 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1197
3762 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1197
3763 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1204
3711 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:912
3764 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:912
3712 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:913
3765 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:913
3713 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:912
3766 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:912
@@ -3715,7 +3768,7 b' msgstr ""'
3715 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:914
3768 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:914
3716 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:957
3769 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:957
3717 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:958
3770 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:958
3718 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1052 rhodecode/model/db.py:1204
3771 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1052 rhodecode/model/db.py:1205
3719 msgid "vcs (git/hg/svn protocol)"
3772 msgid "vcs (git/hg/svn protocol)"
3720 msgstr ""
3773 msgstr ""
3721
3774
@@ -3727,6 +3780,7 b' msgstr ""'
3727 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1140
3780 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1140
3728 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1192
3781 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1192
3729 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1198
3782 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1198
3783 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1205
3730 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:913
3784 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:913
3731 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:914
3785 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:914
3732 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:913
3786 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:913
@@ -3734,7 +3788,7 b' msgstr ""'
3734 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:915
3788 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:915
3735 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:958
3789 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:958
3736 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:959
3790 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:959
3737 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1053 rhodecode/model/db.py:1205
3791 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1053 rhodecode/model/db.py:1206
3738 msgid "api calls"
3792 msgid "api calls"
3739 msgstr ""
3793 msgstr ""
3740
3794
@@ -3746,6 +3800,7 b' msgstr ""'
3746 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1141
3800 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:1141
3747 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1193
3801 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1193
3748 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1199
3802 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1199
3803 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1206
3749 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:914
3804 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:914
3750 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:915
3805 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:915
3751 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:914
3806 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:914
@@ -3753,7 +3808,7 b' msgstr ""'
3753 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:916
3808 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:916
3754 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:959
3809 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:959
3755 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:960
3810 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:960
3756 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1054 rhodecode/model/db.py:1206
3811 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:1054 rhodecode/model/db.py:1207
3757 msgid "feed access"
3812 msgid "feed access"
3758 msgstr ""
3813 msgstr ""
3759
3814
@@ -3765,6 +3820,7 b' msgstr ""'
3765 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2638
3820 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:2638
3766 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:2729
3821 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:2729
3767 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:2735
3822 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:2735
3823 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:2766
3768 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2051
3824 #: rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py:2051
3769 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2043
3825 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py:2043
3770 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2042
3826 #: rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py:2042
@@ -3772,7 +3828,7 b' msgstr ""'
3772 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2046
3828 #: rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py:2046
3773 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2090
3829 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2090
3774 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2091
3830 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2091
3775 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2284 rhodecode/model/db.py:2766
3831 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2284 rhodecode/model/db.py:2767
3776 msgid "No parent"
3832 msgid "No parent"
3777 msgstr ""
3833 msgstr ""
3778
3834
@@ -3784,9 +3840,10 b' msgstr ""'
3784 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3025
3840 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3025
3785 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3111
3841 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3111
3786 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3117
3842 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3117
3843 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3148
3787 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2354
3844 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2354
3788 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2355
3845 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2355
3789 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2555 rhodecode/model/db.py:3148
3846 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2555 rhodecode/model/db.py:3149
3790 msgid "Password reset enabled"
3847 msgid "Password reset enabled"
3791 msgstr ""
3848 msgstr ""
3792
3849
@@ -3798,9 +3855,10 b' msgstr ""'
3798 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3026
3855 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3026
3799 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3112
3856 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3112
3800 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3118
3857 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3118
3858 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3149
3801 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2355
3859 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2355
3802 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2356
3860 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2356
3803 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2556 rhodecode/model/db.py:3149
3861 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2556 rhodecode/model/db.py:3150
3804 msgid "Password reset hidden"
3862 msgid "Password reset hidden"
3805 msgstr ""
3863 msgstr ""
3806
3864
@@ -3812,9 +3870,10 b' msgstr ""'
3812 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3027
3870 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3027
3813 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3113
3871 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3113
3814 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3119
3872 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3119
3873 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3150
3815 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2356
3874 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2356
3816 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2357
3875 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2357
3817 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2557 rhodecode/model/db.py:3150
3876 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2557 rhodecode/model/db.py:3151
3818 msgid "Password reset disabled"
3877 msgid "Password reset disabled"
3819 msgstr ""
3878 msgstr ""
3820
3879
@@ -3825,7 +3884,8 b' msgstr ""'
3825 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3002
3884 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3002
3826 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3088
3885 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3088
3827 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3094
3886 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3094
3828 #: rhodecode/model/db.py:3125
3887 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3125
3888 #: rhodecode/model/db.py:3126
3829 msgid "Branch no permissions"
3889 msgid "Branch no permissions"
3830 msgstr ""
3890 msgstr ""
3831
3891
@@ -3836,7 +3896,8 b' msgstr ""'
3836 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3003
3896 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3003
3837 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3089
3897 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3089
3838 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3095
3898 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3095
3839 #: rhodecode/model/db.py:3126
3899 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3126
3900 #: rhodecode/model/db.py:3127
3840 msgid "Branch access by web merge"
3901 msgid "Branch access by web merge"
3841 msgstr ""
3902 msgstr ""
3842
3903
@@ -3847,7 +3908,8 b' msgstr ""'
3847 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3004
3908 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3004
3848 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3090
3909 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3090
3849 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3096
3910 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3096
3850 #: rhodecode/model/db.py:3127
3911 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3127
3912 #: rhodecode/model/db.py:3128
3851 msgid "Branch access by push"
3913 msgid "Branch access by push"
3852 msgstr ""
3914 msgstr ""
3853
3915
@@ -3858,16 +3920,48 b' msgstr ""'
3858 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3005
3920 #: rhodecode/lib/dbmigrate/schema/db_4_18_0_1.py:3005
3859 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3091
3921 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:3091
3860 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3097
3922 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:3097
3861 #: rhodecode/model/db.py:3128
3923 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:3128
3924 #: rhodecode/model/db.py:3129
3862 msgid "Branch access by push with force"
3925 msgid "Branch access by push with force"
3863 msgstr ""
3926 msgstr ""
3864
3927
3865 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1194
3928 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_0.py:1194
3866 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1200
3929 #: rhodecode/lib/dbmigrate/schema/db_4_19_0_2.py:1200
3867 #: rhodecode/model/db.py:1207
3930 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1207
3931 #: rhodecode/model/db.py:1208
3868 msgid "artifacts downloads"
3932 msgid "artifacts downloads"
3869 msgstr ""
3933 msgstr ""
3870
3934
3935 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1213
3936 #: rhodecode/model/db.py:1214
3937 msgid "Token for all actions."
3938 msgstr ""
3939
3940 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1214
3941 #: rhodecode/model/db.py:1215
3942 msgid "Token to access RhodeCode pages via web interface without login using `api_access_controllers_whitelist` functionality."
3943 msgstr ""
3944
3945 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1216
3946 #: rhodecode/model/db.py:1217
3947 msgid "Token to interact over git/hg/svn protocols. Requires auth_token authentication plugin to be active. <br/>Such Token should be used then instead of a password to interact with a repository, and additionally can be limited to single repository using repo scope."
3948 msgstr ""
3949
3950 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1221
3951 #: rhodecode/model/db.py:1222
3952 msgid "Token limited to api calls."
3953 msgstr ""
3954
3955 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1222
3956 #: rhodecode/model/db.py:1223
3957 msgid "Token to read RSS/ATOM feed."
3958 msgstr ""
3959
3960 #: rhodecode/lib/dbmigrate/schema/db_4_20_0_0.py:1223
3961 #: rhodecode/model/db.py:1224
3962 msgid "Token for artifacts downloads."
3963 msgstr ""
3964
3871 #: rhodecode/lib/index/whoosh.py:189
3965 #: rhodecode/lib/index/whoosh.py:189
3872 msgid "Index Type"
3966 msgid "Index Type"
3873 msgstr ""
3967 msgstr ""
@@ -3888,51 +3982,51 b' msgstr ""'
3888 msgid "Commit index"
3982 msgid "Commit index"
3889 msgstr ""
3983 msgstr ""
3890
3984
3891 #: rhodecode/lib/vcs/backends/base.py:150
3985 #: rhodecode/lib/vcs/backends/base.py:186
3892 msgid "This pull request can be automatically merged."
3986 msgid "This pull request can be automatically merged."
3893 msgstr ""
3987 msgstr ""
3894
3988
3895 #: rhodecode/lib/vcs/backends/base.py:152
3989 #: rhodecode/lib/vcs/backends/base.py:188
3896 msgid "This pull request cannot be merged because of an unhandled exception. {exception}"
3990 msgid "This pull request cannot be merged because of an unhandled exception. {exception}"
3897 msgstr ""
3991 msgstr ""
3898
3992
3899 #: rhodecode/lib/vcs/backends/base.py:155
3993 #: rhodecode/lib/vcs/backends/base.py:191
3900 msgid "This pull request cannot be merged because of merge conflicts. {unresolved_files}"
3994 msgid "This pull request cannot be merged because of merge conflicts. {unresolved_files}"
3901 msgstr ""
3995 msgstr ""
3902
3996
3903 #: rhodecode/lib/vcs/backends/base.py:157
3997 #: rhodecode/lib/vcs/backends/base.py:193
3904 msgid "This pull request could not be merged because push to target:`{target}@{merge_commit}` failed."
3998 msgid "This pull request could not be merged because push to target:`{target}@{merge_commit}` failed."
3905 msgstr ""
3999 msgstr ""
3906
4000
3907 #: rhodecode/lib/vcs/backends/base.py:160
4001 #: rhodecode/lib/vcs/backends/base.py:196
3908 msgid "This pull request cannot be merged because the target `{target_ref.name}` is not a head."
4002 msgid "This pull request cannot be merged because the target `{target_ref.name}` is not a head."
3909 msgstr ""
4003 msgstr ""
3910
4004
3911 #: rhodecode/lib/vcs/backends/base.py:163
4005 #: rhodecode/lib/vcs/backends/base.py:199
3912 msgid "This pull request cannot be merged because the source contains more branches than the target."
4006 msgid "This pull request cannot be merged because the source contains more branches than the target."
3913 msgstr ""
4007 msgstr ""
3914
4008
3915 #: rhodecode/lib/vcs/backends/base.py:166
4009 #: rhodecode/lib/vcs/backends/base.py:202
3916 msgid "This pull request cannot be merged because the target `{target_ref.name}` has multiple heads: `{heads}`."
4010 msgid "This pull request cannot be merged because the target `{target_ref.name}` has multiple heads: `{heads}`."
3917 msgstr ""
4011 msgstr ""
3918
4012
3919 #: rhodecode/lib/vcs/backends/base.py:169
4013 #: rhodecode/lib/vcs/backends/base.py:205
3920 msgid "This pull request cannot be merged because the target repository is locked by {locked_by}."
4014 msgid "This pull request cannot be merged because the target repository is locked by {locked_by}."
3921 msgstr ""
4015 msgstr ""
3922
4016
3923 #: rhodecode/lib/vcs/backends/base.py:173
4017 #: rhodecode/lib/vcs/backends/base.py:209
3924 msgid "This pull request cannot be merged because the target reference `{target_ref.name}` is missing."
4018 msgid "This pull request cannot be merged because the target reference `{target_ref.name}` is missing."
3925 msgstr ""
4019 msgstr ""
3926
4020
3927 #: rhodecode/lib/vcs/backends/base.py:176
4021 #: rhodecode/lib/vcs/backends/base.py:212
3928 msgid "This pull request cannot be merged because the source reference `{source_ref.name}` is missing."
4022 msgid "This pull request cannot be merged because the source reference `{source_ref.name}` is missing."
3929 msgstr ""
4023 msgstr ""
3930
4024
3931 #: rhodecode/lib/vcs/backends/base.py:179
4025 #: rhodecode/lib/vcs/backends/base.py:215
3932 msgid "This pull request cannot be merged because of conflicts related to sub repositories."
4026 msgid "This pull request cannot be merged because of conflicts related to sub repositories."
3933 msgstr ""
4027 msgstr ""
3934
4028
3935 #: rhodecode/lib/vcs/backends/base.py:184
4029 #: rhodecode/lib/vcs/backends/base.py:220
3936 msgid "This pull request cannot be merged because the target or the source reference is missing."
4030 msgid "This pull request cannot be merged because the target or the source reference is missing."
3937 msgstr ""
4031 msgstr ""
3938
4032
@@ -3952,38 +4046,6 b' msgstr ""'
3952 msgid "1 month {end_date}"
4046 msgid "1 month {end_date}"
3953 msgstr ""
4047 msgstr ""
3954
4048
3955 #: rhodecode/model/comment.py:485
3956 msgid "made a comment"
3957 msgstr ""
3958
3959 #: rhodecode/model/comment.py:486
3960 msgid "Show it now"
3961 msgstr ""
3962
3963 #: rhodecode/model/db.py:1213
3964 msgid "Token for all actions."
3965 msgstr ""
3966
3967 #: rhodecode/model/db.py:1214
3968 msgid "Token to access RhodeCode pages via web interface without login using `api_access_controllers_whitelist` functionality."
3969 msgstr ""
3970
3971 #: rhodecode/model/db.py:1216
3972 msgid "Token to interact over git/hg/svn protocols. Requires auth_token authentication plugin to be active. <br/>Such Token should be used then instead of a password to interact with a repository, and additionally can be limited to single repository using repo scope."
3973 msgstr ""
3974
3975 #: rhodecode/model/db.py:1221
3976 msgid "Token limited to api calls."
3977 msgstr ""
3978
3979 #: rhodecode/model/db.py:1222
3980 msgid "Token to read RSS/ATOM feed."
3981 msgstr ""
3982
3983 #: rhodecode/model/db.py:1223
3984 msgid "Token for artifacts downloads."
3985 msgstr ""
3986
3987 #: rhodecode/model/forms.py:88
4049 #: rhodecode/model/forms.py:88
3988 msgid "Please enter a login"
4050 msgid "Please enter a login"
3989 msgstr ""
4051 msgstr ""
@@ -4094,8 +4156,8 b' msgstr ""'
4094 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:13
4156 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:13
4095 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:13
4157 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:13
4096 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:17
4158 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:17
4097 #: rhodecode/templates/changeset/changeset_file_comment.mako:337
4159 #: rhodecode/templates/changeset/changeset_file_comment.mako:364
4098 #: rhodecode/templates/changeset/changeset_file_comment.mako:388
4160 #: rhodecode/templates/changeset/changeset_file_comment.mako:415
4099 #: rhodecode/templates/data_table/_dt_elements.mako:450
4161 #: rhodecode/templates/data_table/_dt_elements.mako:450
4100 msgid "Write"
4162 msgid "Write"
4101 msgstr ""
4163 msgstr ""
@@ -4123,7 +4185,7 b' msgstr ""'
4123 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:18
4185 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:18
4124 #: rhodecode/templates/admin/users/user_add.mako:11
4186 #: rhodecode/templates/admin/users/user_add.mako:11
4125 #: rhodecode/templates/admin/users/user_edit.mako:12
4187 #: rhodecode/templates/admin/users/user_edit.mako:12
4126 #: rhodecode/templates/base/base.mako:839
4188 #: rhodecode/templates/base/base.mako:838
4127 msgid "Admin"
4189 msgid "Admin"
4128 msgstr ""
4190 msgstr ""
4129
4191
@@ -4171,103 +4233,103 b' msgstr ""'
4171 msgid "Disable password recovery"
4233 msgid "Disable password recovery"
4172 msgstr ""
4234 msgstr ""
4173
4235
4174 #: rhodecode/model/pull_request.py:215
4236 #: rhodecode/model/pull_request.py:245
4175 msgid "Pull request update successful."
4237 msgid "Pull request update successful."
4176 msgstr ""
4238 msgstr ""
4177
4239
4178 #: rhodecode/model/pull_request.py:217
4240 #: rhodecode/model/pull_request.py:247
4179 msgid "Pull request update failed because of an unknown error."
4241 msgid "Pull request update failed because of an unknown error."
4180 msgstr ""
4242 msgstr ""
4181
4243
4182 #: rhodecode/model/pull_request.py:219
4244 #: rhodecode/model/pull_request.py:249
4183 msgid "No update needed because the source and target have not changed."
4245 msgid "No update needed because the source and target have not changed."
4184 msgstr ""
4246 msgstr ""
4185
4247
4186 #: rhodecode/model/pull_request.py:221
4248 #: rhodecode/model/pull_request.py:251
4187 msgid "Pull request cannot be updated because the reference type is not supported for an update. Only Branch, Tag or Bookmark is allowed."
4249 msgid "Pull request cannot be updated because the reference type is not supported for an update. Only Branch, Tag or Bookmark is allowed."
4188 msgstr ""
4250 msgstr ""
4189
4251
4190 #: rhodecode/model/pull_request.py:224
4252 #: rhodecode/model/pull_request.py:254
4191 msgid "This pull request cannot be updated because the target reference is missing."
4253 msgid "This pull request cannot be updated because the target reference is missing."
4192 msgstr ""
4254 msgstr ""
4193
4255
4194 #: rhodecode/model/pull_request.py:227
4256 #: rhodecode/model/pull_request.py:257
4195 msgid "This pull request cannot be updated because the source reference is missing."
4257 msgid "This pull request cannot be updated because the source reference is missing."
4196 msgstr ""
4258 msgstr ""
4197
4259
4198 #: rhodecode/model/pull_request.py:1518
4260 #: rhodecode/model/pull_request.py:1681
4199 msgid "Server-side pull request merging is disabled."
4261 msgid "Server-side pull request merging is disabled."
4200 msgstr ""
4262 msgstr ""
4201
4263
4202 #: rhodecode/model/pull_request.py:1521
4264 #: rhodecode/model/pull_request.py:1684
4203 msgid "This pull request is closed."
4265 msgid "This pull request is closed."
4204 msgstr ""
4266 msgstr ""
4205
4267
4206 #: rhodecode/model/pull_request.py:1535
4268 #: rhodecode/model/pull_request.py:1698
4207 msgid "Pull request merging is not supported."
4269 msgid "Pull request merging is not supported."
4208 msgstr ""
4270 msgstr ""
4209
4271
4210 #: rhodecode/model/pull_request.py:1552
4272 #: rhodecode/model/pull_request.py:1715
4211 msgid "Target repository large files support is disabled."
4273 msgid "Target repository large files support is disabled."
4212 msgstr ""
4274 msgstr ""
4213
4275
4214 #: rhodecode/model/pull_request.py:1555
4276 #: rhodecode/model/pull_request.py:1718
4215 msgid "Source repository large files support is disabled."
4277 msgid "Source repository large files support is disabled."
4216 msgstr ""
4278 msgstr ""
4217
4279
4218 #: rhodecode/model/pull_request.py:1739 rhodecode/model/scm.py:1004
4280 #: rhodecode/model/pull_request.py:1902 rhodecode/model/scm.py:1004
4219 #: rhodecode/templates/admin/my_account/my_account.mako:32
4281 #: rhodecode/templates/admin/my_account/my_account.mako:32
4220 #: rhodecode/templates/base/base.mako:636
4282 #: rhodecode/templates/base/base.mako:638
4221 #: rhodecode/templates/summary/components.mako:46
4283 #: rhodecode/templates/summary/components.mako:46
4222 msgid "Bookmarks"
4284 msgid "Bookmarks"
4223 msgstr ""
4285 msgstr ""
4224
4286
4225 #: rhodecode/model/pull_request.py:1744
4287 #: rhodecode/model/pull_request.py:1907
4226 msgid "Commit IDs"
4288 msgid "Commit IDs"
4227 msgstr ""
4289 msgstr ""
4228
4290
4229 #: rhodecode/model/pull_request.py:1747
4291 #: rhodecode/model/pull_request.py:1910
4230 #: rhodecode/templates/summary/components.mako:22
4292 #: rhodecode/templates/summary/components.mako:22
4231 msgid "Closed Branches"
4293 msgid "Closed Branches"
4232 msgstr ""
4294 msgstr ""
4233
4295
4234 #: rhodecode/model/pull_request.py:1929
4296 #: rhodecode/model/pull_request.py:2094
4235 msgid "WIP marker in title prevents from accidental merge."
4297 msgid "WIP marker in title prevents from accidental merge."
4236 msgstr ""
4298 msgstr ""
4237
4299
4238 #: rhodecode/model/pull_request.py:1939
4300 #: rhodecode/model/pull_request.py:2104
4239 msgid "User `{}` not allowed to perform merge."
4301 msgid "User `{}` not allowed to perform merge."
4240 msgstr ""
4302 msgstr ""
4241
4303
4242 #: rhodecode/model/pull_request.py:1957
4304 #: rhodecode/model/pull_request.py:2122
4243 msgid "Target branch `{}` changes rejected by rule {}."
4305 msgid "Target branch `{}` changes rejected by rule {}."
4244 msgstr ""
4306 msgstr ""
4245
4307
4246 #: rhodecode/model/pull_request.py:1971
4308 #: rhodecode/model/pull_request.py:2136
4247 msgid "Pull request reviewer approval is pending."
4309 msgid "Pull request reviewer approval is pending."
4248 msgstr ""
4310 msgstr ""
4249
4311
4250 #: rhodecode/model/pull_request.py:1985
4312 #: rhodecode/model/pull_request.py:2150
4251 msgid "Cannot merge, {} TODO still not resolved."
4313 msgid "Cannot merge, {} TODO still not resolved."
4252 msgstr ""
4314 msgstr ""
4253
4315
4254 #: rhodecode/model/pull_request.py:1988
4316 #: rhodecode/model/pull_request.py:2153
4255 msgid "Cannot merge, {} TODOs still not resolved."
4317 msgid "Cannot merge, {} TODOs still not resolved."
4256 msgstr ""
4318 msgstr ""
4257
4319
4258 #: rhodecode/model/pull_request.py:2043
4320 #: rhodecode/model/pull_request.py:2208
4259 msgid "Merge strategy: rebase"
4321 msgid "Merge strategy: rebase"
4260 msgstr ""
4322 msgstr ""
4261
4323
4262 #: rhodecode/model/pull_request.py:2048
4324 #: rhodecode/model/pull_request.py:2213
4263 msgid "Merge strategy: explicit merge commit"
4325 msgid "Merge strategy: explicit merge commit"
4264 msgstr ""
4326 msgstr ""
4265
4327
4266 #: rhodecode/model/pull_request.py:2056
4328 #: rhodecode/model/pull_request.py:2221
4267 msgid "Source branch will be closed before the merge."
4329 msgid "Source branch will be closed before the merge."
4268 msgstr ""
4330 msgstr ""
4269
4331
4270 #: rhodecode/model/pull_request.py:2058
4332 #: rhodecode/model/pull_request.py:2223
4271 msgid "Source branch will be deleted after the merge."
4333 msgid "Source branch will be deleted after the merge."
4272 msgstr ""
4334 msgstr ""
4273
4335
@@ -4613,222 +4675,222 b' msgid ": , "'
4613 msgstr ""
4675 msgstr ""
4614
4676
4615 #: rhodecode/public/js/scripts.js:20822 rhodecode/public/js/scripts.min.js:1
4677 #: rhodecode/public/js/scripts.js:20822 rhodecode/public/js/scripts.min.js:1
4616 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:59
4678 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:64
4617 #: rhodecode/public/js/src/plugins/jquery.autocomplete.js:87
4679 #: rhodecode/public/js/src/plugins/jquery.autocomplete.js:87
4618 msgid "No results"
4680 msgid "No results"
4619 msgstr ""
4681 msgstr ""
4620
4682
4621 #: rhodecode/public/js/scripts.js:22547 rhodecode/public/js/scripts.min.js:1
4683 #: rhodecode/public/js/scripts.js:22547 rhodecode/public/js/scripts.min.js:1
4622 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:161
4684 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:170
4623 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:109
4685 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:109
4624 msgid "{0} year"
4686 msgid "{0} year"
4625 msgstr ""
4687 msgstr ""
4626
4688
4627 #: rhodecode/public/js/scripts.js:22548 rhodecode/public/js/scripts.min.js:1
4689 #: rhodecode/public/js/scripts.js:22548 rhodecode/public/js/scripts.min.js:1
4628 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:149
4690 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:158
4629 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:110
4691 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:110
4630 msgid "{0} month"
4692 msgid "{0} month"
4631 msgstr ""
4693 msgstr ""
4632
4694
4633 #: rhodecode/public/js/scripts.js:22549 rhodecode/public/js/scripts.min.js:1
4695 #: rhodecode/public/js/scripts.js:22549 rhodecode/public/js/scripts.min.js:1
4634 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:144
4696 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:153
4635 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:111
4697 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:111
4636 msgid "{0} day"
4698 msgid "{0} day"
4637 msgstr ""
4699 msgstr ""
4638
4700
4639 #: rhodecode/public/js/scripts.js:22550 rhodecode/public/js/scripts.min.js:1
4701 #: rhodecode/public/js/scripts.js:22550 rhodecode/public/js/scripts.min.js:1
4640 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:146
4702 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:155
4641 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:112
4703 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:112
4642 msgid "{0} hour"
4704 msgid "{0} hour"
4643 msgstr ""
4705 msgstr ""
4644
4706
4645 #: rhodecode/public/js/scripts.js:22551 rhodecode/public/js/scripts.min.js:1
4707 #: rhodecode/public/js/scripts.js:22551 rhodecode/public/js/scripts.min.js:1
4646 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:148
4708 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:157
4647 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:113
4709 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:113
4648 msgid "{0} min"
4710 msgid "{0} min"
4649 msgstr ""
4711 msgstr ""
4650
4712
4651 #: rhodecode/public/js/scripts.js:22552 rhodecode/public/js/scripts.min.js:1
4713 #: rhodecode/public/js/scripts.js:22552 rhodecode/public/js/scripts.min.js:1
4652 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:158
4714 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:167
4653 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:114
4715 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:114
4654 msgid "{0} sec"
4716 msgid "{0} sec"
4655 msgstr ""
4717 msgstr ""
4656
4718
4657 #: rhodecode/public/js/scripts.js:22572 rhodecode/public/js/scripts.min.js:1
4719 #: rhodecode/public/js/scripts.js:22572 rhodecode/public/js/scripts.min.js:1
4658 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:124
4720 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:133
4659 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:134
4721 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:134
4660 msgid "in {0}"
4722 msgid "in {0}"
4661 msgstr ""
4723 msgstr ""
4662
4724
4663 #: rhodecode/public/js/scripts.js:22580 rhodecode/public/js/scripts.min.js:1
4725 #: rhodecode/public/js/scripts.js:22580 rhodecode/public/js/scripts.min.js:1
4664 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:141
4726 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:150
4665 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:142
4727 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:142
4666 msgid "{0} ago"
4728 msgid "{0} ago"
4667 msgstr ""
4729 msgstr ""
4668
4730
4669 #: rhodecode/public/js/scripts.js:22592 rhodecode/public/js/scripts.min.js:1
4731 #: rhodecode/public/js/scripts.js:22592 rhodecode/public/js/scripts.min.js:1
4670 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:163
4732 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:172
4671 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:154
4733 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:154
4672 msgid "{0}, {1} ago"
4734 msgid "{0}, {1} ago"
4673 msgstr ""
4735 msgstr ""
4674
4736
4675 #: rhodecode/public/js/scripts.js:22594 rhodecode/public/js/scripts.min.js:1
4737 #: rhodecode/public/js/scripts.js:22594 rhodecode/public/js/scripts.min.js:1
4676 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:126
4738 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:135
4677 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:156
4739 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:156
4678 msgid "in {0}, {1}"
4740 msgid "in {0}, {1}"
4679 msgstr ""
4741 msgstr ""
4680
4742
4681 #: rhodecode/public/js/scripts.js:22598 rhodecode/public/js/scripts.min.js:1
4743 #: rhodecode/public/js/scripts.js:22598 rhodecode/public/js/scripts.min.js:1
4682 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:142
4744 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:151
4683 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:160
4745 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:160
4684 msgid "{0} and {1}"
4746 msgid "{0} and {1}"
4685 msgstr ""
4747 msgstr ""
4686
4748
4687 #: rhodecode/public/js/scripts.js:22600 rhodecode/public/js/scripts.min.js:1
4749 #: rhodecode/public/js/scripts.js:22600 rhodecode/public/js/scripts.min.js:1
4688 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:143
4750 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:152
4689 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:162
4751 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:162
4690 msgid "{0} and {1} ago"
4752 msgid "{0} and {1} ago"
4691 msgstr ""
4753 msgstr ""
4692
4754
4693 #: rhodecode/public/js/scripts.js:22602 rhodecode/public/js/scripts.min.js:1
4755 #: rhodecode/public/js/scripts.js:22602 rhodecode/public/js/scripts.min.js:1
4694 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:125
4756 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:134
4695 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:164
4757 #: rhodecode/public/js/src/plugins/jquery.timeago-extension.js:164
4696 msgid "in {0} and {1}"
4758 msgid "in {0} and {1}"
4697 msgstr ""
4759 msgstr ""
4698
4760
4699 #: rhodecode/public/js/scripts.js:37600 rhodecode/public/js/scripts.min.js:1
4761 #: rhodecode/public/js/scripts.js:37600 rhodecode/public/js/scripts.min.js:1
4700 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:46
4762 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:51
4701 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:4
4763 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:4
4702 msgid "Loading more results..."
4764 msgid "Loading more results..."
4703 msgstr ""
4765 msgstr ""
4704
4766
4705 #: rhodecode/public/js/scripts.js:37603 rhodecode/public/js/scripts.min.js:1
4767 #: rhodecode/public/js/scripts.js:37603 rhodecode/public/js/scripts.min.js:1
4706 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:76
4768 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:82
4707 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:7
4769 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:7
4708 msgid "Searching..."
4770 msgid "Searching..."
4709 msgstr ""
4771 msgstr ""
4710
4772
4711 #: rhodecode/public/js/scripts.js:37606 rhodecode/public/js/scripts.min.js:1
4773 #: rhodecode/public/js/scripts.js:37606 rhodecode/public/js/scripts.min.js:1
4712 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:52
4774 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:57
4713 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:10
4775 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:10
4714 msgid "No matches found"
4776 msgid "No matches found"
4715 msgstr ""
4777 msgstr ""
4716
4778
4717 #: rhodecode/public/js/scripts.js:37609 rhodecode/public/js/scripts.min.js:1
4779 #: rhodecode/public/js/scripts.js:37609 rhodecode/public/js/scripts.min.js:1
4718 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:45
4780 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
4719 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:13
4781 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:13
4720 msgid "Loading failed"
4782 msgid "Loading failed"
4721 msgstr ""
4783 msgstr ""
4722
4784
4723 #: rhodecode/public/js/scripts.js:37613 rhodecode/public/js/scripts.min.js:1
4785 #: rhodecode/public/js/scripts.js:37613 rhodecode/public/js/scripts.min.js:1
4724 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:66
4786 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72
4725 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:17
4787 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:17
4726 msgid "One result is available, press enter to select it."
4788 msgid "One result is available, press enter to select it."
4727 msgstr ""
4789 msgstr ""
4728
4790
4729 #: rhodecode/public/js/scripts.js:37615 rhodecode/public/js/scripts.min.js:1
4791 #: rhodecode/public/js/scripts.js:37615 rhodecode/public/js/scripts.min.js:1
4730 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:157
4792 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:166
4731 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:19
4793 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:19
4732 msgid "{0} results are available, use up and down arrow keys to navigate."
4794 msgid "{0} results are available, use up and down arrow keys to navigate."
4733 msgstr ""
4795 msgstr ""
4734
4796
4735 #: rhodecode/public/js/scripts.js:37620 rhodecode/public/js/scripts.min.js:1
4797 #: rhodecode/public/js/scripts.js:37620 rhodecode/public/js/scripts.min.js:1
4736 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:71
4798 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:77
4737 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:24
4799 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:24
4738 msgid "Please enter {0} or more character"
4800 msgid "Please enter {0} or more character"
4739 msgstr ""
4801 msgstr ""
4740
4802
4741 #: rhodecode/public/js/scripts.js:37622 rhodecode/public/js/scripts.min.js:1
4803 #: rhodecode/public/js/scripts.js:37622 rhodecode/public/js/scripts.min.js:1
4742 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72
4804 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:78
4743 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:26
4805 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:26
4744 msgid "Please enter {0} or more characters"
4806 msgid "Please enter {0} or more characters"
4745 msgstr ""
4807 msgstr ""
4746
4808
4747 #: rhodecode/public/js/scripts.js:37627 rhodecode/public/js/scripts.min.js:1
4809 #: rhodecode/public/js/scripts.js:37627 rhodecode/public/js/scripts.min.js:1
4748 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:69
4810 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:75
4749 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:31
4811 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:31
4750 msgid "Please delete {0} character"
4812 msgid "Please delete {0} character"
4751 msgstr ""
4813 msgstr ""
4752
4814
4753 #: rhodecode/public/js/scripts.js:37629 rhodecode/public/js/scripts.min.js:1
4815 #: rhodecode/public/js/scripts.js:37629 rhodecode/public/js/scripts.min.js:1
4754 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:70
4816 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:76
4755 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:33
4817 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:33
4756 msgid "Please delete {0} characters"
4818 msgid "Please delete {0} characters"
4757 msgstr ""
4819 msgstr ""
4758
4820
4759 #: rhodecode/public/js/scripts.js:37633 rhodecode/public/js/scripts.min.js:1
4821 #: rhodecode/public/js/scripts.js:37633 rhodecode/public/js/scripts.min.js:1
4760 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:114
4822 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:123
4761 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:37
4823 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:37
4762 msgid "You can only select {0} item"
4824 msgid "You can only select {0} item"
4763 msgstr ""
4825 msgstr ""
4764
4826
4765 #: rhodecode/public/js/scripts.js:37635 rhodecode/public/js/scripts.min.js:1
4827 #: rhodecode/public/js/scripts.js:37635 rhodecode/public/js/scripts.min.js:1
4766 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:115
4828 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:124
4767 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:39
4829 #: rhodecode/public/js/rhodecode/i18n/select2/translations.js:39
4768 msgid "You can only select {0} items"
4830 msgid "You can only select {0} items"
4769 msgstr ""
4831 msgstr ""
4770
4832
4771 #: rhodecode/public/js/scripts.js:38285 rhodecode/public/js/scripts.min.js:1
4833 #: rhodecode/public/js/scripts.js:38289 rhodecode/public/js/scripts.min.js:1
4772 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:7
4834 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:9
4773 #: rhodecode/public/js/src/rhodecode/utils/ajax.js:135
4835 #: rhodecode/public/js/src/rhodecode/utils/ajax.js:139
4774 msgid "Ajax Request Error"
4836 msgid "Ajax Request Error"
4775 msgstr ""
4837 msgstr ""
4776
4838
4777 #: rhodecode/public/js/scripts.js:38687 rhodecode/public/js/scripts.min.js:1
4839 #: rhodecode/public/js/scripts.js:38691 rhodecode/public/js/scripts.min.js:1
4778 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:133
4840 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:142
4779 #: rhodecode/public/js/src/rhodecode/changelog.js:35
4841 #: rhodecode/public/js/src/rhodecode/changelog.js:35
4780 msgid "showing {0} out of {1} commit"
4842 msgid "showing {0} out of {1} commit"
4781 msgstr ""
4843 msgstr ""
4782
4844
4783 #: rhodecode/public/js/scripts.js:38689 rhodecode/public/js/scripts.min.js:1
4845 #: rhodecode/public/js/scripts.js:38693 rhodecode/public/js/scripts.min.js:1
4784 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:134
4846 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:143
4785 #: rhodecode/public/js/src/rhodecode/changelog.js:37
4847 #: rhodecode/public/js/src/rhodecode/changelog.js:37
4786 msgid "showing {0} out of {1} commits"
4848 msgid "showing {0} out of {1} commits"
4787 msgstr ""
4849 msgstr ""
4788
4850
4789 #: rhodecode/public/js/scripts.js:39227 rhodecode/public/js/scripts.min.js:1
4851 #: rhodecode/public/js/scripts.js:39232 rhodecode/public/js/scripts.min.js:1
4790 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:79
4852 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:85
4791 #: rhodecode/public/js/src/rhodecode/codemirror.js:363
4853 #: rhodecode/public/js/src/rhodecode/codemirror.js:363
4792 msgid "Set status to Approved"
4854 msgid "Set status to Approved"
4793 msgstr ""
4855 msgstr ""
4794
4856
4795 #: rhodecode/public/js/scripts.js:39247 rhodecode/public/js/scripts.min.js:1
4857 #: rhodecode/public/js/scripts.js:39252 rhodecode/public/js/scripts.min.js:1
4796 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:80
4858 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86
4797 #: rhodecode/public/js/src/rhodecode/codemirror.js:383
4859 #: rhodecode/public/js/src/rhodecode/codemirror.js:383
4798 msgid "Set status to Rejected"
4860 msgid "Set status to Rejected"
4799 msgstr ""
4861 msgstr ""
4800
4862
4801 #: rhodecode/public/js/scripts.js:39266 rhodecode/public/js/scripts.min.js:1
4863 #: rhodecode/public/js/scripts.js:39271 rhodecode/public/js/scripts.min.js:1
4802 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:99
4864 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:106
4803 #: rhodecode/public/js/src/rhodecode/codemirror.js:402
4865 #: rhodecode/public/js/src/rhodecode/codemirror.js:402
4804 msgid "TODO comment"
4866 msgid "TODO comment"
4805 msgstr ""
4867 msgstr ""
4806
4868
4807 #: rhodecode/public/js/scripts.js:39286 rhodecode/public/js/scripts.min.js:1
4869 #: rhodecode/public/js/scripts.js:39291 rhodecode/public/js/scripts.min.js:1
4808 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:65
4870 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:71
4809 #: rhodecode/public/js/src/rhodecode/codemirror.js:422
4871 #: rhodecode/public/js/src/rhodecode/codemirror.js:422
4810 msgid "Note Comment"
4872 msgid "Note Comment"
4811 msgstr ""
4873 msgstr ""
4812
4874
4813 #: rhodecode/public/js/scripts.js:39587 rhodecode/public/js/scripts.js:39962
4875 #: rhodecode/public/js/scripts.js:39592 rhodecode/public/js/scripts.js:39967
4814 #: rhodecode/public/js/scripts.min.js:1
4876 #: rhodecode/public/js/scripts.min.js:1
4815 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:93
4877 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:99
4816 #: rhodecode/public/js/src/rhodecode/codemirror.js:723
4878 #: rhodecode/public/js/src/rhodecode/codemirror.js:723
4817 #: rhodecode/public/js/src/rhodecode/comments.js:254
4879 #: rhodecode/public/js/src/rhodecode/comments.js:254
4818 msgid "Status Review"
4880 msgid "Status Review"
4819 msgstr ""
4881 msgstr ""
4820
4882
4821 #: rhodecode/public/js/scripts.js:39602 rhodecode/public/js/scripts.js:39977
4883 #: rhodecode/public/js/scripts.js:39607 rhodecode/public/js/scripts.js:39982
4822 #: rhodecode/public/js/scripts.min.js:1
4884 #: rhodecode/public/js/scripts.min.js:1
4823 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:21
4885 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:24
4824 #: rhodecode/public/js/src/rhodecode/codemirror.js:738
4886 #: rhodecode/public/js/src/rhodecode/codemirror.js:738
4825 #: rhodecode/public/js/src/rhodecode/comments.js:269
4887 #: rhodecode/public/js/src/rhodecode/comments.js:269
4826 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
4888 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
4827 msgstr ""
4889 msgstr ""
4828
4890
4829 #: rhodecode/public/js/scripts.js:39683 rhodecode/public/js/scripts.js:40172
4891 #: rhodecode/public/js/scripts.js:39688 rhodecode/public/js/scripts.js:40177
4830 #: rhodecode/public/js/scripts.js:41495 rhodecode/public/js/scripts.min.js:1
4892 #: rhodecode/public/js/scripts.js:41535 rhodecode/public/js/scripts.min.js:1
4831 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:43
4893 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
4832 #: rhodecode/public/js/src/rhodecode/codemirror.js:819
4894 #: rhodecode/public/js/src/rhodecode/codemirror.js:819
4833 #: rhodecode/public/js/src/rhodecode/comments.js:464
4895 #: rhodecode/public/js/src/rhodecode/comments.js:464
4834 #: rhodecode/public/js/src/rhodecode/files.js:499
4896 #: rhodecode/public/js/src/rhodecode/files.js:499
@@ -4836,263 +4898,270 b' msgstr ""'
4836 msgid "Loading ..."
4898 msgid "Loading ..."
4837 msgstr ""
4899 msgstr ""
4838
4900
4839 #: rhodecode/public/js/scripts.js:39844 rhodecode/public/js/scripts.min.js:1
4901 #: rhodecode/public/js/scripts.js:39849 rhodecode/public/js/scripts.min.js:1
4902 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:117
4840 #: rhodecode/public/js/src/rhodecode/comments.js:136
4903 #: rhodecode/public/js/src/rhodecode/comments.js:136
4841 msgid "Updated Comment"
4904 msgid "Updated Comment"
4842 msgstr ""
4905 msgstr ""
4843
4906
4844 #: rhodecode/public/js/scripts.js:39868 rhodecode/public/js/scripts.min.js:1
4907 #: rhodecode/public/js/scripts.js:39873 rhodecode/public/js/scripts.min.js:1
4845 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:132
4908 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:141
4846 #: rhodecode/public/js/src/rhodecode/comments.js:160
4909 #: rhodecode/public/js/src/rhodecode/comments.js:160
4847 msgid "resolve comment"
4910 msgid "resolve comment"
4848 msgstr ""
4911 msgstr ""
4849
4912
4850 #: rhodecode/public/js/scripts.js:40121 rhodecode/public/js/scripts.min.js:1
4913 #: rhodecode/public/js/scripts.js:40126 rhodecode/public/js/scripts.min.js:1
4851 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:96
4914 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:102
4852 #: rhodecode/public/js/src/rhodecode/comments.js:413
4915 #: rhodecode/public/js/src/rhodecode/comments.js:413
4853 msgid "Submitting..."
4916 msgid "Submitting..."
4854 msgstr ""
4917 msgstr ""
4855
4918
4856 #: rhodecode/public/js/scripts.js:40403 rhodecode/public/js/scripts.min.js:1
4919 #: rhodecode/public/js/scripts.js:40423 rhodecode/public/js/scripts.min.js:1
4857 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:113
4920 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:122
4858 #: rhodecode/public/js/src/rhodecode/comments.js:695
4921 #: rhodecode/public/js/src/rhodecode/comments.js:710
4859 msgid "Yes, delete comment #{0}!"
4922 msgid "Yes, delete comment #{0}!"
4860 msgstr ""
4923 msgstr ""
4861
4924
4862 #: rhodecode/public/js/scripts.js:40458 rhodecode/public/js/scripts.min.js:1
4925 #: rhodecode/public/js/scripts.js:40487 rhodecode/public/js/scripts.min.js:1
4863 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:41
4926 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:46
4864 #: rhodecode/public/js/src/rhodecode/comments.js:750
4927 #: rhodecode/public/js/src/rhodecode/comments.js:774
4865 msgid "Leave a resolution comment, or click resolve button to resolve TODO comment #{0}"
4928 msgid "Leave a resolution comment, or click resolve button to resolve TODO comment #{0}"
4866 msgstr ""
4929 msgstr ""
4867
4930
4868 #: rhodecode/public/js/scripts.js:40667 rhodecode/public/js/scripts.min.js:1
4931 #: rhodecode/public/js/scripts.js:40696 rhodecode/public/js/scripts.min.js:1
4869 #: rhodecode/public/js/src/rhodecode/comments.js:959
4932 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
4933 #: rhodecode/public/js/src/rhodecode/comments.js:983
4870 msgid "Comment body was not changed."
4934 msgid "Comment body was not changed."
4871 msgstr ""
4935 msgstr ""
4872
4936
4873 #: rhodecode/public/js/scripts.js:40840 rhodecode/public/js/scripts.min.js:1
4937 #: rhodecode/public/js/scripts.js:40875 rhodecode/public/js/scripts.min.js:1
4874 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:39
4938 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
4875 #: rhodecode/public/js/src/rhodecode/comments.js:1132
4939 #: rhodecode/public/js/src/rhodecode/comments.js:1162
4876 msgid "Leave a comment on line {0}."
4940 msgid "Leave a comment on line {0}."
4877 msgstr ""
4941 msgstr ""
4878
4942
4879 #: rhodecode/public/js/scripts.js:40966 rhodecode/public/js/scripts.min.js:1
4943 #: rhodecode/public/js/scripts.js:41006 rhodecode/public/js/scripts.min.js:1
4880 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:100
4944 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:107
4881 #: rhodecode/public/js/src/rhodecode/comments.js:1258
4945 #: rhodecode/public/js/src/rhodecode/comments.js:1293
4882 msgid "TODO from comment {0} was fixed."
4946 msgid "TODO from comment {0} was fixed."
4883 msgstr ""
4947 msgstr ""
4884
4948
4885 #: rhodecode/public/js/scripts.js:41244 rhodecode/public/js/scripts.min.js:1
4949 #: rhodecode/public/js/scripts.js:41284 rhodecode/public/js/scripts.min.js:1
4886 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:136
4950 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:145
4887 #: rhodecode/public/js/src/rhodecode/files.js:248
4951 #: rhodecode/public/js/src/rhodecode/files.js:248
4888 msgid "truncated result"
4952 msgid "truncated result"
4889 msgstr ""
4953 msgstr ""
4890
4954
4891 #: rhodecode/public/js/scripts.js:41246 rhodecode/public/js/scripts.min.js:1
4955 #: rhodecode/public/js/scripts.js:41286 rhodecode/public/js/scripts.min.js:1
4892 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:137
4956 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:146
4893 #: rhodecode/public/js/src/rhodecode/files.js:250
4957 #: rhodecode/public/js/src/rhodecode/files.js:250
4894 msgid "truncated results"
4958 msgid "truncated results"
4895 msgstr ""
4959 msgstr ""
4896
4960
4897 #: rhodecode/public/js/scripts.js:41255 rhodecode/public/js/scripts.min.js:1
4961 #: rhodecode/public/js/scripts.js:41295 rhodecode/public/js/scripts.min.js:1
4898 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
4962 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:58
4899 #: rhodecode/public/js/src/rhodecode/files.js:259
4963 #: rhodecode/public/js/src/rhodecode/files.js:259
4900 msgid "No matching files"
4964 msgid "No matching files"
4901 msgstr ""
4965 msgstr ""
4902
4966
4903 #: rhodecode/public/js/scripts.js:41313 rhodecode/public/js/scripts.min.js:1
4967 #: rhodecode/public/js/scripts.js:41353 rhodecode/public/js/scripts.min.js:1
4904 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:77
4968 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
4905 #: rhodecode/public/js/src/rhodecode/files.js:317
4969 #: rhodecode/public/js/src/rhodecode/files.js:317
4906 msgid "Selection link"
4970 msgid "Selection link"
4907 msgstr ""
4971 msgstr ""
4908
4972
4909 #: rhodecode/public/js/scripts.js:41410 rhodecode/public/js/scripts.min.js:1
4973 #: rhodecode/public/js/scripts.js:41450 rhodecode/public/js/scripts.min.js:1
4910 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:8
4974 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10
4911 #: rhodecode/public/js/src/rhodecode/files.js:414
4975 #: rhodecode/public/js/src/rhodecode/files.js:414
4912 msgid "All Authors"
4976 msgid "All Authors"
4913 msgstr ""
4977 msgstr ""
4914
4978
4915 #: rhodecode/public/js/scripts.js:41560 rhodecode/public/js/scripts.js:41563
4979 #: rhodecode/public/js/scripts.js:41600 rhodecode/public/js/scripts.js:41603
4916 #: rhodecode/public/js/scripts.min.js:1
4980 #: rhodecode/public/js/scripts.min.js:1
4917 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:33
4981 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
4918 #: rhodecode/public/js/src/rhodecode/files.js:564
4982 #: rhodecode/public/js/src/rhodecode/files.js:564
4919 #: rhodecode/public/js/src/rhodecode/files.js:567
4983 #: rhodecode/public/js/src/rhodecode/files.js:567
4920 msgid "File `{0}` has a newer version available, or has been removed. Click {1} to see the latest version."
4984 msgid "File `{0}` has a newer version available, or has been removed. Click {1} to see the latest version."
4921 msgstr ""
4985 msgstr ""
4922
4986
4923 #: rhodecode/public/js/scripts.js:41566 rhodecode/public/js/scripts.min.js:1
4987 #: rhodecode/public/js/scripts.js:41606 rhodecode/public/js/scripts.min.js:1
4924 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:103
4988 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:111
4925 #: rhodecode/public/js/src/rhodecode/files.js:570
4989 #: rhodecode/public/js/src/rhodecode/files.js:570
4926 msgid "There is an existing path `{0}` at this commit."
4990 msgid "There is an existing path `{0}` at this commit."
4927 msgstr ""
4991 msgstr ""
4928
4992
4929 #: rhodecode/public/js/scripts.js:41569 rhodecode/public/js/scripts.min.js:1
4993 #: rhodecode/public/js/scripts.js:41609 rhodecode/public/js/scripts.min.js:1
4930 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:102
4994 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:110
4931 #: rhodecode/public/js/src/rhodecode/files.js:573
4995 #: rhodecode/public/js/src/rhodecode/files.js:573
4932 msgid "There is a later version of file tree available. Click {0} to create a file at the latest tree."
4996 msgid "There is a later version of file tree available. Click {0} to create a file at the latest tree."
4933 msgstr ""
4997 msgstr ""
4934
4998
4935 #: rhodecode/public/js/scripts.js:41623 rhodecode/public/js/scripts.min.js:1
4999 #: rhodecode/public/js/scripts.js:41663 rhodecode/public/js/scripts.min.js:1
4936 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:95
5000 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:101
4937 #: rhodecode/public/js/src/rhodecode/followers.js:26
5001 #: rhodecode/public/js/src/rhodecode/followers.js:26
4938 msgid "Stopped watching this repository"
5002 msgid "Stopped watching this repository"
4939 msgstr ""
5003 msgstr ""
4940
5004
4941 #: rhodecode/public/js/scripts.js:41624 rhodecode/public/js/scripts.min.js:1
5005 #: rhodecode/public/js/scripts.js:41664 rhodecode/public/js/scripts.min.js:1
4942 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:112
5006 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:121
4943 #: rhodecode/public/js/src/rhodecode/followers.js:27
5007 #: rhodecode/public/js/src/rhodecode/followers.js:27
4944 #: rhodecode/templates/base/base.mako:308
5008 #: rhodecode/templates/base/base.mako:310
4945 msgid "Watch"
5009 msgid "Watch"
4946 msgstr ""
5010 msgstr ""
4947
5011
4948 #: rhodecode/public/js/scripts.js:41627 rhodecode/public/js/scripts.min.js:1
5012 #: rhodecode/public/js/scripts.js:41667 rhodecode/public/js/scripts.min.js:1
4949 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:92
5013 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:98
4950 #: rhodecode/public/js/src/rhodecode/followers.js:30
5014 #: rhodecode/public/js/src/rhodecode/followers.js:30
4951 msgid "Started watching this repository"
5015 msgid "Started watching this repository"
4952 msgstr ""
5016 msgstr ""
4953
5017
4954 #: rhodecode/public/js/scripts.js:41628 rhodecode/public/js/scripts.min.js:1
5018 #: rhodecode/public/js/scripts.js:41668 rhodecode/public/js/scripts.min.js:1
4955 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:108
5019 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:116
4956 #: rhodecode/public/js/src/rhodecode/followers.js:31
5020 #: rhodecode/public/js/src/rhodecode/followers.js:31
4957 #: rhodecode/templates/base/base.mako:306
5021 #: rhodecode/templates/base/base.mako:308
4958 msgid "Unwatch"
5022 msgid "Unwatch"
4959 msgstr ""
5023 msgstr ""
4960
5024
4961 #: rhodecode/public/js/scripts.js:42010 rhodecode/public/js/scripts.min.js:1
5025 #: rhodecode/public/js/scripts.js:42165 rhodecode/public/js/scripts.min.js:1
4962 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10
5026 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12
4963 #: rhodecode/public/js/src/rhodecode/pullrequests.js:143
5027 #: rhodecode/public/js/src/rhodecode/pullrequests.js:186
4964 msgid "All reviewers must vote."
5028 msgid "All reviewers must vote."
4965 msgstr ""
5029 msgstr ""
4966
5030
4967 #: rhodecode/public/js/scripts.js:42019 rhodecode/public/js/scripts.min.js:1
5031 #: rhodecode/public/js/scripts.js:42174 rhodecode/public/js/scripts.min.js:1
4968 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:9
5032 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:11
4969 #: rhodecode/public/js/src/rhodecode/pullrequests.js:152
5033 #: rhodecode/public/js/src/rhodecode/pullrequests.js:195
4970 msgid "All individual reviewers must vote."
5034 msgid "All individual reviewers must vote."
4971 msgstr ""
5035 msgstr ""
4972
5036
4973 #: rhodecode/public/js/scripts.js:42024 rhodecode/public/js/scripts.min.js:1
5037 #: rhodecode/public/js/scripts.js:42179 rhodecode/public/js/scripts.min.js:1
4974 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12
5038 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:14
4975 #: rhodecode/public/js/src/rhodecode/pullrequests.js:157
5039 #: rhodecode/public/js/src/rhodecode/pullrequests.js:200
4976 msgid "At least {0} reviewer must vote."
5040 msgid "At least {0} reviewer must vote."
4977 msgstr ""
5041 msgstr ""
4978
5042
4979 #: rhodecode/public/js/scripts.js:42030 rhodecode/public/js/scripts.min.js:1
5043 #: rhodecode/public/js/scripts.js:42185 rhodecode/public/js/scripts.min.js:1
4980 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:13
5044 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:15
4981 #: rhodecode/public/js/src/rhodecode/pullrequests.js:163
5045 #: rhodecode/public/js/src/rhodecode/pullrequests.js:206
4982 msgid "At least {0} reviewers must vote."
5046 msgid "At least {0} reviewers must vote."
4983 msgstr ""
5047 msgstr ""
4984
5048
4985 #: rhodecode/public/js/scripts.js:42046 rhodecode/public/js/scripts.min.js:1
5049 #: rhodecode/public/js/scripts.js:42201 rhodecode/public/js/scripts.min.js:1
4986 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:74
5050 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:80
4987 #: rhodecode/public/js/src/rhodecode/pullrequests.js:179
5051 #: rhodecode/public/js/src/rhodecode/pullrequests.js:222
4988 msgid "Reviewers picked from source code changes."
5052 msgid "Reviewers picked from source code changes."
4989 msgstr ""
5053 msgstr ""
4990
5054
4991 #: rhodecode/public/js/scripts.js:42053 rhodecode/public/js/scripts.min.js:1
5055 #: rhodecode/public/js/scripts.js:42209 rhodecode/public/js/scripts.min.js:1
4992 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:6
5056 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:8
4993 #: rhodecode/public/js/src/rhodecode/pullrequests.js:186
5057 #: rhodecode/public/js/src/rhodecode/pullrequests.js:230
4994 msgid "Adding new reviewers is forbidden."
5058 msgid "Adding new reviewers is forbidden."
4995 msgstr ""
5059 msgstr ""
4996
5060
4997 #: rhodecode/public/js/scripts.js:42060 rhodecode/public/js/scripts.min.js:1
5061 #: rhodecode/public/js/scripts.js:42217 rhodecode/public/js/scripts.min.js:1
4998 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:15
5062 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:17
4999 #: rhodecode/public/js/src/rhodecode/pullrequests.js:193
5063 #: rhodecode/public/js/src/rhodecode/pullrequests.js:238
5000 msgid "Author is not allowed to be a reviewer."
5064 msgid "Author is not allowed to be a reviewer."
5001 msgstr ""
5065 msgstr ""
5002
5066
5003 #: rhodecode/public/js/scripts.js:42074 rhodecode/public/js/scripts.min.js:1
5067 #: rhodecode/public/js/scripts.js:42231 rhodecode/public/js/scripts.min.js:1
5004 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:22
5068 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:25
5005 #: rhodecode/public/js/src/rhodecode/pullrequests.js:207
5069 #: rhodecode/public/js/src/rhodecode/pullrequests.js:252
5006 msgid "Commit Authors are not allowed to be a reviewer."
5070 msgid "Commit Authors are not allowed to be a reviewer."
5007 msgstr ""
5071 msgstr ""
5008
5072
5009 #: rhodecode/public/js/scripts.js:42096 rhodecode/public/js/scripts.min.js:1
5073 #: rhodecode/public/js/scripts.js:42238 rhodecode/public/js/scripts.min.js:1
5010 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
5074 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:65
5011 #: rhodecode/public/js/src/rhodecode/pullrequests.js:229
5075 #: rhodecode/public/js/src/rhodecode/pullrequests.js:259
5076 msgid "No review rules set."
5077 msgstr ""
5078
5079 #: rhodecode/public/js/scripts.js:42283 rhodecode/public/js/scripts.min.js:1
5080 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49
5081 #: rhodecode/public/js/src/rhodecode/pullrequests.js:304
5012 msgid "Loading diff ..."
5082 msgid "Loading diff ..."
5013 msgstr ""
5083 msgstr ""
5014
5084
5015 #: rhodecode/public/js/scripts.js:42135 rhodecode/public/js/scripts.min.js:1
5085 #: rhodecode/public/js/scripts.js:42336 rhodecode/public/js/scripts.min.js:1
5016 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:130
5086 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:109
5017 #: rhodecode/public/js/src/rhodecode/pullrequests.js:268
5087 #: rhodecode/public/js/src/rhodecode/pullrequests.js:357
5018 msgid "no commits"
5088 msgid "There are no commits to merge."
5019 msgstr ""
5089 msgstr ""
5020
5090
5021 #: rhodecode/public/js/scripts.js:42206 rhodecode/public/js/scripts.min.js:1
5091 #: rhodecode/public/js/scripts.js:42408 rhodecode/public/js/scripts.min.js:1
5022 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:111
5092 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:120
5023 #: rhodecode/public/js/src/rhodecode/pullrequests.js:339
5093 #: rhodecode/public/js/src/rhodecode/pullrequests.js:429
5024 msgid "User `{0}` not allowed to be a reviewer"
5094 msgid "User `{0}` not allowed to be a reviewer"
5025 msgstr ""
5095 msgstr ""
5026
5096
5027 #: rhodecode/public/js/scripts.js:42212 rhodecode/public/js/scripts.min.js:1
5097 #: rhodecode/public/js/scripts.js:42414 rhodecode/public/js/scripts.min.js:1
5028 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:110
5098 #: rhodecode/public/js/src/rhodecode/pullrequests.js:435
5029 #: rhodecode/public/js/src/rhodecode/pullrequests.js:345
5099 msgid "User `{0}` already in reviewers/observers"
5030 msgid "User `{0}` already in reviewers"
5100 msgstr ""
5031 msgstr ""
5101
5032
5102 #: rhodecode/public/js/scripts.js:42528 rhodecode/public/js/scripts.min.js:1
5033 #: rhodecode/public/js/scripts.js:42315 rhodecode/public/js/scripts.min.js:1
5103 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:126
5034 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:117
5104 #: rhodecode/public/js/src/rhodecode/pullrequests.js:549
5035 #: rhodecode/public/js/src/rhodecode/pullrequests.js:448
5036 msgid "added manually by \"{0}\""
5105 msgid "added manually by \"{0}\""
5037 msgstr ""
5106 msgstr ""
5038
5107
5039 #: rhodecode/public/js/scripts.js:42319 rhodecode/public/js/scripts.min.js:1
5108 #: rhodecode/public/js/scripts.js:42533 rhodecode/public/js/scripts.min.js:1
5040 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:129
5109 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:138
5041 #: rhodecode/public/js/src/rhodecode/pullrequests.js:452
5110 #: rhodecode/public/js/src/rhodecode/pullrequests.js:554
5042 msgid "member of \"{0}\""
5111 msgid "member of \"{0}\""
5043 msgstr ""
5112 msgstr ""
5044
5113
5045 #: rhodecode/public/js/scripts.js:42510 rhodecode/public/js/scripts.min.js:1
5114 #: rhodecode/public/js/scripts.js:42766 rhodecode/public/js/scripts.min.js:1
5046 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:109
5115 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:118
5047 #: rhodecode/public/js/src/rhodecode/pullrequests.js:643
5116 #: rhodecode/public/js/src/rhodecode/pullrequests.js:787
5048 msgid "Updating..."
5117 msgid "Updating..."
5049 msgstr ""
5118 msgstr ""
5050
5119
5051 #: rhodecode/public/js/scripts.js:42520 rhodecode/public/js/scripts.min.js:1
5120 #: rhodecode/public/js/scripts.js:42776 rhodecode/public/js/scripts.min.js:1
5052 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:35
5121 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
5053 #: rhodecode/public/js/src/rhodecode/pullrequests.js:653
5122 #: rhodecode/public/js/src/rhodecode/pullrequests.js:797
5054 msgid "Force updating..."
5123 msgid "Force updating..."
5055 msgstr ""
5124 msgstr ""
5056
5125
5057 #: rhodecode/public/js/scripts.js:46968 rhodecode/public/js/scripts.min.js:1
5126 #: rhodecode/public/js/scripts.js:47613 rhodecode/public/js/scripts.min.js:1
5058 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:88
5127 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:94
5059 #: rhodecode/public/js/src/rhodecode/users.js:54
5128 #: rhodecode/public/js/src/rhodecode/users.js:54
5060 msgid "Show this authentication token?"
5129 msgid "Show this authentication token?"
5061 msgstr ""
5130 msgstr ""
5062
5131
5063 #: rhodecode/public/js/scripts.js:46970 rhodecode/public/js/scripts.min.js:1
5132 #: rhodecode/public/js/scripts.js:47615 rhodecode/public/js/scripts.min.js:1
5064 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:81
5133 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:87
5065 #: rhodecode/public/js/src/rhodecode/users.js:56
5134 #: rhodecode/public/js/src/rhodecode/users.js:56
5066 msgid "Show"
5135 msgid "Show"
5067 msgstr ""
5136 msgstr ""
5068
5137
5069 #: rhodecode/public/js/scripts.js:47006 rhodecode/public/js/scripts.min.js:1
5138 #: rhodecode/public/js/scripts.js:47651 rhodecode/public/js/scripts.min.js:1
5070 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:14
5139 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:16
5071 #: rhodecode/public/js/src/rhodecode/users.js:92
5140 #: rhodecode/public/js/src/rhodecode/users.js:92
5072 msgid "Authentication Token"
5141 msgid "Authentication Token"
5073 msgstr ""
5142 msgstr ""
5074
5143
5075 #: rhodecode/public/js/scripts.js:47195 rhodecode/public/js/scripts.min.js:1
5144 #: rhodecode/public/js/scripts.js:47840 rhodecode/public/js/scripts.min.js:1
5076 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:121
5145 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:130
5077 #: rhodecode/public/js/src/rhodecode.js:144
5146 #: rhodecode/public/js/src/rhodecode.js:144
5078 msgid "file"
5147 msgid "file"
5079 msgstr ""
5148 msgstr ""
5080
5149
5081 #: rhodecode/public/js/scripts.js:47339 rhodecode/public/js/scripts.min.js:1
5150 #: rhodecode/public/js/scripts.js:47984 rhodecode/public/js/scripts.min.js:1
5082 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
5151 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:52
5083 #: rhodecode/public/js/src/rhodecode.js:288
5152 #: rhodecode/public/js/src/rhodecode.js:288
5084 msgid "Loading..."
5153 msgid "Loading..."
5085 msgstr ""
5154 msgstr ""
5086
5155
5087 #: rhodecode/public/js/scripts.js:47712 rhodecode/public/js/scripts.min.js:1
5156 #: rhodecode/public/js/scripts.js:48366 rhodecode/public/js/scripts.min.js:1
5088 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:118
5157 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:127
5089 #: rhodecode/public/js/src/rhodecode.js:661
5158 #: rhodecode/public/js/src/rhodecode.js:670
5090 msgid "date not in future"
5159 msgid "date not in future"
5091 msgstr ""
5160 msgstr ""
5092
5161
5093 #: rhodecode/public/js/scripts.js:47720 rhodecode/public/js/scripts.min.js:1
5162 #: rhodecode/public/js/scripts.js:48374 rhodecode/public/js/scripts.min.js:1
5094 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:90
5163 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:96
5095 #: rhodecode/public/js/src/rhodecode.js:669
5164 #: rhodecode/public/js/src/rhodecode.js:678
5096 msgid "Specified expiration date"
5165 msgid "Specified expiration date"
5097 msgstr ""
5166 msgstr ""
5098
5167
@@ -5113,339 +5182,370 b' msgid "(from usergroup {0})"'
5113 msgstr ""
5182 msgstr ""
5114
5183
5115 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:3
5184 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:3
5116 msgid "<strong>{0} file</strong> changed, "
5185 msgid "<strong>, and {0} file</strong> changed."
5117 msgstr ""
5186 msgstr ""
5118
5187
5119 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:4
5188 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:4
5120 msgid "<strong>{0} files</strong> changed, "
5189 msgid "<strong>, and {0} files</strong> changed."
5121 msgstr ""
5190 msgstr ""
5122
5191
5123 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:5
5192 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:5
5124 #: rhodecode/templates/codeblocks/diffs.mako:618
5193 msgid "<strong>{0} file</strong> changed, "
5125 #: rhodecode/templates/codeblocks/diffs.mako:622
5194 msgstr ""
5195
5196 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:6
5197 msgid "<strong>{0} files</strong> changed, "
5198 msgstr ""
5199
5200 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:7
5201 #: rhodecode/templates/codeblocks/diffs.mako:648
5202 #: rhodecode/templates/codeblocks/diffs.mako:652
5126 msgid "Add another comment"
5203 msgid "Add another comment"
5127 msgstr ""
5204 msgstr ""
5128
5205
5129 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:11
5206 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:13
5130 msgid "Are you sure to close this pull request without merging?"
5207 msgid "Are you sure to close this pull request without merging?"
5131 msgstr ""
5208 msgstr ""
5132
5209
5133 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:16
5134 msgid "Changed files"
5135 msgstr ""
5136
5137 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:17
5138 #: rhodecode/public/js/src/i18n_messages.js:5
5139 #: rhodecode/templates/pullrequests/pullrequest_show.mako:288
5140 msgid "Close"
5141 msgstr ""
5142
5143 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:18
5210 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:18
5144 #: rhodecode/templates/codeblocks/diffs.mako:131
5211 msgid "Changed files"
5145 msgid "Collapse all files"
5146 msgstr ""
5212 msgstr ""
5147
5213
5148 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:19
5214 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:19
5149 msgid "Collapse {0} commit"
5215 #: rhodecode/public/js/src/i18n_messages.js:5
5216 #: rhodecode/templates/pullrequests/pullrequest_show.mako:589
5217 #: rhodecode/templates/pullrequests/pullrequest_show.mako:592
5218 #: rhodecode/templates/pullrequests/pullrequest_show.mako:646
5219 msgid "Close"
5150 msgstr ""
5220 msgstr ""
5151
5221
5152 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:20
5222 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:20
5223 #: rhodecode/templates/codeblocks/diffs.mako:133
5224 msgid "Collapse all files"
5225 msgstr ""
5226
5227 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:21
5228 msgid "Collapse {0} commit"
5229 msgstr ""
5230
5231 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:22
5153 msgid "Collapse {0} commits"
5232 msgid "Collapse {0} commits"
5154 msgstr ""
5233 msgstr ""
5155
5234
5156 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
5157 msgid "Context file: "
5158 msgstr ""
5159
5160 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:25
5161 msgid "Delete this comment?"
5162 msgstr ""
5163
5164 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:26
5235 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:26
5165 msgid "Diff to Commit "
5236 msgid "Compare summary: <strong>{0} commit</strong>"
5166 msgstr ""
5237 msgstr ""
5167
5238
5168 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:27
5239 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:27
5169 msgid "Error during search operation"
5240 msgid "Compare summary: <strong>{0} commits</strong>"
5170 msgstr ""
5241 msgstr ""
5171
5242
5172 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:28
5243 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:28
5173 #: rhodecode/templates/codeblocks/diffs.mako:129
5244 msgid "Context file: "
5174 msgid "Expand all files"
5175 msgstr ""
5176
5177 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:29
5178 msgid "Expand {0} commit"
5179 msgstr ""
5245 msgstr ""
5180
5246
5181 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:30
5247 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:30
5182 msgid "Expand {0} commits"
5248 msgid "Delete this comment?"
5183 msgstr ""
5249 msgstr ""
5184
5250
5185 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:31
5251 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:31
5186 msgid "Fetching repository state failed. Error code: {0} {1}. Try <a href=\"{2}\">refreshing</a> this page."
5252 msgid "Diff to Commit "
5187 msgstr ""
5253 msgstr ""
5188
5254
5189 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:32
5255 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:32
5190 msgid "Fetching repository state failed. Error code: {0} {1}. Try refreshing this page."
5256 msgid "Error during search operation"
5257 msgstr ""
5258
5259 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:33
5260 #: rhodecode/templates/codeblocks/diffs.mako:131
5261 msgid "Expand all files"
5191 msgstr ""
5262 msgstr ""
5192
5263
5193 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:34
5264 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:34
5194 msgid "Follow"
5265 msgid "Expand {0} commit"
5266 msgstr ""
5267
5268 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:35
5269 msgid "Expand {0} commits"
5195 msgstr ""
5270 msgstr ""
5196
5271
5197 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:36
5272 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:36
5198 msgid "Hide full context diff"
5273 msgid "Fetching repository state failed. Error code: {0} {1}. Try <a href=\"{2}\">refreshing</a> this page."
5199 msgstr ""
5274 msgstr ""
5200
5275
5201 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:37
5276 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:37
5277 msgid "Fetching repository state failed. Error code: {0} {1}. Try refreshing this page."
5278 msgstr ""
5279
5280 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:39
5281 msgid "Follow"
5282 msgstr ""
5283
5284 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:41
5285 msgid "Hide full context diff"
5286 msgstr ""
5287
5288 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:42
5202 msgid "Hide whitespace changes"
5289 msgid "Hide whitespace changes"
5203 msgstr ""
5290 msgstr ""
5204
5291
5205 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
5292 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:43
5206 #: rhodecode/public/js/src/i18n_messages.js:4
5293 #: rhodecode/public/js/src/i18n_messages.js:4
5207 msgid "Invite reviewers to this discussion"
5294 msgid "Invite reviewers to this discussion"
5208 msgstr ""
5295 msgstr ""
5209
5296
5210 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
5297 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:45
5211 msgid "Leave a comment, or click resolve button to resolve TODO comment #{0}"
5298 msgid "Leave a comment, or click resolve button to resolve TODO comment #{0}"
5212 msgstr ""
5299 msgstr ""
5213
5300
5214 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
5301 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
5215 msgid "No bookmarks available yet."
5302 msgid "No bookmarks available yet."
5216 msgstr ""
5303 msgstr ""
5217
5304
5218 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49
5219 msgid "No branches available yet."
5220 msgstr ""
5221
5222 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
5223 msgid "No forks available yet."
5224 msgstr ""
5225
5226 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:51
5227 msgid "No gists available yet."
5228 msgstr ""
5229
5230 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
5305 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
5231 msgid "No pull requests available yet."
5306 msgid "No branches available yet."
5232 msgstr ""
5307 msgstr ""
5233
5308
5234 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:55
5309 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:55
5235 msgid "No repositories available yet."
5310 msgid "No forks available yet."
5236 msgstr ""
5311 msgstr ""
5237
5312
5238 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:56
5313 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:56
5239 msgid "No repositories present."
5314 msgid "No gists available yet."
5240 msgstr ""
5315 msgstr ""
5241
5316
5242 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:57
5317 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:59
5243 msgid "No repository groups available yet."
5318 msgid "No pull requests available yet."
5244 msgstr ""
5245
5246 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:58
5247 msgid "No repository groups present."
5248 msgstr ""
5319 msgstr ""
5249
5320
5250 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
5321 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
5251 msgid "No ssh keys available yet."
5322 msgid "No repositories available yet."
5252 msgstr ""
5323 msgstr ""
5253
5324
5254 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:61
5325 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:61
5255 msgid "No tags available yet."
5326 msgid "No repositories present."
5256 msgstr ""
5327 msgstr ""
5257
5328
5258 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:62
5329 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:62
5259 msgid "No user groups available yet."
5330 msgid "No repository groups available yet."
5260 msgstr ""
5331 msgstr ""
5261
5332
5262 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:63
5333 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:63
5263 msgid "No users available yet."
5334 msgid "No repository groups present."
5335 msgstr ""
5336
5337 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:66
5338 msgid "No ssh keys available yet."
5264 msgstr ""
5339 msgstr ""
5265
5340
5266 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:67
5341 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:67
5267 #: rhodecode/templates/commits/changelog.mako:78
5342 msgid "No tags available yet."
5268 msgid "Open new pull request"
5269 msgstr ""
5343 msgstr ""
5270
5344
5271 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:68
5345 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:68
5272 msgid "Open new pull request for selected commit"
5346 msgid "No user groups available yet."
5347 msgstr ""
5348
5349 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:69
5350 msgid "No users available yet."
5273 msgstr ""
5351 msgstr ""
5274
5352
5275 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:73
5353 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:73
5354 #: rhodecode/templates/commits/changelog.mako:78
5355 msgid "Open new pull request"
5356 msgstr ""
5357
5358 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:74
5359 msgid "Open new pull request for selected commit"
5360 msgstr ""
5361
5362 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:79
5276 msgid "Please wait creating pull request..."
5363 msgid "Please wait creating pull request..."
5277 msgstr ""
5364 msgstr ""
5278
5365
5279 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:75
5366 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:81
5280 msgid "Saving..."
5367 msgid "Saving..."
5281 msgstr ""
5368 msgstr ""
5282
5369
5283 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:78
5370 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:84
5284 #: rhodecode/public/js/src/i18n_messages.js:6
5371 #: rhodecode/public/js/src/i18n_messages.js:6
5285 #: rhodecode/templates/admin/settings/settings_email.mako:50
5372 #: rhodecode/templates/admin/settings/settings_email.mako:50
5286 msgid "Send"
5373 msgid "Send"
5287 msgstr ""
5374 msgstr ""
5288
5375
5289 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:82
5376 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:88
5290 msgid "Show at Commit "
5377 msgid "Show at Commit "
5291 msgstr ""
5378 msgstr ""
5292
5379
5293 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
5294 msgid "Show commit range {0} ... {1}"
5295 msgstr ""
5296
5297 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:84
5298 msgid "Show full context diff"
5299 msgstr ""
5300
5301 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:85
5302 #: rhodecode/templates/admin/settings/settings_exceptions_browse.mako:40
5303 msgid "Show more"
5304 msgstr ""
5305
5306 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86
5307 msgid "Show selected commit __S"
5308 msgstr ""
5309
5310 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:87
5311 msgid "Show selected commits __S ... __E"
5312 msgstr ""
5313
5314 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:89
5380 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:89
5315 msgid "Show whitespace changes"
5381 msgid "Show commit range {0} ... {1}"
5382 msgstr ""
5383
5384 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:90
5385 msgid "Show full context diff"
5316 msgstr ""
5386 msgstr ""
5317
5387
5318 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:91
5388 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:91
5319 msgid "Start following this repository"
5389 #: rhodecode/templates/admin/settings/settings_exceptions_browse.mako:40
5320 msgstr ""
5390 msgid "Show more"
5321
5391 msgstr ""
5322 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:94
5392
5323 msgid "Stop following this repository"
5393 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:92
5394 msgid "Show selected commit __S"
5395 msgstr ""
5396
5397 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:93
5398 msgid "Show selected commits __S ... __E"
5399 msgstr ""
5400
5401 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:95
5402 msgid "Show whitespace changes"
5324 msgstr ""
5403 msgstr ""
5325
5404
5326 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:97
5405 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:97
5327 #: rhodecode/public/js/src/i18n_messages.js:7
5406 msgid "Start following this repository"
5328 msgid "Switch to chat"
5407 msgstr ""
5329 msgstr ""
5408
5330
5409 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:100
5331 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:98
5410 msgid "Stop following this repository"
5332 #: rhodecode/public/js/src/i18n_messages.js:8
5411 msgstr ""
5333 msgid "Switch to comment"
5412
5334 msgstr ""
5413 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:103
5335
5414 msgid "Switch target repository with the source."
5336 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:101
5337 msgid "There are currently no open pull requests requiring your participation."
5338 msgstr ""
5415 msgstr ""
5339
5416
5340 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:104
5417 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:104
5341 msgid "This pull requests will consist of <strong>{0} commit</strong>."
5418 #: rhodecode/public/js/src/i18n_messages.js:7
5419 msgid "Switch to chat"
5342 msgstr ""
5420 msgstr ""
5343
5421
5344 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:105
5422 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:105
5423 #: rhodecode/public/js/src/i18n_messages.js:8
5424 msgid "Switch to comment"
5425 msgstr ""
5426
5427 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:108
5428 msgid "There are currently no open pull requests requiring your participation."
5429 msgstr ""
5430
5431 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:112
5432 msgid "This pull requests will consist of <strong>{0} commit</strong>."
5433 msgstr ""
5434
5435 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:113
5345 msgid "This pull requests will consist of <strong>{0} commits</strong>."
5436 msgid "This pull requests will consist of <strong>{0} commits</strong>."
5346 msgstr ""
5437 msgstr ""
5347
5438
5348 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:106
5439 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:114
5349 msgid "Toggle Wide Mode diff"
5440 msgid "Toggle Wide Mode diff"
5350 msgstr ""
5441 msgstr ""
5351
5442
5352 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:107
5443 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:115
5353 msgid "Unfollow"
5444 msgid "Unfollow"
5354 msgstr ""
5445 msgstr ""
5355
5446
5356 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:116
5357 #: rhodecode/templates/admin/auth/auth_settings.mako:69
5358 msgid "activated"
5359 msgstr ""
5360
5361 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:119
5447 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:119
5362 msgid "disabled"
5448 msgid "User `{0}` already in reviewers"
5363 msgstr ""
5449 msgstr ""
5364
5450
5365 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:120
5451 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:125
5366 msgid "enabled"
5452 #: rhodecode/templates/admin/auth/auth_settings.mako:69
5367 msgstr ""
5453 msgid "activated"
5368
5369 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:122
5370 msgid "files"
5371 msgstr ""
5372
5373 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:123
5374 msgid "go to numeric commit"
5375 msgstr ""
5454 msgstr ""
5376
5455
5377 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:128
5456 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:128
5378 #: rhodecode/templates/index_base.mako:27
5457 msgid "disabled"
5379 #: rhodecode/templates/pullrequests/pullrequest.mako:136
5458 msgstr ""
5380 msgid "loading..."
5459
5460 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:129
5461 msgid "enabled"
5381 msgstr ""
5462 msgstr ""
5382
5463
5383 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:131
5464 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:131
5384 #: rhodecode/templates/admin/auth/auth_settings.mako:69
5465 msgid "files"
5385 msgid "not active"
5466 msgstr ""
5386 msgstr ""
5467
5387
5468 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:132
5388 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:135
5469 msgid "go to numeric commit"
5389 msgid "specify commit"
5470 msgstr ""
5390 msgstr ""
5471
5391
5472 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:137
5392 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:138
5473 #: rhodecode/templates/index_base.mako:27
5393 msgid "{0} ({1} inactive) of {2} user groups ({3} inactive)"
5474 #: rhodecode/templates/pullrequests/pullrequest.mako:154
5475 #: rhodecode/templates/pullrequests/pullrequest.mako:178
5476 msgid "loading..."
5394 msgstr ""
5477 msgstr ""
5395
5478
5396 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:139
5479 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:139
5397 msgid "{0} ({1} inactive) of {2} users ({3} inactive)"
5480 msgid "no commits"
5398 msgstr ""
5481 msgstr ""
5399
5482
5400 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:140
5483 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:140
5401 msgid "{0} active out of {1} users"
5484 #: rhodecode/templates/admin/auth/auth_settings.mako:69
5402 msgstr ""
5485 msgid "not active"
5403
5486 msgstr ""
5404 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:145
5487
5405 msgid "{0} days"
5488 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:144
5489 msgid "specify commit"
5406 msgstr ""
5490 msgstr ""
5407
5491
5408 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:147
5492 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:147
5409 msgid "{0} hours"
5493 msgid "{0} ({1} inactive) of {2} user groups ({3} inactive)"
5410 msgstr ""
5494 msgstr ""
5411
5495
5412 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:150
5496 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:148
5413 msgid "{0} months"
5497 msgid "{0} ({1} inactive) of {2} users ({3} inactive)"
5414 msgstr ""
5498 msgstr ""
5415
5499
5416 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:151
5500 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:149
5417 msgid "{0} of {1} repositories"
5501 msgid "{0} active out of {1} users"
5418 msgstr ""
5419
5420 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:152
5421 msgid "{0} of {1} repository groups"
5422 msgstr ""
5423
5424 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:153
5425 msgid "{0} out of {1} ssh keys"
5426 msgstr ""
5502 msgstr ""
5427
5503
5428 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:154
5504 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:154
5429 msgid "{0} out of {1} users"
5505 msgid "{0} days"
5430 msgstr ""
5431
5432 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:155
5433 msgid "{0} repositories"
5434 msgstr ""
5506 msgstr ""
5435
5507
5436 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:156
5508 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:156
5437 msgid "{0} repository groups"
5509 msgid "{0} hours"
5438 msgstr ""
5510 msgstr ""
5439
5511
5440 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:159
5512 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:159
5441 msgid "{0} user groups ({1} inactive)"
5513 msgid "{0} months"
5442 msgstr ""
5514 msgstr ""
5443
5515
5444 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:160
5516 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:160
5445 msgid "{0} users ({1} inactive)"
5517 msgid "{0} of {1} repositories"
5518 msgstr ""
5519
5520 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:161
5521 msgid "{0} of {1} repository groups"
5446 msgstr ""
5522 msgstr ""
5447
5523
5448 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:162
5524 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:162
5525 msgid "{0} out of {1} ssh keys"
5526 msgstr ""
5527
5528 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:163
5529 msgid "{0} out of {1} users"
5530 msgstr ""
5531
5532 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:164
5533 msgid "{0} repositories"
5534 msgstr ""
5535
5536 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:165
5537 msgid "{0} repository groups"
5538 msgstr ""
5539
5540 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:168
5541 msgid "{0} user groups ({1} inactive)"
5542 msgstr ""
5543
5544 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:169
5545 msgid "{0} users ({1} inactive)"
5546 msgstr ""
5547
5548 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:171
5449 msgid "{0} years"
5549 msgid "{0} years"
5450 msgstr ""
5550 msgstr ""
5451
5551
@@ -5479,10 +5579,10 b' msgstr ""'
5479 #: rhodecode/templates/admin/users/user_edit_groups.mako:57
5579 #: rhodecode/templates/admin/users/user_edit_groups.mako:57
5480 #: rhodecode/templates/base/perms_summary.mako:173
5580 #: rhodecode/templates/base/perms_summary.mako:173
5481 #: rhodecode/templates/base/perms_summary.mako:247
5581 #: rhodecode/templates/base/perms_summary.mako:247
5482 #: rhodecode/templates/bookmarks/bookmarks.mako:57
5582 #: rhodecode/templates/bookmarks/bookmarks.mako:69
5483 #: rhodecode/templates/branches/branches.mako:56
5583 #: rhodecode/templates/branches/branches.mako:68
5484 #: rhodecode/templates/files/files_browser_tree.mako:16
5584 #: rhodecode/templates/files/files_browser_tree.mako:16
5485 #: rhodecode/templates/tags/tags.mako:57
5585 #: rhodecode/templates/tags/tags.mako:69
5486 msgid "Name"
5586 msgid "Name"
5487 msgstr ""
5587 msgstr ""
5488
5588
@@ -5513,16 +5613,16 b' msgstr ""'
5513 #: rhodecode/templates/admin/users/user_edit_profile.mako:74
5613 #: rhodecode/templates/admin/users/user_edit_profile.mako:74
5514 #: rhodecode/templates/admin/users/user_edit_ssh_keys.mako:15
5614 #: rhodecode/templates/admin/users/user_edit_ssh_keys.mako:15
5515 #: rhodecode/templates/admin/users/user_edit_ssh_keys.mako:57
5615 #: rhodecode/templates/admin/users/user_edit_ssh_keys.mako:57
5516 #: rhodecode/templates/base/issue_tracker_settings.mako:78
5616 #: rhodecode/templates/base/issue_tracker_settings.mako:79
5517 #: rhodecode/templates/compare/compare_commits.mako:19
5617 #: rhodecode/templates/compare/compare_commits.mako:19
5518 #: rhodecode/templates/email_templates/pull_request_review.mako:45
5618 #: rhodecode/templates/email_templates/pull_request_review.mako:49
5519 #: rhodecode/templates/email_templates/pull_request_review.mako:126
5619 #: rhodecode/templates/email_templates/pull_request_review.mako:134
5520 #: rhodecode/templates/email_templates/pull_request_update.mako:45
5620 #: rhodecode/templates/email_templates/pull_request_update.mako:45
5521 #: rhodecode/templates/email_templates/pull_request_update.mako:139
5621 #: rhodecode/templates/email_templates/pull_request_update.mako:139
5522 #: rhodecode/templates/forks/fork.mako:56
5622 #: rhodecode/templates/forks/fork.mako:56
5523 #: rhodecode/templates/forks/forks.mako:62
5623 #: rhodecode/templates/forks/forks.mako:62
5524 #: rhodecode/templates/pullrequests/pullrequest.mako:50
5624 #: rhodecode/templates/pullrequests/pullrequest.mako:104
5525 #: rhodecode/templates/pullrequests/pullrequest_show.mako:560
5625 #: rhodecode/templates/pullrequests/pullrequest_show.mako:400
5526 #: rhodecode/templates/summary/components.mako:159
5626 #: rhodecode/templates/summary/components.mako:159
5527 #: rhodecode/templates/user_group/profile.mako:25
5627 #: rhodecode/templates/user_group/profile.mako:25
5528 #: rhodecode/templates/users/user_profile.mako:59
5628 #: rhodecode/templates/users/user_profile.mako:59
@@ -5557,19 +5657,18 b' msgstr ""'
5557
5657
5558 #: rhodecode/templates/index_base.mako:190
5658 #: rhodecode/templates/index_base.mako:190
5559 #: rhodecode/templates/admin/repos/repos.mako:98
5659 #: rhodecode/templates/admin/repos/repos.mako:98
5560 #: rhodecode/templates/bookmarks/bookmarks.mako:64
5660 #: rhodecode/templates/bookmarks/bookmarks.mako:76
5561 #: rhodecode/templates/branches/branches.mako:63
5661 #: rhodecode/templates/branches/branches.mako:75
5562 #: rhodecode/templates/compare/compare_commits.mako:17
5662 #: rhodecode/templates/compare/compare_commits.mako:17
5563 #: rhodecode/templates/email_templates/commit_comment.mako:60
5663 #: rhodecode/templates/email_templates/commit_comment.mako:60
5564 #: rhodecode/templates/email_templates/commit_comment.mako:114
5664 #: rhodecode/templates/email_templates/commit_comment.mako:114
5565 #: rhodecode/templates/email_templates/commit_comment.mako:141
5665 #: rhodecode/templates/email_templates/commit_comment.mako:141
5566 #: rhodecode/templates/files/file_authors_box.mako:28
5666 #: rhodecode/templates/files/file_authors_box.mako:28
5567 #: rhodecode/templates/pullrequests/pullrequest_show.mako:558
5667 #: rhodecode/templates/pullrequests/pullrequest_show.mako:398
5568 #: rhodecode/templates/search/search_commit.mako:9
5668 #: rhodecode/templates/search/search_commit.mako:9
5569 #: rhodecode/templates/summary/components.mako:117
5669 #: rhodecode/templates/summary/components.mako:117
5570 #: rhodecode/templates/summary/components.mako:125
5670 #: rhodecode/templates/summary/components.mako:125
5571 #: rhodecode/templates/summary/summary_commits.mako:8
5671 #: rhodecode/templates/tags/tags.mako:76
5572 #: rhodecode/templates/tags/tags.mako:64
5573 msgid "Commit"
5672 msgid "Commit"
5574 msgstr ""
5673 msgstr ""
5575
5674
@@ -5579,8 +5678,8 b' msgid "%s Repository group dashboard"'
5579 msgstr ""
5678 msgstr ""
5580
5679
5581 #: rhodecode/templates/index_repo_group.mako:13
5680 #: rhodecode/templates/index_repo_group.mako:13
5681 #: rhodecode/templates/base/base.mako:810
5582 #: rhodecode/templates/base/base.mako:811
5682 #: rhodecode/templates/base/base.mako:811
5583 #: rhodecode/templates/base/base.mako:812
5584 msgid "Home"
5683 msgid "Home"
5585 msgstr ""
5684 msgstr ""
5586
5685
@@ -5618,7 +5717,7 b' msgid "Please contact "'
5618 msgstr ""
5717 msgstr ""
5619
5718
5620 #: rhodecode/templates/login.mako:84 rhodecode/templates/password_reset.mako:39
5719 #: rhodecode/templates/login.mako:84 rhodecode/templates/password_reset.mako:39
5621 #: rhodecode/templates/base/base.mako:61
5720 #: rhodecode/templates/base/base.mako:63
5622 msgid "Support"
5721 msgid "Support"
5623 msgstr ""
5722 msgstr ""
5624
5723
@@ -5732,9 +5831,9 b' msgstr ""'
5732
5831
5733 #: rhodecode/templates/admin/admin_audit_log_entry.mako:46
5832 #: rhodecode/templates/admin/admin_audit_log_entry.mako:46
5734 #: rhodecode/templates/admin/admin_log_base.mako:11
5833 #: rhodecode/templates/admin/admin_log_base.mako:11
5735 #: rhodecode/templates/bookmarks/bookmarks.mako:59
5834 #: rhodecode/templates/bookmarks/bookmarks.mako:71
5736 #: rhodecode/templates/branches/branches.mako:58
5835 #: rhodecode/templates/branches/branches.mako:70
5737 #: rhodecode/templates/tags/tags.mako:59
5836 #: rhodecode/templates/tags/tags.mako:71
5738 msgid "Date"
5837 msgid "Date"
5739 msgstr ""
5838 msgstr ""
5740
5839
@@ -5775,16 +5874,16 b' msgstr ""'
5775 #: rhodecode/templates/admin/admin_log_base.mako:10
5874 #: rhodecode/templates/admin/admin_log_base.mako:10
5776 #: rhodecode/templates/admin/defaults/defaults.mako:32
5875 #: rhodecode/templates/admin/defaults/defaults.mako:32
5777 #: rhodecode/templates/admin/permissions/permissions_objects.mako:16
5876 #: rhodecode/templates/admin/permissions/permissions_objects.mako:16
5778 #: rhodecode/templates/base/base.mako:656
5779 #: rhodecode/templates/base/base.mako:658
5877 #: rhodecode/templates/base/base.mako:658
5780 #: rhodecode/templates/base/base.mako:660
5878 #: rhodecode/templates/base/base.mako:660
5879 #: rhodecode/templates/base/base.mako:662
5781 #: rhodecode/templates/search/search_commit.mako:8
5880 #: rhodecode/templates/search/search_commit.mako:8
5782 #: rhodecode/templates/search/search_path.mako:7
5881 #: rhodecode/templates/search/search_path.mako:7
5783 msgid "Repository"
5882 msgid "Repository"
5784 msgstr ""
5883 msgstr ""
5785
5884
5786 #: rhodecode/templates/admin/admin_audit_logs.mako:5
5885 #: rhodecode/templates/admin/admin_audit_logs.mako:5
5787 #: rhodecode/templates/base/base.mako:111
5886 #: rhodecode/templates/base/base.mako:113
5788 msgid "Admin audit logs"
5887 msgid "Admin audit logs"
5789 msgstr ""
5888 msgstr ""
5790
5889
@@ -5891,7 +5990,7 b' msgid "Plugin Name"'
5891 msgstr ""
5990 msgstr ""
5892
5991
5893 #: rhodecode/templates/admin/auth/auth_settings.mako:62
5992 #: rhodecode/templates/admin/auth/auth_settings.mako:62
5894 #: rhodecode/templates/base/base.mako:62
5993 #: rhodecode/templates/base/base.mako:64
5895 msgid "Documentation"
5994 msgid "Documentation"
5896 msgstr ""
5995 msgstr ""
5897
5996
@@ -6008,10 +6107,10 b' msgid "Update Gist"'
6008 msgstr ""
6107 msgstr ""
6009
6108
6010 #: rhodecode/templates/admin/gists/gist_edit.mako:100
6109 #: rhodecode/templates/admin/gists/gist_edit.mako:100
6011 #: rhodecode/templates/base/issue_tracker_settings.mako:150
6110 #: rhodecode/templates/base/issue_tracker_settings.mako:151
6012 #: rhodecode/templates/changeset/changeset_file_comment.mako:460
6111 #: rhodecode/templates/changeset/changeset_file_comment.mako:487
6013 #: rhodecode/templates/codeblocks/diffs.mako:88
6112 #: rhodecode/templates/codeblocks/diffs.mako:90
6014 #: rhodecode/templates/pullrequests/pullrequest_show.mako:75
6113 #: rhodecode/templates/pullrequests/pullrequest_show.mako:84
6015 msgid "Cancel"
6114 msgid "Cancel"
6016 msgstr ""
6115 msgstr ""
6017
6116
@@ -6065,26 +6164,26 b' msgstr ""'
6065 #: rhodecode/templates/admin/repos/repos.mako:25
6164 #: rhodecode/templates/admin/repos/repos.mako:25
6066 #: rhodecode/templates/admin/user_groups/user_groups.mako:25
6165 #: rhodecode/templates/admin/user_groups/user_groups.mako:25
6067 #: rhodecode/templates/admin/users/users.mako:26
6166 #: rhodecode/templates/admin/users/users.mako:26
6068 #: rhodecode/templates/bookmarks/bookmarks.mako:33
6167 #: rhodecode/templates/bookmarks/bookmarks.mako:39
6069 #: rhodecode/templates/branches/branches.mako:33
6168 #: rhodecode/templates/branches/branches.mako:39
6070 #: rhodecode/templates/journal/journal.mako:12
6169 #: rhodecode/templates/journal/journal.mako:12
6071 #: rhodecode/templates/pullrequests/pullrequests.mako:53
6170 #: rhodecode/templates/pullrequests/pullrequests.mako:53
6072 #: rhodecode/templates/tags/tags.mako:33
6171 #: rhodecode/templates/tags/tags.mako:39
6073 msgid "quick filter..."
6172 msgid "quick filter..."
6074 msgstr ""
6173 msgstr ""
6075
6174
6076 #: rhodecode/templates/admin/gists/gist_index.mako:103
6175 #: rhodecode/templates/admin/gists/gist_index.mako:103
6077 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:91
6176 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:85
6078 #: rhodecode/templates/bookmarks/bookmarks.mako:61
6177 #: rhodecode/templates/bookmarks/bookmarks.mako:73
6079 #: rhodecode/templates/branches/branches.mako:60
6178 #: rhodecode/templates/branches/branches.mako:72
6080 #: rhodecode/templates/commits/changelog.mako:119
6179 #: rhodecode/templates/commits/changelog.mako:119
6081 #: rhodecode/templates/compare/compare_commits.mako:16
6180 #: rhodecode/templates/compare/compare_commits.mako:16
6082 #: rhodecode/templates/files/files_browser_tree.mako:20
6181 #: rhodecode/templates/files/files_browser_tree.mako:20
6083 #: rhodecode/templates/pullrequests/pullrequest_show.mako:557
6182 #: rhodecode/templates/pullrequests/pullrequest_show.mako:397
6084 #: rhodecode/templates/pullrequests/pullrequests.mako:98
6183 #: rhodecode/templates/pullrequests/pullrequests.mako:98
6085 #: rhodecode/templates/search/search_commit.mako:18
6184 #: rhodecode/templates/search/search_commit.mako:18
6086 #: rhodecode/templates/summary/summary_commits.mako:11
6185 #: rhodecode/templates/summary/summary_commits.mako:11
6087 #: rhodecode/templates/tags/tags.mako:61
6186 #: rhodecode/templates/tags/tags.mako:73
6088 msgid "Author"
6187 msgid "Author"
6089 msgstr ""
6188 msgstr ""
6090
6189
@@ -6096,7 +6195,7 b' msgstr ""'
6096 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:7
6195 #: rhodecode/templates/admin/user_groups/user_group_edit_advanced.mako:7
6097 #: rhodecode/templates/admin/users/user_edit_advanced.mako:6
6196 #: rhodecode/templates/admin/users/user_edit_advanced.mako:6
6098 #: rhodecode/templates/admin/users/user_edit_ssh_keys.mako:16
6197 #: rhodecode/templates/admin/users/user_edit_ssh_keys.mako:16
6099 #: rhodecode/templates/pullrequests/pullrequest_show.mako:51
6198 #: rhodecode/templates/pullrequests/pullrequest_show.mako:60
6100 msgid "Created on"
6199 msgid "Created on"
6101 msgstr ""
6200 msgstr ""
6102
6201
@@ -6105,7 +6204,7 b' msgid "Expires"'
6105 msgstr ""
6204 msgstr ""
6106
6205
6107 #: rhodecode/templates/admin/gists/gist_new.mako:5
6206 #: rhodecode/templates/admin/gists/gist_new.mako:5
6108 #: rhodecode/templates/base/base.mako:575
6207 #: rhodecode/templates/base/base.mako:577
6109 msgid "New Gist"
6208 msgid "New Gist"
6110 msgstr ""
6209 msgstr ""
6111
6210
@@ -6197,7 +6296,7 b' msgstr ""'
6197 #: rhodecode/templates/admin/integrations/new.mako:15
6296 #: rhodecode/templates/admin/integrations/new.mako:15
6198 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:33
6297 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:33
6199 #: rhodecode/templates/admin/repos/repo_edit.mako:74
6298 #: rhodecode/templates/admin/repos/repo_edit.mako:74
6200 #: rhodecode/templates/base/base.mako:118
6299 #: rhodecode/templates/base/base.mako:120
6201 msgid "Integrations"
6300 msgid "Integrations"
6202 msgstr ""
6301 msgstr ""
6203
6302
@@ -6212,7 +6311,7 b' msgstr ""'
6212 #: rhodecode/templates/admin/settings/settings.mako:14
6311 #: rhodecode/templates/admin/settings/settings.mako:14
6213 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:34
6312 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:34
6214 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:9
6313 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:9
6215 #: rhodecode/templates/base/base.mako:120
6314 #: rhodecode/templates/base/base.mako:122
6216 msgid "Settings"
6315 msgid "Settings"
6217 msgstr ""
6316 msgstr ""
6218
6317
@@ -6313,7 +6412,7 b' msgid "No description available"'
6313 msgstr ""
6412 msgstr ""
6314
6413
6315 #: rhodecode/templates/admin/my_account/my_account.mako:5
6414 #: rhodecode/templates/admin/my_account/my_account.mako:5
6316 #: rhodecode/templates/base/base.mako:620
6415 #: rhodecode/templates/base/base.mako:622
6317 msgid "My account"
6416 msgid "My account"
6318 msgstr ""
6417 msgstr ""
6319
6418
@@ -6364,15 +6463,15 b' msgstr ""'
6364
6463
6365 #: rhodecode/templates/admin/my_account/my_account.mako:45
6464 #: rhodecode/templates/admin/my_account/my_account.mako:45
6366 #: rhodecode/templates/admin/notifications/notifications_show_all.mako:42
6465 #: rhodecode/templates/admin/notifications/notifications_show_all.mako:42
6367 #: rhodecode/templates/base/base.mako:383
6466 #: rhodecode/templates/base/base.mako:385
6368 #: rhodecode/templates/base/base.mako:624
6467 #: rhodecode/templates/base/base.mako:626
6369 msgid "Pull Requests"
6468 msgid "Pull Requests"
6370 msgstr ""
6469 msgstr ""
6371
6470
6372 #: rhodecode/templates/admin/my_account/my_account.mako:46
6471 #: rhodecode/templates/admin/my_account/my_account.mako:46
6373 #: rhodecode/templates/admin/permissions/permissions.mako:14
6472 #: rhodecode/templates/admin/permissions/permissions.mako:14
6374 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:35
6473 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:35
6375 #: rhodecode/templates/base/base.mako:116
6474 #: rhodecode/templates/base/base.mako:118
6376 msgid "Permissions"
6475 msgid "Permissions"
6377 msgstr ""
6476 msgstr ""
6378
6477
@@ -6592,27 +6691,27 b' msgstr ""'
6592 msgid "Pull Requests You Participate In"
6691 msgid "Pull Requests You Participate In"
6593 msgstr ""
6692 msgstr ""
6594
6693
6595 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:67
6694 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:73
6596 msgid "Target Repo"
6695 #: rhodecode/templates/pullrequests/pullrequests.mako:94
6696 msgid "Id"
6597 msgstr ""
6697 msgstr ""
6598
6698
6599 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:79
6699 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:79
6600 #: rhodecode/templates/pullrequests/pullrequests.mako:94
6601 msgid "Id"
6602 msgstr ""
6603
6604 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:85
6605 #: rhodecode/templates/admin/settings/settings_global.mako:9
6700 #: rhodecode/templates/admin/settings/settings_global.mako:9
6606 #: rhodecode/templates/email_templates/pull_request_review.mako:43
6701 #: rhodecode/templates/email_templates/pull_request_review.mako:47
6607 #: rhodecode/templates/email_templates/pull_request_update.mako:43
6702 #: rhodecode/templates/email_templates/pull_request_update.mako:43
6608 #: rhodecode/templates/pullrequests/pullrequest.mako:38
6703 #: rhodecode/templates/pullrequests/pullrequest.mako:91
6609 #: rhodecode/templates/pullrequests/pullrequests.mako:96
6704 #: rhodecode/templates/pullrequests/pullrequests.mako:96
6610 msgid "Title"
6705 msgid "Title"
6611 msgstr ""
6706 msgstr ""
6612
6707
6708 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:97
6709 #: rhodecode/templates/pullrequests/pullrequests.mako:102
6710 msgid "Last Update"
6711 msgstr ""
6712
6613 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:103
6713 #: rhodecode/templates/admin/my_account/my_account_pullrequests.mako:103
6614 #: rhodecode/templates/pullrequests/pullrequests.mako:102
6714 msgid "Target Repo"
6615 msgid "Last Update"
6616 msgstr ""
6715 msgstr ""
6617
6716
6618 #: rhodecode/templates/admin/my_account/my_account_repos.mako:3
6717 #: rhodecode/templates/admin/my_account/my_account_repos.mako:3
@@ -6717,8 +6816,10 b' msgid "Unread"'
6717 msgstr ""
6816 msgstr ""
6718
6817
6719 #: rhodecode/templates/admin/notifications/notifications_show_all.mako:41
6818 #: rhodecode/templates/admin/notifications/notifications_show_all.mako:41
6720 #: rhodecode/templates/changeset/changeset.mako:172
6819 #: rhodecode/templates/changeset/changeset.mako:254
6721 #: rhodecode/templates/pullrequests/pullrequest_show.mako:670
6820 #: rhodecode/templates/changeset/changeset.mako:264
6821 #: rhodecode/templates/pullrequests/pullrequest_show.mako:729
6822 #: rhodecode/templates/pullrequests/pullrequest_show.mako:739
6722 msgid "Comments"
6823 msgid "Comments"
6723 msgstr ""
6824 msgstr ""
6724
6825
@@ -6798,6 +6899,7 b' msgstr ""'
6798 #: rhodecode/templates/admin/repos/repo_edit_reviewers.mako:6
6899 #: rhodecode/templates/admin/repos/repo_edit_reviewers.mako:6
6799 #: rhodecode/templates/admin/settings/settings_automation.mako:6
6900 #: rhodecode/templates/admin/settings/settings_automation.mako:6
6800 #: rhodecode/templates/artifacts/artifact_list.mako:24
6901 #: rhodecode/templates/artifacts/artifact_list.mako:24
6902 #: rhodecode/templates/pullrequests/pullrequest.mako:197
6801 msgid "This feature is available in RhodeCode EE edition only. Contact {sales_email} to obtain a trial license."
6903 msgid "This feature is available in RhodeCode EE edition only. Contact {sales_email} to obtain a trial license."
6802 msgstr ""
6904 msgstr ""
6803
6905
@@ -6887,8 +6989,8 b' msgstr ""'
6887
6989
6888 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14
6990 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14
6889 #: rhodecode/templates/admin/users/user_edit_advanced.mako:13
6991 #: rhodecode/templates/admin/users/user_edit_advanced.mako:13
6890 #: rhodecode/templates/base/base.mako:113
6992 #: rhodecode/templates/base/base.mako:115
6891 #: rhodecode/templates/base/base.mako:134
6993 #: rhodecode/templates/base/base.mako:136
6892 msgid "Repository groups"
6994 msgid "Repository groups"
6893 msgstr ""
6995 msgstr ""
6894
6996
@@ -6903,7 +7005,7 b' msgstr ""'
6903 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:25
7005 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:25
6904 #: rhodecode/templates/admin/repos/repo_add_base.mako:43
7006 #: rhodecode/templates/admin/repos/repo_add_base.mako:43
6905 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:33
7007 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:33
6906 #: rhodecode/templates/base/base.mako:669
7008 #: rhodecode/templates/base/base.mako:671
6907 #: rhodecode/templates/data_table/_dt_elements.mako:217
7009 #: rhodecode/templates/data_table/_dt_elements.mako:217
6908 #: rhodecode/templates/forks/fork.mako:41
7010 #: rhodecode/templates/forks/fork.mako:41
6909 msgid "Repository group"
7011 msgid "Repository group"
@@ -7153,7 +7255,7 b' msgid "Import Existing Repository ?"'
7153 msgstr ""
7255 msgstr ""
7154
7256
7155 #: rhodecode/templates/admin/repos/repo_add_base.mako:23
7257 #: rhodecode/templates/admin/repos/repo_add_base.mako:23
7156 #: rhodecode/templates/base/base.mako:330
7258 #: rhodecode/templates/base/base.mako:332
7157 msgid "Clone from"
7259 msgid "Clone from"
7158 msgstr ""
7260 msgstr ""
7159
7261
@@ -7538,13 +7640,13 b' msgid "Inherited Issue Tracker Patterns"'
7538 msgstr ""
7640 msgstr ""
7539
7641
7540 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:31
7642 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:31
7541 #: rhodecode/templates/base/issue_tracker_settings.mako:79
7643 #: rhodecode/templates/base/issue_tracker_settings.mako:80
7542 #: rhodecode/templates/base/perms_summary.mako:174
7644 #: rhodecode/templates/base/perms_summary.mako:174
7543 msgid "Pattern"
7645 msgid "Pattern"
7544 msgstr ""
7646 msgstr ""
7545
7647
7546 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:32
7648 #: rhodecode/templates/admin/repos/repo_edit_issuetracker.mako:32
7547 #: rhodecode/templates/base/issue_tracker_settings.mako:80
7649 #: rhodecode/templates/base/issue_tracker_settings.mako:81
7548 msgid "Url"
7650 msgid "Url"
7549 msgstr ""
7651 msgstr ""
7550
7652
@@ -7608,11 +7710,11 b' msgid "un-set private mode"'
7608 msgstr ""
7710 msgstr ""
7609
7711
7610 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:109
7712 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:109
7611 msgid "used by {} branch rule, requires write+ permissions"
7713 msgid "used by {} branch rule, requires write or higher permissions"
7612 msgstr ""
7714 msgstr ""
7613
7715
7614 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:111
7716 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:111
7615 msgid "used by {} branch rules, requires write+ permissions"
7717 msgid "used by {} branch rules, requires write or higher permissions"
7616 msgstr ""
7718 msgstr ""
7617
7719
7618 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:125
7720 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:125
@@ -8422,8 +8524,8 b' msgstr ""'
8422
8524
8423 #: rhodecode/templates/admin/user_groups/user_group_add.mako:13
8525 #: rhodecode/templates/admin/user_groups/user_group_add.mako:13
8424 #: rhodecode/templates/admin/users/user_edit_advanced.mako:14
8526 #: rhodecode/templates/admin/users/user_edit_advanced.mako:14
8425 #: rhodecode/templates/base/base.mako:115
8527 #: rhodecode/templates/base/base.mako:117
8426 #: rhodecode/templates/base/base.mako:137
8528 #: rhodecode/templates/base/base.mako:139
8427 msgid "User groups"
8529 msgid "User groups"
8428 msgstr ""
8530 msgstr ""
8429
8531
@@ -8555,7 +8657,7 b' msgstr ""'
8555
8657
8556 #: rhodecode/templates/admin/users/user_add.mako:13
8658 #: rhodecode/templates/admin/users/user_add.mako:13
8557 #: rhodecode/templates/admin/users/user_edit.mako:14
8659 #: rhodecode/templates/admin/users/user_edit.mako:14
8558 #: rhodecode/templates/base/base.mako:114
8660 #: rhodecode/templates/base/base.mako:116
8559 msgid "Users"
8661 msgid "Users"
8560 msgstr ""
8662 msgstr ""
8561
8663
@@ -8919,69 +9021,69 b' msgstr ""'
8919 msgid "{} Artifacts"
9021 msgid "{} Artifacts"
8920 msgstr ""
9022 msgstr ""
8921
9023
8922 #: rhodecode/templates/base/base.mako:71
9024 #: rhodecode/templates/base/base.mako:73
8923 msgid "RhodeCode instance id: {}"
9025 msgid "RhodeCode instance id: {}"
8924 msgstr ""
9026 msgstr ""
8925
9027
8926 #: rhodecode/templates/base/base.mako:99
8927 msgid "Super-admin Panel"
8928 msgstr ""
8929
8930 #: rhodecode/templates/base/base.mako:101
9028 #: rhodecode/templates/base/base.mako:101
9029 msgid "Super-admin Panel"
9030 msgstr ""
9031
9032 #: rhodecode/templates/base/base.mako:103
8931 msgid "Delegated Admin Panel"
9033 msgid "Delegated Admin Panel"
8932 msgstr ""
9034 msgstr ""
8933
9035
8934 #: rhodecode/templates/base/base.mako:117
8935 msgid "Authentication"
8936 msgstr ""
8937
8938 #: rhodecode/templates/base/base.mako:119
9036 #: rhodecode/templates/base/base.mako:119
9037 msgid "Authentication"
9038 msgstr ""
9039
9040 #: rhodecode/templates/base/base.mako:121
8939 msgid "Defaults"
9041 msgid "Defaults"
8940 msgstr ""
9042 msgstr ""
8941
9043
8942 #: rhodecode/templates/base/base.mako:159
9044 #: rhodecode/templates/base/base.mako:161
8943 #: rhodecode/templates/base/base.mako:199
9045 #: rhodecode/templates/base/base.mako:201
8944 #: rhodecode/templates/changeset/changeset.mako:154
9046 #: rhodecode/templates/changeset/changeset.mako:142
8945 #: rhodecode/templates/files/files_source_header.mako:57
9047 #: rhodecode/templates/files/files_source_header.mako:57
8946 #: rhodecode/templates/files/files_tree_header.mako:44
9048 #: rhodecode/templates/files/files_tree_header.mako:44
8947 #: rhodecode/templates/summary/components.mako:275
9049 #: rhodecode/templates/summary/components.mako:275
8948 msgid "Show More"
9050 msgid "Show More"
8949 msgstr ""
9051 msgstr ""
8950
9052
8951 #: rhodecode/templates/base/base.mako:302
9053 #: rhodecode/templates/base/base.mako:304
8952 #: rhodecode/templates/base/base.mako:313
9054 #: rhodecode/templates/base/base.mako:315
8953 msgid "RSS Feed"
9055 msgid "RSS Feed"
8954 msgstr ""
9056 msgstr ""
8955
9057
8956 #: rhodecode/templates/base/base.mako:304
9058 #: rhodecode/templates/base/base.mako:306
8957 msgid "Watch this Repository and actions on it in your personalized journal"
9059 msgid "Watch this Repository and actions on it in your personalized journal"
8958 msgstr ""
9060 msgstr ""
8959
9061
8960 #: rhodecode/templates/base/base.mako:322
9062 #: rhodecode/templates/base/base.mako:324
8961 msgid "Fork of"
9063 msgid "Fork of"
8962 msgstr ""
9064 msgstr ""
8963
9065
8964 #: rhodecode/templates/base/base.mako:339
9066 #: rhodecode/templates/base/base.mako:341
8965 #, python-format
9067 #, python-format
8966 msgid "Repository locked by %(user)s"
9068 msgid "Repository locked by %(user)s"
8967 msgstr ""
9069 msgstr ""
8968
9070
8969 #: rhodecode/templates/base/base.mako:344
9071 #: rhodecode/templates/base/base.mako:346
8970 msgid "Repository not locked. Pull repository to lock it."
9072 msgid "Repository not locked. Pull repository to lock it."
8971 msgstr ""
9073 msgstr ""
8972
9074
8973 #: rhodecode/templates/base/base.mako:360
9075 #: rhodecode/templates/base/base.mako:362
8974 msgid "This repository has been archived. It is now read-only."
9076 msgid "This repository has been archived. It is now read-only."
8975 msgstr ""
9077 msgstr ""
8976
9078
8977 #: rhodecode/templates/base/base.mako:373
9079 #: rhodecode/templates/base/base.mako:375
8978 #: rhodecode/templates/data_table/_dt_elements.mako:58
9080 #: rhodecode/templates/data_table/_dt_elements.mako:58
8979 #: rhodecode/templates/data_table/_dt_elements.mako:59
9081 #: rhodecode/templates/data_table/_dt_elements.mako:59
8980 #: rhodecode/templates/data_table/_dt_elements.mako:207
9082 #: rhodecode/templates/data_table/_dt_elements.mako:207
8981 msgid "Summary"
9083 msgid "Summary"
8982 msgstr ""
9084 msgstr ""
8983
9085
8984 #: rhodecode/templates/base/base.mako:374
9086 #: rhodecode/templates/base/base.mako:376
8985 #: rhodecode/templates/data_table/_dt_elements.mako:63
9087 #: rhodecode/templates/data_table/_dt_elements.mako:63
8986 #: rhodecode/templates/data_table/_dt_elements.mako:64
9088 #: rhodecode/templates/data_table/_dt_elements.mako:64
8987 #: rhodecode/templates/files/file_authors_box.mako:30
9089 #: rhodecode/templates/files/file_authors_box.mako:30
@@ -8991,7 +9093,7 b' msgstr ""'
8991 msgid "Commits"
9093 msgid "Commits"
8992 msgstr ""
9094 msgstr ""
8993
9095
8994 #: rhodecode/templates/base/base.mako:375
9096 #: rhodecode/templates/base/base.mako:377
8995 #: rhodecode/templates/data_table/_dt_elements.mako:68
9097 #: rhodecode/templates/data_table/_dt_elements.mako:68
8996 #: rhodecode/templates/data_table/_dt_elements.mako:69
9098 #: rhodecode/templates/data_table/_dt_elements.mako:69
8997 #: rhodecode/templates/files/files.mako:15
9099 #: rhodecode/templates/files/files.mako:15
@@ -8999,87 +9101,87 b' msgstr ""'
8999 msgid "Files"
9101 msgid "Files"
9000 msgstr ""
9102 msgstr ""
9001
9103
9002 #: rhodecode/templates/base/base.mako:376
9104 #: rhodecode/templates/base/base.mako:378
9003 #: rhodecode/templates/bookmarks/bookmarks.mako:66
9105 #: rhodecode/templates/bookmarks/bookmarks.mako:78
9004 #: rhodecode/templates/branches/branches.mako:65
9106 #: rhodecode/templates/branches/branches.mako:77
9005 #: rhodecode/templates/tags/tags.mako:66
9107 #: rhodecode/templates/tags/tags.mako:78
9006 msgid "Compare"
9108 msgid "Compare"
9007 msgstr ""
9109 msgstr ""
9008
9110
9009 #: rhodecode/templates/base/base.mako:381
9111 #: rhodecode/templates/base/base.mako:383
9010 #, python-format
9112 #, python-format
9011 msgid "Show Pull Requests for %s"
9113 msgid "Show Pull Requests for %s"
9012 msgstr ""
9114 msgstr ""
9013
9115
9014 #: rhodecode/templates/base/base.mako:392
9116 #: rhodecode/templates/base/base.mako:394
9015 msgid "Artifacts"
9117 msgid "Artifacts"
9016 msgstr ""
9118 msgstr ""
9017
9119
9018 #: rhodecode/templates/base/base.mako:398
9120 #: rhodecode/templates/base/base.mako:400
9019 msgid "Repository Settings"
9121 msgid "Repository Settings"
9020 msgstr ""
9122 msgstr ""
9021
9123
9022 #: rhodecode/templates/base/base.mako:404
9124 #: rhodecode/templates/base/base.mako:406
9023 msgid "Options"
9125 msgid "Options"
9024 msgstr ""
9126 msgstr ""
9025
9127
9026 #: rhodecode/templates/base/base.mako:409
9027 msgid "Unlock Repository"
9028 msgstr ""
9029
9030 #: rhodecode/templates/base/base.mako:411
9128 #: rhodecode/templates/base/base.mako:411
9129 msgid "Unlock Repository"
9130 msgstr ""
9131
9132 #: rhodecode/templates/base/base.mako:413
9031 msgid "Lock Repository"
9133 msgid "Lock Repository"
9032 msgstr ""
9134 msgstr ""
9033
9135
9034 #: rhodecode/templates/base/base.mako:464
9136 #: rhodecode/templates/base/base.mako:466
9035 msgid "Group Home"
9137 msgid "Group Home"
9036 msgstr ""
9138 msgstr ""
9037
9139
9038 #: rhodecode/templates/base/base.mako:468
9140 #: rhodecode/templates/base/base.mako:470
9039 msgid "You have admin right to this group, and can edit it"
9141 msgid "You have admin right to this group, and can edit it"
9040 msgstr ""
9142 msgstr ""
9041
9143
9042 #: rhodecode/templates/base/base.mako:468
9144 #: rhodecode/templates/base/base.mako:470
9043 msgid "Group Settings"
9145 msgid "Group Settings"
9044 msgstr ""
9146 msgstr ""
9045
9147
9046 #: rhodecode/templates/base/base.mako:519
9047 msgid "This Repository"
9048 msgstr ""
9049
9050 #: rhodecode/templates/base/base.mako:521
9148 #: rhodecode/templates/base/base.mako:521
9149 msgid "This Repository"
9150 msgstr ""
9151
9152 #: rhodecode/templates/base/base.mako:523
9051 msgid "Create Pull Request"
9153 msgid "Create Pull Request"
9052 msgstr ""
9154 msgstr ""
9053
9155
9054 #: rhodecode/templates/base/base.mako:525
9156 #: rhodecode/templates/base/base.mako:527
9055 msgid "Fork this repository"
9157 msgid "Fork this repository"
9056 msgstr ""
9158 msgstr ""
9057
9159
9058 #: rhodecode/templates/base/base.mako:532
9160 #: rhodecode/templates/base/base.mako:534
9059 msgid "This Repository Group"
9161 msgid "This Repository Group"
9060 msgstr ""
9162 msgstr ""
9061
9163
9062 #: rhodecode/templates/base/base.mako:536
9164 #: rhodecode/templates/base/base.mako:538
9063 #: rhodecode/templates/base/base.mako:552
9165 #: rhodecode/templates/base/base.mako:554
9064 #: rhodecode/templates/base/base.mako:564
9166 #: rhodecode/templates/base/base.mako:566
9065 msgid "New Repository"
9167 msgid "New Repository"
9066 msgstr ""
9168 msgstr ""
9067
9169
9068 #: rhodecode/templates/base/base.mako:542
9170 #: rhodecode/templates/base/base.mako:544
9069 #: rhodecode/templates/base/base.mako:556
9171 #: rhodecode/templates/base/base.mako:558
9070 #: rhodecode/templates/base/base.mako:570
9172 #: rhodecode/templates/base/base.mako:572
9071 msgid "New Repository Group"
9173 msgid "New Repository Group"
9072 msgstr ""
9174 msgstr ""
9073
9175
9074 #: rhodecode/templates/base/base.mako:597
9176 #: rhodecode/templates/base/base.mako:599
9075 msgid "Sign in"
9177 msgid "Sign in"
9076 msgstr ""
9178 msgstr ""
9077
9179
9078 #: rhodecode/templates/base/base.mako:622
9180 #: rhodecode/templates/base/base.mako:624
9079 msgid "My personal group"
9181 msgid "My personal group"
9080 msgstr ""
9182 msgstr ""
9081
9183
9082 #: rhodecode/templates/base/base.mako:628
9184 #: rhodecode/templates/base/base.mako:630
9083 #: rhodecode/templates/debug_style/alerts.html:5
9185 #: rhodecode/templates/debug_style/alerts.html:5
9084 #: rhodecode/templates/debug_style/buttons.html:5
9186 #: rhodecode/templates/debug_style/buttons.html:5
9085 #: rhodecode/templates/debug_style/code-block.html:6
9187 #: rhodecode/templates/debug_style/code-block.html:6
@@ -9102,61 +9204,61 b' msgstr ""'
9102 msgid "Style"
9204 msgid "Style"
9103 msgstr ""
9205 msgstr ""
9104
9206
9105 #: rhodecode/templates/base/base.mako:629
9207 #: rhodecode/templates/base/base.mako:631
9106 msgid "[Style]"
9208 msgid "[Style]"
9107 msgstr ""
9209 msgstr ""
9108
9210
9109 #: rhodecode/templates/base/base.mako:646
9211 #: rhodecode/templates/base/base.mako:648
9110 msgid "No Bookmarks yet."
9212 msgid "No Bookmarks yet."
9111 msgstr ""
9213 msgstr ""
9112
9214
9113 #: rhodecode/templates/base/base.mako:684
9215 #: rhodecode/templates/base/base.mako:686
9114 msgid "Sign Out"
9216 msgid "Sign Out"
9115 msgstr ""
9217 msgstr ""
9116
9218
9117 #: rhodecode/templates/base/base.mako:732
9219 #: rhodecode/templates/base/base.mako:731
9118 msgid "dismiss"
9220 msgid "dismiss"
9119 msgstr ""
9221 msgstr ""
9120
9222
9121 #: rhodecode/templates/base/base.mako:773
9223 #: rhodecode/templates/base/base.mako:772
9122 msgid "search / go to..."
9224 msgid "search / go to..."
9123 msgstr ""
9225 msgstr ""
9124
9226
9227 #: rhodecode/templates/base/base.mako:817
9228 msgid "Show activity journal"
9229 msgstr ""
9230
9125 #: rhodecode/templates/base/base.mako:818
9231 #: rhodecode/templates/base/base.mako:818
9126 msgid "Show activity journal"
9127 msgstr ""
9128
9129 #: rhodecode/templates/base/base.mako:819
9130 #: rhodecode/templates/journal/journal.mako:4
9232 #: rhodecode/templates/journal/journal.mako:4
9131 #: rhodecode/templates/journal/journal.mako:14
9233 #: rhodecode/templates/journal/journal.mako:14
9132 msgid "Journal"
9234 msgid "Journal"
9133 msgstr ""
9235 msgstr ""
9134
9236
9135 #: rhodecode/templates/base/base.mako:824
9237 #: rhodecode/templates/base/base.mako:823
9136 msgid "Show Public activity journal"
9238 msgid "Show Public activity journal"
9137 msgstr ""
9239 msgstr ""
9138
9240
9139 #: rhodecode/templates/base/base.mako:825
9241 #: rhodecode/templates/base/base.mako:824
9140 msgid "Public journal"
9242 msgid "Public journal"
9141 msgstr ""
9243 msgstr ""
9142
9244
9245 #: rhodecode/templates/base/base.mako:830
9246 msgid "Show Gists"
9247 msgstr ""
9248
9143 #: rhodecode/templates/base/base.mako:831
9249 #: rhodecode/templates/base/base.mako:831
9144 msgid "Show Gists"
9145 msgstr ""
9146
9147 #: rhodecode/templates/base/base.mako:832
9148 msgid "Gists"
9250 msgid "Gists"
9149 msgstr ""
9251 msgstr ""
9150
9252
9151 #: rhodecode/templates/base/base.mako:838
9253 #: rhodecode/templates/base/base.mako:837
9152 msgid "Admin settings"
9254 msgid "Admin settings"
9153 msgstr ""
9255 msgstr ""
9154
9256
9155 #: rhodecode/templates/base/base.mako:1155
9257 #: rhodecode/templates/base/base.mako:1154
9156 msgid "Keyboard shortcuts"
9258 msgid "Keyboard shortcuts"
9157 msgstr ""
9259 msgstr ""
9158
9260
9159 #: rhodecode/templates/base/base.mako:1163
9261 #: rhodecode/templates/base/base.mako:1162
9160 msgid "Site-wide shortcuts"
9262 msgid "Site-wide shortcuts"
9161 msgstr ""
9263 msgstr ""
9162
9264
@@ -9235,36 +9337,36 b' msgid ""'
9235 "permission by members of user groups."
9337 "permission by members of user groups."
9236 msgstr ""
9338 msgstr ""
9237
9339
9238 #: rhodecode/templates/base/issue_tracker_settings.mako:81
9340 #: rhodecode/templates/base/issue_tracker_settings.mako:82
9239 msgid "Extra Prefix"
9341 msgid "Extra Prefix"
9240 msgstr ""
9342 msgstr ""
9241
9343
9242 #: rhodecode/templates/base/issue_tracker_settings.mako:92
9344 #: rhodecode/templates/base/issue_tracker_settings.mako:93
9243 msgid "show examples"
9345 msgid "show examples"
9244 msgstr ""
9346 msgstr ""
9245
9347
9246 #: rhodecode/templates/base/issue_tracker_settings.mako:160
9348 #: rhodecode/templates/base/issue_tracker_settings.mako:161
9247 msgid "Add new"
9349 msgid "Add new"
9248 msgstr ""
9350 msgstr ""
9249
9351
9250 #: rhodecode/templates/base/issue_tracker_settings.mako:168
9352 #: rhodecode/templates/base/issue_tracker_settings.mako:169
9251 msgid "New Entry"
9353 msgid "New Entry"
9252 msgstr ""
9354 msgstr ""
9253
9355
9254 #: rhodecode/templates/base/issue_tracker_settings.mako:172
9356 #: rhodecode/templates/base/issue_tracker_settings.mako:173
9255 msgid "Confirm to remove this pattern:"
9357 msgid "Confirm to remove this pattern:"
9256 msgstr ""
9358 msgstr ""
9257
9359
9258 #: rhodecode/templates/base/issue_tracker_settings.mako:293
9360 #: rhodecode/templates/base/issue_tracker_settings.mako:300
9259 #: rhodecode/templates/changeset/changeset_file_comment.mako:340
9361 #: rhodecode/templates/changeset/changeset_file_comment.mako:367
9260 #: rhodecode/templates/changeset/changeset_file_comment.mako:391
9362 #: rhodecode/templates/changeset/changeset_file_comment.mako:418
9261 #: rhodecode/templates/data_table/_dt_elements.mako:453
9363 #: rhodecode/templates/data_table/_dt_elements.mako:453
9262 #: rhodecode/templates/files/files_add.mako:59
9364 #: rhodecode/templates/files/files_add.mako:59
9263 #: rhodecode/templates/files/files_edit.mako:61
9365 #: rhodecode/templates/files/files_edit.mako:61
9264 msgid "Preview"
9366 msgid "Preview"
9265 msgstr ""
9367 msgstr ""
9266
9368
9267 #: rhodecode/templates/base/issue_tracker_settings.mako:294
9369 #: rhodecode/templates/base/issue_tracker_settings.mako:301
9268 msgid "Test Pattern Preview"
9370 msgid "Test Pattern Preview"
9269 msgstr ""
9371 msgstr ""
9270
9372
@@ -9593,10 +9695,6 b' msgstr ""'
9593 msgid "Compare Selected Bookmarks"
9695 msgid "Compare Selected Bookmarks"
9594 msgstr ""
9696 msgstr ""
9595
9697
9596 #: rhodecode/templates/bookmarks/bookmarks.mako:34
9597 msgid "bookmarks"
9598 msgstr ""
9599
9600 #: rhodecode/templates/branches/branches.mako:5
9698 #: rhodecode/templates/branches/branches.mako:5
9601 #, python-format
9699 #, python-format
9602 msgid "%s Branches"
9700 msgid "%s Branches"
@@ -9606,15 +9704,11 b' msgstr ""'
9606 msgid "Compare Selected Branches"
9704 msgid "Compare Selected Branches"
9607 msgstr ""
9705 msgstr ""
9608
9706
9609 #: rhodecode/templates/branches/branches.mako:34
9707 #: rhodecode/templates/changeset/changeset.mako:11
9610 msgid "branches"
9611 msgstr ""
9612
9613 #: rhodecode/templates/changeset/changeset.mako:9
9614 msgid "{} Commit"
9708 msgid "{} Commit"
9615 msgstr ""
9709 msgstr ""
9616
9710
9617 #: rhodecode/templates/changeset/changeset.mako:78
9711 #: rhodecode/templates/changeset/changeset.mako:80
9618 #: rhodecode/templates/commits/changelog_elements.mako:56
9712 #: rhodecode/templates/commits/changelog_elements.mako:56
9619 #: rhodecode/templates/files/files_source_header.mako:48
9713 #: rhodecode/templates/files/files_source_header.mako:48
9620 #: rhodecode/templates/files/files_tree_header.mako:35
9714 #: rhodecode/templates/files/files_tree_header.mako:35
@@ -9622,166 +9716,119 b' msgstr ""'
9622 msgid "Copy the full commit id"
9716 msgid "Copy the full commit id"
9623 msgstr ""
9717 msgstr ""
9624
9718
9625 #: rhodecode/templates/changeset/changeset.mako:83
9719 #: rhodecode/templates/changeset/changeset.mako:85
9626 msgid "Commit phase"
9720 msgid "Commit phase"
9627 msgstr ""
9721 msgstr ""
9628
9722
9629 #: rhodecode/templates/changeset/changeset.mako:90
9723 #: rhodecode/templates/changeset/changeset.mako:92
9630 #: rhodecode/templates/changeset/changeset.mako:97
9724 #: rhodecode/templates/changeset/changeset.mako:99
9631 msgid "Evolve State"
9725 msgid "Evolve State"
9632 msgstr ""
9726 msgstr ""
9633
9727
9634 #: rhodecode/templates/changeset/changeset.mako:91
9728 #: rhodecode/templates/changeset/changeset.mako:93
9635 msgid "obsolete"
9729 msgid "obsolete"
9636 msgstr ""
9730 msgstr ""
9637
9731
9638 #: rhodecode/templates/changeset/changeset.mako:98
9732 #: rhodecode/templates/changeset/changeset.mako:100
9639 msgid "hidden"
9733 msgid "hidden"
9640 msgstr ""
9734 msgstr ""
9641
9735
9642 #: rhodecode/templates/changeset/changeset.mako:117
9736 #: rhodecode/templates/changeset/changeset.mako:106
9643 msgid "Commit navigation"
9737 msgid "Parent Commit"
9738 msgstr ""
9739
9740 #: rhodecode/templates/changeset/changeset.mako:106
9741 msgid "parent"
9742 msgstr ""
9743
9744 #: rhodecode/templates/changeset/changeset.mako:110
9745 msgid "Child Commit"
9746 msgstr ""
9747
9748 #: rhodecode/templates/changeset/changeset.mako:110
9749 msgid "child"
9644 msgstr ""
9750 msgstr ""
9645
9751
9646 #: rhodecode/templates/changeset/changeset.mako:120
9752 #: rhodecode/templates/changeset/changeset.mako:120
9647 msgid "Parent Commit"
9753 msgid "Diff options"
9648 msgstr ""
9649
9650 #: rhodecode/templates/changeset/changeset.mako:120
9651 msgid "parent"
9652 msgstr ""
9754 msgstr ""
9653
9755
9654 #: rhodecode/templates/changeset/changeset.mako:124
9756 #: rhodecode/templates/changeset/changeset.mako:124
9655 msgid "Child Commit"
9757 msgid "Raw Diff"
9656 msgstr ""
9758 msgstr ""
9657
9759
9658 #: rhodecode/templates/changeset/changeset.mako:124
9760 #: rhodecode/templates/changeset/changeset.mako:128
9659 msgid "child"
9761 msgid "Patch Diff"
9660 msgstr ""
9762 msgstr ""
9661
9763
9662 #: rhodecode/templates/changeset/changeset.mako:132
9764 #: rhodecode/templates/changeset/changeset.mako:132
9663 msgid "Diff options"
9664 msgstr ""
9665
9666 #: rhodecode/templates/changeset/changeset.mako:136
9667 msgid "Raw Diff"
9668 msgstr ""
9669
9670 #: rhodecode/templates/changeset/changeset.mako:140
9671 msgid "Patch Diff"
9672 msgstr ""
9673
9674 #: rhodecode/templates/changeset/changeset.mako:144
9675 msgid "Download Diff"
9765 msgid "Download Diff"
9676 msgstr ""
9766 msgstr ""
9677
9767
9678 #: rhodecode/templates/changeset/changeset.mako:224
9768 #: rhodecode/templates/changeset/changeset.mako:162
9769 #: rhodecode/templates/pullrequests/pullrequest_show.mako:504
9770 msgid "General Comments"
9771 msgstr ""
9772
9773 #: rhodecode/templates/changeset/changeset.mako:203
9774 #: rhodecode/templates/pullrequests/pullrequest_show.mako:585
9775 msgid "Reviewers"
9776 msgstr ""
9777
9778 #: rhodecode/templates/changeset/changeset.mako:244
9779 #: rhodecode/templates/pullrequests/pullrequest_show.mako:718
9780 msgid "No TODOs yet"
9781 msgstr ""
9782
9783 #: rhodecode/templates/changeset/changeset.mako:276
9784 #: rhodecode/templates/pullrequests/pullrequest_show.mako:769
9785 msgid "No Comments yet"
9786 msgstr ""
9787
9788 #: rhodecode/templates/changeset/changeset.mako:332
9679 msgid "No Child Commits"
9789 msgid "No Child Commits"
9680 msgstr ""
9790 msgstr ""
9681
9791
9682 #: rhodecode/templates/changeset/changeset.mako:263
9792 #: rhodecode/templates/changeset/changeset.mako:379
9683 msgid "No Parent Commits"
9793 msgid "No Parent Commits"
9684 msgstr ""
9794 msgstr ""
9685
9795
9686 #: rhodecode/templates/changeset/changeset_file_comment.mako:41
9796 #: rhodecode/templates/changeset/changeset_file_comment.mako:47
9687 #: rhodecode/templates/pullrequests/pullrequest_show.mako:401
9688 msgid "Resolved by comment #{}"
9797 msgid "Resolved by comment #{}"
9689 msgstr ""
9798 msgstr ""
9690
9799
9691 #: rhodecode/templates/changeset/changeset_file_comment.mako:49
9800 #: rhodecode/templates/changeset/changeset_file_comment.mako:55
9692 msgid "Click to create resolution comment."
9801 msgid "Click to create resolution comment."
9693 msgstr ""
9802 msgstr ""
9694
9803
9695 #: rhodecode/templates/changeset/changeset_file_comment.mako:58
9804 #: rhodecode/templates/changeset/changeset_file_comment.mako:64
9696 msgid "This comment resolves TODO #{}"
9805 msgid "This comment resolves TODO #{}"
9697 msgstr ""
9806 msgstr ""
9698
9807
9699 #: rhodecode/templates/changeset/changeset_file_comment.mako:90
9808 #: rhodecode/templates/changeset/changeset_file_comment.mako:96
9700 msgid "Status from pull request."
9809 msgid "Status from pull request."
9701 msgstr ""
9810 msgstr ""
9702
9811
9703 #: rhodecode/templates/changeset/changeset_file_comment.mako:107
9812 #: rhodecode/templates/changeset/changeset_file_comment.mako:113
9704 msgid "Pull request author"
9813 msgid "Pull request author"
9705 msgstr ""
9814 msgstr ""
9706
9815
9707 #: rhodecode/templates/changeset/changeset_file_comment.mako:108
9816 #: rhodecode/templates/changeset/changeset_file_comment.mako:114
9708 msgid "author"
9817 msgid "author"
9709 msgstr ""
9818 msgstr ""
9710
9819
9711 #: rhodecode/templates/changeset/changeset_file_comment.mako:163
9712 #: rhodecode/templates/changeset/changeset_file_comment.mako:179
9713 msgid "Outdated comment from pull request version v{0}, latest v{1}"
9714 msgstr ""
9715
9716 #: rhodecode/templates/changeset/changeset_file_comment.mako:167
9820 #: rhodecode/templates/changeset/changeset_file_comment.mako:167
9717 #: rhodecode/templates/changeset/changeset_file_comment.mako:183
9821 #: rhodecode/templates/changeset/changeset_file_comment.mako:181
9822 msgid "Outdated comment from pull request version v{0}, latest v{1}"
9823 msgstr ""
9824
9825 #: rhodecode/templates/changeset/changeset_file_comment.mako:170
9826 #: rhodecode/templates/changeset/changeset_file_comment.mako:186
9718 msgid "Comment from pull request version v{0}, latest v{1}"
9827 msgid "Comment from pull request version v{0}, latest v{1}"
9719 msgstr ""
9828 msgstr ""
9720
9829
9721 #: rhodecode/templates/changeset/changeset_file_comment.mako:205
9830 #: rhodecode/templates/changeset/changeset_file_comment.mako:202
9722 #: rhodecode/templates/changeset/changeset_file_comment.mako:206
9831 #: rhodecode/templates/changeset/changeset_file_comment.mako:480
9723 #: rhodecode/templates/changeset/changeset_file_comment.mako:209
9724 #: rhodecode/templates/changeset/changeset_file_comment.mako:210
9725 msgid "Action unavailable"
9726 msgstr ""
9727
9728 #: rhodecode/templates/changeset/changeset_file_comment.mako:214
9729 msgid "Jump to the previous outdated comment"
9730 msgstr ""
9731
9732 #: rhodecode/templates/changeset/changeset_file_comment.mako:215
9733 msgid "Jump to the next outdated comment"
9734 msgstr ""
9735
9736 #: rhodecode/templates/changeset/changeset_file_comment.mako:217
9737 msgid "Jump to the previous comment"
9738 msgstr ""
9739
9740 #: rhodecode/templates/changeset/changeset_file_comment.mako:218
9741 msgid "Jump to the next comment"
9742 msgstr ""
9743
9744 #: rhodecode/templates/changeset/changeset_file_comment.mako:257
9745 msgid "Leave a comment on this Pull Request."
9746 msgstr ""
9747
9748 #: rhodecode/templates/changeset/changeset_file_comment.mako:259
9749 msgid "Leave a comment on {} commits in this range."
9750 msgstr ""
9751
9752 #: rhodecode/templates/changeset/changeset_file_comment.mako:261
9753 msgid "Leave a comment on this Commit."
9754 msgstr ""
9755
9756 #: rhodecode/templates/changeset/changeset_file_comment.mako:348
9757 #: rhodecode/templates/codeblocks/diffs.mako:83
9758 msgid "You need to be logged in to leave comments."
9759 msgstr ""
9760
9761 #: rhodecode/templates/changeset/changeset_file_comment.mako:349
9762 #: rhodecode/templates/codeblocks/diffs.mako:83
9763 msgid "Login now"
9764 msgstr ""
9765
9766 #: rhodecode/templates/changeset/changeset_file_comment.mako:396
9767 msgid "Mark as"
9768 msgstr ""
9769
9770 #: rhodecode/templates/changeset/changeset_file_comment.mako:419
9771 #: rhodecode/templates/files/files_upload.mako:86
9772 msgid "Drag'n Drop files here or"
9773 msgstr ""
9774
9775 #: rhodecode/templates/changeset/changeset_file_comment.mako:419
9776 #: rhodecode/templates/files/files_upload.mako:86
9777 msgid "Choose your files"
9778 msgstr ""
9779
9780 #: rhodecode/templates/changeset/changeset_file_comment.mako:422
9781 msgid "uploading..."
9782 msgstr ""
9783
9784 #: rhodecode/templates/changeset/changeset_file_comment.mako:453
9785 #: rhodecode/templates/compare/compare_diff.mako:108
9832 #: rhodecode/templates/compare/compare_diff.mako:108
9786 #: rhodecode/templates/compare/compare_diff.mako:116
9833 #: rhodecode/templates/compare/compare_diff.mako:116
9787 #: rhodecode/templates/compare/compare_diff.mako:124
9834 #: rhodecode/templates/compare/compare_diff.mako:124
@@ -9789,30 +9836,97 b' msgstr ""'
9789 msgid "Comment"
9836 msgid "Comment"
9790 msgstr ""
9837 msgstr ""
9791
9838
9792 #: rhodecode/templates/changeset/changeset_file_comment.mako:472
9839 #: rhodecode/templates/changeset/changeset_file_comment.mako:203
9793 #: rhodecode/templates/pullrequests/pullrequest_show.mako:39
9840 #: rhodecode/templates/files/files_source.mako:117
9794 #: rhodecode/templates/pullrequests/pullrequest_show.mako:103
9841 msgid "Copy permalink"
9842 msgstr ""
9843
9844 #: rhodecode/templates/changeset/changeset_file_comment.mako:221
9845 #: rhodecode/templates/changeset/changeset_file_comment.mako:224
9846 #: rhodecode/templates/changeset/changeset_file_comment.mako:230
9847 #: rhodecode/templates/changeset/changeset_file_comment.mako:233
9848 msgid "Action unavailable"
9849 msgstr ""
9850
9851 #: rhodecode/templates/changeset/changeset_file_comment.mako:241
9852 msgid "Jump to the previous outdated comment"
9853 msgstr ""
9854
9855 #: rhodecode/templates/changeset/changeset_file_comment.mako:242
9856 msgid "Jump to the next outdated comment"
9857 msgstr ""
9858
9859 #: rhodecode/templates/changeset/changeset_file_comment.mako:244
9860 msgid "Jump to the previous comment"
9861 msgstr ""
9862
9863 #: rhodecode/templates/changeset/changeset_file_comment.mako:245
9864 msgid "Jump to the next comment"
9865 msgstr ""
9866
9867 #: rhodecode/templates/changeset/changeset_file_comment.mako:284
9868 msgid "Leave a comment on this Pull Request."
9869 msgstr ""
9870
9871 #: rhodecode/templates/changeset/changeset_file_comment.mako:286
9872 msgid "Leave a comment on {} commits in this range."
9873 msgstr ""
9874
9875 #: rhodecode/templates/changeset/changeset_file_comment.mako:288
9876 msgid "Leave a comment on this Commit."
9877 msgstr ""
9878
9879 #: rhodecode/templates/changeset/changeset_file_comment.mako:375
9880 #: rhodecode/templates/codeblocks/diffs.mako:85
9881 msgid "You need to be logged in to leave comments."
9882 msgstr ""
9883
9884 #: rhodecode/templates/changeset/changeset_file_comment.mako:376
9885 #: rhodecode/templates/codeblocks/diffs.mako:85
9886 msgid "Login now"
9887 msgstr ""
9888
9889 #: rhodecode/templates/changeset/changeset_file_comment.mako:423
9890 msgid "Mark as"
9891 msgstr ""
9892
9893 #: rhodecode/templates/changeset/changeset_file_comment.mako:446
9894 #: rhodecode/templates/files/files_upload.mako:86
9895 msgid "Drag'n Drop files here or"
9896 msgstr ""
9897
9898 #: rhodecode/templates/changeset/changeset_file_comment.mako:446
9899 #: rhodecode/templates/files/files_upload.mako:86
9900 msgid "Choose your files"
9901 msgstr ""
9902
9903 #: rhodecode/templates/changeset/changeset_file_comment.mako:449
9904 msgid "uploading..."
9905 msgstr ""
9906
9907 #: rhodecode/templates/changeset/changeset_file_comment.mako:499
9908 #: rhodecode/templates/pullrequests/pullrequest_show.mako:48
9795 #: rhodecode/templates/pullrequests/pullrequests.mako:31
9909 #: rhodecode/templates/pullrequests/pullrequests.mako:31
9796 msgid "Closed"
9910 msgid "Closed"
9797 msgstr ""
9911 msgstr ""
9798
9912
9799 #: rhodecode/templates/changeset/changeset_file_comment.mako:481
9913 #: rhodecode/templates/changeset/changeset_file_comment.mako:508
9800 msgid "Comments parsed using {} syntax."
9914 msgid "Comments parsed using {} syntax."
9801 msgstr ""
9915 msgstr ""
9802
9916
9803 #: rhodecode/templates/changeset/changeset_file_comment.mako:482
9917 #: rhodecode/templates/changeset/changeset_file_comment.mako:509
9804 msgid "Use @username inside this text to send notification to this RhodeCode user"
9918 msgid "Use @username inside this text to send notification to this RhodeCode user"
9805 msgstr ""
9919 msgstr ""
9806
9920
9807 #: rhodecode/templates/changeset/changeset_file_comment.mako:483
9921 #: rhodecode/templates/changeset/changeset_file_comment.mako:510
9808 msgid "and"
9922 msgid "and"
9809 msgstr ""
9923 msgstr ""
9810
9924
9811 #: rhodecode/templates/changeset/changeset_file_comment.mako:484
9925 #: rhodecode/templates/changeset/changeset_file_comment.mako:511
9812 msgid "Start typing with / for certain actions to be triggered via text box."
9926 msgid "Start typing with / for certain actions to be triggered via text box."
9813 msgstr ""
9927 msgstr ""
9814
9928
9815 #: rhodecode/templates/changeset/changeset_file_comment.mako:485
9929 #: rhodecode/templates/changeset/changeset_file_comment.mako:512
9816 msgid "actions supported."
9930 msgid "actions supported."
9817 msgstr ""
9931 msgstr ""
9818
9932
@@ -9845,8 +9959,8 b' msgstr ""'
9845 #: rhodecode/templates/changeset/diff_block.mako:10
9959 #: rhodecode/templates/changeset/diff_block.mako:10
9846 #: rhodecode/templates/changeset/diff_block.mako:25
9960 #: rhodecode/templates/changeset/diff_block.mako:25
9847 #: rhodecode/templates/changeset/diff_block.mako:46
9961 #: rhodecode/templates/changeset/diff_block.mako:46
9848 #: rhodecode/templates/codeblocks/diffs.mako:208
9962 #: rhodecode/templates/codeblocks/diffs.mako:210
9849 #: rhodecode/templates/codeblocks/diffs.mako:283
9963 #: rhodecode/templates/codeblocks/diffs.mako:341
9850 msgid "Showing a big diff might take some time and resources, continue?"
9964 msgid "Showing a big diff might take some time and resources, continue?"
9851 msgstr ""
9965 msgstr ""
9852
9966
@@ -9854,8 +9968,8 b' msgstr ""'
9854 #: rhodecode/templates/changeset/diff_block.mako:10
9968 #: rhodecode/templates/changeset/diff_block.mako:10
9855 #: rhodecode/templates/changeset/diff_block.mako:25
9969 #: rhodecode/templates/changeset/diff_block.mako:25
9856 #: rhodecode/templates/changeset/diff_block.mako:46
9970 #: rhodecode/templates/changeset/diff_block.mako:46
9857 #: rhodecode/templates/codeblocks/diffs.mako:208
9971 #: rhodecode/templates/codeblocks/diffs.mako:210
9858 #: rhodecode/templates/codeblocks/diffs.mako:283
9972 #: rhodecode/templates/codeblocks/diffs.mako:341
9859 msgid "Show full diff"
9973 msgid "Show full diff"
9860 msgstr ""
9974 msgstr ""
9861
9975
@@ -9868,173 +9982,148 b' msgstr ""'
9868 msgid "Diff was truncated. File content available only in full diff."
9982 msgid "Diff was truncated. File content available only in full diff."
9869 msgstr ""
9983 msgstr ""
9870
9984
9871 #: rhodecode/templates/codeblocks/diffs.mako:141
9985 #: rhodecode/templates/codeblocks/diffs.mako:143
9872 msgid "not available in this view"
9986 msgid "not available in this view"
9873 msgstr ""
9987 msgstr ""
9874
9988
9875 #: rhodecode/templates/codeblocks/diffs.mako:150
9989 #: rhodecode/templates/codeblocks/diffs.mako:152
9876 msgid "{} unresolved"
9990 msgid "{} unresolved"
9877 msgstr ""
9991 msgstr ""
9878
9992
9879 #: rhodecode/templates/codeblocks/diffs.mako:153
9993 #: rhodecode/templates/codeblocks/diffs.mako:155
9880 msgid "0 unresolved"
9994 msgid "0 unresolved"
9881 msgstr ""
9995 msgstr ""
9882
9996
9883 #: rhodecode/templates/codeblocks/diffs.mako:156
9997 #: rhodecode/templates/codeblocks/diffs.mako:158
9884 msgid "{} Resolved"
9998 msgid "{} Resolved"
9885 msgstr ""
9999 msgstr ""
9886
10000
9887 #: rhodecode/templates/codeblocks/diffs.mako:170
10001 #: rhodecode/templates/codeblocks/diffs.mako:209
9888 msgid "0 General"
9889 msgstr ""
9890
9891 #: rhodecode/templates/codeblocks/diffs.mako:178
9892 msgid "0 Inline"
9893 msgstr ""
9894
9895 #: rhodecode/templates/codeblocks/diffs.mako:189
9896 #: rhodecode/templates/codeblocks/diffs.mako:194
9897 msgid "{} Outdated"
9898 msgstr ""
9899
9900 #: rhodecode/templates/codeblocks/diffs.mako:191
9901 msgid "show outdated"
9902 msgstr ""
9903
9904 #: rhodecode/templates/codeblocks/diffs.mako:192
9905 msgid "hide outdated"
9906 msgstr ""
9907
9908 #: rhodecode/templates/codeblocks/diffs.mako:207
9909 msgid "The requested changes are too big and content was truncated."
10002 msgid "The requested changes are too big and content was truncated."
9910 msgstr ""
10003 msgstr ""
9911
10004
9912 #: rhodecode/templates/codeblocks/diffs.mako:231
10005 #: rhodecode/templates/codeblocks/diffs.mako:226
9913 msgid "Some changes may be hidden"
10006 msgid "Some changes may be hidden"
9914 msgstr ""
10007 msgstr ""
9915
10008
9916 #: rhodecode/templates/codeblocks/diffs.mako:233
10009 #: rhodecode/templates/codeblocks/diffs.mako:228
9917 msgid "No files"
10010 msgid "No files"
9918 msgstr ""
10011 msgstr ""
9919
10012
9920 #: rhodecode/templates/codeblocks/diffs.mako:283
10013 #: rhodecode/templates/codeblocks/diffs.mako:341
9921 msgid "The requested commit or file is too big and content was truncated."
10014 msgid "The requested commit or file is too big and content was truncated."
9922 msgstr ""
10015 msgstr ""
9923
10016
9924 #: rhodecode/templates/codeblocks/diffs.mako:290
10017 #: rhodecode/templates/codeblocks/diffs.mako:348
9925 #, python-format
10018 #, python-format
9926 msgid "This diff has been collapsed as it changes many lines, (%i lines changed)"
10019 msgid "This diff has been collapsed as it changes many lines, (%i lines changed)"
9927 msgstr ""
10020 msgstr ""
9928
10021
9929 #: rhodecode/templates/codeblocks/diffs.mako:292
10022 #: rhodecode/templates/codeblocks/diffs.mako:350
9930 msgid "Show them"
10023 msgid "Show them"
9931 msgstr ""
10024 msgstr ""
9932
10025
9933 #: rhodecode/templates/codeblocks/diffs.mako:295
10026 #: rhodecode/templates/codeblocks/diffs.mako:353
9934 msgid "Hide them"
10027 msgid "Hide them"
9935 msgstr ""
10028 msgstr ""
9936
10029
9937 #: rhodecode/templates/codeblocks/diffs.mako:332
10030 #: rhodecode/templates/codeblocks/diffs.mako:390
9938 #: rhodecode/templates/codeblocks/diffs.mako:351
10031 #: rhodecode/templates/codeblocks/diffs.mako:409
9939 msgid "Unmatched/outdated inline comments below"
10032 msgid "Unmatched/outdated inline comments below"
9940 msgstr ""
10033 msgstr ""
9941
10034
9942 #: rhodecode/templates/codeblocks/diffs.mako:357
10035 #: rhodecode/templates/codeblocks/diffs.mako:415
9943 msgid "Unmatched/outdated comments below"
10036 msgid "Unmatched/outdated comments below"
9944 msgstr ""
10037 msgstr ""
9945
10038
9946 #: rhodecode/templates/codeblocks/diffs.mako:431
10039 #: rhodecode/templates/codeblocks/diffs.mako:489
9947 msgid "This file was removed from diff during updates to this pull-request."
10040 msgid "This file was removed from diff during updates to this pull-request."
9948 msgstr ""
10041 msgstr ""
9949
10042
9950 #: rhodecode/templates/codeblocks/diffs.mako:432
10043 #: rhodecode/templates/codeblocks/diffs.mako:490
9951 msgid "There are still outdated/unresolved comments attached to it."
10044 msgid "There are still outdated/unresolved comments attached to it."
9952 msgstr ""
10045 msgstr ""
9953
10046
9954 #: rhodecode/templates/codeblocks/diffs.mako:499
10047 #: rhodecode/templates/codeblocks/diffs.mako:596
9955 msgid "Copy file path"
10048 #: rhodecode/templates/codeblocks/diffs.mako:614
9956 msgstr ""
9957
9958 #: rhodecode/templates/codeblocks/diffs.mako:566
9959 #: rhodecode/templates/codeblocks/diffs.mako:584
9960 #, python-format
10049 #, python-format
9961 msgid "Show file at commit: %(commit_id)s"
10050 msgid "Show file at commit: %(commit_id)s"
9962 msgstr ""
10051 msgstr ""
9963
10052
9964 #: rhodecode/templates/codeblocks/diffs.mako:568
10053 #: rhodecode/templates/codeblocks/diffs.mako:598
9965 #: rhodecode/templates/codeblocks/diffs.mako:575
10054 #: rhodecode/templates/codeblocks/diffs.mako:605
9966 msgid "Show file before"
10055 msgid "Show file before"
9967 msgstr ""
10056 msgstr ""
9968
10057
9969 #: rhodecode/templates/codeblocks/diffs.mako:573
10058 #: rhodecode/templates/codeblocks/diffs.mako:603
9970 #: rhodecode/templates/codeblocks/diffs.mako:591
10059 #: rhodecode/templates/codeblocks/diffs.mako:621
9971 #, python-format
10060 #, python-format
9972 msgid "File not present at commit: %(commit_id)s"
10061 msgid "File not present at commit: %(commit_id)s"
9973 msgstr ""
10062 msgstr ""
9974
10063
9975 #: rhodecode/templates/codeblocks/diffs.mako:586
10064 #: rhodecode/templates/codeblocks/diffs.mako:616
9976 #: rhodecode/templates/codeblocks/diffs.mako:593
10065 #: rhodecode/templates/codeblocks/diffs.mako:623
9977 msgid "Show file after"
10066 msgid "Show file after"
9978 msgstr ""
10067 msgstr ""
9979
10068
9980 #: rhodecode/templates/codeblocks/diffs.mako:600
10069 #: rhodecode/templates/codeblocks/diffs.mako:630
9981 msgid "Show comments"
10070 msgid "Show comments"
9982 msgstr ""
10071 msgstr ""
9983
10072
9984 #: rhodecode/templates/codeblocks/diffs.mako:600
10073 #: rhodecode/templates/codeblocks/diffs.mako:630
9985 msgid "Hide comments"
10074 msgid "Hide comments"
9986 msgstr ""
10075 msgstr ""
9987
10076
9988 #: rhodecode/templates/codeblocks/diffs.mako:691
10077 #: rhodecode/templates/codeblocks/diffs.mako:721
9989 #: rhodecode/templates/codeblocks/diffs.mako:734
10078 #: rhodecode/templates/codeblocks/diffs.mako:764
9990 #: rhodecode/templates/codeblocks/diffs.mako:796
10079 #: rhodecode/templates/codeblocks/diffs.mako:826
9991 msgid "comments including outdated: {}. Click here to display them."
10080 msgid "comments including outdated: {}. Click here to display them."
9992 msgstr ""
10081 msgstr ""
9993
10082
9994 #: rhodecode/templates/codeblocks/diffs.mako:693
10083 #: rhodecode/templates/codeblocks/diffs.mako:723
9995 #: rhodecode/templates/codeblocks/diffs.mako:736
10084 #: rhodecode/templates/codeblocks/diffs.mako:766
9996 #: rhodecode/templates/codeblocks/diffs.mako:798
10085 #: rhodecode/templates/codeblocks/diffs.mako:828
9997 msgid "comments: {}. Click to toggle them."
10086 msgid "comments: {}. Click to toggle them."
9998 msgstr ""
10087 msgstr ""
9999
10088
10000 #: rhodecode/templates/codeblocks/diffs.mako:867
10089 #: rhodecode/templates/codeblocks/diffs.mako:897
10001 msgid "Toggle wide diff"
10090 msgid "Toggle wide diff"
10002 msgstr ""
10091 msgstr ""
10003
10092
10004 #: rhodecode/templates/codeblocks/diffs.mako:875
10093 #: rhodecode/templates/codeblocks/diffs.mako:905
10005 msgid "View diff as side by side"
10094 msgid "View diff as side by side"
10006 msgstr ""
10095 msgstr ""
10007
10096
10008 #: rhodecode/templates/codeblocks/diffs.mako:877
10097 #: rhodecode/templates/codeblocks/diffs.mako:907
10009 msgid "Side by Side"
10098 msgid "Side by Side"
10010 msgstr ""
10099 msgstr ""
10011
10100
10012 #: rhodecode/templates/codeblocks/diffs.mako:882
10101 #: rhodecode/templates/codeblocks/diffs.mako:912
10013 msgid "View diff as unified"
10102 msgid "View diff as unified"
10014 msgstr ""
10103 msgstr ""
10015
10104
10016 #: rhodecode/templates/codeblocks/diffs.mako:883
10105 #: rhodecode/templates/codeblocks/diffs.mako:913
10017 msgid "Unified"
10106 msgid "Unified"
10018 msgstr ""
10107 msgstr ""
10019
10108
10020 #: rhodecode/templates/codeblocks/diffs.mako:888
10109 #: rhodecode/templates/codeblocks/diffs.mako:918
10021 msgid "Turn off: Show the diff as commit range"
10110 msgid "Turn off: Show the diff as commit range"
10022 msgstr ""
10111 msgstr ""
10023
10112
10024 #: rhodecode/templates/codeblocks/diffs.mako:891
10113 #: rhodecode/templates/codeblocks/diffs.mako:921
10025 #: rhodecode/templates/codeblocks/diffs.mako:898
10114 #: rhodecode/templates/codeblocks/diffs.mako:928
10026 msgid "Range Diff"
10115 msgid "Range Diff"
10027 msgstr ""
10116 msgstr ""
10028
10117
10029 #: rhodecode/templates/codeblocks/diffs.mako:895
10118 #: rhodecode/templates/codeblocks/diffs.mako:925
10030 msgid "Show the diff as commit range"
10119 msgid "Show the diff as commit range"
10031 msgstr ""
10120 msgstr ""
10032
10121
10033 #: rhodecode/templates/codeblocks/diffs.mako:960
10122 #: rhodecode/templates/codeblocks/diffs.mako:990
10034 msgid "Disabled on range diff"
10123 msgid "Disabled on range diff"
10035 msgstr ""
10124 msgstr ""
10036
10125
10037 #: rhodecode/templates/codeblocks/diffs.mako:1267
10126 #: rhodecode/templates/codeblocks/diffs.mako:1297
10038 msgid "..."
10127 msgid "..."
10039 msgstr ""
10128 msgstr ""
10040
10129
@@ -10139,8 +10228,8 b' msgid "Hidden Evolve State"'
10139 msgstr ""
10228 msgstr ""
10140
10229
10141 #: rhodecode/templates/commits/changelog_elements.mako:80
10230 #: rhodecode/templates/commits/changelog_elements.mako:80
10142 #: rhodecode/templates/compare/compare_commits.mako:46
10231 #: rhodecode/templates/compare/compare_commits.mako:47
10143 #: rhodecode/templates/pullrequests/pullrequest_show.mako:595
10232 #: rhodecode/templates/pullrequests/pullrequest_show.mako:435
10144 #: rhodecode/templates/search/search_commit.mako:34
10233 #: rhodecode/templates/search/search_commit.mako:34
10145 msgid "Expand commit message"
10234 msgid "Expand commit message"
10146 msgstr ""
10235 msgstr ""
@@ -10192,11 +10281,11 b' msgid "Compare was calculated based on t'
10192 msgstr ""
10281 msgstr ""
10193
10282
10194 #: rhodecode/templates/compare/compare_commits.mako:15
10283 #: rhodecode/templates/compare/compare_commits.mako:15
10195 #: rhodecode/templates/pullrequests/pullrequest_show.mako:556
10284 #: rhodecode/templates/pullrequests/pullrequest_show.mako:396
10196 msgid "Time"
10285 msgid "Time"
10197 msgstr ""
10286 msgstr ""
10198
10287
10199 #: rhodecode/templates/compare/compare_commits.mako:64
10288 #: rhodecode/templates/compare/compare_commits.mako:65
10200 msgid "No commits in this compare"
10289 msgid "No commits in this compare"
10201 msgstr ""
10290 msgstr ""
10202
10291
@@ -10313,11 +10402,11 b' msgid "personal"'
10313 msgstr ""
10402 msgstr ""
10314
10403
10315 #: rhodecode/templates/data_table/_dt_elements.mako:387
10404 #: rhodecode/templates/data_table/_dt_elements.mako:387
10316 #: rhodecode/templates/pullrequests/pullrequest_show.mako:50
10405 #: rhodecode/templates/pullrequests/pullrequest_show.mako:59
10317 msgid "Pull request !{}"
10406 msgid "Pull request !{}"
10318 msgstr ""
10407 msgstr ""
10319
10408
10320 #: rhodecode/templates/data_table/_dt_elements.mako:395
10409 #: rhodecode/templates/data_table/_dt_elements.mako:396
10321 msgid "Work in progress"
10410 msgid "Work in progress"
10322 msgstr ""
10411 msgstr ""
10323
10412
@@ -10575,7 +10664,7 b' msgid "Pull Request"'
10575 msgstr ""
10664 msgstr ""
10576
10665
10577 #: rhodecode/templates/email_templates/pull_request_comment.mako:67
10666 #: rhodecode/templates/email_templates/pull_request_comment.mako:67
10578 #: rhodecode/templates/email_templates/pull_request_review.mako:41
10667 #: rhodecode/templates/email_templates/pull_request_review.mako:45
10579 #: rhodecode/templates/email_templates/pull_request_update.mako:41
10668 #: rhodecode/templates/email_templates/pull_request_update.mako:41
10580 msgid "Commit flow: {source_ref_type}:{source_ref_name} of {source_repo_url} into {target_ref_type}:{target_ref_name} of {target_repo_url}"
10669 msgid "Commit flow: {source_ref_type}:{source_ref_name} of {source_repo_url} into {target_ref_type}:{target_ref_name} of {target_repo_url}"
10581 msgstr ""
10670 msgstr ""
@@ -10598,8 +10687,8 b' msgstr ""'
10598
10687
10599 #: rhodecode/templates/email_templates/pull_request_comment.mako:134
10688 #: rhodecode/templates/email_templates/pull_request_comment.mako:134
10600 #: rhodecode/templates/email_templates/pull_request_comment.mako:164
10689 #: rhodecode/templates/email_templates/pull_request_comment.mako:164
10601 #: rhodecode/templates/email_templates/pull_request_review.mako:91
10690 #: rhodecode/templates/email_templates/pull_request_review.mako:100
10602 #: rhodecode/templates/email_templates/pull_request_review.mako:108
10691 #: rhodecode/templates/email_templates/pull_request_review.mako:116
10603 #: rhodecode/templates/email_templates/pull_request_update.mako:104
10692 #: rhodecode/templates/email_templates/pull_request_update.mako:104
10604 #: rhodecode/templates/email_templates/pull_request_update.mako:121
10693 #: rhodecode/templates/email_templates/pull_request_update.mako:121
10605 msgid "Pull request"
10694 msgid "Pull request"
@@ -10618,39 +10707,43 b' msgid "Submitted review status"'
10618 msgstr ""
10707 msgstr ""
10619
10708
10620 #: rhodecode/templates/email_templates/pull_request_comment.mako:173
10709 #: rhodecode/templates/email_templates/pull_request_comment.mako:173
10621 #: rhodecode/templates/email_templates/pull_request_review.mako:117
10710 #: rhodecode/templates/email_templates/pull_request_review.mako:125
10622 #: rhodecode/templates/email_templates/pull_request_update.mako:130
10711 #: rhodecode/templates/email_templates/pull_request_update.mako:130
10623 msgid "Commit Flow"
10712 msgid "Commit Flow"
10624 msgstr ""
10713 msgstr ""
10625
10714
10626 #: rhodecode/templates/email_templates/pull_request_comment.mako:175
10715 #: rhodecode/templates/email_templates/pull_request_comment.mako:175
10627 #: rhodecode/templates/email_templates/pull_request_comment.mako:177
10716 #: rhodecode/templates/email_templates/pull_request_comment.mako:177
10628 #: rhodecode/templates/email_templates/pull_request_review.mako:119
10717 #: rhodecode/templates/email_templates/pull_request_review.mako:127
10629 #: rhodecode/templates/email_templates/pull_request_review.mako:121
10718 #: rhodecode/templates/email_templates/pull_request_review.mako:129
10630 #: rhodecode/templates/email_templates/pull_request_update.mako:132
10719 #: rhodecode/templates/email_templates/pull_request_update.mako:132
10631 #: rhodecode/templates/email_templates/pull_request_update.mako:134
10720 #: rhodecode/templates/email_templates/pull_request_update.mako:134
10632 #: rhodecode/templates/pullrequests/pullrequest_show.mako:128
10721 #: rhodecode/templates/pullrequests/pullrequest_show.mako:114
10633 #: rhodecode/templates/pullrequests/pullrequest_show.mako:137
10722 #: rhodecode/templates/pullrequests/pullrequest_show.mako:123
10634 msgid "of"
10723 msgid "of"
10635 msgstr ""
10724 msgstr ""
10636
10725
10637 #: rhodecode/templates/email_templates/pull_request_review.mako:14
10726 #: rhodecode/templates/email_templates/pull_request_review.mako:15
10727 msgid "{user} added you as observer to pull request. !{pr_id}: \"{pr_title}\""
10728 msgstr ""
10729
10730 #: rhodecode/templates/email_templates/pull_request_review.mako:17
10638 msgid "{user} requested a pull request review. !{pr_id}: \"{pr_title}\""
10731 msgid "{user} requested a pull request review. !{pr_id}: \"{pr_title}\""
10639 msgstr ""
10732 msgstr ""
10640
10733
10641 #: rhodecode/templates/email_templates/pull_request_review.mako:39
10734 #: rhodecode/templates/email_templates/pull_request_review.mako:43
10642 #: rhodecode/templates/email_templates/pull_request_update.mako:39
10735 #: rhodecode/templates/email_templates/pull_request_update.mako:39
10643 msgid "Pull Request link"
10736 msgid "Pull Request link"
10644 msgstr ""
10737 msgstr ""
10645
10738
10646 #: rhodecode/templates/email_templates/pull_request_review.mako:85
10739 #: rhodecode/templates/email_templates/pull_request_review.mako:89
10740 msgid "added you as observer to"
10741 msgstr ""
10742
10743 #: rhodecode/templates/email_templates/pull_request_review.mako:95
10647 msgid "requested a"
10744 msgid "requested a"
10648 msgstr ""
10745 msgstr ""
10649
10746
10650 #: rhodecode/templates/email_templates/pull_request_review.mako:87
10651 msgid "pull request review."
10652 msgstr ""
10653
10654 #: rhodecode/templates/email_templates/pull_request_update.mako:14
10747 #: rhodecode/templates/email_templates/pull_request_update.mako:14
10655 msgid "{updating_user} updated pull request. !{pr_id}: \"{pr_title}\""
10748 msgid "{updating_user} updated pull request. !{pr_id}: \"{pr_title}\""
10656 msgstr ""
10749 msgstr ""
@@ -10865,10 +10958,6 b' msgstr ""'
10865 msgid "Raw"
10958 msgid "Raw"
10866 msgstr ""
10959 msgstr ""
10867
10960
10868 #: rhodecode/templates/files/files_source.mako:117
10869 msgid "Copy permalink"
10870 msgstr ""
10871
10872 #: rhodecode/templates/files/files_source.mako:133
10961 #: rhodecode/templates/files/files_source.mako:133
10873 msgid "Binary file ({})"
10962 msgid "Binary file ({})"
10874 msgstr ""
10963 msgstr ""
@@ -10971,64 +11060,59 b' msgid "RSS public journal feed"'
10971 msgstr ""
11060 msgstr ""
10972
11061
10973 #: rhodecode/templates/pullrequests/pullrequest.mako:5
11062 #: rhodecode/templates/pullrequests/pullrequest.mako:5
10974 #: rhodecode/templates/pullrequests/pullrequest.mako:28
10975 msgid "New pull request"
11063 msgid "New pull request"
10976 msgstr ""
11064 msgstr ""
10977
11065
10978 #: rhodecode/templates/pullrequests/pullrequest.mako:60
11066 #: rhodecode/templates/pullrequests/pullrequest.mako:33
10979 #: rhodecode/templates/pullrequests/pullrequest_show.mako:118
11067 #: rhodecode/templates/pullrequests/pullrequest_show.mako:104
10980 msgid "Commit flow"
11068 msgid "Commit flow"
10981 msgstr ""
11069 msgstr ""
10982
11070
10983 #: rhodecode/templates/pullrequests/pullrequest.mako:68
11071 #: rhodecode/templates/pullrequests/pullrequest.mako:41
10984 msgid "Source repository"
11072 msgid "Source repository"
10985 msgstr ""
11073 msgstr ""
10986
11074
10987 #: rhodecode/templates/pullrequests/pullrequest.mako:86
11075 #: rhodecode/templates/pullrequests/pullrequest.mako:69
11076 msgid "Target repository"
11077 msgstr ""
11078
11079 #: rhodecode/templates/pullrequests/pullrequest.mako:76
10988 msgid "Loading refs..."
11080 msgid "Loading refs..."
10989 msgstr ""
11081 msgstr ""
10990
11082
10991 #: rhodecode/templates/pullrequests/pullrequest.mako:97
11083 #: rhodecode/templates/pullrequests/pullrequest.mako:115
10992 msgid "Submit Pull Request"
11084 msgid "Reviewers / Observers"
10993 msgstr ""
11085 msgstr ""
10994
11086
10995 #: rhodecode/templates/pullrequests/pullrequest.mako:111
11087 #: rhodecode/templates/pullrequests/pullrequest.mako:121
10996 msgid "Author of this pull request"
11088 #: rhodecode/templates/pullrequests/pullrequest_show.mako:571
10997 msgstr ""
10998
10999 #: rhodecode/templates/pullrequests/pullrequest.mako:125
11000 #: rhodecode/templates/pullrequests/pullrequest_show.mako:286
11001 msgid "Reviewer rules"
11089 msgid "Reviewer rules"
11002 msgstr ""
11090 msgstr ""
11003
11091
11004 #: rhodecode/templates/pullrequests/pullrequest.mako:135
11092 #: rhodecode/templates/pullrequests/pullrequest.mako:167
11005 #: rhodecode/templates/pullrequests/pullrequest_show.mako:300
11093 #: rhodecode/templates/pullrequests/pullrequest_show.mako:613
11006 msgid "Pull request reviewers"
11007 msgstr ""
11008
11009 #: rhodecode/templates/pullrequests/pullrequest.mako:146
11010 #: rhodecode/templates/pullrequests/pullrequest_show.mako:344
11011 msgid "Add reviewer or reviewer group"
11094 msgid "Add reviewer or reviewer group"
11012 msgstr ""
11095 msgstr ""
11013
11096
11014 #: rhodecode/templates/pullrequests/pullrequest.mako:317
11097 #: rhodecode/templates/pullrequests/pullrequest.mako:191
11098 #: rhodecode/templates/pullrequests/pullrequest_show.mako:666
11099 msgid "Add observer or observer group"
11100 msgstr ""
11101
11102 #: rhodecode/templates/pullrequests/pullrequest.mako:216
11103 msgid "Submit Pull Request"
11104 msgstr ""
11105
11106 #: rhodecode/templates/pullrequests/pullrequest.mako:392
11015 msgid "Show detailed compare."
11107 msgid "Show detailed compare."
11016 msgstr ""
11108 msgstr ""
11017
11109
11018 #: rhodecode/templates/pullrequests/pullrequest.mako:324
11110 #: rhodecode/templates/pullrequests/pullrequest.mako:498
11019 msgid "There are no commits to merge."
11111 #: rhodecode/templates/pullrequests/pullrequest.mako:526
11020 msgstr ""
11021
11022 #: rhodecode/templates/pullrequests/pullrequest.mako:418
11023 #: rhodecode/templates/pullrequests/pullrequest.mako:444
11024 msgid "Select commit reference"
11112 msgid "Select commit reference"
11025 msgstr ""
11113 msgstr ""
11026
11114
11027 #: rhodecode/templates/pullrequests/pullrequest.mako:434
11115 #: rhodecode/templates/pullrequests/pullrequest.mako:594
11028 msgid "Target repository"
11029 msgstr ""
11030
11031 #: rhodecode/templates/pullrequests/pullrequest.mako:513
11032 msgid "Please select source and target"
11116 msgid "Please select source and target"
11033 msgstr ""
11117 msgstr ""
11034
11118
@@ -11063,212 +11147,230 b' msgstr ""'
11063 msgid "Login to Merge this Pull Request"
11147 msgid "Login to Merge this Pull Request"
11064 msgstr ""
11148 msgstr ""
11065
11149
11066 #: rhodecode/templates/pullrequests/pullrequest_show.mako:6
11150 #: rhodecode/templates/pullrequests/pullrequest_show.mako:8
11067 msgid "{} Pull Request !{}"
11151 msgid "{} Pull Request !{}"
11068 msgstr ""
11152 msgstr ""
11069
11153
11070 #: rhodecode/templates/pullrequests/pullrequest_show.mako:52
11154 #: rhodecode/templates/pullrequests/pullrequest_show.mako:61
11071 msgid "Last updated on"
11155 msgid "Last updated on"
11072 msgstr ""
11156 msgstr ""
11073
11157
11074 #: rhodecode/templates/pullrequests/pullrequest_show.mako:53
11075 msgid "by"
11076 msgstr ""
11077
11078 #: rhodecode/templates/pullrequests/pullrequest_show.mako:62
11158 #: rhodecode/templates/pullrequests/pullrequest_show.mako:62
11079 msgid "Update title & description"
11159 msgid "by"
11080 msgstr ""
11081
11082 #: rhodecode/templates/pullrequests/pullrequest_show.mako:68
11083 #: rhodecode/templates/pullrequests/pullrequest_show.mako:71
11084 msgid "Delete pull request"
11085 msgstr ""
11160 msgstr ""
11086
11161
11087 #: rhodecode/templates/pullrequests/pullrequest_show.mako:71
11162 #: rhodecode/templates/pullrequests/pullrequest_show.mako:71
11163 msgid "Update title & description"
11164 msgstr ""
11165
11166 #: rhodecode/templates/pullrequests/pullrequest_show.mako:77
11167 #: rhodecode/templates/pullrequests/pullrequest_show.mako:80
11168 msgid "Delete pull request"
11169 msgstr ""
11170
11171 #: rhodecode/templates/pullrequests/pullrequest_show.mako:80
11088 msgid "Not allowed to delete this pull request"
11172 msgid "Not allowed to delete this pull request"
11089 msgstr ""
11173 msgstr ""
11090
11174
11091 #: rhodecode/templates/pullrequests/pullrequest_show.mako:81
11175 #: rhodecode/templates/pullrequests/pullrequest_show.mako:90
11092 msgid "Rendered using {} renderer"
11176 msgid "Rendered using {} renderer"
11093 msgstr ""
11177 msgstr ""
11094
11178
11095 #: rhodecode/templates/pullrequests/pullrequest_show.mako:95
11179 #: rhodecode/templates/pullrequests/pullrequest_show.mako:137
11096 msgid "Review status"
11097 msgstr ""
11098
11099 #: rhodecode/templates/pullrequests/pullrequest_show.mako:151
11100 msgid "Common ancestor"
11180 msgid "Common ancestor"
11101 msgstr ""
11181 msgstr ""
11102
11182
11103 #: rhodecode/templates/pullrequests/pullrequest_show.mako:155
11183 #: rhodecode/templates/pullrequests/pullrequest_show.mako:141
11104 msgid "not available"
11184 msgid "not available"
11105 msgstr ""
11185 msgstr ""
11106
11186
11187 #: rhodecode/templates/pullrequests/pullrequest_show.mako:153
11188 msgid "Pull changes from source"
11189 msgstr ""
11190
11191 #: rhodecode/templates/pullrequests/pullrequest_show.mako:154
11192 msgid "Copy the pull url"
11193 msgstr ""
11194
11195 #: rhodecode/templates/pullrequests/pullrequest_show.mako:166
11196 msgid "Clone repository in its merged state using shadow repository"
11197 msgstr ""
11198
11199 #: rhodecode/templates/pullrequests/pullrequest_show.mako:166
11200 msgid "Clone from shadow repository"
11201 msgstr ""
11202
11107 #: rhodecode/templates/pullrequests/pullrequest_show.mako:167
11203 #: rhodecode/templates/pullrequests/pullrequest_show.mako:167
11108 msgid "Pull changes from source"
11109 msgstr ""
11110
11111 #: rhodecode/templates/pullrequests/pullrequest_show.mako:168
11112 msgid "Copy the pull url"
11113 msgstr ""
11114
11115 #: rhodecode/templates/pullrequests/pullrequest_show.mako:180
11116 msgid "Clone repository in its merged state using shadow repository"
11117 msgstr ""
11118
11119 #: rhodecode/templates/pullrequests/pullrequest_show.mako:180
11120 msgid "Clone from shadow repository"
11121 msgstr ""
11122
11123 #: rhodecode/templates/pullrequests/pullrequest_show.mako:181
11124 #: rhodecode/templates/summary/components.mako:78
11204 #: rhodecode/templates/summary/components.mako:78
11125 msgid "Copy the clone url"
11205 msgid "Copy the clone url"
11126 msgstr ""
11206 msgstr ""
11127
11207
11128 #: rhodecode/templates/pullrequests/pullrequest_show.mako:185
11208 #: rhodecode/templates/pullrequests/pullrequest_show.mako:171
11129 msgid "Shadow repository data not available"
11209 msgid "Shadow repository data not available"
11130 msgstr ""
11210 msgstr ""
11131
11211
11132 #: rhodecode/templates/pullrequests/pullrequest_show.mako:201
11212 #: rhodecode/templates/pullrequests/pullrequest_show.mako:187
11133 msgid "Versions"
11213 msgid "Versions"
11134 msgstr ""
11214 msgstr ""
11135
11215
11136 #: rhodecode/templates/pullrequests/pullrequest_show.mako:213
11216 #: rhodecode/templates/pullrequests/pullrequest_show.mako:199
11137 #: rhodecode/templates/pullrequests/pullrequest_show.mako:215
11217 #: rhodecode/templates/pullrequests/pullrequest_show.mako:201
11138 msgid "show versions"
11218 msgid "show versions"
11139 msgstr ""
11219 msgstr ""
11140
11220
11141 #: rhodecode/templates/pullrequests/pullrequest_show.mako:214
11221 #: rhodecode/templates/pullrequests/pullrequest_show.mako:200
11142 msgid "hide versions"
11222 msgid "hide versions"
11143 msgstr ""
11223 msgstr ""
11144
11224
11145 #: rhodecode/templates/pullrequests/pullrequest_show.mako:239
11225 #: rhodecode/templates/pullrequests/pullrequest_show.mako:225
11146 msgid "Your review status at this version"
11226 msgid "Your review status at this version"
11147 msgstr ""
11227 msgstr ""
11148
11228
11149 #: rhodecode/templates/pullrequests/pullrequest_show.mako:244
11229 #: rhodecode/templates/pullrequests/pullrequest_show.mako:230
11150 msgid "Comments from pull request version v{0}"
11230 msgid "Comments from pull request version v{0}"
11151 msgstr ""
11231 msgstr ""
11152
11232
11153 #: rhodecode/templates/pullrequests/pullrequest_show.mako:262
11233 #: rhodecode/templates/pullrequests/pullrequest_show.mako:248
11154 #: rhodecode/templates/pullrequests/pullrequest_show.mako:266
11234 #: rhodecode/templates/pullrequests/pullrequest_show.mako:252
11155 msgid "select versions to show changes"
11235 msgid "select versions to show changes"
11156 msgstr ""
11236 msgstr ""
11157
11237
11158 #: rhodecode/templates/pullrequests/pullrequest_show.mako:263
11238 #: rhodecode/templates/pullrequests/pullrequest_show.mako:249
11159 msgid "show changes between versions"
11239 msgid "show changes between versions"
11160 msgstr ""
11240 msgstr ""
11161
11241
11162 #: rhodecode/templates/pullrequests/pullrequest_show.mako:264
11242 #: rhodecode/templates/pullrequests/pullrequest_show.mako:250
11163 msgid "show pull request for this version"
11243 msgid "show pull request for this version"
11164 msgstr ""
11244 msgstr ""
11165
11245
11166 #: rhodecode/templates/pullrequests/pullrequest_show.mako:273
11246 #: rhodecode/templates/pullrequests/pullrequest_show.mako:259
11167 msgid "Pull request versions not available"
11247 msgid "Pull request versions not available"
11168 msgstr ""
11248 msgstr ""
11169
11249
11170 #: rhodecode/templates/pullrequests/pullrequest_show.mako:349
11250 #: rhodecode/templates/pullrequests/pullrequest_show.mako:279
11171 msgid "Save Changes"
11172 msgstr ""
11173
11174 #: rhodecode/templates/pullrequests/pullrequest_show.mako:386
11175 msgid "unresolved TODOs unavailable in this view"
11176 msgstr ""
11177
11178 #: rhodecode/templates/pullrequests/pullrequest_show.mako:422
11179 msgid "No unresolved TODOs"
11180 msgstr ""
11181
11182 #: rhodecode/templates/pullrequests/pullrequest_show.mako:440
11183 msgid "Cannot show diff when pull request state is changing. Current progress state"
11251 msgid "Cannot show diff when pull request state is changing. Current progress state"
11184 msgstr ""
11252 msgstr ""
11185
11253
11186 #: rhodecode/templates/pullrequests/pullrequest_show.mako:458
11254 #: rhodecode/templates/pullrequests/pullrequest_show.mako:297
11187 msgid "Missing requirements:"
11255 msgid "Missing requirements:"
11188 msgstr ""
11256 msgstr ""
11189
11257
11190 #: rhodecode/templates/pullrequests/pullrequest_show.mako:459
11258 #: rhodecode/templates/pullrequests/pullrequest_show.mako:298
11191 msgid "These commits cannot be displayed, because this repository uses the Mercurial largefiles extension, which was not enabled."
11259 msgid "These commits cannot be displayed, because this repository uses the Mercurial largefiles extension, which was not enabled."
11192 msgstr ""
11260 msgstr ""
11193
11261
11194 #: rhodecode/templates/pullrequests/pullrequest_show.mako:467
11262 #: rhodecode/templates/pullrequests/pullrequest_show.mako:306
11195 msgid "Missing commits"
11263 msgid "Missing commits"
11196 msgstr ""
11264 msgstr ""
11197
11265
11198 #: rhodecode/templates/pullrequests/pullrequest_show.mako:468
11266 #: rhodecode/templates/pullrequests/pullrequest_show.mako:307
11199 msgid "This pull request cannot be displayed, because one or more commits no longer exist in the source repository."
11267 msgid "This pull request cannot be displayed, because one or more commits no longer exist in the source repository."
11200 msgstr ""
11268 msgstr ""
11201
11269
11202 #: rhodecode/templates/pullrequests/pullrequest_show.mako:469
11270 #: rhodecode/templates/pullrequests/pullrequest_show.mako:308
11203 msgid "Please update this pull request, push the commits back into the source repository, or consider closing this pull request."
11271 msgid "Please update this pull request, push the commits back into the source repository, or consider closing this pull request."
11204 msgstr ""
11272 msgstr ""
11205
11273
11206 #: rhodecode/templates/pullrequests/pullrequest_show.mako:470
11274 #: rhodecode/templates/pullrequests/pullrequest_show.mako:309
11207 msgid "Consider doing a `force update commits` in case you think this is an error."
11275 msgid "Consider doing a `force update commits` in case you think this is an error."
11208 msgstr ""
11276 msgstr ""
11209
11277
11210 #: rhodecode/templates/pullrequests/pullrequest_show.mako:478
11278 #: rhodecode/templates/pullrequests/pullrequest_show.mako:317
11211 msgid "There are new changes for `{}:{}` in source repository, please consider updating this pull request."
11279 msgid "There are new changes for `{}:{}` in source repository, please consider updating this pull request."
11212 msgstr ""
11280 msgstr ""
11213
11281
11214 #: rhodecode/templates/pullrequests/pullrequest_show.mako:489
11282 #: rhodecode/templates/pullrequests/pullrequest_show.mako:328
11215 #, python-format
11283 msgid "Showing changes at v{}, commenting is disabled."
11216 msgid "Showing changes at v%d, commenting is disabled."
11284 msgstr ""
11285
11286 #: rhodecode/templates/pullrequests/pullrequest_show.mako:351
11287 #: rhodecode/templates/pullrequests/pullrequest_show.mako:373
11288 msgid "Update commits"
11289 msgstr ""
11290
11291 #: rhodecode/templates/pullrequests/pullrequest_show.mako:354
11292 msgid "more update options"
11293 msgstr ""
11294
11295 #: rhodecode/templates/pullrequests/pullrequest_show.mako:362
11296 msgid "Force update commits"
11297 msgstr ""
11298
11299 #: rhodecode/templates/pullrequests/pullrequest_show.mako:365
11300 msgid "Update commits and force refresh this pull request."
11301 msgstr ""
11302
11303 #: rhodecode/templates/pullrequests/pullrequest_show.mako:373
11304 msgid "Update is disabled for current view"
11305 msgstr ""
11306
11307 #: rhodecode/templates/pullrequests/pullrequest_show.mako:385
11308 msgid "Commits and changes between v{ver_from} and {ver_to} of this pull request, commenting is disabled"
11309 msgstr ""
11310
11311 #: rhodecode/templates/pullrequests/pullrequest_show.mako:389
11312 msgid "commits added: {}, removed: {}"
11313 msgstr ""
11314
11315 #: rhodecode/templates/pullrequests/pullrequest_show.mako:407
11316 msgid "Commit added in displayed changes"
11317 msgstr ""
11318
11319 #: rhodecode/templates/pullrequests/pullrequest_show.mako:409
11320 msgid "Commit removed in displayed changes"
11217 msgstr ""
11321 msgstr ""
11218
11322
11219 #: rhodecode/templates/pullrequests/pullrequest_show.mako:512
11323 #: rhodecode/templates/pullrequests/pullrequest_show.mako:512
11220 #: rhodecode/templates/pullrequests/pullrequest_show.mako:534
11324 msgid "there is {num} general comment from older versions"
11221 msgid "Update commits"
11325 msgstr ""
11326
11327 #: rhodecode/templates/pullrequests/pullrequest_show.mako:513
11328 msgid "show it"
11222 msgstr ""
11329 msgstr ""
11223
11330
11224 #: rhodecode/templates/pullrequests/pullrequest_show.mako:515
11331 #: rhodecode/templates/pullrequests/pullrequest_show.mako:515
11225 msgid "more update options"
11226 msgstr ""
11227
11228 #: rhodecode/templates/pullrequests/pullrequest_show.mako:523
11229 msgid "Force update commits"
11230 msgstr ""
11231
11232 #: rhodecode/templates/pullrequests/pullrequest_show.mako:526
11233 msgid "Update commits and force refresh this pull request."
11234 msgstr ""
11235
11236 #: rhodecode/templates/pullrequests/pullrequest_show.mako:534
11237 msgid "Update is disabled for current view"
11238 msgstr ""
11239
11240 #: rhodecode/templates/pullrequests/pullrequest_show.mako:545
11241 msgid "Commits and changes between v{ver_from} and {ver_to} of this pull request, commenting is disabled"
11242 msgstr ""
11243
11244 #: rhodecode/templates/pullrequests/pullrequest_show.mako:549
11245 msgid "commits added: {}, removed: {}"
11246 msgstr ""
11247
11248 #: rhodecode/templates/pullrequests/pullrequest_show.mako:567
11249 msgid "Commit added in displayed changes"
11250 msgstr ""
11251
11252 #: rhodecode/templates/pullrequests/pullrequest_show.mako:569
11253 msgid "Commit removed in displayed changes"
11254 msgstr ""
11255
11256 #: rhodecode/templates/pullrequests/pullrequest_show.mako:678
11257 msgid "there is {num} general comment from older versions"
11258 msgstr ""
11259
11260 #: rhodecode/templates/pullrequests/pullrequest_show.mako:679
11261 msgid "show it"
11262 msgstr ""
11263
11264 #: rhodecode/templates/pullrequests/pullrequest_show.mako:681
11265 msgid "there are {num} general comments from older versions"
11332 msgid "there are {num} general comments from older versions"
11266 msgstr ""
11333 msgstr ""
11267
11334
11268 #: rhodecode/templates/pullrequests/pullrequest_show.mako:682
11335 #: rhodecode/templates/pullrequests/pullrequest_show.mako:516
11269 msgid "show them"
11336 msgid "show them"
11270 msgstr ""
11337 msgstr ""
11271
11338
11339 #: rhodecode/templates/pullrequests/pullrequest_show.mako:591
11340 msgid "Show rules"
11341 msgstr ""
11342
11343 #: rhodecode/templates/pullrequests/pullrequest_show.mako:618
11344 #: rhodecode/templates/pullrequests/pullrequest_show.mako:671
11345 msgid "Save Changes"
11346 msgstr ""
11347
11348 #: rhodecode/templates/pullrequests/pullrequest_show.mako:642
11349 msgid "Observers"
11350 msgstr ""
11351
11352 #: rhodecode/templates/pullrequests/pullrequest_show.mako:708
11353 msgid "TODOs unavailable when browsing versions"
11354 msgstr ""
11355
11356 #: rhodecode/templates/pullrequests/pullrequest_show.mako:780
11357 #: rhodecode/templates/pullrequests/pullrequest_show.mako:788
11358 msgid "Referenced Tickets"
11359 msgstr ""
11360
11361 #: rhodecode/templates/pullrequests/pullrequest_show.mako:794
11362 msgid "In pull request description"
11363 msgstr ""
11364
11365 #: rhodecode/templates/pullrequests/pullrequest_show.mako:808
11366 #: rhodecode/templates/pullrequests/pullrequest_show.mako:827
11367 msgid "No Ticket data found."
11368 msgstr ""
11369
11370 #: rhodecode/templates/pullrequests/pullrequest_show.mako:813
11371 msgid "In commit messages"
11372 msgstr ""
11373
11272 #: rhodecode/templates/pullrequests/pullrequests.mako:4
11374 #: rhodecode/templates/pullrequests/pullrequests.mako:4
11273 msgid "{} Pull Requests"
11375 msgid "{} Pull Requests"
11274 msgstr ""
11376 msgstr ""
@@ -11461,10 +11563,6 b' msgstr ""'
11461 msgid "Compare Selected Tags"
11563 msgid "Compare Selected Tags"
11462 msgstr ""
11564 msgstr ""
11463
11565
11464 #: rhodecode/templates/tags/tags.mako:34
11465 msgid "tags"
11466 msgstr ""
11467
11468 #: rhodecode/templates/user_group/profile.mako:6
11566 #: rhodecode/templates/user_group/profile.mako:6
11469 msgid "User Group Profile"
11567 msgid "User Group Profile"
11470 msgstr ""
11568 msgstr ""
@@ -88,6 +88,9 b' ACTIONS_V1 = {'
88 'repo.pull_request.reviewer.add': '',
88 'repo.pull_request.reviewer.add': '',
89 'repo.pull_request.reviewer.delete': '',
89 'repo.pull_request.reviewer.delete': '',
90
90
91 'repo.pull_request.observer.add': '',
92 'repo.pull_request.observer.delete': '',
93
91 'repo.commit.strip': {'commit_id': ''},
94 'repo.commit.strip': {'commit_id': ''},
92 'repo.commit.comment.create': {'data': {}},
95 'repo.commit.comment.create': {'data': {}},
93 'repo.commit.comment.delete': {'data': {}},
96 'repo.commit.comment.delete': {'data': {}},
@@ -293,6 +293,7 b' def attach_context_attributes(context, r'
293 context.rc_config = rc_config
293 context.rc_config = rc_config
294 context.rhodecode_version = rhodecode.__version__
294 context.rhodecode_version = rhodecode.__version__
295 context.rhodecode_edition = config.get('rhodecode.edition')
295 context.rhodecode_edition = config.get('rhodecode.edition')
296 context.rhodecode_edition_id = config.get('rhodecode.edition_id')
296 # unique secret + version does not leak the version but keep consistency
297 # unique secret + version does not leak the version but keep consistency
297 context.rhodecode_version_hash = calculate_version_hash(config)
298 context.rhodecode_version_hash = calculate_version_hash(config)
298
299
@@ -225,14 +225,26 b' def write_history(config, message):'
225
225
226 def get_connection_validators(registry):
226 def get_connection_validators(registry):
227 validators = []
227 validators = []
228 for k, config in registry.rhodecode_plugins.iteritems():
228 for k, config in registry.rhodecode_plugins.items():
229 validator = config.get('channelstream', {}).get('connect_validator')
229 validator = config.get('channelstream', {}).get('connect_validator')
230 if validator:
230 if validator:
231 validators.append(validator)
231 validators.append(validator)
232 return validators
232 return validators
233
233
234
234
235 def get_channelstream_config(registry=None):
236 if not registry:
237 registry = get_current_registry()
238
239 rhodecode_plugins = getattr(registry, 'rhodecode_plugins', {})
240 channelstream_config = rhodecode_plugins.get('channelstream', {})
241 return channelstream_config
242
243
235 def post_message(channel, message, username, registry=None):
244 def post_message(channel, message, username, registry=None):
245 channelstream_config = get_channelstream_config(registry)
246 if not channelstream_config.get('enabled'):
247 return
236
248
237 message_obj = message
249 message_obj = message
238 if isinstance(message, basestring):
250 if isinstance(message, basestring):
@@ -242,26 +254,118 b' def post_message(channel, message, usern'
242 'topic': '/notifications'
254 'topic': '/notifications'
243 }
255 }
244
256
245 if not registry:
257 log.debug('Channelstream: sending notification to channel %s', channel)
246 registry = get_current_registry()
258 payload = {
259 'type': 'message',
260 'timestamp': datetime.datetime.utcnow(),
261 'user': 'system',
262 'exclude_users': [username],
263 'channel': channel,
264 'message': message_obj
265 }
266
267 try:
268 return channelstream_request(
269 channelstream_config, [payload], '/message',
270 raise_exc=False)
271 except ChannelstreamException:
272 log.exception('Failed to send channelstream data')
273 raise
274
275
276 def _reload_link(label):
277 return (
278 '<a onclick="window.location.reload()">'
279 '<strong>{}</strong>'
280 '</a>'.format(label)
281 )
282
283
284 def pr_channel(pull_request):
285 repo_name = pull_request.target_repo.repo_name
286 pull_request_id = pull_request.pull_request_id
287 channel = '/repo${}$/pr/{}'.format(repo_name, pull_request_id)
288 log.debug('Getting pull-request channelstream broadcast channel: %s', channel)
289 return channel
290
291
292 def comment_channel(repo_name, commit_obj=None, pull_request_obj=None):
293 channel = None
294 if commit_obj:
295 channel = u'/repo${}$/commit/{}'.format(
296 repo_name, commit_obj.raw_id
297 )
298 elif pull_request_obj:
299 channel = u'/repo${}$/pr/{}'.format(
300 repo_name, pull_request_obj.pull_request_id
301 )
302 log.debug('Getting comment channelstream broadcast channel: %s', channel)
303
304 return channel
305
306
307 def pr_update_channelstream_push(request, pr_broadcast_channel, user, msg, **kwargs):
308 """
309 Channel push on pull request update
310 """
311 if not pr_broadcast_channel:
312 return
247
313
248 log.debug('Channelstream: sending notification to channel %s', channel)
314 _ = request.translate
249 rhodecode_plugins = getattr(registry, 'rhodecode_plugins', {})
315
250 channelstream_config = rhodecode_plugins.get('channelstream', {})
316 message = '{} {}'.format(
251 if channelstream_config.get('enabled'):
317 msg,
252 payload = {
318 _reload_link(_(' Reload page to load changes')))
253 'type': 'message',
319
254 'timestamp': datetime.datetime.utcnow(),
320 message_obj = {
255 'user': 'system',
321 'message': message,
256 'exclude_users': [username],
322 'level': 'success',
257 'channel': channel,
323 'topic': '/notifications'
258 'message': message_obj
324 }
259 }
325
326 post_message(
327 pr_broadcast_channel, message_obj, user.username,
328 registry=request.registry)
329
330
331 def comment_channelstream_push(request, comment_broadcast_channel, user, msg, **kwargs):
332 """
333 Channelstream push on comment action, on commit, or pull-request
334 """
335 if not comment_broadcast_channel:
336 return
337
338 _ = request.translate
260
339
261 try:
340 comment_data = kwargs.pop('comment_data', {})
262 return channelstream_request(
341 user_data = kwargs.pop('user_data', {})
263 channelstream_config, [payload], '/message',
342 comment_id = comment_data.get('comment_id')
264 raise_exc=False)
343
265 except ChannelstreamException:
344 message = '<strong>{}</strong> {} #{}, {}'.format(
266 log.exception('Failed to send channelstream data')
345 user.username,
267 raise
346 msg,
347 comment_id,
348 _reload_link(_('Reload page to see new comments')),
349 )
350
351 message_obj = {
352 'message': message,
353 'level': 'success',
354 'topic': '/notifications'
355 }
356
357 post_message(
358 comment_broadcast_channel, message_obj, user.username,
359 registry=request.registry)
360
361 message_obj = {
362 'message': None,
363 'user': user.username,
364 'comment_id': comment_id,
365 'comment_data': comment_data,
366 'user_data': user_data,
367 'topic': '/comment'
368 }
369 post_message(
370 comment_broadcast_channel, message_obj, user.username,
371 registry=request.registry)
@@ -131,7 +131,7 b' def send_exc_email(request, exc_id, exc_'
131
131
132 # NOTE(marcink): needed for email template rendering
132 # NOTE(marcink): needed for email template rendering
133 user_id = None
133 user_id = None
134 if request:
134 if hasattr(request, 'user'):
135 user_id = request.user.user_id
135 user_id = request.user.user_id
136 attach_context_attributes(TemplateArgs(), request, user_id=user_id, is_api=True)
136 attach_context_attributes(TemplateArgs(), request, user_id=user_id, is_api=True)
137
137
@@ -38,6 +38,7 b' import re'
38 import time
38 import time
39 import string
39 import string
40 import hashlib
40 import hashlib
41 import regex
41 from collections import OrderedDict
42 from collections import OrderedDict
42
43
43 import pygments
44 import pygments
@@ -1103,6 +1104,10 b' def bool2icon(value, show_at_false=True)'
1103 return HTML.tag('i', class_="icon-false", title='False')
1104 return HTML.tag('i', class_="icon-false", title='False')
1104 return HTML.tag('i')
1105 return HTML.tag('i')
1105
1106
1107
1108 def b64(inp):
1109 return base64.b64encode(inp)
1110
1106 #==============================================================================
1111 #==============================================================================
1107 # PERMS
1112 # PERMS
1108 #==============================================================================
1113 #==============================================================================
@@ -1653,7 +1658,7 b' def get_active_pattern_entries(repo_name'
1653 return active_entries
1658 return active_entries
1654
1659
1655
1660
1656 pr_pattern_re = re.compile(r'(?:(?:^!)|(?: !))(\d+)')
1661 pr_pattern_re = regex.compile(r'(?:(?:^!)|(?: !))(\d+)')
1657
1662
1658 allowed_link_formats = [
1663 allowed_link_formats = [
1659 'html', 'rst', 'markdown', 'html+hovercard', 'rst+hovercard', 'markdown+hovercard']
1664 'html', 'rst', 'markdown', 'html+hovercard', 'rst+hovercard', 'markdown+hovercard']
@@ -1670,6 +1675,7 b' def process_patterns(text_string, repo_n'
1670 active_entries = get_active_pattern_entries(repo_name)
1675 active_entries = get_active_pattern_entries(repo_name)
1671
1676
1672 issues_data = []
1677 issues_data = []
1678 errors = []
1673 new_text = text_string
1679 new_text = text_string
1674
1680
1675 log.debug('Got %s entries to process', len(active_entries))
1681 log.debug('Got %s entries to process', len(active_entries))
@@ -1687,9 +1693,11 b' def process_patterns(text_string, repo_n'
1687 pattern = entry['pat_compiled']
1693 pattern = entry['pat_compiled']
1688 else:
1694 else:
1689 try:
1695 try:
1690 pattern = re.compile(r'%s' % entry['pat'])
1696 pattern = regex.compile(r'%s' % entry['pat'])
1691 except re.error:
1697 except regex.error as e:
1692 log.exception('issue tracker pattern: `%s` failed to compile', entry['pat'])
1698 regex_err = ValueError('{}:{}'.format(entry['pat'], e))
1699 log.exception('issue tracker pattern: `%s` failed to compile', regex_err)
1700 errors.append(regex_err)
1693 continue
1701 continue
1694
1702
1695 data_func = partial(
1703 data_func = partial(
@@ -1721,11 +1729,11 b' def process_patterns(text_string, repo_n'
1721 new_text = pr_pattern_re.sub(pr_url_func, new_text)
1729 new_text = pr_pattern_re.sub(pr_url_func, new_text)
1722 log.debug('processed !pr pattern')
1730 log.debug('processed !pr pattern')
1723
1731
1724 return new_text, issues_data
1732 return new_text, issues_data, errors
1725
1733
1726
1734
1727 def urlify_commit_message(commit_text, repository=None, active_pattern_entries=None,
1735 def urlify_commit_message(commit_text, repository=None, active_pattern_entries=None,
1728 issues_container=None):
1736 issues_container=None, error_container=None):
1729 """
1737 """
1730 Parses given text message and makes proper links.
1738 Parses given text message and makes proper links.
1731 issues are linked to given issue-server, and rest is a commit link
1739 issues are linked to given issue-server, and rest is a commit link
@@ -1745,12 +1753,15 b' def urlify_commit_message(commit_text, r'
1745 new_text = urlify_commits(new_text, repository)
1753 new_text = urlify_commits(new_text, repository)
1746
1754
1747 # process issue tracker patterns
1755 # process issue tracker patterns
1748 new_text, issues = process_patterns(new_text, repository or '',
1756 new_text, issues, errors = process_patterns(
1749 active_entries=active_pattern_entries)
1757 new_text, repository or '', active_entries=active_pattern_entries)
1750
1758
1751 if issues_container is not None:
1759 if issues_container is not None:
1752 issues_container.extend(issues)
1760 issues_container.extend(issues)
1753
1761
1762 if error_container is not None:
1763 error_container.extend(errors)
1764
1754 return literal(new_text)
1765 return literal(new_text)
1755
1766
1756
1767
@@ -1805,7 +1816,7 b" def render(source, renderer='rst', menti"
1805 elif renderer == 'rst':
1816 elif renderer == 'rst':
1806 if repo_name:
1817 if repo_name:
1807 # process patterns on comments if we pass in repo name
1818 # process patterns on comments if we pass in repo name
1808 source, issues = process_patterns(
1819 source, issues, errors = process_patterns(
1809 source, repo_name, link_format='rst',
1820 source, repo_name, link_format='rst',
1810 active_entries=active_pattern_entries)
1821 active_entries=active_pattern_entries)
1811 if issues_container is not None:
1822 if issues_container is not None:
@@ -1819,7 +1830,7 b" def render(source, renderer='rst', menti"
1819 elif renderer == 'markdown':
1830 elif renderer == 'markdown':
1820 if repo_name:
1831 if repo_name:
1821 # process patterns on comments if we pass in repo name
1832 # process patterns on comments if we pass in repo name
1822 source, issues = process_patterns(
1833 source, issues, errors = process_patterns(
1823 source, repo_name, link_format='markdown',
1834 source, repo_name, link_format='markdown',
1824 active_entries=active_pattern_entries)
1835 active_entries=active_pattern_entries)
1825 if issues_container is not None:
1836 if issues_container is not None:
@@ -57,7 +57,43 b' FILEMODE_DEFAULT = 0o100644'
57 FILEMODE_EXECUTABLE = 0o100755
57 FILEMODE_EXECUTABLE = 0o100755
58 EMPTY_COMMIT_ID = '0' * 40
58 EMPTY_COMMIT_ID = '0' * 40
59
59
60 Reference = collections.namedtuple('Reference', ('type', 'name', 'commit_id'))
60 _Reference = collections.namedtuple('Reference', ('type', 'name', 'commit_id'))
61
62
63 class Reference(_Reference):
64
65 @property
66 def branch(self):
67 if self.type == 'branch':
68 return self.name
69
70 @property
71 def bookmark(self):
72 if self.type == 'book':
73 return self.name
74
75
76 def unicode_to_reference(raw):
77 """
78 Convert a unicode (or string) to a reference object.
79 If unicode evaluates to False it returns None.
80 """
81 if raw:
82 refs = raw.split(':')
83 return Reference(*refs)
84 else:
85 return None
86
87
88 def reference_to_unicode(ref):
89 """
90 Convert a reference object to unicode.
91 If reference is None it returns None.
92 """
93 if ref:
94 return u':'.join(ref)
95 else:
96 return None
61
97
62
98
63 class MergeFailureReason(object):
99 class MergeFailureReason(object):
@@ -25,7 +25,7 b' import collections'
25
25
26 from rhodecode.model import BaseModel
26 from rhodecode.model import BaseModel
27 from rhodecode.model.db import (
27 from rhodecode.model.db import (
28 ChangesetStatus, ChangesetComment, PullRequest, Session)
28 ChangesetStatus, ChangesetComment, PullRequest, PullRequestReviewers, Session)
29 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
29 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
30 from rhodecode.lib.markup_renderer import (
30 from rhodecode.lib.markup_renderer import (
31 DEFAULT_COMMENTS_RENDERER, RstTemplateRenderer)
31 DEFAULT_COMMENTS_RENDERER, RstTemplateRenderer)
@@ -383,15 +383,14 b' class ChangesetStatusModel(BaseModel):'
383 pull_request.source_repo,
383 pull_request.source_repo,
384 pull_request=pull_request,
384 pull_request=pull_request,
385 with_revisions=True)
385 with_revisions=True)
386 reviewers = pull_request.get_pull_request_reviewers(
387 role=PullRequestReviewers.ROLE_REVIEWER)
388 return self.aggregate_votes_by_user(_commit_statuses, reviewers)
386
389
387 return self.aggregate_votes_by_user(_commit_statuses, pull_request.reviewers)
390 def calculated_review_status(self, pull_request):
388
389 def calculated_review_status(self, pull_request, reviewers_statuses=None):
390 """
391 """
391 calculate pull request status based on reviewers, it should be a list
392 calculate pull request status based on reviewers, it should be a list
392 of two element lists.
393 of two element lists.
393
394 :param reviewers_statuses:
395 """
394 """
396 reviewers = reviewers_statuses or self.reviewers_statuses(pull_request)
395 reviewers = self.reviewers_statuses(pull_request)
397 return self.calculate_status(reviewers)
396 return self.calculate_status(reviewers)
@@ -399,7 +399,7 b' class CommentsModel(BaseModel):'
399 recipients += [pull_request_obj.author]
399 recipients += [pull_request_obj.author]
400
400
401 # add the reviewers to notification
401 # add the reviewers to notification
402 recipients += [x.user for x in pull_request_obj.reviewers]
402 recipients += [x.user for x in pull_request_obj.get_pull_request_reviewers()]
403
403
404 pr_target_repo = pull_request_obj.target_repo
404 pr_target_repo = pull_request_obj.target_repo
405 pr_source_repo = pull_request_obj.source_repo
405 pr_source_repo = pull_request_obj.source_repo
@@ -436,9 +436,8 b' class CommentsModel(BaseModel):'
436 'thread_ids': [pr_url, pr_comment_url],
436 'thread_ids': [pr_url, pr_comment_url],
437 })
437 })
438
438
439 recipients += [self._get_user(u) for u in (extra_recipients or [])]
440
441 if send_email:
439 if send_email:
440 recipients += [self._get_user(u) for u in (extra_recipients or [])]
442 # pre-generate the subject for notification itself
441 # pre-generate the subject for notification itself
443 (subject, _e, body_plaintext) = EmailNotificationModel().render_email(
442 (subject, _e, body_plaintext) = EmailNotificationModel().render_email(
444 notification_type, **kwargs)
443 notification_type, **kwargs)
@@ -463,55 +462,11 b' class CommentsModel(BaseModel):'
463 else:
462 else:
464 action = 'repo.commit.comment.create'
463 action = 'repo.commit.comment.create'
465
464
466 comment_id = comment.comment_id
467 comment_data = comment.get_api_data()
465 comment_data = comment.get_api_data()
468
466
469 self._log_audit_action(
467 self._log_audit_action(
470 action, {'data': comment_data}, auth_user, comment)
468 action, {'data': comment_data}, auth_user, comment)
471
469
472 channel = None
473 if commit_obj:
474 repo_name = repo.repo_name
475 channel = u'/repo${}$/commit/{}'.format(
476 repo_name,
477 commit_obj.raw_id
478 )
479 elif pull_request_obj:
480 repo_name = pr_target_repo.repo_name
481 channel = u'/repo${}$/pr/{}'.format(
482 repo_name,
483 pull_request_obj.pull_request_id
484 )
485
486 if channel:
487 username = user.username
488 message = '<strong>{}</strong> {} #{}, {}'
489 message = message.format(
490 username,
491 _('posted a new comment'),
492 comment_id,
493 _('Refresh the page to see new comments.'))
494
495 message_obj = {
496 'message': message,
497 'level': 'success',
498 'topic': '/notifications'
499 }
500
501 channelstream.post_message(
502 channel, message_obj, user.username,
503 registry=get_current_registry())
504
505 message_obj = {
506 'message': None,
507 'user': username,
508 'comment_id': comment_id,
509 'topic': '/comment'
510 }
511 channelstream.post_message(
512 channel, message_obj, user.username,
513 registry=get_current_registry())
514
515 return comment
470 return comment
516
471
517 def edit(self, comment_id, text, auth_user, version):
472 def edit(self, comment_id, text, auth_user, version):
@@ -586,17 +541,20 b' class CommentsModel(BaseModel):'
586
541
587 return comment
542 return comment
588
543
589 def get_all_comments(self, repo_id, revision=None, pull_request=None):
544 def get_all_comments(self, repo_id, revision=None, pull_request=None, count_only=False):
590 q = ChangesetComment.query()\
545 q = ChangesetComment.query()\
591 .filter(ChangesetComment.repo_id == repo_id)
546 .filter(ChangesetComment.repo_id == repo_id)
592 if revision:
547 if revision:
593 q = q.filter(ChangesetComment.revision == revision)
548 q = q.filter(ChangesetComment.revision == revision)
594 elif pull_request:
549 elif pull_request:
595 pull_request = self.__get_pull_request(pull_request)
550 pull_request = self.__get_pull_request(pull_request)
596 q = q.filter(ChangesetComment.pull_request == pull_request)
551 q = q.filter(ChangesetComment.pull_request_id == pull_request.pull_request_id)
597 else:
552 else:
598 raise Exception('Please specify commit or pull_request')
553 raise Exception('Please specify commit or pull_request')
599 q = q.order_by(ChangesetComment.created_on)
554 q = q.order_by(ChangesetComment.created_on)
555 if count_only:
556 return q.count()
557
600 return q.all()
558 return q.all()
601
559
602 def get_url(self, comment, request=None, permalink=False, anchor=None):
560 def get_url(self, comment, request=None, permalink=False, anchor=None):
@@ -56,7 +56,8 b' from webhelpers2.text import remove_form'
56
56
57 from rhodecode.translation import _
57 from rhodecode.translation import _
58 from rhodecode.lib.vcs import get_vcs_instance, VCSError
58 from rhodecode.lib.vcs import get_vcs_instance, VCSError
59 from rhodecode.lib.vcs.backends.base import EmptyCommit, Reference
59 from rhodecode.lib.vcs.backends.base import (
60 EmptyCommit, Reference, unicode_to_reference, reference_to_unicode)
60 from rhodecode.lib.utils2 import (
61 from rhodecode.lib.utils2 import (
61 str2bool, safe_str, get_commit_safe, safe_unicode, sha1_safe,
62 str2bool, safe_str, get_commit_safe, safe_unicode, sha1_safe,
62 time_to_datetime, aslist, Optional, safe_int, get_clone_url, AttributeDict,
63 time_to_datetime, aslist, Optional, safe_int, get_clone_url, AttributeDict,
@@ -3773,12 +3774,12 b' class ChangesetComment(Base, BaseModel):'
3773 resolved_comment = relationship('ChangesetComment', remote_side=comment_id, back_populates='resolved_by')
3774 resolved_comment = relationship('ChangesetComment', remote_side=comment_id, back_populates='resolved_by')
3774 resolved_by = relationship('ChangesetComment', back_populates='resolved_comment')
3775 resolved_by = relationship('ChangesetComment', back_populates='resolved_comment')
3775
3776
3776 author = relationship('User', lazy='joined')
3777 author = relationship('User', lazy='select')
3777 repo = relationship('Repository')
3778 repo = relationship('Repository')
3778 status_change = relationship('ChangesetStatus', cascade="all, delete-orphan", lazy='joined')
3779 status_change = relationship('ChangesetStatus', cascade="all, delete-orphan", lazy='select')
3779 pull_request = relationship('PullRequest', lazy='joined')
3780 pull_request = relationship('PullRequest', lazy='select')
3780 pull_request_version = relationship('PullRequestVersion')
3781 pull_request_version = relationship('PullRequestVersion', lazy='select')
3781 history = relationship('ChangesetCommentHistory', cascade='all, delete-orphan', lazy='joined', order_by='ChangesetCommentHistory.version')
3782 history = relationship('ChangesetCommentHistory', cascade='all, delete-orphan', lazy='select', order_by='ChangesetCommentHistory.version')
3782
3783
3783 @classmethod
3784 @classmethod
3784 def get_users(cls, revision=None, pull_request_id=None):
3785 def get_users(cls, revision=None, pull_request_id=None):
@@ -3983,10 +3984,10 b' class ChangesetStatus(Base, BaseModel):'
3983 version = Column('version', Integer(), nullable=False, default=0)
3984 version = Column('version', Integer(), nullable=False, default=0)
3984 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
3985 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
3985
3986
3986 author = relationship('User', lazy='joined')
3987 author = relationship('User', lazy='select')
3987 repo = relationship('Repository')
3988 repo = relationship('Repository', lazy='select')
3988 comment = relationship('ChangesetComment', lazy='joined')
3989 comment = relationship('ChangesetComment', lazy='select')
3989 pull_request = relationship('PullRequest', lazy='joined')
3990 pull_request = relationship('PullRequest', lazy='select')
3990
3991
3991 def __unicode__(self):
3992 def __unicode__(self):
3992 return u"<%s('%s[v%s]:%s')>" % (
3993 return u"<%s('%s[v%s]:%s')>" % (
@@ -4248,26 +4249,11 b' class _PullRequestBase(BaseModel):'
4248
4249
4249 @staticmethod
4250 @staticmethod
4250 def unicode_to_reference(raw):
4251 def unicode_to_reference(raw):
4251 """
4252 return unicode_to_reference(raw)
4252 Convert a unicode (or string) to a reference object.
4253 If unicode evaluates to False it returns None.
4254 """
4255 if raw:
4256 refs = raw.split(':')
4257 return Reference(*refs)
4258 else:
4259 return None
4260
4253
4261 @staticmethod
4254 @staticmethod
4262 def reference_to_unicode(ref):
4255 def reference_to_unicode(ref):
4263 """
4256 return reference_to_unicode(ref)
4264 Convert a reference object to unicode.
4265 If reference is None it returns None.
4266 """
4267 if ref:
4268 return u':'.join(ref)
4269 else:
4270 return None
4271
4257
4272 def get_api_data(self, with_merge_state=True):
4258 def get_api_data(self, with_merge_state=True):
4273 from rhodecode.model.pull_request import PullRequestModel
4259 from rhodecode.model.pull_request import PullRequestModel
@@ -4465,6 +4451,37 b' class PullRequest(Base, _PullRequestBase'
4465 from rhodecode.model.changeset_status import ChangesetStatusModel
4451 from rhodecode.model.changeset_status import ChangesetStatusModel
4466 return ChangesetStatusModel().reviewers_statuses(self)
4452 return ChangesetStatusModel().reviewers_statuses(self)
4467
4453
4454 def get_pull_request_reviewers(self, role=None):
4455 qry = PullRequestReviewers.query()\
4456 .filter(PullRequestReviewers.pull_request_id == self.pull_request_id)
4457 if role:
4458 qry = qry.filter(PullRequestReviewers.role == role)
4459
4460 return qry.all()
4461
4462 @property
4463 def reviewers_count(self):
4464 qry = PullRequestReviewers.query()\
4465 .filter(PullRequestReviewers.pull_request_id == self.pull_request_id)\
4466 .filter(PullRequestReviewers.role == PullRequestReviewers.ROLE_REVIEWER)
4467 return qry.count()
4468
4469 @property
4470 def observers_count(self):
4471 qry = PullRequestReviewers.query()\
4472 .filter(PullRequestReviewers.pull_request_id == self.pull_request_id)\
4473 .filter(PullRequestReviewers.role == PullRequestReviewers.ROLE_OBSERVER)
4474 return qry.count()
4475
4476 def observers(self):
4477 qry = PullRequestReviewers.query()\
4478 .filter(PullRequestReviewers.pull_request_id == self.pull_request_id)\
4479 .filter(PullRequestReviewers.role == PullRequestReviewers.ROLE_OBSERVER)\
4480 .all()
4481
4482 for entry in qry:
4483 yield entry, entry.user
4484
4468 @property
4485 @property
4469 def workspace_id(self):
4486 def workspace_id(self):
4470 from rhodecode.model.pull_request import PullRequestModel
4487 from rhodecode.model.pull_request import PullRequestModel
@@ -4512,6 +4529,9 b' class PullRequestVersion(Base, _PullRequ'
4512 @property
4529 @property
4513 def reviewers(self):
4530 def reviewers(self):
4514 return self.pull_request.reviewers
4531 return self.pull_request.reviewers
4532 @property
4533 def reviewers(self):
4534 return self.pull_request.reviewers
4515
4535
4516 @property
4536 @property
4517 def versions(self):
4537 def versions(self):
@@ -4530,6 +4550,9 b' class PullRequestVersion(Base, _PullRequ'
4530 def reviewers_statuses(self):
4550 def reviewers_statuses(self):
4531 return self.pull_request.reviewers_statuses()
4551 return self.pull_request.reviewers_statuses()
4532
4552
4553 def observers(self):
4554 return self.pull_request.observers()
4555
4533
4556
4534 class PullRequestReviewers(Base, BaseModel):
4557 class PullRequestReviewers(Base, BaseModel):
4535 __tablename__ = 'pull_request_reviewers'
4558 __tablename__ = 'pull_request_reviewers'
@@ -4538,6 +4561,7 b' class PullRequestReviewers(Base, BaseMod'
4538 )
4561 )
4539 ROLE_REVIEWER = u'reviewer'
4562 ROLE_REVIEWER = u'reviewer'
4540 ROLE_OBSERVER = u'observer'
4563 ROLE_OBSERVER = u'observer'
4564 ROLES = [ROLE_REVIEWER, ROLE_OBSERVER]
4541
4565
4542 @hybrid_property
4566 @hybrid_property
4543 def reasons(self):
4567 def reasons(self):
@@ -4589,6 +4613,15 b' class PullRequestReviewers(Base, BaseMod'
4589
4613
4590 return user_group_data
4614 return user_group_data
4591
4615
4616 @classmethod
4617 def get_pull_request_reviewers(cls, pull_request_id, role=None):
4618 qry = PullRequestReviewers.query()\
4619 .filter(PullRequestReviewers.pull_request_id == pull_request_id)
4620 if role:
4621 qry = qry.filter(PullRequestReviewers.role == role)
4622
4623 return qry.all()
4624
4592 def __unicode__(self):
4625 def __unicode__(self):
4593 return u"<%s('id:%s')>" % (self.__class__.__name__,
4626 return u"<%s('id:%s')>" % (self.__class__.__name__,
4594 self.pull_requests_reviewers_id)
4627 self.pull_requests_reviewers_id)
@@ -4954,16 +4987,21 b' class RepoReviewRuleUser(Base, BaseModel'
4954 __table_args__ = (
4987 __table_args__ = (
4955 base_table_args
4988 base_table_args
4956 )
4989 )
4990 ROLE_REVIEWER = u'reviewer'
4991 ROLE_OBSERVER = u'observer'
4992 ROLES = [ROLE_REVIEWER, ROLE_OBSERVER]
4957
4993
4958 repo_review_rule_user_id = Column('repo_review_rule_user_id', Integer(), primary_key=True)
4994 repo_review_rule_user_id = Column('repo_review_rule_user_id', Integer(), primary_key=True)
4959 repo_review_rule_id = Column("repo_review_rule_id", Integer(), ForeignKey('repo_review_rules.repo_review_rule_id'))
4995 repo_review_rule_id = Column("repo_review_rule_id", Integer(), ForeignKey('repo_review_rules.repo_review_rule_id'))
4960 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False)
4996 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False)
4961 mandatory = Column("mandatory", Boolean(), nullable=False, default=False)
4997 mandatory = Column("mandatory", Boolean(), nullable=False, default=False)
4998 role = Column('role', Unicode(255), nullable=True, default=ROLE_REVIEWER)
4962 user = relationship('User')
4999 user = relationship('User')
4963
5000
4964 def rule_data(self):
5001 def rule_data(self):
4965 return {
5002 return {
4966 'mandatory': self.mandatory
5003 'mandatory': self.mandatory,
5004 'role': self.role,
4967 }
5005 }
4968
5006
4969
5007
@@ -4974,17 +5012,22 b' class RepoReviewRuleUserGroup(Base, Base'
4974 )
5012 )
4975
5013
4976 VOTE_RULE_ALL = -1
5014 VOTE_RULE_ALL = -1
5015 ROLE_REVIEWER = u'reviewer'
5016 ROLE_OBSERVER = u'observer'
5017 ROLES = [ROLE_REVIEWER, ROLE_OBSERVER]
4977
5018
4978 repo_review_rule_users_group_id = Column('repo_review_rule_users_group_id', Integer(), primary_key=True)
5019 repo_review_rule_users_group_id = Column('repo_review_rule_users_group_id', Integer(), primary_key=True)
4979 repo_review_rule_id = Column("repo_review_rule_id", Integer(), ForeignKey('repo_review_rules.repo_review_rule_id'))
5020 repo_review_rule_id = Column("repo_review_rule_id", Integer(), ForeignKey('repo_review_rules.repo_review_rule_id'))
4980 users_group_id = Column("users_group_id", Integer(),ForeignKey('users_groups.users_group_id'), nullable=False)
5021 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False)
4981 mandatory = Column("mandatory", Boolean(), nullable=False, default=False)
5022 mandatory = Column("mandatory", Boolean(), nullable=False, default=False)
5023 role = Column('role', Unicode(255), nullable=True, default=ROLE_REVIEWER)
4982 vote_rule = Column("vote_rule", Integer(), nullable=True, default=VOTE_RULE_ALL)
5024 vote_rule = Column("vote_rule", Integer(), nullable=True, default=VOTE_RULE_ALL)
4983 users_group = relationship('UserGroup')
5025 users_group = relationship('UserGroup')
4984
5026
4985 def rule_data(self):
5027 def rule_data(self):
4986 return {
5028 return {
4987 'mandatory': self.mandatory,
5029 'mandatory': self.mandatory,
5030 'role': self.role,
4988 'vote_rule': self.vote_rule
5031 'vote_rule': self.vote_rule
4989 }
5032 }
4990
5033
@@ -601,6 +601,14 b' def PullRequestForm(localizer, repo_id):'
601 reasons = All()
601 reasons = All()
602 rules = All(v.UniqueList(localizer, convert=int)())
602 rules = All(v.UniqueList(localizer, convert=int)())
603 mandatory = v.StringBoolean()
603 mandatory = v.StringBoolean()
604 role = v.String(if_missing='reviewer')
605
606 class ObserverForm(formencode.Schema):
607 user_id = v.Int(not_empty=True)
608 reasons = All()
609 rules = All(v.UniqueList(localizer, convert=int)())
610 mandatory = v.StringBoolean()
611 role = v.String(if_missing='observer')
604
612
605 class _PullRequestForm(formencode.Schema):
613 class _PullRequestForm(formencode.Schema):
606 allow_extra_fields = True
614 allow_extra_fields = True
@@ -614,6 +622,7 b' def PullRequestForm(localizer, repo_id):'
614 revisions = All(#v.NotReviewedRevisions(localizer, repo_id)(),
622 revisions = All(#v.NotReviewedRevisions(localizer, repo_id)(),
615 v.UniqueList(localizer)(not_empty=True))
623 v.UniqueList(localizer)(not_empty=True))
616 review_members = formencode.ForEach(ReviewerForm())
624 review_members = formencode.ForEach(ReviewerForm())
625 observer_members = formencode.ForEach(ObserverForm())
617 pullrequest_title = v.UnicodeString(strip=True, required=True, min=1, max=255)
626 pullrequest_title = v.UnicodeString(strip=True, required=True, min=1, max=255)
618 pullrequest_desc = v.UnicodeString(strip=True, required=False)
627 pullrequest_desc = v.UnicodeString(strip=True, required=False)
619 description_renderer = v.UnicodeString(strip=True, required=False)
628 description_renderer = v.UnicodeString(strip=True, required=False)
@@ -154,28 +154,56 b' def get_diff_info('
154
154
155 commits = []
155 commits = []
156 if get_commit_authors:
156 if get_commit_authors:
157 commits = target_scm.compare(
157 log.debug('Obtaining commit authors from set of commits')
158 _compare_data = target_scm.compare(
158 target_ref, source_ref, source_scm, merge=True,
159 target_ref, source_ref, source_scm, merge=True,
159 pre_load=["author"])
160 pre_load=["author", "date", "message"]
161 )
160
162
161 for commit in commits:
163 for commit in _compare_data:
162 user = User.get_from_cs_author(commit.author)
164 # NOTE(marcink): we serialize here, so we don't produce more vcsserver calls on data returned
165 # at this function which is later called via JSON serialization
166 serialized_commit = dict(
167 author=commit.author,
168 date=commit.date,
169 message=commit.message,
170 commit_id=commit.raw_id,
171 raw_id=commit.raw_id
172 )
173 commits.append(serialized_commit)
174 user = User.get_from_cs_author(serialized_commit['author'])
163 if user and user not in commit_authors:
175 if user and user not in commit_authors:
164 commit_authors.append(user)
176 commit_authors.append(user)
165
177
166 # lines
178 # lines
167 if get_authors:
179 if get_authors:
180 log.debug('Calculating authors of changed files')
168 target_commit = source_repo.get_commit(ancestor_id)
181 target_commit = source_repo.get_commit(ancestor_id)
169
182
170 for fname, lines in changed_lines.items():
183 for fname, lines in changed_lines.items():
184
171 try:
185 try:
172 node = target_commit.get_node(fname)
186 node = target_commit.get_node(fname, pre_load=["is_binary"])
173 except Exception:
187 except Exception:
188 log.exception("Failed to load node with path %s", fname)
174 continue
189 continue
175
190
176 if not isinstance(node, FileNode):
191 if not isinstance(node, FileNode):
177 continue
192 continue
178
193
194 # NOTE(marcink): for binary node we don't do annotation, just use last author
195 if node.is_binary:
196 author = node.last_commit.author
197 email = node.last_commit.author_email
198
199 user = User.get_from_cs_author(author)
200 if user:
201 user_counts[user.user_id] = user_counts.get(user.user_id, 0) + 1
202 author_counts[author] = author_counts.get(author, 0) + 1
203 email_counts[email] = email_counts.get(email, 0) + 1
204
205 continue
206
179 for annotation in node.annotate:
207 for annotation in node.annotate:
180 line_no, commit_id, get_commit_func, line_text = annotation
208 line_no, commit_id, get_commit_func, line_text = annotation
181 if line_no in lines:
209 if line_no in lines:
@@ -190,6 +218,8 b' def get_diff_info('
190 author_counts[author] = author_counts.get(author, 0) + 1
218 author_counts[author] = author_counts.get(author, 0) + 1
191 email_counts[email] = email_counts.get(email, 0) + 1
219 email_counts[email] = email_counts.get(email, 0) + 1
192
220
221 log.debug('Default reviewers processing finished')
222
193 return {
223 return {
194 'commits': commits,
224 'commits': commits,
195 'files': all_files_changes,
225 'files': all_files_changes,
@@ -260,10 +290,16 b' class PullRequestModel(BaseModel):'
260 _perms = ('repository.admin',)
290 _perms = ('repository.admin',)
261 return self._check_perms(_perms, pull_request, user) or owner
291 return self._check_perms(_perms, pull_request, user) or owner
262
292
293 def is_user_reviewer(self, pull_request, user):
294 return user.user_id in [
295 x.user_id for x in
296 pull_request.get_pull_request_reviewers(PullRequestReviewers.ROLE_REVIEWER)
297 if x.user
298 ]
299
263 def check_user_change_status(self, pull_request, user, api=False):
300 def check_user_change_status(self, pull_request, user, api=False):
264 reviewer = user.user_id in [x.user_id for x in
301 return self.check_user_update(pull_request, user, api) \
265 pull_request.reviewers]
302 or self.is_user_reviewer(pull_request, user)
266 return self.check_user_update(pull_request, user, api) or reviewer
267
303
268 def check_user_comment(self, pull_request, user):
304 def check_user_comment(self, pull_request, user):
269 owner = user.user_id == pull_request.user_id
305 owner = user.user_id == pull_request.user_id
@@ -575,7 +611,7 b' class PullRequestModel(BaseModel):'
575 pull_request_display_obj, at_version
611 pull_request_display_obj, at_version
576
612
577 def create(self, created_by, source_repo, source_ref, target_repo,
613 def create(self, created_by, source_repo, source_ref, target_repo,
578 target_ref, revisions, reviewers, title, description=None,
614 target_ref, revisions, reviewers, observers, title, description=None,
579 common_ancestor_id=None,
615 common_ancestor_id=None,
580 description_renderer=None,
616 description_renderer=None,
581 reviewer_data=None, translator=None, auth_user=None):
617 reviewer_data=None, translator=None, auth_user=None):
@@ -606,7 +642,7 b' class PullRequestModel(BaseModel):'
606 reviewer_ids = set()
642 reviewer_ids = set()
607 # members / reviewers
643 # members / reviewers
608 for reviewer_object in reviewers:
644 for reviewer_object in reviewers:
609 user_id, reasons, mandatory, rules = reviewer_object
645 user_id, reasons, mandatory, role, rules = reviewer_object
610 user = self._get_user(user_id)
646 user = self._get_user(user_id)
611
647
612 # skip duplicates
648 # skip duplicates
@@ -620,6 +656,7 b' class PullRequestModel(BaseModel):'
620 reviewer.pull_request = pull_request
656 reviewer.pull_request = pull_request
621 reviewer.reasons = reasons
657 reviewer.reasons = reasons
622 reviewer.mandatory = mandatory
658 reviewer.mandatory = mandatory
659 reviewer.role = role
623
660
624 # NOTE(marcink): pick only first rule for now
661 # NOTE(marcink): pick only first rule for now
625 rule_id = list(rules)[0] if rules else None
662 rule_id = list(rules)[0] if rules else None
@@ -653,6 +690,33 b' class PullRequestModel(BaseModel):'
653 Session().add(reviewer)
690 Session().add(reviewer)
654 Session().flush()
691 Session().flush()
655
692
693 for observer_object in observers:
694 user_id, reasons, mandatory, role, rules = observer_object
695 user = self._get_user(user_id)
696
697 # skip duplicates from reviewers
698 if user.user_id in reviewer_ids:
699 continue
700
701 #reviewer_ids.add(user.user_id)
702
703 observer = PullRequestReviewers()
704 observer.user = user
705 observer.pull_request = pull_request
706 observer.reasons = reasons
707 observer.mandatory = mandatory
708 observer.role = role
709
710 # NOTE(marcink): pick only first rule for now
711 rule_id = list(rules)[0] if rules else None
712 rule = RepoReviewRule.get(rule_id) if rule_id else None
713 if rule:
714 # TODO(marcink): do we need this for observers ??
715 pass
716
717 Session().add(observer)
718 Session().flush()
719
656 # Set approval status to "Under Review" for all commits which are
720 # Set approval status to "Under Review" for all commits which are
657 # part of this pull request.
721 # part of this pull request.
658 ChangesetStatusModel().set_status(
722 ChangesetStatusModel().set_status(
@@ -678,7 +742,7 b' class PullRequestModel(BaseModel):'
678 MergeCheck.validate(
742 MergeCheck.validate(
679 pull_request, auth_user=auth_user, translator=translator)
743 pull_request, auth_user=auth_user, translator=translator)
680
744
681 self.notify_reviewers(pull_request, reviewer_ids)
745 self.notify_reviewers(pull_request, reviewer_ids, created_by_user)
682 self.trigger_pull_request_hook(pull_request, created_by_user, 'create')
746 self.trigger_pull_request_hook(pull_request, created_by_user, 'create')
683
747
684 creation_data = pull_request.get_api_data(with_merge_state=False)
748 creation_data = pull_request.get_api_data(with_merge_state=False)
@@ -1204,23 +1268,25 b' class PullRequestModel(BaseModel):'
1204
1268
1205 :param pull_request: the pr to update
1269 :param pull_request: the pr to update
1206 :param reviewer_data: list of tuples
1270 :param reviewer_data: list of tuples
1207 [(user, ['reason1', 'reason2'], mandatory_flag, [rules])]
1271 [(user, ['reason1', 'reason2'], mandatory_flag, role, [rules])]
1272 :param user: current use who triggers this action
1208 """
1273 """
1274
1209 pull_request = self.__get_pull_request(pull_request)
1275 pull_request = self.__get_pull_request(pull_request)
1210 if pull_request.is_closed():
1276 if pull_request.is_closed():
1211 raise ValueError('This pull request is closed')
1277 raise ValueError('This pull request is closed')
1212
1278
1213 reviewers = {}
1279 reviewers = {}
1214 for user_id, reasons, mandatory, rules in reviewer_data:
1280 for user_id, reasons, mandatory, role, rules in reviewer_data:
1215 if isinstance(user_id, (int, compat.string_types)):
1281 if isinstance(user_id, (int, compat.string_types)):
1216 user_id = self._get_user(user_id).user_id
1282 user_id = self._get_user(user_id).user_id
1217 reviewers[user_id] = {
1283 reviewers[user_id] = {
1218 'reasons': reasons, 'mandatory': mandatory}
1284 'reasons': reasons, 'mandatory': mandatory, 'role': role}
1219
1285
1220 reviewers_ids = set(reviewers.keys())
1286 reviewers_ids = set(reviewers.keys())
1221 current_reviewers = PullRequestReviewers.query()\
1287 current_reviewers = PullRequestReviewers.get_pull_request_reviewers(
1222 .filter(PullRequestReviewers.pull_request ==
1288 pull_request.pull_request_id, role=PullRequestReviewers.ROLE_REVIEWER)
1223 pull_request).all()
1289
1224 current_reviewers_ids = set([x.user.user_id for x in current_reviewers])
1290 current_reviewers_ids = set([x.user.user_id for x in current_reviewers])
1225
1291
1226 ids_to_add = reviewers_ids.difference(current_reviewers_ids)
1292 ids_to_add = reviewers_ids.difference(current_reviewers_ids)
@@ -1241,16 +1307,19 b' class PullRequestModel(BaseModel):'
1241 reviewer.reasons = reviewers[uid]['reasons']
1307 reviewer.reasons = reviewers[uid]['reasons']
1242 # NOTE(marcink): mandatory shouldn't be changed now
1308 # NOTE(marcink): mandatory shouldn't be changed now
1243 # reviewer.mandatory = reviewers[uid]['reasons']
1309 # reviewer.mandatory = reviewers[uid]['reasons']
1310 # NOTE(marcink): role should be hardcoded, so we won't edit it.
1311 reviewer.role = PullRequestReviewers.ROLE_REVIEWER
1244 Session().add(reviewer)
1312 Session().add(reviewer)
1245 added_audit_reviewers.append(reviewer.get_dict())
1313 added_audit_reviewers.append(reviewer.get_dict())
1246
1314
1247 for uid in ids_to_remove:
1315 for uid in ids_to_remove:
1248 changed = True
1316 changed = True
1249 # NOTE(marcink): we fetch "ALL" reviewers using .all(). This is an edge case
1317 # NOTE(marcink): we fetch "ALL" reviewers objects using .all().
1250 # that prevents and fixes cases that we added the same reviewer twice.
1318 # This is an edge case that handles previous state of having the same reviewer twice.
1251 # this CAN happen due to the lack of DB checks
1319 # this CAN happen due to the lack of DB checks
1252 reviewers = PullRequestReviewers.query()\
1320 reviewers = PullRequestReviewers.query()\
1253 .filter(PullRequestReviewers.user_id == uid,
1321 .filter(PullRequestReviewers.user_id == uid,
1322 PullRequestReviewers.role == PullRequestReviewers.ROLE_REVIEWER,
1254 PullRequestReviewers.pull_request == pull_request)\
1323 PullRequestReviewers.pull_request == pull_request)\
1255 .all()
1324 .all()
1256
1325
@@ -1273,7 +1342,90 b' class PullRequestModel(BaseModel):'
1273 'repo.pull_request.reviewer.delete', {'old_data': user_data},
1342 'repo.pull_request.reviewer.delete', {'old_data': user_data},
1274 user, pull_request)
1343 user, pull_request)
1275
1344
1276 self.notify_reviewers(pull_request, ids_to_add)
1345 self.notify_reviewers(pull_request, ids_to_add, user)
1346 return ids_to_add, ids_to_remove
1347
1348 def update_observers(self, pull_request, observer_data, user):
1349 """
1350 Update the observers in the pull request
1351
1352 :param pull_request: the pr to update
1353 :param observer_data: list of tuples
1354 [(user, ['reason1', 'reason2'], mandatory_flag, role, [rules])]
1355 :param user: current use who triggers this action
1356 """
1357 pull_request = self.__get_pull_request(pull_request)
1358 if pull_request.is_closed():
1359 raise ValueError('This pull request is closed')
1360
1361 observers = {}
1362 for user_id, reasons, mandatory, role, rules in observer_data:
1363 if isinstance(user_id, (int, compat.string_types)):
1364 user_id = self._get_user(user_id).user_id
1365 observers[user_id] = {
1366 'reasons': reasons, 'observers': mandatory, 'role': role}
1367
1368 observers_ids = set(observers.keys())
1369 current_observers = PullRequestReviewers.get_pull_request_reviewers(
1370 pull_request.pull_request_id, role=PullRequestReviewers.ROLE_OBSERVER)
1371
1372 current_observers_ids = set([x.user.user_id for x in current_observers])
1373
1374 ids_to_add = observers_ids.difference(current_observers_ids)
1375 ids_to_remove = current_observers_ids.difference(observers_ids)
1376
1377 log.debug("Adding %s observer", ids_to_add)
1378 log.debug("Removing %s observer", ids_to_remove)
1379 changed = False
1380 added_audit_observers = []
1381 removed_audit_observers = []
1382
1383 for uid in ids_to_add:
1384 changed = True
1385 _usr = self._get_user(uid)
1386 observer = PullRequestReviewers()
1387 observer.user = _usr
1388 observer.pull_request = pull_request
1389 observer.reasons = observers[uid]['reasons']
1390 # NOTE(marcink): mandatory shouldn't be changed now
1391 # observer.mandatory = observer[uid]['reasons']
1392
1393 # NOTE(marcink): role should be hardcoded, so we won't edit it.
1394 observer.role = PullRequestReviewers.ROLE_OBSERVER
1395 Session().add(observer)
1396 added_audit_observers.append(observer.get_dict())
1397
1398 for uid in ids_to_remove:
1399 changed = True
1400 # NOTE(marcink): we fetch "ALL" reviewers objects using .all().
1401 # This is an edge case that handles previous state of having the same reviewer twice.
1402 # this CAN happen due to the lack of DB checks
1403 observers = PullRequestReviewers.query()\
1404 .filter(PullRequestReviewers.user_id == uid,
1405 PullRequestReviewers.role == PullRequestReviewers.ROLE_OBSERVER,
1406 PullRequestReviewers.pull_request == pull_request)\
1407 .all()
1408
1409 for obj in observers:
1410 added_audit_observers.append(obj.get_dict())
1411 Session().delete(obj)
1412
1413 if changed:
1414 Session().expire_all()
1415 pull_request.updated_on = datetime.datetime.now()
1416 Session().add(pull_request)
1417
1418 # finally store audit logs
1419 for user_data in added_audit_observers:
1420 self._log_audit_action(
1421 'repo.pull_request.observer.add', {'data': user_data},
1422 user, pull_request)
1423 for user_data in removed_audit_observers:
1424 self._log_audit_action(
1425 'repo.pull_request.observer.delete', {'old_data': user_data},
1426 user, pull_request)
1427
1428 self.notify_observers(pull_request, ids_to_add, user)
1277 return ids_to_add, ids_to_remove
1429 return ids_to_add, ids_to_remove
1278
1430
1279 def get_url(self, pull_request, request=None, permalink=False):
1431 def get_url(self, pull_request, request=None, permalink=False):
@@ -1301,16 +1453,16 b' class PullRequestModel(BaseModel):'
1301 pr_url = urllib.unquote(self.get_url(pull_request, request=request))
1453 pr_url = urllib.unquote(self.get_url(pull_request, request=request))
1302 return safe_unicode('{pr_url}/repository'.format(pr_url=pr_url))
1454 return safe_unicode('{pr_url}/repository'.format(pr_url=pr_url))
1303
1455
1304 def notify_reviewers(self, pull_request, reviewers_ids):
1456 def _notify_reviewers(self, pull_request, user_ids, role, user):
1305 # notification to reviewers
1457 # notification to reviewers/observers
1306 if not reviewers_ids:
1458 if not user_ids:
1307 return
1459 return
1308
1460
1309 log.debug('Notify following reviewers about pull-request %s', reviewers_ids)
1461 log.debug('Notify following %s users about pull-request %s', role, user_ids)
1310
1462
1311 pull_request_obj = pull_request
1463 pull_request_obj = pull_request
1312 # get the current participants of this pull request
1464 # get the current participants of this pull request
1313 recipients = reviewers_ids
1465 recipients = user_ids
1314 notification_type = EmailNotificationModel.TYPE_PULL_REQUEST
1466 notification_type = EmailNotificationModel.TYPE_PULL_REQUEST
1315
1467
1316 pr_source_repo = pull_request_obj.source_repo
1468 pr_source_repo = pull_request_obj.source_repo
@@ -1332,8 +1484,10 b' class PullRequestModel(BaseModel):'
1332 (x.raw_id, x.message)
1484 (x.raw_id, x.message)
1333 for x in map(pr_source_repo.get_commit, pull_request.revisions)]
1485 for x in map(pr_source_repo.get_commit, pull_request.revisions)]
1334
1486
1487 current_rhodecode_user = user
1335 kwargs = {
1488 kwargs = {
1336 'user': pull_request.author,
1489 'user': current_rhodecode_user,
1490 'pull_request_author': pull_request.author,
1337 'pull_request': pull_request_obj,
1491 'pull_request': pull_request_obj,
1338 'pull_request_commits': pull_request_commits,
1492 'pull_request_commits': pull_request_commits,
1339
1493
@@ -1345,6 +1499,7 b' class PullRequestModel(BaseModel):'
1345
1499
1346 'pull_request_url': pr_url,
1500 'pull_request_url': pr_url,
1347 'thread_ids': [pr_url],
1501 'thread_ids': [pr_url],
1502 'user_role': role
1348 }
1503 }
1349
1504
1350 # pre-generate the subject for notification itself
1505 # pre-generate the subject for notification itself
@@ -1353,7 +1508,7 b' class PullRequestModel(BaseModel):'
1353
1508
1354 # create notification objects, and emails
1509 # create notification objects, and emails
1355 NotificationModel().create(
1510 NotificationModel().create(
1356 created_by=pull_request.author,
1511 created_by=current_rhodecode_user,
1357 notification_subject=subject,
1512 notification_subject=subject,
1358 notification_body=body_plaintext,
1513 notification_body=body_plaintext,
1359 notification_type=notification_type,
1514 notification_type=notification_type,
@@ -1361,11 +1516,19 b' class PullRequestModel(BaseModel):'
1361 email_kwargs=kwargs,
1516 email_kwargs=kwargs,
1362 )
1517 )
1363
1518
1519 def notify_reviewers(self, pull_request, reviewers_ids, user):
1520 return self._notify_reviewers(pull_request, reviewers_ids,
1521 PullRequestReviewers.ROLE_REVIEWER, user)
1522
1523 def notify_observers(self, pull_request, observers_ids, user):
1524 return self._notify_reviewers(pull_request, observers_ids,
1525 PullRequestReviewers.ROLE_OBSERVER, user)
1526
1364 def notify_users(self, pull_request, updating_user, ancestor_commit_id,
1527 def notify_users(self, pull_request, updating_user, ancestor_commit_id,
1365 commit_changes, file_changes):
1528 commit_changes, file_changes):
1366
1529
1367 updating_user_id = updating_user.user_id
1530 updating_user_id = updating_user.user_id
1368 reviewers = set([x.user.user_id for x in pull_request.reviewers])
1531 reviewers = set([x.user.user_id for x in pull_request.get_pull_request_reviewers()])
1369 # NOTE(marcink): send notification to all other users except to
1532 # NOTE(marcink): send notification to all other users except to
1370 # person who updated the PR
1533 # person who updated the PR
1371 recipients = reviewers.difference(set([updating_user_id]))
1534 recipients = reviewers.difference(set([updating_user_id]))
@@ -1874,11 +2037,13 b' class PullRequestModel(BaseModel):'
1874 try:
2037 try:
1875 from rc_reviewers.utils import get_default_reviewers_data
2038 from rc_reviewers.utils import get_default_reviewers_data
1876 from rc_reviewers.utils import validate_default_reviewers
2039 from rc_reviewers.utils import validate_default_reviewers
2040 from rc_reviewers.utils import validate_observers
1877 except ImportError:
2041 except ImportError:
1878 from rhodecode.apps.repository.utils import get_default_reviewers_data
2042 from rhodecode.apps.repository.utils import get_default_reviewers_data
1879 from rhodecode.apps.repository.utils import validate_default_reviewers
2043 from rhodecode.apps.repository.utils import validate_default_reviewers
2044 from rhodecode.apps.repository.utils import validate_observers
1880
2045
1881 return get_default_reviewers_data, validate_default_reviewers
2046 return get_default_reviewers_data, validate_default_reviewers, validate_observers
1882
2047
1883
2048
1884 class MergeCheck(object):
2049 class MergeCheck(object):
@@ -42,7 +42,7 b' from rhodecode.lib.exceptions import ('
42 from rhodecode.lib.caching_query import FromCache
42 from rhodecode.lib.caching_query import FromCache
43 from rhodecode.model import BaseModel
43 from rhodecode.model import BaseModel
44 from rhodecode.model.db import (
44 from rhodecode.model.db import (
45 _hash_key, true, false, or_, joinedload, User, UserToPerm,
45 _hash_key, func, true, false, or_, joinedload, User, UserToPerm,
46 UserEmailMap, UserIpMap, UserLog)
46 UserEmailMap, UserIpMap, UserLog)
47 from rhodecode.model.meta import Session
47 from rhodecode.model.meta import Session
48 from rhodecode.model.auth_token import AuthTokenModel
48 from rhodecode.model.auth_token import AuthTokenModel
@@ -96,7 +96,11 b' class UserModel(BaseModel):'
96 User.username.ilike(ilike_expression)
96 User.username.ilike(ilike_expression)
97 )
97 )
98 )
98 )
99 # sort by len to have top most matches first
100 query = query.order_by(func.length(User.username))\
101 .order_by(User.username)
99 query = query.limit(limit)
102 query = query.limit(limit)
103
100 users = query.all()
104 users = query.all()
101
105
102 _users = [
106 _users = [
@@ -21,12 +21,17 b''
21 import colander
21 import colander
22 from rhodecode.model.validation_schema import validators, preparers, types
22 from rhodecode.model.validation_schema import validators, preparers, types
23
23
24 DEFAULT_ROLE = 'reviewer'
25 VALID_ROLES = ['reviewer', 'observer']
26
24
27
25 class ReviewerSchema(colander.MappingSchema):
28 class ReviewerSchema(colander.MappingSchema):
26 username = colander.SchemaNode(types.StrOrIntType())
29 username = colander.SchemaNode(types.StrOrIntType())
27 reasons = colander.SchemaNode(colander.List(), missing=['no reason specified'])
30 reasons = colander.SchemaNode(colander.List(), missing=['no reason specified'])
28 mandatory = colander.SchemaNode(colander.Boolean(), missing=False)
31 mandatory = colander.SchemaNode(colander.Boolean(), missing=False)
29 rules = colander.SchemaNode(colander.List(), missing=[])
32 rules = colander.SchemaNode(colander.List(), missing=[])
33 role = colander.SchemaNode(colander.String(), missing=DEFAULT_ROLE,
34 validator=colander.OneOf(VALID_ROLES))
30
35
31
36
32 class ReviewerListSchema(colander.SequenceSchema):
37 class ReviewerListSchema(colander.SequenceSchema):
@@ -97,6 +97,7 b''
97 <li>The server is being restarted.</li>
97 <li>The server is being restarted.</li>
98 <li>The server is overloaded.</li>
98 <li>The server is overloaded.</li>
99 <li>The link may be incorrect.</li>
99 <li>The link may be incorrect.</li>
100 <li><a onclick="window.location.reload()">Reload page</a></li>
100 </ul>
101 </ul>
101 </div>
102 </div>
102 <div class="inner-column">
103 <div class="inner-column">
@@ -374,9 +374,6 b' ul.auth_plugins {'
374 background-color: @grey6;
374 background-color: @grey6;
375 }
375 }
376
376
377 .td-status {
378 padding-left: .5em;
379 }
380 .log-container .truncate {
377 .log-container .truncate {
381 height: 2.75em;
378 height: 2.75em;
382 white-space: pre-line;
379 white-space: pre-line;
@@ -384,6 +381,10 b' ul.auth_plugins {'
384 table.rctable .user {
381 table.rctable .user {
385 padding-left: 0;
382 padding-left: 0;
386 }
383 }
384 .td-status {
385 padding: 0 0px 0px 10px;
386 width: 15px;
387 }
387 table.rctable {
388 table.rctable {
388 td.td-description,
389 td.td-description,
389 .rc-user {
390 .rc-user {
@@ -494,7 +495,8 b' ul.auth_plugins {'
494 padding-top: 10px;
495 padding-top: 10px;
495 }
496 }
496
497
497 #add_reviewer_input {
498 #add_reviewer_input,
499 #add_observer_input {
498 padding-top: 10px
500 padding-top: 10px
499 }
501 }
500
502
@@ -1700,8 +1702,33 b' table.group_members {'
1700 }
1702 }
1701
1703
1702 .reviewer_ac .ac-input {
1704 .reviewer_ac .ac-input {
1705 width: 98%;
1706 margin-bottom: 1em;
1707 }
1708
1709 .observer_ac .ac-input {
1710 width: 98%;
1711 margin-bottom: 1em;
1712 }
1713
1714 .rule-table {
1703 width: 100%;
1715 width: 100%;
1704 margin-bottom: 1em;
1716 }
1717
1718 .rule-table td {
1719
1720 }
1721
1722 .rule-table .td-role {
1723 width: 100px
1724 }
1725
1726 .rule-table .td-mandatory {
1727 width: 100px
1728 }
1729
1730 .rule-table .td-group-votes {
1731 width: 150px
1705 }
1732 }
1706
1733
1707 .compare_view_commits tr{
1734 .compare_view_commits tr{
@@ -2635,6 +2662,7 b' h3.files_location{'
2635 li {
2662 li {
2636 list-style-type: none
2663 list-style-type: none
2637 }
2664 }
2665
2638 }
2666 }
2639
2667
2640 .grid-filter-box-icon {
2668 .grid-filter-box-icon {
@@ -477,23 +477,3 b''
477 }
477 }
478
478
479 }
479 }
480
481 .rctable.repo_summary {
482 border: 1px solid #eaeaea;
483 border-radius: 2px;
484 border-collapse: inherit;
485 border-bottom: 0;
486
487 th {
488 background: @grey7;
489 border-bottom: 0;
490 }
491
492 td {
493 border-color: #eaeaea;
494 }
495
496 td.td-status {
497 padding: 0 0 0 10px;
498 }
499 }
@@ -4,6 +4,25 b''
4 // see style guide documentation for guidelines.
4 // see style guide documentation for guidelines.
5
5
6 // TABLES
6 // TABLES
7 table.rctable.table-bordered {
8 border: 1px solid #eaeaea;
9 border-radius: 2px;
10 border-collapse: inherit;
11 border-bottom: 0;
12
13 th {
14 background: @grey7;
15 border-bottom: 0;
16 }
17
18 td {
19 border-color: #eaeaea;
20 }
21
22 td.td-status {
23 padding: 0 0 0 10px;
24 }
25 }
7
26
8 .rctable,
27 .rctable,
9 table.rctable,
28 table.rctable,
@@ -306,12 +325,14 b' table.dataTable {'
306 }
325 }
307 }
326 }
308 }
327 }
328
309 .rctable.audit-log {
329 .rctable.audit-log {
310 td {
330 td {
311 vertical-align: top;
331 vertical-align: top;
312 }
332 }
313 }
333 }
314
334
335
315 // TRUNCATING
336 // TRUNCATING
316 // TODO: lisaq: should this possibly be moved out of tables.less?
337 // TODO: lisaq: should this possibly be moved out of tables.less?
317 // for truncated text
338 // for truncated text
@@ -426,15 +447,6 b' table.keyboard-mappings {'
426 }
447 }
427 }
448 }
428
449
429 // Pull Request List Table
430 #pull_request_list_table.dataTable {
431
432 //TODO: lisa: This needs to be removed once the description is adjusted
433 // for using an expand_commit button (see issue 765)
434 td {
435 vertical-align: middle;
436 }
437 }
438
450
439 // Settings (no border)
451 // Settings (no border)
440 table.rctable.dl-settings {
452 table.rctable.dl-settings {
@@ -484,9 +496,6 b' table.trending_language_tbl {'
484
496
485 // Changesets
497 // Changesets
486 #changesets.rctable {
498 #changesets.rctable {
487 th {
488 padding: 0 1em 0.65em 0;
489 }
490
499
491 // td must be fixed height for graph
500 // td must be fixed height for graph
492 td {
501 td {
@@ -344,6 +344,10 b' mark,'
344 width: 200px;
344 width: 200px;
345 }
345 }
346
346
347 #obj_count {
348 line-height: 34px;
349 }
350
347 }
351 }
348
352
349 #readme .title {
353 #readme .title {
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Add another comment',
13 'Add another comment': 'Add another comment',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Delete',
35 'Delete': 'Delete',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Stop following this repository',
106 'Stop following this repository': 'Stop following this repository',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Submitting...',
108 'Submitting...': 'Submitting...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Add another comment',
13 'Add another comment': 'Add another comment',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Löschen',
35 'Delete': 'Löschen',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Stop following this repository',
106 'Stop following this repository': 'Stop following this repository',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Submitting...',
108 'Submitting...': 'Submitting...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Add another comment',
13 'Add another comment': 'Add another comment',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Delete',
35 'Delete': 'Delete',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Stop following this repository',
106 'Stop following this repository': 'Stop following this repository',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Submitting...',
108 'Submitting...': 'Submitting...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Add another comment',
13 'Add another comment': 'Add another comment',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Delete',
35 'Delete': 'Delete',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Stop following this repository',
106 'Stop following this repository': 'Stop following this repository',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Submitting...',
108 'Submitting...': 'Submitting...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Add another comment',
13 'Add another comment': 'Add another comment',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Supprimer',
35 'Delete': 'Supprimer',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Arrêter de suivre ce dépôt',
106 'Stop following this repository': 'Arrêter de suivre ce dépôt',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Envoi…',
108 'Submitting...': 'Envoi…',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Aggiungi un altro commento',
13 'Add another comment': 'Aggiungi un altro commento',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Elimina',
35 'Delete': 'Elimina',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'Nessun risultato',
70 'No results': 'Nessun risultato',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Smetti di seguire il repository',
106 'Stop following this repository': 'Smetti di seguire il repository',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Inoltro...',
108 'Submitting...': 'Inoltro...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'Al momento non ci sono richieste di PULL che richiedono il tuo intervento',
114 'There are currently no open pull requests requiring your participation.': 'Al momento non ci sono richieste di PULL che richiedono il tuo intervento',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': '別のコメントを追加',
13 'Add another comment': '別のコメントを追加',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': '選択したステータス ({0}) を元にコメントが自動的に設定されます...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': '選択したステータス ({0}) を元にコメントが自動的に設定されます...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': '削除',
35 'Delete': '削除',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'まだリポジトリグループがありません。',
68 'No repository groups available yet.': 'まだリポジトリグループがありません。',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': '結果がありません',
70 'No results': '結果がありません',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'まだタグがありません。',
73 'No tags available yet.': 'まだタグがありません。',
69 'No user groups available yet.': 'まだユーザーグループがありません。',
74 'No user groups available yet.': 'まだユーザーグループがありません。',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'このリポジトリのフォローをやめる',
106 'Stop following this repository': 'このリポジトリのフォローをやめる',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': '送信中...',
108 'Submitting...': '送信中...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -1,5 +1,7 b''
1 // AUTO GENERATED FILE FOR Babel JS-GETTEXT EXTRACTORS, DO NOT CHANGE
1 // AUTO GENERATED FILE FOR Babel JS-GETTEXT EXTRACTORS, DO NOT CHANGE
2 _gettext('(from usergroup {0})');
2 _gettext('(from usergroup {0})');
3 _gettext('<strong>, and {0} file</strong> changed.');
4 _gettext('<strong>, and {0} files</strong> changed.');
3 _gettext('<strong>{0} file</strong> changed, ');
5 _gettext('<strong>{0} file</strong> changed, ');
4 _gettext('<strong>{0} files</strong> changed, ');
6 _gettext('<strong>{0} files</strong> changed, ');
5 _gettext('Add another comment');
7 _gettext('Add another comment');
@@ -21,6 +23,8 b''
21 _gettext('Comment body was not changed.');
23 _gettext('Comment body was not changed.');
22 _gettext('Comment text will be set automatically based on currently selected status ({0}) ...');
24 _gettext('Comment text will be set automatically based on currently selected status ({0}) ...');
23 _gettext('Commit Authors are not allowed to be a reviewer.');
25 _gettext('Commit Authors are not allowed to be a reviewer.');
26 _gettext('Compare summary: <strong>{0} commit</strong>');
27 _gettext('Compare summary: <strong>{0} commits</strong>');
24 _gettext('Context file: ');
28 _gettext('Context file: ');
25 _gettext('Delete');
29 _gettext('Delete');
26 _gettext('Delete this comment?');
30 _gettext('Delete this comment?');
@@ -58,6 +62,7 b''
58 _gettext('No repository groups available yet.');
62 _gettext('No repository groups available yet.');
59 _gettext('No repository groups present.');
63 _gettext('No repository groups present.');
60 _gettext('No results');
64 _gettext('No results');
65 _gettext('No review rules set.');
61 _gettext('No ssh keys available yet.');
66 _gettext('No ssh keys available yet.');
62 _gettext('No tags available yet.');
67 _gettext('No tags available yet.');
63 _gettext('No user groups available yet.');
68 _gettext('No user groups available yet.');
@@ -95,11 +100,13 b''
95 _gettext('Stop following this repository');
100 _gettext('Stop following this repository');
96 _gettext('Stopped watching this repository');
101 _gettext('Stopped watching this repository');
97 _gettext('Submitting...');
102 _gettext('Submitting...');
103 _gettext('Switch target repository with the source.');
98 _gettext('Switch to chat');
104 _gettext('Switch to chat');
99 _gettext('Switch to comment');
105 _gettext('Switch to comment');
100 _gettext('TODO comment');
106 _gettext('TODO comment');
101 _gettext('TODO from comment {0} was fixed.');
107 _gettext('TODO from comment {0} was fixed.');
102 _gettext('There are currently no open pull requests requiring your participation.');
108 _gettext('There are currently no open pull requests requiring your participation.');
109 _gettext('There are no commits to merge.');
103 _gettext('There is a later version of file tree available. Click {0} to create a file at the latest tree.');
110 _gettext('There is a later version of file tree available. Click {0} to create a file at the latest tree.');
104 _gettext('There is an existing path `{0}` at this commit.');
111 _gettext('There is an existing path `{0}` at this commit.');
105 _gettext('This pull requests will consist of <strong>{0} commit</strong>.');
112 _gettext('This pull requests will consist of <strong>{0} commit</strong>.');
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Dodaj kolejny komentarz',
13 'Add another comment': 'Dodaj kolejny komentarz',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Usuń',
35 'Delete': 'Usuń',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Zakończyć obserwację tego repozytorium',
106 'Stop following this repository': 'Zakończyć obserwację tego repozytorium',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Przesyłanie...',
108 'Submitting...': 'Przesyłanie...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Adicionar outro comentário',
13 'Add another comment': 'Adicionar outro comentário',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Excluir',
35 'Delete': 'Excluir',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Parar de seguir este repositório',
106 'Stop following this repository': 'Parar de seguir este repositório',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Enviando...',
108 'Submitting...': 'Enviando...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Добавить другой комментарий',
13 'Add another comment': 'Добавить другой комментарий',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': 'Удалить',
35 'Delete': 'Удалить',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': 'Отменить наблюдение за репозиторием',
106 'Stop following this repository': 'Отменить наблюдение за репозиторием',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': 'Применение...',
108 'Submitting...': 'Применение...',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -6,6 +6,8 b''
6 //JS translations map
6 //JS translations map
7 var _TM = {
7 var _TM = {
8 '(from usergroup {0})': '(from usergroup {0})',
8 '(from usergroup {0})': '(from usergroup {0})',
9 '<strong>, and {0} file</strong> changed.': '<strong>, and {0} file</strong> changed.',
10 '<strong>, and {0} files</strong> changed.': '<strong>, and {0} files</strong> changed.',
9 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
11 '<strong>{0} file</strong> changed, ': '<strong>{0} file</strong> changed, ',
10 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
12 '<strong>{0} files</strong> changed, ': '<strong>{0} files</strong> changed, ',
11 'Add another comment': 'Add another comment',
13 'Add another comment': 'Add another comment',
@@ -27,6 +29,8 b' var _TM = {'
27 'Comment body was not changed.': 'Comment body was not changed.',
29 'Comment body was not changed.': 'Comment body was not changed.',
28 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
30 'Comment text will be set automatically based on currently selected status ({0}) ...': 'Comment text will be set automatically based on currently selected status ({0}) ...',
29 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
31 'Commit Authors are not allowed to be a reviewer.': 'Commit Authors are not allowed to be a reviewer.',
32 'Compare summary: <strong>{0} commit</strong>': 'Compare summary: <strong>{0} commit</strong>',
33 'Compare summary: <strong>{0} commits</strong>': 'Compare summary: <strong>{0} commits</strong>',
30 'Context file: ': 'Context file: ',
34 'Context file: ': 'Context file: ',
31 'Delete': '删除',
35 'Delete': '删除',
32 'Delete this comment?': 'Delete this comment?',
36 'Delete this comment?': 'Delete this comment?',
@@ -64,6 +68,7 b' var _TM = {'
64 'No repository groups available yet.': 'No repository groups available yet.',
68 'No repository groups available yet.': 'No repository groups available yet.',
65 'No repository groups present.': 'No repository groups present.',
69 'No repository groups present.': 'No repository groups present.',
66 'No results': 'No results',
70 'No results': 'No results',
71 'No review rules set.': 'No review rules set.',
67 'No ssh keys available yet.': 'No ssh keys available yet.',
72 'No ssh keys available yet.': 'No ssh keys available yet.',
68 'No tags available yet.': 'No tags available yet.',
73 'No tags available yet.': 'No tags available yet.',
69 'No user groups available yet.': 'No user groups available yet.',
74 'No user groups available yet.': 'No user groups available yet.',
@@ -101,11 +106,13 b' var _TM = {'
101 'Stop following this repository': '停止关注该版本库',
106 'Stop following this repository': '停止关注该版本库',
102 'Stopped watching this repository': 'Stopped watching this repository',
107 'Stopped watching this repository': 'Stopped watching this repository',
103 'Submitting...': '提交中……',
108 'Submitting...': '提交中……',
109 'Switch target repository with the source.': 'Switch target repository with the source.',
104 'Switch to chat': 'Switch to chat',
110 'Switch to chat': 'Switch to chat',
105 'Switch to comment': 'Switch to comment',
111 'Switch to comment': 'Switch to comment',
106 'TODO comment': 'TODO comment',
112 'TODO comment': 'TODO comment',
107 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
113 'TODO from comment {0} was fixed.': 'TODO from comment {0} was fixed.',
108 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
114 'There are currently no open pull requests requiring your participation.': 'There are currently no open pull requests requiring your participation.',
115 'There are no commits to merge.': 'There are no commits to merge.',
109 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
116 'There is a later version of file tree available. Click {0} to create a file at the latest tree.': 'There is a later version of file tree available. Click {0} to create a file at the latest tree.',
110 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
117 'There is an existing path `{0}` at this commit.': 'There is an existing path `{0}` at this commit.',
111 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
118 'This pull requests will consist of <strong>{0} commit</strong>.': 'This pull requests will consist of <strong>{0} commit</strong>.',
@@ -75,8 +75,8 b' var CommitsController = function () {'
75 height: height,
75 height: height,
76 x_step: x_step,
76 x_step: x_step,
77 y_step: 42,
77 y_step: 42,
78 dotRadius: 3.5,
78 dotRadius: 3.8,
79 lineWidth: 2.5
79 lineWidth: 2.8
80 };
80 };
81
81
82 var prevCommitsData = this.$graphCanvas.data('commits') || [];
82 var prevCommitsData = this.$graphCanvas.data('commits') || [];
@@ -98,11 +98,12 b' var CommitsController = function () {'
98
98
99 this.setLabelText(edgeData);
99 this.setLabelText(edgeData);
100
100
101 var padding = 90;
101 // main padding from top, aligns the first dot graph
102 var padding = 100;
102 if (prev_link) {
103 if (prev_link) {
103 padding += 34;
104 padding += 34;
105 }
104
106
105 }
106 $('#graph_nodes').css({'padding-top': padding});
107 $('#graph_nodes').css({'padding-top': padding});
107
108
108 $.each($('.message.truncate'), function(idx, value) {
109 $.each($('.message.truncate'), function(idx, value) {
This diff has been collapsed as it changes many lines, (535 lines changed) Show them Hide them
@@ -94,21 +94,26 b' var getTitleAndDescription = function(so'
94 };
94 };
95
95
96
96
97 ReviewersController = function () {
97 window.ReviewersController = function () {
98 var self = this;
98 var self = this;
99 this.$loadingIndicator = $('.calculate-reviewers');
99 this.$reviewRulesContainer = $('#review_rules');
100 this.$reviewRulesContainer = $('#review_rules');
100 this.$rulesList = this.$reviewRulesContainer.find('.pr-reviewer-rules');
101 this.$rulesList = this.$reviewRulesContainer.find('.pr-reviewer-rules');
101 this.$userRule = $('.pr-user-rule-container');
102 this.$userRule = $('.pr-user-rule-container');
102 this.forbidReviewUsers = undefined;
103 this.$reviewMembers = $('#review_members');
103 this.$reviewMembers = $('#review_members');
104 this.$observerMembers = $('#observer_members');
105
104 this.currentRequest = null;
106 this.currentRequest = null;
105 this.diffData = null;
107 this.diffData = null;
106 this.enabledRules = [];
108 this.enabledRules = [];
109 // sync with db.py entries
110 this.ROLE_REVIEWER = 'reviewer';
111 this.ROLE_OBSERVER = 'observer'
107
112
108 //dummy handler, we might register our own later
113 //dummy handler, we might register our own later
109 this.diffDataHandler = function(data){};
114 this.diffDataHandler = function (data) {};
110
115
111 this.defaultForbidReviewUsers = function () {
116 this.defaultForbidUsers = function () {
112 return [
117 return [
113 {
118 {
114 'username': 'default',
119 'username': 'default',
@@ -117,6 +122,9 b' ReviewersController = function () {'
117 ];
122 ];
118 };
123 };
119
124
125 // init default forbidden users
126 this.forbidUsers = this.defaultForbidUsers();
127
120 this.hideReviewRules = function () {
128 this.hideReviewRules = function () {
121 self.$reviewRulesContainer.hide();
129 self.$reviewRulesContainer.hide();
122 $(self.$userRule.selector).hide();
130 $(self.$userRule.selector).hide();
@@ -133,11 +141,40 b' ReviewersController = function () {'
133 return '<div>- {0}</div>'.format(ruleText)
141 return '<div>- {0}</div>'.format(ruleText)
134 };
142 };
135
143
144 this.increaseCounter = function(role) {
145 if (role === self.ROLE_REVIEWER) {
146 var $elem = $('#reviewers-cnt')
147 var cnt = parseInt($elem.data('count') || 0)
148 cnt +=1
149 $elem.html(cnt);
150 $elem.data('count', cnt);
151 }
152 else if (role === self.ROLE_OBSERVER) {
153 var $elem = $('#observers-cnt');
154 var cnt = parseInt($elem.data('count') || 0)
155 cnt +=1
156 $elem.html(cnt);
157 $elem.data('count', cnt);
158 }
159 }
160
161 this.resetCounter = function () {
162 var $elem = $('#reviewers-cnt');
163
164 $elem.data('count', 0);
165 $elem.html(0);
166
167 var $elem = $('#observers-cnt');
168
169 $elem.data('count', 0);
170 $elem.html(0);
171 }
172
136 this.loadReviewRules = function (data) {
173 this.loadReviewRules = function (data) {
137 self.diffData = data;
174 self.diffData = data;
138
175
139 // reset forbidden Users
176 // reset forbidden Users
140 this.forbidReviewUsers = self.defaultForbidReviewUsers();
177 this.forbidUsers = self.defaultForbidUsers();
141
178
142 // reset state of review rules
179 // reset state of review rules
143 self.$rulesList.html('');
180 self.$rulesList.html('');
@@ -148,7 +185,7 b' ReviewersController = function () {'
148 self.addRule(
185 self.addRule(
149 _gettext('All reviewers must vote.'))
186 _gettext('All reviewers must vote.'))
150 );
187 );
151 return self.forbidReviewUsers
188 return self.forbidUsers
152 }
189 }
153
190
154 if (data.rules.voting !== undefined) {
191 if (data.rules.voting !== undefined) {
@@ -195,7 +232,7 b' ReviewersController = function () {'
195 }
232 }
196
233
197 if (data.rules.forbid_author_to_review) {
234 if (data.rules.forbid_author_to_review) {
198 self.forbidReviewUsers.push(data.rules_data.pr_author);
235 self.forbidUsers.push(data.rules_data.pr_author);
199 self.$rulesList.append(
236 self.$rulesList.append(
200 self.addRule(
237 self.addRule(
201 _gettext('Author is not allowed to be a reviewer.'))
238 _gettext('Author is not allowed to be a reviewer.'))
@@ -206,9 +243,8 b' ReviewersController = function () {'
206
243
207 if (data.rules_data.forbidden_users) {
244 if (data.rules_data.forbidden_users) {
208 $.each(data.rules_data.forbidden_users, function (index, member_data) {
245 $.each(data.rules_data.forbidden_users, function (index, member_data) {
209 self.forbidReviewUsers.push(member_data)
246 self.forbidUsers.push(member_data)
210 });
247 });
211
212 }
248 }
213
249
214 self.$rulesList.append(
250 self.$rulesList.append(
@@ -223,9 +259,31 b' ReviewersController = function () {'
223 _gettext('No review rules set.'))
259 _gettext('No review rules set.'))
224 }
260 }
225
261
226 return self.forbidReviewUsers
262 return self.forbidUsers
227 };
263 };
228
264
265 this.emptyTables = function () {
266 self.emptyReviewersTable();
267 self.emptyObserversTable();
268
269 // Also reset counters.
270 self.resetCounter();
271 }
272
273 this.emptyReviewersTable = function (withText) {
274 self.$reviewMembers.empty();
275 if (withText !== undefined) {
276 self.$reviewMembers.html(withText)
277 }
278 };
279
280 this.emptyObserversTable = function (withText) {
281 self.$observerMembers.empty();
282 if (withText !== undefined) {
283 self.$observerMembers.html(withText)
284 }
285 }
286
229 this.loadDefaultReviewers = function (sourceRepo, sourceRef, targetRepo, targetRef) {
287 this.loadDefaultReviewers = function (sourceRepo, sourceRef, targetRepo, targetRef) {
230
288
231 if (self.currentRequest) {
289 if (self.currentRequest) {
@@ -233,19 +291,21 b' ReviewersController = function () {'
233 self.currentRequest.abort();
291 self.currentRequest.abort();
234 }
292 }
235
293
236 $('.calculate-reviewers').show();
294 self.$loadingIndicator.show();
237 // reset reviewer members
295
238 self.$reviewMembers.empty();
296 // reset reviewer/observe members
297 self.emptyTables();
239
298
240 prButtonLock(true, null, 'reviewers');
299 prButtonLock(true, null, 'reviewers');
241 $('#user').hide(); // hide user autocomplete before load
300 $('#user').hide(); // hide user autocomplete before load
301 $('#observer').hide(); //hide observer autocomplete before load
242
302
243 // lock PR button, so we cannot send PR before it's calculated
303 // lock PR button, so we cannot send PR before it's calculated
244 prButtonLock(true, _gettext('Loading diff ...'), 'compare');
304 prButtonLock(true, _gettext('Loading diff ...'), 'compare');
245
305
246 if (sourceRef.length !== 3 || targetRef.length !== 3) {
306 if (sourceRef.length !== 3 || targetRef.length !== 3) {
247 // don't load defaults in case we're missing some refs...
307 // don't load defaults in case we're missing some refs...
248 $('.calculate-reviewers').hide();
308 self.$loadingIndicator.hide();
249 return
309 return
250 }
310 }
251
311
@@ -253,9 +313,13 b' ReviewersController = function () {'
253 {
313 {
254 'repo_name': templateContext.repo_name,
314 'repo_name': templateContext.repo_name,
255 'source_repo': sourceRepo,
315 'source_repo': sourceRepo,
316 'source_ref_type': sourceRef[0],
317 'source_ref_name': sourceRef[1],
256 'source_ref': sourceRef[2],
318 'source_ref': sourceRef[2],
257 'target_repo': targetRepo,
319 'target_repo': targetRepo,
258 'target_ref': targetRef[2]
320 'target_ref': targetRef[2],
321 'target_ref_type': sourceRef[0],
322 'target_ref_name': sourceRef[1]
259 });
323 });
260
324
261 self.currentRequest = $.ajax({
325 self.currentRequest = $.ajax({
@@ -268,15 +332,23 b' ReviewersController = function () {'
268
332
269 // review rules
333 // review rules
270 self.loadReviewRules(data);
334 self.loadReviewRules(data);
271 self.handleDiffData(data["diff_info"]);
335 var diffHandled = self.handleDiffData(data["diff_info"]);
336 if (diffHandled === false) {
337 return
338 }
272
339
273 for (var i = 0; i < data.reviewers.length; i++) {
340 for (var i = 0; i < data.reviewers.length; i++) {
274 var reviewer = data.reviewers[i];
341 var reviewer = data.reviewers[i];
275 self.addReviewMember(reviewer, reviewer.reasons, reviewer.mandatory);
342 // load reviewer rules from the repo data
343 self.addMember(reviewer, reviewer.reasons, reviewer.mandatory, reviewer.role);
276 }
344 }
277 $('.calculate-reviewers').hide();
345
346
347 self.$loadingIndicator.hide();
278 prButtonLock(false, null, 'reviewers');
348 prButtonLock(false, null, 'reviewers');
279 $('#user').show(); // show user autocomplete after load
349
350 $('#user').show(); // show user autocomplete before load
351 $('#observer').show(); // show observer autocomplete before load
280
352
281 var commitElements = data["diff_info"]['commits'];
353 var commitElements = data["diff_info"]['commits'];
282
354
@@ -292,7 +364,7 b' ReviewersController = function () {'
292
364
293 },
365 },
294 error: function (jqXHR, textStatus, errorThrown) {
366 error: function (jqXHR, textStatus, errorThrown) {
295 var prefix = "Loading diff and reviewers failed\n"
367 var prefix = "Loading diff and reviewers/observers failed\n"
296 var message = formatErrorMessage(jqXHR, textStatus, errorThrown, prefix);
368 var message = formatErrorMessage(jqXHR, textStatus, errorThrown, prefix);
297 ajaxErrorSwal(message);
369 ajaxErrorSwal(message);
298 }
370 }
@@ -301,7 +373,7 b' ReviewersController = function () {'
301 };
373 };
302
374
303 // check those, refactor
375 // check those, refactor
304 this.removeReviewMember = function (reviewer_id, mark_delete) {
376 this.removeMember = function (reviewer_id, mark_delete) {
305 var reviewer = $('#reviewer_{0}'.format(reviewer_id));
377 var reviewer = $('#reviewer_{0}'.format(reviewer_id));
306
378
307 if (typeof (mark_delete) === undefined) {
379 if (typeof (mark_delete) === undefined) {
@@ -312,6 +384,7 b' ReviewersController = function () {'
312 if (reviewer) {
384 if (reviewer) {
313 // now delete the input
385 // now delete the input
314 $('#reviewer_{0} input'.format(reviewer_id)).remove();
386 $('#reviewer_{0} input'.format(reviewer_id)).remove();
387 $('#reviewer_{0}_rules input'.format(reviewer_id)).remove();
315 // mark as to-delete
388 // mark as to-delete
316 var obj = $('#reviewer_{0}_name'.format(reviewer_id));
389 var obj = $('#reviewer_{0}_name'.format(reviewer_id));
317 obj.addClass('to-delete');
390 obj.addClass('to-delete');
@@ -322,27 +395,26 b' ReviewersController = function () {'
322 }
395 }
323 };
396 };
324
397
325 this.reviewMemberEntry = function () {
398 this.addMember = function (reviewer_obj, reasons, mandatory, role) {
326
399
327 };
328
329 this.addReviewMember = function (reviewer_obj, reasons, mandatory) {
330 var id = reviewer_obj.user_id;
400 var id = reviewer_obj.user_id;
331 var username = reviewer_obj.username;
401 var username = reviewer_obj.username;
332
402
333 var reasons = reasons || [];
403 reasons = reasons || [];
334 var mandatory = mandatory || false;
404 mandatory = mandatory || false;
405 role = role || self.ROLE_REVIEWER
335
406
336 // register IDS to check if we don't have this ID already in
407 // register current set IDS to check if we don't have this ID already in
408 // and prevent duplicates
337 var currentIds = [];
409 var currentIds = [];
338
410
339 $.each(self.$reviewMembers.find('.reviewer_entry'), function (index, value) {
411 $.each($('.reviewer_entry'), function (index, value) {
340 currentIds.push($(value).data('reviewerUserId'))
412 currentIds.push($(value).data('reviewerUserId'))
341 })
413 })
342
414
343 var userAllowedReview = function (userId) {
415 var userAllowedReview = function (userId) {
344 var allowed = true;
416 var allowed = true;
345 $.each(self.forbidReviewUsers, function (index, member_data) {
417 $.each(self.forbidUsers, function (index, member_data) {
346 if (parseInt(userId) === member_data['user_id']) {
418 if (parseInt(userId) === member_data['user_id']) {
347 allowed = false;
419 allowed = false;
348 return false // breaks the loop
420 return false // breaks the loop
@@ -352,6 +424,7 b' ReviewersController = function () {'
352 };
424 };
353
425
354 var userAllowed = userAllowedReview(id);
426 var userAllowed = userAllowedReview(id);
427
355 if (!userAllowed) {
428 if (!userAllowed) {
356 alert(_gettext('User `{0}` not allowed to be a reviewer').format(username));
429 alert(_gettext('User `{0}` not allowed to be a reviewer').format(username));
357 } else {
430 } else {
@@ -359,11 +432,13 b' ReviewersController = function () {'
359 var alreadyReviewer = currentIds.indexOf(id) != -1;
432 var alreadyReviewer = currentIds.indexOf(id) != -1;
360
433
361 if (alreadyReviewer) {
434 if (alreadyReviewer) {
362 alert(_gettext('User `{0}` already in reviewers').format(username));
435 alert(_gettext('User `{0}` already in reviewers/observers').format(username));
363 } else {
436 } else {
437
364 var reviewerEntry = renderTemplate('reviewMemberEntry', {
438 var reviewerEntry = renderTemplate('reviewMemberEntry', {
365 'member': reviewer_obj,
439 'member': reviewer_obj,
366 'mandatory': mandatory,
440 'mandatory': mandatory,
441 'role': role,
367 'reasons': reasons,
442 'reasons': reasons,
368 'allowed_to_update': true,
443 'allowed_to_update': true,
369 'review_status': 'not_reviewed',
444 'review_status': 'not_reviewed',
@@ -372,20 +447,36 b' ReviewersController = function () {'
372 'create': true,
447 'create': true,
373 'rule_show': true,
448 'rule_show': true,
374 })
449 })
375 $(self.$reviewMembers.selector).append(reviewerEntry);
450
451 if (role === self.ROLE_REVIEWER) {
452 $(self.$reviewMembers.selector).append(reviewerEntry);
453 self.increaseCounter(self.ROLE_REVIEWER);
454 $('#reviewer-empty-msg').remove()
455 }
456 else if (role === self.ROLE_OBSERVER) {
457 $(self.$observerMembers.selector).append(reviewerEntry);
458 self.increaseCounter(self.ROLE_OBSERVER);
459 $('#observer-empty-msg').remove();
460 }
461
376 tooltipActivate();
462 tooltipActivate();
377 }
463 }
378 }
464 }
379
465
380 };
466 };
381
467
382 this.updateReviewers = function (repo_name, pull_request_id) {
468 this.updateReviewers = function (repo_name, pull_request_id, role) {
383 var postData = $('#reviewers input').serialize();
469 if (role === 'reviewer') {
384 _updatePullRequest(repo_name, pull_request_id, postData);
470 var postData = $('#reviewers input').serialize();
471 _updatePullRequest(repo_name, pull_request_id, postData);
472 } else if (role === 'observer') {
473 var postData = $('#observers input').serialize();
474 _updatePullRequest(repo_name, pull_request_id, postData);
475 }
385 };
476 };
386
477
387 this.handleDiffData = function (data) {
478 this.handleDiffData = function (data) {
388 self.diffDataHandler(data)
479 return self.diffDataHandler(data)
389 }
480 }
390 };
481 };
391
482
@@ -449,35 +540,26 b' var editPullRequest = function(repo_name'
449
540
450
541
451 /**
542 /**
452 * Reviewer autocomplete
543 * autocomplete handler for reviewers/observers
453 */
544 */
454 var ReviewerAutoComplete = function(inputId) {
545 var autoCompleteHandler = function (inputId, controller, role) {
455 $(inputId).autocomplete({
546
456 serviceUrl: pyroutes.url('user_autocomplete_data'),
547 return function (element, data) {
457 minChars:2,
458 maxHeight:400,
459 deferRequestBy: 300, //miliseconds
460 showNoSuggestionNotice: true,
461 tabDisabled: true,
462 autoSelectFirst: true,
463 params: { user_id: templateContext.rhodecode_user.user_id, user_groups:true, user_groups_expand:true, skip_default_user:true },
464 formatResult: autocompleteFormatResult,
465 lookupFilter: autocompleteFilterResult,
466 onSelect: function(element, data) {
467 var mandatory = false;
548 var mandatory = false;
468 var reasons = [_gettext('added manually by "{0}"').format(templateContext.rhodecode_user.username)];
549 var reasons = [_gettext('added manually by "{0}"').format(
550 templateContext.rhodecode_user.username)];
469
551
470 // add whole user groups
552 // add whole user groups
471 if (data.value_type == 'user_group') {
553 if (data.value_type == 'user_group') {
472 reasons.push(_gettext('member of "{0}"').format(data.value_display));
554 reasons.push(_gettext('member of "{0}"').format(data.value_display));
473
555
474 $.each(data.members, function(index, member_data) {
556 $.each(data.members, function (index, member_data) {
475 var reviewer = member_data;
557 var reviewer = member_data;
476 reviewer['user_id'] = member_data['id'];
558 reviewer['user_id'] = member_data['id'];
477 reviewer['gravatar_link'] = member_data['icon_link'];
559 reviewer['gravatar_link'] = member_data['icon_link'];
478 reviewer['user_link'] = member_data['profile_link'];
560 reviewer['user_link'] = member_data['profile_link'];
479 reviewer['rules'] = [];
561 reviewer['rules'] = [];
480 reviewersController.addReviewMember(reviewer, reasons, mandatory);
562 controller.addMember(reviewer, reasons, mandatory, role);
481 })
563 })
482 }
564 }
483 // add single user
565 // add single user
@@ -487,14 +569,71 b' var ReviewerAutoComplete = function(inpu'
487 reviewer['gravatar_link'] = data['icon_link'];
569 reviewer['gravatar_link'] = data['icon_link'];
488 reviewer['user_link'] = data['profile_link'];
570 reviewer['user_link'] = data['profile_link'];
489 reviewer['rules'] = [];
571 reviewer['rules'] = [];
490 reviewersController.addReviewMember(reviewer, reasons, mandatory);
572 controller.addMember(reviewer, reasons, mandatory, role);
491 }
573 }
492
574
493 $(inputId).val('');
575 $(inputId).val('');
494 }
576 }
495 });
577 }
578
579 /**
580 * Reviewer autocomplete
581 */
582 var ReviewerAutoComplete = function (inputId, controller) {
583 var self = this;
584 self.controller = controller;
585 self.inputId = inputId;
586 var handler = autoCompleteHandler(inputId, controller, controller.ROLE_REVIEWER);
587
588 $(inputId).autocomplete({
589 serviceUrl: pyroutes.url('user_autocomplete_data'),
590 minChars: 2,
591 maxHeight: 400,
592 deferRequestBy: 300, //miliseconds
593 showNoSuggestionNotice: true,
594 tabDisabled: true,
595 autoSelectFirst: true,
596 params: {
597 user_id: templateContext.rhodecode_user.user_id,
598 user_groups: true,
599 user_groups_expand: true,
600 skip_default_user: true
601 },
602 formatResult: autocompleteFormatResult,
603 lookupFilter: autocompleteFilterResult,
604 onSelect: handler
605 });
496 };
606 };
497
607
608 /**
609 * Observers autocomplete
610 */
611 var ObserverAutoComplete = function(inputId, controller) {
612 var self = this;
613 self.controller = controller;
614 self.inputId = inputId;
615 var handler = autoCompleteHandler(inputId, controller, controller.ROLE_OBSERVER);
616
617 $(inputId).autocomplete({
618 serviceUrl: pyroutes.url('user_autocomplete_data'),
619 minChars: 2,
620 maxHeight: 400,
621 deferRequestBy: 300, //miliseconds
622 showNoSuggestionNotice: true,
623 tabDisabled: true,
624 autoSelectFirst: true,
625 params: {
626 user_id: templateContext.rhodecode_user.user_id,
627 user_groups: true,
628 user_groups_expand: true,
629 skip_default_user: true
630 },
631 formatResult: autocompleteFormatResult,
632 lookupFilter: autocompleteFilterResult,
633 onSelect: handler
634 });
635 }
636
498
637
499 window.VersionController = function () {
638 window.VersionController = function () {
500 var self = this;
639 var self = this;
@@ -504,7 +643,7 b' window.VersionController = function () {'
504
643
505 this.adjustRadioSelectors = function (curNode) {
644 this.adjustRadioSelectors = function (curNode) {
506 var getVal = function (item) {
645 var getVal = function (item) {
507 if (item == 'latest') {
646 if (item === 'latest') {
508 return Number.MAX_SAFE_INTEGER
647 return Number.MAX_SAFE_INTEGER
509 }
648 }
510 else {
649 else {
@@ -663,6 +802,7 b' window.UpdatePrController = function () '
663 };
802 };
664 };
803 };
665
804
805
666 /**
806 /**
667 * Reviewer display panel
807 * Reviewer display panel
668 */
808 */
@@ -673,6 +813,7 b' window.ReviewersPanel = {'
673 removeButtons: null,
813 removeButtons: null,
674 reviewRules: null,
814 reviewRules: null,
675 setReviewers: null,
815 setReviewers: null,
816 controller: null,
676
817
677 setSelectors: function () {
818 setSelectors: function () {
678 var self = this;
819 var self = this;
@@ -682,17 +823,18 b' window.ReviewersPanel = {'
682 self.removeButtons = $('.reviewer_member_remove,.reviewer_member_mandatory_remove');
823 self.removeButtons = $('.reviewer_member_remove,.reviewer_member_mandatory_remove');
683 },
824 },
684
825
685 init: function (reviewRules, setReviewers) {
826 init: function (controller, reviewRules, setReviewers) {
686 var self = this;
827 var self = this;
687 self.setSelectors();
828 self.setSelectors();
688
829
689 this.reviewRules = reviewRules;
830 self.controller = controller;
690 this.setReviewers = setReviewers;
831 self.reviewRules = reviewRules;
832 self.setReviewers = setReviewers;
691
833
692 this.editButton.on('click', function (e) {
834 self.editButton.on('click', function (e) {
693 self.edit();
835 self.edit();
694 });
836 });
695 this.closeButton.on('click', function (e) {
837 self.closeButton.on('click', function (e) {
696 self.close();
838 self.close();
697 self.renderReviewers();
839 self.renderReviewers();
698 });
840 });
@@ -702,26 +844,134 b' window.ReviewersPanel = {'
702 },
844 },
703
845
704 renderReviewers: function () {
846 renderReviewers: function () {
847 var self = this;
705
848
706 $('#review_members').html('')
849 if (self.setReviewers.reviewers === undefined) {
707 $.each(this.setReviewers.reviewers, function (key, val) {
850 return
851 }
852 if (self.setReviewers.reviewers.length === 0) {
853 self.controller.emptyReviewersTable('<tr id="reviewer-empty-msg"><td colspan="6">No reviewers</td></tr>');
854 return
855 }
856
857 self.controller.emptyReviewersTable();
858
859 $.each(self.setReviewers.reviewers, function (key, val) {
860
708 var member = val;
861 var member = val;
862 if (member.role === self.controller.ROLE_REVIEWER) {
863 var entry = renderTemplate('reviewMemberEntry', {
864 'member': member,
865 'mandatory': member.mandatory,
866 'role': member.role,
867 'reasons': member.reasons,
868 'allowed_to_update': member.allowed_to_update,
869 'review_status': member.review_status,
870 'review_status_label': member.review_status_label,
871 'user_group': member.user_group,
872 'create': false
873 });
874
875 $(self.controller.$reviewMembers.selector).append(entry)
876 }
877 });
878
879 tooltipActivate();
880 },
881
882 edit: function (event) {
883 var self = this;
884 self.editButton.hide();
885 self.closeButton.show();
886 self.addButton.show();
887 $(self.removeButtons.selector).css('visibility', 'visible');
888 // review rules
889 self.controller.loadReviewRules(this.reviewRules);
890 },
891
892 close: function (event) {
893 var self = this;
894 this.editButton.show();
895 this.closeButton.hide();
896 this.addButton.hide();
897 $(this.removeButtons.selector).css('visibility', 'hidden');
898 // hide review rules
899 self.controller.hideReviewRules();
900 }
901 };
709
902
710 var entry = renderTemplate('reviewMemberEntry', {
903 /**
711 'member': member,
904 * Reviewer display panel
712 'mandatory': member.mandatory,
905 */
713 'reasons': member.reasons,
906 window.ObserversPanel = {
714 'allowed_to_update': member.allowed_to_update,
907 editButton: null,
715 'review_status': member.review_status,
908 closeButton: null,
716 'review_status_label': member.review_status_label,
909 addButton: null,
717 'user_group': member.user_group,
910 removeButtons: null,
718 'create': false
911 reviewRules: null,
719 });
912 setReviewers: null,
913 controller: null,
914
915 setSelectors: function () {
916 var self = this;
917 self.editButton = $('#open_edit_observers');
918 self.closeButton =$('#close_edit_observers');
919 self.addButton = $('#add_observer');
920 self.removeButtons = $('.observer_member_remove,.observer_member_mandatory_remove');
921 },
922
923 init: function (controller, reviewRules, setReviewers) {
924 var self = this;
925 self.setSelectors();
926
927 self.controller = controller;
928 self.reviewRules = reviewRules;
929 self.setReviewers = setReviewers;
930
931 self.editButton.on('click', function (e) {
932 self.edit();
933 });
934 self.closeButton.on('click', function (e) {
935 self.close();
936 self.renderObservers();
937 });
720
938
721 $('#review_members').append(entry)
939 self.renderObservers();
940
941 },
942
943 renderObservers: function () {
944 var self = this;
945 if (self.setReviewers.observers === undefined) {
946 return
947 }
948 if (self.setReviewers.observers.length === 0) {
949 self.controller.emptyObserversTable('<tr id="observer-empty-msg"><td colspan="6">No observers</td></tr>');
950 return
951 }
952
953 self.controller.emptyObserversTable();
954
955 $.each(self.setReviewers.observers, function (key, val) {
956 var member = val;
957 if (member.role === self.controller.ROLE_OBSERVER) {
958 var entry = renderTemplate('reviewMemberEntry', {
959 'member': member,
960 'mandatory': member.mandatory,
961 'role': member.role,
962 'reasons': member.reasons,
963 'allowed_to_update': member.allowed_to_update,
964 'review_status': member.review_status,
965 'review_status_label': member.review_status_label,
966 'user_group': member.user_group,
967 'create': false
968 });
969
970 $(self.controller.$observerMembers.selector).append(entry)
971 }
722 });
972 });
973
723 tooltipActivate();
974 tooltipActivate();
724
725 },
975 },
726
976
727 edit: function (event) {
977 edit: function (event) {
@@ -729,8 +979,6 b' window.ReviewersPanel = {'
729 this.closeButton.show();
979 this.closeButton.show();
730 this.addButton.show();
980 this.addButton.show();
731 $(this.removeButtons.selector).css('visibility', 'visible');
981 $(this.removeButtons.selector).css('visibility', 'visible');
732 // review rules
733 reviewersController.loadReviewRules(this.reviewRules);
734 },
982 },
735
983
736 close: function (event) {
984 close: function (event) {
@@ -738,12 +986,56 b' window.ReviewersPanel = {'
738 this.closeButton.hide();
986 this.closeButton.hide();
739 this.addButton.hide();
987 this.addButton.hide();
740 $(this.removeButtons.selector).css('visibility', 'hidden');
988 $(this.removeButtons.selector).css('visibility', 'hidden');
741 // hide review rules
989 }
742 reviewersController.hideReviewRules()
990
991 };
992
993 window.PRDetails = {
994 editButton: null,
995 closeButton: null,
996 deleteButton: null,
997 viewFields: null,
998 editFields: null,
999
1000 setSelectors: function () {
1001 var self = this;
1002 self.editButton = $('#open_edit_pullrequest')
1003 self.closeButton = $('#close_edit_pullrequest')
1004 self.deleteButton = $('#delete_pullrequest')
1005 self.viewFields = $('#pr-desc, #pr-title')
1006 self.editFields = $('#pr-desc-edit, #pr-title-edit, .pr-save')
1007 },
1008
1009 init: function () {
1010 var self = this;
1011 self.setSelectors();
1012 self.editButton.on('click', function (e) {
1013 self.edit();
1014 });
1015 self.closeButton.on('click', function (e) {
1016 self.view();
1017 });
1018 },
1019
1020 edit: function (event) {
1021 var cmInstance = $('#pr-description-input').get(0).MarkupForm.cm;
1022 this.viewFields.hide();
1023 this.editButton.hide();
1024 this.deleteButton.hide();
1025 this.closeButton.show();
1026 this.editFields.show();
1027 cmInstance.refresh();
1028 },
1029
1030 view: function (event) {
1031 this.editButton.show();
1032 this.deleteButton.show();
1033 this.editFields.hide();
1034 this.closeButton.hide();
1035 this.viewFields.show();
743 }
1036 }
744 };
1037 };
745
1038
746
747 /**
1039 /**
748 * OnLine presence using channelstream
1040 * OnLine presence using channelstream
749 */
1041 */
@@ -813,29 +1105,29 b' window.refreshComments = function (versi'
813 $.each($('.comment'), function (idx, element) {
1105 $.each($('.comment'), function (idx, element) {
814 currentIDs.push($(element).data('commentId'));
1106 currentIDs.push($(element).data('commentId'));
815 });
1107 });
816 var data = {"comments[]": currentIDs};
1108 var data = {"comments": currentIDs};
817
1109
818 var $targetElem = $('.comments-content-table');
1110 var $targetElem = $('.comments-content-table');
819 $targetElem.css('opacity', 0.3);
1111 $targetElem.css('opacity', 0.3);
820 $targetElem.load(
821 loadUrl, data, function (responseText, textStatus, jqXHR) {
822 if (jqXHR.status !== 200) {
823 return false;
824 }
825 var $counterElem = $('#comments-count');
826 var newCount = $(responseText).data('counter');
827 if (newCount !== undefined) {
828 var callback = function () {
829 $counterElem.animate({'opacity': 1.00}, 200)
830 $counterElem.html(newCount);
831 };
832 $counterElem.animate({'opacity': 0.15}, 200, callback);
833 }
834
1112
835 $targetElem.css('opacity', 1);
1113 var success = function (data) {
836 tooltipActivate();
1114 var $counterElem = $('#comments-count');
1115 var newCount = $(data).data('counter');
1116 if (newCount !== undefined) {
1117 var callback = function () {
1118 $counterElem.animate({'opacity': 1.00}, 200)
1119 $counterElem.html(newCount);
1120 };
1121 $counterElem.animate({'opacity': 0.15}, 200, callback);
837 }
1122 }
838 );
1123
1124 $targetElem.css('opacity', 1);
1125 $targetElem.html(data);
1126 tooltipActivate();
1127 }
1128
1129 ajaxPOST(loadUrl, data, success, null, {})
1130
839 }
1131 }
840
1132
841 window.refreshTODOs = function (version) {
1133 window.refreshTODOs = function (version) {
@@ -858,28 +1150,28 b' window.refreshTODOs = function (version)'
858 currentIDs.push($(element).data('commentId'));
1150 currentIDs.push($(element).data('commentId'));
859 });
1151 });
860
1152
861 var data = {"comments[]": currentIDs};
1153 var data = {"comments": currentIDs};
862 var $targetElem = $('.todos-content-table');
1154 var $targetElem = $('.todos-content-table');
863 $targetElem.css('opacity', 0.3);
1155 $targetElem.css('opacity', 0.3);
864 $targetElem.load(
865 loadUrl, data, function (responseText, textStatus, jqXHR) {
866 if (jqXHR.status !== 200) {
867 return false;
868 }
869 var $counterElem = $('#todos-count')
870 var newCount = $(responseText).data('counter');
871 if (newCount !== undefined) {
872 var callback = function () {
873 $counterElem.animate({'opacity': 1.00}, 200)
874 $counterElem.html(newCount);
875 };
876 $counterElem.animate({'opacity': 0.15}, 200, callback);
877 }
878
1156
879 $targetElem.css('opacity', 1);
1157 var success = function (data) {
880 tooltipActivate();
1158 var $counterElem = $('#todos-count')
1159 var newCount = $(data).data('counter');
1160 if (newCount !== undefined) {
1161 var callback = function () {
1162 $counterElem.animate({'opacity': 1.00}, 200)
1163 $counterElem.html(newCount);
1164 };
1165 $counterElem.animate({'opacity': 0.15}, 200, callback);
881 }
1166 }
882 );
1167
1168 $targetElem.css('opacity', 1);
1169 $targetElem.html(data);
1170 tooltipActivate();
1171 }
1172
1173 ajaxPOST(loadUrl, data, success, null, {})
1174
883 }
1175 }
884
1176
885 window.refreshAllComments = function (version) {
1177 window.refreshAllComments = function (version) {
@@ -888,3 +1180,12 b' window.refreshAllComments = function (ve'
888 refreshComments(version);
1180 refreshComments(version);
889 refreshTODOs(version);
1181 refreshTODOs(version);
890 };
1182 };
1183
1184 window.sidebarComment = function (commentId) {
1185 var jsonData = $('#commentHovercard{0}'.format(commentId)).data('commentJsonB64');
1186 if (!jsonData) {
1187 return 'Failed to load comment {0}'.format(commentId)
1188 }
1189 var funcData = JSON.parse(atob(jsonData));
1190 return renderTemplate('sideBarCommentHovercard', funcData)
1191 };
@@ -57,15 +57,18 b' var ajaxGET = function (url, success, fa'
57 return request;
57 return request;
58 };
58 };
59
59
60 var ajaxPOST = function (url, postData, success, failure) {
60 var ajaxPOST = function (url, postData, success, failure, options) {
61 var sUrl = url;
61
62 var postData = toQueryString(postData);
62 var ajaxSettings = $.extend({
63 var request = $.ajax({
64 type: 'POST',
63 type: 'POST',
65 url: sUrl,
64 url: url,
66 data: postData,
65 data: toQueryString(postData),
67 headers: {'X-PARTIAL-XHR': true}
66 headers: {'X-PARTIAL-XHR': true}
68 })
67 }, options);
68
69 var request = $.ajax(
70 ajaxSettings
71 )
69 .done(function (data) {
72 .done(function (data) {
70 success(data);
73 success(data);
71 })
74 })
@@ -126,7 +129,8 b' function formatErrorMessage(jqXHR, textS'
126 } else if (errorThrown === 'abort') {
129 } else if (errorThrown === 'abort') {
127 return (prefix + 'Ajax request aborted.');
130 return (prefix + 'Ajax request aborted.');
128 } else {
131 } else {
129 return (prefix + 'Uncaught Error.\n' + jqXHR.responseText);
132 var errInfo = 'Uncaught Error. code: {0}\n'.format(jqXHR.status)
133 return (prefix + errInfo + jqXHR.responseText);
130 }
134 }
131 }
135 }
132
136
@@ -33,7 +33,7 b''
33 <h3 class="panel-title">${_('Pull Requests You Participate In')}</h3>
33 <h3 class="panel-title">${_('Pull Requests You Participate In')}</h3>
34 </div>
34 </div>
35 <div class="panel-body panel-body-min-height">
35 <div class="panel-body panel-body-min-height">
36 <table id="pull_request_list_table" class="display"></table>
36 <table id="pull_request_list_table" class="rctable table-bordered"></table>
37 </div>
37 </div>
38 </div>
38 </div>
39
39
@@ -58,16 +58,10 b''
58
58
59 dom: 'rtp',
59 dom: 'rtp',
60 pageLength: ${c.visual.dashboard_items},
60 pageLength: ${c.visual.dashboard_items},
61 order: [[2, "desc"]],
61 order: [[1, "desc"]],
62 columns: [
62 columns: [
63 {
63 {
64 data: {
64 data: {
65 "_": "target_repo",
66 "sort": "target_repo"
67 }, title: "${_('Target Repo')}", className: "td-targetrepo", orderable: false
68 },
69 {
70 data: {
71 "_": "status",
65 "_": "status",
72 "sort": "status"
66 "sort": "status"
73 }, title: "", className: "td-status", orderable: false
67 }, title: "", className: "td-status", orderable: false
@@ -101,7 +95,13 b''
101 "_": "updated_on",
95 "_": "updated_on",
102 "sort": "updated_on_raw"
96 "sort": "updated_on_raw"
103 }, title: "${_('Last Update')}", className: "td-time"
97 }, title: "${_('Last Update')}", className: "td-time"
104 }
98 },
99 {
100 data: {
101 "_": "target_repo",
102 "sort": "target_repo"
103 }, title: "${_('Target Repo')}", className: "td-targetrepo", orderable: false
104 },
105 ],
105 ],
106 language: {
106 language: {
107 paginate: DEFAULT_GRID_PAGINATION,
107 paginate: DEFAULT_GRID_PAGINATION,
@@ -785,15 +785,15 b''
785
785
786 - Prefix query to allow special search:
786 - Prefix query to allow special search:
787
787
788 user:admin, to search for usernames, always global
788 <strong>user:</strong>admin, to search for usernames, always global
789
789
790 user_group:devops, to search for user groups, always global
790 <strong>user_group:</strong>devops, to search for user groups, always global
791
791
792 pr:303, to search for pull request number, title, or description, always global
792 <strong>pr:</strong>303, to search for pull request number, title, or description, always global
793
793
794 commit:efced4, to search for commits, scoped to repositories or groups
794 <strong>commit:</strong>efced4, to search for commits, scoped to repositories or groups
795
795
796 file:models.py, to search for file paths, scoped to repositories or groups
796 <strong>file:</strong>models.py, to search for file paths, scoped to repositories or groups
797
797
798 % if c.template_context['search_context']['repo_id']:
798 % if c.template_context['search_context']['repo_id']:
799 For advanced full text search visit: <a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">repository search</a>
799 For advanced full text search visit: <a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">repository search</a>
@@ -16,8 +16,8 b' examples = ['
16 ),
16 ),
17
17
18 (
18 (
19 'Redmine',
19 'Tickets with #123 (Redmine etc)',
20 '(^#|\s#)(?P<issue_id>\d+)',
20 '(?<![a-zA-Z0-9_/]{1,10}-?)(#)(?P<issue_id>\d+)',
21 'https://myissueserver.com/${repo}/issue/${issue_id}',
21 'https://myissueserver.com/${repo}/issue/${issue_id}',
22 ''
22 ''
23 ),
23 ),
@@ -38,14 +38,15 b' examples = ['
38
38
39 (
39 (
40 'JIRA - All tickets',
40 'JIRA - All tickets',
41 '(^|\s\w+-\d+)',
41 # official JIRA ticket pattern
42 'https://myjira.com/browse/${id}',
42 '(?<![a-zA-Z0-9_/#]-?)(?P<issue_id>[A-Z]{1,6}-(?:[1-9][0-9]{0,7}))',
43 'https://myjira.com/browse/${issue_id}',
43 ''
44 ''
44 ),
45 ),
45
46
46 (
47 (
47 'JIRA - Project (JRA)',
48 'JIRA - Single project (JRA-XXXXXXXX)',
48 '(?:(^|\s)(?P<issue_id>(?:JRA-|JRA-)(?:\d+)))',
49 '(?<![a-zA-Z0-9_/#]-?)(?P<issue_id>JRA-(?:[1-9][0-9]{0,7}))',
49 'https://myjira.com/${issue_id}',
50 'https://myjira.com/${issue_id}',
50 ''
51 ''
51 ),
52 ),
@@ -275,13 +276,19 b' examples = ['
275 <div class='textarea-full'>
276 <div class='textarea-full'>
276 <textarea id="test_pattern_data" rows="12">
277 <textarea id="test_pattern_data" rows="12">
277 This is an example text for testing issue tracker patterns.
278 This is an example text for testing issue tracker patterns.
278 This commit fixes ticket #451 and ticket #910.
279 This commit fixes ticket #451 and ticket #910, reference for JRA-401.
279 Following tickets will get mentioned:
280 The following tickets will get mentioned:
280 #123
281 #123
281 #456
282 #456 and PROJ-101
282 JRA-123
283 JRA-123 and #123
283 JRA-456
284 PROJ-456
284 Open a pull request !101 to contribute !
285
286 [my artifact](http://something.com/JRA-1234-build.zip)
287
288 - #1001
289 - JRA-998
290
291 Open a pull request !101 to contribute!
285 Added tag v1.3.0 for commit 0f3b629be725
292 Added tag v1.3.0 for commit 0f3b629be725
286
293
287 Add a test pattern here and hit preview to see the link.
294 Add a test pattern here and hit preview to see the link.
@@ -89,36 +89,41 b''
89 if is_pr:
89 if is_pr:
90 version_info = (' made in older version (v{})'.format(comment_ver_index) if is_from_old_ver == 'true' else ' made in this version')
90 version_info = (' made in older version (v{})'.format(comment_ver_index) if is_from_old_ver == 'true' else ' made in this version')
91 %>
91 %>
92
92 ## new comments, since refresh
93 <script type="text/javascript">
93 % if existing_ids and comment_obj.comment_id not in existing_ids:
94 // closure function helper
94 <div class="tooltip" style="position: absolute; left: 8px; color: #682668" title="New comment">
95 var sidebarComment${comment_obj.comment_id} = function() {
95 !
96 return renderTemplate('sideBarCommentHovercard', {
96 </div>
97 version_info: "${version_info}",
98 file_name: "${comment_obj.f_path}",
99 line_no: "${comment_obj.line_no}",
100 outdated: ${h.json.dumps(comment_obj.outdated)},
101 inline: ${h.json.dumps(comment_obj.is_inline)},
102 is_todo: ${h.json.dumps(comment_obj.is_todo)},
103 created_on: "${h.format_date(comment_obj.created_on)}",
104 datetime: "${comment_obj.created_on}${h.get_timezone(comment_obj.created_on, time_is_local=True)}",
105 review_status: "${(comment_obj.review_status or '')}"
106 })
107 }
108 </script>
109
110 % if comment_obj.outdated:
111 <i class="icon-comment-toggle tooltip-hovercard" data-hovercard-url="javascript:sidebarComment${comment_obj.comment_id}()"></i>
112 % elif comment_obj.is_inline:
113 <i class="icon-code tooltip-hovercard" data-hovercard-url="javascript:sidebarComment${comment_obj.comment_id}()"></i>
114 % else:
115 <i class="icon-comment tooltip-hovercard" data-hovercard-url="javascript:sidebarComment${comment_obj.comment_id}()"></i>
116 % endif
97 % endif
117
98
118 ## NEW, since refresh
99 <%
119 % if existing_ids and comment_obj.comment_id not in existing_ids:
100 data = h.json.dumps({
120 <span class="tag">NEW</span>
101 'comment_id': comment_obj.comment_id,
121 % endif
102 'version_info': version_info,
103 'file_name': comment_obj.f_path,
104 'line_no': comment_obj.line_no,
105 'outdated': comment_obj.outdated,
106 'inline': comment_obj.is_inline,
107 'is_todo': comment_obj.is_todo,
108 'created_on': h.format_date(comment_obj.created_on),
109 'datetime': '{}{}'.format(comment_obj.created_on, h.get_timezone(comment_obj.created_on, time_is_local=True)),
110 'review_status': (comment_obj.review_status or '')
111 })
112
113 if comment_obj.outdated:
114 icon = 'icon-comment-toggle'
115 elif comment_obj.is_inline:
116 icon = 'icon-code'
117 else:
118 icon = 'icon-comment'
119 %>
120
121 <i id="commentHovercard${comment_obj.comment_id}"
122 class="${icon} tooltip-hovercard"
123 data-hovercard-url="javascript:sidebarComment(${comment_obj.comment_id})"
124 data-comment-json-b64='${h.b64(data)}'>
125 </i>
126
122 </td>
127 </td>
123
128
124 <td class="td-todo-gravatar">
129 <td class="td-todo-gravatar">
@@ -30,11 +30,21 b''
30 </ul>
30 </ul>
31 %endif
31 %endif
32 %if c.has_references:
32 %if c.has_references:
33 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
33 <div class="grid-quick-filter">
34 <span id="obj_count">0</span> ${_('bookmarks')}
34 <ul class="grid-filter-box">
35 <li class="grid-filter-box-icon">
36 <i class="icon-search"></i>
37 </li>
38 <li class="grid-filter-box-input">
39 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
40 </li>
41 </ul>
42 </div>
43 <div id="obj_count">0</div>
35 %endif
44 %endif
36 </div>
45 </div>
37 <table id="obj_list_table" class="display"></table>
46
47 <table id="obj_list_table" class="rctable table-bordered"></table>
38 </div>
48 </div>
39
49
40
50
@@ -43,7 +53,9 b''
43
53
44 var get_datatable_count = function(){
54 var get_datatable_count = function(){
45 var api = $('#obj_list_table').dataTable().api();
55 var api = $('#obj_list_table').dataTable().api();
46 $('#obj_count').text(api.page.info().recordsDisplay);
56 var total = api.page.info().recordsDisplay
57 var _text = _ngettext('{0} bookmark', '{0} bookmarks', total).format(total);
58 $('#obj_count').text(_text);
47 };
59 };
48
60
49 // object list
61 // object list
@@ -30,11 +30,20 b''
30 </ul>
30 </ul>
31 %endif
31 %endif
32 %if c.has_references:
32 %if c.has_references:
33 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
33 <div class="grid-quick-filter">
34 <span id="obj_count">0</span> ${_('branches')}
34 <ul class="grid-filter-box">
35 <li class="grid-filter-box-icon">
36 <i class="icon-search"></i>
37 </li>
38 <li class="grid-filter-box-input">
39 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
40 </li>
41 </ul>
42 </div>
43 <div id="obj_count">0</div>
35 %endif
44 %endif
36 </div>
45 </div>
37 <table id="obj_list_table" class="display"></table>
46 <table id="obj_list_table" class="rctable table-bordered"></table>
38 </div>
47 </div>
39
48
40 <script type="text/javascript">
49 <script type="text/javascript">
@@ -42,7 +51,10 b''
42
51
43 var get_datatable_count = function(){
52 var get_datatable_count = function(){
44 var api = $('#obj_list_table').dataTable().api();
53 var api = $('#obj_list_table').dataTable().api();
45 $('#obj_count').text(api.page.info().recordsDisplay);
54 var total = api.page.info().recordsDisplay
55 var _text = _ngettext('{0} branch', '{0} branches', total).format(total);
56
57 $('#obj_count').text(_text);
46 };
58 };
47
59
48 // object list
60 // object list
@@ -187,12 +187,12 b''
187 <div class="sidebar-element clear-both">
187 <div class="sidebar-element clear-both">
188 <% vote_title = _ungettext(
188 <% vote_title = _ungettext(
189 'Status calculated based on votes from {} reviewer',
189 'Status calculated based on votes from {} reviewer',
190 'Status calculated based on votes from {} reviewers', len(c.allowed_reviewers)).format(len(c.allowed_reviewers))
190 'Status calculated based on votes from {} reviewers', c.reviewers_count).format(c.reviewers_count)
191 %>
191 %>
192
192
193 <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${vote_title}">
193 <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${vote_title}">
194 <i class="icon-circle review-status-${c.commit_review_status}"></i>
194 <i class="icon-circle review-status-${c.commit_review_status}"></i>
195 ${len(c.allowed_reviewers)}
195 ${c.reviewers_count}
196 </div>
196 </div>
197 </div>
197 </div>
198
198
@@ -420,7 +420,8 b''
420 e.preventDefault();
420 e.preventDefault();
421 });
421 });
422
422
423 ReviewersPanel.init(null, setReviewersData);
423 reviewersController = new ReviewersController();
424 ReviewersPanel.init(reviewersController, null, setReviewersData);
424
425
425 var channel = '${c.commit_broadcast_channel}';
426 var channel = '${c.commit_broadcast_channel}';
426 new ReviewerPresenceController(channel)
427 new ReviewerPresenceController(channel)
@@ -99,7 +99,7 b''
99 <div id="graph_content" class="graph_full_width">
99 <div id="graph_content" class="graph_full_width">
100
100
101 <div class="table">
101 <div class="table">
102 <table id="changesets" class="rctable">
102 <table id="changesets" class="rctable table-bordered">
103 <tr>
103 <tr>
104 ## checkbox
104 ## checkbox
105 <th colspan="4">
105 <th colspan="4">
@@ -379,22 +379,22 b''
379 </%def>
379 </%def>
380
380
381 <%def name="pullrequest_name(pull_request_id, state, is_wip, target_repo_name, short=False)">
381 <%def name="pullrequest_name(pull_request_id, state, is_wip, target_repo_name, short=False)">
382 <code>
382 <a href="${h.route_path('pullrequest_show',repo_name=target_repo_name,pull_request_id=pull_request_id)}">
383 <a href="${h.route_path('pullrequest_show',repo_name=target_repo_name,pull_request_id=pull_request_id)}">
383
384 % if short:
384 % if short:
385 !${pull_request_id}
385 !${pull_request_id}
386 % else:
386 % else:
387 ${_('Pull request !{}').format(pull_request_id)}
387 ${_('Pull request !{}').format(pull_request_id)}
388 % endif
388 % endif
389
389 </a>
390 % if state not in ['created']:
390 </code>
391 <span class="tag tag-merge-state-${state} tooltip" title="Pull request state is changing">${state}</span>
391 % if state not in ['created']:
392 % endif
392 <span class="tag tag-merge-state-${state} tooltip" title="Pull request state is changing">${state}</span>
393 % endif
393
394
394 % if is_wip:
395 % if is_wip:
395 <span class="tag tooltip" title="${_('Work in progress')}">wip</span>
396 <span class="tag tooltip" title="${_('Work in progress')}">wip</span>
396 % endif
397 % endif
397 </a>
398 </%def>
398 </%def>
399
399
400 <%def name="pullrequest_updated_on(updated_on)">
400 <%def name="pullrequest_updated_on(updated_on)">
@@ -149,7 +149,7 b''
149 <span class="user"> <a href="/_profiles/jenkins-tests">jenkins-tests</a> (reviewer)</span>
149 <span class="user"> <a href="/_profiles/jenkins-tests">jenkins-tests</a> (reviewer)</span>
150 </div>
150 </div>
151 <input id="reviewer_70_input" type="hidden" value="70" name="review_members">
151 <input id="reviewer_70_input" type="hidden" value="70" name="review_members">
152 <div class="reviewer_member_remove action_button" onclick="removeReviewMember(70, true)" style="visibility: hidden;">
152 <div class="reviewer_member_remove action_button" onclick="removeMember(70, true)" style="visibility: hidden;">
153 <i class="icon-remove"></i>
153 <i class="icon-remove"></i>
154 </div>
154 </div>
155 </li>
155 </li>
@@ -66,9 +66,18 b" var data_hovercard_url = pyroutes.url('h"
66 <tr id="reviewer_<%= member.user_id %>" class="reviewer_entry" tooltip="Review Group" data-reviewer-user-id="<%= member.user_id %>">
66 <tr id="reviewer_<%= member.user_id %>" class="reviewer_entry" tooltip="Review Group" data-reviewer-user-id="<%= member.user_id %>">
67
67
68 <td style="width: 20px">
68 <td style="width: 20px">
69 <div class="tooltip presence-state" style="display: none; position: absolute; left: 2px" title="This users is currently at this page">
70 <i class="icon-eye" style="color: #0ac878"></i>
71 </div>
72 <% if (role === 'reviewer') { %>
69 <div class="reviewer_status tooltip" title="<%= review_status_label %>">
73 <div class="reviewer_status tooltip" title="<%= review_status_label %>">
70 <i class="icon-circle review-status-<%= review_status %>"></i>
74 <i class="icon-circle review-status-<%= review_status %>"></i>
71 </div>
75 </div>
76 <% } else if (role === 'observer') { %>
77 <div class="tooltip" title="Observer without voting right.">
78 <i class="icon-circle-thin"></i>
79 </div>
80 <% } %>
72 </td>
81 </td>
73
82
74 <td>
83 <td>
@@ -84,9 +93,6 b" var data_hovercard_url = pyroutes.url('h"
84 'gravatar_url': member.gravatar_link
93 'gravatar_url': member.gravatar_link
85 })
94 })
86 %>
95 %>
87 <span class="tooltip presence-state" style="display: none" title="This users is currently at this page">
88 <i class="icon-eye" style="color: #0ac878"></i>
89 </span>
90 </div>
96 </div>
91 </td>
97 </td>
92
98
@@ -108,7 +114,7 b" var data_hovercard_url = pyroutes.url('h"
108 <% } else { %>
114 <% } else { %>
109 <td style="text-align: right;width: 10px;">
115 <td style="text-align: right;width: 10px;">
110 <% if (allowed_to_update) { %>
116 <% if (allowed_to_update) { %>
111 <div class="reviewer_member_remove" onclick="reviewersController.removeReviewMember(<%= member.user_id %>, true)" style="visibility: <%= edit_visibility %>;">
117 <div class="<%=role %>_member_remove" onclick="reviewersController.removeMember(<%= member.user_id %>, true)" style="visibility: <%= edit_visibility %>;">
112 <i class="icon-remove"></i>
118 <i class="icon-remove"></i>
113 </div>
119 </div>
114 <% } %>
120 <% } %>
@@ -117,7 +123,7 b" var data_hovercard_url = pyroutes.url('h"
117
123
118 </tr>
124 </tr>
119
125
120 <tr>
126 <tr id="reviewer_<%= member.user_id %>_rules">
121 <td colspan="4" style="display: <%= rule_visibility %>" class="pr-user-rule-container">
127 <td colspan="4" style="display: <%= rule_visibility %>" class="pr-user-rule-container">
122 <input type="hidden" name="__start__" value="reviewer:mapping">
128 <input type="hidden" name="__start__" value="reviewer:mapping">
123
129
@@ -149,6 +155,7 b" var data_hovercard_url = pyroutes.url('h"
149
155
150 <input id="reviewer_<%= member.user_id %>_input" type="hidden" value="<%= member.user_id %>" name="user_id" />
156 <input id="reviewer_<%= member.user_id %>_input" type="hidden" value="<%= member.user_id %>" name="user_id" />
151 <input type="hidden" name="mandatory" value="<%= mandatory %>"/>
157 <input type="hidden" name="mandatory" value="<%= mandatory %>"/>
158 <input type="hidden" name="role" value="<%= role %>"/>
152
159
153 <input type="hidden" name="__end__" value="reviewer:mapping">
160 <input type="hidden" name="__end__" value="reviewer:mapping">
154 </td>
161 </td>
@@ -11,7 +11,10 b' data = {'
11 'pr_title': pull_request.title,
11 'pr_title': pull_request.title,
12 }
12 }
13
13
14 subject_template = email_pr_review_subject_template or _('{user} requested a pull request review. !{pr_id}: "{pr_title}"')
14 if user_role == 'observer':
15 subject_template = email_pr_review_subject_template or _('{user} added you as observer to pull request. !{pr_id}: "{pr_title}"')
16 else:
17 subject_template = email_pr_review_subject_template or _('{user} requested a pull request review. !{pr_id}: "{pr_title}"')
15 %>
18 %>
16
19
17 ${subject_template.format(**data) |n}
20 ${subject_template.format(**data) |n}
@@ -34,6 +37,7 b' data = {'
34 'source_repo_url': pull_request_source_repo_url,
37 'source_repo_url': pull_request_source_repo_url,
35 'target_repo_url': pull_request_target_repo_url,
38 'target_repo_url': pull_request_target_repo_url,
36 }
39 }
40
37 %>
41 %>
38
42
39 * ${_('Pull Request link')}: ${pull_request_url}
43 * ${_('Pull Request link')}: ${pull_request_url}
@@ -51,7 +55,7 b' data = {'
51
55
52 % for commit_id, message in pull_request_commits:
56 % for commit_id, message in pull_request_commits:
53 - ${h.short_id(commit_id)}
57 - ${h.short_id(commit_id)}
54 ${h.chop_at_smart(message, '\n', suffix_if_chopped='...')}
58 ${h.chop_at_smart(message.lstrip(), '\n', suffix_if_chopped='...')}
55
59
56 % endfor
60 % endfor
57
61
@@ -78,19 +82,23 b' data = {'
78 <table style="text-align:left;vertical-align:middle;width: 100%">
82 <table style="text-align:left;vertical-align:middle;width: 100%">
79 <tr>
83 <tr>
80 <td style="width:100%;border-bottom:1px solid #dbd9da;">
84 <td style="width:100%;border-bottom:1px solid #dbd9da;">
81
82 <div style="margin: 0; font-weight: bold">
85 <div style="margin: 0; font-weight: bold">
86 % if user_role == 'observer':
87 <div class="clear-both" class="clear-both" style="margin-bottom: 4px">
88 <span style="color:#7E7F7F">@${h.person(user.username)}</span>
89 ${_('added you as observer to')}
90 <a href="${pull_request_url}" style="${base.link_css()}">pull request</a>.
91 </div>
92 % else:
83 <div class="clear-both" class="clear-both" style="margin-bottom: 4px">
93 <div class="clear-both" class="clear-both" style="margin-bottom: 4px">
84 <span style="color:#7E7F7F">@${h.person(user.username)}</span>
94 <span style="color:#7E7F7F">@${h.person(user.username)}</span>
85 ${_('requested a')}
95 ${_('requested a')}
86 <a href="${pull_request_url}" style="${base.link_css()}">
96 <a href="${pull_request_url}" style="${base.link_css()}">pull request</a> review.
87 ${_('pull request review.').format(**data) }
88 </a>
89 </div>
97 </div>
98 % endif
90 <div style="margin-top: 10px"></div>
99 <div style="margin-top: 10px"></div>
91 ${_('Pull request')} <code>!${data['pr_id']}: ${data['pr_title']}</code>
100 ${_('Pull request')} <code>!${data['pr_id']}: ${data['pr_title']}</code>
92 </div>
101 </div>
93
94 </td>
102 </td>
95 </tr>
103 </tr>
96
104
@@ -10,7 +10,7 b''
10 default_landing_ref = c.commit.raw_id
10 default_landing_ref = c.commit.raw_id
11 %>
11 %>
12 <div id="file-tree-wrapper" class="browser-body ${('full-load' if c.full_load else '')}">
12 <div id="file-tree-wrapper" class="browser-body ${('full-load' if c.full_load else '')}">
13 <table class="code-browser rctable repo_summary">
13 <table class="code-browser rctable table-bordered">
14 <thead>
14 <thead>
15 <tr>
15 <tr>
16 <th>${_('Name')}</th>
16 <th>${_('Name')}</th>
@@ -112,7 +112,7 b''
112 ## REVIEWERS
112 ## REVIEWERS
113 <div class="field">
113 <div class="field">
114 <div class="label label-textarea">
114 <div class="label label-textarea">
115 <label for="pullrequest_reviewers">${_('Reviewers')}:</label>
115 <label for="pullrequest_reviewers">${_('Reviewers / Observers')}:</label>
116 </div>
116 </div>
117 <div class="content">
117 <div class="content">
118 ## REVIEW RULES
118 ## REVIEW RULES
@@ -125,29 +125,84 b''
125 </div>
125 </div>
126 </div>
126 </div>
127
127
128 ## REVIEWERS
128 ## REVIEWERS / OBSERVERS
129 <div class="reviewers-title">
129 <div class="reviewers-title">
130 <div class="pr-details-title">
130
131 ${_('Pull request reviewers')}
131 <ul class="nav-links clearfix">
132 <span class="calculate-reviewers"> - ${_('loading...')}</span>
132
133 </div>
133 ## TAB1 MANDATORY REVIEWERS
134 </div>
134 <li class="active">
135 <div id="reviewers" class="pr-details-content reviewers">
135 <a id="reviewers-btn" href="#showReviewers" tabindex="-1">
136 ## members goes here, filled via JS based on initial selection !
136 Reviewers
137 <input type="hidden" name="__start__" value="review_members:sequence">
137 <span id="reviewers-cnt" data-count="0" class="menulink-counter">0</span>
138 <table id="review_members" class="group_members">
138 </a>
139 ## This content is loaded via JS and ReviewersPanel
139 </li>
140 </table>
140
141 <input type="hidden" name="__end__" value="review_members:sequence">
141 ## TAB2 OBSERVERS
142 <li class="">
143 <a id="observers-btn" href="#showObservers" tabindex="-1">
144 Observers
145 <span id="observers-cnt" data-count="0" class="menulink-counter">0</span>
146 </a>
147 </li>
148
149 </ul>
142
150
143 <div id="add_reviewer_input" class='ac'>
151 ## TAB1 MANDATORY REVIEWERS
144 <div class="reviewer_ac">
152 <div id="reviewers-container">
145 ${h.text('user', class_='ac-input', placeholder=_('Add reviewer or reviewer group'))}
153 <span class="calculate-reviewers">
146 <div id="reviewers_container"></div>
154 <h4>${_('loading...')}</h4>
155 </span>
156
157 <div id="reviewers" class="pr-details-content reviewers">
158 ## members goes here, filled via JS based on initial selection !
159 <input type="hidden" name="__start__" value="review_members:sequence">
160 <table id="review_members" class="group_members">
161 ## This content is loaded via JS and ReviewersPanel, an sets reviewer_entry class on each element
162 </table>
163 <input type="hidden" name="__end__" value="review_members:sequence">
164
165 <div id="add_reviewer_input" class='ac'>
166 <div class="reviewer_ac">
167 ${h.text('user', class_='ac-input', placeholder=_('Add reviewer or reviewer group'))}
168 <div id="reviewers_container"></div>
169 </div>
170 </div>
171
147 </div>
172 </div>
148 </div>
173 </div>
149
174
175 ## TAB2 OBSERVERS
176 <div id="observers-container" style="display: none">
177 <span class="calculate-reviewers">
178 <h4>${_('loading...')}</h4>
179 </span>
180 % if c.rhodecode_edition_id == 'EE':
181 <div id="observers" class="pr-details-content observers">
182 ## members goes here, filled via JS based on initial selection !
183 <input type="hidden" name="__start__" value="observer_members:sequence">
184 <table id="observer_members" class="group_members">
185 ## This content is loaded via JS and ReviewersPanel, an sets reviewer_entry class on each element
186 </table>
187 <input type="hidden" name="__end__" value="observer_members:sequence">
188
189 <div id="add_observer_input" class='ac'>
190 <div class="observer_ac">
191 ${h.text('observer', class_='ac-input', placeholder=_('Add observer or observer group'))}
192 <div id="observers_container"></div>
193 </div>
194 </div>
195 </div>
196 % else:
197 <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>
198 <p>
199 Pull request observers allows adding users who don't need to leave mandatory votes, but need to be aware about certain changes.
200 </p>
201 % endif
202 </div>
203
150 </div>
204 </div>
205
151 </div>
206 </div>
152 </div>
207 </div>
153
208
@@ -248,12 +303,19 b''
248
303
249 var originalOption = data.element;
304 var originalOption = data.element;
250 return prefix + escapeMarkup(data.text);
305 return prefix + escapeMarkup(data.text);
251 };formatSelection:
306 };
252
307
253 // custom code mirror
308 // custom code mirror
254 var codeMirrorInstance = $('#pullrequest_desc').get(0).MarkupForm.cm;
309 var codeMirrorInstance = $('#pullrequest_desc').get(0).MarkupForm.cm;
255
310
256 var diffDataHandler = function(data) {
311 var diffDataHandler = function(data) {
312 if (data['error'] !== undefined) {
313 var noCommitsMsg = '<span class="alert-text-error">{0}</span>'.format(data['error']);
314 prButtonLock(true, noCommitsMsg, 'compare');
315 //make both panels equal
316 $('.target-panel').height($('.source-panel').height())
317 return false
318 }
257
319
258 var commitElements = data['commits'];
320 var commitElements = data['commits'];
259 var files = data['files'];
321 var files = data['files'];
@@ -307,8 +369,10 b''
307 var msg = '<input id="common_ancestor" type="hidden" name="common_ancestor" value="{0}">'.format(commonAncestorId);
369 var msg = '<input id="common_ancestor" type="hidden" name="common_ancestor" value="{0}">'.format(commonAncestorId);
308 msg += '<input type="hidden" name="__start__" value="revisions:sequence">'
370 msg += '<input type="hidden" name="__start__" value="revisions:sequence">'
309
371
372
310 $.each(commitElements, function(idx, value) {
373 $.each(commitElements, function(idx, value) {
311 msg += '<input type="hidden" name="revisions" value="{0}">'.format(value["raw_id"]);
374 var commit_id = value["commit_id"]
375 msg += '<input type="hidden" name="revisions" value="{0}">'.format(commit_id);
312 });
376 });
313
377
314 msg += '<input type="hidden" name="__end__" value="revisions:sequence">'
378 msg += '<input type="hidden" name="__end__" value="revisions:sequence">'
@@ -338,8 +402,8 b''
338 }
402 }
339
403
340 //make both panels equal
404 //make both panels equal
341 $('.target-panel').height($('.source-panel').height())
405 $('.target-panel').height($('.source-panel').height());
342
406 return true
343 };
407 };
344
408
345 reviewersController = new ReviewersController();
409 reviewersController = new ReviewersController();
@@ -465,8 +529,7 b''
465 queryTargetRefs(initialData, query)
529 queryTargetRefs(initialData, query)
466 },
530 },
467 initSelection: initRefSelection()
531 initSelection: initRefSelection()
468 }
532 });
469 );
470
533
471 var sourceRepoSelect2 = Select2Box($sourceRepo, {
534 var sourceRepoSelect2 = Select2Box($sourceRepo, {
472 query: function(query) {}
535 query: function(query) {}
@@ -521,12 +584,12 b''
521
584
522 });
585 });
523
586
524 $pullRequestForm.on('submit', function(e){
587 $pullRequestForm.on('submit', function(e){
525 // Flush changes into textarea
588 // Flush changes into textarea
526 codeMirrorInstance.save();
589 codeMirrorInstance.save();
527 prButtonLock(true, null, 'all');
590 prButtonLock(true, null, 'all');
528 $pullRequestSubmit.val(_gettext('Please wait creating pull request...'));
591 $pullRequestSubmit.val(_gettext('Please wait creating pull request...'));
529 });
592 });
530
593
531 prButtonLock(true, "${_('Please select source and target')}", 'all');
594 prButtonLock(true, "${_('Please select source and target')}", 'all');
532
595
@@ -543,12 +606,44 b''
543 $sourceRef.select2('val', '${c.default_source_ref}');
606 $sourceRef.select2('val', '${c.default_source_ref}');
544
607
545
608
546 // default reviewers
609 // default reviewers / observers
547 reviewersController.loadDefaultReviewers(
610 reviewersController.loadDefaultReviewers(
548 sourceRepo(), sourceRef(), targetRepo(), targetRef());
611 sourceRepo(), sourceRef(), targetRepo(), targetRef());
549 % endif
612 % endif
550
613
551 ReviewerAutoComplete('#user');
614 ReviewerAutoComplete('#user', reviewersController);
615 ObserverAutoComplete('#observer', reviewersController);
616
617 // TODO, move this to another handler
618
619 var $reviewersBtn = $('#reviewers-btn');
620 var $reviewersContainer = $('#reviewers-container');
621
622 var $observersBtn = $('#observers-btn')
623 var $observersContainer = $('#observers-container');
624
625 $reviewersBtn.on('click', function (e) {
626
627 $observersContainer.hide();
628 $reviewersContainer.show();
629
630 $observersBtn.parent().removeClass('active');
631 $reviewersBtn.parent().addClass('active');
632 e.preventDefault();
633
634 })
635
636 $observersBtn.on('click', function (e) {
637
638 $reviewersContainer.hide();
639 $observersContainer.show();
640
641 $reviewersBtn.parent().removeClass('active');
642 $observersBtn.parent().addClass('active');
643 e.preventDefault();
644
645 })
646
552 });
647 });
553 </script>
648 </script>
554
649
@@ -556,12 +556,12 b''
556 <div class="sidebar-element clear-both">
556 <div class="sidebar-element clear-both">
557 <% vote_title = _ungettext(
557 <% vote_title = _ungettext(
558 'Status calculated based on votes from {} reviewer',
558 'Status calculated based on votes from {} reviewer',
559 'Status calculated based on votes from {} reviewers', len(c.allowed_reviewers)).format(len(c.allowed_reviewers))
559 'Status calculated based on votes from {} reviewers', c.reviewers_count).format(c.reviewers_count)
560 %>
560 %>
561
561
562 <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${vote_title}">
562 <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${vote_title}">
563 <i class="icon-circle review-status-${c.pull_request_review_status}"></i>
563 <i class="icon-circle review-status-${c.pull_request_review_status}"></i>
564 ${len(c.allowed_reviewers)}
564 ${c.reviewers_count}
565 </div>
565 </div>
566
566
567 ## REVIEW RULES
567 ## REVIEW RULES
@@ -609,13 +609,13 b''
609 <div id="add_reviewer" class="ac" style="display: none;">
609 <div id="add_reviewer" class="ac" style="display: none;">
610 %if c.allowed_to_update:
610 %if c.allowed_to_update:
611 % if not c.forbid_adding_reviewers:
611 % if not c.forbid_adding_reviewers:
612 <div id="add_reviewer_input" class="reviewer_ac">
612 <div id="add_reviewer_input" class="reviewer_ac" style="width: 240px">
613 ${h.text('user', class_='ac-input', placeholder=_('Add reviewer or reviewer group'))}
613 <input class="ac-input" id="user" name="user" placeholder="${_('Add reviewer or reviewer group')}" type="text" autocomplete="off">
614 <div id="reviewers_container"></div>
614 <div id="reviewers_container"></div>
615 </div>
615 </div>
616 % endif
616 % endif
617 <div class="pull-right">
617 <div class="pull-right" style="margin-bottom: 15px">
618 <button id="update_pull_request" class="btn btn-small no-margin">${_('Save Changes')}</button>
618 <button data-role="reviewer" id="update_reviewers" class="btn btn-small no-margin">${_('Save Changes')}</button>
619 </div>
619 </div>
620 %endif
620 %endif
621 </div>
621 </div>
@@ -623,23 +623,59 b''
623 </div>
623 </div>
624 </div>
624 </div>
625
625
626 ## ## OBSERVERS
626 ## OBSERVERS
627 ## <div class="sidebar-element clear-both">
627 % if c.rhodecode_edition_id == 'EE':
628 ## <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${_('Observers')}">
628 <div class="sidebar-element clear-both">
629 ## <i class="icon-eye"></i>
629 <% vote_title = _ungettext(
630 ## 0
630 '{} observer without voting right.',
631 ## </div>
631 '{} observers without voting right.', c.observers_count).format(c.observers_count)
632 ##
632 %>
633 ## <div class="right-sidebar-expanded-state pr-details-title">
633
634 ## <span class="sidebar-heading">
634 <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${vote_title}">
635 ## <i class="icon-eye"></i>
635 <i class="icon-circle-thin"></i>
636 ## ${_('Observers')}
636 ${c.observers_count}
637 ## </span>
637 </div>
638 ## </div>
638
639 ## <div class="right-sidebar-expanded-state pr-details-content">
639 <div class="right-sidebar-expanded-state pr-details-title">
640 ## No observers
640 <span class="tooltip sidebar-heading" title="${vote_title}">
641 ## </div>
641 <i class="icon-circle-thin"></i>
642 ## </div>
642 ${_('Observers')}
643 </span>
644 %if c.allowed_to_update:
645 <span id="open_edit_observers" class="block-right action_button last-item">${_('Edit')}</span>
646 <span id="close_edit_observers" class="block-right action_button last-item" style="display: none;">${_('Close')}</span>
647 %endif
648 </div>
649
650 <div id="observers" class="right-sidebar-expanded-state pr-details-content reviewers">
651 ## members redering block
652 <input type="hidden" name="__start__" value="observer_members:sequence">
653
654 <table id="observer_members" class="group_members">
655 ## This content is loaded via JS and ReviewersPanel
656 </table>
657
658 <input type="hidden" name="__end__" value="observer_members:sequence">
659 ## end members redering block
660
661 %if not c.pull_request.is_closed():
662 <div id="add_observer" class="ac" style="display: none;">
663 %if c.allowed_to_update:
664 % if not c.forbid_adding_reviewers or 1:
665 <div id="add_reviewer_input" class="reviewer_ac" style="width: 240px" >
666 <input class="ac-input" id="observer" name="observer" placeholder="${_('Add observer or observer group')}" type="text" autocomplete="off">
667 <div id="observers_container"></div>
668 </div>
669 % endif
670 <div class="pull-right" style="margin-bottom: 15px">
671 <button data-role="observer" id="update_observers" class="btn btn-small no-margin">${_('Save Changes')}</button>
672 </div>
673 %endif
674 </div>
675 %endif
676 </div>
677 </div>
678 % endif
643
679
644 ## TODOs
680 ## TODOs
645 <div class="sidebar-element clear-both">
681 <div class="sidebar-element clear-both">
@@ -757,7 +793,7 b''
757
793
758 <tr><td><code>${_('In pull request description')}:</code></td></tr>
794 <tr><td><code>${_('In pull request description')}:</code></td></tr>
759 % if c.referenced_desc_issues:
795 % if c.referenced_desc_issues:
760 % for ticket_dict in c.referenced_desc_issues:
796 % for ticket_dict in sorted(c.referenced_desc_issues):
761 <tr>
797 <tr>
762 <td>
798 <td>
763 <a href="${ticket_dict.get('url')}">
799 <a href="${ticket_dict.get('url')}">
@@ -776,7 +812,7 b''
776
812
777 <tr><td style="padding-top: 10px"><code>${_('In commit messages')}:</code></td></tr>
813 <tr><td style="padding-top: 10px"><code>${_('In commit messages')}:</code></td></tr>
778 % if c.referenced_commit_issues:
814 % if c.referenced_commit_issues:
779 % for ticket_dict in c.referenced_commit_issues:
815 % for ticket_dict in sorted(c.referenced_commit_issues):
780 <tr>
816 <tr>
781 <td>
817 <td>
782 <a href="${ticket_dict.get('url')}">
818 <a href="${ticket_dict.get('url')}">
@@ -815,6 +851,7 b' updateController = new UpdatePrControlle'
815
851
816 window.reviewerRulesData = ${c.pull_request_default_reviewers_data_json | n};
852 window.reviewerRulesData = ${c.pull_request_default_reviewers_data_json | n};
817 window.setReviewersData = ${c.pull_request_set_reviewers_data_json | n};
853 window.setReviewersData = ${c.pull_request_set_reviewers_data_json | n};
854 window.setObserversData = ${c.pull_request_set_observers_data_json | n};
818
855
819 (function () {
856 (function () {
820 "use strict";
857 "use strict";
@@ -822,44 +859,9 b' window.setReviewersData = ${c.pull_reque'
822 // custom code mirror
859 // custom code mirror
823 var codeMirrorInstance = $('#pr-description-input').get(0).MarkupForm.cm;
860 var codeMirrorInstance = $('#pr-description-input').get(0).MarkupForm.cm;
824
861
825 var PRDetails = {
826 editButton: $('#open_edit_pullrequest'),
827 closeButton: $('#close_edit_pullrequest'),
828 deleteButton: $('#delete_pullrequest'),
829 viewFields: $('#pr-desc, #pr-title'),
830 editFields: $('#pr-desc-edit, #pr-title-edit, .pr-save'),
831
832 init: function () {
833 var that = this;
834 this.editButton.on('click', function (e) {
835 that.edit();
836 });
837 this.closeButton.on('click', function (e) {
838 that.view();
839 });
840 },
841
842 edit: function (event) {
843 var cmInstance = $('#pr-description-input').get(0).MarkupForm.cm;
844 this.viewFields.hide();
845 this.editButton.hide();
846 this.deleteButton.hide();
847 this.closeButton.show();
848 this.editFields.show();
849 cmInstance.refresh();
850 },
851
852 view: function (event) {
853 this.editButton.show();
854 this.deleteButton.show();
855 this.editFields.hide();
856 this.closeButton.hide();
857 this.viewFields.show();
858 }
859 };
860
861 PRDetails.init();
862 PRDetails.init();
862 ReviewersPanel.init(reviewerRulesData, setReviewersData);
863 ReviewersPanel.init(reviewersController, reviewerRulesData, setReviewersData);
864 ObserversPanel.init(reviewersController, reviewerRulesData, setObserversData);
863
865
864 window.showOutdated = function (self) {
866 window.showOutdated = function (self) {
865 $('.comment-inline.comment-outdated').show();
867 $('.comment-inline.comment-outdated').show();
@@ -929,12 +931,17 b' window.setReviewersData = ${c.pull_reque'
929 title, description, renderer);
931 title, description, renderer);
930 });
932 });
931
933
932 $('#update_pull_request').on('click', function (e) {
934 var $updateButtons = $('#update_reviewers,#update_observers');
933 $(this).attr('disabled', 'disabled');
935 $updateButtons.on('click', function (e) {
934 $(this).addClass('disabled');
936 var role = $(this).data('role');
935 $(this).html(_gettext('Saving...'));
937 $updateButtons.attr('disabled', 'disabled');
938 $updateButtons.addClass('disabled');
939 $updateButtons.html(_gettext('Saving...'));
936 reviewersController.updateReviewers(
940 reviewersController.updateReviewers(
937 "${c.repo_name}", "${c.pull_request.pull_request_id}");
941 templateContext.repo_name,
942 templateContext.pull_request_data.pull_request_id,
943 role
944 );
938 });
945 });
939
946
940 // fixing issue with caches on firefox
947 // fixing issue with caches on firefox
@@ -978,7 +985,8 b' window.setReviewersData = ${c.pull_reque'
978 refreshMergeChecks();
985 refreshMergeChecks();
979 };
986 };
980
987
981 ReviewerAutoComplete('#user');
988 ReviewerAutoComplete('#user', reviewersController);
989 ObserverAutoComplete('#observer', reviewersController);
982
990
983 })();
991 })();
984
992
@@ -61,7 +61,7 b''
61 </div>
61 </div>
62
62
63 <div class="main-content-full-width">
63 <div class="main-content-full-width">
64 <table id="pull_request_list_table" class="display"></table>
64 <table id="pull_request_list_table" class="rctable table-bordered"></table>
65 </div>
65 </div>
66
66
67 </div>
67 </div>
@@ -1,11 +1,11 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <%namespace name="base" file="/base/base.mako"/>
2 <%namespace name="base" file="/base/base.mako"/>
3 %if c.repo_commits:
3 %if c.repo_commits:
4 <table class="rctable repo_summary table_disp">
4 <table class="rctable table-bordered">
5 <tr>
5 <tr>
6
6
7 <th class="status"></th>
7 <th class="status"></th>
8 <th>${_('Commit')}</th>
8 <th></th>
9 <th>${_('Commit message')}</th>
9 <th>${_('Commit message')}</th>
10 <th>${_('Age')}</th>
10 <th>${_('Age')}</th>
11 <th>${_('Author')}</th>
11 <th>${_('Author')}</th>
@@ -30,11 +30,20 b''
30 </ul>
30 </ul>
31 %endif
31 %endif
32 %if c.has_references:
32 %if c.has_references:
33 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
33 <div class="grid-quick-filter">
34 <span id="obj_count">0</span> ${_('tags')}
34 <ul class="grid-filter-box">
35 <li class="grid-filter-box-icon">
36 <i class="icon-search"></i>
37 </li>
38 <li class="grid-filter-box-input">
39 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
40 </li>
41 </ul>
42 </div>
43 <div id="obj_count">0</div>
35 %endif
44 %endif
36 </div>
45 </div>
37 <table id="obj_list_table" class="display"></table>
46 <table id="obj_list_table" class="rctable table-bordered"></table>
38 </div>
47 </div>
39
48
40
49
@@ -43,7 +52,10 b''
43
52
44 var get_datatable_count = function(){
53 var get_datatable_count = function(){
45 var api = $('#obj_list_table').dataTable().api();
54 var api = $('#obj_list_table').dataTable().api();
46 $('#obj_count').text(api.page.info().recordsDisplay);
55 var total = api.page.info().recordsDisplay
56 var _text = _ngettext('{0} tag', '{0} tags', total).format(total);
57
58 $('#obj_count').text(_text);
47 };
59 };
48
60
49 // object list
61 // object list
@@ -121,7 +121,7 b' def test_extract_issues(backend, text_st'
121
121
122 with mock.patch.object(IssueTrackerSettingsModel,
122 with mock.patch.object(IssueTrackerSettingsModel,
123 'get_settings', get_settings_mock):
123 'get_settings', get_settings_mock):
124 text, issues = helpers.process_patterns(text_string, repo.repo_name)
124 text, issues, errors = helpers.process_patterns(text_string, repo.repo_name)
125
125
126 expected = copy.deepcopy(expected)
126 expected = copy.deepcopy(expected)
127 for item in expected:
127 for item in expected:
@@ -159,7 +159,7 b' def test_process_patterns_repo(backend, '
159
159
160 with mock.patch.object(IssueTrackerSettingsModel,
160 with mock.patch.object(IssueTrackerSettingsModel,
161 'get_settings', get_settings_mock):
161 'get_settings', get_settings_mock):
162 processed_text, issues = helpers.process_patterns(
162 processed_text, issues, error = helpers.process_patterns(
163 text_string, repo.repo_name, link_format)
163 text_string, repo.repo_name, link_format)
164
164
165 assert processed_text == expected_text.format(repo=repo.repo_name)
165 assert processed_text == expected_text.format(repo=repo.repo_name)
@@ -186,7 +186,7 b' def test_process_patterns_no_repo(text_s'
186
186
187 with mock.patch.object(IssueTrackerSettingsModel,
187 with mock.patch.object(IssueTrackerSettingsModel,
188 'get_global_settings', get_settings_mock):
188 'get_global_settings', get_settings_mock):
189 processed_text, issues = helpers.process_patterns(
189 processed_text, issues, errors = helpers.process_patterns(
190 text_string, '')
190 text_string, '')
191
191
192 assert processed_text == expected_text
192 assert processed_text == expected_text
@@ -211,7 +211,7 b' def test_process_patterns_non_existent_r'
211
211
212 with mock.patch.object(IssueTrackerSettingsModel,
212 with mock.patch.object(IssueTrackerSettingsModel,
213 'get_global_settings', get_settings_mock):
213 'get_global_settings', get_settings_mock):
214 processed_text, issues = helpers.process_patterns(
214 processed_text, issues, errors = helpers.process_patterns(
215 text_string, 'do-not-exist')
215 text_string, 'do-not-exist')
216
216
217 assert processed_text == expected_text
217 assert processed_text == expected_text
@@ -23,7 +23,7 b' import collections'
23
23
24 from rhodecode.lib.partial_renderer import PyramidPartialRenderer
24 from rhodecode.lib.partial_renderer import PyramidPartialRenderer
25 from rhodecode.lib.utils2 import AttributeDict
25 from rhodecode.lib.utils2 import AttributeDict
26 from rhodecode.model.db import User
26 from rhodecode.model.db import User, PullRequestReviewers
27 from rhodecode.model.notification import EmailNotificationModel
27 from rhodecode.model.notification import EmailNotificationModel
28
28
29
29
@@ -52,7 +52,8 b' def test_render_email(app, http_host_onl'
52 assert 'Email Body' in body
52 assert 'Email Body' in body
53
53
54
54
55 def test_render_pr_email(app, user_admin):
55 @pytest.mark.parametrize('role', PullRequestReviewers.ROLES)
56 def test_render_pr_email(app, user_admin, role):
56 ref = collections.namedtuple(
57 ref = collections.namedtuple(
57 'Ref', 'name, type')('fxies123', 'book')
58 'Ref', 'name, type')('fxies123', 'book')
58
59
@@ -75,13 +76,17 b' def test_render_pr_email(app, user_admin'
75 'pull_request_source_repo_url': 'x',
76 'pull_request_source_repo_url': 'x',
76
77
77 'pull_request_url': 'http://localhost/pr1',
78 'pull_request_url': 'http://localhost/pr1',
79 'user_role': role,
78 }
80 }
79
81
80 subject, body, body_plaintext = EmailNotificationModel().render_email(
82 subject, body, body_plaintext = EmailNotificationModel().render_email(
81 EmailNotificationModel.TYPE_PULL_REQUEST, **kwargs)
83 EmailNotificationModel.TYPE_PULL_REQUEST, **kwargs)
82
84
83 # subject
85 # subject
84 assert subject == '@test_admin (RhodeCode Admin) requested a pull request review. !200: "Example Pull Request"'
86 if role == PullRequestReviewers.ROLE_REVIEWER:
87 assert subject == '@test_admin (RhodeCode Admin) requested a pull request review. !200: "Example Pull Request"'
88 elif role == PullRequestReviewers.ROLE_OBSERVER:
89 assert subject == '@test_admin (RhodeCode Admin) added you as observer to pull request. !200: "Example Pull Request"'
85
90
86
91
87 def test_render_pr_update_email(app, user_admin):
92 def test_render_pr_update_email(app, user_admin):
@@ -122,7 +122,7 b' class TestPullRequestModel(object):'
122
122
123 def test_get_awaiting_my_review(self, pull_request):
123 def test_get_awaiting_my_review(self, pull_request):
124 PullRequestModel().update_reviewers(
124 PullRequestModel().update_reviewers(
125 pull_request, [(pull_request.author, ['author'], False, [])],
125 pull_request, [(pull_request.author, ['author'], False, 'reviewer', [])],
126 pull_request.author)
126 pull_request.author)
127 Session().commit()
127 Session().commit()
128
128
@@ -133,7 +133,7 b' class TestPullRequestModel(object):'
133
133
134 def test_count_awaiting_my_review(self, pull_request):
134 def test_count_awaiting_my_review(self, pull_request):
135 PullRequestModel().update_reviewers(
135 PullRequestModel().update_reviewers(
136 pull_request, [(pull_request.author, ['author'], False, [])],
136 pull_request, [(pull_request.author, ['author'], False, 'reviewer', [])],
137 pull_request.author)
137 pull_request.author)
138 Session().commit()
138 Session().commit()
139
139
@@ -43,8 +43,8 b' from rhodecode.lib.utils2 import Attribu'
43 from rhodecode.model.changeset_status import ChangesetStatusModel
43 from rhodecode.model.changeset_status import ChangesetStatusModel
44 from rhodecode.model.comment import CommentsModel
44 from rhodecode.model.comment import CommentsModel
45 from rhodecode.model.db import (
45 from rhodecode.model.db import (
46 PullRequest, Repository, RhodeCodeSetting, ChangesetStatus, RepoGroup,
46 PullRequest, PullRequestReviewers, Repository, RhodeCodeSetting, ChangesetStatus,
47 UserGroup, RepoRhodeCodeUi, RepoRhodeCodeSetting, RhodeCodeUi)
47 RepoGroup, UserGroup, RepoRhodeCodeUi, RepoRhodeCodeSetting, RhodeCodeUi)
48 from rhodecode.model.meta import Session
48 from rhodecode.model.meta import Session
49 from rhodecode.model.pull_request import PullRequestModel
49 from rhodecode.model.pull_request import PullRequestModel
50 from rhodecode.model.repo import RepoModel
50 from rhodecode.model.repo import RepoModel
@@ -968,7 +968,7 b' class PRTestUtility(object):'
968 def create_pull_request(
968 def create_pull_request(
969 self, commits=None, target_head=None, source_head=None,
969 self, commits=None, target_head=None, source_head=None,
970 revisions=None, approved=False, author=None, mergeable=False,
970 revisions=None, approved=False, author=None, mergeable=False,
971 enable_notifications=True, name_suffix=u'', reviewers=None,
971 enable_notifications=True, name_suffix=u'', reviewers=None, observers=None,
972 title=u"Test", description=u"Description"):
972 title=u"Test", description=u"Description"):
973 self.set_mergeable(mergeable)
973 self.set_mergeable(mergeable)
974 if not enable_notifications:
974 if not enable_notifications:
@@ -1005,6 +1005,7 b' class PRTestUtility(object):'
1005 'target_ref': self._default_branch_reference(target_head),
1005 'target_ref': self._default_branch_reference(target_head),
1006 'revisions': [self.commit_ids[r] for r in revisions],
1006 'revisions': [self.commit_ids[r] for r in revisions],
1007 'reviewers': reviewers or self._get_reviewers(),
1007 'reviewers': reviewers or self._get_reviewers(),
1008 'observers': observers or self._get_observers(),
1008 'title': title,
1009 'title': title,
1009 'description': description,
1010 'description': description,
1010 }
1011 }
@@ -1037,9 +1038,15 b' class PRTestUtility(object):'
1037 return reference
1038 return reference
1038
1039
1039 def _get_reviewers(self):
1040 def _get_reviewers(self):
1041 role = PullRequestReviewers.ROLE_REVIEWER
1040 return [
1042 return [
1041 (TEST_USER_REGULAR_LOGIN, ['default1'], False, []),
1043 (TEST_USER_REGULAR_LOGIN, ['default1'], False, role, []),
1042 (TEST_USER_REGULAR2_LOGIN, ['default2'], False, []),
1044 (TEST_USER_REGULAR2_LOGIN, ['default2'], False, role, []),
1045 ]
1046
1047 def _get_observers(self):
1048 return [
1049
1043 ]
1050 ]
1044
1051
1045 def update_source_repository(self, head=None):
1052 def update_source_repository(self, head=None):
General Comments 0
You need to be logged in to leave comments. Login now