##// END OF EJS Templates
release: Merge default into stable for release preparation
marcink -
r4357:77bbe14f merge stable
parent child Browse files
Show More

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

@@ -0,0 +1,156 b''
1 |RCE| 4.19.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2020-05-22
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Pull requests: add information about changes in source repositories in pull-request show page.
14 Fixes #5611, Fixes #5561
15 Added new preview for size (commits/files) of PRs before opening, this is now based
16 on the special logic that calculates common ancestor and has access to preview diff
17 Store common ancestor in DB so updates of pull-requests are consistent
18 - Pull requests: fixed case for GIT repositories when a merge check failed due to
19 merge conflicts the pull request wrongly reported missing commits.
20 we're now searching for dangling commits in a repo that has them and cannot see them
21 because of failed merge checks.
22 - Pull requests: allow filter displayed results by author
23 - Pull requests: added filters to my account pull requests page.
24 - Quick search: added ability to search for pull-requests using `pr:` prefix.
25 Permissions are checked against the access to target repositories, and users
26 can now search for pull request number, description or title.
27 - UI: replaced js prompts with sweet-alert prompts.
28 - SVN: bumped shipped SVN to 1.13.0 release.
29 - Integration Hooks: added new hooks for comments on pull requests and commits.
30 Allows writing custom actions on top of commenting.
31 E.g `@CI-BOT re-test` could trigger CI job to re-test a pull requests or commit.
32 Added new rcextension hooks, Fixes #5583, and added examples on how to trigger CI build on certain comments.
33 - Exception tracker: added possibility to send notification email when server encountered an unhandled exception.
34 new .ini file flag: `exception_tracker.send_email = false` and `exception_tracker.send_email_recipients =`
35 can be set to enable this function.
36 - Mercurial: enable enhanced diffs for Mercurial that show context of changed functions inside the diff.
37 This makes diff actually more consistent with how GIT backend shows them. Fixes #5614
38
39
40 General
41 ^^^^^^^
42
43 - Pull requests: fixed small UI glitches in pull request view.
44 - System Info: Python packages now expose the package location info.
45 - API: added new flag to comment api to disable email sending when creating a comment.
46 - Exceptions: don't report lookup errors as exceptions stored in the exception store.
47 Those are regular not found problems that don't indicate any exceptional case
48 also make the errors report nicer, not as KeyError, or generic Exception
49 - Exception tracker: store request info if available to track which URL caused an error.
50 - Integrations: handle new commenting events and optimize calls for Jira/Redmine
51 Speed up issue fetching by optimizing how Jira/Redmine client behaves
52 For redmine we don't iterate issues anymore which is *much* faster, and makes pushes with tickets faster.
53 - SVN: allow to specify any svn compatible version string not only hardcoded values.
54 The new SVN code allows to specify this by numeric values now. e.g 1.13 etc.
55 Fixes #5605.
56 - Emails: added `premailer` parsing for inline style formatting to make emails render
57 nicer on all email clients.
58 - Repositories: switched repo type selector to radio buttons and preserve order of
59 enabled backends inside .ini files.
60 - Repositories: show recommendation for updating hooks if they are outdated.
61 - Files: add pre-commit checks on file edit/delete/add operations. This prevents
62 loosing content while editing when repositories changes during those operations.
63 Fixes #5607.
64 - Files: changed the copy path label to indicate we're actually copying only the path.
65 Added copy permalink helper to copy the url quickly. Fixes #5602
66 - LDAP: updated ldap plugin to help with debug and support by extending logging and
67 improving error messages.
68 - LDAP: fixed example LDAPs port.
69 - Dependencies: bump redmine client.
70 - Dependencies: bumped bleach==3.1.3
71 - Dependencies: bumped webtest==2.0.34
72 - Dependencies: bumped packaging==20.3
73 - Dependencies: bumped pyparsing==2.4.7
74 - Dependencies: bumped sqlalchemy==1.3.15
75 - Dependencies: bumped hupper==1.10.2
76 - Dependencies: bumped alembic==1.4.2
77 - Dependencies: bumped wcwidth==0.1.9
78 - Dependencies: bumped python-ldap==3.2.0
79 - Dependencies: bumped importlib-metadata==1.5.0
80 - Dependencies: bumped redis==3.4.1
81 - Dependencies: bumped importlib-metadata==1.6.0
82 - Dependencies: bumped pytz==2019.3
83 - Dependencies: bumped paste==3.4.0
84 - Dependencies: bumped weberror==0.13.1
85 - Dependencies: bumped pyparsing==2.4.6
86 - Dependencies: bumped ipdb==0.13.2
87 - Dependencies: bumped pastedeploy==2.1.0
88 - Dependencies: bumped docutils==0.16.0
89 - Dependencies: bumped pyramid-debugtoolbar==4.6.1
90 - Dependencies: bumped gevent==1.5.0
91 - Dependencies: bumped psutil==5.7.0
92
93
94 Security
95 ^^^^^^^^
96
97 - Logging: expose usernames in the logs for each request made to RhodeCode.
98 This enables auditing capabilities for all actions against the web interface.
99 - Users: increased security on the way we're displaying authentication tokens.
100 We don't expose all on single page. Request needs a validation before viewing of each token.
101 - Logging: added some nicer logging for file path ACL checks.
102 - Audit Log: extend the commit api data with references to commit_id or pull_request_id.
103 This allows tracking those in the audit-logs.
104
105
106 Performance
107 ^^^^^^^^^^^
108
109 - Exception Tracker: optimized the check for smtp_server before doing heavy lifting
110 of exception email sending.
111 - Auth: enabled cache flags for fetching ACL ids.
112 Those are now safe to cache since we have a proper cache invalidation logic for
113 permissions of users, for lots of repo this makes our goto switcher much much faster.
114 - Application: use simpler way to extract default_user_id, this will be now registered
115 at server boot, reducing number of times we fetch this from database.
116 - Pull requests: changed reviewers metadata function for optimizing the diff calculations.
117 We're now doing a single request to calculate reviewers and diff preview instead of twice like before.
118
119
120 Fixes
121 ^^^^^
122
123 - GIT: fixed readme searcher for Git repositories using libgit2 and non-ascii directories.
124 - Full text search: fixed error while highlighting special search terms e.g 'enabled \= '
125 - Full text search: fixed problems with non-ascii files indexing.
126 - Diffs: improve text on unresolved comments attached to files that no longer exist in the review.
127 Fixes #5615.
128 - Auth: fixed generation of authomatic secrets for new plugins.
129 - Auth: failsafe github auth if it doesn't provide full name for users.
130 - Permissions: fixed problem with permissions changes from permission page due to missing cache flush.
131 This caused certain permission changed be visible after some time of the edit.
132 We now ensure *all* caches used for permissions are properly flushed right after the change.
133 - SVN: explicitly specify tunnel-user to properly map rhodecode username on svn commit
134 via SSH backend. Fixes #5608.
135 - SVN: fixed case of wrong extracted repository name for SSH backend. In cases
136 where we commit to a nested subdirs SVN reported the access path with the subdir paths in it.
137 We couldn't then match that extended name into proper rhodecode repository for ACL checks.
138 Current implementation gives an slight overhead as we have to lookup all repositories.
139 Fixes #5606
140 - SVN: fixed problem with special characters inside subdirectories.
141 - SVN: fixed SVN refs switcher on files that used old format of diff url. Fixes #5599, #5610
142 - Search: remove excessive quoting on search pagination. Fixes #5604
143 - File browser: fixed the repo switcher `?at=` flag being lost when walking on the file tree.
144 - File browser: fixed unicode problems on image preview, and make images center, no-stretch.
145 - DB migrations: fixed db migrate for latest sqlite version.
146 - Feed generator: fixed missing utc definition that could cause server 500 error.
147
148
149 Upgrade notes
150 ^^^^^^^^^^^^^
151
152 - RhodeCode has been tested on CentOS/RHEL 8 and we added those as officially supported platforms.
153 - This release introduces lots of optimizations and changes how the pull requests reviewers,
154 and diff preview is made. We cut the pull request creation time by 50%.
155 Please look closer to this new logic na report any potential problems with this change.
156 - SVN was bumped to 1.13 version. No newline at end of file
@@ -0,0 +1,60 b''
1 # Example to trigger a CI call action on specific comment text, e.g chatops and ci
2 # rebuild on mention of ci bot
3
4 @has_kwargs({
5 'repo_name': '',
6 'repo_type': '',
7 'description': '',
8 'private': '',
9 'created_on': '',
10 'enable_downloads': '',
11 'repo_id': '',
12 'user_id': '',
13 'enable_statistics': '',
14 'clone_uri': '',
15 'fork_id': '',
16 'group_id': '',
17 'created_by': '',
18 'repository': '',
19 'comment': '',
20 'commit': ''
21 })
22 def _comment_commit_repo_hook(*args, **kwargs):
23 """
24 POST CREATE REPOSITORY COMMENT ON COMMIT HOOK. This function will be executed after
25 a comment is made on this repository commit.
26
27 """
28 from .helpers import http_call, extra_fields
29 from .utils import UrlTemplate
30 # returns list of dicts with key-val fetched from extra fields
31 repo_extra_fields = extra_fields.run(**kwargs)
32
33 import rhodecode
34 from rc_integrations.jenkins_ci import csrf_call, get_auth, requests_retry_call
35
36 endpoint_url = extra_fields.get_field(
37 repo_extra_fields, key='ci_endpoint_url',
38 default='http://ci.rc.com/job/rc-ce-commits/build?COMMIT_ID=${commit}')
39 mention_text = extra_fields.get_field(
40 repo_extra_fields, key='ci_mention_text',
41 default='@jenkins build')
42
43 endpoint_url = UrlTemplate(endpoint_url).safe_substitute(
44 commit=kwargs['commit']['raw_id'])
45
46 trigger_ci = False
47 comment = kwargs['comment']['comment_text']
48 if mention_text in comment:
49 trigger_ci = True
50
51 if trigger_ci is False:
52 return HookResponse(0, '')
53
54 # call some CI based on the special coment mention marker
55 data = {
56 'project': kwargs['repository'],
57 }
58 response = http_call.run(url=endpoint_url, params=data)
59
60 return HookResponse(0, '') No newline at end of file
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,5 +1,5 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.18.3
2 current_version = 4.19.0
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
@@ -5,25 +5,20 b' done = false'
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
9
8
10 [task:fixes_on_stable]
9 [task:fixes_on_stable]
11 done = true
12
10
13 [task:pip2nix_generated]
11 [task:pip2nix_generated]
14 done = true
15
12
16 [task:changelog_updated]
13 [task:changelog_updated]
17 done = true
18
14
19 [task:generate_api_docs]
15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21
18
22 [release]
19 [release]
23 state = prepared
20 state = in_progress
24 version = 4.18.3
21 version = 4.19.0
25
26 [task:updated_translation]
27
22
28 [task:generate_js_routes]
23 [task:generate_js_routes]
29
24
@@ -1,10 +1,11 b''
1
1
2 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build generate-pkgs
2 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build generate-pkgs pip-packages
3
3
4 NODE_PATH=./node_modules
4 NODE_PATH=./node_modules
5 WEBPACK=./node_binaries/webpack
5 WEBPACK=./node_binaries/webpack
6 GRUNT=./node_binaries/grunt
6 GRUNT=./node_binaries/grunt
7
7 # set by: PATH_TO_OUTDATED_PACKAGES=/some/path/outdated_packages.py
8 OUTDATED_PACKAGES = ${PATH_TO_OUTDATED_PACKAGES}
8
9
9 clean:
10 clean:
10 make test-clean
11 make test-clean
@@ -55,6 +56,9 b' web-build:'
55 generate-pkgs:
56 generate-pkgs:
56 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
57 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
57
58
59 pip-packages:
60 python ${OUTDATED_PACKAGES}
61
58 generate-js-pkgs:
62 generate-js-pkgs:
59 rm -rf node_modules && \
63 rm -rf node_modules && \
60 nix-shell pkgs/shell-generate.nix --command "node2nix --input package.json -o pkgs/node-packages.nix -e pkgs/node-env.nix -c pkgs/node-default.nix -d --flatten --nodejs-8" && \
64 nix-shell pkgs/shell-generate.nix --command "node2nix --input package.json -o pkgs/node-packages.nix -e pkgs/node-env.nix -c pkgs/node-default.nix -d --flatten --nodejs-8" && \
@@ -350,6 +350,17 b' labs_settings_active = true'
350 ; This is used to store exception from RhodeCode in shared directory
350 ; This is used to store exception from RhodeCode in shared directory
351 #exception_tracker.store_path =
351 #exception_tracker.store_path =
352
352
353 ; Send email with exception details when it happens
354 #exception_tracker.send_email = false
355
356 ; Comma separated list of recipients for exception emails,
357 ; e.g admin@rhodecode.com,devops@rhodecode.com
358 ; Can be left empty, then emails will be sent to ALL super-admins
359 #exception_tracker.send_email_recipients =
360
361 ; optional prefix to Add to email Subject
362 #exception_tracker.email_prefix = [RHODECODE ERROR]
363
353 ; File store configuration. This is used to store and serve uploaded files
364 ; File store configuration. This is used to store and serve uploaded files
354 file_store.enabled = true
365 file_store.enabled = true
355
366
@@ -605,8 +616,9 b' vcs.backends = hg, git, svn'
605 vcs.connection_timeout = 3600
616 vcs.connection_timeout = 3600
606
617
607 ; Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
618 ; Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
608 ; Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
619 ; Set a numeric version for your current SVN e.g 1.8, or 1.12
609 #vcs.svn.compatible_version = pre-1.8-compatible
620 ; Legacy available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
621 #vcs.svn.compatible_version = 1.8
610
622
611
623
612 ; ####################################################
624 ; ####################################################
@@ -301,6 +301,17 b' labs_settings_active = true'
301 ; This is used to store exception from RhodeCode in shared directory
301 ; This is used to store exception from RhodeCode in shared directory
302 #exception_tracker.store_path =
302 #exception_tracker.store_path =
303
303
304 ; Send email with exception details when it happens
305 #exception_tracker.send_email = false
306
307 ; Comma separated list of recipients for exception emails,
308 ; e.g admin@rhodecode.com,devops@rhodecode.com
309 ; Can be left empty, then emails will be sent to ALL super-admins
310 #exception_tracker.send_email_recipients =
311
312 ; optional prefix to Add to email Subject
313 #exception_tracker.email_prefix = [RHODECODE ERROR]
314
304 ; File store configuration. This is used to store and serve uploaded files
315 ; File store configuration. This is used to store and serve uploaded files
305 file_store.enabled = true
316 file_store.enabled = true
306
317
@@ -556,8 +567,9 b' vcs.backends = hg, git, svn'
556 vcs.connection_timeout = 3600
567 vcs.connection_timeout = 3600
557
568
558 ; Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
569 ; Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
559 ; Available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
570 ; Set a numeric version for your current SVN e.g 1.8, or 1.12
560 #vcs.svn.compatible_version = pre-1.8-compatible
571 ; Legacy available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
572 #vcs.svn.compatible_version = 1.8
561
573
562
574
563 ; ####################################################
575 ; ####################################################
@@ -59,3 +59,46 b' exit the ishell after the execution::'
59
59
60 echo "%run repo_delete_task.py" | rccontrol ishell enterprise-1
60 echo "%run repo_delete_task.py" | rccontrol ishell enterprise-1
61
61
62
63
64
65 Bulk edit permissions for all repositories or groups
66 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
67
68 In case when a permissions should be applied in bulk here are two ways to apply
69 the permissions onto *all* repositories and/or repository groups.
70
71 1) Start by running the interactive ishell interface
72
73 .. code-block:: bash
74 :dedent: 1
75
76 # starts the ishell interactive prompt
77 $ rccontrol ishell enterprise-1
78
79
80 2a) Add user called 'admin' into all repositories with write permission.
81 Permissions can be also `repository.read`, `repository.admin`, `repository.none`
82
83 .. code-block:: python
84 :dedent: 1
85
86 In [1]: from rhodecode.model.repo import RepoModel
87 In [2]: user = User.get_by_username('admin')
88 In [3]: permission_name = 'repository.write'
89 In [4]: for repo in Repository.get_all():
90 ...: RepoModel().grant_user_permission(repo, user, permission_name)
91 ...: Session().commit()
92
93 2b) Add user called 'admin' into all repository groups with write permission.
94 Permissions can be also can be `group.read`, `group.admin`, `group.none`
95
96 .. code-block:: python
97 :dedent: 1
98
99 In [1]: from rhodecode.model.repo import RepoModel
100 In [2]: user = User.get_by_username('admin')
101 In [3]: permission_name = 'group.write'
102 In [4]: for repo_group in RepoGroup.get_all():
103 ...: RepoGroupModel().grant_user_permission(repo_group, user, permission_name)
104 ...: Session().commit() No newline at end of file
@@ -22,8 +22,9 b' Supported Operating Systems'
22 Linux
22 Linux
23 ^^^^^
23 ^^^^^
24
24
25 * Ubuntu 14.04
25 * Ubuntu 14.04+
26 * CentOS 6.2 and 7
26 * CentOS 6.2, 7 and 8
27 * RHEL 6.2, 7 and 8
27 * Debian 7.8
28 * Debian 7.8
28 * RedHat Fedora
29 * RedHat Fedora
29 * Arch Linux
30 * Arch Linux
@@ -39,7 +39,7 b' close_pull_request'
39 comment_pull_request
39 comment_pull_request
40 --------------------
40 --------------------
41
41
42 .. py:function:: comment_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, message=<Optional:None>, commit_id=<Optional:None>, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, extra_recipients=<Optional:[]>, userid=<Optional:<OptionalAttr:apiuser>>)
42 .. py:function:: comment_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, message=<Optional:None>, commit_id=<Optional:None>, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, extra_recipients=<Optional:[]>, userid=<Optional:<OptionalAttr:apiuser>>, send_email=<Optional:True>)
43
43
44 Comment on the pull request specified with the `pullrequestid`,
44 Comment on the pull request specified with the `pullrequestid`,
45 in the |repo| specified by the `repoid`, and optionally change the
45 in the |repo| specified by the `repoid`, and optionally change the
@@ -70,6 +70,8 b' comment_pull_request'
70 :type extra_recipients: Optional(list)
70 :type extra_recipients: Optional(list)
71 :param userid: Comment on the pull request as this user
71 :param userid: Comment on the pull request as this user
72 :type userid: Optional(str or int)
72 :type userid: Optional(str or int)
73 :param send_email: Define if this comment should also send email notification
74 :type send_email: Optional(bool)
73
75
74 Example output:
76 Example output:
75
77
@@ -160,6 +162,7 b' get_pull_request'
160 "status" : "<status>",
162 "status" : "<status>",
161 "created_on": "<date_time_created>",
163 "created_on": "<date_time_created>",
162 "updated_on": "<date_time_updated>",
164 "updated_on": "<date_time_updated>",
165 "versions": "<number_or_versions_of_pr>",
163 "commit_ids": [
166 "commit_ids": [
164 ...
167 ...
165 "<commit_id>",
168 "<commit_id>",
@@ -249,7 +252,9 b' get_pull_request_comments'
249 },
252 },
250 "comment_text": "Example text",
253 "comment_text": "Example text",
251 "comment_type": null,
254 "comment_type": null,
252 "pull_request_version": null
255 "pull_request_version": null,
256 "comment_commit_id": None,
257 "comment_pull_request_id": <pull_request_id>
253 }
258 }
254 ],
259 ],
255 error : null
260 error : null
@@ -28,7 +28,7 b' add_field_to_repo'
28 comment_commit
28 comment_commit
29 --------------
29 --------------
30
30
31 .. py:function:: comment_commit(apiuser, repoid, commit_id, message, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, extra_recipients=<Optional:[]>, userid=<Optional:<OptionalAttr:apiuser>>)
31 .. py:function:: comment_commit(apiuser, repoid, commit_id, message, status=<Optional:None>, comment_type=<Optional:u'note'>, resolves_comment_id=<Optional:None>, extra_recipients=<Optional:[]>, userid=<Optional:<OptionalAttr:apiuser>>, send_email=<Optional:True>)
32
32
33 Set a commit comment, and optionally change the status of the commit.
33 Set a commit comment, and optionally change the status of the commit.
34
34
@@ -52,6 +52,8 b' comment_commit'
52 :type extra_recipients: Optional(list)
52 :type extra_recipients: Optional(list)
53 :param userid: Set the user name of the comment creator.
53 :param userid: Set the user name of the comment creator.
54 :type userid: Optional(str or int)
54 :type userid: Optional(str or int)
55 :param send_email: Define if this comment should also send email notification
56 :type send_email: Optional(bool)
55
57
56 Example error output:
58 Example error output:
57
59
@@ -3,6 +3,21 b''
3 search methods
3 search methods
4 ==============
4 ==============
5
5
6 get_audit_logs
7 --------------
8
9 .. py:function:: get_audit_logs(apiuser, query)
10
11 return full audit logs based on the query.
12
13 Please see `example query in admin > settings > audit logs` for examples
14
15 :param apiuser: This is filled automatically from the |authtoken|.
16 :type apiuser: AuthUser
17 :param query: filter query, example: action:repo.artifact.add date:[20200401 TO 20200601]"
18 :type query: str
19
20
6 search
21 search
7 ------
22 ------
8
23
@@ -68,7 +68,7 b' Below is example setup that can be used '
68 # Multiple servers can be specified using commas
68 # Multiple servers can be specified using commas
69
69
70 *option*: `port` => `389`
70 *option*: `port` => `389`
71 # Custom port that the LDAP server is listening on. Default value is: 389, use 689 for LDAPS(SSL)
71 # Custom port that the LDAP server is listening on. Default value is: 389, use 636 for LDAPS(SSL)
72
72
73 *option*: `timeout` => `300`
73 *option*: `timeout` => `300`
74 # Timeout for LDAP connection
74 # Timeout for LDAP connection
@@ -58,7 +58,7 b' Below is example setup that can be used '
58 # Multiple servers can be specified using commas
58 # Multiple servers can be specified using commas
59
59
60 *option*: `port` => `389`
60 *option*: `port` => `389`
61 # Custom port that the LDAP server is listening on. Default value is: 389, use 689 for LDAPS(SSL)
61 # Custom port that the LDAP server is listening on. Default value is: 389, use 636 for LDAPS(SSL)
62
62
63 *option*: `timeout` => `300`
63 *option*: `timeout` => `300`
64 # Timeout for LDAP connection
64 # Timeout for LDAP connection
@@ -22,7 +22,7 b' authentication::'
22 # Multiple servers can be specified using commas
22 # Multiple servers can be specified using commas
23
23
24 *option*: `port` => `389`
24 *option*: `port` => `389`
25 # Custom port that the LDAP server is listening on. Default value is: 389, use 689 for LDAPS(SSL)
25 # Custom port that the LDAP server is listening on. Default value is: 389, use 636 for LDAPS(SSL)
26
26
27 *option*: `timeout` => `300`
27 *option*: `timeout` => `300`
28 # Timeout for LDAP connection
28 # Timeout for LDAP connection
@@ -19,7 +19,7 b' Setup Nix Package Manager'
19
19
20 To install the Nix Package Manager, please run::
20 To install the Nix Package Manager, please run::
21
21
22 $ curl https://nixos.org/releases/nix/nix-2.0.4/install | sh
22 $ curl https://releases.nixos.org/nix/nix-2.3.4/install | sh
23
23
24 or go to https://nixos.org/nix/ and follow the installation instructions.
24 or go to https://nixos.org/nix/ and follow the installation instructions.
25 Once this is correctly set up on your system, you should be able to use the
25 Once this is correctly set up on your system, you should be able to use the
@@ -47,12 +47,12 b' Switch nix to the latest STABLE channel'
47
47
48 run::
48 run::
49
49
50 nix-channel --add https://nixos.org/channels/nixos-18.03 nixpkgs
50 nix-channel --add https://nixos.org/channels/nixos-20.03 nixpkgs
51
51
52 Followed by::
52 Followed by::
53
53
54 nix-channel --update
54 nix-channel --update
55 nix-env -i nix-2.0.4
55 nix-env -i nix-2.3.4
56
56
57
57
58 Install required binaries
58 Install required binaries
@@ -3,20 +3,6 b''
3 Known Issues
3 Known Issues
4 ============
4 ============
5
5
6 Subversion Issues
7 -----------------
8
9 Limited |svn| support has been achieved for this release,
10 |release|. The following known issues are in development for improvement.
11
12 * |svn| |repo| creation:
13 Terminating the VCS Server during remote importation of |svn| |repos| leaves
14 the the process still running in the background.
15
16 * |svn| |repo| checkin/checkout:
17 |svn| cloning support is not enabled by default. Please contact support if
18 you want it enabled.
19
20 Windows Upload
6 Windows Upload
21 --------------
7 --------------
22
8
@@ -49,12 +35,16 b' shipped with the optimal configuration a'
49 To fix this issue, upgrade to |RCE| 3.3.2 or greater, and if you discover
35 To fix this issue, upgrade to |RCE| 3.3.2 or greater, and if you discover
50 memory consumption issues check the VCS Server settings.
36 memory consumption issues check the VCS Server settings.
51
37
52 Fedora 23 / Ubuntu 18.04
38 Newer Operating system locales
53 ------------------------
39 ------------------------------
54
40
55 |RCC| has a know problem with locales, due to changes in glibc 2.27+ which affects
41 |RCC| has a know problem with locales, due to changes in glibc 2.27+ which affects
56 the local-archive format, which is now incompatible with our used glibc 2.26.
42 the local-archive format, which is now incompatible with our used glibc 2.26.
57
43
44 Mostly affected are:
45 - Fedora 23+
46 - Ubuntu 18.04
47 - CentOS / RHEL 8
58
48
59 To work around this problem, you need set path to ``$LOCAL_ARCHIVE`` to the
49 To work around this problem, you need set path to ``$LOCAL_ARCHIVE`` to the
60 locale package in older pre glibc 2.27 format, or set `LC_ALL=C` in your enviroment.
50 locale package in older pre glibc 2.27 format, or set `LC_ALL=C` in your enviroment.
@@ -74,8 +64,15 b' 2. Point ``$LOCAL_ARCHIVE`` to the local'
74
64
75 $ export LOCALE_ARCHIVE=/home/USER/locale-archive # change to your path
65 $ export LOCALE_ARCHIVE=/home/USER/locale-archive # change to your path
76
66
77 This can either added in `~/.rccontrol/supervisor/supervisord.ini`
67 This should be added *both* in `enviroment` variable of `~/.rccontrol/supervisor/supervisord.ini`
78 or in user .bashrc/.zshrc etc, or via a startup script that
68 e.g
69
70 ```
71 [supervisord]
72 environment = HOME=/home/user/rhodecode,LOCALE_ARCHIVE=/YOUR-PATH/locale-archive`
73 ```
74
75 and in user .bashrc/.zshrc etc, or via a startup script that
79 runs `rccontrol self-init`
76 runs `rccontrol self-init`
80
77
81 If you happen to be running |RCC| from systemd, use the following
78 If you happen to be running |RCC| from systemd, use the following
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.19.0.rst
12 release-notes-4.18.3.rst
13 release-notes-4.18.3.rst
13 release-notes-4.18.2.rst
14 release-notes-4.18.2.rst
14 release-notes-4.18.1.rst
15 release-notes-4.18.1.rst
@@ -1,7 +1,7 b''
1 sphinx==1.8.2
1 sphinx==1.8.2
2 six==1.11.0
2 six==1.11.0
3 sphinx_rtd_theme==0.4.1
3 sphinx_rtd_theme==0.4.1
4 docutils==0.14.0
4 docutils==0.16.0
5 pygments==2.3.0
5 pygments==2.3.0
6 markupsafe==1.0.0
6 markupsafe==1.0.0
7 jinja2==2.9.6
7 jinja2==2.9.6
@@ -35,7 +35,8 b''
35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
38 "<%= dirs.js.node_modules %>/dropzone/dist/dropzone.js",
38 "<%= dirs.js.node_modules %>/dropzone/dist/min/dropzone.min.js",
39 "<%= dirs.js.node_modules %>/sweetalert2/dist/sweetalert2.min.js",
39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
41 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
41 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
42 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
@@ -23,6 +23,7 b''
23 "grunt-contrib-watch": "^0.6.1",
23 "grunt-contrib-watch": "^0.6.1",
24 "grunt-webpack": "^3.1.3",
24 "grunt-webpack": "^3.1.3",
25 "grunt-contrib-uglify": "^4.0.1",
25 "grunt-contrib-uglify": "^4.0.1",
26 "sweetalert2": "^9.10.12",
26 "jquery": "1.11.3",
27 "jquery": "1.11.3",
27 "mark.js": "8.11.1",
28 "mark.js": "8.11.1",
28 "jshint": "^2.9.1-rc3",
29 "jshint": "^2.9.1-rc3",
This diff has been collapsed as it changes many lines, (1065 lines changed) Show them Hide them
@@ -49,13 +49,13 b' let'
49 sha512 = "7+TPEAfWsRdhj1Y8UeF1759ktpVu+c3sG16rJiUC3wF9+woQ9xI1zUm2d59i7Yc3aDEJrR/Q8Y262KlOvyGVNg==";
49 sha512 = "7+TPEAfWsRdhj1Y8UeF1759ktpVu+c3sG16rJiUC3wF9+woQ9xI1zUm2d59i7Yc3aDEJrR/Q8Y262KlOvyGVNg==";
50 };
50 };
51 };
51 };
52 "@polymer/iron-autogrow-textarea-3.0.1" = {
52 "@polymer/iron-autogrow-textarea-3.0.3" = {
53 name = "_at_polymer_slash_iron-autogrow-textarea";
53 name = "_at_polymer_slash_iron-autogrow-textarea";
54 packageName = "@polymer/iron-autogrow-textarea";
54 packageName = "@polymer/iron-autogrow-textarea";
55 version = "3.0.1";
55 version = "3.0.3";
56 src = fetchurl {
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.1.tgz";
57 url = "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.3.tgz";
58 sha512 = "FgSL7APrOSL9Vu812sBCFlQ17hvnJsBAV2C2e1UAiaHhB+dyfLq8gGdGUpqVWuGJ50q4Y/49QwCNnLf85AdVYA==";
58 sha512 = "5r0VkWrIlm0JIp5E5wlnvkw7slK72lFRZXncmrsLZF+6n1dg2rI8jt7xpFzSmUWrqpcyXwyKaGaDvUjl3j4JLA==";
59 };
59 };
60 };
60 };
61 "@polymer/iron-behaviors-3.0.1" = {
61 "@polymer/iron-behaviors-3.0.1" = {
@@ -76,13 +76,13 b' let'
76 sha512 = "aDr0cbCNVq49q+pOqa6CZutFh+wWpwPMLpEth9swx+GkAj+gCURhuQkaUYhIo5f2egDbEioR1aeHMnPlU9dQZA==";
76 sha512 = "aDr0cbCNVq49q+pOqa6CZutFh+wWpwPMLpEth9swx+GkAj+gCURhuQkaUYhIo5f2egDbEioR1aeHMnPlU9dQZA==";
77 };
77 };
78 };
78 };
79 "@polymer/iron-fit-behavior-3.0.1" = {
79 "@polymer/iron-fit-behavior-3.0.2" = {
80 name = "_at_polymer_slash_iron-fit-behavior";
80 name = "_at_polymer_slash_iron-fit-behavior";
81 packageName = "@polymer/iron-fit-behavior";
81 packageName = "@polymer/iron-fit-behavior";
82 version = "3.0.1";
82 version = "3.0.2";
83 src = fetchurl {
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.1.tgz";
84 url = "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.2.tgz";
85 sha512 = "/M0B1L30k31vmwNBaGuZcxzUAhJSHoGccb/DF0CDKI/hT8UlkTvcyemaWdOpmHHLgY52ceKIkRwA3AeXrKyvaQ==";
85 sha512 = "JndryJYbBR3gSN5IlST4rCHsd01+OyvYpRO6z5Zd3C6u5V/m07TwAtcf3aXwZ8WBNt2eLG28OcvdSO7XR2v2pg==";
86 };
86 };
87 };
87 };
88 "@polymer/iron-flex-layout-3.0.1" = {
88 "@polymer/iron-flex-layout-3.0.1" = {
@@ -112,13 +112,13 b' let'
112 sha512 = "pWguPugiLYmWFV9UWxLWzZ6gm4wBwQdDy4VULKwdHCqR7OP7u98h+XDdGZsSlDPv6qoryV/e3tGHlTIT0mbzJA==";
112 sha512 = "pWguPugiLYmWFV9UWxLWzZ6gm4wBwQdDy4VULKwdHCqR7OP7u98h+XDdGZsSlDPv6qoryV/e3tGHlTIT0mbzJA==";
113 };
113 };
114 };
114 };
115 "@polymer/iron-overlay-behavior-3.0.2" = {
115 "@polymer/iron-overlay-behavior-3.0.3" = {
116 name = "_at_polymer_slash_iron-overlay-behavior";
116 name = "_at_polymer_slash_iron-overlay-behavior";
117 packageName = "@polymer/iron-overlay-behavior";
117 packageName = "@polymer/iron-overlay-behavior";
118 version = "3.0.2";
118 version = "3.0.3";
119 src = fetchurl {
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.2.tgz";
120 url = "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.3.tgz";
121 sha512 = "j1qmt6mJHCwpe1mKOvqK5kcCUPQr5LSrlqpgRDbUuLgUfNJ/vGTipjrkBlfbEUagm5FEQdc1VLPLSQP6WVuP9g==";
121 sha512 = "Q/Fp0+uOQQ145ebZ7T8Cxl4m1tUKYjyymkjcL2rXUm+aDQGb1wA1M1LYxUF5YBqd+9lipE0PTIiYwA2ZL/sznA==";
122 };
122 };
123 };
123 };
124 "@polymer/iron-resizable-behavior-3.0.1" = {
124 "@polymer/iron-resizable-behavior-3.0.1" = {
@@ -157,13 +157,13 b' let'
157 sha512 = "JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg==";
157 sha512 = "JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg==";
158 };
158 };
159 };
159 };
160 "@polymer/paper-ripple-3.0.1" = {
160 "@polymer/paper-ripple-3.0.2" = {
161 name = "_at_polymer_slash_paper-ripple";
161 name = "_at_polymer_slash_paper-ripple";
162 packageName = "@polymer/paper-ripple";
162 packageName = "@polymer/paper-ripple";
163 version = "3.0.1";
163 version = "3.0.2";
164 src = fetchurl {
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.1.tgz";
165 url = "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.2.tgz";
166 sha512 = "dgOe12GyCF1VZBLUQqnzGWlf3xb255FajNCVB1VFj/AtskYtoamnafa7m3a+1vs+C8qbg4Benn5KwgxVDSW4cg==";
166 sha512 = "DnLNvYIMsiayeICroYxx6Q6Hg1cUU8HN2sbutXazlemAlGqdq80qz3TIaVdbpbt/pvjcFGX2HtntMlPstCge8Q==";
167 };
167 };
168 };
168 };
169 "@polymer/paper-spinner-3.0.2" = {
169 "@polymer/paper-spinner-3.0.2" = {
@@ -211,13 +211,13 b' let'
211 sha512 = "yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==";
211 sha512 = "yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==";
212 };
212 };
213 };
213 };
214 "@polymer/polymer-3.3.0" = {
214 "@polymer/polymer-3.3.1" = {
215 name = "_at_polymer_slash_polymer";
215 name = "_at_polymer_slash_polymer";
216 packageName = "@polymer/polymer";
216 packageName = "@polymer/polymer";
217 version = "3.3.0";
217 version = "3.3.1";
218 src = fetchurl {
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.3.0.tgz";
219 url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.3.1.tgz";
220 sha512 = "rij7suomS7DxdBamnwr/Xa0V5hpypf7I9oYKseF2FWz5Xh2a3wJNpVjgJy1adXVCxqIyPhghsrthnfCt7EblsQ==";
220 sha512 = "8KaB48tzyMjdsHdxo5KvCAaqmTe7rYDzQAoj/pyEfq9Fp4YfUaS+/xqwYj0GbiDAUNzwkmEQ7dw9cgnRNdKO8A==";
221 };
221 };
222 };
222 };
223 "@types/clone-0.1.30" = {
223 "@types/clone-0.1.30" = {
@@ -229,13 +229,13 b' let'
229 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
229 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
230 };
230 };
231 };
231 };
232 "@types/node-6.14.9" = {
232 "@types/node-6.14.10" = {
233 name = "_at_types_slash_node";
233 name = "_at_types_slash_node";
234 packageName = "@types/node";
234 packageName = "@types/node";
235 version = "6.14.9";
235 version = "6.14.10";
236 src = fetchurl {
236 src = fetchurl {
237 url = "https://registry.npmjs.org/@types/node/-/node-6.14.9.tgz";
237 url = "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz";
238 sha512 = "leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w==";
238 sha512 = "pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==";
239 };
239 };
240 };
240 };
241 "@types/parse5-2.2.34" = {
241 "@types/parse5-2.2.34" = {
@@ -409,22 +409,22 b' let'
409 sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==";
409 sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==";
410 };
410 };
411 };
411 };
412 "@webcomponents/shadycss-1.9.2" = {
412 "@webcomponents/shadycss-1.9.6" = {
413 name = "_at_webcomponents_slash_shadycss";
413 name = "_at_webcomponents_slash_shadycss";
414 packageName = "@webcomponents/shadycss";
414 packageName = "@webcomponents/shadycss";
415 version = "1.9.2";
415 version = "1.9.6";
416 src = fetchurl {
416 src = fetchurl {
417 url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.2.tgz";
417 url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.6.tgz";
418 sha512 = "GsD7RpDVrVdgC6e+D8zQia8RGNmEGQ9/qotnVPQYPrIXhGS5xSt6ZED9YmuHz3HbLqY+E54tE1EK3tjLzSCGrw==";
418 sha512 = "5fFjvP0jQJZoXK6YzYeYcIDGJ5oEsdjr1L9VaYLw5yxNd4aRz4srMpwCwldeNG0A6Hvr9igbG7fCsBeiiCXd7A==";
419 };
419 };
420 };
420 };
421 "@webcomponents/webcomponentsjs-2.3.0" = {
421 "@webcomponents/webcomponentsjs-2.4.3" = {
422 name = "_at_webcomponents_slash_webcomponentsjs";
422 name = "_at_webcomponents_slash_webcomponentsjs";
423 packageName = "@webcomponents/webcomponentsjs";
423 packageName = "@webcomponents/webcomponentsjs";
424 version = "2.3.0";
424 version = "2.4.3";
425 src = fetchurl {
425 src = fetchurl {
426 url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.3.0.tgz";
426 url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.4.3.tgz";
427 sha512 = "sR6FOrNnnncRuoJDqq9QxtRsJMbIvASw4vnJwIYKVlKO3AMc+NAr/bIQNnUiTTE9pBDTJkFpVaUdjJaRdsjmyA==";
427 sha512 = "cV4+sAmshf8ysU2USutrSRYQkJzEYKHsRCGa0CkMElGpG5747VHtkfsW3NdVIBV/m2MDKXTDydT4lkrysH7IFA==";
428 };
428 };
429 };
429 };
430 "@xtuc/ieee754-1.2.0" = {
430 "@xtuc/ieee754-1.2.0" = {
@@ -463,13 +463,13 b' let'
463 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
463 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
464 };
464 };
465 };
465 };
466 "acorn-5.7.3" = {
466 "acorn-5.7.4" = {
467 name = "acorn";
467 name = "acorn";
468 packageName = "acorn";
468 packageName = "acorn";
469 version = "5.7.3";
469 version = "5.7.4";
470 src = fetchurl {
470 src = fetchurl {
471 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz";
471 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz";
472 sha512 = "T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==";
472 sha512 = "1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==";
473 };
473 };
474 };
474 };
475 "acorn-dynamic-import-3.0.0" = {
475 "acorn-dynamic-import-3.0.0" = {
@@ -499,13 +499,13 b' let'
499 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
499 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
500 };
500 };
501 };
501 };
502 "ajv-6.10.2" = {
502 "ajv-6.12.0" = {
503 name = "ajv";
503 name = "ajv";
504 packageName = "ajv";
504 packageName = "ajv";
505 version = "6.10.2";
505 version = "6.12.0";
506 src = fetchurl {
506 src = fetchurl {
507 url = "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz";
507 url = "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz";
508 sha512 = "TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==";
508 sha512 = "D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==";
509 };
509 };
510 };
510 };
511 "ajv-keywords-3.4.1" = {
511 "ajv-keywords-3.4.1" = {
@@ -860,13 +860,13 b' let'
860 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
860 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
861 };
861 };
862 };
862 };
863 "aws4-1.8.0" = {
863 "aws4-1.9.1" = {
864 name = "aws4";
864 name = "aws4";
865 packageName = "aws4";
865 packageName = "aws4";
866 version = "1.8.0";
866 version = "1.9.1";
867 src = fetchurl {
867 src = fetchurl {
868 url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz";
868 url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
869 sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==";
869 sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
870 };
870 };
871 };
871 };
872 "babel-code-frame-6.26.0" = {
872 "babel-code-frame-6.26.0" = {
@@ -1445,13 +1445,22 b' let'
1445 sha512 = "Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==";
1445 sha512 = "Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==";
1446 };
1446 };
1447 };
1447 };
1448 "bluebird-3.7.1" = {
1448 "bindings-1.5.0" = {
1449 name = "bindings";
1450 packageName = "bindings";
1451 version = "1.5.0";
1452 src = fetchurl {
1453 url = "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz";
1454 sha512 = "p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==";
1455 };
1456 };
1457 "bluebird-3.7.2" = {
1449 name = "bluebird";
1458 name = "bluebird";
1450 packageName = "bluebird";
1459 packageName = "bluebird";
1451 version = "3.7.1";
1460 version = "3.7.2";
1452 src = fetchurl {
1461 src = fetchurl {
1453 url = "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz";
1462 url = "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz";
1454 sha512 = "DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==";
1463 sha512 = "XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==";
1455 };
1464 };
1456 };
1465 };
1457 "bn.js-4.11.8" = {
1466 "bn.js-4.11.8" = {
@@ -1580,13 +1589,13 b' let'
1580 sha512 = "WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==";
1589 sha512 = "WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==";
1581 };
1590 };
1582 };
1591 };
1583 "buffer-4.9.1" = {
1592 "buffer-4.9.2" = {
1584 name = "buffer";
1593 name = "buffer";
1585 packageName = "buffer";
1594 packageName = "buffer";
1586 version = "4.9.1";
1595 version = "4.9.2";
1587 src = fetchurl {
1596 src = fetchurl {
1588 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz";
1597 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz";
1589 sha1 = "6d1bb601b07a4efced97094132093027c95bc298";
1598 sha512 = "xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==";
1590 };
1599 };
1591 };
1600 };
1592 "buffer-from-1.1.1" = {
1601 "buffer-from-1.1.1" = {
@@ -1670,22 +1679,22 b' let'
1670 sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c";
1679 sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c";
1671 };
1680 };
1672 };
1681 };
1673 "caniuse-db-1.0.30001006" = {
1682 "caniuse-db-1.0.30001042" = {
1674 name = "caniuse-db";
1683 name = "caniuse-db";
1675 packageName = "caniuse-db";
1684 packageName = "caniuse-db";
1676 version = "1.0.30001006";
1685 version = "1.0.30001042";
1677 src = fetchurl {
1686 src = fetchurl {
1678 url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001006.tgz";
1687 url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001042.tgz";
1679 sha512 = "Xn25grc0GXATFnnEX+KP3IwEv6ZdHs4CALyLKvK8pBeeBe+hSpqy3/GyKBgEp4hn6o+bI+GNeNeQBf9PBOK0EQ==";
1688 sha512 = "2RKrB2hkLCW/8Uj32oaXj0O+N9ROo0/BF0EueWHwgs6AeeSiL+rCSsbICR3ayBJOZavgcFx65ZCw7QiafsoUFQ==";
1680 };
1689 };
1681 };
1690 };
1682 "caniuse-lite-1.0.30001006" = {
1691 "caniuse-lite-1.0.30001042" = {
1683 name = "caniuse-lite";
1692 name = "caniuse-lite";
1684 packageName = "caniuse-lite";
1693 packageName = "caniuse-lite";
1685 version = "1.0.30001006";
1694 version = "1.0.30001042";
1686 src = fetchurl {
1695 src = fetchurl {
1687 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz";
1696 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001042.tgz";
1688 sha512 = "MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw==";
1697 sha512 = "igMQ4dlqnf4tWv0xjaaE02op9AJ2oQzXKjWf4EuAHFN694Uo9/EfPVIPJcmn2WkU9RqozCxx5e2KPcVClHDbDw==";
1689 };
1698 };
1690 };
1699 };
1691 "caseless-0.12.0" = {
1700 "caseless-0.12.0" = {
@@ -1742,13 +1751,13 b' let'
1742 sha512 = "ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==";
1751 sha512 = "ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==";
1743 };
1752 };
1744 };
1753 };
1745 "chownr-1.1.3" = {
1754 "chownr-1.1.4" = {
1746 name = "chownr";
1755 name = "chownr";
1747 packageName = "chownr";
1756 packageName = "chownr";
1748 version = "1.1.3";
1757 version = "1.1.4";
1749 src = fetchurl {
1758 src = fetchurl {
1750 url = "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz";
1759 url = "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz";
1751 sha512 = "i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==";
1760 sha512 = "jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==";
1752 };
1761 };
1753 };
1762 };
1754 "chrome-trace-event-1.0.2" = {
1763 "chrome-trace-event-1.0.2" = {
@@ -1787,13 +1796,13 b' let'
1787 sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==";
1796 sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==";
1788 };
1797 };
1789 };
1798 };
1790 "clean-css-4.2.1" = {
1799 "clean-css-4.2.3" = {
1791 name = "clean-css";
1800 name = "clean-css";
1792 packageName = "clean-css";
1801 packageName = "clean-css";
1793 version = "4.2.1";
1802 version = "4.2.3";
1794 src = fetchurl {
1803 src = fetchurl {
1795 url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz";
1804 url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz";
1796 sha512 = "4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==";
1805 sha512 = "VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==";
1797 };
1806 };
1798 };
1807 };
1799 "cli-1.0.1" = {
1808 "cli-1.0.1" = {
@@ -1805,13 +1814,13 b' let'
1805 sha1 = "22817534f24bfa4950c34d532d48ecbc621b8c14";
1814 sha1 = "22817534f24bfa4950c34d532d48ecbc621b8c14";
1806 };
1815 };
1807 };
1816 };
1808 "clipboard-2.0.4" = {
1817 "clipboard-2.0.6" = {
1809 name = "clipboard";
1818 name = "clipboard";
1810 packageName = "clipboard";
1819 packageName = "clipboard";
1811 version = "2.0.4";
1820 version = "2.0.6";
1812 src = fetchurl {
1821 src = fetchurl {
1813 url = "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz";
1822 url = "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz";
1814 sha512 = "Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==";
1823 sha512 = "g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==";
1815 };
1824 };
1816 };
1825 };
1817 "cliui-2.1.0" = {
1826 "cliui-2.1.0" = {
@@ -2066,13 +2075,13 b' let'
2066 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
2075 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
2067 };
2076 };
2068 };
2077 };
2069 "convert-source-map-1.6.0" = {
2078 "convert-source-map-1.7.0" = {
2070 name = "convert-source-map";
2079 name = "convert-source-map";
2071 packageName = "convert-source-map";
2080 packageName = "convert-source-map";
2072 version = "1.6.0";
2081 version = "1.7.0";
2073 src = fetchurl {
2082 src = fetchurl {
2074 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz";
2083 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz";
2075 sha512 = "eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==";
2084 sha512 = "4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==";
2076 };
2085 };
2077 };
2086 };
2078 "copy-concurrently-1.0.5" = {
2087 "copy-concurrently-1.0.5" = {
@@ -2102,13 +2111,13 b' let'
2102 sha512 = "Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==";
2111 sha512 = "Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==";
2103 };
2112 };
2104 };
2113 };
2105 "core-js-2.6.10" = {
2114 "core-js-2.6.11" = {
2106 name = "core-js";
2115 name = "core-js";
2107 packageName = "core-js";
2116 packageName = "core-js";
2108 version = "2.6.10";
2117 version = "2.6.11";
2109 src = fetchurl {
2118 src = fetchurl {
2110 url = "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz";
2119 url = "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz";
2111 sha512 = "I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==";
2120 sha512 = "5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==";
2112 };
2121 };
2113 };
2122 };
2114 "core-util-is-1.0.2" = {
2123 "core-util-is-1.0.2" = {
@@ -2201,13 +2210,13 b' let'
2201 sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
2210 sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
2202 };
2211 };
2203 };
2212 };
2204 "css-selector-tokenizer-0.7.1" = {
2213 "css-selector-tokenizer-0.7.2" = {
2205 name = "css-selector-tokenizer";
2214 name = "css-selector-tokenizer";
2206 packageName = "css-selector-tokenizer";
2215 packageName = "css-selector-tokenizer";
2207 version = "0.7.1";
2216 version = "0.7.2";
2208 src = fetchurl {
2217 src = fetchurl {
2209 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz";
2218 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz";
2210 sha512 = "xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==";
2219 sha512 = "yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==";
2211 };
2220 };
2212 };
2221 };
2213 "css-what-2.1.3" = {
2222 "css-what-2.1.3" = {
@@ -2219,13 +2228,13 b' let'
2219 sha512 = "a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==";
2228 sha512 = "a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==";
2220 };
2229 };
2221 };
2230 };
2222 "cssesc-0.1.0" = {
2231 "cssesc-3.0.0" = {
2223 name = "cssesc";
2232 name = "cssesc";
2224 packageName = "cssesc";
2233 packageName = "cssesc";
2225 version = "0.1.0";
2234 version = "3.0.0";
2226 src = fetchurl {
2235 src = fetchurl {
2227 url = "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz";
2236 url = "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz";
2228 sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
2237 sha512 = "/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==";
2229 };
2238 };
2230 };
2239 };
2231 "cssnano-3.10.0" = {
2240 "cssnano-3.10.0" = {
@@ -2390,13 +2399,13 b' let'
2390 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
2399 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
2391 };
2400 };
2392 };
2401 };
2393 "des.js-1.0.0" = {
2402 "des.js-1.0.1" = {
2394 name = "des.js";
2403 name = "des.js";
2395 packageName = "des.js";
2404 packageName = "des.js";
2396 version = "1.0.0";
2405 version = "1.0.1";
2397 src = fetchurl {
2406 src = fetchurl {
2398 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz";
2407 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz";
2399 sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
2408 sha512 = "Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==";
2400 };
2409 };
2401 };
2410 };
2402 "detect-file-1.0.0" = {
2411 "detect-file-1.0.0" = {
@@ -2444,13 +2453,13 b' let'
2444 sha512 = "gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==";
2453 sha512 = "gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==";
2445 };
2454 };
2446 };
2455 };
2447 "dom-serializer-0.2.1" = {
2456 "dom-serializer-0.2.2" = {
2448 name = "dom-serializer";
2457 name = "dom-serializer";
2449 packageName = "dom-serializer";
2458 packageName = "dom-serializer";
2450 version = "0.2.1";
2459 version = "0.2.2";
2451 src = fetchurl {
2460 src = fetchurl {
2452 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz";
2461 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz";
2453 sha512 = "sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==";
2462 sha512 = "2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==";
2454 };
2463 };
2455 };
2464 };
2456 "dom5-2.3.0" = {
2465 "dom5-2.3.0" = {
@@ -2507,13 +2516,13 b' let'
2507 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
2516 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
2508 };
2517 };
2509 };
2518 };
2510 "dropzone-5.5.1" = {
2519 "dropzone-5.7.0" = {
2511 name = "dropzone";
2520 name = "dropzone";
2512 packageName = "dropzone";
2521 packageName = "dropzone";
2513 version = "5.5.1";
2522 version = "5.7.0";
2514 src = fetchurl {
2523 src = fetchurl {
2515 url = "https://registry.npmjs.org/dropzone/-/dropzone-5.5.1.tgz";
2524 url = "https://registry.npmjs.org/dropzone/-/dropzone-5.7.0.tgz";
2516 sha512 = "3VduRWLxx9hbVr42QieQN25mx/I61/mRdUSuxAmDGdDqZIN8qtP7tcKMa3KfpJjuGjOJGYYUzzeq6eGDnkzesA==";
2525 sha512 = "kOltiZXH5cO/72I22JjE+w6BoT6uaVLfWdFMsi1PMKFkU6BZWpqRwjnsRm0o6ANGTBuZar5Piu7m/CbKqRPiYg==";
2517 };
2526 };
2518 };
2527 };
2519 "duplexer-0.1.1" = {
2528 "duplexer-0.1.1" = {
@@ -2543,22 +2552,22 b' let'
2543 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
2552 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
2544 };
2553 };
2545 };
2554 };
2546 "electron-to-chromium-1.3.302" = {
2555 "electron-to-chromium-1.3.412" = {
2547 name = "electron-to-chromium";
2556 name = "electron-to-chromium";
2548 packageName = "electron-to-chromium";
2557 packageName = "electron-to-chromium";
2549 version = "1.3.302";
2558 version = "1.3.412";
2550 src = fetchurl {
2559 src = fetchurl {
2551 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.302.tgz";
2560 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.412.tgz";
2552 sha512 = "1qConyiVEbj4xZRBXqtGR003+9tV0rJF0PS6aeO0Ln/UL637js9hdwweCl07meh/kJoI2N4W8q3R3g3F5z46ww==";
2561 sha512 = "4bVdSeJScR8fT7ERveLWbxemY5uXEHVseqMRyORosiKcTUSGtVwBkV8uLjXCqoFLeImA57Z9hbz3TOid01U4Hw==";
2553 };
2562 };
2554 };
2563 };
2555 "elliptic-6.5.1" = {
2564 "elliptic-6.5.2" = {
2556 name = "elliptic";
2565 name = "elliptic";
2557 packageName = "elliptic";
2566 packageName = "elliptic";
2558 version = "6.5.1";
2567 version = "6.5.2";
2559 src = fetchurl {
2568 src = fetchurl {
2560 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz";
2569 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz";
2561 sha512 = "xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==";
2570 sha512 = "f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==";
2562 };
2571 };
2563 };
2572 };
2564 "emojis-list-2.1.0" = {
2573 "emojis-list-2.1.0" = {
@@ -2570,6 +2579,15 b' let'
2570 sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
2579 sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
2571 };
2580 };
2572 };
2581 };
2582 "emojis-list-3.0.0" = {
2583 name = "emojis-list";
2584 packageName = "emojis-list";
2585 version = "3.0.0";
2586 src = fetchurl {
2587 url = "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz";
2588 sha512 = "/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==";
2589 };
2590 };
2573 "end-of-stream-1.4.4" = {
2591 "end-of-stream-1.4.4" = {
2574 name = "end-of-stream";
2592 name = "end-of-stream";
2575 packageName = "end-of-stream";
2593 packageName = "end-of-stream";
@@ -2624,22 +2642,22 b' let'
2624 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
2642 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
2625 };
2643 };
2626 };
2644 };
2627 "es-abstract-1.16.0" = {
2645 "es-abstract-1.17.5" = {
2628 name = "es-abstract";
2646 name = "es-abstract";
2629 packageName = "es-abstract";
2647 packageName = "es-abstract";
2630 version = "1.16.0";
2648 version = "1.17.5";
2631 src = fetchurl {
2649 src = fetchurl {
2632 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz";
2650 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz";
2633 sha512 = "xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==";
2651 sha512 = "BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==";
2634 };
2652 };
2635 };
2653 };
2636 "es-to-primitive-1.2.0" = {
2654 "es-to-primitive-1.2.1" = {
2637 name = "es-to-primitive";
2655 name = "es-to-primitive";
2638 packageName = "es-to-primitive";
2656 packageName = "es-to-primitive";
2639 version = "1.2.0";
2657 version = "1.2.1";
2640 src = fetchurl {
2658 src = fetchurl {
2641 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz";
2659 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz";
2642 sha512 = "qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==";
2660 sha512 = "QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==";
2643 };
2661 };
2644 };
2662 };
2645 "es6-templates-0.2.3" = {
2663 "es6-templates-0.2.3" = {
@@ -2741,13 +2759,13 b' let'
2741 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
2759 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
2742 };
2760 };
2743 };
2761 };
2744 "events-3.0.0" = {
2762 "events-3.1.0" = {
2745 name = "events";
2763 name = "events";
2746 packageName = "events";
2764 packageName = "events";
2747 version = "3.0.0";
2765 version = "3.1.0";
2748 src = fetchurl {
2766 src = fetchurl {
2749 url = "https://registry.npmjs.org/events/-/events-3.0.0.tgz";
2767 url = "https://registry.npmjs.org/events/-/events-3.1.0.tgz";
2750 sha512 = "Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==";
2768 sha512 = "Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==";
2751 };
2769 };
2752 };
2770 };
2753 "evp_bytestokey-1.0.3" = {
2771 "evp_bytestokey-1.0.3" = {
@@ -2849,22 +2867,22 b' let'
2849 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
2867 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
2850 };
2868 };
2851 };
2869 };
2852 "fast-deep-equal-2.0.1" = {
2870 "fast-deep-equal-3.1.1" = {
2853 name = "fast-deep-equal";
2871 name = "fast-deep-equal";
2854 packageName = "fast-deep-equal";
2872 packageName = "fast-deep-equal";
2855 version = "2.0.1";
2873 version = "3.1.1";
2856 src = fetchurl {
2874 src = fetchurl {
2857 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
2875 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
2858 sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
2876 sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
2859 };
2877 };
2860 };
2878 };
2861 "fast-json-stable-stringify-2.0.0" = {
2879 "fast-json-stable-stringify-2.1.0" = {
2862 name = "fast-json-stable-stringify";
2880 name = "fast-json-stable-stringify";
2863 packageName = "fast-json-stable-stringify";
2881 packageName = "fast-json-stable-stringify";
2864 version = "2.0.0";
2882 version = "2.1.0";
2865 src = fetchurl {
2883 src = fetchurl {
2866 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
2884 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
2867 sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
2885 sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
2868 };
2886 };
2869 };
2887 };
2870 "fastparse-1.1.2" = {
2888 "fastparse-1.1.2" = {
@@ -2912,6 +2930,15 b' let'
2912 sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b";
2930 sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b";
2913 };
2931 };
2914 };
2932 };
2933 "file-uri-to-path-1.0.0" = {
2934 name = "file-uri-to-path";
2935 packageName = "file-uri-to-path";
2936 version = "1.0.0";
2937 src = fetchurl {
2938 url = "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz";
2939 sha512 = "0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==";
2940 };
2941 };
2915 "fill-range-4.0.0" = {
2942 "fill-range-4.0.0" = {
2916 name = "fill-range";
2943 name = "fill-range";
2917 packageName = "fill-range";
2944 packageName = "fill-range";
@@ -3074,13 +3101,13 b' let'
3074 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
3101 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
3075 };
3102 };
3076 };
3103 };
3077 "fsevents-1.2.9" = {
3104 "fsevents-1.2.12" = {
3078 name = "fsevents";
3105 name = "fsevents";
3079 packageName = "fsevents";
3106 packageName = "fsevents";
3080 version = "1.2.9";
3107 version = "1.2.12";
3081 src = fetchurl {
3108 src = fetchurl {
3082 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz";
3109 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz";
3083 sha512 = "oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==";
3110 sha512 = "Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==";
3084 };
3111 };
3085 };
3112 };
3086 "function-bind-1.1.1" = {
3113 "function-bind-1.1.1" = {
@@ -3164,13 +3191,13 b' let'
3164 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
3191 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
3165 };
3192 };
3166 };
3193 };
3167 "glob-7.1.5" = {
3194 "glob-7.1.6" = {
3168 name = "glob";
3195 name = "glob";
3169 packageName = "glob";
3196 packageName = "glob";
3170 version = "7.1.5";
3197 version = "7.1.6";
3171 src = fetchurl {
3198 src = fetchurl {
3172 url = "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz";
3199 url = "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";
3173 sha512 = "J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==";
3200 sha512 = "LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==";
3174 };
3201 };
3175 };
3202 };
3176 "glob-parent-3.1.0" = {
3203 "glob-parent-3.1.0" = {
@@ -3452,13 +3479,13 b' let'
3452 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
3479 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
3453 };
3480 };
3454 };
3481 };
3455 "has-symbols-1.0.0" = {
3482 "has-symbols-1.0.1" = {
3456 name = "has-symbols";
3483 name = "has-symbols";
3457 packageName = "has-symbols";
3484 packageName = "has-symbols";
3458 version = "1.0.0";
3485 version = "1.0.1";
3459 src = fetchurl {
3486 src = fetchurl {
3460 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz";
3487 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz";
3461 sha1 = "ba1a8f1af2a0fc39650f5c850367704122063b44";
3488 sha512 = "PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==";
3462 };
3489 };
3463 };
3490 };
3464 "has-value-0.3.1" = {
3491 "has-value-0.3.1" = {
@@ -3884,13 +3911,13 b' let'
3884 sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
3911 sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
3885 };
3912 };
3886 };
3913 };
3887 "is-callable-1.1.4" = {
3914 "is-callable-1.1.5" = {
3888 name = "is-callable";
3915 name = "is-callable";
3889 packageName = "is-callable";
3916 packageName = "is-callable";
3890 version = "1.1.4";
3917 version = "1.1.5";
3891 src = fetchurl {
3918 src = fetchurl {
3892 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz";
3919 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz";
3893 sha512 = "r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==";
3920 sha512 = "ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==";
3894 };
3921 };
3895 };
3922 };
3896 "is-data-descriptor-0.1.4" = {
3923 "is-data-descriptor-0.1.4" = {
@@ -3911,13 +3938,13 b' let'
3911 sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==";
3938 sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==";
3912 };
3939 };
3913 };
3940 };
3914 "is-date-object-1.0.1" = {
3941 "is-date-object-1.0.2" = {
3915 name = "is-date-object";
3942 name = "is-date-object";
3916 packageName = "is-date-object";
3943 packageName = "is-date-object";
3917 version = "1.0.1";
3944 version = "1.0.2";
3918 src = fetchurl {
3945 src = fetchurl {
3919 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz";
3946 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz";
3920 sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
3947 sha512 = "USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==";
3921 };
3948 };
3922 };
3949 };
3923 "is-descriptor-0.1.6" = {
3950 "is-descriptor-0.1.6" = {
@@ -3965,13 +3992,13 b' let'
3965 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
3992 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
3966 };
3993 };
3967 };
3994 };
3968 "is-finite-1.0.2" = {
3995 "is-finite-1.1.0" = {
3969 name = "is-finite";
3996 name = "is-finite";
3970 packageName = "is-finite";
3997 packageName = "is-finite";
3971 version = "1.0.2";
3998 version = "1.1.0";
3972 src = fetchurl {
3999 src = fetchurl {
3973 url = "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz";
4000 url = "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz";
3974 sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
4001 sha512 = "cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==";
3975 };
4002 };
3976 };
4003 };
3977 "is-fullwidth-code-point-1.0.0" = {
4004 "is-fullwidth-code-point-1.0.0" = {
@@ -4037,13 +4064,13 b' let'
4037 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
4064 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
4038 };
4065 };
4039 };
4066 };
4040 "is-regex-1.0.4" = {
4067 "is-regex-1.0.5" = {
4041 name = "is-regex";
4068 name = "is-regex";
4042 packageName = "is-regex";
4069 packageName = "is-regex";
4043 version = "1.0.4";
4070 version = "1.0.5";
4044 src = fetchurl {
4071 src = fetchurl {
4045 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz";
4072 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz";
4046 sha1 = "5517489b547091b0930e095654ced25ee97e9491";
4073 sha512 = "vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==";
4047 };
4074 };
4048 };
4075 };
4049 "is-relative-1.0.0" = {
4076 "is-relative-1.0.0" = {
@@ -4073,13 +4100,13 b' let'
4073 sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9";
4100 sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9";
4074 };
4101 };
4075 };
4102 };
4076 "is-symbol-1.0.2" = {
4103 "is-symbol-1.0.3" = {
4077 name = "is-symbol";
4104 name = "is-symbol";
4078 packageName = "is-symbol";
4105 packageName = "is-symbol";
4079 version = "1.0.2";
4106 version = "1.0.3";
4080 src = fetchurl {
4107 src = fetchurl {
4081 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz";
4108 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz";
4082 sha512 = "HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==";
4109 sha512 = "OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==";
4083 };
4110 };
4084 };
4111 };
4085 "is-typedarray-1.0.0" = {
4112 "is-typedarray-1.0.0" = {
@@ -4172,13 +4199,13 b' let'
4172 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
4199 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
4173 };
4200 };
4174 };
4201 };
4175 "js-base64-2.5.1" = {
4202 "js-base64-2.5.2" = {
4176 name = "js-base64";
4203 name = "js-base64";
4177 packageName = "js-base64";
4204 packageName = "js-base64";
4178 version = "2.5.1";
4205 version = "2.5.2";
4179 src = fetchurl {
4206 src = fetchurl {
4180 url = "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz";
4207 url = "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz";
4181 sha512 = "M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==";
4208 sha512 = "Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==";
4182 };
4209 };
4183 };
4210 };
4184 "js-tokens-3.0.2" = {
4211 "js-tokens-3.0.2" = {
@@ -4235,13 +4262,13 b' let'
4235 sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
4262 sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
4236 };
4263 };
4237 };
4264 };
4238 "jshint-2.10.2" = {
4265 "jshint-2.11.0" = {
4239 name = "jshint";
4266 name = "jshint";
4240 packageName = "jshint";
4267 packageName = "jshint";
4241 version = "2.10.2";
4268 version = "2.11.0";
4242 src = fetchurl {
4269 src = fetchurl {
4243 url = "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz";
4270 url = "https://registry.npmjs.org/jshint/-/jshint-2.11.0.tgz";
4244 sha512 = "e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==";
4271 sha512 = "ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==";
4245 };
4272 };
4246 };
4273 };
4247 "jshint-2.9.7" = {
4274 "jshint-2.9.7" = {
@@ -4361,13 +4388,13 b' let'
4361 sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==";
4388 sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==";
4362 };
4389 };
4363 };
4390 };
4364 "kind-of-6.0.2" = {
4391 "kind-of-6.0.3" = {
4365 name = "kind-of";
4392 name = "kind-of";
4366 packageName = "kind-of";
4393 packageName = "kind-of";
4367 version = "6.0.2";
4394 version = "6.0.3";
4368 src = fetchurl {
4395 src = fetchurl {
4369 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz";
4396 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz";
4370 sha512 = "s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==";
4397 sha512 = "dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==";
4371 };
4398 };
4372 };
4399 };
4373 "lazy-cache-1.0.4" = {
4400 "lazy-cache-1.0.4" = {
@@ -4424,13 +4451,13 b' let'
4424 sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348";
4451 sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348";
4425 };
4452 };
4426 };
4453 };
4427 "loader-utils-1.2.3" = {
4454 "loader-utils-1.4.0" = {
4428 name = "loader-utils";
4455 name = "loader-utils";
4429 packageName = "loader-utils";
4456 packageName = "loader-utils";
4430 version = "1.2.3";
4457 version = "1.4.0";
4431 src = fetchurl {
4458 src = fetchurl {
4432 url = "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz";
4459 url = "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz";
4433 sha512 = "fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==";
4460 sha512 = "qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==";
4434 };
4461 };
4435 };
4462 };
4436 "locate-path-2.0.0" = {
4463 "locate-path-2.0.0" = {
@@ -4622,13 +4649,13 b' let'
4622 sha1 = "180f1f9ebef8b0e638e4166ad52db879beb2ffc5";
4649 sha1 = "180f1f9ebef8b0e638e4166ad52db879beb2ffc5";
4623 };
4650 };
4624 };
4651 };
4625 "math-expression-evaluator-1.2.17" = {
4652 "math-expression-evaluator-1.2.22" = {
4626 name = "math-expression-evaluator";
4653 name = "math-expression-evaluator";
4627 packageName = "math-expression-evaluator";
4654 packageName = "math-expression-evaluator";
4628 version = "1.2.17";
4655 version = "1.2.22";
4629 src = fetchurl {
4656 src = fetchurl {
4630 url = "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz";
4657 url = "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz";
4631 sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac";
4658 sha512 = "L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==";
4632 };
4659 };
4633 };
4660 };
4634 "maxmin-2.1.0" = {
4661 "maxmin-2.1.0" = {
@@ -4703,22 +4730,22 b' let'
4703 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
4730 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
4704 };
4731 };
4705 };
4732 };
4706 "mime-db-1.40.0" = {
4733 "mime-db-1.43.0" = {
4707 name = "mime-db";
4734 name = "mime-db";
4708 packageName = "mime-db";
4735 packageName = "mime-db";
4709 version = "1.40.0";
4736 version = "1.43.0";
4710 src = fetchurl {
4737 src = fetchurl {
4711 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz";
4738 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz";
4712 sha512 = "jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==";
4739 sha512 = "+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==";
4713 };
4740 };
4714 };
4741 };
4715 "mime-types-2.1.24" = {
4742 "mime-types-2.1.26" = {
4716 name = "mime-types";
4743 name = "mime-types";
4717 packageName = "mime-types";
4744 packageName = "mime-types";
4718 version = "2.1.24";
4745 version = "2.1.26";
4719 src = fetchurl {
4746 src = fetchurl {
4720 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz";
4747 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz";
4721 sha512 = "WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==";
4748 sha512 = "01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==";
4722 };
4749 };
4723 };
4750 };
4724 "mimic-fn-2.1.0" = {
4751 "mimic-fn-2.1.0" = {
@@ -4775,22 +4802,13 b' let'
4775 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
4802 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
4776 };
4803 };
4777 };
4804 };
4778 "minimist-0.0.8" = {
4805 "minimist-1.2.5" = {
4779 name = "minimist";
4806 name = "minimist";
4780 packageName = "minimist";
4807 packageName = "minimist";
4781 version = "0.0.8";
4808 version = "1.2.5";
4782 src = fetchurl {
4809 src = fetchurl {
4783 url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
4810 url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
4784 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
4811 sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
4785 };
4786 };
4787 "minimist-1.2.0" = {
4788 name = "minimist";
4789 packageName = "minimist";
4790 version = "1.2.0";
4791 src = fetchurl {
4792 url = "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz";
4793 sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
4794 };
4812 };
4795 };
4813 };
4796 "mississippi-2.0.0" = {
4814 "mississippi-2.0.0" = {
@@ -4811,13 +4829,13 b' let'
4811 sha512 = "WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==";
4829 sha512 = "WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==";
4812 };
4830 };
4813 };
4831 };
4814 "mkdirp-0.5.1" = {
4832 "mkdirp-0.5.5" = {
4815 name = "mkdirp";
4833 name = "mkdirp";
4816 packageName = "mkdirp";
4834 packageName = "mkdirp";
4817 version = "0.5.1";
4835 version = "0.5.5";
4818 src = fetchurl {
4836 src = fetchurl {
4819 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";
4837 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
4820 sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
4838 sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
4821 };
4839 };
4822 };
4840 };
4823 "moment-2.24.0" = {
4841 "moment-2.24.0" = {
@@ -4829,13 +4847,13 b' let'
4829 sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==";
4847 sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==";
4830 };
4848 };
4831 };
4849 };
4832 "mousetrap-1.6.3" = {
4850 "mousetrap-1.6.5" = {
4833 name = "mousetrap";
4851 name = "mousetrap";
4834 packageName = "mousetrap";
4852 packageName = "mousetrap";
4835 version = "1.6.3";
4853 version = "1.6.5";
4836 src = fetchurl {
4854 src = fetchurl {
4837 url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.3.tgz";
4855 url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz";
4838 sha512 = "bd+nzwhhs9ifsUrC2tWaSgm24/oo2c83zaRyZQF06hYA6sANfsXHtnZ19AbbbDXCDzeH5nZBSQ4NvCjgD62tJA==";
4856 sha512 = "QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==";
4839 };
4857 };
4840 };
4858 };
4841 "move-concurrently-1.0.1" = {
4859 "move-concurrently-1.0.1" = {
@@ -4928,13 +4946,13 b' let'
4928 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
4946 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
4929 };
4947 };
4930 };
4948 };
4931 "nopt-4.0.1" = {
4949 "nopt-4.0.3" = {
4932 name = "nopt";
4950 name = "nopt";
4933 packageName = "nopt";
4951 packageName = "nopt";
4934 version = "4.0.1";
4952 version = "4.0.3";
4935 src = fetchurl {
4953 src = fetchurl {
4936 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz";
4954 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz";
4937 sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
4955 sha512 = "CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==";
4938 };
4956 };
4939 };
4957 };
4940 "noptify-0.0.3" = {
4958 "noptify-0.0.3" = {
@@ -5045,13 +5063,13 b' let'
5045 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
5063 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
5046 };
5064 };
5047 };
5065 };
5048 "object-inspect-1.6.0" = {
5066 "object-inspect-1.7.0" = {
5049 name = "object-inspect";
5067 name = "object-inspect";
5050 packageName = "object-inspect";
5068 packageName = "object-inspect";
5051 version = "1.6.0";
5069 version = "1.7.0";
5052 src = fetchurl {
5070 src = fetchurl {
5053 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz";
5071 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz";
5054 sha512 = "GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==";
5072 sha512 = "a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==";
5055 };
5073 };
5056 };
5074 };
5057 "object-keys-1.1.1" = {
5075 "object-keys-1.1.1" = {
@@ -5072,6 +5090,15 b' let'
5072 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
5090 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
5073 };
5091 };
5074 };
5092 };
5093 "object.assign-4.1.0" = {
5094 name = "object.assign";
5095 packageName = "object.assign";
5096 version = "4.1.0";
5097 src = fetchurl {
5098 url = "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz";
5099 sha512 = "exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==";
5100 };
5101 };
5075 "object.defaults-1.1.0" = {
5102 "object.defaults-1.1.0" = {
5076 name = "object.defaults";
5103 name = "object.defaults";
5077 packageName = "object.defaults";
5104 packageName = "object.defaults";
@@ -5081,13 +5108,13 b' let'
5081 sha1 = "3a7f868334b407dea06da16d88d5cd29e435fecf";
5108 sha1 = "3a7f868334b407dea06da16d88d5cd29e435fecf";
5082 };
5109 };
5083 };
5110 };
5084 "object.getownpropertydescriptors-2.0.3" = {
5111 "object.getownpropertydescriptors-2.1.0" = {
5085 name = "object.getownpropertydescriptors";
5112 name = "object.getownpropertydescriptors";
5086 packageName = "object.getownpropertydescriptors";
5113 packageName = "object.getownpropertydescriptors";
5087 version = "2.0.3";
5114 version = "2.1.0";
5088 src = fetchurl {
5115 src = fetchurl {
5089 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz";
5116 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz";
5090 sha1 = "8758c846f5b407adab0f236e0986f14b051caa16";
5117 sha512 = "Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==";
5091 };
5118 };
5092 };
5119 };
5093 "object.map-1.0.1" = {
5120 "object.map-1.0.1" = {
@@ -5198,13 +5225,13 b' let'
5198 sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==";
5225 sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==";
5199 };
5226 };
5200 };
5227 };
5201 "p-limit-2.2.1" = {
5228 "p-limit-2.3.0" = {
5202 name = "p-limit";
5229 name = "p-limit";
5203 packageName = "p-limit";
5230 packageName = "p-limit";
5204 version = "2.2.1";
5231 version = "2.3.0";
5205 src = fetchurl {
5232 src = fetchurl {
5206 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz";
5233 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz";
5207 sha512 = "85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==";
5234 sha512 = "//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==";
5208 };
5235 };
5209 };
5236 };
5210 "p-locate-2.0.0" = {
5237 "p-locate-2.0.0" = {
@@ -5243,13 +5270,13 b' let'
5243 sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==";
5270 sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==";
5244 };
5271 };
5245 };
5272 };
5246 "pako-1.0.10" = {
5273 "pako-1.0.11" = {
5247 name = "pako";
5274 name = "pako";
5248 packageName = "pako";
5275 packageName = "pako";
5249 version = "1.0.10";
5276 version = "1.0.11";
5250 src = fetchurl {
5277 src = fetchurl {
5251 url = "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz";
5278 url = "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz";
5252 sha512 = "0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==";
5279 sha512 = "4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==";
5253 };
5280 };
5254 };
5281 };
5255 "parallel-transform-1.2.0" = {
5282 "parallel-transform-1.2.0" = {
@@ -6035,13 +6062,13 b' let'
6035 sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
6062 sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
6036 };
6063 };
6037 };
6064 };
6038 "readable-stream-2.3.6" = {
6065 "readable-stream-2.3.7" = {
6039 name = "readable-stream";
6066 name = "readable-stream";
6040 packageName = "readable-stream";
6067 packageName = "readable-stream";
6041 version = "2.3.6";
6068 version = "2.3.7";
6042 src = fetchurl {
6069 src = fetchurl {
6043 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";
6070 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
6044 sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==";
6071 sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
6045 };
6072 };
6046 };
6073 };
6047 "readdirp-2.2.1" = {
6074 "readdirp-2.2.1" = {
@@ -6098,6 +6125,15 b' let'
6098 sha512 = "1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==";
6125 sha512 = "1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==";
6099 };
6126 };
6100 };
6127 };
6128 "regenerate-unicode-properties-8.2.0" = {
6129 name = "regenerate-unicode-properties";
6130 packageName = "regenerate-unicode-properties";
6131 version = "8.2.0";
6132 src = fetchurl {
6133 url = "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz";
6134 sha512 = "F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==";
6135 };
6136 };
6101 "regenerator-runtime-0.11.1" = {
6137 "regenerator-runtime-0.11.1" = {
6102 name = "regenerator-runtime";
6138 name = "regenerator-runtime";
6103 packageName = "regenerator-runtime";
6139 packageName = "regenerator-runtime";
@@ -6125,15 +6161,6 b' let'
6125 sha512 = "J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==";
6161 sha512 = "J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==";
6126 };
6162 };
6127 };
6163 };
6128 "regexpu-core-1.0.0" = {
6129 name = "regexpu-core";
6130 packageName = "regexpu-core";
6131 version = "1.0.0";
6132 src = fetchurl {
6133 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz";
6134 sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b";
6135 };
6136 };
6137 "regexpu-core-2.0.0" = {
6164 "regexpu-core-2.0.0" = {
6138 name = "regexpu-core";
6165 name = "regexpu-core";
6139 packageName = "regexpu-core";
6166 packageName = "regexpu-core";
@@ -6143,6 +6170,15 b' let'
6143 sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240";
6170 sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240";
6144 };
6171 };
6145 };
6172 };
6173 "regexpu-core-4.7.0" = {
6174 name = "regexpu-core";
6175 packageName = "regexpu-core";
6176 version = "4.7.0";
6177 src = fetchurl {
6178 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz";
6179 sha512 = "TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==";
6180 };
6181 };
6146 "regjsgen-0.2.0" = {
6182 "regjsgen-0.2.0" = {
6147 name = "regjsgen";
6183 name = "regjsgen";
6148 packageName = "regjsgen";
6184 packageName = "regjsgen";
@@ -6152,6 +6188,15 b' let'
6152 sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
6188 sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
6153 };
6189 };
6154 };
6190 };
6191 "regjsgen-0.5.1" = {
6192 name = "regjsgen";
6193 packageName = "regjsgen";
6194 version = "0.5.1";
6195 src = fetchurl {
6196 url = "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz";
6197 sha512 = "5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==";
6198 };
6199 };
6155 "regjsparser-0.1.5" = {
6200 "regjsparser-0.1.5" = {
6156 name = "regjsparser";
6201 name = "regjsparser";
6157 packageName = "regjsparser";
6202 packageName = "regjsparser";
@@ -6161,6 +6206,15 b' let'
6161 sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
6206 sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
6162 };
6207 };
6163 };
6208 };
6209 "regjsparser-0.6.4" = {
6210 name = "regjsparser";
6211 packageName = "regjsparser";
6212 version = "0.6.4";
6213 src = fetchurl {
6214 url = "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz";
6215 sha512 = "64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==";
6216 };
6217 };
6164 "relateurl-0.2.7" = {
6218 "relateurl-0.2.7" = {
6165 name = "relateurl";
6219 name = "relateurl";
6166 packageName = "relateurl";
6220 packageName = "relateurl";
@@ -6242,13 +6296,13 b' let'
6242 sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
6296 sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
6243 };
6297 };
6244 };
6298 };
6245 "resolve-1.12.0" = {
6299 "resolve-1.16.0" = {
6246 name = "resolve";
6300 name = "resolve";
6247 packageName = "resolve";
6301 packageName = "resolve";
6248 version = "1.12.0";
6302 version = "1.16.0";
6249 src = fetchurl {
6303 src = fetchurl {
6250 url = "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz";
6304 url = "https://registry.npmjs.org/resolve/-/resolve-1.16.0.tgz";
6251 sha512 = "B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==";
6305 sha512 = "LarL/PIKJvc09k1jaeT4kQb/8/7P+qV4qSnN2K80AES+OHdfZELAKVOBjxsvtToT/uLOfFbvYvKfZmV8cee7nA==";
6252 };
6306 };
6253 };
6307 };
6254 "resolve-cwd-2.0.0" = {
6308 "resolve-cwd-2.0.0" = {
@@ -6494,13 +6548,13 b' let'
6494 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
6548 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
6495 };
6549 };
6496 };
6550 };
6497 "signal-exit-3.0.2" = {
6551 "signal-exit-3.0.3" = {
6498 name = "signal-exit";
6552 name = "signal-exit";
6499 packageName = "signal-exit";
6553 packageName = "signal-exit";
6500 version = "3.0.2";
6554 version = "3.0.3";
6501 src = fetchurl {
6555 src = fetchurl {
6502 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz";
6556 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz";
6503 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
6557 sha512 = "VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==";
6504 };
6558 };
6505 };
6559 };
6506 "slash-1.0.0" = {
6560 "slash-1.0.0" = {
@@ -6611,13 +6665,13 b' let'
6611 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
6665 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
6612 };
6666 };
6613 };
6667 };
6614 "source-map-resolve-0.5.2" = {
6668 "source-map-resolve-0.5.3" = {
6615 name = "source-map-resolve";
6669 name = "source-map-resolve";
6616 packageName = "source-map-resolve";
6670 packageName = "source-map-resolve";
6617 version = "0.5.2";
6671 version = "0.5.3";
6618 src = fetchurl {
6672 src = fetchurl {
6619 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
6673 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz";
6620 sha512 = "MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==";
6674 sha512 = "Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==";
6621 };
6675 };
6622 };
6676 };
6623 "source-map-support-0.4.18" = {
6677 "source-map-support-0.4.18" = {
@@ -6719,13 +6773,13 b' let'
6719 sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==";
6773 sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==";
6720 };
6774 };
6721 };
6775 };
6722 "stream-shift-1.0.0" = {
6776 "stream-shift-1.0.1" = {
6723 name = "stream-shift";
6777 name = "stream-shift";
6724 packageName = "stream-shift";
6778 packageName = "stream-shift";
6725 version = "1.0.0";
6779 version = "1.0.1";
6726 src = fetchurl {
6780 src = fetchurl {
6727 url = "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz";
6781 url = "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz";
6728 sha1 = "d5c752825e5367e786f78e18e445ea223a155952";
6782 sha512 = "AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==";
6729 };
6783 };
6730 };
6784 };
6731 "strict-uri-encode-1.1.0" = {
6785 "strict-uri-encode-1.1.0" = {
@@ -6755,22 +6809,40 b' let'
6755 sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==";
6809 sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==";
6756 };
6810 };
6757 };
6811 };
6758 "string.prototype.trimleft-2.1.0" = {
6812 "string.prototype.trimend-1.0.1" = {
6813 name = "string.prototype.trimend";
6814 packageName = "string.prototype.trimend";
6815 version = "1.0.1";
6816 src = fetchurl {
6817 url = "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz";
6818 sha512 = "LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==";
6819 };
6820 };
6821 "string.prototype.trimleft-2.1.2" = {
6759 name = "string.prototype.trimleft";
6822 name = "string.prototype.trimleft";
6760 packageName = "string.prototype.trimleft";
6823 packageName = "string.prototype.trimleft";
6761 version = "2.1.0";
6824 version = "2.1.2";
6762 src = fetchurl {
6825 src = fetchurl {
6763 url = "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz";
6826 url = "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz";
6764 sha512 = "FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==";
6827 sha512 = "gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==";
6765 };
6828 };
6766 };
6829 };
6767 "string.prototype.trimright-2.1.0" = {
6830 "string.prototype.trimright-2.1.2" = {
6768 name = "string.prototype.trimright";
6831 name = "string.prototype.trimright";
6769 packageName = "string.prototype.trimright";
6832 packageName = "string.prototype.trimright";
6770 version = "2.1.0";
6833 version = "2.1.2";
6771 src = fetchurl {
6834 src = fetchurl {
6772 url = "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz";
6835 url = "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz";
6773 sha512 = "fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==";
6836 sha512 = "ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==";
6837 };
6838 };
6839 "string.prototype.trimstart-1.0.1" = {
6840 name = "string.prototype.trimstart";
6841 packageName = "string.prototype.trimstart";
6842 version = "1.0.1";
6843 src = fetchurl {
6844 url = "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz";
6845 sha512 = "XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==";
6774 };
6846 };
6775 };
6847 };
6776 "string_decoder-0.10.31" = {
6848 "string_decoder-0.10.31" = {
@@ -6908,6 +6980,15 b' let'
6908 sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5";
6980 sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5";
6909 };
6981 };
6910 };
6982 };
6983 "sweetalert2-9.10.12" = {
6984 name = "sweetalert2";
6985 packageName = "sweetalert2";
6986 version = "9.10.12";
6987 src = fetchurl {
6988 url = "https://registry.npmjs.org/sweetalert2/-/sweetalert2-9.10.12.tgz";
6989 sha512 = "RnarmbDGTPmwecJbaVdq5LvlzbVReIOtPk0huPnXOE19G00xMxGcTY0wjt9AjwsexUnLivLXc3b6nD6+D6NlGg==";
6990 };
6991 };
6911 "tapable-0.2.9" = {
6992 "tapable-0.2.9" = {
6912 name = "tapable";
6993 name = "tapable";
6913 packageName = "tapable";
6994 packageName = "tapable";
@@ -7052,13 +7133,13 b' let'
7052 sha1 = "30c6203e1e66b841a88701ed8858f1725d94b026";
7133 sha1 = "30c6203e1e66b841a88701ed8858f1725d94b026";
7053 };
7134 };
7054 };
7135 };
7055 "tslib-1.10.0" = {
7136 "tslib-1.11.1" = {
7056 name = "tslib";
7137 name = "tslib";
7057 packageName = "tslib";
7138 packageName = "tslib";
7058 version = "1.10.0";
7139 version = "1.11.1";
7059 src = fetchurl {
7140 src = fetchurl {
7060 url = "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz";
7141 url = "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz";
7061 sha512 = "qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==";
7142 sha512 = "aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==";
7062 };
7143 };
7063 };
7144 };
7064 "tty-browserify-0.0.0" = {
7145 "tty-browserify-0.0.0" = {
@@ -7124,13 +7205,13 b' let'
7124 sha512 = "Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==";
7205 sha512 = "Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==";
7125 };
7206 };
7126 };
7207 };
7127 "uglify-js-3.6.7" = {
7208 "uglify-js-3.9.1" = {
7128 name = "uglify-js";
7209 name = "uglify-js";
7129 packageName = "uglify-js";
7210 packageName = "uglify-js";
7130 version = "3.6.7";
7211 version = "3.9.1";
7131 src = fetchurl {
7212 src = fetchurl {
7132 url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.7.tgz";
7213 url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz";
7133 sha512 = "4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A==";
7214 sha512 = "JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==";
7134 };
7215 };
7135 };
7216 };
7136 "uglify-to-browserify-1.0.2" = {
7217 "uglify-to-browserify-1.0.2" = {
@@ -7196,6 +7277,42 b' let'
7196 sha1 = "8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b";
7277 sha1 = "8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b";
7197 };
7278 };
7198 };
7279 };
7280 "unicode-canonical-property-names-ecmascript-1.0.4" = {
7281 name = "unicode-canonical-property-names-ecmascript";
7282 packageName = "unicode-canonical-property-names-ecmascript";
7283 version = "1.0.4";
7284 src = fetchurl {
7285 url = "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz";
7286 sha512 = "jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==";
7287 };
7288 };
7289 "unicode-match-property-ecmascript-1.0.4" = {
7290 name = "unicode-match-property-ecmascript";
7291 packageName = "unicode-match-property-ecmascript";
7292 version = "1.0.4";
7293 src = fetchurl {
7294 url = "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz";
7295 sha512 = "L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==";
7296 };
7297 };
7298 "unicode-match-property-value-ecmascript-1.2.0" = {
7299 name = "unicode-match-property-value-ecmascript";
7300 packageName = "unicode-match-property-value-ecmascript";
7301 version = "1.2.0";
7302 src = fetchurl {
7303 url = "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz";
7304 sha512 = "wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==";
7305 };
7306 };
7307 "unicode-property-aliases-ecmascript-1.1.0" = {
7308 name = "unicode-property-aliases-ecmascript";
7309 packageName = "unicode-property-aliases-ecmascript";
7310 version = "1.1.0";
7311 src = fetchurl {
7312 url = "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz";
7313 sha512 = "PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==";
7314 };
7315 };
7199 "union-value-1.0.1" = {
7316 "union-value-1.0.1" = {
7200 name = "union-value";
7317 name = "union-value";
7201 packageName = "union-value";
7318 packageName = "union-value";
@@ -7358,13 +7475,13 b' let'
7358 sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
7475 sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
7359 };
7476 };
7360 };
7477 };
7361 "uuid-3.3.3" = {
7478 "uuid-3.4.0" = {
7362 name = "uuid";
7479 name = "uuid";
7363 packageName = "uuid";
7480 packageName = "uuid";
7364 version = "3.3.3";
7481 version = "3.4.0";
7365 src = fetchurl {
7482 src = fetchurl {
7366 url = "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz";
7483 url = "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";
7367 sha512 = "pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==";
7484 sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==";
7368 };
7485 };
7369 };
7486 };
7370 "v8-compile-cache-2.1.0" = {
7487 "v8-compile-cache-2.1.0" = {
@@ -7385,13 +7502,13 b' let'
7385 sha512 = "amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==";
7502 sha512 = "amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==";
7386 };
7503 };
7387 };
7504 };
7388 "vendors-1.0.3" = {
7505 "vendors-1.0.4" = {
7389 name = "vendors";
7506 name = "vendors";
7390 packageName = "vendors";
7507 packageName = "vendors";
7391 version = "1.0.3";
7508 version = "1.0.4";
7392 src = fetchurl {
7509 src = fetchurl {
7393 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz";
7510 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz";
7394 sha512 = "fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==";
7511 sha512 = "/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==";
7395 };
7512 };
7396 };
7513 };
7397 "verror-1.10.0" = {
7514 "verror-1.10.0" = {
@@ -7403,22 +7520,22 b' let'
7403 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
7520 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
7404 };
7521 };
7405 };
7522 };
7406 "vm-browserify-1.1.0" = {
7523 "vm-browserify-1.1.2" = {
7407 name = "vm-browserify";
7524 name = "vm-browserify";
7408 packageName = "vm-browserify";
7525 packageName = "vm-browserify";
7409 version = "1.1.0";
7526 version = "1.1.2";
7410 src = fetchurl {
7527 src = fetchurl {
7411 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz";
7528 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz";
7412 sha512 = "iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==";
7529 sha512 = "2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==";
7413 };
7530 };
7414 };
7531 };
7415 "watchpack-1.6.0" = {
7532 "watchpack-1.6.1" = {
7416 name = "watchpack";
7533 name = "watchpack";
7417 packageName = "watchpack";
7534 packageName = "watchpack";
7418 version = "1.6.0";
7535 version = "1.6.1";
7419 src = fetchurl {
7536 src = fetchurl {
7420 url = "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz";
7537 url = "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz";
7421 sha512 = "i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==";
7538 sha512 = "+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==";
7422 };
7539 };
7423 };
7540 };
7424 "waypoints-4.0.1" = {
7541 "waypoints-4.0.1" = {
@@ -7622,27 +7739,27 b' let'
7622 sources."@polymer/iron-a11y-keys-3.0.1"
7739 sources."@polymer/iron-a11y-keys-3.0.1"
7623 sources."@polymer/iron-a11y-keys-behavior-3.0.1"
7740 sources."@polymer/iron-a11y-keys-behavior-3.0.1"
7624 sources."@polymer/iron-ajax-3.0.1"
7741 sources."@polymer/iron-ajax-3.0.1"
7625 sources."@polymer/iron-autogrow-textarea-3.0.1"
7742 sources."@polymer/iron-autogrow-textarea-3.0.3"
7626 sources."@polymer/iron-behaviors-3.0.1"
7743 sources."@polymer/iron-behaviors-3.0.1"
7627 sources."@polymer/iron-checked-element-behavior-3.0.1"
7744 sources."@polymer/iron-checked-element-behavior-3.0.1"
7628 sources."@polymer/iron-fit-behavior-3.0.1"
7745 sources."@polymer/iron-fit-behavior-3.0.2"
7629 sources."@polymer/iron-flex-layout-3.0.1"
7746 sources."@polymer/iron-flex-layout-3.0.1"
7630 sources."@polymer/iron-form-element-behavior-3.0.1"
7747 sources."@polymer/iron-form-element-behavior-3.0.1"
7631 sources."@polymer/iron-meta-3.0.1"
7748 sources."@polymer/iron-meta-3.0.1"
7632 sources."@polymer/iron-overlay-behavior-3.0.2"
7749 sources."@polymer/iron-overlay-behavior-3.0.3"
7633 sources."@polymer/iron-resizable-behavior-3.0.1"
7750 sources."@polymer/iron-resizable-behavior-3.0.1"
7634 sources."@polymer/iron-validatable-behavior-3.0.1"
7751 sources."@polymer/iron-validatable-behavior-3.0.1"
7635 sources."@polymer/paper-behaviors-3.0.1"
7752 sources."@polymer/paper-behaviors-3.0.1"
7636 sources."@polymer/paper-button-3.0.1"
7753 sources."@polymer/paper-button-3.0.1"
7637 sources."@polymer/paper-ripple-3.0.1"
7754 sources."@polymer/paper-ripple-3.0.2"
7638 sources."@polymer/paper-spinner-3.0.2"
7755 sources."@polymer/paper-spinner-3.0.2"
7639 sources."@polymer/paper-styles-3.0.1"
7756 sources."@polymer/paper-styles-3.0.1"
7640 sources."@polymer/paper-toast-3.0.1"
7757 sources."@polymer/paper-toast-3.0.1"
7641 sources."@polymer/paper-toggle-button-3.0.1"
7758 sources."@polymer/paper-toggle-button-3.0.1"
7642 sources."@polymer/paper-tooltip-3.0.1"
7759 sources."@polymer/paper-tooltip-3.0.1"
7643 sources."@polymer/polymer-3.3.0"
7760 sources."@polymer/polymer-3.3.1"
7644 sources."@types/clone-0.1.30"
7761 sources."@types/clone-0.1.30"
7645 sources."@types/node-6.14.9"
7762 sources."@types/node-6.14.10"
7646 sources."@types/parse5-2.2.34"
7763 sources."@types/parse5-2.2.34"
7647 sources."@webassemblyjs/ast-1.7.10"
7764 sources."@webassemblyjs/ast-1.7.10"
7648 sources."@webassemblyjs/floating-point-hex-parser-1.7.10"
7765 sources."@webassemblyjs/floating-point-hex-parser-1.7.10"
@@ -7662,12 +7779,12 b' let'
7662 sources."@webassemblyjs/wasm-parser-1.7.10"
7779 sources."@webassemblyjs/wasm-parser-1.7.10"
7663 sources."@webassemblyjs/wast-parser-1.7.10"
7780 sources."@webassemblyjs/wast-parser-1.7.10"
7664 sources."@webassemblyjs/wast-printer-1.7.10"
7781 sources."@webassemblyjs/wast-printer-1.7.10"
7665 sources."@webcomponents/shadycss-1.9.2"
7782 sources."@webcomponents/shadycss-1.9.6"
7666 sources."@webcomponents/webcomponentsjs-2.3.0"
7783 sources."@webcomponents/webcomponentsjs-2.4.3"
7667 sources."@xtuc/ieee754-1.2.0"
7784 sources."@xtuc/ieee754-1.2.0"
7668 sources."@xtuc/long-4.2.1"
7785 sources."@xtuc/long-4.2.1"
7669 sources."abbrev-1.1.1"
7786 sources."abbrev-1.1.1"
7670 sources."acorn-5.7.3"
7787 sources."acorn-5.7.4"
7671 sources."acorn-dynamic-import-3.0.0"
7788 sources."acorn-dynamic-import-3.0.0"
7672 (sources."acorn-jsx-3.0.1" // {
7789 (sources."acorn-jsx-3.0.1" // {
7673 dependencies = [
7790 dependencies = [
@@ -7727,7 +7844,7 b' let'
7727 ];
7844 ];
7728 })
7845 })
7729 sources."aws-sign2-0.6.0"
7846 sources."aws-sign2-0.6.0"
7730 sources."aws4-1.8.0"
7847 sources."aws4-1.9.1"
7731 (sources."babel-code-frame-6.26.0" // {
7848 (sources."babel-code-frame-6.26.0" // {
7732 dependencies = [
7849 dependencies = [
7733 sources."ansi-regex-2.1.1"
7850 sources."ansi-regex-2.1.1"
@@ -7841,7 +7958,8 b' let'
7841 sources."bcrypt-pbkdf-1.0.2"
7958 sources."bcrypt-pbkdf-1.0.2"
7842 sources."big.js-5.2.2"
7959 sources."big.js-5.2.2"
7843 sources."binary-extensions-1.13.1"
7960 sources."binary-extensions-1.13.1"
7844 sources."bluebird-3.7.1"
7961 sources."bindings-1.5.0"
7962 sources."bluebird-3.7.2"
7845 sources."bn.js-4.11.8"
7963 sources."bn.js-4.11.8"
7846 sources."boolbase-1.0.0"
7964 sources."boolbase-1.0.0"
7847 sources."boom-2.10.1"
7965 sources."boom-2.10.1"
@@ -7859,13 +7977,13 b' let'
7859 sources."browserify-sign-4.0.4"
7977 sources."browserify-sign-4.0.4"
7860 sources."browserify-zlib-0.2.0"
7978 sources."browserify-zlib-0.2.0"
7861 sources."browserslist-3.2.8"
7979 sources."browserslist-3.2.8"
7862 sources."buffer-4.9.1"
7980 sources."buffer-4.9.2"
7863 sources."buffer-from-1.1.1"
7981 sources."buffer-from-1.1.1"
7864 sources."buffer-xor-1.0.3"
7982 sources."buffer-xor-1.0.3"
7865 sources."builtin-status-codes-3.0.0"
7983 sources."builtin-status-codes-3.0.0"
7866 (sources."cacache-10.0.4" // {
7984 (sources."cacache-10.0.4" // {
7867 dependencies = [
7985 dependencies = [
7868 sources."glob-7.1.5"
7986 sources."glob-7.1.6"
7869 sources."graceful-fs-4.2.3"
7987 sources."graceful-fs-4.2.3"
7870 sources."lru-cache-4.1.5"
7988 sources."lru-cache-4.1.5"
7871 sources."minimatch-3.0.4"
7989 sources."minimatch-3.0.4"
@@ -7880,8 +7998,8 b' let'
7880 sources."browserslist-1.7.7"
7998 sources."browserslist-1.7.7"
7881 ];
7999 ];
7882 })
8000 })
7883 sources."caniuse-db-1.0.30001006"
8001 sources."caniuse-db-1.0.30001042"
7884 sources."caniuse-lite-1.0.30001006"
8002 sources."caniuse-lite-1.0.30001042"
7885 sources."caseless-0.12.0"
8003 sources."caseless-0.12.0"
7886 sources."center-align-0.1.3"
8004 sources."center-align-0.1.3"
7887 sources."chalk-0.5.1"
8005 sources."chalk-0.5.1"
@@ -7890,7 +8008,7 b' let'
7890 sources."is-glob-4.0.1"
8008 sources."is-glob-4.0.1"
7891 ];
8009 ];
7892 })
8010 })
7893 sources."chownr-1.1.3"
8011 sources."chownr-1.1.4"
7894 sources."chrome-trace-event-1.0.2"
8012 sources."chrome-trace-event-1.0.2"
7895 sources."cipher-base-1.0.4"
8013 sources."cipher-base-1.0.4"
7896 (sources."clap-1.2.3" // {
8014 (sources."clap-1.2.3" // {
@@ -7920,18 +8038,18 b' let'
7920 sources."kind-of-5.1.0"
8038 sources."kind-of-5.1.0"
7921 ];
8039 ];
7922 })
8040 })
7923 (sources."clean-css-4.2.1" // {
8041 (sources."clean-css-4.2.3" // {
7924 dependencies = [
8042 dependencies = [
7925 sources."source-map-0.6.1"
8043 sources."source-map-0.6.1"
7926 ];
8044 ];
7927 })
8045 })
7928 (sources."cli-1.0.1" // {
8046 (sources."cli-1.0.1" // {
7929 dependencies = [
8047 dependencies = [
7930 sources."glob-7.1.5"
8048 sources."glob-7.1.6"
7931 sources."minimatch-3.0.4"
8049 sources."minimatch-3.0.4"
7932 ];
8050 ];
7933 })
8051 })
7934 sources."clipboard-2.0.4"
8052 sources."clipboard-2.0.6"
7935 (sources."cliui-4.1.0" // {
8053 (sources."cliui-4.1.0" // {
7936 dependencies = [
8054 dependencies = [
7937 sources."ansi-regex-3.0.0"
8055 sources."ansi-regex-3.0.0"
@@ -7957,21 +8075,21 b' let'
7957 sources."concat-map-0.0.1"
8075 sources."concat-map-0.0.1"
7958 (sources."concat-stream-1.6.2" // {
8076 (sources."concat-stream-1.6.2" // {
7959 dependencies = [
8077 dependencies = [
7960 sources."readable-stream-2.3.6"
8078 sources."readable-stream-2.3.7"
7961 sources."safe-buffer-5.1.2"
8079 sources."safe-buffer-5.1.2"
7962 sources."string_decoder-1.1.1"
8080 sources."string_decoder-1.1.1"
7963 ];
8081 ];
7964 })
8082 })
7965 sources."console-browserify-1.1.0"
8083 sources."console-browserify-1.1.0"
7966 sources."constants-browserify-1.0.0"
8084 sources."constants-browserify-1.0.0"
7967 (sources."convert-source-map-1.6.0" // {
8085 (sources."convert-source-map-1.7.0" // {
7968 dependencies = [
8086 dependencies = [
7969 sources."safe-buffer-5.1.2"
8087 sources."safe-buffer-5.1.2"
7970 ];
8088 ];
7971 })
8089 })
7972 (sources."copy-concurrently-1.0.5" // {
8090 (sources."copy-concurrently-1.0.5" // {
7973 dependencies = [
8091 dependencies = [
7974 sources."glob-7.1.5"
8092 sources."glob-7.1.6"
7975 sources."minimatch-3.0.4"
8093 sources."minimatch-3.0.4"
7976 sources."rimraf-2.7.1"
8094 sources."rimraf-2.7.1"
7977 ];
8095 ];
@@ -7983,7 +8101,7 b' let'
7983 sources."minimatch-3.0.4"
8101 sources."minimatch-3.0.4"
7984 ];
8102 ];
7985 })
8103 })
7986 sources."core-js-2.6.10"
8104 sources."core-js-2.6.11"
7987 sources."core-util-is-1.0.2"
8105 sources."core-util-is-1.0.2"
7988 sources."create-ecdh-4.0.3"
8106 sources."create-ecdh-4.0.3"
7989 sources."create-hash-1.2.0"
8107 sources."create-hash-1.2.0"
@@ -7998,13 +8116,16 b' let'
7998 sources."css-color-names-0.0.4"
8116 sources."css-color-names-0.0.4"
7999 sources."css-loader-0.28.11"
8117 sources."css-loader-0.28.11"
8000 sources."css-select-1.2.0"
8118 sources."css-select-1.2.0"
8001 (sources."css-selector-tokenizer-0.7.1" // {
8119 (sources."css-selector-tokenizer-0.7.2" // {
8002 dependencies = [
8120 dependencies = [
8003 sources."regexpu-core-1.0.0"
8121 sources."jsesc-0.5.0"
8122 sources."regexpu-core-4.7.0"
8123 sources."regjsgen-0.5.1"
8124 sources."regjsparser-0.6.4"
8004 ];
8125 ];
8005 })
8126 })
8006 sources."css-what-2.1.3"
8127 sources."css-what-2.1.3"
8007 sources."cssesc-0.1.0"
8128 sources."cssesc-3.0.0"
8008 sources."cssnano-3.10.0"
8129 sources."cssnano-3.10.0"
8009 sources."csso-2.3.2"
8130 sources."csso-2.3.2"
8010 sources."cyclist-1.0.1"
8131 sources."cyclist-1.0.1"
@@ -8024,13 +8145,13 b' let'
8024 sources."defined-1.0.0"
8145 sources."defined-1.0.0"
8025 sources."delayed-stream-1.0.0"
8146 sources."delayed-stream-1.0.0"
8026 sources."delegate-3.2.0"
8147 sources."delegate-3.2.0"
8027 sources."des.js-1.0.0"
8148 sources."des.js-1.0.1"
8028 sources."detect-file-1.0.0"
8149 sources."detect-file-1.0.0"
8029 sources."detect-indent-4.0.0"
8150 sources."detect-indent-4.0.0"
8030 sources."diffie-hellman-5.0.3"
8151 sources."diffie-hellman-5.0.3"
8031 sources."dir-glob-2.2.2"
8152 sources."dir-glob-2.2.2"
8032 sources."dom-converter-0.2.0"
8153 sources."dom-converter-0.2.0"
8033 (sources."dom-serializer-0.2.1" // {
8154 (sources."dom-serializer-0.2.2" // {
8034 dependencies = [
8155 dependencies = [
8035 sources."domelementtype-2.0.1"
8156 sources."domelementtype-2.0.1"
8036 sources."entities-2.0.0"
8157 sources."entities-2.0.0"
@@ -8046,33 +8167,33 b' let'
8046 sources."domelementtype-1.3.1"
8167 sources."domelementtype-1.3.1"
8047 sources."domhandler-2.3.0"
8168 sources."domhandler-2.3.0"
8048 sources."domutils-1.5.1"
8169 sources."domutils-1.5.1"
8049 sources."dropzone-5.5.1"
8170 sources."dropzone-5.7.0"
8050 sources."duplexer-0.1.1"
8171 sources."duplexer-0.1.1"
8051 (sources."duplexify-3.7.1" // {
8172 (sources."duplexify-3.7.1" // {
8052 dependencies = [
8173 dependencies = [
8053 sources."readable-stream-2.3.6"
8174 sources."readable-stream-2.3.7"
8054 sources."safe-buffer-5.1.2"
8175 sources."safe-buffer-5.1.2"
8055 sources."string_decoder-1.1.1"
8176 sources."string_decoder-1.1.1"
8056 ];
8177 ];
8057 })
8178 })
8058 sources."ecc-jsbn-0.1.2"
8179 sources."ecc-jsbn-0.1.2"
8059 sources."electron-to-chromium-1.3.302"
8180 sources."electron-to-chromium-1.3.412"
8060 sources."elliptic-6.5.1"
8181 sources."elliptic-6.5.2"
8061 sources."emojis-list-2.1.0"
8182 sources."emojis-list-3.0.0"
8062 sources."end-of-stream-1.4.4"
8183 sources."end-of-stream-1.4.4"
8063 (sources."enhanced-resolve-4.1.1" // {
8184 (sources."enhanced-resolve-4.1.1" // {
8064 dependencies = [
8185 dependencies = [
8065 sources."graceful-fs-4.2.3"
8186 sources."graceful-fs-4.2.3"
8066 sources."memory-fs-0.5.0"
8187 sources."memory-fs-0.5.0"
8067 sources."readable-stream-2.3.6"
8188 sources."readable-stream-2.3.7"
8068 sources."safe-buffer-5.1.2"
8189 sources."safe-buffer-5.1.2"
8069 sources."string_decoder-1.1.1"
8190 sources."string_decoder-1.1.1"
8070 ];
8191 ];
8071 })
8192 })
8072 sources."entities-1.0.0"
8193 sources."entities-1.0.0"
8073 sources."errno-0.1.7"
8194 sources."errno-0.1.7"
8074 sources."es-abstract-1.16.0"
8195 sources."es-abstract-1.17.5"
8075 sources."es-to-primitive-1.2.0"
8196 sources."es-to-primitive-1.2.1"
8076 sources."es6-templates-0.2.3"
8197 sources."es6-templates-0.2.3"
8077 sources."escape-string-regexp-1.0.5"
8198 sources."escape-string-regexp-1.0.5"
8078 sources."eslint-scope-4.0.3"
8199 sources."eslint-scope-4.0.3"
@@ -8082,7 +8203,7 b' let'
8082 sources."estraverse-4.3.0"
8203 sources."estraverse-4.3.0"
8083 sources."esutils-2.0.3"
8204 sources."esutils-2.0.3"
8084 sources."eventemitter2-0.4.14"
8205 sources."eventemitter2-0.4.14"
8085 sources."events-3.0.0"
8206 sources."events-3.1.0"
8086 sources."evp_bytestokey-1.0.3"
8207 sources."evp_bytestokey-1.0.3"
8087 sources."execa-1.0.0"
8208 sources."execa-1.0.0"
8088 sources."exit-0.1.2"
8209 sources."exit-0.1.2"
@@ -8119,13 +8240,14 b' let'
8119 ];
8240 ];
8120 })
8241 })
8121 sources."extsprintf-1.3.0"
8242 sources."extsprintf-1.3.0"
8122 sources."fast-deep-equal-2.0.1"
8243 sources."fast-deep-equal-3.1.1"
8123 sources."fast-json-stable-stringify-2.0.0"
8244 sources."fast-json-stable-stringify-2.1.0"
8124 sources."fastparse-1.1.2"
8245 sources."fastparse-1.1.2"
8125 sources."favico.js-0.3.10"
8246 sources."favico.js-0.3.10"
8126 sources."faye-websocket-0.4.4"
8247 sources."faye-websocket-0.4.4"
8127 sources."figures-1.7.0"
8248 sources."figures-1.7.0"
8128 sources."file-sync-cmp-0.1.1"
8249 sources."file-sync-cmp-0.1.1"
8250 sources."file-uri-to-path-1.0.0"
8129 (sources."fill-range-4.0.0" // {
8251 (sources."fill-range-4.0.0" // {
8130 dependencies = [
8252 dependencies = [
8131 sources."extend-shallow-2.0.1"
8253 sources."extend-shallow-2.0.1"
@@ -8145,7 +8267,7 b' let'
8145 sources."flatten-1.0.3"
8267 sources."flatten-1.0.3"
8146 (sources."flush-write-stream-1.1.1" // {
8268 (sources."flush-write-stream-1.1.1" // {
8147 dependencies = [
8269 dependencies = [
8148 sources."readable-stream-2.3.6"
8270 sources."readable-stream-2.3.7"
8149 sources."safe-buffer-5.1.2"
8271 sources."safe-buffer-5.1.2"
8150 sources."string_decoder-1.1.1"
8272 sources."string_decoder-1.1.1"
8151 ];
8273 ];
@@ -8157,7 +8279,7 b' let'
8157 sources."fragment-cache-0.2.1"
8279 sources."fragment-cache-0.2.1"
8158 (sources."from2-2.3.0" // {
8280 (sources."from2-2.3.0" // {
8159 dependencies = [
8281 dependencies = [
8160 sources."readable-stream-2.3.6"
8282 sources."readable-stream-2.3.7"
8161 sources."safe-buffer-5.1.2"
8283 sources."safe-buffer-5.1.2"
8162 sources."string_decoder-1.1.1"
8284 sources."string_decoder-1.1.1"
8163 ];
8285 ];
@@ -8168,7 +8290,7 b' let'
8168 ];
8290 ];
8169 })
8291 })
8170 sources."fs.realpath-1.0.0"
8292 sources."fs.realpath-1.0.0"
8171 sources."fsevents-1.2.9"
8293 sources."fsevents-1.2.12"
8172 sources."function-bind-1.1.1"
8294 sources."function-bind-1.1.1"
8173 sources."gaze-0.5.2"
8295 sources."gaze-0.5.2"
8174 sources."get-caller-file-1.0.3"
8296 sources."get-caller-file-1.0.3"
@@ -8200,7 +8322,7 b' let'
8200 sources."globals-9.18.0"
8322 sources."globals-9.18.0"
8201 (sources."globby-7.1.1" // {
8323 (sources."globby-7.1.1" // {
8202 dependencies = [
8324 dependencies = [
8203 sources."glob-7.1.5"
8325 sources."glob-7.1.6"
8204 sources."minimatch-3.0.4"
8326 sources."minimatch-3.0.4"
8205 ];
8327 ];
8206 })
8328 })
@@ -8214,7 +8336,7 b' let'
8214 sources."grunt-0.4.5"
8336 sources."grunt-0.4.5"
8215 (sources."grunt-cli-1.3.2" // {
8337 (sources."grunt-cli-1.3.2" // {
8216 dependencies = [
8338 dependencies = [
8217 sources."nopt-4.0.1"
8339 sources."nopt-4.0.3"
8218 ];
8340 ];
8219 })
8341 })
8220 (sources."grunt-contrib-concat-0.5.1" // {
8342 (sources."grunt-contrib-concat-0.5.1" // {
@@ -8289,7 +8411,7 b' let'
8289 sources."has-1.0.3"
8411 sources."has-1.0.3"
8290 sources."has-ansi-0.1.0"
8412 sources."has-ansi-0.1.0"
8291 sources."has-flag-3.0.0"
8413 sources."has-flag-3.0.0"
8292 sources."has-symbols-1.0.0"
8414 sources."has-symbols-1.0.1"
8293 sources."has-value-1.0.0"
8415 sources."has-value-1.0.0"
8294 (sources."has-values-1.0.0" // {
8416 (sources."has-values-1.0.0" // {
8295 dependencies = [
8417 dependencies = [
@@ -8321,6 +8443,7 b' let'
8321 (sources."html-webpack-plugin-3.2.0" // {
8443 (sources."html-webpack-plugin-3.2.0" // {
8322 dependencies = [
8444 dependencies = [
8323 sources."big.js-3.2.0"
8445 sources."big.js-3.2.0"
8446 sources."emojis-list-2.1.0"
8324 sources."json5-0.5.1"
8447 sources."json5-0.5.1"
8325 sources."loader-utils-0.2.17"
8448 sources."loader-utils-0.2.17"
8326 sources."lodash-4.17.15"
8449 sources."lodash-4.17.15"
@@ -8348,7 +8471,7 b' let'
8348 dependencies = [
8471 dependencies = [
8349 sources."find-up-3.0.0"
8472 sources."find-up-3.0.0"
8350 sources."locate-path-3.0.0"
8473 sources."locate-path-3.0.0"
8351 sources."p-limit-2.2.1"
8474 sources."p-limit-2.3.0"
8352 sources."p-locate-3.0.0"
8475 sources."p-locate-3.0.0"
8353 sources."p-try-2.2.0"
8476 sources."p-try-2.2.0"
8354 sources."pkg-dir-3.0.0"
8477 sources."pkg-dir-3.0.0"
@@ -8368,13 +8491,13 b' let'
8368 sources."is-accessor-descriptor-1.0.0"
8491 sources."is-accessor-descriptor-1.0.0"
8369 sources."is-binary-path-1.0.1"
8492 sources."is-binary-path-1.0.1"
8370 sources."is-buffer-1.1.6"
8493 sources."is-buffer-1.1.6"
8371 sources."is-callable-1.1.4"
8494 sources."is-callable-1.1.5"
8372 sources."is-data-descriptor-1.0.0"
8495 sources."is-data-descriptor-1.0.0"
8373 sources."is-date-object-1.0.1"
8496 sources."is-date-object-1.0.2"
8374 sources."is-descriptor-1.0.2"
8497 sources."is-descriptor-1.0.2"
8375 sources."is-extendable-0.1.1"
8498 sources."is-extendable-0.1.1"
8376 sources."is-extglob-2.1.1"
8499 sources."is-extglob-2.1.1"
8377 sources."is-finite-1.0.2"
8500 sources."is-finite-1.1.0"
8378 sources."is-fullwidth-code-point-1.0.0"
8501 sources."is-fullwidth-code-point-1.0.0"
8379 sources."is-glob-3.1.0"
8502 sources."is-glob-3.1.0"
8380 (sources."is-number-3.0.0" // {
8503 (sources."is-number-3.0.0" // {
@@ -8384,11 +8507,11 b' let'
8384 })
8507 })
8385 sources."is-plain-obj-1.1.0"
8508 sources."is-plain-obj-1.1.0"
8386 sources."is-plain-object-2.0.4"
8509 sources."is-plain-object-2.0.4"
8387 sources."is-regex-1.0.4"
8510 sources."is-regex-1.0.5"
8388 sources."is-relative-1.0.0"
8511 sources."is-relative-1.0.0"
8389 sources."is-stream-1.1.0"
8512 sources."is-stream-1.1.0"
8390 sources."is-svg-2.1.0"
8513 sources."is-svg-2.1.0"
8391 sources."is-symbol-1.0.2"
8514 sources."is-symbol-1.0.3"
8392 sources."is-typedarray-1.0.0"
8515 sources."is-typedarray-1.0.0"
8393 sources."is-unc-path-1.0.0"
8516 sources."is-unc-path-1.0.0"
8394 sources."is-windows-1.0.2"
8517 sources."is-windows-1.0.2"
@@ -8397,12 +8520,12 b' let'
8397 sources."isobject-3.0.1"
8520 sources."isobject-3.0.1"
8398 sources."isstream-0.1.2"
8521 sources."isstream-0.1.2"
8399 sources."jquery-1.11.3"
8522 sources."jquery-1.11.3"
8400 sources."js-base64-2.5.1"
8523 sources."js-base64-2.5.2"
8401 sources."js-tokens-3.0.2"
8524 sources."js-tokens-3.0.2"
8402 sources."js-yaml-2.0.5"
8525 sources."js-yaml-2.0.5"
8403 sources."jsbn-0.1.1"
8526 sources."jsbn-0.1.1"
8404 sources."jsesc-1.3.0"
8527 sources."jsesc-1.3.0"
8405 (sources."jshint-2.10.2" // {
8528 (sources."jshint-2.11.0" // {
8406 dependencies = [
8529 dependencies = [
8407 sources."lodash-4.17.15"
8530 sources."lodash-4.17.15"
8408 sources."minimatch-3.0.4"
8531 sources."minimatch-3.0.4"
@@ -8420,7 +8543,7 b' let'
8420 sources."assert-plus-1.0.0"
8543 sources."assert-plus-1.0.0"
8421 ];
8544 ];
8422 })
8545 })
8423 sources."kind-of-6.0.2"
8546 sources."kind-of-6.0.3"
8424 sources."lazy-cache-1.0.4"
8547 sources."lazy-cache-1.0.4"
8425 sources."lcid-2.0.0"
8548 sources."lcid-2.0.0"
8426 (sources."less-2.7.3" // {
8549 (sources."less-2.7.3" // {
@@ -8434,7 +8557,7 b' let'
8434 ];
8557 ];
8435 })
8558 })
8436 sources."loader-runner-2.4.0"
8559 sources."loader-runner-2.4.0"
8437 sources."loader-utils-1.2.3"
8560 sources."loader-utils-1.4.0"
8438 sources."locate-path-2.0.0"
8561 sources."locate-path-2.0.0"
8439 sources."lodash-0.9.2"
8562 sources."lodash-0.9.2"
8440 sources."lodash.camelcase-4.3.0"
8563 sources."lodash.camelcase-4.3.0"
@@ -8451,7 +8574,7 b' let'
8451 sources."map-cache-0.2.2"
8574 sources."map-cache-0.2.2"
8452 sources."map-visit-1.0.0"
8575 sources."map-visit-1.0.0"
8453 sources."mark.js-8.11.1"
8576 sources."mark.js-8.11.1"
8454 sources."math-expression-evaluator-1.2.17"
8577 sources."math-expression-evaluator-1.2.22"
8455 (sources."maxmin-2.1.0" // {
8578 (sources."maxmin-2.1.0" // {
8456 dependencies = [
8579 dependencies = [
8457 sources."ansi-regex-2.1.1"
8580 sources."ansi-regex-2.1.1"
@@ -8466,7 +8589,7 b' let'
8466 sources."mem-4.3.0"
8589 sources."mem-4.3.0"
8467 (sources."memory-fs-0.4.1" // {
8590 (sources."memory-fs-0.4.1" // {
8468 dependencies = [
8591 dependencies = [
8469 sources."readable-stream-2.3.6"
8592 sources."readable-stream-2.3.7"
8470 sources."safe-buffer-5.1.2"
8593 sources."safe-buffer-5.1.2"
8471 sources."string_decoder-1.1.1"
8594 sources."string_decoder-1.1.1"
8472 ];
8595 ];
@@ -8474,29 +8597,25 b' let'
8474 sources."micromatch-3.1.10"
8597 sources."micromatch-3.1.10"
8475 sources."miller-rabin-4.0.1"
8598 sources."miller-rabin-4.0.1"
8476 sources."mime-1.6.0"
8599 sources."mime-1.6.0"
8477 sources."mime-db-1.40.0"
8600 sources."mime-db-1.43.0"
8478 sources."mime-types-2.1.24"
8601 sources."mime-types-2.1.26"
8479 sources."mimic-fn-2.1.0"
8602 sources."mimic-fn-2.1.0"
8480 sources."minimalistic-assert-1.0.1"
8603 sources."minimalistic-assert-1.0.1"
8481 sources."minimalistic-crypto-utils-1.0.1"
8604 sources."minimalistic-crypto-utils-1.0.1"
8482 sources."minimatch-0.2.14"
8605 sources."minimatch-0.2.14"
8483 sources."minimist-1.2.0"
8606 sources."minimist-1.2.5"
8484 sources."mississippi-2.0.0"
8607 sources."mississippi-2.0.0"
8485 (sources."mixin-deep-1.3.2" // {
8608 (sources."mixin-deep-1.3.2" // {
8486 dependencies = [
8609 dependencies = [
8487 sources."is-extendable-1.0.1"
8610 sources."is-extendable-1.0.1"
8488 ];
8611 ];
8489 })
8612 })
8490 (sources."mkdirp-0.5.1" // {
8613 sources."mkdirp-0.5.5"
8491 dependencies = [
8492 sources."minimist-0.0.8"
8493 ];
8494 })
8495 sources."moment-2.24.0"
8614 sources."moment-2.24.0"
8496 sources."mousetrap-1.6.3"
8615 sources."mousetrap-1.6.5"
8497 (sources."move-concurrently-1.0.1" // {
8616 (sources."move-concurrently-1.0.1" // {
8498 dependencies = [
8617 dependencies = [
8499 sources."glob-7.1.5"
8618 sources."glob-7.1.6"
8500 sources."minimatch-3.0.4"
8619 sources."minimatch-3.0.4"
8501 sources."rimraf-2.7.1"
8620 sources."rimraf-2.7.1"
8502 ];
8621 ];
@@ -8509,7 +8628,7 b' let'
8509 sources."no-case-2.3.2"
8628 sources."no-case-2.3.2"
8510 (sources."node-libs-browser-2.2.1" // {
8629 (sources."node-libs-browser-2.2.1" // {
8511 dependencies = [
8630 dependencies = [
8512 (sources."readable-stream-2.3.6" // {
8631 (sources."readable-stream-2.3.7" // {
8513 dependencies = [
8632 dependencies = [
8514 sources."string_decoder-1.1.1"
8633 sources."string_decoder-1.1.1"
8515 ];
8634 ];
@@ -8550,11 +8669,12 b' let'
8550 sources."kind-of-3.2.2"
8669 sources."kind-of-3.2.2"
8551 ];
8670 ];
8552 })
8671 })
8553 sources."object-inspect-1.6.0"
8672 sources."object-inspect-1.7.0"
8554 sources."object-keys-1.1.1"
8673 sources."object-keys-1.1.1"
8555 sources."object-visit-1.0.1"
8674 sources."object-visit-1.0.1"
8675 sources."object.assign-4.1.0"
8556 sources."object.defaults-1.1.0"
8676 sources."object.defaults-1.1.0"
8557 sources."object.getownpropertydescriptors-2.0.3"
8677 sources."object.getownpropertydescriptors-2.1.0"
8558 sources."object.map-1.0.1"
8678 sources."object.map-1.0.1"
8559 sources."object.pick-1.3.0"
8679 sources."object.pick-1.3.0"
8560 sources."once-1.4.0"
8680 sources."once-1.4.0"
@@ -8569,10 +8689,10 b' let'
8569 sources."p-limit-1.3.0"
8689 sources."p-limit-1.3.0"
8570 sources."p-locate-2.0.0"
8690 sources."p-locate-2.0.0"
8571 sources."p-try-1.0.0"
8691 sources."p-try-1.0.0"
8572 sources."pako-1.0.10"
8692 sources."pako-1.0.11"
8573 (sources."parallel-transform-1.2.0" // {
8693 (sources."parallel-transform-1.2.0" // {
8574 dependencies = [
8694 dependencies = [
8575 sources."readable-stream-2.3.6"
8695 sources."readable-stream-2.3.7"
8576 sources."safe-buffer-5.1.2"
8696 sources."safe-buffer-5.1.2"
8577 sources."string_decoder-1.1.1"
8697 sources."string_decoder-1.1.1"
8578 ];
8698 ];
@@ -8729,7 +8849,7 b' let'
8729 (sources."readdirp-2.2.1" // {
8849 (sources."readdirp-2.2.1" // {
8730 dependencies = [
8850 dependencies = [
8731 sources."graceful-fs-4.2.3"
8851 sources."graceful-fs-4.2.3"
8732 sources."readable-stream-2.3.6"
8852 sources."readable-stream-2.3.7"
8733 sources."safe-buffer-5.1.2"
8853 sources."safe-buffer-5.1.2"
8734 sources."string_decoder-1.1.1"
8854 sources."string_decoder-1.1.1"
8735 ];
8855 ];
@@ -8747,6 +8867,7 b' let'
8747 })
8867 })
8748 sources."reduce-function-call-1.0.3"
8868 sources."reduce-function-call-1.0.3"
8749 sources."regenerate-1.4.0"
8869 sources."regenerate-1.4.0"
8870 sources."regenerate-unicode-properties-8.2.0"
8750 sources."regenerator-runtime-0.11.1"
8871 sources."regenerator-runtime-0.11.1"
8751 sources."regenerator-transform-0.10.1"
8872 sources."regenerator-transform-0.10.1"
8752 sources."regex-not-1.0.2"
8873 sources."regex-not-1.0.2"
@@ -8771,7 +8892,7 b' let'
8771 sources."request-2.81.0"
8892 sources."request-2.81.0"
8772 sources."require-directory-2.1.1"
8893 sources."require-directory-2.1.1"
8773 sources."require-main-filename-1.0.1"
8894 sources."require-main-filename-1.0.1"
8774 sources."resolve-1.12.0"
8895 sources."resolve-1.16.0"
8775 sources."resolve-cwd-2.0.0"
8896 sources."resolve-cwd-2.0.0"
8776 sources."resolve-dir-1.0.1"
8897 sources."resolve-dir-1.0.1"
8777 sources."resolve-from-3.0.0"
8898 sources."resolve-from-3.0.0"
@@ -8787,7 +8908,7 b' let'
8787 sources."sax-1.2.4"
8908 sources."sax-1.2.4"
8788 (sources."schema-utils-0.4.7" // {
8909 (sources."schema-utils-0.4.7" // {
8789 dependencies = [
8910 dependencies = [
8790 sources."ajv-6.10.2"
8911 sources."ajv-6.12.0"
8791 ];
8912 ];
8792 })
8913 })
8793 sources."select-1.1.2"
8914 sources."select-1.1.2"
@@ -8805,7 +8926,7 b' let'
8805 sources."shebang-regex-1.0.0"
8926 sources."shebang-regex-1.0.0"
8806 sources."shelljs-0.3.0"
8927 sources."shelljs-0.3.0"
8807 sources."sigmund-1.0.1"
8928 sources."sigmund-1.0.1"
8808 sources."signal-exit-3.0.2"
8929 sources."signal-exit-3.0.3"
8809 sources."slash-1.0.0"
8930 sources."slash-1.0.0"
8810 (sources."snapdragon-0.8.2" // {
8931 (sources."snapdragon-0.8.2" // {
8811 dependencies = [
8932 dependencies = [
@@ -8839,7 +8960,7 b' let'
8839 sources."sort-keys-1.1.2"
8960 sources."sort-keys-1.1.2"
8840 sources."source-list-map-2.0.1"
8961 sources."source-list-map-2.0.1"
8841 sources."source-map-0.5.7"
8962 sources."source-map-0.5.7"
8842 sources."source-map-resolve-0.5.2"
8963 sources."source-map-resolve-0.5.3"
8843 sources."source-map-support-0.4.18"
8964 sources."source-map-support-0.4.18"
8844 sources."source-map-url-0.4.0"
8965 sources."source-map-url-0.4.0"
8845 sources."split-string-3.1.0"
8966 sources."split-string-3.1.0"
@@ -8870,7 +8991,7 b' let'
8870 sources."sticky-sidebar-3.3.1"
8991 sources."sticky-sidebar-3.3.1"
8871 (sources."stream-browserify-2.0.2" // {
8992 (sources."stream-browserify-2.0.2" // {
8872 dependencies = [
8993 dependencies = [
8873 sources."readable-stream-2.3.6"
8994 sources."readable-stream-2.3.7"
8874 sources."safe-buffer-5.1.2"
8995 sources."safe-buffer-5.1.2"
8875 sources."string_decoder-1.1.1"
8996 sources."string_decoder-1.1.1"
8876 ];
8997 ];
@@ -8878,12 +8999,12 b' let'
8878 sources."stream-each-1.2.3"
8999 sources."stream-each-1.2.3"
8879 (sources."stream-http-2.8.3" // {
9000 (sources."stream-http-2.8.3" // {
8880 dependencies = [
9001 dependencies = [
8881 sources."readable-stream-2.3.6"
9002 sources."readable-stream-2.3.7"
8882 sources."safe-buffer-5.1.2"
9003 sources."safe-buffer-5.1.2"
8883 sources."string_decoder-1.1.1"
9004 sources."string_decoder-1.1.1"
8884 ];
9005 ];
8885 })
9006 })
8886 sources."stream-shift-1.0.0"
9007 sources."stream-shift-1.0.1"
8887 sources."strict-uri-encode-1.1.0"
9008 sources."strict-uri-encode-1.1.0"
8888 (sources."string-width-2.1.1" // {
9009 (sources."string-width-2.1.1" // {
8889 dependencies = [
9010 dependencies = [
@@ -8892,8 +9013,10 b' let'
8892 sources."strip-ansi-4.0.0"
9013 sources."strip-ansi-4.0.0"
8893 ];
9014 ];
8894 })
9015 })
8895 sources."string.prototype.trimleft-2.1.0"
9016 sources."string.prototype.trimend-1.0.1"
8896 sources."string.prototype.trimright-2.1.0"
9017 sources."string.prototype.trimleft-2.1.2"
9018 sources."string.prototype.trimright-2.1.2"
9019 sources."string.prototype.trimstart-1.0.1"
8897 sources."string_decoder-0.10.31"
9020 sources."string_decoder-0.10.31"
8898 sources."stringstream-0.0.6"
9021 sources."stringstream-0.0.6"
8899 sources."strip-ansi-0.3.0"
9022 sources."strip-ansi-0.3.0"
@@ -8909,11 +9032,12 b' let'
8909 sources."js-yaml-3.7.0"
9032 sources."js-yaml-3.7.0"
8910 ];
9033 ];
8911 })
9034 })
9035 sources."sweetalert2-9.10.12"
8912 sources."tapable-1.1.3"
9036 sources."tapable-1.1.3"
8913 sources."through-2.3.8"
9037 sources."through-2.3.8"
8914 (sources."through2-2.0.5" // {
9038 (sources."through2-2.0.5" // {
8915 dependencies = [
9039 dependencies = [
8916 sources."readable-stream-2.3.6"
9040 sources."readable-stream-2.3.7"
8917 sources."safe-buffer-5.1.2"
9041 sources."safe-buffer-5.1.2"
8918 sources."string_decoder-1.1.1"
9042 sources."string_decoder-1.1.1"
8919 ];
9043 ];
@@ -8942,6 +9066,7 b' let'
8942 dependencies = [
9066 dependencies = [
8943 sources."big.js-3.2.0"
9067 sources."big.js-3.2.0"
8944 sources."colors-1.4.0"
9068 sources."colors-1.4.0"
9069 sources."emojis-list-2.1.0"
8945 sources."enhanced-resolve-3.4.1"
9070 sources."enhanced-resolve-3.4.1"
8946 sources."graceful-fs-4.2.3"
9071 sources."graceful-fs-4.2.3"
8947 sources."json5-0.5.1"
9072 sources."json5-0.5.1"
@@ -8949,7 +9074,7 b' let'
8949 sources."tapable-0.2.9"
9074 sources."tapable-0.2.9"
8950 ];
9075 ];
8951 })
9076 })
8952 sources."tslib-1.10.0"
9077 sources."tslib-1.11.1"
8953 sources."tty-browserify-0.0.0"
9078 sources."tty-browserify-0.0.0"
8954 sources."tunnel-agent-0.6.0"
9079 sources."tunnel-agent-0.6.0"
8955 sources."tweetnacl-0.14.5"
9080 sources."tweetnacl-0.14.5"
@@ -8960,11 +9085,7 b' let'
8960 sources."source-map-0.6.1"
9085 sources."source-map-0.6.1"
8961 ];
9086 ];
8962 })
9087 })
8963 (sources."uglify-js-3.6.7" // {
9088 sources."uglify-js-3.9.1"
8964 dependencies = [
8965 sources."source-map-0.6.1"
8966 ];
8967 })
8968 sources."uglify-to-browserify-1.0.2"
9089 sources."uglify-to-browserify-1.0.2"
8969 (sources."uglifyjs-webpack-plugin-1.3.0" // {
9090 (sources."uglifyjs-webpack-plugin-1.3.0" // {
8970 dependencies = [
9091 dependencies = [
@@ -8974,6 +9095,10 b' let'
8974 sources."unc-path-regex-0.1.2"
9095 sources."unc-path-regex-0.1.2"
8975 sources."underscore-1.7.0"
9096 sources."underscore-1.7.0"
8976 sources."underscore.string-2.2.1"
9097 sources."underscore.string-2.2.1"
9098 sources."unicode-canonical-property-names-ecmascript-1.0.4"
9099 sources."unicode-match-property-ecmascript-1.0.4"
9100 sources."unicode-match-property-value-ecmascript-1.2.0"
9101 sources."unicode-property-aliases-ecmascript-1.1.0"
8977 sources."union-value-1.0.1"
9102 sources."union-value-1.0.1"
8978 sources."uniq-1.0.1"
9103 sources."uniq-1.0.1"
8979 sources."uniqs-2.0.0"
9104 sources."uniqs-2.0.0"
@@ -9012,17 +9137,17 b' let'
9012 sources."util-deprecate-1.0.2"
9137 sources."util-deprecate-1.0.2"
9013 sources."util.promisify-1.0.0"
9138 sources."util.promisify-1.0.0"
9014 sources."utila-0.4.0"
9139 sources."utila-0.4.0"
9015 sources."uuid-3.3.3"
9140 sources."uuid-3.4.0"
9016 sources."v8-compile-cache-2.1.0"
9141 sources."v8-compile-cache-2.1.0"
9017 sources."v8flags-3.1.3"
9142 sources."v8flags-3.1.3"
9018 sources."vendors-1.0.3"
9143 sources."vendors-1.0.4"
9019 (sources."verror-1.10.0" // {
9144 (sources."verror-1.10.0" // {
9020 dependencies = [
9145 dependencies = [
9021 sources."assert-plus-1.0.0"
9146 sources."assert-plus-1.0.0"
9022 ];
9147 ];
9023 })
9148 })
9024 sources."vm-browserify-1.1.0"
9149 sources."vm-browserify-1.1.2"
9025 (sources."watchpack-1.6.0" // {
9150 (sources."watchpack-1.6.1" // {
9026 dependencies = [
9151 dependencies = [
9027 sources."graceful-fs-4.2.3"
9152 sources."graceful-fs-4.2.3"
9028 ];
9153 ];
@@ -9030,7 +9155,7 b' let'
9030 sources."waypoints-4.0.1"
9155 sources."waypoints-4.0.1"
9031 (sources."webpack-4.23.1" // {
9156 (sources."webpack-4.23.1" // {
9032 dependencies = [
9157 dependencies = [
9033 sources."ajv-6.10.2"
9158 sources."ajv-6.12.0"
9034 ];
9159 ];
9035 })
9160 })
9036 (sources."webpack-cli-3.1.2" // {
9161 (sources."webpack-cli-3.1.2" // {
@@ -9086,7 +9211,7 b' let'
9086 dependencies = [
9211 dependencies = [
9087 sources."find-up-3.0.0"
9212 sources."find-up-3.0.0"
9088 sources."locate-path-3.0.0"
9213 sources."locate-path-3.0.0"
9089 sources."p-limit-2.2.1"
9214 sources."p-limit-2.3.0"
9090 sources."p-locate-3.0.0"
9215 sources."p-locate-3.0.0"
9091 sources."p-try-2.2.0"
9216 sources."p-try-2.2.0"
9092 ];
9217 ];
@@ -5,7 +5,7 b''
5
5
6 self: super: {
6 self: super: {
7 "alembic" = super.buildPythonPackage {
7 "alembic" = super.buildPythonPackage {
8 name = "alembic-1.3.1";
8 name = "alembic-1.4.2";
9 doCheck = false;
9 doCheck = false;
10 propagatedBuildInputs = [
10 propagatedBuildInputs = [
11 self."sqlalchemy"
11 self."sqlalchemy"
@@ -14,8 +14,8 b' self: super: {'
14 self."python-dateutil"
14 self."python-dateutil"
15 ];
15 ];
16 src = fetchurl {
16 src = fetchurl {
17 url = "https://files.pythonhosted.org/packages/84/64/493c45119dce700a4b9eeecc436ef9e8835ab67bae6414f040cdc7b58f4b/alembic-1.3.1.tar.gz";
17 url = "https://files.pythonhosted.org/packages/60/1e/cabc75a189de0fbb2841d0975243e59bde8b7822bacbb95008ac6fe9ad47/alembic-1.4.2.tar.gz";
18 sha256 = "1cl2chk5jx0rf4hmsd5lljic7iifw17yv3y5xawvp4i14jvpn9s9";
18 sha256 = "1gsdrzx9h7wfva200qvvsc9sn4w79mk2vs0bbnzjhxi1jw2b0nh3";
19 };
19 };
20 meta = {
20 meta = {
21 license = [ pkgs.lib.licenses.mit ];
21 license = [ pkgs.lib.licenses.mit ];
@@ -146,15 +146,15 b' self: super: {'
146 };
146 };
147 };
147 };
148 "bleach" = super.buildPythonPackage {
148 "bleach" = super.buildPythonPackage {
149 name = "bleach-3.1.0";
149 name = "bleach-3.1.3";
150 doCheck = false;
150 doCheck = false;
151 propagatedBuildInputs = [
151 propagatedBuildInputs = [
152 self."six"
152 self."six"
153 self."webencodings"
153 self."webencodings"
154 ];
154 ];
155 src = fetchurl {
155 src = fetchurl {
156 url = "https://files.pythonhosted.org/packages/78/5a/0df03e8735cd9c75167528299c738702437589b9c71a849489d00ffa82e8/bleach-3.1.0.tar.gz";
156 url = "https://files.pythonhosted.org/packages/de/09/5267f8577a92487ed43bc694476c4629c6eca2e3c93fcf690a26bfe39e1d/bleach-3.1.3.tar.gz";
157 sha256 = "1yhrgrhkln8bd6gn3imj69g1h4xqah9gaz9q26crqr6gmmvpzprz";
157 sha256 = "0al437aw4p2xp83az5hhlrp913nsf0cg6kg4qj3fjhv4wakxipzq";
158 };
158 };
159 meta = {
159 meta = {
160 license = [ pkgs.lib.licenses.asl20 ];
160 license = [ pkgs.lib.licenses.asl20 ];
@@ -171,6 +171,17 b' self: super: {'
171 license = [ pkgs.lib.licenses.mit ];
171 license = [ pkgs.lib.licenses.mit ];
172 };
172 };
173 };
173 };
174 "cachetools" = super.buildPythonPackage {
175 name = "cachetools-3.1.1";
176 doCheck = false;
177 src = fetchurl {
178 url = "https://files.pythonhosted.org/packages/ae/37/7fd45996b19200e0cb2027a0b6bef4636951c4ea111bfad36c71287247f6/cachetools-3.1.1.tar.gz";
179 sha256 = "16m69l6n6y1r1y7cklm92rr7v69ldig2n3lbl3j323w5jz7d78lf";
180 };
181 meta = {
182 license = [ pkgs.lib.licenses.mit ];
183 };
184 };
174 "celery" = super.buildPythonPackage {
185 "celery" = super.buildPythonPackage {
175 name = "celery-4.3.0";
186 name = "celery-4.3.0";
176 doCheck = false;
187 doCheck = false;
@@ -189,11 +200,11 b' self: super: {'
189 };
200 };
190 };
201 };
191 "certifi" = super.buildPythonPackage {
202 "certifi" = super.buildPythonPackage {
192 name = "certifi-2019.11.28";
203 name = "certifi-2020.4.5.1";
193 doCheck = false;
204 doCheck = false;
194 src = fetchurl {
205 src = fetchurl {
195 url = "https://files.pythonhosted.org/packages/41/bf/9d214a5af07debc6acf7f3f257265618f1db242a3f8e49a9b516f24523a6/certifi-2019.11.28.tar.gz";
206 url = "https://files.pythonhosted.org/packages/b8/e2/a3a86a67c3fc8249ed305fc7b7d290ebe5e4d46ad45573884761ef4dea7b/certifi-2020.4.5.1.tar.gz";
196 sha256 = "07qg6864bk4qxa8akr967amlmsq9v310hp039mcpjx6dliylrdi5";
207 sha256 = "06b5gfs7wmmipln8f3z928d2mmx2j4b3x7pnqmj6cvmyfh8v7z2i";
197 };
208 };
198 meta = {
209 meta = {
199 license = [ pkgs.lib.licenses.mpl20 { fullName = "Mozilla Public License 2.0 (MPL 2.0)"; } ];
210 license = [ pkgs.lib.licenses.mpl20 { fullName = "Mozilla Public License 2.0 (MPL 2.0)"; } ];
@@ -372,6 +383,17 b' self: super: {'
372 license = [ pkgs.lib.licenses.bsdOriginal ];
383 license = [ pkgs.lib.licenses.bsdOriginal ];
373 };
384 };
374 };
385 };
386 "cssutils" = super.buildPythonPackage {
387 name = "cssutils-1.0.2";
388 doCheck = false;
389 src = fetchurl {
390 url = "https://files.pythonhosted.org/packages/5c/0b/c5f29d29c037e97043770b5e7c740b6252993e4b57f029b3cd03c78ddfec/cssutils-1.0.2.tar.gz";
391 sha256 = "1bxchrbqzapwijap0yhlxdil1w9bmwvgx77aizlkhc2mcxjg1z52";
392 };
393 meta = {
394 license = [ { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL 2.1 or later, see also http://cthedot.de/cssutils/"; } ];
395 };
396 };
375 "decorator" = super.buildPythonPackage {
397 "decorator" = super.buildPythonPackage {
376 name = "decorator-4.1.2";
398 name = "decorator-4.1.2";
377 doCheck = false;
399 doCheck = false;
@@ -429,11 +451,11 b' self: super: {'
429 };
451 };
430 };
452 };
431 "docutils" = super.buildPythonPackage {
453 "docutils" = super.buildPythonPackage {
432 name = "docutils-0.14";
454 name = "docutils-0.16";
433 doCheck = false;
455 doCheck = false;
434 src = fetchurl {
456 src = fetchurl {
435 url = "https://files.pythonhosted.org/packages/84/f4/5771e41fdf52aabebbadecc9381d11dea0fa34e4759b4071244fa094804c/docutils-0.14.tar.gz";
457 url = "https://files.pythonhosted.org/packages/2f/e0/3d435b34abd2d62e8206171892f174b180cd37b09d57b924ca5c2ef2219d/docutils-0.16.tar.gz";
436 sha256 = "0x22fs3pdmr42kvz6c654756wja305qv6cx1zbhwlagvxgr4xrji";
458 sha256 = "1z3qliszqca9m719q3qhdkh0ghh90g500avzdgi7pl77x5h3mpn2";
437 };
459 };
438 meta = {
460 meta = {
439 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.publicDomain pkgs.lib.licenses.gpl1 { fullName = "public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt)"; } pkgs.lib.licenses.psfl ];
461 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.publicDomain pkgs.lib.licenses.gpl1 { fullName = "public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt)"; } pkgs.lib.licenses.psfl ];
@@ -565,11 +587,11 b' self: super: {'
565 };
587 };
566 };
588 };
567 "enum34" = super.buildPythonPackage {
589 "enum34" = super.buildPythonPackage {
568 name = "enum34-1.1.6";
590 name = "enum34-1.1.10";
569 doCheck = false;
591 doCheck = false;
570 src = fetchurl {
592 src = fetchurl {
571 url = "https://files.pythonhosted.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz";
593 url = "https://files.pythonhosted.org/packages/11/c4/2da1f4952ba476677a42f25cd32ab8aaf0e1c0d0e00b89822b835c7e654c/enum34-1.1.10.tar.gz";
572 sha256 = "1cgm5ng2gcfrkrm3hc22brl6chdmv67b9zvva9sfs7gn7dwc9n4a";
594 sha256 = "0j7ji699fwswm4vg6w1v07fkbf8dkzdm6gfh88jvs5nqgr3sgrnc";
573 };
595 };
574 meta = {
596 meta = {
575 license = [ pkgs.lib.licenses.bsdOriginal ];
597 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -631,14 +653,14 b' self: super: {'
631 };
653 };
632 };
654 };
633 "gevent" = super.buildPythonPackage {
655 "gevent" = super.buildPythonPackage {
634 name = "gevent-1.4.0";
656 name = "gevent-1.5.0";
635 doCheck = false;
657 doCheck = false;
636 propagatedBuildInputs = [
658 propagatedBuildInputs = [
637 self."greenlet"
659 self."greenlet"
638 ];
660 ];
639 src = fetchurl {
661 src = fetchurl {
640 url = "https://files.pythonhosted.org/packages/ed/27/6c49b70808f569b66ec7fac2e78f076e9b204db9cf5768740cff3d5a07ae/gevent-1.4.0.tar.gz";
662 url = "https://files.pythonhosted.org/packages/5a/79/2c63d385d017b5dd7d70983a463dfd25befae70c824fedb857df6e72eff2/gevent-1.5.0.tar.gz";
641 sha256 = "1lchr4akw2jkm5v4kz7bdm4wv3knkfhbfn9vkkz4s5yrkcxzmdqy";
663 sha256 = "0aac3d4vhv5n4rsb6cqzq0d1xx9immqz4fmpddw35yxkwdc450dj";
642 };
664 };
643 meta = {
665 meta = {
644 license = [ pkgs.lib.licenses.mit ];
666 license = [ pkgs.lib.licenses.mit ];
@@ -689,11 +711,11 b' self: super: {'
689 };
711 };
690 };
712 };
691 "hupper" = super.buildPythonPackage {
713 "hupper" = super.buildPythonPackage {
692 name = "hupper-1.9.1";
714 name = "hupper-1.10.2";
693 doCheck = false;
715 doCheck = false;
694 src = fetchurl {
716 src = fetchurl {
695 url = "https://files.pythonhosted.org/packages/09/3a/4f215659f31eeffe364a984dba486bfa3907bfcc54b7013bdfe825cebb5f/hupper-1.9.1.tar.gz";
717 url = "https://files.pythonhosted.org/packages/41/24/ea90fef04706e54bd1635c05c50dc9cf87cda543c59303a03e7aa7dda0ce/hupper-1.10.2.tar.gz";
696 sha256 = "0pyg879fv9mbwlnbzw2a3234qqycqs9l97h5mpkmk0bvxhi2471v";
718 sha256 = "0am0p6g5cz6xmcaf04xq8q6dzdd9qz0phj6gcmpsckf2mcyza61q";
697 };
719 };
698 meta = {
720 meta = {
699 license = [ pkgs.lib.licenses.mit ];
721 license = [ pkgs.lib.licenses.mit ];
@@ -711,17 +733,17 b' self: super: {'
711 };
733 };
712 };
734 };
713 "importlib-metadata" = super.buildPythonPackage {
735 "importlib-metadata" = super.buildPythonPackage {
714 name = "importlib-metadata-0.23";
736 name = "importlib-metadata-1.6.0";
715 doCheck = false;
737 doCheck = false;
716 propagatedBuildInputs = [
738 propagatedBuildInputs = [
717 self."zipp"
739 self."zipp"
740 self."pathlib2"
718 self."contextlib2"
741 self."contextlib2"
719 self."configparser"
742 self."configparser"
720 self."pathlib2"
721 ];
743 ];
722 src = fetchurl {
744 src = fetchurl {
723 url = "https://files.pythonhosted.org/packages/5d/44/636bcd15697791943e2dedda0dbe098d8530a38d113b202817133e0b06c0/importlib_metadata-0.23.tar.gz";
745 url = "https://files.pythonhosted.org/packages/b4/1b/baab42e3cd64c9d5caac25a9d6c054f8324cdc38975a44d600569f1f7158/importlib_metadata-1.6.0.tar.gz";
724 sha256 = "09mdqdfv5rdrwz80jh9m379gxmvk2vhjfz0fg53hid00icvxf65a";
746 sha256 = "07icyggasn38yv2swdrd8z6i0plazmc9adavsdkbqqj91j53ll9l";
725 };
747 };
726 meta = {
748 meta = {
727 license = [ pkgs.lib.licenses.asl20 ];
749 license = [ pkgs.lib.licenses.asl20 ];
@@ -765,15 +787,15 b' self: super: {'
765 };
787 };
766 };
788 };
767 "ipdb" = super.buildPythonPackage {
789 "ipdb" = super.buildPythonPackage {
768 name = "ipdb-0.12";
790 name = "ipdb-0.13.2";
769 doCheck = false;
791 doCheck = false;
770 propagatedBuildInputs = [
792 propagatedBuildInputs = [
771 self."setuptools"
793 self."setuptools"
772 self."ipython"
794 self."ipython"
773 ];
795 ];
774 src = fetchurl {
796 src = fetchurl {
775 url = "https://files.pythonhosted.org/packages/6d/43/c3c2e866a8803e196d6209595020a4a6db1a3c5d07c01455669497ae23d0/ipdb-0.12.tar.gz";
797 url = "https://files.pythonhosted.org/packages/2c/bb/a3e1a441719ebd75c6dac8170d3ddba884b7ee8a5c0f9aefa7297386627a/ipdb-0.13.2.tar.gz";
776 sha256 = "1khr2n7xfy8hg65kj1bsrjq9g7656pp0ybfa8abpbzpdawji3qnw";
798 sha256 = "0jcd849rx30y3wcgzsqbn06v0yjlzvb9x3076q0yxpycdwm1ryvp";
777 };
799 };
778 meta = {
800 meta = {
779 license = [ pkgs.lib.licenses.bsdOriginal ];
801 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -1074,15 +1096,15 b' self: super: {'
1074 };
1096 };
1075 };
1097 };
1076 "packaging" = super.buildPythonPackage {
1098 "packaging" = super.buildPythonPackage {
1077 name = "packaging-19.2";
1099 name = "packaging-20.3";
1078 doCheck = false;
1100 doCheck = false;
1079 propagatedBuildInputs = [
1101 propagatedBuildInputs = [
1080 self."pyparsing"
1102 self."pyparsing"
1081 self."six"
1103 self."six"
1082 ];
1104 ];
1083 src = fetchurl {
1105 src = fetchurl {
1084 url = "https://files.pythonhosted.org/packages/5a/2f/449ded84226d0e2fda8da9252e5ee7731bdf14cd338f622dfcd9934e0377/packaging-19.2.tar.gz";
1106 url = "https://files.pythonhosted.org/packages/65/37/83e3f492eb52d771e2820e88105f605335553fe10422cba9d256faeb1702/packaging-20.3.tar.gz";
1085 sha256 = "0izwlz9h0bw171a1chr311g2y7n657zjaf4mq4rgm8pp9lbj9f98";
1107 sha256 = "18xpablq278janh03bai9xd4kz9b0yfp6vflazn725ns9x3jna9w";
1086 };
1108 };
1087 meta = {
1109 meta = {
1088 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "BSD or Apache License, Version 2.0"; } pkgs.lib.licenses.asl20 ];
1110 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "BSD or Apache License, Version 2.0"; } pkgs.lib.licenses.asl20 ];
@@ -1100,25 +1122,25 b' self: super: {'
1100 };
1122 };
1101 };
1123 };
1102 "paste" = super.buildPythonPackage {
1124 "paste" = super.buildPythonPackage {
1103 name = "paste-3.2.1";
1125 name = "paste-3.4.0";
1104 doCheck = false;
1126 doCheck = false;
1105 propagatedBuildInputs = [
1127 propagatedBuildInputs = [
1106 self."six"
1128 self."six"
1107 ];
1129 ];
1108 src = fetchurl {
1130 src = fetchurl {
1109 url = "https://files.pythonhosted.org/packages/0d/86/7008b5563594e8a63763f05212a3eb84c85f0b2eff834e5697716e56bca9/Paste-3.2.1.tar.gz";
1131 url = "https://files.pythonhosted.org/packages/79/4a/45821b71dd40000507549afd1491546afad8279c0a87527c88776a794158/Paste-3.4.0.tar.gz";
1110 sha256 = "1vjxr8n1p31c9x9rh8g0f34yisa9028cxpvn36q7g1s0m2b9x71x";
1132 sha256 = "16sichvhyci1gaarkjs35mai8vphh7b244qm14hj1isw38nx4c03";
1111 };
1133 };
1112 meta = {
1134 meta = {
1113 license = [ pkgs.lib.licenses.mit ];
1135 license = [ pkgs.lib.licenses.mit ];
1114 };
1136 };
1115 };
1137 };
1116 "pastedeploy" = super.buildPythonPackage {
1138 "pastedeploy" = super.buildPythonPackage {
1117 name = "pastedeploy-2.0.1";
1139 name = "pastedeploy-2.1.0";
1118 doCheck = false;
1140 doCheck = false;
1119 src = fetchurl {
1141 src = fetchurl {
1120 url = "https://files.pythonhosted.org/packages/19/a0/5623701df7e2478a68a1b685d1a84518024eef994cde7e4da8449a31616f/PasteDeploy-2.0.1.tar.gz";
1142 url = "https://files.pythonhosted.org/packages/c4/e9/972a1c20318b3ae9edcab11a6cef64308fbae5d0d45ab52c6f8b2b8f35b8/PasteDeploy-2.1.0.tar.gz";
1121 sha256 = "02imfbbx1mi2h546f3sr37m47dk9qizaqhzzlhx8bkzxa6fzn8yl";
1143 sha256 = "16qsq5y6mryslmbp5pn35x4z8z3ndp5rpgl42h226879nrw9hmg7";
1122 };
1144 };
1123 meta = {
1145 meta = {
1124 license = [ pkgs.lib.licenses.mit ];
1146 license = [ pkgs.lib.licenses.mit ];
@@ -1167,14 +1189,14 b' self: super: {'
1167 };
1189 };
1168 };
1190 };
1169 "pexpect" = super.buildPythonPackage {
1191 "pexpect" = super.buildPythonPackage {
1170 name = "pexpect-4.7.0";
1192 name = "pexpect-4.8.0";
1171 doCheck = false;
1193 doCheck = false;
1172 propagatedBuildInputs = [
1194 propagatedBuildInputs = [
1173 self."ptyprocess"
1195 self."ptyprocess"
1174 ];
1196 ];
1175 src = fetchurl {
1197 src = fetchurl {
1176 url = "https://files.pythonhosted.org/packages/1c/b1/362a0d4235496cb42c33d1d8732b5e2c607b0129ad5fdd76f5a583b9fcb3/pexpect-4.7.0.tar.gz";
1198 url = "https://files.pythonhosted.org/packages/e5/9b/ff402e0e930e70467a7178abb7c128709a30dfb22d8777c043e501bc1b10/pexpect-4.8.0.tar.gz";
1177 sha256 = "1sv2rri15zwhds85a4kamwh9pj49qcxv7m4miyr4jfpfwv81yb4y";
1199 sha256 = "032cg337h8awydgypz6f4wx848lw8dyrj4zy988x0lyib4ws8rgw";
1178 };
1200 };
1179 meta = {
1201 meta = {
1180 license = [ pkgs.lib.licenses.isc { fullName = "ISC License (ISCL)"; } ];
1202 license = [ pkgs.lib.licenses.isc { fullName = "ISC License (ISCL)"; } ];
@@ -1237,6 +1259,24 b' self: super: {'
1237 license = [ pkgs.lib.licenses.mit ];
1259 license = [ pkgs.lib.licenses.mit ];
1238 };
1260 };
1239 };
1261 };
1262 "premailer" = super.buildPythonPackage {
1263 name = "premailer-3.6.1";
1264 doCheck = false;
1265 propagatedBuildInputs = [
1266 self."lxml"
1267 self."cssselect"
1268 self."cssutils"
1269 self."requests"
1270 self."cachetools"
1271 ];
1272 src = fetchurl {
1273 url = "https://files.pythonhosted.org/packages/62/da/2f43cdf9d3d79c80c4856a12389a1f257d65fe9ccc44bc6b4383c8a18e33/premailer-3.6.1.tar.gz";
1274 sha256 = "08pshx7a110k4ll20x0xhpvyn3kkipkrbgxjjn7ncdxs54ihdhgw";
1275 };
1276 meta = {
1277 license = [ pkgs.lib.licenses.psfl { fullName = "Python"; } ];
1278 };
1279 };
1240 "prompt-toolkit" = super.buildPythonPackage {
1280 "prompt-toolkit" = super.buildPythonPackage {
1241 name = "prompt-toolkit-1.0.18";
1281 name = "prompt-toolkit-1.0.18";
1242 doCheck = false;
1282 doCheck = false;
@@ -1253,11 +1293,11 b' self: super: {'
1253 };
1293 };
1254 };
1294 };
1255 "psutil" = super.buildPythonPackage {
1295 "psutil" = super.buildPythonPackage {
1256 name = "psutil-5.6.5";
1296 name = "psutil-5.7.0";
1257 doCheck = false;
1297 doCheck = false;
1258 src = fetchurl {
1298 src = fetchurl {
1259 url = "https://files.pythonhosted.org/packages/03/9a/95c4b3d0424426e5fd94b5302ff74cea44d5d4f53466e1228ac8e73e14b4/psutil-5.6.5.tar.gz";
1299 url = "https://files.pythonhosted.org/packages/c4/b8/3512f0e93e0db23a71d82485ba256071ebef99b227351f0f5540f744af41/psutil-5.7.0.tar.gz";
1260 sha256 = "0isil5jxwwd8awz54qk28rpgjg43i5l6yl70g40vxwa4r4m56lfh";
1300 sha256 = "03jykdi3dgf1cdal9bv4fq9zjvzj9l9bs99gi5ar81sdl5nc2pk8";
1261 };
1301 };
1262 meta = {
1302 meta = {
1263 license = [ pkgs.lib.licenses.bsdOriginal ];
1303 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -1348,11 +1388,11 b' self: super: {'
1348 };
1388 };
1349 };
1389 };
1350 "pycparser" = super.buildPythonPackage {
1390 "pycparser" = super.buildPythonPackage {
1351 name = "pycparser-2.19";
1391 name = "pycparser-2.20";
1352 doCheck = false;
1392 doCheck = false;
1353 src = fetchurl {
1393 src = fetchurl {
1354 url = "https://files.pythonhosted.org/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz";
1394 url = "https://files.pythonhosted.org/packages/0f/86/e19659527668d70be91d0369aeaa055b4eb396b0f387a4f92293a20035bd/pycparser-2.20.tar.gz";
1355 sha256 = "1cr5dcj9628lkz1qlwq3fv97c25363qppkmcayqvd05dpy573259";
1395 sha256 = "1w0m3xvlrzq4lkbvd1ngfm8mdw64r1yxy6n7djlw6qj5d0km6ird";
1356 };
1396 };
1357 meta = {
1397 meta = {
1358 license = [ pkgs.lib.licenses.bsdOriginal ];
1398 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -1414,11 +1454,11 b' self: super: {'
1414 };
1454 };
1415 };
1455 };
1416 "pyparsing" = super.buildPythonPackage {
1456 "pyparsing" = super.buildPythonPackage {
1417 name = "pyparsing-2.4.5";
1457 name = "pyparsing-2.4.7";
1418 doCheck = false;
1458 doCheck = false;
1419 src = fetchurl {
1459 src = fetchurl {
1420 url = "https://files.pythonhosted.org/packages/00/32/8076fa13e832bb4dcff379f18f228e5a53412be0631808b9ca2610c0f566/pyparsing-2.4.5.tar.gz";
1460 url = "https://files.pythonhosted.org/packages/c1/47/dfc9c342c9842bbe0036c7f763d2d6686bcf5eb1808ba3e170afdb282210/pyparsing-2.4.7.tar.gz";
1421 sha256 = "0fk8gsybiw1gm146mkjdjvaajwh20xwvpv4j7syh2zrnpq0j19jc";
1461 sha256 = "1hgc8qrbq1ymxbwfbjghv01fm3fbpjwpjwi0bcailxxzhf3yq0y2";
1422 };
1462 };
1423 meta = {
1463 meta = {
1424 license = [ pkgs.lib.licenses.mit ];
1464 license = [ pkgs.lib.licenses.mit ];
@@ -1448,7 +1488,7 b' self: super: {'
1448 };
1488 };
1449 };
1489 };
1450 "pyramid-debugtoolbar" = super.buildPythonPackage {
1490 "pyramid-debugtoolbar" = super.buildPythonPackage {
1451 name = "pyramid-debugtoolbar-4.5.1";
1491 name = "pyramid-debugtoolbar-4.6.1";
1452 doCheck = false;
1492 doCheck = false;
1453 propagatedBuildInputs = [
1493 propagatedBuildInputs = [
1454 self."pyramid"
1494 self."pyramid"
@@ -1458,8 +1498,8 b' self: super: {'
1458 self."ipaddress"
1498 self."ipaddress"
1459 ];
1499 ];
1460 src = fetchurl {
1500 src = fetchurl {
1461 url = "https://files.pythonhosted.org/packages/88/21/74e7fa52edc74667e29403bd0cb4f2bb74dc4014711de313868001bf639f/pyramid_debugtoolbar-4.5.1.tar.gz";
1501 url = "https://files.pythonhosted.org/packages/99/f6/b8603f82c18275be293921bc3a2184205056ca505747bf64ab8a0c08e124/pyramid_debugtoolbar-4.6.1.tar.gz";
1462 sha256 = "0hgf6i1fzvq43m9vjdmb24nnv8fwp7sdzrx9bcwrgpy24n07am9a";
1502 sha256 = "185z7q8n959ga5331iczwra2iljwkidfx4qn6bbd7vm3rm4w6llv";
1463 };
1503 };
1464 meta = {
1504 meta = {
1465 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
1505 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
@@ -1646,15 +1686,15 b' self: super: {'
1646 };
1686 };
1647 };
1687 };
1648 "python-ldap" = super.buildPythonPackage {
1688 "python-ldap" = super.buildPythonPackage {
1649 name = "python-ldap-3.1.0";
1689 name = "python-ldap-3.2.0";
1650 doCheck = false;
1690 doCheck = false;
1651 propagatedBuildInputs = [
1691 propagatedBuildInputs = [
1652 self."pyasn1"
1692 self."pyasn1"
1653 self."pyasn1-modules"
1693 self."pyasn1-modules"
1654 ];
1694 ];
1655 src = fetchurl {
1695 src = fetchurl {
1656 url = "https://files.pythonhosted.org/packages/7f/1c/28d721dff2fcd2fef9d55b40df63a00be26ec8a11e8c6fc612ae642f9cfd/python-ldap-3.1.0.tar.gz";
1696 url = "https://files.pythonhosted.org/packages/ea/93/596f875e003c770447f4b99267820a0c769dd2dc3ae3ed19afe460fcbad0/python-ldap-3.2.0.tar.gz";
1657 sha256 = "1i97nwfnraylyn0myxlf3vciicrf5h6fymrcff9c00k581wmx5s1";
1697 sha256 = "13nvrhp85yr0jyxixcjj012iw8l9wynxxlykm9j3alss6waln73x";
1658 };
1698 };
1659 meta = {
1699 meta = {
1660 license = [ pkgs.lib.licenses.psfl ];
1700 license = [ pkgs.lib.licenses.psfl ];
@@ -1702,11 +1742,11 b' self: super: {'
1702 };
1742 };
1703 };
1743 };
1704 "pytz" = super.buildPythonPackage {
1744 "pytz" = super.buildPythonPackage {
1705 name = "pytz-2019.2";
1745 name = "pytz-2019.3";
1706 doCheck = false;
1746 doCheck = false;
1707 src = fetchurl {
1747 src = fetchurl {
1708 url = "https://files.pythonhosted.org/packages/27/c0/fbd352ca76050952a03db776d241959d5a2ee1abddfeb9e2a53fdb489be4/pytz-2019.2.tar.gz";
1748 url = "https://files.pythonhosted.org/packages/82/c3/534ddba230bd4fbbd3b7a3d35f3341d014cca213f369a9940925e7e5f691/pytz-2019.3.tar.gz";
1709 sha256 = "0ckb27hhjc8i8gcdvk4d9avld62b7k52yjijc60s2m3y8cpb7h16";
1749 sha256 = "1ghrk1wg45d3nymj7bf4zj03n3bh64xmczhk4pfi577hdkdhcb5h";
1710 };
1750 };
1711 meta = {
1751 meta = {
1712 license = [ pkgs.lib.licenses.mit ];
1752 license = [ pkgs.lib.licenses.mit ];
@@ -1724,11 +1764,11 b' self: super: {'
1724 };
1764 };
1725 };
1765 };
1726 "redis" = super.buildPythonPackage {
1766 "redis" = super.buildPythonPackage {
1727 name = "redis-3.3.11";
1767 name = "redis-3.4.1";
1728 doCheck = false;
1768 doCheck = false;
1729 src = fetchurl {
1769 src = fetchurl {
1730 url = "https://files.pythonhosted.org/packages/06/ca/00557c74279d2f256d3c42cabf237631355f3a132e4c74c2000e6647ad98/redis-3.3.11.tar.gz";
1770 url = "https://files.pythonhosted.org/packages/ef/2e/2c0f59891db7db087a7eeaa79bc7c7f2c039e71a2b5b0a41391e9d462926/redis-3.4.1.tar.gz";
1731 sha256 = "1hicqbi5xl92hhml82awrr2rxl9jar5fp8nbcycj9qgmsdwc43wd";
1771 sha256 = "07yaj0j9fs7xdkg5bg926fa990khyigjbp31si8ai20vj8sv7kqd";
1732 };
1772 };
1733 meta = {
1773 meta = {
1734 license = [ pkgs.lib.licenses.mit ];
1774 license = [ pkgs.lib.licenses.mit ];
@@ -1779,7 +1819,7 b' self: super: {'
1779 };
1819 };
1780 };
1820 };
1781 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1821 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1782 name = "rhodecode-enterprise-ce-4.18.3";
1822 name = "rhodecode-enterprise-ce-4.19.0";
1783 buildInputs = [
1823 buildInputs = [
1784 self."pytest"
1824 self."pytest"
1785 self."py"
1825 self."py"
@@ -1833,6 +1873,7 b' self: super: {'
1833 self."pastedeploy"
1873 self."pastedeploy"
1834 self."pastescript"
1874 self."pastescript"
1835 self."peppercorn"
1875 self."peppercorn"
1876 self."premailer"
1836 self."psutil"
1877 self."psutil"
1837 self."py-bcrypt"
1878 self."py-bcrypt"
1838 self."pycurl"
1879 self."pycurl"
@@ -1976,11 +2017,11 b' self: super: {'
1976 };
2017 };
1977 };
2018 };
1978 "setuptools" = super.buildPythonPackage {
2019 "setuptools" = super.buildPythonPackage {
1979 name = "setuptools-44.0.0";
2020 name = "setuptools-44.1.0";
1980 doCheck = false;
2021 doCheck = false;
1981 src = fetchurl {
2022 src = fetchurl {
1982 url = "https://files.pythonhosted.org/packages/b0/f3/44da7482ac6da3f36f68e253cb04de37365b3dba9036a3c70773b778b485/setuptools-44.0.0.zip";
2023 url = "https://files.pythonhosted.org/packages/ed/7b/bbf89ca71e722b7f9464ebffe4b5ee20a9e5c9a555a56e2d3914bb9119a6/setuptools-44.1.0.zip";
1983 sha256 = "025h5cnxcmda1893l6i12hrwdvs1n8r31qs6q4pkif2v7rrggfp5";
2024 sha256 = "1jja896zvd1ppccnjbhkgagxbwchgq6vfamp6qn1hvywq6q9cjkr";
1984 };
2025 };
1985 meta = {
2026 meta = {
1986 license = [ pkgs.lib.licenses.mit ];
2027 license = [ pkgs.lib.licenses.mit ];
@@ -2020,11 +2061,11 b' self: super: {'
2020 };
2061 };
2021 };
2062 };
2022 "sqlalchemy" = super.buildPythonPackage {
2063 "sqlalchemy" = super.buildPythonPackage {
2023 name = "sqlalchemy-1.3.11";
2064 name = "sqlalchemy-1.3.15";
2024 doCheck = false;
2065 doCheck = false;
2025 src = fetchurl {
2066 src = fetchurl {
2026 url = "https://files.pythonhosted.org/packages/34/5c/0e1d7ad0ca52544bb12f9cb8d5cc454af45821c92160ffedd38db0a317f6/SQLAlchemy-1.3.11.tar.gz";
2067 url = "https://files.pythonhosted.org/packages/8c/30/4134e726dd5ed13728ff814fa91fc01c447ad8700504653fe99d91fdd34b/SQLAlchemy-1.3.15.tar.gz";
2027 sha256 = "12izpqqgy738ndn7qqn962qxi8qw2xb9vg2i880x12paklg599dg";
2068 sha256 = "0iglkvymfp35zm5pxy5kzqvcv96kkas0chqdx7xpla86sspa9k64";
2028 };
2069 };
2029 meta = {
2070 meta = {
2030 license = [ pkgs.lib.licenses.mit ];
2071 license = [ pkgs.lib.licenses.mit ];
@@ -2212,11 +2253,11 b' self: super: {'
2212 };
2253 };
2213 };
2254 };
2214 "wcwidth" = super.buildPythonPackage {
2255 "wcwidth" = super.buildPythonPackage {
2215 name = "wcwidth-0.1.7";
2256 name = "wcwidth-0.1.9";
2216 doCheck = false;
2257 doCheck = false;
2217 src = fetchurl {
2258 src = fetchurl {
2218 url = "https://files.pythonhosted.org/packages/55/11/e4a2bb08bb450fdbd42cc709dd40de4ed2c472cf0ccb9e64af22279c5495/wcwidth-0.1.7.tar.gz";
2259 url = "https://files.pythonhosted.org/packages/25/9d/0acbed6e4a4be4fc99148f275488580968f44ddb5e69b8ceb53fc9df55a0/wcwidth-0.1.9.tar.gz";
2219 sha256 = "0pn6dflzm609m4r3i8ik5ni9ijjbb5fa3vg1n7hn6vkd49r77wrx";
2260 sha256 = "1wf5ycjx8s066rdvr0fgz4xds9a8zhs91c4jzxvvymm1c8l8cwzf";
2220 };
2261 };
2221 meta = {
2262 meta = {
2222 license = [ pkgs.lib.licenses.mit ];
2263 license = [ pkgs.lib.licenses.mit ];
@@ -2234,7 +2275,7 b' self: super: {'
2234 };
2275 };
2235 };
2276 };
2236 "weberror" = super.buildPythonPackage {
2277 "weberror" = super.buildPythonPackage {
2237 name = "weberror-0.10.3";
2278 name = "weberror-0.13.1";
2238 doCheck = false;
2279 doCheck = false;
2239 propagatedBuildInputs = [
2280 propagatedBuildInputs = [
2240 self."webob"
2281 self."webob"
@@ -2243,8 +2284,8 b' self: super: {'
2243 self."paste"
2284 self."paste"
2244 ];
2285 ];
2245 src = fetchurl {
2286 src = fetchurl {
2246 url = "https://files.pythonhosted.org/packages/35/76/e7e5c2ce7e9c7f31b54c1ff295a495886d1279a002557d74dd8957346a79/WebError-0.10.3.tar.gz";
2287 url = "https://files.pythonhosted.org/packages/07/0a/09ca5eb0fab5c0d17b380026babe81c96ecebb13f2b06c3203432dd7be72/WebError-0.13.1.tar.gz";
2247 sha256 = "0frg4kvycqpj5bi8asfqfs6bxsr2cvjvb6b56c4d1ai1z57kbjx6";
2288 sha256 = "0r4qvnf2r92gfnpa1kwygh4j2x6j3axg2i4an6hyxwg2gpaqp7y1";
2248 };
2289 };
2249 meta = {
2290 meta = {
2250 license = [ pkgs.lib.licenses.mit ];
2291 license = [ pkgs.lib.licenses.mit ];
@@ -2277,7 +2318,7 b' self: super: {'
2277 };
2318 };
2278 };
2319 };
2279 "webtest" = super.buildPythonPackage {
2320 "webtest" = super.buildPythonPackage {
2280 name = "webtest-2.0.33";
2321 name = "webtest-2.0.34";
2281 doCheck = false;
2322 doCheck = false;
2282 propagatedBuildInputs = [
2323 propagatedBuildInputs = [
2283 self."six"
2324 self."six"
@@ -2286,8 +2327,8 b' self: super: {'
2286 self."beautifulsoup4"
2327 self."beautifulsoup4"
2287 ];
2328 ];
2288 src = fetchurl {
2329 src = fetchurl {
2289 url = "https://files.pythonhosted.org/packages/a8/b0/ffc9413b637dbe26e291429bb0f6ed731e518d0cd03da28524a8fe2e8a8f/WebTest-2.0.33.tar.gz";
2330 url = "https://files.pythonhosted.org/packages/2c/74/a0e63feee438735d628631e2b70d82280276a930637ac535479e5fad9427/WebTest-2.0.34.tar.gz";
2290 sha256 = "1l3z0cwqslsf4rcrhi2gr8kdfh74wn2dw76376i4g9i38gz8wd21";
2331 sha256 = "0x1y2c8z4fmpsny4hbp6ka37si2g10r5r2jwxhvv5mx7g3blq4bi";
2291 };
2332 };
2292 meta = {
2333 meta = {
2293 license = [ pkgs.lib.licenses.mit ];
2334 license = [ pkgs.lib.licenses.mit ];
@@ -2327,14 +2368,14 b' self: super: {'
2327 };
2368 };
2328 };
2369 };
2329 "zipp" = super.buildPythonPackage {
2370 "zipp" = super.buildPythonPackage {
2330 name = "zipp-0.6.0";
2371 name = "zipp-1.2.0";
2331 doCheck = false;
2372 doCheck = false;
2332 propagatedBuildInputs = [
2373 propagatedBuildInputs = [
2333 self."more-itertools"
2374 self."contextlib2"
2334 ];
2375 ];
2335 src = fetchurl {
2376 src = fetchurl {
2336 url = "https://files.pythonhosted.org/packages/57/dd/585d728479d97d25aeeb9aa470d36a4ad8d0ba5610f84e14770128ce6ff7/zipp-0.6.0.tar.gz";
2377 url = "https://files.pythonhosted.org/packages/78/08/d52f0ea643bc1068d6dc98b412f4966a9b63255d20911a23ac3220c033c4/zipp-1.2.0.tar.gz";
2337 sha256 = "13ndkf7vklw978a4gdl1yfvn8hch28429a0iam67sg4nrp5v261p";
2378 sha256 = "1c91lnv1bxjimh8as27hz7bghsjkkbxn1d37xq7in9c82iai0167";
2338 };
2379 };
2339 meta = {
2380 meta = {
2340 license = [ pkgs.lib.licenses.mit ];
2381 license = [ pkgs.lib.licenses.mit ];
@@ -3,7 +3,7 b''
3 amqp==2.5.2
3 amqp==2.5.2
4 babel==1.3
4 babel==1.3
5 beaker==1.9.1
5 beaker==1.9.1
6 bleach==3.1.0
6 bleach==3.1.3
7 celery==4.3.0
7 celery==4.3.0
8 channelstream==0.5.2
8 channelstream==0.5.2
9 click==7.0
9 click==7.0
@@ -14,7 +14,7 b' cssselect==1.0.3'
14 cryptography==2.6.1
14 cryptography==2.6.1
15 decorator==4.1.2
15 decorator==4.1.2
16 deform==2.0.8
16 deform==2.0.8
17 docutils==0.14.0
17 docutils==0.16.0
18 dogpile.cache==0.9.0
18 dogpile.cache==0.9.0
19 dogpile.core==0.4.1
19 dogpile.core==0.4.1
20 formencode==1.2.4
20 formencode==1.2.4
@@ -30,38 +30,39 b' markdown==2.6.11'
30 markupsafe==1.1.1
30 markupsafe==1.1.1
31 msgpack-python==0.5.6
31 msgpack-python==0.5.6
32 pyotp==2.3.0
32 pyotp==2.3.0
33 packaging==19.2
33 packaging==20.3
34 pathlib2==2.3.5
34 pathlib2==2.3.5
35 paste==3.2.1
35 paste==3.4.0
36 pastedeploy==2.0.1
36 pastedeploy==2.1.0
37 pastescript==3.2.0
37 pastescript==3.2.0
38 peppercorn==0.6
38 peppercorn==0.6
39 psutil==5.6.5
39 premailer==3.6.1
40 psutil==5.7.0
40 py-bcrypt==0.4
41 py-bcrypt==0.4
41 pycurl==7.43.0.3
42 pycurl==7.43.0.3
42 pycrypto==2.6.1
43 pycrypto==2.6.1
43 pygments==2.4.2
44 pygments==2.4.2
44 pyparsing==2.4.5
45 pyparsing==2.4.7
45 pyramid-debugtoolbar==4.5.1
46 pyramid-debugtoolbar==4.6.1
46 pyramid-mako==1.1.0
47 pyramid-mako==1.1.0
47 pyramid==1.10.4
48 pyramid==1.10.4
48 pyramid_mailer==0.15.1
49 pyramid_mailer==0.15.1
49 python-dateutil==2.8.1
50 python-dateutil==2.8.1
50 python-ldap==3.1.0
51 python-ldap==3.2.0
51 python-memcached==1.59
52 python-memcached==1.59
52 python-pam==1.8.4
53 python-pam==1.8.4
53 python-saml==2.4.2
54 python-saml==2.4.2
54 pytz==2019.2
55 pytz==2019.3
55 tzlocal==1.5.1
56 tzlocal==1.5.1
56 pyzmq==14.6.0
57 pyzmq==14.6.0
57 py-gfm==0.1.4
58 py-gfm==0.1.4
58 redis==3.3.11
59 redis==3.4.1
59 repoze.lru==0.7
60 repoze.lru==0.7
60 requests==2.22.0
61 requests==2.22.0
61 routes==2.4.1
62 routes==2.4.1
62 simplejson==3.16.0
63 simplejson==3.16.0
63 six==1.11.0
64 six==1.11.0
64 sqlalchemy==1.3.11
65 sqlalchemy==1.3.15
65 sshpubkeys==3.1.0
66 sshpubkeys==3.1.0
66 subprocess32==3.5.4
67 subprocess32==3.5.4
67 supervisor==4.1.0
68 supervisor==4.1.0
@@ -69,7 +70,7 b' translationstring==1.3'
69 urllib3==1.25.2
70 urllib3==1.25.2
70 urlobject==2.4.3
71 urlobject==2.4.3
71 venusian==1.2.0
72 venusian==1.2.0
72 weberror==0.10.3
73 weberror==0.13.1
73 webhelpers2==2.0
74 webhelpers2==2.0
74 webob==1.8.5
75 webob==1.8.5
75 whoosh==2.7.4
76 whoosh==2.7.4
@@ -94,18 +95,18 b' jupyter-client==5.0.0'
94 jupyter-core==4.5.0
95 jupyter-core==4.5.0
95
96
96 ## cli tools
97 ## cli tools
97 alembic==1.3.1
98 alembic==1.4.2
98 invoke==0.13.0
99 invoke==0.13.0
99 bumpversion==0.5.3
100 bumpversion==0.5.3
100
101
101 ## http servers
102 ## http servers
102 gevent==1.4.0
103 gevent==1.5.0
103 greenlet==0.4.15
104 greenlet==0.4.15
104 gunicorn==19.9.0
105 gunicorn==19.9.0
105 waitress==1.3.1
106 waitress==1.3.1
106
107
107 ## debug
108 ## debug
108 ipdb==0.12.0
109 ipdb==0.13.2
109 ipython==5.1.0
110 ipython==5.1.0
110
111
111 ## rhodecode-tools, special case, use file://PATH.tar.gz#egg=rhodecode-tools==X.Y.Z, to test local version
112 ## rhodecode-tools, special case, use file://PATH.tar.gz#egg=rhodecode-tools==X.Y.Z, to test local version
@@ -10,9 +10,9 b' configparser==4.0.2'
10 contextlib2==0.6.0.post1
10 contextlib2==0.6.0.post1
11 ecdsa==0.13.2
11 ecdsa==0.13.2
12 gnureadline==6.3.8
12 gnureadline==6.3.8
13 hupper==1.9.1
13 hupper==1.10.2
14 ipaddress==1.0.23
14 ipaddress==1.0.23
15 importlib-metadata==0.23
15 importlib-metadata==1.6.0
16 jinja2==2.9.6
16 jinja2==2.9.6
17 jsonschema==2.6.0
17 jsonschema==2.6.0
18 pluggy==0.13.1
18 pluggy==0.13.1
@@ -24,4 +24,4 b' tempita==0.5.2'
24 testpath==0.4.4
24 testpath==0.4.4
25 transaction==2.4.0
25 transaction==2.4.0
26 vine==1.3.0
26 vine==1.3.0
27 wcwidth==0.1.7
27 wcwidth==0.1.9
@@ -12,5 +12,5 b' mock==3.0.5'
12 cov-core==1.15.0
12 cov-core==1.15.0
13 coverage==4.5.4
13 coverage==4.5.4
14
14
15 webtest==2.0.33
15 webtest==2.0.34
16 beautifulsoup4==4.6.3
16 beautifulsoup4==4.6.3
@@ -1,1 +1,1 b''
1 4.18.3 No newline at end of file
1 4.19.0 No newline at end of file
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,17 +19,20 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import os
21 import os
22 from collections import OrderedDict
23
22 import sys
24 import sys
23 import platform
25 import platform
24
26
25 VERSION = tuple(open(os.path.join(
27 VERSION = tuple(open(os.path.join(
26 os.path.dirname(__file__), 'VERSION')).read().split('.'))
28 os.path.dirname(__file__), 'VERSION')).read().split('.'))
27
29
28 BACKENDS = {
30 BACKENDS = OrderedDict()
29 'hg': 'Mercurial repository',
31
30 'git': 'Git repository',
32 BACKENDS['hg'] = 'Mercurial repository'
31 'svn': 'Subversion repository',
33 BACKENDS['git'] = 'Git repository'
32 }
34 BACKENDS['svn'] = 'Subversion repository'
35
33
36
34 CELERY_ENABLED = False
37 CELERY_ENABLED = False
35 CELERY_EAGER = False
38 CELERY_EAGER = False
@@ -45,7 +48,7 b' PYRAMID_SETTINGS = {}'
45 EXTENSIONS = {}
48 EXTENSIONS = {}
46
49
47 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
50 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
48 __dbversion__ = 103 # defines current db version for migrations
51 __dbversion__ = 107 # defines current db version for migrations
49 __platform__ = platform.system()
52 __platform__ = platform.system()
50 __license__ = 'AGPLv3, and Commercial License'
53 __license__ = 'AGPLv3, and Commercial License'
51 __author__ = 'RhodeCode GmbH'
54 __author__ = 'RhodeCode GmbH'
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -60,7 +60,10 b' class TestGetPullRequestComments(object)'
60 'comment_text': 'Auto status change to |new_status|\n\n.. |new_status| replace:: *"Under Review"*',
60 'comment_text': 'Auto status change to |new_status|\n\n.. |new_status| replace:: *"Under Review"*',
61 'comment_type': 'note',
61 'comment_type': 'note',
62 'comment_resolved_by': None,
62 'comment_resolved_by': None,
63 'pull_request_version': None}
63 'pull_request_version': None,
64 'comment_commit_id': None,
65 'comment_pull_request_id': pull_request.pull_request_id
66 }
64 ]
67 ]
65 assert_ok(id_, expected, response.body)
68 assert_ok(id_, expected, response.body)
66
69
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -49,7 +49,8 b' def assert_call_ok(id_, given):'
49 def assert_ok(id_, expected, given):
49 def assert_ok(id_, expected, given):
50 given = json.loads(given)
50 given = json.loads(given)
51 if given.get('error'):
51 if given.get('error'):
52 pytest.fail("Unexpected ERROR in success response: {}".format(given['error']))
52 err = given['error']
53 pytest.fail(u"Unexpected ERROR in success response: {}".format(err))
53
54
54 expected = jsonify({
55 expected = jsonify({
55 'id': id_,
56 'id': id_,
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2014-2019 RhodeCode GmbH
3 # Copyright (C) 2014-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2015-2019 RhodeCode GmbH
3 # Copyright (C) 2015-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -379,7 +379,9 b' def get_pull_request_comments('
379 },
379 },
380 "comment_text": "Example text",
380 "comment_text": "Example text",
381 "comment_type": null,
381 "comment_type": null,
382 "pull_request_version": null
382 "pull_request_version": null,
383 "comment_commit_id": None,
384 "comment_pull_request_id": <pull_request_id>
383 }
385 }
384 ],
386 ],
385 error : null
387 error : null
@@ -684,28 +686,9 b' def create_pull_request('
684 full_source_ref = resolve_ref_or_error(source_ref, source_db_repo)
686 full_source_ref = resolve_ref_or_error(source_ref, source_db_repo)
685 full_target_ref = resolve_ref_or_error(target_ref, target_db_repo)
687 full_target_ref = resolve_ref_or_error(target_ref, target_db_repo)
686
688
687 source_scm = source_db_repo.scm_instance()
688 target_scm = target_db_repo.scm_instance()
689
690 source_commit = get_commit_or_error(full_source_ref, source_db_repo)
689 source_commit = get_commit_or_error(full_source_ref, source_db_repo)
691 target_commit = get_commit_or_error(full_target_ref, target_db_repo)
690 target_commit = get_commit_or_error(full_target_ref, target_db_repo)
692
691
693 ancestor = source_scm.get_common_ancestor(
694 source_commit.raw_id, target_commit.raw_id, target_scm)
695 if not ancestor:
696 raise JSONRPCError('no common ancestor found')
697
698 # recalculate target ref based on ancestor
699 target_ref_type, target_ref_name, __ = full_target_ref.split(':')
700 full_target_ref = ':'.join((target_ref_type, target_ref_name, ancestor))
701
702 commit_ranges = target_scm.compare(
703 target_commit.raw_id, source_commit.raw_id, source_scm,
704 merge=True, pre_load=[])
705
706 if not commit_ranges:
707 raise JSONRPCError('no commits found')
708
709 reviewer_objects = Optional.extract(reviewers) or []
692 reviewer_objects = Optional.extract(reviewers) or []
710
693
711 # serialize and validate passed in given reviewers
694 # serialize and validate passed in given reviewers
@@ -725,16 +708,16 b' def create_pull_request('
725 PullRequestModel().get_reviewer_functions()
708 PullRequestModel().get_reviewer_functions()
726
709
727 # recalculate reviewers logic, to make sure we can validate this
710 # recalculate reviewers logic, to make sure we can validate this
728 reviewer_rules = get_default_reviewers_data(
711 default_reviewers_data = get_default_reviewers_data(
729 owner, source_db_repo,
712 owner, source_db_repo,
730 source_commit, target_db_repo, target_commit)
713 source_commit, target_db_repo, target_commit)
731
714
732 # now MERGE our given with the calculated
715 # now MERGE our given with the calculated
733 reviewer_objects = reviewer_rules['reviewers'] + reviewer_objects
716 reviewer_objects = default_reviewers_data['reviewers'] + reviewer_objects
734
717
735 try:
718 try:
736 reviewers = validate_default_reviewers(
719 reviewers = validate_default_reviewers(
737 reviewer_objects, reviewer_rules)
720 reviewer_objects, default_reviewers_data)
738 except ValueError as e:
721 except ValueError as e:
739 raise JSONRPCError('Reviewers Validation: {}'.format(e))
722 raise JSONRPCError('Reviewers Validation: {}'.format(e))
740
723
@@ -746,6 +729,24 b' def create_pull_request('
746 source_ref=title_source_ref,
729 source_ref=title_source_ref,
747 target=target_repo
730 target=target_repo
748 )
731 )
732
733 diff_info = default_reviewers_data['diff_info']
734 common_ancestor_id = diff_info['ancestor']
735 commits = diff_info['commits']
736
737 if not common_ancestor_id:
738 raise JSONRPCError('no common ancestor found')
739
740 if not commits:
741 raise JSONRPCError('no commits found')
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
746 # recalculate target ref based on ancestor
747 target_ref_type, target_ref_name, __ = full_target_ref.split(':')
748 full_target_ref = ':'.join((target_ref_type, target_ref_name, common_ancestor_id))
749
749 # fetch renderer, if set fallback to plain in case of PR
750 # fetch renderer, if set fallback to plain in case of PR
750 rc_config = SettingsModel().get_all_settings()
751 rc_config = SettingsModel().get_all_settings()
751 default_system_renderer = rc_config.get('rhodecode_markup_renderer', 'plain')
752 default_system_renderer = rc_config.get('rhodecode_markup_renderer', 'plain')
@@ -758,12 +759,13 b' def create_pull_request('
758 source_ref=full_source_ref,
759 source_ref=full_source_ref,
759 target_repo=target_repo,
760 target_repo=target_repo,
760 target_ref=full_target_ref,
761 target_ref=full_target_ref,
761 revisions=[commit.raw_id for commit in reversed(commit_ranges)],
762 common_ancestor_id=common_ancestor_id,
763 revisions=revisions,
762 reviewers=reviewers,
764 reviewers=reviewers,
763 title=title,
765 title=title,
764 description=description,
766 description=description,
765 description_renderer=description_renderer,
767 description_renderer=description_renderer,
766 reviewer_data=reviewer_rules,
768 reviewer_data=default_reviewers_data,
767 auth_user=apiuser
769 auth_user=apiuser
768 )
770 )
769
771
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -33,7 +33,7 b' from rhodecode.lib import audit_logger, '
33 from rhodecode.lib import repo_maintenance
33 from rhodecode.lib import repo_maintenance
34 from rhodecode.lib.auth import HasPermissionAnyApi, HasUserGroupPermissionAnyApi
34 from rhodecode.lib.auth import HasPermissionAnyApi, HasUserGroupPermissionAnyApi
35 from rhodecode.lib.celerylib.utils import get_task_id
35 from rhodecode.lib.celerylib.utils import get_task_id
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_str, safe_int
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_str, safe_int, safe_unicode
37 from rhodecode.lib.ext_json import json
37 from rhodecode.lib.ext_json import json
38 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
38 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
39 from rhodecode.lib.vcs import RepositoryError
39 from rhodecode.lib.vcs import RepositoryError
@@ -573,6 +573,7 b' def get_repo_file(request, apiuser, repo'
573 elif details == 'full':
573 elif details == 'full':
574 extended_info = content = True
574 extended_info = content = True
575
575
576 file_path = safe_unicode(file_path)
576 try:
577 try:
577 # check if repo is not empty by any chance, skip quicker if it is.
578 # check if repo is not empty by any chance, skip quicker if it is.
578 _scm = repo.scm_instance()
579 _scm = repo.scm_instance()
@@ -583,12 +584,12 b' def get_repo_file(request, apiuser, repo'
583 repo, commit_id, file_path, extended_info=extended_info,
584 repo, commit_id, file_path, extended_info=extended_info,
584 content=content, max_file_bytes=max_file_bytes, cache=cache)
585 content=content, max_file_bytes=max_file_bytes, cache=cache)
585 except NodeDoesNotExistError:
586 except NodeDoesNotExistError:
586 raise JSONRPCError('There is no file in repo: `{}` at path `{}` for commit: `{}`'.format(
587 raise JSONRPCError(u'There is no file in repo: `{}` at path `{}` for commit: `{}`'.format(
587 repo.repo_name, file_path, commit_id))
588 repo.repo_name, file_path, commit_id))
588 except Exception:
589 except Exception:
589 log.exception("Exception occurred while trying to get repo %s file",
590 log.exception(u"Exception occurred while trying to get repo %s file",
590 repo.repo_name)
591 repo.repo_name)
591 raise JSONRPCError('failed to get repo: `{}` file at path {}'.format(
592 raise JSONRPCError(u'failed to get repo: `{}` file at path {}'.format(
592 repo.repo_name, file_path))
593 repo.repo_name, file_path))
593
594
594 return node
595 return node
@@ -1599,7 +1600,8 b' def comment_commit('
1599 validate_repo_permissions(apiuser, repoid, repo, _perms)
1600 validate_repo_permissions(apiuser, repoid, repo, _perms)
1600
1601
1601 try:
1602 try:
1602 commit_id = repo.scm_instance().get_commit(commit_id=commit_id).raw_id
1603 commit = repo.scm_instance().get_commit(commit_id=commit_id)
1604 commit_id = commit.raw_id
1603 except Exception as e:
1605 except Exception as e:
1604 log.exception('Failed to fetch commit')
1606 log.exception('Failed to fetch commit')
1605 raise JSONRPCError(safe_str(e))
1607 raise JSONRPCError(safe_str(e))
@@ -1655,10 +1657,14 b' def comment_commit('
1655 except StatusChangeOnClosedPullRequestError:
1657 except StatusChangeOnClosedPullRequestError:
1656 log.exception(
1658 log.exception(
1657 "Exception occurred while trying to change repo commit status")
1659 "Exception occurred while trying to change repo commit status")
1658 msg = ('Changing status on a changeset associated with '
1660 msg = ('Changing status on a commit associated with '
1659 'a closed pull request is not allowed')
1661 'a closed pull request is not allowed')
1660 raise JSONRPCError(msg)
1662 raise JSONRPCError(msg)
1661
1663
1664 CommentsModel().trigger_commit_comment_hook(
1665 repo, apiuser, 'create',
1666 data={'comment': comment, 'commit': commit})
1667
1662 Session().commit()
1668 Session().commit()
1663 return {
1669 return {
1664 'msg': (
1670 'msg': (
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -22,10 +22,12 b''
22 import logging
22 import logging
23
23
24 from rhodecode.api import jsonrpc_method
24 from rhodecode.api import jsonrpc_method
25 from rhodecode.api.exc import JSONRPCValidationError
25 from rhodecode.api.exc import JSONRPCValidationError, JSONRPCForbidden
26 from rhodecode.api.utils import Optional
26 from rhodecode.api.utils import Optional, has_superadmin_permission
27 from rhodecode.lib.index import searcher_from_config
27 from rhodecode.lib.index import searcher_from_config
28 from rhodecode.lib.user_log_filter import user_log_filter
28 from rhodecode.model import validation_schema
29 from rhodecode.model import validation_schema
30 from rhodecode.model.db import joinedload, UserLog
29 from rhodecode.model.validation_schema.schemas import search_schema
31 from rhodecode.model.validation_schema.schemas import search_schema
30
32
31 log = logging.getLogger(__name__)
33 log = logging.getLogger(__name__)
@@ -116,3 +118,35 b' def search(request, apiuser, search_quer'
116 colander_exc=validation_schema.Invalid(node, search_result['error']))
118 colander_exc=validation_schema.Invalid(node, search_result['error']))
117
119
118 return data
120 return data
121
122
123 @jsonrpc_method()
124 def get_audit_logs(request, apiuser, query):
125 """
126 return full audit logs based on the query.
127
128 Please see `example query in admin > settings > audit logs` for examples
129
130 :param apiuser: This is filled automatically from the |authtoken|.
131 :type apiuser: AuthUser
132 :param query: filter query, example: action:repo.artifact.add date:[20200401 TO 20200601]"
133 :type query: str
134 """
135
136 if not has_superadmin_permission(apiuser):
137 raise JSONRPCForbidden()
138
139 filter_term = query
140 ret = []
141
142 # show all user actions
143 user_log = UserLog.query() \
144 .options(joinedload(UserLog.user)) \
145 .options(joinedload(UserLog.repository)) \
146 .order_by(UserLog.action_date.desc())
147
148 audit_log = user_log_filter(user_log, filter_term)
149
150 for entry in audit_log:
151 ret.append(entry)
152 return ret
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -396,7 +396,11 b' class PathFilter(object):'
396 def path_access_allowed(self, path):
396 def path_access_allowed(self, path):
397 log.debug('Checking ACL permissions for PathFilter for `%s`', path)
397 log.debug('Checking ACL permissions for PathFilter for `%s`', path)
398 if self.permission_checker:
398 if self.permission_checker:
399 return path and self.permission_checker.has_access(path)
399 has_access = path and self.permission_checker.has_access(path)
400 log.debug('ACL Permissions checker enabled, ACL Check has_access: %s', has_access)
401 return has_access
402
403 log.debug('ACL permissions checker not enabled, skipping...')
400 return True
404 return True
401
405
402 def filter_patchset(self, patchset):
406 def filter_patchset(self, patchset):
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -25,6 +25,15 b' from rhodecode.lib import rc_cache'
25
25
26 log = logging.getLogger(__name__)
26 log = logging.getLogger(__name__)
27
27
28 # names of namespaces used for different permission related cached
29 # during flush operation we need to take care of all those
30 cache_namespaces = [
31 'cache_user_auth.{}',
32 'cache_user_repo_acl_ids.{}',
33 'cache_user_user_group_acl_ids.{}',
34 'cache_user_repo_group_acl_ids.{}'
35 ]
36
28
37
29 def trigger_user_permission_flush(event):
38 def trigger_user_permission_flush(event):
30 """
39 """
@@ -35,9 +44,11 b' def trigger_user_permission_flush(event)'
35
44
36 affected_user_ids = set(event.user_ids)
45 affected_user_ids = set(event.user_ids)
37 for user_id in affected_user_ids:
46 for user_id in affected_user_ids:
38 cache_namespace_uid = 'cache_user_auth.{}'.format(user_id)
47 for cache_namespace_uid_tmpl in cache_namespaces:
39 del_keys = rc_cache.clear_cache_namespace('cache_perms', cache_namespace_uid)
48 cache_namespace_uid = cache_namespace_uid_tmpl.format(user_id)
40 log.debug('Deleted %s cache keys for user_id: %s', del_keys, user_id)
49 del_keys = rc_cache.clear_cache_namespace('cache_perms', cache_namespace_uid)
50 log.debug('Deleted %s cache keys for user_id: %s and namespace %s',
51 del_keys, user_id, cache_namespace_uid)
41
52
42
53
43 def includeme(config):
54 def includeme(config):
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -26,7 +26,6 b' def admin_routes(config):'
26 """
26 """
27 Admin prefixed routes
27 Admin prefixed routes
28 """
28 """
29
30 config.add_route(
29 config.add_route(
31 name='admin_audit_logs',
30 name='admin_audit_logs',
32 pattern='/audit_logs')
31 pattern='/audit_logs')
@@ -291,12 +290,22 b' def admin_routes(config):'
291 pattern='/users/{user_id:\d+}/create_repo_group',
290 pattern='/users/{user_id:\d+}/create_repo_group',
292 user_route=True)
291 user_route=True)
293
292
293 # user notice
294 config.add_route(
295 name='user_notice_dismiss',
296 pattern='/users/{user_id:\d+}/notice_dismiss',
297 user_route=True)
298
294 # user auth tokens
299 # user auth tokens
295 config.add_route(
300 config.add_route(
296 name='edit_user_auth_tokens',
301 name='edit_user_auth_tokens',
297 pattern='/users/{user_id:\d+}/edit/auth_tokens',
302 pattern='/users/{user_id:\d+}/edit/auth_tokens',
298 user_route=True)
303 user_route=True)
299 config.add_route(
304 config.add_route(
305 name='edit_user_auth_tokens_view',
306 pattern='/users/{user_id:\d+}/edit/auth_tokens/view',
307 user_route=True)
308 config.add_route(
300 name='edit_user_auth_tokens_add',
309 name='edit_user_auth_tokens_add',
301 pattern='/users/{user_id:\d+}/edit/auth_tokens/new',
310 pattern='/users/{user_id:\d+}/edit/auth_tokens/new',
302 user_route=True)
311 user_route=True)
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -228,7 +228,7 b' class TestAdminPermissionsController(Tes'
228 self.log_user()
228 self.log_user()
229
229
230 # ADD
230 # ADD
231 default_user_id = User.get_default_user().user_id
231 default_user_id = User.get_default_user_id()
232 self.app.post(
232 self.app.post(
233 route_path('edit_user_ips_add', user_id=default_user_id),
233 route_path('edit_user_ips_add', user_id=default_user_id),
234 params={'new_ip': '0.0.0.0/24', 'csrf_token': self.csrf_token})
234 params={'new_ip': '0.0.0.0/24', 'csrf_token': self.csrf_token})
@@ -238,7 +238,7 b' class TestAdminPermissionsController(Tes'
238 response.mustcontain('0.0.0.0 - 0.0.0.255')
238 response.mustcontain('0.0.0.0 - 0.0.0.255')
239
239
240 # DELETE
240 # DELETE
241 default_user_id = User.get_default_user().user_id
241 default_user_id = User.get_default_user_id()
242 del_ip_id = UserIpMap.query().filter(UserIpMap.user_id ==
242 del_ip_id = UserIpMap.query().filter(UserIpMap.user_id ==
243 default_user_id).first().ip_id
243 default_user_id).first().ip_id
244
244
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -84,15 +84,13 b' class TestAdminRepos(object):'
84 with mock.patch('rhodecode.BACKENDS', {'git': 'git'}):
84 with mock.patch('rhodecode.BACKENDS', {'git': 'git'}):
85 response = self.app.get(route_path('repo_new'), status=200)
85 response = self.app.get(route_path('repo_new'), status=200)
86 assert_response = response.assert_response()
86 assert_response = response.assert_response()
87 element = assert_response.get_element('#repo_type')
87 element = assert_response.get_element('[name=repo_type]')
88 assert element.text_content() == '\ngit\n'
88 assert element.get('value') == 'git'
89
89
90 def test_create_page_non_restricted_backends(self, autologin_user, backend):
90 def test_create_page_non_restricted_backends(self, autologin_user, backend):
91 response = self.app.get(route_path('repo_new'), status=200)
91 response = self.app.get(route_path('repo_new'), status=200)
92 assert_response = response.assert_response()
92 assert_response = response.assert_response()
93 assert_response.element_contains('#repo_type', 'git')
93 assert ['hg', 'git', 'svn'] == [x.get('value') for x in assert_response.get_elements('[name=repo_type]')]
94 assert_response.element_contains('#repo_type', 'svn')
95 assert_response.element_contains('#repo_type', 'hg')
96
94
97 @pytest.mark.parametrize(
95 @pytest.mark.parametrize(
98 "suffix", [u'', u'xxa'], ids=['', 'non-ascii'])
96 "suffix", [u'', u'xxa'], ids=['', 'non-ascii'])
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -143,7 +143,7 b' class TestAdminUsersView(TestController)'
143 response = self.app.get(
143 response = self.app.get(
144 route_path('edit_user_auth_tokens', user_id=user_id))
144 route_path('edit_user_auth_tokens', user_id=user_id))
145 for token in auth_tokens:
145 for token in auth_tokens:
146 response.mustcontain(token)
146 response.mustcontain(token[:4])
147 response.mustcontain('never')
147 response.mustcontain('never')
148
148
149 @pytest.mark.parametrize("desc, lifetime", [
149 @pytest.mark.parametrize("desc, lifetime", [
@@ -165,7 +165,7 b' class TestAdminUsersView(TestController)'
165 response = response.follow()
165 response = response.follow()
166 user = User.get(user_id)
166 user = User.get(user_id)
167 for auth_token in user.auth_tokens:
167 for auth_token in user.auth_tokens:
168 response.mustcontain(auth_token)
168 response.mustcontain(auth_token[:4])
169
169
170 def test_delete_auth_token(self, user_util):
170 def test_delete_auth_token(self, user_util):
171 self.log_user()
171 self.log_user()
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2018-2019 RhodeCode GmbH
3 # Copyright (C) 2018-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -142,7 +142,7 b' class AdminPermissionsView(BaseAppView, '
142 h.flash(_('Error occurred during update of permissions'),
142 h.flash(_('Error occurred during update of permissions'),
143 category='error')
143 category='error')
144
144
145 affected_user_ids = [User.get_default_user().user_id]
145 affected_user_ids = [User.get_default_user_id()]
146 PermissionModel().trigger_permission_flush(affected_user_ids)
146 PermissionModel().trigger_permission_flush(affected_user_ids)
147
147
148 raise HTTPFound(h.route_path('admin_permissions_application'))
148 raise HTTPFound(h.route_path('admin_permissions_application'))
@@ -218,7 +218,7 b' class AdminPermissionsView(BaseAppView, '
218 h.flash(_('Error occurred during update of permissions'),
218 h.flash(_('Error occurred during update of permissions'),
219 category='error')
219 category='error')
220
220
221 affected_user_ids = [User.get_default_user().user_id]
221 affected_user_ids = [User.get_default_user_id()]
222 PermissionModel().trigger_permission_flush(affected_user_ids)
222 PermissionModel().trigger_permission_flush(affected_user_ids)
223
223
224 raise HTTPFound(h.route_path('admin_permissions_object'))
224 raise HTTPFound(h.route_path('admin_permissions_object'))
@@ -320,7 +320,7 b' class AdminPermissionsView(BaseAppView, '
320 h.flash(_('Error occurred during update of permissions'),
320 h.flash(_('Error occurred during update of permissions'),
321 category='error')
321 category='error')
322
322
323 affected_user_ids = [User.get_default_user().user_id]
323 affected_user_ids = [User.get_default_user_id()]
324 PermissionModel().trigger_permission_flush(affected_user_ids)
324 PermissionModel().trigger_permission_flush(affected_user_ids)
325
325
326 raise HTTPFound(h.route_path('admin_permissions_global'))
326 raise HTTPFound(h.route_path('admin_permissions_global'))
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -41,9 +41,9 b' class SvnConfigAdminSettingsView(BaseApp'
41 def vcs_svn_generate_config(self):
41 def vcs_svn_generate_config(self):
42 _ = self.request.translate
42 _ = self.request.translate
43 try:
43 try:
44 generate_mod_dav_svn_config(self.request.registry)
44 file_path = generate_mod_dav_svn_config(self.request.registry)
45 msg = {
45 msg = {
46 'message': _('Apache configuration for Subversion generated.'),
46 'message': _('Apache configuration for Subversion generated at `{}`.').format(file_path),
47 'level': 'success',
47 'level': 'success',
48 }
48 }
49 except Exception:
49 except Exception:
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -34,12 +34,13 b' from rhodecode.apps.ssh_support import S'
34 from rhodecode.authentication.base import get_authn_registry, RhodeCodeExternalAuthPlugin
34 from rhodecode.authentication.base import get_authn_registry, RhodeCodeExternalAuthPlugin
35 from rhodecode.authentication.plugins import auth_rhodecode
35 from rhodecode.authentication.plugins import auth_rhodecode
36 from rhodecode.events import trigger
36 from rhodecode.events import trigger
37 from rhodecode.model.db import true
37 from rhodecode.model.db import true, UserNotice
38
38
39 from rhodecode.lib import audit_logger, rc_cache
39 from rhodecode.lib import audit_logger, rc_cache
40 from rhodecode.lib.exceptions import (
40 from rhodecode.lib.exceptions import (
41 UserCreationError, UserOwnsReposException, UserOwnsRepoGroupsException,
41 UserCreationError, UserOwnsReposException, UserOwnsRepoGroupsException,
42 UserOwnsUserGroupsException, DefaultUserException)
42 UserOwnsUserGroupsException, UserOwnsPullRequestsException,
43 UserOwnsArtifactsException, DefaultUserException)
43 from rhodecode.lib.ext_json import json
44 from rhodecode.lib.ext_json import json
44 from rhodecode.lib.auth import (
45 from rhodecode.lib.auth import (
45 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
46 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
@@ -377,11 +378,13 b' class UsersView(UserAppView):'
377 _repos = c.user.repositories
378 _repos = c.user.repositories
378 _repo_groups = c.user.repository_groups
379 _repo_groups = c.user.repository_groups
379 _user_groups = c.user.user_groups
380 _user_groups = c.user.user_groups
381 _pull_requests = c.user.user_pull_requests
380 _artifacts = c.user.artifacts
382 _artifacts = c.user.artifacts
381
383
382 handle_repos = None
384 handle_repos = None
383 handle_repo_groups = None
385 handle_repo_groups = None
384 handle_user_groups = None
386 handle_user_groups = None
387 handle_pull_requests = None
385 handle_artifacts = None
388 handle_artifacts = None
386
389
387 # calls for flash of handle based on handle case detach or delete
390 # calls for flash of handle based on handle case detach or delete
@@ -412,6 +415,15 b' class UsersView(UserAppView):'
412 h.flash(_('Deleted %s user groups') % len(_user_groups),
415 h.flash(_('Deleted %s user groups') % len(_user_groups),
413 category='success')
416 category='success')
414
417
418 def set_handle_flash_pull_requests():
419 handle = handle_pull_requests
420 if handle == 'detach':
421 h.flash(_('Detached %s pull requests') % len(_pull_requests),
422 category='success')
423 elif handle == 'delete':
424 h.flash(_('Deleted %s pull requests') % len(_pull_requests),
425 category='success')
426
415 def set_handle_flash_artifacts():
427 def set_handle_flash_artifacts():
416 handle = handle_artifacts
428 handle = handle_artifacts
417 if handle == 'detach':
429 if handle == 'detach':
@@ -421,6 +433,12 b' class UsersView(UserAppView):'
421 h.flash(_('Deleted %s artifacts') % len(_artifacts),
433 h.flash(_('Deleted %s artifacts') % len(_artifacts),
422 category='success')
434 category='success')
423
435
436 handle_user = User.get_first_super_admin()
437 handle_user_id = safe_int(self.request.POST.get('detach_user_id'))
438 if handle_user_id:
439 # NOTE(marcink): we get new owner for objects...
440 handle_user = User.get_or_404(handle_user_id)
441
424 if _repos and self.request.POST.get('user_repos'):
442 if _repos and self.request.POST.get('user_repos'):
425 handle_repos = self.request.POST['user_repos']
443 handle_repos = self.request.POST['user_repos']
426
444
@@ -430,16 +448,25 b' class UsersView(UserAppView):'
430 if _user_groups and self.request.POST.get('user_user_groups'):
448 if _user_groups and self.request.POST.get('user_user_groups'):
431 handle_user_groups = self.request.POST['user_user_groups']
449 handle_user_groups = self.request.POST['user_user_groups']
432
450
451 if _pull_requests and self.request.POST.get('user_pull_requests'):
452 handle_pull_requests = self.request.POST['user_pull_requests']
453
433 if _artifacts and self.request.POST.get('user_artifacts'):
454 if _artifacts and self.request.POST.get('user_artifacts'):
434 handle_artifacts = self.request.POST['user_artifacts']
455 handle_artifacts = self.request.POST['user_artifacts']
435
456
436 old_values = c.user.get_api_data()
457 old_values = c.user.get_api_data()
437
458
438 try:
459 try:
439 UserModel().delete(c.user, handle_repos=handle_repos,
460
440 handle_repo_groups=handle_repo_groups,
461 UserModel().delete(
441 handle_user_groups=handle_user_groups,
462 c.user,
442 handle_artifacts=handle_artifacts)
463 handle_repos=handle_repos,
464 handle_repo_groups=handle_repo_groups,
465 handle_user_groups=handle_user_groups,
466 handle_pull_requests=handle_pull_requests,
467 handle_artifacts=handle_artifacts,
468 handle_new_owner=handle_user
469 )
443
470
444 audit_logger.store_web(
471 audit_logger.store_web(
445 'user.delete', action_data={'old_data': old_values},
472 'user.delete', action_data={'old_data': old_values},
@@ -449,11 +476,13 b' class UsersView(UserAppView):'
449 set_handle_flash_repos()
476 set_handle_flash_repos()
450 set_handle_flash_repo_groups()
477 set_handle_flash_repo_groups()
451 set_handle_flash_user_groups()
478 set_handle_flash_user_groups()
479 set_handle_flash_pull_requests()
452 set_handle_flash_artifacts()
480 set_handle_flash_artifacts()
453 username = h.escape(old_values['username'])
481 username = h.escape(old_values['username'])
454 h.flash(_('Successfully deleted user `{}`').format(username), category='success')
482 h.flash(_('Successfully deleted user `{}`').format(username), category='success')
455 except (UserOwnsReposException, UserOwnsRepoGroupsException,
483 except (UserOwnsReposException, UserOwnsRepoGroupsException,
456 UserOwnsUserGroupsException, DefaultUserException) as e:
484 UserOwnsUserGroupsException, UserOwnsPullRequestsException,
485 UserOwnsArtifactsException, DefaultUserException) as e:
457 h.flash(e, category='warning')
486 h.flash(e, category='warning')
458 except Exception:
487 except Exception:
459 log.exception("Exception during deletion of user")
488 log.exception("Exception during deletion of user")
@@ -502,6 +531,11 b' class UsersView(UserAppView):'
502 user_id = self.db_user_id
531 user_id = self.db_user_id
503 c.user = self.db_user
532 c.user = self.db_user
504
533
534 c.detach_user = User.get_first_super_admin()
535 detach_user_id = safe_int(self.request.GET.get('detach_user_id'))
536 if detach_user_id:
537 c.detach_user = User.get_or_404(detach_user_id)
538
505 c.active = 'advanced'
539 c.active = 'advanced'
506 c.personal_repo_group = RepoGroup.get_user_personal_repo_group(user_id)
540 c.personal_repo_group = RepoGroup.get_user_personal_repo_group(user_id)
507 c.personal_repo_group_name = RepoGroupModel()\
541 c.personal_repo_group_name = RepoGroupModel()\
@@ -511,7 +545,6 b' class UsersView(UserAppView):'
511 (x.user for x in c.user.user_review_rules),
545 (x.user for x in c.user.user_review_rules),
512 key=lambda u: u.username.lower())
546 key=lambda u: u.username.lower())
513
547
514 c.first_admin = User.get_first_super_admin()
515 defaults = c.user.get_dict()
548 defaults = c.user.get_dict()
516
549
517 # Interim workaround if the user participated on any pull requests as a
550 # Interim workaround if the user participated on any pull requests as a
@@ -705,6 +738,32 b' class UsersView(UserAppView):'
705 @HasPermissionAllDecorator('hg.admin')
738 @HasPermissionAllDecorator('hg.admin')
706 @CSRFRequired()
739 @CSRFRequired()
707 @view_config(
740 @view_config(
741 route_name='user_notice_dismiss', request_method='POST',
742 renderer='json_ext', xhr=True)
743 def user_notice_dismiss(self):
744 _ = self.request.translate
745 c = self.load_default_context()
746
747 user_id = self.db_user_id
748 c.user = self.db_user
749 user_notice_id = safe_int(self.request.POST.get('notice_id'))
750 notice = UserNotice().query()\
751 .filter(UserNotice.user_id == user_id)\
752 .filter(UserNotice.user_notice_id == user_notice_id)\
753 .scalar()
754 read = False
755 if notice:
756 notice.notice_read = True
757 Session().add(notice)
758 Session().commit()
759 read = True
760
761 return {'notice': user_notice_id, 'read': read}
762
763 @LoginRequired()
764 @HasPermissionAllDecorator('hg.admin')
765 @CSRFRequired()
766 @view_config(
708 route_name='user_create_personal_repo_group', request_method='POST',
767 route_name='user_create_personal_repo_group', request_method='POST',
709 renderer='rhodecode:templates/admin/users/user_edit.mako')
768 renderer='rhodecode:templates/admin/users/user_edit.mako')
710 def user_create_personal_repo_group(self):
769 def user_create_personal_repo_group(self):
@@ -778,6 +837,25 b' class UsersView(UserAppView):'
778 c.role_vcs = AuthTokenModel.cls.ROLE_VCS
837 c.role_vcs = AuthTokenModel.cls.ROLE_VCS
779 return self._get_template_context(c)
838 return self._get_template_context(c)
780
839
840 @LoginRequired()
841 @HasPermissionAllDecorator('hg.admin')
842 @view_config(
843 route_name='edit_user_auth_tokens_view', request_method='POST',
844 renderer='json_ext', xhr=True)
845 def auth_tokens_view(self):
846 _ = self.request.translate
847 c = self.load_default_context()
848 c.user = self.db_user
849
850 auth_token_id = self.request.POST.get('auth_token_id')
851
852 if auth_token_id:
853 token = UserApiKeys.get_or_404(auth_token_id)
854
855 return {
856 'auth_token': token.api_key
857 }
858
781 def maybe_attach_token_scope(self, token):
859 def maybe_attach_token_scope(self, token):
782 # implemented in EE edition
860 # implemented in EE edition
783 pass
861 pass
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -88,6 +88,15 b' Check if we should use full-topic or min'
88 'modified': ['b/modified_file.rst'],
88 'modified': ['b/modified_file.rst'],
89 'removed': ['.idea'],
89 'removed': ['.idea'],
90 })
90 })
91
92 exc_traceback = {
93 'exc_utc_date': '2020-03-26T12:54:50.683281',
94 'exc_id': 139638856342656,
95 'exc_timestamp': '1585227290.683288',
96 'version': 'v1',
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',
98 'exc_type': 'AttributeError'
99 }
91 email_kwargs = {
100 email_kwargs = {
92 'test': {},
101 'test': {},
93 'message': {
102 'message': {
@@ -97,6 +106,13 b' Check if we should use full-topic or min'
97 'user': user,
106 'user': user,
98 'date': datetime.datetime.now(),
107 'date': datetime.datetime.now(),
99 },
108 },
109 'exception': {
110 'email_prefix': '[RHODECODE ERROR]',
111 'exc_id': exc_traceback['exc_id'],
112 'exc_url': 'http://server-url/{}'.format(exc_traceback['exc_id']),
113 'exc_type_name': 'NameError',
114 'exc_traceback': exc_traceback,
115 },
100 'password_reset': {
116 'password_reset': {
101 'password_reset_url': 'http://example.com/reset-rhodecode-password/token',
117 'password_reset_url': 'http://example.com/reset-rhodecode-password/token',
102
118
@@ -204,7 +220,7 b' def db():'
204 'pr_comment_url': 'http://comment-url',
220 'pr_comment_url': 'http://comment-url',
205 'pr_comment_reply_url': 'http://comment-url#reply',
221 'pr_comment_reply_url': 'http://comment-url#reply',
206
222
207 'comment_file': 'rhodecode/model/db.py',
223 'comment_file': 'rhodecode/model/get_flow_commits',
208 'comment_line': 'o1210',
224 'comment_line': 'o1210',
209 'comment_type': 'todo',
225 'comment_type': 'todo',
210 'comment_body': '''
226 'comment_body': '''
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2013-2019 RhodeCode GmbH
3 # Copyright (C) 2013-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,7 +19,7 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 # -*- coding: utf-8 -*-
20 # -*- coding: utf-8 -*-
21
21
22 # Copyright (C) 2016-2019 RhodeCode GmbH
22 # Copyright (C) 2016-2020 RhodeCode GmbH
23 #
23 #
24 # This program is free software: you can redistribute it and/or modify
24 # This program is free software: you can redistribute it and/or modify
25 # it under the terms of the GNU Affero General Public License, version 3
25 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -35,8 +35,8 b' from rhodecode.lib.index import searcher'
35 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
35 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
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, in_filter_generator, Session,
38 func, true, or_, case, cast, in_filter_generator, String, Session,
39 Repository, RepoGroup, User, UserGroup)
39 Repository, RepoGroup, User, UserGroup, PullRequest)
40 from rhodecode.model.repo import RepoModel
40 from rhodecode.model.repo import RepoModel
41 from rhodecode.model.repo_group import RepoGroupModel
41 from rhodecode.model.repo_group import RepoGroupModel
42 from rhodecode.model.user import UserModel
42 from rhodecode.model.user import UserModel
@@ -111,7 +111,7 b' class HomeView(BaseAppView, DataGridAppV'
111 org_query = name_contains
111 org_query = name_contains
112 allowed_ids = self._rhodecode_user.repo_acl_ids(
112 allowed_ids = self._rhodecode_user.repo_acl_ids(
113 ['repository.read', 'repository.write', 'repository.admin'],
113 ['repository.read', 'repository.write', 'repository.admin'],
114 cache=False, name_filter=name_contains) or [-1]
114 cache=True, name_filter=name_contains) or [-1]
115
115
116 query = Session().query(
116 query = Session().query(
117 Repository.repo_name,
117 Repository.repo_name,
@@ -162,7 +162,7 b' class HomeView(BaseAppView, DataGridAppV'
162 org_query = name_contains
162 org_query = name_contains
163 allowed_ids = self._rhodecode_user.repo_group_acl_ids(
163 allowed_ids = self._rhodecode_user.repo_group_acl_ids(
164 ['group.read', 'group.write', 'group.admin'],
164 ['group.read', 'group.write', 'group.admin'],
165 cache=False, name_filter=name_contains) or [-1]
165 cache=True, name_filter=name_contains) or [-1]
166
166
167 query = Session().query(
167 query = Session().query(
168 RepoGroup.group_id,
168 RepoGroup.group_id,
@@ -282,6 +282,61 b' class HomeView(BaseAppView, DataGridAppV'
282 }
282 }
283 for obj in acl_iter], True
283 for obj in acl_iter], True
284
284
285 def _get_pull_request_list(self, name_contains=None, limit=20):
286 org_query = name_contains
287 if not name_contains:
288 return [], False
289
290 # TODO(marcink): should all logged in users be allowed to search others?
291 allowed_user_search = self._rhodecode_user.username != User.DEFAULT_USER
292 if not allowed_user_search:
293 return [], False
294
295 name_contains = re.compile('(?:pr:[ ]?)(.+)').findall(name_contains)
296 if len(name_contains) != 1:
297 return [], False
298
299 name_contains = name_contains[0]
300
301 allowed_ids = self._rhodecode_user.repo_acl_ids(
302 ['repository.read', 'repository.write', 'repository.admin'],
303 cache=True) or [-1]
304
305 query = Session().query(
306 PullRequest.pull_request_id,
307 PullRequest.title,
308 )
309 query = query.join(Repository, Repository.repo_id == PullRequest.target_repo_id)
310
311 query = query.filter(or_(
312 # generate multiple IN to fix limitation problems
313 *in_filter_generator(Repository.repo_id, allowed_ids)
314 ))
315
316 query = query.order_by(PullRequest.pull_request_id)
317
318 if name_contains:
319 ilike_expression = u'%{}%'.format(safe_unicode(name_contains))
320 query = query.filter(or_(
321 cast(PullRequest.pull_request_id, String).ilike(ilike_expression),
322 PullRequest.title.ilike(ilike_expression),
323 PullRequest.description.ilike(ilike_expression),
324 ))
325
326 query = query.limit(limit)
327
328 acl_iter = query
329
330 return [
331 {
332 'id': obj.pull_request_id,
333 'value': org_query,
334 'value_display': 'pull request: `!{} - {}`'.format(obj.pull_request_id, obj.title[:50]),
335 'type': 'pull_request',
336 'url': h.route_path('pull_requests_global', pull_request_id=obj.pull_request_id)
337 }
338 for obj in acl_iter], True
339
285 def _get_hash_commit_list(self, auth_user, searcher, query, repo=None, repo_group=None):
340 def _get_hash_commit_list(self, auth_user, searcher, query, repo=None, repo_group=None):
286 repo_name = repo_group_name = None
341 repo_name = repo_group_name = None
287 if repo:
342 if repo:
@@ -624,6 +679,17 b' class HomeView(BaseAppView, DataGridAppV'
624 has_specialized_search = True
679 has_specialized_search = True
625 res.append(no_match('No matching user groups found'))
680 res.append(no_match('No matching user groups found'))
626
681
682 # pr: type search
683 if not prefix_match:
684 pull_requests, prefix_match = self._get_pull_request_list(query)
685 if pull_requests:
686 has_specialized_search = True
687 for serialized_pull_request in pull_requests:
688 res.append(serialized_pull_request)
689 elif prefix_match:
690 has_specialized_search = True
691 res.append(no_match('No matching pull requests found'))
692
627 # FTS commit: type search
693 # FTS commit: type search
628 if not prefix_match:
694 if not prefix_match:
629 commits, prefix_match = self._get_hash_commit_list(
695 commits, prefix_match = self._get_hash_commit_list(
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2018-2019 RhodeCode GmbH
3 # Copyright (C) 2018-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -50,6 +50,9 b' def includeme(config):'
50 name='my_account_auth_tokens',
50 name='my_account_auth_tokens',
51 pattern=ADMIN_PREFIX + '/my_account/auth_tokens')
51 pattern=ADMIN_PREFIX + '/my_account/auth_tokens')
52 config.add_route(
52 config.add_route(
53 name='my_account_auth_tokens_view',
54 pattern=ADMIN_PREFIX + '/my_account/auth_tokens/view')
55 config.add_route(
53 name='my_account_auth_tokens_add',
56 name='my_account_auth_tokens_add',
54 pattern=ADMIN_PREFIX + '/my_account/auth_tokens/new')
57 pattern=ADMIN_PREFIX + '/my_account/auth_tokens/new')
55 config.add_route(
58 config.add_route(
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -49,7 +49,7 b' class TestMyAccountAuthTokens(TestContro'
49 user = User.get(usr['user_id'])
49 user = User.get(usr['user_id'])
50 response = self.app.get(route_path('my_account_auth_tokens'))
50 response = self.app.get(route_path('my_account_auth_tokens'))
51 for token in user.auth_tokens:
51 for token in user.auth_tokens:
52 response.mustcontain(token)
52 response.mustcontain(token[:4])
53 response.mustcontain('never')
53 response.mustcontain('never')
54
54
55 def test_my_account_add_auth_tokens_wrong_csrf(self, user_util):
55 def test_my_account_add_auth_tokens_wrong_csrf(self, user_util):
@@ -79,7 +79,7 b' class TestMyAccountAuthTokens(TestContro'
79 response = response.follow()
79 response = response.follow()
80 user = User.get(user_id)
80 user = User.get(user_id)
81 for auth_token in user.auth_tokens:
81 for auth_token in user.auth_tokens:
82 response.mustcontain(auth_token)
82 response.mustcontain(auth_token[:4])
83
83
84 def test_my_account_delete_auth_token(self, user_util):
84 def test_my_account_delete_auth_token(self, user_util):
85 user = user_util.create_user(password='qweqwe')
85 user = user_util.create_user(password='qweqwe')
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,7 +19,7 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 # -*- coding: utf-8 -*-
20 # -*- coding: utf-8 -*-
21
21
22 # Copyright (C) 2016-2019 RhodeCode GmbH
22 # Copyright (C) 2016-2020 RhodeCode GmbH
23 #
23 #
24 # This program is free software: you can redistribute it and/or modify
24 # This program is free software: you can redistribute it and/or modify
25 # it under the terms of the GNU Affero General Public License, version 3
25 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -25,7 +25,7 b' import string'
25 import formencode
25 import formencode
26 import formencode.htmlfill
26 import formencode.htmlfill
27 import peppercorn
27 import peppercorn
28 from pyramid.httpexceptions import HTTPFound
28 from pyramid.httpexceptions import HTTPFound, HTTPNotFound
29 from pyramid.view import view_config
29 from pyramid.view import view_config
30
30
31 from rhodecode.apps._base import BaseAppView, DataGridAppView
31 from rhodecode.apps._base import BaseAppView, DataGridAppView
@@ -164,6 +164,27 b' class MyAccountView(BaseAppView, DataGri'
164 c.role_vcs = AuthTokenModel.cls.ROLE_VCS
164 c.role_vcs = AuthTokenModel.cls.ROLE_VCS
165 return self._get_template_context(c)
165 return self._get_template_context(c)
166
166
167 @LoginRequired()
168 @NotAnonymous()
169 @CSRFRequired()
170 @view_config(
171 route_name='my_account_auth_tokens_view', request_method='POST', xhr=True,
172 renderer='json_ext')
173 def my_account_auth_tokens_view(self):
174 _ = self.request.translate
175 c = self.load_default_context()
176
177 auth_token_id = self.request.POST.get('auth_token_id')
178
179 if auth_token_id:
180 token = UserApiKeys.get_or_404(auth_token_id)
181 if token.user.user_id != c.user.user_id:
182 raise HTTPNotFound()
183
184 return {
185 'auth_token': token.api_key
186 }
187
167 def maybe_attach_token_scope(self, token):
188 def maybe_attach_token_scope(self, token):
168 # implemented in EE edition
189 # implemented in EE edition
169 pass
190 pass
@@ -702,12 +723,12 b' class MyAccountView(BaseAppView, DataGri'
702
723
703 pull_requests = PullRequestModel().get_im_participating_in(
724 pull_requests = PullRequestModel().get_im_participating_in(
704 user_id=self._rhodecode_user.user_id,
725 user_id=self._rhodecode_user.user_id,
705 statuses=statuses,
726 statuses=statuses, query=search_q,
706 offset=start, length=limit, order_by=order_by,
727 offset=start, length=limit, order_by=order_by,
707 order_dir=order_dir)
728 order_dir=order_dir)
708
729
709 pull_requests_total_count = PullRequestModel().count_im_participating_in(
730 pull_requests_total_count = PullRequestModel().count_im_participating_in(
710 user_id=self._rhodecode_user.user_id, statuses=statuses)
731 user_id=self._rhodecode_user.user_id, statuses=statuses, query=search_q)
711
732
712 data = []
733 data = []
713 comments_model = CommentsModel()
734 comments_model = CommentsModel()
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -156,6 +156,10 b' def includeme(config):'
156 pattern='/{repo_name:.*?[^/]}/authors/{commit_id}/{f_path:.*}', repo_route=True)
156 pattern='/{repo_name:.*?[^/]}/authors/{commit_id}/{f_path:.*}', repo_route=True)
157
157
158 config.add_route(
158 config.add_route(
159 name='repo_files_check_head',
160 pattern='/{repo_name:.*?[^/]}/check_head/{commit_id}/{f_path:.*}',
161 repo_route=True)
162 config.add_route(
159 name='repo_files_remove_file',
163 name='repo_files_remove_file',
160 pattern='/{repo_name:.*?[^/]}/remove_file/{commit_id}/{f_path:.*}',
164 pattern='/{repo_name:.*?[^/]}/remove_file/{commit_id}/{f_path:.*}',
161 repo_route=True)
165 repo_route=True)
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -22,8 +22,7 b' import pytest'
22
22
23 from rhodecode.tests import TestController
23 from rhodecode.tests import TestController
24
24
25 from rhodecode.model.db import (
25 from rhodecode.model.db import ChangesetComment, Notification
26 ChangesetComment, Notification, UserNotification)
27 from rhodecode.model.meta import Session
26 from rhodecode.model.meta import Session
28 from rhodecode.lib import helpers as h
27 from rhodecode.lib import helpers as h
29
28
@@ -269,7 +268,36 b' class TestRepoCommitCommentsView(TestCon'
269 repo_name=backend.repo_name, commit_id=commit_id))
268 repo_name=backend.repo_name, commit_id=commit_id))
270 assert_comment_links(response, 0, 0)
269 assert_comment_links(response, 0, 0)
271
270
272 @pytest.mark.parametrize('renderer, input, output', [
271 def test_delete_forbidden_for_immutable_comments(self, backend):
272 self.log_user()
273 commit_id = backend.repo.get_commit('300').raw_id
274 text = u'CommentOnCommit'
275
276 params = {'text': text, 'csrf_token': self.csrf_token}
277 self.app.post(
278 route_path(
279 'repo_commit_comment_create',
280 repo_name=backend.repo_name, commit_id=commit_id),
281 params=params)
282
283 comments = ChangesetComment.query().all()
284 assert len(comments) == 1
285 comment_id = comments[0].comment_id
286
287 comment = ChangesetComment.get(comment_id)
288 comment.immutable_state = ChangesetComment.OP_IMMUTABLE
289 Session().add(comment)
290 Session().commit()
291
292 self.app.post(
293 route_path('repo_commit_comment_delete',
294 repo_name=backend.repo_name,
295 commit_id=commit_id,
296 comment_id=comment_id),
297 params={'csrf_token': self.csrf_token},
298 status=403)
299
300 @pytest.mark.parametrize('renderer, text_input, output', [
273 ('rst', 'plain text', '<p>plain text</p>'),
301 ('rst', 'plain text', '<p>plain text</p>'),
274 ('rst', 'header\n======', '<h1 class="title">header</h1>'),
302 ('rst', 'header\n======', '<h1 class="title">header</h1>'),
275 ('rst', '*italics*', '<em>italics</em>'),
303 ('rst', '*italics*', '<em>italics</em>'),
@@ -280,11 +308,11 b' class TestRepoCommitCommentsView(TestCon'
280 ('markdown', '**bold**', '<strong>bold</strong>'),
308 ('markdown', '**bold**', '<strong>bold</strong>'),
281 ], ids=['rst-plain', 'rst-header', 'rst-italics', 'rst-bold', 'md-plain',
309 ], ids=['rst-plain', 'rst-header', 'rst-italics', 'rst-bold', 'md-plain',
282 'md-header', 'md-italics', 'md-bold', ])
310 'md-header', 'md-italics', 'md-bold', ])
283 def test_preview(self, renderer, input, output, backend, xhr_header):
311 def test_preview(self, renderer, text_input, output, backend, xhr_header):
284 self.log_user()
312 self.log_user()
285 params = {
313 params = {
286 'renderer': renderer,
314 'renderer': renderer,
287 'text': input,
315 'text': text_input,
288 'csrf_token': self.csrf_token
316 'csrf_token': self.csrf_token
289 }
317 }
290 commit_id = '0' * 16 # fake this for tests
318 commit_id = '0' * 16 # fake this for tests
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -484,7 +484,7 b' class TestCompareView(object):'
484
484
485 # outgoing commits between those commits
485 # outgoing commits between those commits
486 compare_page = ComparePage(response)
486 compare_page = ComparePage(response)
487 compare_page.contains_commits(commits=[commit1], ancestors=[commit0])
487 compare_page.contains_commits(commits=[commit1])
488
488
489 def test_errors_when_comparing_unknown_source_repo(self, backend):
489 def test_errors_when_comparing_unknown_source_repo(self, backend):
490 repo = backend.repo
490 repo = backend.repo
@@ -641,6 +641,7 b' class ComparePage(AssertResponse):'
641 self.contains_one_link(
641 self.contains_one_link(
642 'r%s:%s' % (commit.idx, commit.short_id),
642 'r%s:%s' % (commit.idx, commit.short_id),
643 self._commit_url(commit))
643 self._commit_url(commit))
644
644 if ancestors:
645 if ancestors:
645 response.mustcontain('Ancestor')
646 response.mustcontain('Ancestor')
646 for ancestor in ancestors:
647 for ancestor in ancestors:
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -629,7 +629,7 b' class TestPullrequestsView(object):'
629 model_patcher = mock.patch.multiple(
629 model_patcher = mock.patch.multiple(
630 PullRequestModel,
630 PullRequestModel,
631 merge_repo=mock.Mock(return_value=merge_resp),
631 merge_repo=mock.Mock(return_value=merge_resp),
632 merge_status=mock.Mock(return_value=(True, 'WRONG_MESSAGE')))
632 merge_status=mock.Mock(return_value=(None, True, 'WRONG_MESSAGE')))
633
633
634 with model_patcher:
634 with model_patcher:
635 response = self.app.post(
635 response = self.app.post(
@@ -891,6 +891,8 b' class TestPullrequestsView(object):'
891
891
892 vcs = repo.scm_instance()
892 vcs = repo.scm_instance()
893 vcs.remove_ref('refs/heads/{}'.format(branch_name))
893 vcs.remove_ref('refs/heads/{}'.format(branch_name))
894 # NOTE(marcink): run GC to ensure the commits are gone
895 vcs.run_gc()
894
896
895 response = self.app.get(route_path(
897 response = self.app.get(route_path(
896 'pullrequest_show',
898 'pullrequest_show',
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -20,6 +20,9 b''
20
20
21 from rhodecode.lib import helpers as h
21 from rhodecode.lib import helpers as h
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
24
25 REVIEWER_API_VERSION = 'V3'
23
26
24
27
25 def reviewer_as_json(user, reasons=None, mandatory=False, rules=None, user_group=None):
28 def reviewer_as_json(user, reasons=None, mandatory=False, rules=None, user_group=None):
@@ -47,15 +50,20 b' def reviewer_as_json(user, reasons=None,'
47
50
48 def get_default_reviewers_data(
51 def get_default_reviewers_data(
49 current_user, source_repo, source_commit, target_repo, target_commit):
52 current_user, source_repo, source_commit, target_repo, target_commit):
53 """
54 Return json for default reviewers of a repository
55 """
50
56
51 """ Return json for default reviewers of a repository """
57 diff_info = get_diff_info(
58 source_repo, source_commit.raw_id, target_repo, target_commit.raw_id)
52
59
53 reasons = ['Default reviewer', 'Repository owner']
60 reasons = ['Default reviewer', 'Repository owner']
54 json_reviewers = [reviewer_as_json(
61 json_reviewers = [reviewer_as_json(
55 user=target_repo.user, reasons=reasons, mandatory=False, rules=None)]
62 user=target_repo.user, reasons=reasons, mandatory=False, rules=None)]
56
63
57 return {
64 return {
58 'api_ver': 'v1', # define version for later possible schema upgrade
65 'api_ver': REVIEWER_API_VERSION, # define version for later possible schema upgrade
66 'diff_info': diff_info,
59 'reviewers': json_reviewers,
67 'reviewers': json_reviewers,
60 'rules': {},
68 'rules': {},
61 'rules_data': {},
69 'rules_data': {},
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -22,7 +22,7 b''
22 import logging
22 import logging
23 import collections
23 import collections
24
24
25 from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest, HTTPFound
25 from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest, HTTPFound, HTTPForbidden
26 from pyramid.view import view_config
26 from pyramid.view import view_config
27 from pyramid.renderers import render
27 from pyramid.renderers import render
28 from pyramid.response import Response
28 from pyramid.response import Response
@@ -380,6 +380,11 b' class RepoCommitsView(RepoAppView):'
380 'repo_commit', repo_name=self.db_repo_name,
380 'repo_commit', repo_name=self.db_repo_name,
381 commit_id=current_id))
381 commit_id=current_id))
382
382
383 commit = self.db_repo.get_commit(current_id)
384 CommentsModel().trigger_commit_comment_hook(
385 self.db_repo, self._rhodecode_user, 'create',
386 data={'comment': comment, 'commit': commit})
387
383 # finalize, commit and redirect
388 # finalize, commit and redirect
384 Session().commit()
389 Session().commit()
385
390
@@ -533,6 +538,10 b' class RepoCommitsView(RepoAppView):'
533 # comment already deleted in another call probably
538 # comment already deleted in another call probably
534 return True
539 return True
535
540
541 if comment.immutable:
542 # don't allow deleting comments that are immutable
543 raise HTTPForbidden()
544
536 is_repo_admin = h.HasRepoPermissionAny('repository.admin')(self.db_repo_name)
545 is_repo_admin = h.HasRepoPermissionAny('repository.admin')(self.db_repo_name)
537 super_admin = h.HasPermissionAny('hg.admin')()
546 super_admin = h.HasPermissionAny('hg.admin')()
538 comment_owner = (comment.author.user_id == self._rhodecode_db_user.user_id)
547 comment_owner = (comment.author.user_id == self._rhodecode_db_user.user_id)
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -245,7 +245,7 b' class RepoFilesView(RepoAppView):'
245
245
246 return branch_name, sha_commit_id, is_head
246 return branch_name, sha_commit_id, is_head
247
247
248 def _get_tree_at_commit(self, c, commit_id, f_path, full_load=False):
248 def _get_tree_at_commit(self, c, commit_id, f_path, full_load=False, at_rev=None):
249
249
250 repo_id = self.db_repo.repo_id
250 repo_id = self.db_repo.repo_id
251 force_recache = self.get_recache_flag()
251 force_recache = self.get_recache_flag()
@@ -261,19 +261,19 b' class RepoFilesView(RepoAppView):'
261 cache_namespace_uid = 'cache_repo.{}'.format(repo_id)
261 cache_namespace_uid = 'cache_repo.{}'.format(repo_id)
262 region = rc_cache.get_or_create_region('cache_repo', cache_namespace_uid)
262 region = rc_cache.get_or_create_region('cache_repo', cache_namespace_uid)
263
263
264 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid,
264 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, condition=cache_on)
265 condition=cache_on)
265 def compute_file_tree(ver, _name_hash, _repo_id, _commit_id, _f_path, _full_load, _at_rev):
266 def compute_file_tree(ver, repo_id, commit_id, f_path, full_load):
267 log.debug('Generating cached file tree at ver:%s for repo_id: %s, %s, %s',
266 log.debug('Generating cached file tree at ver:%s for repo_id: %s, %s, %s',
268 ver, repo_id, commit_id, f_path)
267 ver, _repo_id, _commit_id, _f_path)
269
268
270 c.full_load = full_load
269 c.full_load = _full_load
271 return render(
270 return render(
272 'rhodecode:templates/files/files_browser_tree.mako',
271 'rhodecode:templates/files/files_browser_tree.mako',
273 self._get_template_context(c), self.request)
272 self._get_template_context(c), self.request, _at_rev)
274
273
275 return compute_file_tree(
274 return compute_file_tree(
276 rc_cache.FILE_TREE_CACHE_VER, self.db_repo.repo_id, commit_id, f_path, full_load)
275 rc_cache.FILE_TREE_CACHE_VER, self.db_repo.repo_name_hash,
276 self.db_repo.repo_id, commit_id, f_path, full_load, at_rev)
277
277
278 def _get_archive_spec(self, fname):
278 def _get_archive_spec(self, fname):
279 log.debug('Detecting archive spec for: `%s`', fname)
279 log.debug('Detecting archive spec for: `%s`', fname)
@@ -617,15 +617,12 b' class RepoFilesView(RepoAppView):'
617 c.renderer = view_name == 'repo_files:rendered' or \
617 c.renderer = view_name == 'repo_files:rendered' or \
618 not self.request.GET.get('no-render', False)
618 not self.request.GET.get('no-render', False)
619
619
620 # redirect to given commit_id from form if given
620 commit_id, f_path = self._get_commit_and_path()
621 get_commit_id = self.request.GET.get('at_rev', None)
622 if get_commit_id:
623 self._get_commit_or_redirect(get_commit_id)
624
621
625 commit_id, f_path = self._get_commit_and_path()
626 c.commit = self._get_commit_or_redirect(commit_id)
622 c.commit = self._get_commit_or_redirect(commit_id)
627 c.branch = self.request.GET.get('branch', None)
623 c.branch = self.request.GET.get('branch', None)
628 c.f_path = f_path
624 c.f_path = f_path
625 at_rev = self.request.GET.get('at')
629
626
630 # prev link
627 # prev link
631 try:
628 try:
@@ -705,7 +702,7 b' class RepoFilesView(RepoAppView):'
705 c.authors = []
702 c.authors = []
706 # this loads a simple tree without metadata to speed things up
703 # this loads a simple tree without metadata to speed things up
707 # later via ajax we call repo_nodetree_full and fetch whole
704 # later via ajax we call repo_nodetree_full and fetch whole
708 c.file_tree = self._get_tree_at_commit(c, c.commit.raw_id, f_path)
705 c.file_tree = self._get_tree_at_commit(c, c.commit.raw_id, f_path, at_rev=at_rev)
709
706
710 c.readme_data, c.readme_file = \
707 c.readme_data, c.readme_file = \
711 self._get_readme_data(self.db_repo, c.visual.default_renderer,
708 self._get_readme_data(self.db_repo, c.visual.default_renderer,
@@ -782,9 +779,10 b' class RepoFilesView(RepoAppView):'
782
779
783 c.file = dir_node
780 c.file = dir_node
784 c.commit = commit
781 c.commit = commit
782 at_rev = self.request.GET.get('at')
785
783
786 html = self._get_tree_at_commit(
784 html = self._get_tree_at_commit(
787 c, commit.raw_id, dir_node.path, full_load=True)
785 c, commit.raw_id, dir_node.path, full_load=True, at_rev=at_rev)
788
786
789 return Response(html)
787 return Response(html)
790
788
@@ -915,13 +913,12 b' class RepoFilesView(RepoAppView):'
915 cache_namespace_uid = 'cache_repo.{}'.format(repo_id)
913 cache_namespace_uid = 'cache_repo.{}'.format(repo_id)
916 region = rc_cache.get_or_create_region('cache_repo', cache_namespace_uid)
914 region = rc_cache.get_or_create_region('cache_repo', cache_namespace_uid)
917
915
918 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid,
916 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, condition=cache_on)
919 condition=cache_on)
917 def compute_file_search(_name_hash, _repo_id, _commit_id, _f_path):
920 def compute_file_search(repo_id, commit_id, f_path):
921 log.debug('Generating cached nodelist for repo_id:%s, %s, %s',
918 log.debug('Generating cached nodelist for repo_id:%s, %s, %s',
922 repo_id, commit_id, f_path)
919 _repo_id, commit_id, f_path)
923 try:
920 try:
924 _d, _f = ScmModel().get_quick_filter_nodes(repo_name, commit_id, f_path)
921 _d, _f = ScmModel().get_quick_filter_nodes(repo_name, _commit_id, _f_path)
925 except (RepositoryError, CommitDoesNotExistError, Exception) as e:
922 except (RepositoryError, CommitDoesNotExistError, Exception) as e:
926 log.exception(safe_str(e))
923 log.exception(safe_str(e))
927 h.flash(safe_str(h.escape(e)), category='error')
924 h.flash(safe_str(h.escape(e)), category='error')
@@ -931,7 +928,8 b' class RepoFilesView(RepoAppView):'
931
928
932 return _d + _f
929 return _d + _f
933
930
934 result = compute_file_search(self.db_repo.repo_id, commit_id, f_path)
931 result = compute_file_search(self.db_repo.repo_name_hash, self.db_repo.repo_id,
932 commit_id, f_path)
935 return filter(lambda n: self.path_filter.path_access_allowed(n['name']), result)
933 return filter(lambda n: self.path_filter.path_access_allowed(n['name']), result)
936
934
937 @LoginRequired()
935 @LoginRequired()
@@ -961,6 +959,9 b' class RepoFilesView(RepoAppView):'
961 return commit_id
959 return commit_id
962
960
963 def _symbolic_reference_svn(self, commit_id, name, f_path, ref_type):
961 def _symbolic_reference_svn(self, commit_id, name, f_path, ref_type):
962 return commit_id
963
964 # NOTE(dan): old code we used in "diff" mode compare
964 new_f_path = vcspath.join(name, f_path)
965 new_f_path = vcspath.join(name, f_path)
965 return u'%s@%s' % (new_f_path, commit_id)
966 return u'%s@%s' % (new_f_path, commit_id)
966
967
@@ -1035,10 +1036,24 b' class RepoFilesView(RepoAppView):'
1035 file_history, _hist = self._get_node_history(commit, f_path)
1036 file_history, _hist = self._get_node_history(commit, f_path)
1036
1037
1037 res = []
1038 res = []
1038 for obj in file_history:
1039 for section_items, section in file_history:
1040 items = []
1041 for obj_id, obj_text, obj_type in section_items:
1042 at_rev = ''
1043 if obj_type in ['branch', 'bookmark', 'tag']:
1044 at_rev = obj_text
1045 entry = {
1046 'id': obj_id,
1047 'text': obj_text,
1048 'type': obj_type,
1049 'at_rev': at_rev
1050 }
1051
1052 items.append(entry)
1053
1039 res.append({
1054 res.append({
1040 'text': obj[1],
1055 'text': section,
1041 'children': [{'id': o[0], 'text': o[1], 'type': o[2]} for o in obj[0]]
1056 'children': items
1042 })
1057 })
1043
1058
1044 data = {
1059 data = {
@@ -1098,6 +1113,42 b' class RepoFilesView(RepoAppView):'
1098 @LoginRequired()
1113 @LoginRequired()
1099 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
1114 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
1100 @view_config(
1115 @view_config(
1116 route_name='repo_files_check_head', request_method='POST',
1117 renderer='json_ext', xhr=True)
1118 def repo_files_check_head(self):
1119 self.load_default_context()
1120
1121 commit_id, f_path = self._get_commit_and_path()
1122 _branch_name, _sha_commit_id, is_head = \
1123 self._is_valid_head(commit_id, self.rhodecode_vcs_repo)
1124
1125 new_path = self.request.POST.get('path')
1126 operation = self.request.POST.get('operation')
1127 path_exist = ''
1128
1129 if new_path and operation in ['create', 'upload']:
1130 new_f_path = os.path.join(f_path.lstrip('/'), new_path)
1131 try:
1132 commit_obj = self.rhodecode_vcs_repo.get_commit(commit_id)
1133 # NOTE(dan): construct whole path without leading /
1134 file_node = commit_obj.get_node(new_f_path)
1135 if file_node is not None:
1136 path_exist = new_f_path
1137 except EmptyRepositoryError:
1138 pass
1139 except Exception:
1140 pass
1141
1142 return {
1143 'branch': _branch_name,
1144 'sha': _sha_commit_id,
1145 'is_head': is_head,
1146 'path_exists': path_exist
1147 }
1148
1149 @LoginRequired()
1150 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
1151 @view_config(
1101 route_name='repo_files_remove_file', request_method='GET',
1152 route_name='repo_files_remove_file', request_method='GET',
1102 renderer='rhodecode:templates/files/files_delete.mako')
1153 renderer='rhodecode:templates/files/files_delete.mako')
1103 def repo_files_remove_file(self):
1154 def repo_files_remove_file(self):
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -114,21 +114,26 b' class RepoSettingsPermissionsView(RepoAp'
114 private_flag = str2bool(self.request.POST.get('private'))
114 private_flag = str2bool(self.request.POST.get('private'))
115
115
116 try:
116 try:
117 RepoModel().update(
117 repo = RepoModel().get(self.db_repo.repo_id)
118 self.db_repo, **{'repo_private': private_flag, 'repo_name': self.db_repo_name})
118 repo.private = private_flag
119 Session().add(repo)
120 RepoModel().grant_user_permission(
121 repo=self.db_repo, user=User.DEFAULT_USER, perm='repository.none'
122 )
123
119 Session().commit()
124 Session().commit()
120
125
121 h.flash(_('Repository `{}` private mode set successfully').format(self.db_repo_name),
126 h.flash(_('Repository `{}` private mode set successfully').format(self.db_repo_name),
122 category='success')
127 category='success')
128 # NOTE(dan): we change repo private mode we need to notify all USERS
129 affected_user_ids = User.get_all_user_ids()
130 PermissionModel().trigger_permission_flush(affected_user_ids)
131
123 except Exception:
132 except Exception:
124 log.exception("Exception during update of repository")
133 log.exception("Exception during update of repository")
125 h.flash(_('Error occurred during update of repository {}').format(
134 h.flash(_('Error occurred during update of repository {}').format(
126 self.db_repo_name), category='error')
135 self.db_repo_name), category='error')
127
136
128 # NOTE(dan): we change repo private mode we need to notify all USERS
129 affected_user_ids = User.get_all_user_ids()
130 PermissionModel().trigger_permission_flush(affected_user_ids)
131
132 return {
137 return {
133 'redirect_url': h.route_path('edit_repo_perms', repo_name=self.db_repo_name),
138 'redirect_url': h.route_path('edit_repo_perms', repo_name=self.db_repo_name),
134 'private': private_flag
139 'private': private_flag
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -40,12 +40,12 b' from rhodecode.lib.auth import ('
40 NotAnonymous, CSRFRequired)
40 NotAnonymous, CSRFRequired)
41 from rhodecode.lib.utils2 import str2bool, safe_str, safe_unicode
41 from rhodecode.lib.utils2 import str2bool, safe_str, safe_unicode
42 from rhodecode.lib.vcs.backends.base import EmptyCommit, UpdateFailureReason
42 from rhodecode.lib.vcs.backends.base import EmptyCommit, UpdateFailureReason
43 from rhodecode.lib.vcs.exceptions import (CommitDoesNotExistError,
43 from rhodecode.lib.vcs.exceptions import (
44 RepositoryRequirementError, EmptyRepositoryError)
44 CommitDoesNotExistError, RepositoryRequirementError, EmptyRepositoryError)
45 from rhodecode.model.changeset_status import ChangesetStatusModel
45 from rhodecode.model.changeset_status import ChangesetStatusModel
46 from rhodecode.model.comment import CommentsModel
46 from rhodecode.model.comment import CommentsModel
47 from rhodecode.model.db import (func, or_, PullRequest, PullRequestVersion,
47 from rhodecode.model.db import (
48 ChangesetComment, ChangesetStatus, Repository)
48 func, or_, PullRequest, ChangesetComment, ChangesetStatus, Repository)
49 from rhodecode.model.forms import PullRequestForm
49 from rhodecode.model.forms import PullRequestForm
50 from rhodecode.model.meta import Session
50 from rhodecode.model.meta import Session
51 from rhodecode.model.pull_request import PullRequestModel, MergeCheck
51 from rhodecode.model.pull_request import PullRequestModel, MergeCheck
@@ -210,10 +210,12 b' class RepoPullRequestsView(RepoAppView, '
210 return caching_enabled
210 return caching_enabled
211
211
212 def _get_diffset(self, source_repo_name, source_repo,
212 def _get_diffset(self, source_repo_name, source_repo,
213 ancestor_commit,
213 source_ref_id, target_ref_id,
214 source_ref_id, target_ref_id,
214 target_commit, source_commit, diff_limit, file_limit,
215 target_commit, source_commit, diff_limit, file_limit,
215 fulldiff, hide_whitespace_changes, diff_context):
216 fulldiff, hide_whitespace_changes, diff_context):
216
217
218 target_ref_id = ancestor_commit.raw_id
217 vcs_diff = PullRequestModel().get_diff(
219 vcs_diff = PullRequestModel().get_diff(
218 source_repo, source_ref_id, target_ref_id,
220 source_repo, source_ref_id, target_ref_id,
219 hide_whitespace_changes, diff_context)
221 hide_whitespace_changes, diff_context)
@@ -278,6 +280,7 b' class RepoPullRequestsView(RepoAppView, '
278 _new_state = {
280 _new_state = {
279 'created': PullRequest.STATE_CREATED,
281 'created': PullRequest.STATE_CREATED,
280 }.get(self.request.GET.get('force_state'))
282 }.get(self.request.GET.get('force_state'))
283
281 if c.is_super_admin and _new_state:
284 if c.is_super_admin and _new_state:
282 with pull_request.set_state(PullRequest.STATE_UPDATING, final_state=_new_state):
285 with pull_request.set_state(PullRequest.STATE_UPDATING, final_state=_new_state):
283 h.flash(
286 h.flash(
@@ -396,9 +399,12 b' class RepoPullRequestsView(RepoAppView, '
396 pull_request_latest, auth_user=self._rhodecode_user,
399 pull_request_latest, auth_user=self._rhodecode_user,
397 translator=self.request.translate,
400 translator=self.request.translate,
398 force_shadow_repo_refresh=force_refresh)
401 force_shadow_repo_refresh=force_refresh)
402
399 c.pr_merge_errors = _merge_check.error_details
403 c.pr_merge_errors = _merge_check.error_details
400 c.pr_merge_possible = not _merge_check.failed
404 c.pr_merge_possible = not _merge_check.failed
401 c.pr_merge_message = _merge_check.merge_msg
405 c.pr_merge_message = _merge_check.merge_msg
406 c.pr_merge_source_commit = _merge_check.source_commit
407 c.pr_merge_target_commit = _merge_check.target_commit
402
408
403 c.pr_merge_info = MergeCheck.get_merge_conditions(
409 c.pr_merge_info = MergeCheck.get_merge_conditions(
404 pull_request_latest, translator=self.request.translate)
410 pull_request_latest, translator=self.request.translate)
@@ -537,6 +543,13 b' class RepoPullRequestsView(RepoAppView, '
537 (ancestor_commit, commit_cache, missing_requirements,
543 (ancestor_commit, commit_cache, missing_requirements,
538 source_commit, target_commit) = cached_diff['commits']
544 source_commit, target_commit) = cached_diff['commits']
539 else:
545 else:
546 # NOTE(marcink): we reach potentially unreachable errors when a PR has
547 # merge errors resulting in potentially hidden commits in the shadow repo.
548 maybe_unreachable = _merge_check.MERGE_CHECK in _merge_check.error_details \
549 and _merge_check.merge_response
550 maybe_unreachable = maybe_unreachable \
551 and _merge_check.merge_response.metadata.get('unresolved_files')
552 log.debug("Using unreachable commits due to MERGE_CHECK in merge simulation")
540 diff_commit_cache = \
553 diff_commit_cache = \
541 (ancestor_commit, commit_cache, missing_requirements,
554 (ancestor_commit, commit_cache, missing_requirements,
542 source_commit, target_commit) = self.get_commits(
555 source_commit, target_commit) = self.get_commits(
@@ -547,7 +560,8 b' class RepoPullRequestsView(RepoAppView, '
547 source_scm,
560 source_scm,
548 target_commit,
561 target_commit,
549 target_ref_id,
562 target_ref_id,
550 target_scm)
563 target_scm,
564 maybe_unreachable=maybe_unreachable)
551
565
552 # register our commit range
566 # register our commit range
553 for comm in commit_cache.values():
567 for comm in commit_cache.values():
@@ -581,11 +595,10 b' class RepoPullRequestsView(RepoAppView, '
581 has_proper_diff_cache = cached_diff and cached_diff.get('commits')
595 has_proper_diff_cache = cached_diff and cached_diff.get('commits')
582 if not force_recache and has_proper_diff_cache:
596 if not force_recache and has_proper_diff_cache:
583 c.diffset = cached_diff['diff']
597 c.diffset = cached_diff['diff']
584 (ancestor_commit, commit_cache, missing_requirements,
585 source_commit, target_commit) = cached_diff['commits']
586 else:
598 else:
587 c.diffset = self._get_diffset(
599 c.diffset = self._get_diffset(
588 c.source_repo.repo_name, commits_source_repo,
600 c.source_repo.repo_name, commits_source_repo,
601 c.ancestor_commit,
589 source_ref_id, target_ref_id,
602 source_ref_id, target_ref_id,
590 target_commit, source_commit,
603 target_commit, source_commit,
591 diff_limit, file_limit, c.fulldiff,
604 diff_limit, file_limit, c.fulldiff,
@@ -665,8 +678,10 b' class RepoPullRequestsView(RepoAppView, '
665
678
666 # calculate the diff for commits between versions
679 # calculate the diff for commits between versions
667 c.commit_changes = []
680 c.commit_changes = []
668 mark = lambda cs, fw: list(
681
669 h.itertools.izip_longest([], cs, fillvalue=fw))
682 def mark(cs, fw):
683 return list(h.itertools.izip_longest([], cs, fillvalue=fw))
684
670 for c_type, raw_id in mark(commit_changes.added, 'a') \
685 for c_type, raw_id in mark(commit_changes.added, 'a') \
671 + mark(commit_changes.removed, 'r') \
686 + mark(commit_changes.removed, 'r') \
672 + mark(commit_changes.common, 'c'):
687 + mark(commit_changes.common, 'c'):
@@ -698,15 +713,22 b' class RepoPullRequestsView(RepoAppView, '
698
713
699 def get_commits(
714 def get_commits(
700 self, commits_source_repo, pull_request_at_ver, source_commit,
715 self, commits_source_repo, pull_request_at_ver, source_commit,
701 source_ref_id, source_scm, target_commit, target_ref_id, target_scm):
716 source_ref_id, source_scm, target_commit, target_ref_id, target_scm,
717 maybe_unreachable=False):
718
702 commit_cache = collections.OrderedDict()
719 commit_cache = collections.OrderedDict()
703 missing_requirements = False
720 missing_requirements = False
721
704 try:
722 try:
705 pre_load = ["author", "date", "message", "branch", "parents"]
723 pre_load = ["author", "date", "message", "branch", "parents"]
706 show_revs = pull_request_at_ver.revisions
724
707 for rev in show_revs:
725 pull_request_commits = pull_request_at_ver.revisions
708 comm = commits_source_repo.get_commit(
726 log.debug('Loading %s commits from %s',
709 commit_id=rev, pre_load=pre_load)
727 len(pull_request_commits), commits_source_repo)
728
729 for rev in pull_request_commits:
730 comm = commits_source_repo.get_commit(commit_id=rev, pre_load=pre_load,
731 maybe_unreachable=maybe_unreachable)
710 commit_cache[comm.raw_id] = comm
732 commit_cache[comm.raw_id] = comm
711
733
712 # Order here matters, we first need to get target, and then
734 # Order here matters, we first need to get target, and then
@@ -715,22 +737,21 b' class RepoPullRequestsView(RepoAppView, '
715 commit_id=safe_str(target_ref_id))
737 commit_id=safe_str(target_ref_id))
716
738
717 source_commit = commits_source_repo.get_commit(
739 source_commit = commits_source_repo.get_commit(
718 commit_id=safe_str(source_ref_id))
740 commit_id=safe_str(source_ref_id), maybe_unreachable=True)
719 except CommitDoesNotExistError:
741 except CommitDoesNotExistError:
720 log.warning(
742 log.warning('Failed to get commit from `{}` repo'.format(
721 'Failed to get commit from `{}` repo'.format(
743 commits_source_repo), exc_info=True)
722 commits_source_repo), exc_info=True)
723 except RepositoryRequirementError:
744 except RepositoryRequirementError:
724 log.warning(
745 log.warning('Failed to get all required data from repo', exc_info=True)
725 'Failed to get all required data from repo', exc_info=True)
726 missing_requirements = True
746 missing_requirements = True
727 ancestor_commit = None
747
748 pr_ancestor_id = pull_request_at_ver.common_ancestor_id
749
728 try:
750 try:
729 ancestor_id = source_scm.get_common_ancestor(
751 ancestor_commit = source_scm.get_commit(pr_ancestor_id)
730 source_commit.raw_id, target_commit.raw_id, target_scm)
731 ancestor_commit = source_scm.get_commit(ancestor_id)
732 except Exception:
752 except Exception:
733 ancestor_commit = None
753 ancestor_commit = None
754
734 return ancestor_commit, commit_cache, missing_requirements, source_commit, target_commit
755 return ancestor_commit, commit_cache, missing_requirements, source_commit, target_commit
735
756
736 def assure_not_empty_repo(self):
757 def assure_not_empty_repo(self):
@@ -934,6 +955,7 b' class RepoPullRequestsView(RepoAppView, '
934 target_repo = _form['target_repo']
955 target_repo = _form['target_repo']
935 target_ref = _form['target_ref']
956 target_ref = _form['target_ref']
936 commit_ids = _form['revisions'][::-1]
957 commit_ids = _form['revisions'][::-1]
958 common_ancestor_id = _form['common_ancestor']
937
959
938 # find the ancestor for this pr
960 # find the ancestor for this pr
939 source_db_repo = Repository.get_by_repo_name(_form['source_repo'])
961 source_db_repo = Repository.get_by_repo_name(_form['source_repo'])
@@ -1020,6 +1042,7 b' class RepoPullRequestsView(RepoAppView, '
1020 target_repo=target_repo,
1042 target_repo=target_repo,
1021 target_ref=target_ref,
1043 target_ref=target_ref,
1022 revisions=commit_ids,
1044 revisions=commit_ids,
1045 common_ancestor_id=common_ancestor_id,
1023 reviewers=reviewers,
1046 reviewers=reviewers,
1024 title=pullrequest_title,
1047 title=pullrequest_title,
1025 description=description,
1048 description=description,
@@ -1458,6 +1481,10 b' class RepoPullRequestsView(RepoAppView, '
1458 self.request.matchdict['comment_id'])
1481 self.request.matchdict['comment_id'])
1459 comment_id = comment.comment_id
1482 comment_id = comment.comment_id
1460
1483
1484 if comment.immutable:
1485 # don't allow deleting comments that are immutable
1486 raise HTTPForbidden()
1487
1461 if pull_request.is_closed():
1488 if pull_request.is_closed():
1462 log.debug('comment: forbidden because pull request is closed')
1489 log.debug('comment: forbidden because pull request is closed')
1463 raise HTTPForbidden()
1490 raise HTTPForbidden()
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -54,8 +54,20 b' class RepoReviewRulesView(RepoAppView):'
54 renderer='json_ext')
54 renderer='json_ext')
55 def repo_default_reviewers_data(self):
55 def repo_default_reviewers_data(self):
56 self.load_default_context()
56 self.load_default_context()
57 target_repo_name = self.request.GET.get('target_repo', self.db_repo.repo_name)
57
58 request = self.request
59 source_repo = self.db_repo
60 source_repo_name = source_repo.repo_name
61 target_repo_name = request.GET.get('target_repo', source_repo_name)
58 target_repo = Repository.get_by_repo_name(target_repo_name)
62 target_repo = Repository.get_by_repo_name(target_repo_name)
63
64 source_ref = request.GET['source_ref']
65 target_ref = request.GET['target_ref']
66 source_commit = source_repo.get_commit(source_ref)
67 target_commit = target_repo.get_commit(target_ref)
68
69 current_user = request.user.get_instance()
59 review_data = get_default_reviewers_data(
70 review_data = get_default_reviewers_data(
60 self.db_repo.user, None, None, target_repo, None)
71 current_user, source_repo, source_commit, target_repo, target_commit)
72
61 return review_data
73 return review_data
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -22,6 +22,7 b' import logging'
22
22
23 from pyramid.view import view_config
23 from pyramid.view import view_config
24 from pyramid.httpexceptions import HTTPFound
24 from pyramid.httpexceptions import HTTPFound
25 from packaging.version import Version
25
26
26 from rhodecode import events
27 from rhodecode import events
27 from rhodecode.apps._base import RepoAppView
28 from rhodecode.apps._base import RepoAppView
@@ -64,12 +65,19 b' class RepoSettingsView(RepoAppView):'
64 c = self.load_default_context()
65 c = self.load_default_context()
65 c.active = 'advanced'
66 c.active = 'advanced'
66
67
67 c.default_user_id = User.get_default_user().user_id
68 c.default_user_id = User.get_default_user_id()
68 c.in_public_journal = UserFollowing.query() \
69 c.in_public_journal = UserFollowing.query() \
69 .filter(UserFollowing.user_id == c.default_user_id) \
70 .filter(UserFollowing.user_id == c.default_user_id) \
70 .filter(UserFollowing.follows_repository == self.db_repo).scalar()
71 .filter(UserFollowing.follows_repository == self.db_repo).scalar()
71
72
72 c.ver_info_dict = self.rhodecode_vcs_repo.get_hooks_info()
73 c.ver_info_dict = self.rhodecode_vcs_repo.get_hooks_info()
74 c.hooks_outdated = False
75
76 try:
77 if Version(c.ver_info_dict['pre_version']) < Version(c.rhodecode_version):
78 c.hooks_outdated = True
79 except Exception:
80 pass
73
81
74 # update commit cache if GET flag is present
82 # update commit cache if GET flag is present
75 if self.request.GET.get('update_commit_cache'):
83 if self.request.GET.get('update_commit_cache'):
@@ -212,7 +220,7 b' class RepoSettingsView(RepoAppView):'
212 _ = self.request.translate
220 _ = self.request.translate
213
221
214 try:
222 try:
215 user_id = User.get_default_user().user_id
223 user_id = User.get_default_user_id()
216 ScmModel().toggle_following_repo(self.db_repo.repo_id, user_id)
224 ScmModel().toggle_following_repo(self.db_repo.repo_id, user_id)
217 h.flash(_('Updated repository visibility in public journal'),
225 h.flash(_('Updated repository visibility in public journal'),
218 category='success')
226 category='success')
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -60,11 +60,10 b' def perform_search(request, tmpl_context'
60 errors = e.children
60 errors = e.children
61
61
62 def url_generator(page_num):
62 def url_generator(page_num):
63 q = urllib.quote(safe_str(search_query))
64
63
65 query_params = {
64 query_params = {
66 'page': page_num,
65 'page': page_num,
67 'q': q,
66 'q': safe_str(search_query),
68 'type': safe_str(search_type),
67 'type': safe_str(search_type),
69 'max_lines': search_max_lines,
68 'max_lines': search_max_lines,
70 'sort': search_sort
69 'sort': search_sort
@@ -72,7 +71,6 b' def perform_search(request, tmpl_context'
72
71
73 return '?' + urllib.urlencode(query_params)
72 return '?' + urllib.urlencode(query_params)
74
73
75
76 c = tmpl_context
74 c = tmpl_context
77 search_query = search_params.get('search_query')
75 search_query = search_params.get('search_query')
78 search_type = search_params.get('search_type')
76 search_type = search_params.get('search_type')
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -91,7 +91,6 b' class SshWrapper(object):'
91
91
92 def get_repo_details(self, mode):
92 def get_repo_details(self, mode):
93 vcs_type = mode if mode in ['svn', 'hg', 'git'] else None
93 vcs_type = mode if mode in ['svn', 'hg', 'git'] else None
94 mode = mode
95 repo_name = None
94 repo_name = None
96
95
97 hg_pattern = r'^hg\s+\-R\s+(\S+)\s+serve\s+\-\-stdio$'
96 hg_pattern = r'^hg\s+\-R\s+(\S+)\s+serve\s+\-\-stdio$'
@@ -101,8 +100,7 b' class SshWrapper(object):'
101 repo_name = hg_match.group(1).strip('/')
100 repo_name = hg_match.group(1).strip('/')
102 return vcs_type, repo_name, mode
101 return vcs_type, repo_name, mode
103
102
104 git_pattern = (
103 git_pattern = r'^git-(receive-pack|upload-pack)\s\'[/]?(\S+?)(|\.git)\'$'
105 r'^git-(receive-pack|upload-pack)\s\'[/]?(\S+?)(|\.git)\'$')
106 git_match = re.match(git_pattern, self.command)
104 git_match = re.match(git_pattern, self.command)
107 if git_match is not None:
105 if git_match is not None:
108 vcs_type = 'git'
106 vcs_type = 'git'
@@ -115,7 +113,8 b' class SshWrapper(object):'
115
113
116 if svn_match is not None:
114 if svn_match is not None:
117 vcs_type = 'svn'
115 vcs_type = 'svn'
118 # Repo name should be extracted from the input stream
116 # Repo name should be extracted from the input stream, we're unable to
117 # extract it at this point in execution
119 return vcs_type, repo_name, mode
118 return vcs_type, repo_name, mode
120
119
121 return vcs_type, repo_name, mode
120 return vcs_type, repo_name, mode
@@ -188,8 +187,7 b' class SshWrapper(object):'
188 log.debug('SSH Connection info %s', self.get_connection_info())
187 log.debug('SSH Connection info %s', self.get_connection_info())
189
188
190 if shell and self.command is None:
189 if shell and self.command is None:
191 log.info(
190 log.info('Dropping to shell, no command given and shell is allowed')
192 'Dropping to shell, no command given and shell is allowed')
193 os.execl('/bin/bash', '-l')
191 os.execl('/bin/bash', '-l')
194 exit_code = 1
192 exit_code = 1
195
193
@@ -216,8 +214,7 b' class SshWrapper(object):'
216 exit_code = -1
214 exit_code = -1
217
215
218 else:
216 else:
219 log.error(
217 log.error('Unhandled Command: "%s" Aborting.', self.command)
220 'Unhandled Command: "%s" Aborting.', self.command)
221 exit_code = -1
218 exit_code = -1
222
219
223 return exit_code
220 return exit_code
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -66,9 +66,8 b' class VcsServer(object):'
66
66
67 def _check_permissions(self, action):
67 def _check_permissions(self, action):
68 permission = self.user_permissions.get(self.repo_name)
68 permission = self.user_permissions.get(self.repo_name)
69 log.debug(
69 log.debug('permission for %s on %s are: %s',
70 'permission for %s on %s are: %s',
70 self.user, self.repo_name, permission)
71 self.user, self.repo_name, permission)
72
71
73 if not permission:
72 if not permission:
74 log.error('user `%s` permissions to repo:%s are empty. Forbidding access.',
73 log.error('user `%s` permissions to repo:%s are empty. Forbidding access.',
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -68,8 +68,7 b' class GitServer(VcsServer):'
68 self.store = store
68 self.store = store
69 self.ini_path = ini_path
69 self.ini_path = ini_path
70 self.repo_name = repo_name
70 self.repo_name = repo_name
71 self._path = self.git_path = config.get(
71 self._path = self.git_path = config.get('app:main', 'ssh.executable.git')
72 'app:main', 'ssh.executable.git')
73
72
74 self.repo_mode = repo_mode
73 self.repo_mode = repo_mode
75 self.tunnel = GitTunnelWrapper(server=self)
74 self.tunnel = GitTunnelWrapper(server=self)
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -67,9 +67,12 b' class SubversionTunnelWrapper(object):'
67
67
68 def command(self):
68 def command(self):
69 root = self.server.get_root_store()
69 root = self.server.get_root_store()
70 username = self.server.user.username
71
70 command = [
72 command = [
71 self.server.svn_path, '-t',
73 self.server.svn_path, '-t',
72 '--config-file', self.svn_conf_path,
74 '--config-file', self.svn_conf_path,
75 '--tunnel-user', username,
73 '-r', root]
76 '-r', root]
74 log.debug("Final CMD: %s", ' '.join(command))
77 log.debug("Final CMD: %s", ' '.join(command))
75 return command
78 return command
@@ -95,9 +98,8 b' class SubversionTunnelWrapper(object):'
95 signal.alarm(self.timeout)
98 signal.alarm(self.timeout)
96 first_response = self._read_first_client_response()
99 first_response = self._read_first_client_response()
97 signal.alarm(0)
100 signal.alarm(0)
98 return (
101 return (self._parse_first_client_response(first_response)
99 self._parse_first_client_response(first_response)
102 if first_response else None)
100 if first_response else None)
101
103
102 def patch_first_client_response(self, response, **kwargs):
104 def patch_first_client_response(self, response, **kwargs):
103 self.create_hooks_env()
105 self.create_hooks_env()
@@ -112,9 +114,8 b' class SubversionTunnelWrapper(object):'
112 self.process.stdin.write(buffer_)
114 self.process.stdin.write(buffer_)
113
115
114 def fail(self, message):
116 def fail(self, message):
115 print(
117 print("( failure ( ( 210005 {message} 0: 0 ) ) )".format(
116 "( failure ( ( 210005 {message} 0: 0 ) ) )".format(
118 message=self._svn_string(message)))
117 message=self._svn_string(message)))
118 self.remove_configs()
119 self.remove_configs()
119 self.process.kill()
120 self.process.kill()
120 return 1
121 return 1
@@ -139,6 +140,7 b' class SubversionTunnelWrapper(object):'
139 brackets_stack.pop()
140 brackets_stack.pop()
140 elif next_byte == " " and not brackets_stack:
141 elif next_byte == " " and not brackets_stack:
141 break
142 break
143
142 return buffer_
144 return buffer_
143
145
144 def _parse_first_client_response(self, buffer_):
146 def _parse_first_client_response(self, buffer_):
@@ -149,8 +151,7 b' class SubversionTunnelWrapper(object):'
149 ( version:number ( cap:word ... ) url:string ? ra-client:string
151 ( version:number ( cap:word ... ) url:string ? ra-client:string
150 ( ? client:string ) )
152 ( ? client:string ) )
151
153
152 Please check https://svn.apache.org/repos/asf/subversion/trunk/
154 Please check https://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_ra_svn/protocol
153 subversion/libsvn_ra_svn/protocol
154 """
155 """
155 version_re = r'(?P<version>\d+)'
156 version_re = r'(?P<version>\d+)'
156 capabilities_re = r'\(\s(?P<capabilities>[\w\d\-\ ]+)\s\)'
157 capabilities_re = r'\(\s(?P<capabilities>[\w\d\-\ ]+)\s\)'
@@ -163,8 +164,35 b' class SubversionTunnelWrapper(object):'
163 version=version_re, capabilities=capabilities_re,
164 version=version_re, capabilities=capabilities_re,
164 url=url_re, ra_client=ra_client_re, client=client_re))
165 url=url_re, ra_client=ra_client_re, client=client_re))
165 matcher = regex.match(buffer_)
166 matcher = regex.match(buffer_)
167
166 return matcher.groupdict() if matcher else None
168 return matcher.groupdict() if matcher else None
167
169
170 def _match_repo_name(self, url):
171 """
172 Given an server url, try to match it against ALL known repository names.
173 This handles a tricky SVN case for SSH and subdir commits.
174 E.g if our repo name is my-svn-repo, a svn commit on file in a subdir would
175 result in the url with this subdir added.
176 """
177 # case 1 direct match, we don't do any "heavy" lookups
178 if url in self.server.user_permissions:
179 return url
180
181 log.debug('Extracting repository name from subdir path %s', url)
182 # case 2 we check all permissions, and match closes possible case...
183 # NOTE(dan): In this case we only know that url has a subdir parts, it's safe
184 # to assume that it will have the repo name as prefix, we ensure the prefix
185 # for similar repositories isn't matched by adding a /
186 # e.g subgroup/repo-name/ and subgroup/repo-name-1/ would work correct.
187 for repo_name in self.server.user_permissions:
188 repo_name_prefix = repo_name + '/'
189 if url.startswith(repo_name_prefix):
190 log.debug('Found prefix %s match, returning proper repository name',
191 repo_name_prefix)
192 return repo_name
193
194 return
195
168 def run(self, extras):
196 def run(self, extras):
169 action = 'pull'
197 action = 'pull'
170 self.create_svn_config()
198 self.create_svn_config()
@@ -175,7 +203,8 b' class SubversionTunnelWrapper(object):'
175 return self.fail("Repository name cannot be extracted")
203 return self.fail("Repository name cannot be extracted")
176
204
177 url_parts = urlparse.urlparse(first_response['url'])
205 url_parts = urlparse.urlparse(first_response['url'])
178 self.server.repo_name = url_parts.path.strip('/')
206
207 self.server.repo_name = self._match_repo_name(url_parts.path.strip('/'))
179
208
180 exit_code = self.server._check_permissions(action)
209 exit_code = self.server._check_permissions(action)
181 if exit_code:
210 if exit_code:
@@ -200,10 +229,10 b' class SubversionServer(VcsServer):'
200 .__init__(user, user_permissions, config, env)
229 .__init__(user, user_permissions, config, env)
201 self.store = store
230 self.store = store
202 self.ini_path = ini_path
231 self.ini_path = ini_path
203 # this is set in .run() from input stream
232 # NOTE(dan): repo_name at this point is empty,
233 # this is set later in .run() based from parsed input stream
204 self.repo_name = repo_name
234 self.repo_name = repo_name
205 self._path = self.svn_path = config.get(
235 self._path = self.svn_path = config.get('app:main', 'ssh.executable.svn')
206 'app:main', 'ssh.executable.svn')
207
236
208 self.tunnel = SubversionTunnelWrapper(server=self)
237 self.tunnel = SubversionTunnelWrapper(server=self)
209
238
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -70,8 +70,10 b' class TestSubversionServer(object):'
70 def test_command(self, svn_server):
70 def test_command(self, svn_server):
71 server = svn_server.create()
71 server = svn_server.create()
72 expected_command = [
72 expected_command = [
73 svn_server.svn_path, '-t', '--config-file',
73 svn_server.svn_path, '-t',
74 server.tunnel.svn_conf_path, '-r', svn_server.root
74 '--config-file', server.tunnel.svn_conf_path,
75 '--tunnel-user', svn_server.user.username,
76 '-r', svn_server.root
75 ]
77 ]
76
78
77 assert expected_command == server.tunnel.command()
79 assert expected_command == server.tunnel.command()
@@ -89,6 +91,86 b' class TestSubversionServer(object):'
89 result = server._check_permissions(action)
91 result = server._check_permissions(action)
90 assert result is code
92 assert result is code
91
93
94 @pytest.mark.parametrize('permissions, access_paths, expected_match', [
95 # not matched repository name
96 ({
97 'test-svn': ''
98 }, ['test-svn-1', 'test-svn-1/subpath'],
99 None),
100
101 # exact match
102 ({
103 'test-svn': ''
104 },
105 ['test-svn'],
106 'test-svn'),
107
108 # subdir commits
109 ({
110 'test-svn': ''
111 },
112 ['test-svn/foo',
113 'test-svn/foo/test-svn',
114 'test-svn/trunk/development.txt',
115 ],
116 'test-svn'),
117
118 # subgroups + similar patterns
119 ({
120 'test-svn': '',
121 'test-svn-1': '',
122 'test-svn-subgroup/test-svn': '',
123
124 },
125 ['test-svn-1',
126 'test-svn-1/foo/test-svn',
127 'test-svn-1/test-svn',
128 ],
129 'test-svn-1'),
130
131 # subgroups + similar patterns
132 ({
133 'test-svn-1': '',
134 'test-svn-10': '',
135 'test-svn-100': '',
136 },
137 ['test-svn-10',
138 'test-svn-10/foo/test-svn',
139 'test-svn-10/test-svn',
140 ],
141 'test-svn-10'),
142
143 # subgroups + similar patterns
144 ({
145 'name': '',
146 'nameContains': '',
147 'nameContainsThis': '',
148 },
149 ['nameContains',
150 'nameContains/This',
151 'nameContains/This/test-svn',
152 ],
153 'nameContains'),
154
155 # subgroups + similar patterns
156 ({
157 'test-svn': '',
158 'test-svn-1': '',
159 'test-svn-subgroup/test-svn': '',
160
161 },
162 ['test-svn-subgroup/test-svn',
163 'test-svn-subgroup/test-svn/foo/test-svn',
164 'test-svn-subgroup/test-svn/trunk/example.txt',
165 ],
166 'test-svn-subgroup/test-svn'),
167 ])
168 def test_repo_extraction_on_subdir(self, svn_server, permissions, access_paths, expected_match):
169 server = svn_server.create(user_permissions=permissions)
170 for path in access_paths:
171 repo_name = server.tunnel._match_repo_name(path)
172 assert repo_name == expected_match
173
92 def test_run_returns_executes_command(self, svn_server):
174 def test_run_returns_executes_command(self, svn_server):
93 server = svn_server.create()
175 server = svn_server.create()
94 from rhodecode.apps.ssh_support.lib.backends.svn import SubversionTunnelWrapper
176 from rhodecode.apps.ssh_support.lib.backends.svn import SubversionTunnelWrapper
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -37,7 +37,7 b' log = logging.getLogger(__name__)'
37
37
38 def write_mod_dav_svn_config(settings):
38 def write_mod_dav_svn_config(settings):
39 use_ssl = str2bool(settings['force_https'])
39 use_ssl = str2bool(settings['force_https'])
40
40 file_path = settings[config_keys.config_file_path]
41 config = _render_mod_dav_svn_config(
41 config = _render_mod_dav_svn_config(
42 use_ssl=use_ssl,
42 use_ssl=use_ssl,
43 parent_path_root=get_rhodecode_base_path(),
43 parent_path_root=get_rhodecode_base_path(),
@@ -45,7 +45,8 b' def write_mod_dav_svn_config(settings):'
45 location_root=settings[config_keys.location_root],
45 location_root=settings[config_keys.location_root],
46 repo_groups=RepoGroup.get_all_repo_groups(),
46 repo_groups=RepoGroup.get_all_repo_groups(),
47 realm=get_rhodecode_realm(), template=settings[config_keys.template])
47 realm=get_rhodecode_realm(), template=settings[config_keys.template])
48 _write_mod_dav_svn_config(config, settings[config_keys.config_file_path])
48 _write_mod_dav_svn_config(config, file_path)
49 return file_path
49
50
50
51
51 def generate_mod_dav_svn_config(registry):
52 def generate_mod_dav_svn_config(registry):
@@ -56,11 +57,11 b' def generate_mod_dav_svn_config(registry'
56 repositories organized in sub folders.
57 repositories organized in sub folders.
57 """
58 """
58 settings = registry.settings
59 settings = registry.settings
59 write_mod_dav_svn_config(settings)
60 file_path = write_mod_dav_svn_config(settings)
60
61
61 # Trigger an event on mod dav svn configuration change.
62 # Trigger an event on mod dav svn configuration change.
62 trigger(ModDavSvnConfigChange(), registry)
63 trigger(ModDavSvnConfigChange(), registry)
63
64 return file_path
64
65
65 def _render_mod_dav_svn_config(
66 def _render_mod_dav_svn_config(
66 parent_path_root, list_parent_path, location_root, repo_groups, realm,
67 parent_path_root, list_parent_path, location_root, repo_groups, realm,
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -153,25 +153,25 b' class CrowdServer(object):'
153 global msg
153 global msg
154 msg = ""
154 msg = ""
155 try:
155 try:
156 rdoc = self.opener.open(request)
156 ret_doc = self.opener.open(request)
157 msg = "".join(rdoc.readlines())
157 msg = ret_doc.read()
158 if not msg and empty_response_ok:
158 if not msg and empty_response_ok:
159 rval = {}
159 ret_val = {}
160 rval["status"] = True
160 ret_val["status"] = True
161 rval["error"] = "Response body was empty"
161 ret_val["error"] = "Response body was empty"
162 elif not noformat:
162 elif not noformat:
163 rval = json.loads(msg)
163 ret_val = json.loads(msg)
164 rval["status"] = True
164 ret_val["status"] = True
165 else:
165 else:
166 rval = "".join(rdoc.readlines())
166 ret_val = msg
167 except Exception as e:
167 except Exception as e:
168 if not noformat:
168 if not noformat:
169 rval = {"status": False,
169 ret_val = {"status": False,
170 "body": body,
170 "body": body,
171 "error": str(e) + "\n" + msg}
171 "error": "{}\n{}".format(e, msg)}
172 else:
172 else:
173 rval = None
173 ret_val = None
174 return rval
174 return ret_val
175
175
176 def user_auth(self, username, password):
176 def user_auth(self, username, password):
177 """Authenticate a user against crowd. Returns brief information about
177 """Authenticate a user against crowd. Returns brief information about
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -69,6 +69,12 b' class LdapAuthnResource(AuthnPluginResou'
69 class AuthLdap(AuthLdapBase):
69 class AuthLdap(AuthLdapBase):
70 default_tls_cert_dir = '/etc/openldap/cacerts'
70 default_tls_cert_dir = '/etc/openldap/cacerts'
71
71
72 scope_labels = {
73 ldap.SCOPE_BASE: 'SCOPE_BASE',
74 ldap.SCOPE_ONELEVEL: 'SCOPE_ONELEVEL',
75 ldap.SCOPE_SUBTREE: 'SCOPE_SUBTREE',
76 }
77
72 def __init__(self, server, base_dn, port=389, bind_dn='', bind_pass='',
78 def __init__(self, server, base_dn, port=389, bind_dn='', bind_pass='',
73 tls_kind='PLAIN', tls_reqcert='DEMAND', tls_cert_file=None,
79 tls_kind='PLAIN', tls_reqcert='DEMAND', tls_cert_file=None,
74 tls_cert_dir=None, ldap_version=3,
80 tls_cert_dir=None, ldap_version=3,
@@ -85,7 +91,7 b' class AuthLdap(AuthLdapBase):'
85 self.TLS_KIND = tls_kind
91 self.TLS_KIND = tls_kind
86
92
87 if self.TLS_KIND == 'LDAPS':
93 if self.TLS_KIND == 'LDAPS':
88 port = port or 689
94 port = port or 636
89 self.ldap_server_type += 's'
95 self.ldap_server_type += 's'
90
96
91 OPT_X_TLS_DEMAND = 2
97 OPT_X_TLS_DEMAND = 2
@@ -148,19 +154,27 b' class AuthLdap(AuthLdapBase):'
148 log.debug('simple_bind successful')
154 log.debug('simple_bind successful')
149 return ldap_conn
155 return ldap_conn
150
156
151 def fetch_attrs_from_simple_bind(self, server, dn, username, password):
157 def fetch_attrs_from_simple_bind(self, ldap_conn, dn, username, password):
158 scope = ldap.SCOPE_BASE
159 scope_label = self.scope_labels.get(scope)
160 ldap_filter = '(objectClass=*)'
161
152 try:
162 try:
153 log.debug('Trying simple bind with %r', dn)
163 log.debug('Trying authenticated search bind with dn: %r SCOPE: %s (and filter: %s)',
154 server.simple_bind_s(dn, safe_str(password))
164 dn, scope_label, ldap_filter)
155 _dn, attrs = server.search_ext_s(
165 ldap_conn.simple_bind_s(dn, safe_str(password))
156 dn, ldap.SCOPE_BASE, '(objectClass=*)', )[0]
166 response = ldap_conn.search_ext_s(dn, scope, ldap_filter, attrlist=['*', '+'])
157
167
158 return attrs
168 if not response:
169 log.error('search bind returned empty results: %r', response)
170 return {}
171 else:
172 _dn, attrs = response[0]
173 return attrs
159
174
160 except ldap.INVALID_CREDENTIALS:
175 except ldap.INVALID_CREDENTIALS:
161 log.debug(
176 log.debug("LDAP rejected password for user '%s': %s, org_exc:",
162 "LDAP rejected password for user '%s': %s, org_exc:",
177 username, dn, exc_info=True)
163 username, dn, exc_info=True)
164
178
165 def authenticate_ldap(self, username, password):
179 def authenticate_ldap(self, username, password):
166 """
180 """
@@ -179,35 +193,38 b' class AuthLdap(AuthLdapBase):'
179
193
180 self.validate_password(username, password)
194 self.validate_password(username, password)
181 self.validate_username(username)
195 self.validate_username(username)
196 scope_label = self.scope_labels.get(self.SEARCH_SCOPE)
182
197
183 ldap_conn = None
198 ldap_conn = None
184 try:
199 try:
185 ldap_conn = self._get_ldap_conn()
200 ldap_conn = self._get_ldap_conn()
186 filter_ = '(&%s(%s=%s))' % (
201 filter_ = '(&%s(%s=%s))' % (
187 self.LDAP_FILTER, self.attr_login, username)
202 self.LDAP_FILTER, self.attr_login, username)
188 log.debug("Authenticating %r filter %s", self.BASE_DN, filter_)
203 log.debug("Authenticating %r filter %s and scope: %s",
204 self.BASE_DN, filter_, scope_label)
189
205
190 lobjects = ldap_conn.search_ext_s(
206 ldap_objects = ldap_conn.search_ext_s(
191 self.BASE_DN, self.SEARCH_SCOPE, filter_)
207 self.BASE_DN, self.SEARCH_SCOPE, filter_, attrlist=['*', '+'])
192
208
193 if not lobjects:
209 if not ldap_objects:
194 log.debug("No matching LDAP objects for authentication "
210 log.debug("No matching LDAP objects for authentication "
195 "of UID:'%s' username:(%s)", uid, username)
211 "of UID:'%s' username:(%s)", uid, username)
196 raise ldap.NO_SUCH_OBJECT()
212 raise ldap.NO_SUCH_OBJECT()
197
213
198 log.debug('Found matching ldap object, trying to authenticate')
214 log.debug('Found %s matching ldap object[s], trying to authenticate on each one now...', len(ldap_objects))
199 for (dn, _attrs) in lobjects:
215 for (dn, _attrs) in ldap_objects:
200 if dn is None:
216 if dn is None:
201 continue
217 continue
202
218
203 user_attrs = self.fetch_attrs_from_simple_bind(
219 user_attrs = self.fetch_attrs_from_simple_bind(
204 ldap_conn, dn, username, password)
220 ldap_conn, dn, username, password)
221
205 if user_attrs:
222 if user_attrs:
223 log.debug('Got authenticated user attributes from DN:%s', dn)
206 break
224 break
207 else:
225 else:
208 raise LdapPasswordError(
226 raise LdapPasswordError(
209 'Failed to authenticate user `{}` '
227 'Failed to authenticate user `{}` with given password'.format(username))
210 'with given password'.format(username))
211
228
212 except ldap.NO_SUCH_OBJECT:
229 except ldap.NO_SUCH_OBJECT:
213 log.debug("LDAP says no such user '%s' (%s), org_exc:",
230 log.debug("LDAP says no such user '%s' (%s), org_exc:",
@@ -216,8 +233,7 b' class AuthLdap(AuthLdapBase):'
216 except ldap.SERVER_DOWN:
233 except ldap.SERVER_DOWN:
217 org_exc = traceback.format_exc()
234 org_exc = traceback.format_exc()
218 raise LdapConnectionError(
235 raise LdapConnectionError(
219 "LDAP can't access authentication "
236 "LDAP can't access authentication server, org_exc:%s" % org_exc)
220 "server, org_exc:%s" % org_exc)
221 finally:
237 finally:
222 if ldap_conn:
238 if ldap_conn:
223 log.debug('ldap: connection release')
239 log.debug('ldap: connection release')
@@ -249,7 +265,7 b' class LdapSettingsSchema(AuthnPluginSett'
249 colander.Int(),
265 colander.Int(),
250 default=389,
266 default=389,
251 description=_('Custom port that the LDAP server is listening on. '
267 description=_('Custom port that the LDAP server is listening on. '
252 'Default value is: 389, use 689 for LDAPS (SSL)'),
268 'Default value is: 389, use 636 for LDAPS (SSL)'),
253 preparer=strip_whitespace,
269 preparer=strip_whitespace,
254 title=_('Port'),
270 title=_('Port'),
255 validator=colander.Range(min=0, max=65536),
271 validator=colander.Range(min=0, max=65536),
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2013-2019 RhodeCode GmbH
3 # Copyright (C) 2013-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -60,10 +60,15 b' def load_pyramid_environment(global_conf'
60
60
61 load_rcextensions(root_path=settings_merged['here'])
61 load_rcextensions(root_path=settings_merged['here'])
62
62
63 # Limit backends to `vcs.backends` from configuration
63 # Limit backends to `vcs.backends` from configuration, and preserve the order
64 for alias in rhodecode.BACKENDS.keys():
64 for alias in rhodecode.BACKENDS.keys():
65 if alias not in settings['vcs.backends']:
65 if alias not in settings['vcs.backends']:
66 del rhodecode.BACKENDS[alias]
66 del rhodecode.BACKENDS[alias]
67
68 _sorted_backend = sorted(rhodecode.BACKENDS.items(),
69 key=lambda item: settings['vcs.backends'].index(item[0]))
70 rhodecode.BACKENDS = rhodecode.OrderedDict(_sorted_backend)
71
67 log.info('Enabled VCS backends: %s', rhodecode.BACKENDS.keys())
72 log.info('Enabled VCS backends: %s', rhodecode.BACKENDS.keys())
68
73
69 # initialize vcs client and optionally run the server if enabled
74 # initialize vcs client and optionally run the server if enabled
@@ -76,6 +81,7 b' def load_pyramid_environment(global_conf'
76
81
77 rhodecode.PYRAMID_SETTINGS = settings_merged
82 rhodecode.PYRAMID_SETTINGS = settings_merged
78 rhodecode.CONFIG = settings_merged
83 rhodecode.CONFIG = settings_merged
84 rhodecode.CONFIG['default_user_id'] = utils.get_default_user_id()
79
85
80 if vcs_server_enabled:
86 if vcs_server_enabled:
81 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(settings))
87 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(settings))
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -611,6 +611,14 b' def _sanitize_cache_settings(settings):'
611 settings,
611 settings,
612 'exception_tracker.store_path',
612 'exception_tracker.store_path',
613 temp_store, lower=False, default_when_empty=True)
613 temp_store, lower=False, default_when_empty=True)
614 _bool_setting(
615 settings,
616 'exception_tracker.send_email',
617 'false')
618 _string_setting(
619 settings,
620 'exception_tracker.email_prefix',
621 '[RHODECODE ERROR]', lower=False, default_when_empty=True)
614
622
615 # cache_perms
623 # cache_perms
616 _string_setting(
624 _string_setting(
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -25,6 +25,7 b' from .hooks import ('
25 _create_repo_group_hook,
25 _create_repo_group_hook,
26 _pre_create_user_hook,
26 _pre_create_user_hook,
27 _create_user_hook,
27 _create_user_hook,
28 _comment_commit_repo_hook,
28 _delete_repo_hook,
29 _delete_repo_hook,
29 _delete_user_hook,
30 _delete_user_hook,
30 _pre_push_hook,
31 _pre_push_hook,
@@ -33,6 +34,7 b' from .hooks import ('
33 _pull_hook,
34 _pull_hook,
34 _create_pull_request_hook,
35 _create_pull_request_hook,
35 _review_pull_request_hook,
36 _review_pull_request_hook,
37 _comment_pull_request_hook,
36 _update_pull_request_hook,
38 _update_pull_request_hook,
37 _merge_pull_request_hook,
39 _merge_pull_request_hook,
38 _close_pull_request_hook,
40 _close_pull_request_hook,
@@ -40,6 +42,7 b' from .hooks import ('
40
42
41 # set as module attributes, we use those to call hooks. *do not change this*
43 # set as module attributes, we use those to call hooks. *do not change this*
42 CREATE_REPO_HOOK = _create_repo_hook
44 CREATE_REPO_HOOK = _create_repo_hook
45 COMMENT_COMMIT_REPO_HOOK = _comment_commit_repo_hook
43 CREATE_REPO_GROUP_HOOK = _create_repo_group_hook
46 CREATE_REPO_GROUP_HOOK = _create_repo_group_hook
44 PRE_CREATE_USER_HOOK = _pre_create_user_hook
47 PRE_CREATE_USER_HOOK = _pre_create_user_hook
45 CREATE_USER_HOOK = _create_user_hook
48 CREATE_USER_HOOK = _create_user_hook
@@ -51,6 +54,7 b' PRE_PULL_HOOK = _pre_pull_hook'
51 PULL_HOOK = _pull_hook
54 PULL_HOOK = _pull_hook
52 CREATE_PULL_REQUEST = _create_pull_request_hook
55 CREATE_PULL_REQUEST = _create_pull_request_hook
53 REVIEW_PULL_REQUEST = _review_pull_request_hook
56 REVIEW_PULL_REQUEST = _review_pull_request_hook
57 COMMENT_PULL_REQUEST = _comment_pull_request_hook
54 UPDATE_PULL_REQUEST = _update_pull_request_hook
58 UPDATE_PULL_REQUEST = _update_pull_request_hook
55 MERGE_PULL_REQUEST = _merge_pull_request_hook
59 MERGE_PULL_REQUEST = _merge_pull_request_hook
56 CLOSE_PULL_REQUEST = _close_pull_request_hook
60 CLOSE_PULL_REQUEST = _close_pull_request_hook
@@ -24,14 +24,13 b' def _push_hook(*args, **kwargs):'
24 # returns list of dicts with key-val fetched from extra fields
24 # returns list of dicts with key-val fetched from extra fields
25 repo_extra_fields = extra_fields.run(**kwargs)
25 repo_extra_fields = extra_fields.run(**kwargs)
26
26
27 if repo_extra_fields.get('endpoint_url'):
27 endpoint_url = extra_fields.get_field(repo_extra_fields, key='endpoint_url', default='')
28 field_metadata = repo_extra_fields['endpoint_url']
28
29 endpoint = field_metadata['field_value']
29 if endpoint_url:
30 if endpoint:
30 data = {
31 data = {
31 'project': kwargs['repository'],
32 'project': kwargs['repository'],
32 }
33 }
33 response = http_call.run(url=endpoint_url, params=data)
34 response = http_call.run(url=endpoint, params=data)
34 return HookResponse(0, 'Called endpoint {}, with response {}\n'.format(endpoint_url, response))
35 return HookResponse(0, 'Called endpoint {}, with response {}\n'.format(endpoint, response))
36
35
37 return HookResponse(0, '')
36 return HookResponse(0, '')
@@ -24,14 +24,12 b' def _push_hook(*args, **kwargs):'
24 # returns list of dicts with key-val fetched from extra fields
24 # returns list of dicts with key-val fetched from extra fields
25 repo_extra_fields = extra_fields.run(**kwargs)
25 repo_extra_fields = extra_fields.run(**kwargs)
26
26
27 if repo_extra_fields.get('endpoint_url'):
27 endpoint_url = extra_fields.get_field(repo_extra_fields, key='endpoint_url', default='')
28 field_metadata = repo_extra_fields['endpoint_url']
28 if endpoint_url:
29 endpoint = field_metadata['field_value']
29 data = {
30 if endpoint:
30 'some_key': 'val'
31 data = {
31 }
32 'some_key': 'val'
32 response = http_call.run(url=endpoint_url, json_data=data)
33 }
33 return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint_url, response))
34 response = http_call.run(url=endpoint, json_data=data)
35 return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response))
36
34
37 return HookResponse(0, '')
35 return HookResponse(0, '')
@@ -41,11 +41,13 b' def _pre_push_hook(*args, **kwargs):'
41 repo_extra_fields = extra_fields.run(**kwargs)
41 repo_extra_fields = extra_fields.run(**kwargs)
42
42
43 # optionally use 'extra fields' to control the logic per repo
43 # optionally use 'extra fields' to control the logic per repo
44 validate_author = repo_extra_fields.get('validate_author', {}).get('field_value')
44 validate_author = extra_fields.get_field(
45 repo_extra_fields, key='validate_author', default=False)
45 should_validate = str2bool(validate_author)
46 should_validate = str2bool(validate_author)
46
47
47 # optionally store validation regex into extra fields
48 # optionally store validation regex into extra fields
48 validation_regex = repo_extra_fields.get('validation_regex', {}).get('field_value')
49 validation_regex = extra_fields.get_field(
50 repo_extra_fields, key='validation_regex', default='')
49
51
50 def validate_commit_message(commit_message, message_regex=None):
52 def validate_commit_message(commit_message, message_regex=None):
51 """
53 """
@@ -44,13 +44,16 b' def _pre_push_hook(*args, **kwargs):'
44
44
45 # optionally use 'extra fields' to control the logic per repo
45 # optionally use 'extra fields' to control the logic per repo
46 # e.g store a list of patterns to be forbidden e.g `*.exe, *.dump`
46 # e.g store a list of patterns to be forbidden e.g `*.exe, *.dump`
47 forbid_files = repo_extra_fields.get('forbid_files_glob', {}).get('field_value')
47 forbid_files = extra_fields.get_field(repo_extra_fields, key='forbid_files_glob',
48 convert_type=False, default=[])
48 forbid_files = aslist(forbid_files)
49 forbid_files = aslist(forbid_files)
49
50
50 # forbid_files = ['*'] # example pattern
51 # forbid_files = ['*'] # example pattern
51
52
52 # optionally get bytes limit for a single file, e.g 1024 for 1KB
53 # optionally get bytes limit for a single file, e.g 1024 for 1KB
53 forbid_size_over = repo_extra_fields.get('forbid_size_over', {}).get('field_value')
54 forbid_size_over = extra_fields.get_field(repo_extra_fields, key='forbid_size_over',
55 convert_type=False, default=0)
56
54 forbid_size_over = int(forbid_size_over or 0)
57 forbid_size_over = int(forbid_size_over or 0)
55
58
56 # forbid_size_over = 1024 # example 1024
59 # forbid_size_over = 1024 # example 1024
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 #
3 #
4 # This program is free software: you can redistribute it and/or modify
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
5 # it under the terms of the GNU Affero General Public License, version 3
@@ -53,3 +53,36 b' def run(*args, **kwargs):'
53 fields[field.field_key] = field.get_dict()
53 fields[field.field_key] = field.get_dict()
54
54
55 return fields
55 return fields
56
57
58 class _Undefined(object):
59 pass
60
61
62 def get_field(extra_fields_data, key, default=_Undefined(), convert_type=True):
63 """
64 field_value = get_field(extra_fields, key='ci_endpoint_url', default='')
65 """
66 from ..utils import str2bool, aslist
67
68 if key not in extra_fields_data:
69 if isinstance(default, _Undefined):
70 raise ValueError('key {} not present in extra_fields'.format(key))
71 return default
72
73 # NOTE(dan): from metadata we get field_label, field_value, field_desc, field_type
74 field_metadata = extra_fields_data[key]
75
76 field_value = field_metadata['field_value']
77
78 # NOTE(dan): empty value, use default
79 if not field_value and not isinstance(default, _Undefined):
80 return default
81
82 if convert_type:
83 # 'str', 'unicode', 'list', 'tuple'
84 _type = field_metadata['field_type']
85 if _type in ['list', 'tuple']:
86 field_value = aslist(field_value)
87
88 return field_value
@@ -1,5 +1,5 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 #
3 #
4 # This program is free software: you can redistribute it and/or modify
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 #
3 #
4 # This program is free software: you can redistribute it and/or modify
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 #
3 #
4 # This program is free software: you can redistribute it and/or modify
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 #
3 #
4 # This program is free software: you can redistribute it and/or modify
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -15,11 +15,12 b''
15 # This program is dual-licensed. If you wish to learn more about the
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
18 import logging
19 import logging
19 from .utils import DotDict, HookResponse, has_kwargs
20 from .utils import DotDict, HookResponse, has_kwargs
21
20 log = logging.getLogger('rhodecode.' + __name__)
22 log = logging.getLogger('rhodecode.' + __name__)
21
23
22
23 # Config shortcut to keep, all configuration in one place
24 # Config shortcut to keep, all configuration in one place
24 # Example: api_key = CONFIG.my_config.api_key
25 # Example: api_key = CONFIG.my_config.api_key
25 CONFIG = DotDict(
26 CONFIG = DotDict(
@@ -55,13 +56,40 b' def _create_repo_hook(*args, **kwargs):'
55
56
56
57
57 @has_kwargs({
58 @has_kwargs({
58 'group_name': '',
59 'repo_name': '',
59 'group_parent_id': '',
60 'repo_type': '',
61 'description': '',
62 'private': '',
63 'created_on': '',
64 'enable_downloads': '',
65 'repo_id': '',
66 'user_id': '',
67 'enable_statistics': '',
68 'clone_uri': '',
69 'fork_id': '',
70 'group_id': '',
71 'created_by': '',
72 'repository': '',
73 'comment': '',
74 'commit': ''
75 })
76 def _comment_commit_repo_hook(*args, **kwargs):
77 """
78 POST CREATE REPOSITORY COMMENT ON COMMIT HOOK. This function will be executed after
79 a comment is made on this repository commit.
80
81 """
82 return HookResponse(0, '')
83
84
85 @has_kwargs({
86 'group_name': '',
87 'group_parent_id': '',
60 'group_description': '',
88 'group_description': '',
61 'group_id': '',
89 'group_id': '',
62 'user_id': '',
90 'user_id': '',
63 'created_by': '',
91 'created_by': '',
64 'created_on': '',
92 'created_on': '',
65 'enable_locking': ''
93 'enable_locking': ''
66 })
94 })
67 def _create_repo_group_hook(*args, **kwargs):
95 def _create_repo_group_hook(*args, **kwargs):
@@ -73,13 +101,13 b' def _create_repo_group_hook(*args, **kwa'
73
101
74
102
75 @has_kwargs({
103 @has_kwargs({
76 'username': '',
104 'username': '',
77 'password': '',
105 'password': '',
78 'email': '',
106 'email': '',
79 'firstname': '',
107 'firstname': '',
80 'lastname': '',
108 'lastname': '',
81 'active': '',
109 'active': '',
82 'admin': '',
110 'admin': '',
83 'created_by': '',
111 'created_by': '',
84 })
112 })
85 def _pre_create_user_hook(*args, **kwargs):
113 def _pre_create_user_hook(*args, **kwargs):
@@ -173,7 +201,7 b' def _delete_repo_hook(*args, **kwargs):'
173 'emails': '',
201 'emails': '',
174 'inherit_default_permissions': '',
202 'inherit_default_permissions': '',
175 'deleted_by': '',
203 'deleted_by': '',
176 })
204 })
177 def _delete_user_hook(*args, **kwargs):
205 def _delete_user_hook(*args, **kwargs):
178 """
206 """
179 POST DELETE USER HOOK, this function will be executed after each
207 POST DELETE USER HOOK, this function will be executed after each
@@ -348,6 +376,38 b' def _review_pull_request_hook(*args, **k'
348 'scm': 'type of version control "git", "hg", "svn"',
376 'scm': 'type of version control "git", "hg", "svn"',
349 'username': 'username of actor who triggered this event',
377 'username': 'username of actor who triggered this event',
350 'ip': 'ip address of actor who triggered this hook',
378 'ip': 'ip address of actor who triggered this hook',
379
380 'action': '',
381 'repository': 'repository name',
382 'pull_request_id': '',
383 'url': '',
384 'title': '',
385 'description': '',
386 'status': '',
387 'comment': '',
388 'created_on': '',
389 'updated_on': '',
390 'commit_ids': '',
391 'review_status': '',
392 'mergeable': '',
393 'source': '',
394 'target': '',
395 'author': '',
396 'reviewers': '',
397 })
398 def _comment_pull_request_hook(*args, **kwargs):
399 """
400 This hook will be executed after comment is made on a pull request
401 """
402 return HookResponse(0, '')
403
404
405 @has_kwargs({
406 'server_url': 'url of instance that triggered this hook',
407 'config': 'path to .ini config used',
408 'scm': 'type of version control "git", "hg", "svn"',
409 'username': 'username of actor who triggered this event',
410 'ip': 'ip address of actor who triggered this hook',
351 'action': '',
411 'action': '',
352 'repository': 'repository name',
412 'repository': 'repository name',
353 'pull_request_id': '',
413 'pull_request_id': '',
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -18,8 +18,10 b''
18
18
19 import logging
19 import logging
20 import os
20 import os
21 import string
21 import functools
22 import functools
22 import collections
23 import collections
24 import urllib
23
25
24 log = logging.getLogger('rhodecode.' + __name__)
26 log = logging.getLogger('rhodecode.' + __name__)
25
27
@@ -186,4 +188,12 b' def aslist(obj, sep=None, strip=True):'
186 elif obj is None:
188 elif obj is None:
187 return []
189 return []
188 else:
190 else:
189 return [obj] No newline at end of file
191 return [obj]
192
193
194 class UrlTemplate(string.Template):
195
196 def safe_substitute(self, **kws):
197 # url encode the kw for usage in url
198 kws = {k: urllib.quote(str(v)) for k, v in kws.items()}
199 return super(UrlTemplate, self).safe_substitute(**kws)
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,7 +19,6 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import os
21 import os
22 import shlex
23 import platform
22 import platform
24
23
25 from rhodecode.model import init_model
24 from rhodecode.model import init_model
@@ -91,3 +90,12 b' def set_instance_id(config):'
91 prefix = instance_id.lstrip('*')
90 prefix = instance_id.lstrip('*')
92 _platform_id = platform.uname()[1] or 'instance'
91 _platform_id = platform.uname()[1] or 'instance'
93 config['instance_id'] = '%s%s-%s' % (prefix, _platform_id, os.getpid())
92 config['instance_id'] = '%s%s-%s' % (prefix, _platform_id, os.getpid())
93
94
95 def get_default_user_id():
96 from rhodecode.model.db import User, Session
97 user_id = Session()\
98 .query(User.user_id)\
99 .filter(User.username == User.DEFAULT_USER)\
100 .scalar()
101 return user_id
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -53,7 +53,7 b' from rhodecode.events.user import ( # p'
53 )
53 )
54
54
55 from rhodecode.events.repo import ( # pragma: no cover
55 from rhodecode.events.repo import ( # pragma: no cover
56 RepoEvent,
56 RepoEvent, RepoCommitCommentEvent,
57 RepoPreCreateEvent, RepoCreateEvent,
57 RepoPreCreateEvent, RepoCreateEvent,
58 RepoPreDeleteEvent, RepoDeleteEvent,
58 RepoPreDeleteEvent, RepoDeleteEvent,
59 RepoPrePushEvent, RepoPushEvent,
59 RepoPrePushEvent, RepoPushEvent,
@@ -75,4 +75,5 b' from rhodecode.events.pullrequest import'
75 PullRequestReviewEvent,
75 PullRequestReviewEvent,
76 PullRequestMergeEvent,
76 PullRequestMergeEvent,
77 PullRequestCloseEvent,
77 PullRequestCloseEvent,
78 PullRequestCommentEvent,
78 )
79 )
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -44,6 +44,9 b' class RhodecodeEvent(object):'
44 self._request = request
44 self._request = request
45 self.utc_timestamp = datetime.datetime.utcnow()
45 self.utc_timestamp = datetime.datetime.utcnow()
46
46
47 def __repr__(self):
48 return '<%s:(%s)>' % (self.__class__.__name__, self.name)
49
47 def get_request(self):
50 def get_request(self):
48 if self._request:
51 if self._request:
49 return self._request
52 return self._request
@@ -116,3 +119,4 b' class RhodeCodeIntegrationEvent(Rhodecod'
116 """
119 """
117 Special subclass for Integration events
120 Special subclass for Integration events
118 """
121 """
122 description = ''
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -77,6 +77,7 b' class PullRequestCreateEvent(PullRequest'
77 """
77 """
78 name = 'pullrequest-create'
78 name = 'pullrequest-create'
79 display_name = lazy_ugettext('pullrequest created')
79 display_name = lazy_ugettext('pullrequest created')
80 description = lazy_ugettext('Event triggered after pull request was created')
80
81
81
82
82 class PullRequestCloseEvent(PullRequestEvent):
83 class PullRequestCloseEvent(PullRequestEvent):
@@ -86,6 +87,7 b' class PullRequestCloseEvent(PullRequestE'
86 """
87 """
87 name = 'pullrequest-close'
88 name = 'pullrequest-close'
88 display_name = lazy_ugettext('pullrequest closed')
89 display_name = lazy_ugettext('pullrequest closed')
90 description = lazy_ugettext('Event triggered after pull request was closed')
89
91
90
92
91 class PullRequestUpdateEvent(PullRequestEvent):
93 class PullRequestUpdateEvent(PullRequestEvent):
@@ -95,6 +97,7 b' class PullRequestUpdateEvent(PullRequest'
95 """
97 """
96 name = 'pullrequest-update'
98 name = 'pullrequest-update'
97 display_name = lazy_ugettext('pullrequest commits updated')
99 display_name = lazy_ugettext('pullrequest commits updated')
100 description = lazy_ugettext('Event triggered after pull requests was updated')
98
101
99
102
100 class PullRequestReviewEvent(PullRequestEvent):
103 class PullRequestReviewEvent(PullRequestEvent):
@@ -104,6 +107,8 b' class PullRequestReviewEvent(PullRequest'
104 """
107 """
105 name = 'pullrequest-review'
108 name = 'pullrequest-review'
106 display_name = lazy_ugettext('pullrequest review changed')
109 display_name = lazy_ugettext('pullrequest review changed')
110 description = lazy_ugettext('Event triggered after a review status of a '
111 'pull requests has changed to other.')
107
112
108 def __init__(self, pullrequest, status):
113 def __init__(self, pullrequest, status):
109 super(PullRequestReviewEvent, self).__init__(pullrequest)
114 super(PullRequestReviewEvent, self).__init__(pullrequest)
@@ -117,6 +122,8 b' class PullRequestMergeEvent(PullRequestE'
117 """
122 """
118 name = 'pullrequest-merge'
123 name = 'pullrequest-merge'
119 display_name = lazy_ugettext('pullrequest merged')
124 display_name = lazy_ugettext('pullrequest merged')
125 description = lazy_ugettext('Event triggered after a successful merge operation '
126 'was executed on a pull request')
120
127
121
128
122 class PullRequestCommentEvent(PullRequestEvent):
129 class PullRequestCommentEvent(PullRequestEvent):
@@ -126,6 +133,8 b' class PullRequestCommentEvent(PullReques'
126 """
133 """
127 name = 'pullrequest-comment'
134 name = 'pullrequest-comment'
128 display_name = lazy_ugettext('pullrequest commented')
135 display_name = lazy_ugettext('pullrequest commented')
136 description = lazy_ugettext('Event triggered after a comment was made on a code '
137 'in the pull request')
129
138
130 def __init__(self, pullrequest, comment):
139 def __init__(self, pullrequest, comment):
131 super(PullRequestCommentEvent, self).__init__(pullrequest)
140 super(PullRequestCommentEvent, self).__init__(pullrequest)
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -181,6 +181,40 b' class RepoEvent(RhodeCodeIntegrationEven'
181 return data
181 return data
182
182
183
183
184 class RepoCommitCommentEvent(RepoEvent):
185 """
186 An instance of this class is emitted as an :term:`event` after a comment is made
187 on repository commit.
188 """
189
190 name = 'repo-commit-comment'
191 display_name = lazy_ugettext('repository commit comment')
192 description = lazy_ugettext('Event triggered after a comment was made '
193 'on commit inside a repository')
194
195 def __init__(self, repo, commit, comment):
196 super(RepoCommitCommentEvent, self).__init__(repo)
197 self.commit = commit
198 self.comment = comment
199
200 def as_dict(self):
201 data = super(RepoCommitCommentEvent, self).as_dict()
202 data['commit'] = {
203 'commit_id': self.commit.raw_id,
204 'commit_message': self.commit.message,
205 'commit_branch': self.commit.branch,
206 }
207
208 data['comment'] = {
209 'comment_id': self.comment.comment_id,
210 'comment_text': self.comment.text,
211 'comment_type': self.comment.comment_type,
212 'comment_f_path': self.comment.f_path,
213 'comment_line_no': self.comment.line_no,
214 }
215 return data
216
217
184 class RepoPreCreateEvent(RepoEvent):
218 class RepoPreCreateEvent(RepoEvent):
185 """
219 """
186 An instance of this class is emitted as an :term:`event` before a repo is
220 An instance of this class is emitted as an :term:`event` before a repo is
@@ -188,6 +222,7 b' class RepoPreCreateEvent(RepoEvent):'
188 """
222 """
189 name = 'repo-pre-create'
223 name = 'repo-pre-create'
190 display_name = lazy_ugettext('repository pre create')
224 display_name = lazy_ugettext('repository pre create')
225 description = lazy_ugettext('Event triggered before repository is created')
191
226
192
227
193 class RepoCreateEvent(RepoEvent):
228 class RepoCreateEvent(RepoEvent):
@@ -197,6 +232,7 b' class RepoCreateEvent(RepoEvent):'
197 """
232 """
198 name = 'repo-create'
233 name = 'repo-create'
199 display_name = lazy_ugettext('repository created')
234 display_name = lazy_ugettext('repository created')
235 description = lazy_ugettext('Event triggered after repository was created')
200
236
201
237
202 class RepoPreDeleteEvent(RepoEvent):
238 class RepoPreDeleteEvent(RepoEvent):
@@ -206,6 +242,7 b' class RepoPreDeleteEvent(RepoEvent):'
206 """
242 """
207 name = 'repo-pre-delete'
243 name = 'repo-pre-delete'
208 display_name = lazy_ugettext('repository pre delete')
244 display_name = lazy_ugettext('repository pre delete')
245 description = lazy_ugettext('Event triggered before a repository is deleted')
209
246
210
247
211 class RepoDeleteEvent(RepoEvent):
248 class RepoDeleteEvent(RepoEvent):
@@ -215,6 +252,7 b' class RepoDeleteEvent(RepoEvent):'
215 """
252 """
216 name = 'repo-delete'
253 name = 'repo-delete'
217 display_name = lazy_ugettext('repository deleted')
254 display_name = lazy_ugettext('repository deleted')
255 description = lazy_ugettext('Event triggered after repository was deleted')
218
256
219
257
220 class RepoVCSEvent(RepoEvent):
258 class RepoVCSEvent(RepoEvent):
@@ -255,6 +293,7 b' class RepoPrePullEvent(RepoVCSEvent):'
255 """
293 """
256 name = 'repo-pre-pull'
294 name = 'repo-pre-pull'
257 display_name = lazy_ugettext('repository pre pull')
295 display_name = lazy_ugettext('repository pre pull')
296 description = lazy_ugettext('Event triggered before repository code is pulled')
258
297
259
298
260 class RepoPullEvent(RepoVCSEvent):
299 class RepoPullEvent(RepoVCSEvent):
@@ -264,6 +303,7 b' class RepoPullEvent(RepoVCSEvent):'
264 """
303 """
265 name = 'repo-pull'
304 name = 'repo-pull'
266 display_name = lazy_ugettext('repository pull')
305 display_name = lazy_ugettext('repository pull')
306 description = lazy_ugettext('Event triggered after repository code was pulled')
267
307
268
308
269 class RepoPrePushEvent(RepoVCSEvent):
309 class RepoPrePushEvent(RepoVCSEvent):
@@ -273,6 +313,8 b' class RepoPrePushEvent(RepoVCSEvent):'
273 """
313 """
274 name = 'repo-pre-push'
314 name = 'repo-pre-push'
275 display_name = lazy_ugettext('repository pre push')
315 display_name = lazy_ugettext('repository pre push')
316 description = lazy_ugettext('Event triggered before the code is '
317 'pushed to a repository')
276
318
277
319
278 class RepoPushEvent(RepoVCSEvent):
320 class RepoPushEvent(RepoVCSEvent):
@@ -284,6 +326,8 b' class RepoPushEvent(RepoVCSEvent):'
284 """
326 """
285 name = 'repo-push'
327 name = 'repo-push'
286 display_name = lazy_ugettext('repository push')
328 display_name = lazy_ugettext('repository push')
329 description = lazy_ugettext('Event triggered after the code was '
330 'pushed to a repository')
287
331
288 def __init__(self, repo_name, pushed_commit_ids, extras):
332 def __init__(self, repo_name, pushed_commit_ids, extras):
289 super(RepoPushEvent, self).__init__(repo_name, extras)
333 super(RepoPushEvent, self).__init__(repo_name, extras)
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -60,6 +60,7 b' class RepoGroupCreateEvent(RepoGroupEven'
60 """
60 """
61 name = 'repo-group-create'
61 name = 'repo-group-create'
62 display_name = lazy_ugettext('repository group created')
62 display_name = lazy_ugettext('repository group created')
63 description = lazy_ugettext('Event triggered after a repository group was created')
63
64
64
65
65 class RepoGroupDeleteEvent(RepoGroupEvent):
66 class RepoGroupDeleteEvent(RepoGroupEvent):
@@ -69,6 +70,7 b' class RepoGroupDeleteEvent(RepoGroupEven'
69 """
70 """
70 name = 'repo-group-delete'
71 name = 'repo-group-delete'
71 display_name = lazy_ugettext('repository group deleted')
72 display_name = lazy_ugettext('repository group deleted')
73 description = lazy_ugettext('Event triggered after a repository group was deleted')
72
74
73
75
74 class RepoGroupUpdateEvent(RepoGroupEvent):
76 class RepoGroupUpdateEvent(RepoGroupEvent):
@@ -78,3 +80,4 b' class RepoGroupUpdateEvent(RepoGroupEven'
78 """
80 """
79 name = 'repo-group-update'
81 name = 'repo-group-update'
80 display_name = lazy_ugettext('repository group update')
82 display_name = lazy_ugettext('repository group update')
83 description = lazy_ugettext('Event triggered after a repository group was updated')
@@ -1,4 +1,4 b''
1 # Copyright (C) 2016-2019 RhodeCode GmbH
1 # Copyright (C) 2016-2020 RhodeCode GmbH
2 #
2 #
3 # This program is free software: you can redistribute it and/or modify
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2012-2019 RhodeCode GmbH
2 # Copyright (C) 2012-2020 RhodeCode GmbH
3 #
3 #
4 # This program is free software: you can redistribute it and/or modify
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -125,6 +125,19 b' class IntegrationTypeBase(object):'
125 """
125 """
126 return colander.Schema()
126 return colander.Schema()
127
127
128 def event_enabled(self, event):
129 """
130 Checks if submitted event is enabled based on the plugin settings
131 :param event:
132 :return: bool
133 """
134 allowed_events = self.settings['events']
135 if event.name not in allowed_events:
136 log.debug('event ignored: %r event %s not in allowed set of events %s',
137 event, event.name, allowed_events)
138 return False
139 return True
140
128
141
129 class EEIntegration(IntegrationTypeBase):
142 class EEIntegration(IntegrationTypeBase):
130 description = 'Integration available in RhodeCode EE edition.'
143 description = 'Integration available in RhodeCode EE edition.'
@@ -139,30 +152,57 b' class EEIntegration(IntegrationTypeBase)'
139 # Helpers #
152 # Helpers #
140 # updating this required to update the `common_vars` as well.
153 # updating this required to update the `common_vars` as well.
141 WEBHOOK_URL_VARS = [
154 WEBHOOK_URL_VARS = [
142 ('event_name', 'Unique name of the event type, e.g pullrequest-update'),
155 # GENERAL
143 ('repo_name', 'Full name of the repository'),
156 ('General', [
144 ('repo_type', 'VCS type of repository'),
157 ('event_name', 'Unique name of the event type, e.g pullrequest-update'),
145 ('repo_id', 'Unique id of repository'),
158 ('repo_name', 'Full name of the repository'),
146 ('repo_url', 'Repository url'),
159 ('repo_type', 'VCS type of repository'),
160 ('repo_id', 'Unique id of repository'),
161 ('repo_url', 'Repository url'),
162 ]
163 ),
147 # extra repo fields
164 # extra repo fields
148 ('extra:<extra_key_name>', 'Extra repo variables, read from its settings.'),
165 ('Repository', [
149
166 ('extra:<extra_key_name>', 'Extra repo variables, read from its settings.'),
167 ]
168 ),
150 # special attrs below that we handle, using multi-call
169 # special attrs below that we handle, using multi-call
151 ('branch', 'Name of each branch submitted, if any.'),
170 ('Commit push - Multicalls', [
152 ('branch_head', 'Head ID of pushed branch (full sha of last commit), if any.'),
171 ('branch', 'Name of each branch submitted, if any.'),
153 ('commit_id', 'ID (full sha) of each commit submitted, if any.'),
172 ('branch_head', 'Head ID of pushed branch (full sha of last commit), if any.'),
154
173 ('commit_id', 'ID (full sha) of each commit submitted, if any.'),
174 ]
175 ),
155 # pr events vars
176 # pr events vars
156 ('pull_request_id', 'Unique ID of the pull request.'),
177 ('Pull request', [
157 ('pull_request_title', 'Title of the pull request.'),
178 ('pull_request_id', 'Unique ID of the pull request.'),
158 ('pull_request_url', 'Pull request url.'),
179 ('pull_request_title', 'Title of the pull request.'),
159 ('pull_request_shadow_url', 'Pull request shadow repo clone url.'),
180 ('pull_request_url', 'Pull request url.'),
160 ('pull_request_commits_uid', 'Calculated UID of all commits inside the PR. '
181 ('pull_request_shadow_url', 'Pull request shadow repo clone url.'),
161 'Changes after PR update'),
182 ('pull_request_commits_uid', 'Calculated UID of all commits inside the PR. '
183 'Changes after PR update'),
184 ]
185 ),
186 # commit comment event vars
187 ('Commit comment', [
188 ('commit_comment_id', 'Unique ID of the comment made on a commit.'),
189 ('commit_comment_text', 'Text of commit comment.'),
190 ('commit_comment_type', 'Type of comment, e.g note/todo.'),
162
191
192 ('commit_comment_f_path', 'Optionally path of file for inline comments.'),
193 ('commit_comment_line_no', 'Line number of the file: eg o10, or n200'),
194
195 ('commit_comment_commit_id', 'Commit id that comment was left at.'),
196 ('commit_comment_commit_branch', 'Commit branch that comment was left at'),
197 ('commit_comment_commit_message', 'Commit message that comment was left at'),
198 ]
199 ),
163 # user who triggers the call
200 # user who triggers the call
164 ('username', 'User who triggered the call.'),
201 ('Caller', [
165 ('user_id', 'User id who triggered the call.'),
202 ('username', 'User who triggered the call.'),
203 ('user_id', 'User id who triggered the call.'),
204 ]
205 ),
166 ]
206 ]
167
207
168 # common vars for url template used for CI plugins. Shared with webhook
208 # common vars for url template used for CI plugins. Shared with webhook
@@ -271,6 +311,26 b' class WebhookDataHandler(CommitParsingDa'
271
311
272 return url_calls
312 return url_calls
273
313
314 def repo_commit_comment_handler(self, event, data):
315 url = self.get_base_parsed_template(data)
316 log.debug('register %s call(%s) to url %s', self.name, event, url)
317 comment_vars = [
318 ('commit_comment_id', data['comment']['comment_id']),
319 ('commit_comment_text', data['comment']['comment_text']),
320 ('commit_comment_type', data['comment']['comment_type']),
321
322 ('commit_comment_f_path', data['comment']['comment_f_path']),
323 ('commit_comment_line_no', data['comment']['comment_line_no']),
324
325 ('commit_comment_commit_id', data['commit']['commit_id']),
326 ('commit_comment_commit_branch', data['commit']['commit_branch']),
327 ('commit_comment_commit_message', data['commit']['commit_message']),
328 ]
329 for k, v in comment_vars:
330 url = UrlTmpl(url).safe_substitute(**{k: v})
331
332 return [(url, self.headers, data)]
333
274 def repo_create_event_handler(self, event, data):
334 def repo_create_event_handler(self, event, data):
275 url = self.get_base_parsed_template(data)
335 url = self.get_base_parsed_template(data)
276 log.debug('register %s call(%s) to url %s', self.name, event, url)
336 log.debug('register %s call(%s) to url %s', self.name, event, url)
@@ -298,12 +358,13 b' class WebhookDataHandler(CommitParsingDa'
298 return self.repo_push_event_handler(event, data)
358 return self.repo_push_event_handler(event, data)
299 elif isinstance(event, events.RepoCreateEvent):
359 elif isinstance(event, events.RepoCreateEvent):
300 return self.repo_create_event_handler(event, data)
360 return self.repo_create_event_handler(event, data)
361 elif isinstance(event, events.RepoCommitCommentEvent):
362 return self.repo_commit_comment_handler(event, data)
301 elif isinstance(event, events.PullRequestEvent):
363 elif isinstance(event, events.PullRequestEvent):
302 return self.pull_request_event_handler(event, data)
364 return self.pull_request_event_handler(event, data)
303 else:
365 else:
304 raise ValueError(
366 raise ValueError(
305 'event type `%s` not in supported list: %s' % (
367 'event type `{}` has no handler defined'.format(event.__class__))
306 event.__class__, events))
307
368
308
369
309 def get_auth(settings):
370 def get_auth(settings):
@@ -320,9 +381,13 b' def get_web_token(settings):'
320
381
321
382
322 def get_url_vars(url_vars):
383 def get_url_vars(url_vars):
323 return '\n'.join(
384 items = []
324 '{} - {}'.format('${' + key + '}', explanation)
385
325 for key, explanation in url_vars)
386 for section, section_items in url_vars:
387 items.append('\n*{}*'.format(section))
388 for key, explanation in section_items:
389 items.append(' {} - {}'.format('${' + key + '}', explanation))
390 return '\n'.join(items)
326
391
327
392
328 def render_with_traceback(template, *args, **kwargs):
393 def render_with_traceback(template, *args, **kwargs):
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,13 +19,14 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 from __future__ import unicode_literals
21 from __future__ import unicode_literals
22 import deform
23 import logging
22 import logging
23
24 import colander
24 import colander
25
25 import deform.widget
26 from mako.template import Template
26 from mako.template import Template
27
27
28 from rhodecode import events
28 from rhodecode import events
29 from rhodecode.model.validation_schema.widgets import CheckboxChoiceWidgetDesc
29 from rhodecode.translation import _
30 from rhodecode.translation import _
30 from rhodecode.lib.celerylib import run_task
31 from rhodecode.lib.celerylib import run_task
31 from rhodecode.lib.celerylib import tasks
32 from rhodecode.lib.celerylib import tasks
@@ -174,6 +175,10 b' class EmailIntegrationType(IntegrationTy'
174 display_name = _('Email')
175 display_name = _('Email')
175 description = _('Send repo push summaries to a list of recipients via email')
176 description = _('Send repo push summaries to a list of recipients via email')
176
177
178 valid_events = [
179 events.RepoPushEvent
180 ]
181
177 @classmethod
182 @classmethod
178 def icon(cls):
183 def icon(cls):
179 return '''
184 return '''
@@ -240,59 +245,86 b' class EmailIntegrationType(IntegrationTy'
240
245
241 def settings_schema(self):
246 def settings_schema(self):
242 schema = EmailSettingsSchema()
247 schema = EmailSettingsSchema()
248 schema.add(colander.SchemaNode(
249 colander.Set(),
250 widget=CheckboxChoiceWidgetDesc(
251 values=sorted(
252 [(e.name, e.display_name, e.description) for e in self.valid_events]
253 ),
254 ),
255 description="List of events activated for this integration",
256 name='events'
257 ))
243 return schema
258 return schema
244
259
245 def send_event(self, event):
260 def send_event(self, event):
246 data = event.as_dict()
261 log.debug('handling event %s with integration %s', event.name, self)
247 log.debug('got event: %r', event)
262
263 if event.__class__ not in self.valid_events:
264 log.debug('event %r not present in valid event list (%s)', event, self.valid_events)
265 return
266
267 if not self.event_enabled(event):
268 # NOTE(marcink): for legacy reasons we're skipping this check...
269 # since the email event haven't had any settings...
270 pass
248
271
272 handler = EmailEventHandler(self.settings)
273 handler(event, event_data=event.as_dict())
274
275
276 class EmailEventHandler(object):
277 def __init__(self, integration_settings):
278 self.integration_settings = integration_settings
279
280 def __call__(self, event, event_data):
249 if isinstance(event, events.RepoPushEvent):
281 if isinstance(event, events.RepoPushEvent):
250 repo_push_handler(data, self.settings)
282 self.repo_push_handler(event, event_data)
251 else:
283 else:
252 log.debug('ignoring event: %r', event)
284 log.debug('ignoring event: %r', event)
253
285
254
286 def repo_push_handler(self, event, data):
255 def repo_push_handler(data, settings):
287 commit_num = len(data['push']['commits'])
256 commit_num = len(data['push']['commits'])
288 server_url = data['server_url']
257 server_url = data['server_url']
258
289
259 if commit_num == 1:
290 if commit_num == 1:
260 if data['push']['branches']:
291 if data['push']['branches']:
261 _subject = '[{repo_name}] {author} pushed {commit_num} commit on branches: {branches}'
292 _subject = '[{repo_name}] {author} pushed {commit_num} commit on branches: {branches}'
262 else:
293 else:
263 _subject = '[{repo_name}] {author} pushed {commit_num} commit'
294 _subject = '[{repo_name}] {author} pushed {commit_num} commit'
264 subject = _subject.format(
295 subject = _subject.format(
265 author=data['actor']['username'],
296 author=data['actor']['username'],
266 repo_name=data['repo']['repo_name'],
297 repo_name=data['repo']['repo_name'],
267 commit_num=commit_num,
298 commit_num=commit_num,
268 branches=', '.join(
299 branches=', '.join(
269 branch['name'] for branch in data['push']['branches'])
300 branch['name'] for branch in data['push']['branches'])
270 )
301 )
271 else:
272 if data['push']['branches']:
273 _subject = '[{repo_name}] {author} pushed {commit_num} commits on branches: {branches}'
274 else:
302 else:
275 _subject = '[{repo_name}] {author} pushed {commit_num} commits'
303 if data['push']['branches']:
276 subject = _subject.format(
304 _subject = '[{repo_name}] {author} pushed {commit_num} commits on branches: {branches}'
277 author=data['actor']['username'],
305 else:
278 repo_name=data['repo']['repo_name'],
306 _subject = '[{repo_name}] {author} pushed {commit_num} commits'
279 commit_num=commit_num,
307 subject = _subject.format(
280 branches=', '.join(
308 author=data['actor']['username'],
281 branch['name'] for branch in data['push']['branches']))
309 repo_name=data['repo']['repo_name'],
310 commit_num=commit_num,
311 branches=', '.join(
312 branch['name'] for branch in data['push']['branches']))
282
313
283 email_body_plaintext = render_with_traceback(
314 email_body_plaintext = render_with_traceback(
284 REPO_PUSH_TEMPLATE_PLAINTEXT,
315 REPO_PUSH_TEMPLATE_PLAINTEXT,
285 data=data,
316 data=data,
286 subject=subject,
317 subject=subject,
287 instance_url=server_url)
318 instance_url=server_url)
288
319
289 email_body_html = render_with_traceback(
320 email_body_html = render_with_traceback(
290 REPO_PUSH_TEMPLATE_HTML,
321 REPO_PUSH_TEMPLATE_HTML,
291 data=data,
322 data=data,
292 subject=subject,
323 subject=subject,
293 instance_url=server_url)
324 instance_url=server_url)
294
325
295 for email_address in settings['recipients']:
326 recipients = self.integration_settings['recipients']
296 run_task(
327 for email_address in recipients:
297 tasks.send_email, email_address, subject,
328 run_task(
298 email_body_plaintext, email_body_html)
329 tasks.send_email, email_address, subject,
330 email_body_plaintext, email_body_html)
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -26,6 +26,7 b' import colander'
26 import textwrap
26 import textwrap
27 from mako.template import Template
27 from mako.template import Template
28 from rhodecode import events
28 from rhodecode import events
29 from rhodecode.model.validation_schema.widgets import CheckboxChoiceWidgetDesc
29 from rhodecode.translation import _
30 from rhodecode.translation import _
30 from rhodecode.lib import helpers as h
31 from rhodecode.lib import helpers as h
31 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
32 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
@@ -119,13 +120,10 b' class HipchatIntegrationType(Integration'
119
120
120 def send_event(self, event):
121 def send_event(self, event):
121 if event.__class__ not in self.valid_events:
122 if event.__class__ not in self.valid_events:
122 log.debug('event not valid: %r', event)
123 log.debug('event %r not present in valid event list (%s)', event, self.valid_events)
123 return
124 return
124
125
125 allowed_events = self.settings['events']
126 if not self.event_enabled(event):
126 if event.name not in allowed_events:
127 log.debug('event ignored: %r event %s not in allowed events %s',
128 event, event.name, allowed_events)
129 return
127 return
130
128
131 data = event.as_dict()
129 data = event.as_dict()
@@ -133,8 +131,6 b' class HipchatIntegrationType(Integration'
133 text = '<b>%s<b> caused a <b>%s</b> event' % (
131 text = '<b>%s<b> caused a <b>%s</b> event' % (
134 data['actor']['username'], event.name)
132 data['actor']['username'], event.name)
135
133
136 log.debug('handling hipchat event for %s', event.name)
137
138 if isinstance(event, events.PullRequestCommentEvent):
134 if isinstance(event, events.PullRequestCommentEvent):
139 text = self.format_pull_request_comment_event(event, data)
135 text = self.format_pull_request_comment_event(event, data)
140 elif isinstance(event, events.PullRequestReviewEvent):
136 elif isinstance(event, events.PullRequestReviewEvent):
@@ -154,12 +150,12 b' class HipchatIntegrationType(Integration'
154 schema = HipchatSettingsSchema()
150 schema = HipchatSettingsSchema()
155 schema.add(colander.SchemaNode(
151 schema.add(colander.SchemaNode(
156 colander.Set(),
152 colander.Set(),
157 widget=deform.widget.CheckboxChoiceWidget(
153 widget=CheckboxChoiceWidgetDesc(
158 values=sorted(
154 values=sorted(
159 [(e.name, e.display_name) for e in self.valid_events]
155 [(e.name, e.display_name, e.description) for e in self.valid_events]
160 )
156 ),
161 ),
157 ),
162 description="Events activated for this integration",
158 description="List of events activated for this integration",
163 name='events'
159 name='events'
164 ))
160 ))
165
161
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -30,6 +30,7 b' import colander'
30 from mako.template import Template
30 from mako.template import Template
31
31
32 from rhodecode import events
32 from rhodecode import events
33 from rhodecode.model.validation_schema.widgets import CheckboxChoiceWidgetDesc
33 from rhodecode.translation import _
34 from rhodecode.translation import _
34 from rhodecode.lib import helpers as h
35 from rhodecode.lib import helpers as h
35 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
36 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
@@ -134,14 +135,13 b' class SlackIntegrationType(IntegrationTy'
134 ]
135 ]
135
136
136 def send_event(self, event):
137 def send_event(self, event):
138 log.debug('handling event %s with integration %s', event.name, self)
139
137 if event.__class__ not in self.valid_events:
140 if event.__class__ not in self.valid_events:
138 log.debug('event not valid: %r', event)
141 log.debug('event %r not present in valid event list (%s)', event, self.valid_events)
139 return
142 return
140
143
141 allowed_events = self.settings['events']
144 if not self.event_enabled(event):
142 if event.name not in allowed_events:
143 log.debug('event ignored: %r event %s not in allowed events %s',
144 event, event.name, allowed_events)
145 return
145 return
146
146
147 data = event.as_dict()
147 data = event.as_dict()
@@ -154,8 +154,6 b' class SlackIntegrationType(IntegrationTy'
154 fields = None
154 fields = None
155 overrides = None
155 overrides = None
156
156
157 log.debug('handling slack event for %s', event.name)
158
159 if isinstance(event, events.PullRequestCommentEvent):
157 if isinstance(event, events.PullRequestCommentEvent):
160 (title, text, fields, overrides) \
158 (title, text, fields, overrides) \
161 = self.format_pull_request_comment_event(event, data)
159 = self.format_pull_request_comment_event(event, data)
@@ -176,12 +174,12 b' class SlackIntegrationType(IntegrationTy'
176 schema = SlackSettingsSchema()
174 schema = SlackSettingsSchema()
177 schema.add(colander.SchemaNode(
175 schema.add(colander.SchemaNode(
178 colander.Set(),
176 colander.Set(),
179 widget=deform.widget.CheckboxChoiceWidget(
177 widget=CheckboxChoiceWidgetDesc(
180 values=sorted(
178 values=sorted(
181 [(e.name, e.display_name) for e in self.valid_events]
179 [(e.name, e.display_name, e.description) for e in self.valid_events]
182 )
180 ),
183 ),
181 ),
184 description="Events activated for this integration",
182 description="List of events activated for this integration",
185 name='events'
183 name='events'
186 ))
184 ))
187
185
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -20,13 +20,14 b''
20
20
21 from __future__ import unicode_literals
21 from __future__ import unicode_literals
22
22
23 import deform
24 import deform.widget
23 import deform.widget
25 import logging
24 import logging
26 import colander
25 import colander
27
26
28 import rhodecode
27 import rhodecode
29 from rhodecode import events
28 from rhodecode import events
29 from rhodecode.lib.colander_utils import strip_whitespace
30 from rhodecode.model.validation_schema.widgets import CheckboxChoiceWidgetDesc
30 from rhodecode.translation import _
31 from rhodecode.translation import _
31 from rhodecode.integrations.types.base import (
32 from rhodecode.integrations.types.base import (
32 IntegrationTypeBase, get_auth, get_web_token, get_url_vars,
33 IntegrationTypeBase, get_auth, get_web_token, get_url_vars,
@@ -53,11 +54,12 b' class WebhookSettingsSchema(colander.Sch'
53 'objects in data in such cases.'),
54 'objects in data in such cases.'),
54 missing=colander.required,
55 missing=colander.required,
55 required=True,
56 required=True,
57 preparer=strip_whitespace,
56 validator=colander.url,
58 validator=colander.url,
57 widget=widgets.CodeMirrorWidget(
59 widget=widgets.CodeMirrorWidget(
58 help_block_collapsable_name='Show url variables',
60 help_block_collapsable_name='Show url variables',
59 help_block_collapsable=(
61 help_block_collapsable=(
60 'E.g http://my-serv/trigger_job/${{event_name}}'
62 'E.g http://my-serv.com/trigger_job/${{event_name}}'
61 '?PR_ID=${{pull_request_id}}'
63 '?PR_ID=${{pull_request_id}}'
62 '\nFull list of vars:\n{}'.format(URL_VARS)),
64 '\nFull list of vars:\n{}'.format(URL_VARS)),
63 codemirror_mode='text',
65 codemirror_mode='text',
@@ -146,34 +148,31 b' class WebhookIntegrationType(Integration'
146 events.PullRequestCreateEvent,
148 events.PullRequestCreateEvent,
147 events.RepoPushEvent,
149 events.RepoPushEvent,
148 events.RepoCreateEvent,
150 events.RepoCreateEvent,
151 events.RepoCommitCommentEvent,
149 ]
152 ]
150
153
151 def settings_schema(self):
154 def settings_schema(self):
152 schema = WebhookSettingsSchema()
155 schema = WebhookSettingsSchema()
153 schema.add(colander.SchemaNode(
156 schema.add(colander.SchemaNode(
154 colander.Set(),
157 colander.Set(),
155 widget=deform.widget.CheckboxChoiceWidget(
158 widget=CheckboxChoiceWidgetDesc(
156 values=sorted(
159 values=sorted(
157 [(e.name, e.display_name) for e in self.valid_events]
160 [(e.name, e.display_name, e.description) for e in self.valid_events]
158 )
161 ),
159 ),
162 ),
160 description="Events activated for this integration",
163 description="List of events activated for this integration",
161 name='events'
164 name='events'
162 ))
165 ))
163 return schema
166 return schema
164
167
165 def send_event(self, event):
168 def send_event(self, event):
166 log.debug(
169 log.debug('handling event %s with integration %s', event.name, self)
167 'handling event %s with Webhook integration %s', event.name, self)
168
170
169 if event.__class__ not in self.valid_events:
171 if event.__class__ not in self.valid_events:
170 log.debug('event not valid: %r', event)
172 log.debug('event %r not present in valid event list (%s)', event, self.valid_events)
171 return
173 return
172
174
173 allowed_events = self.settings['events']
175 if not self.event_enabled(event):
174 if event.name not in allowed_events:
175 log.debug('event ignored: %r event %s not in allowed events %s',
176 event, event.name, allowed_events)
177 return
176 return
178
177
179 data = event.as_dict()
178 data = event.as_dict()
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -23,6 +23,8 b' authentication and permission libraries'
23 """
23 """
24
24
25 import os
25 import os
26
27 import colander
26 import time
28 import time
27 import collections
29 import collections
28 import fnmatch
30 import fnmatch
@@ -45,15 +47,14 b' from rhodecode.model import meta'
45 from rhodecode.model.meta import Session
47 from rhodecode.model.meta import Session
46 from rhodecode.model.user import UserModel
48 from rhodecode.model.user import UserModel
47 from rhodecode.model.db import (
49 from rhodecode.model.db import (
48 User, Repository, Permission, UserToPerm, UserGroupToPerm, UserGroupMember,
50 false, User, Repository, Permission, UserToPerm, UserGroupToPerm, UserGroupMember,
49 UserIpMap, UserApiKeys, RepoGroup, UserGroup)
51 UserIpMap, UserApiKeys, RepoGroup, UserGroup, UserNotice)
50 from rhodecode.lib import rc_cache
52 from rhodecode.lib import rc_cache
51 from rhodecode.lib.utils2 import safe_unicode, aslist, safe_str, md5, safe_int, sha1
53 from rhodecode.lib.utils2 import safe_unicode, aslist, safe_str, md5, safe_int, sha1
52 from rhodecode.lib.utils import (
54 from rhodecode.lib.utils import (
53 get_repo_slug, get_repo_group_slug, get_user_group_slug)
55 get_repo_slug, get_repo_group_slug, get_user_group_slug)
54 from rhodecode.lib.caching_query import FromCache
56 from rhodecode.lib.caching_query import FromCache
55
57
56
57 if rhodecode.is_unix:
58 if rhodecode.is_unix:
58 import bcrypt
59 import bcrypt
59
60
@@ -1312,7 +1313,10 b' class AuthUser(object):'
1312 if not perms:
1313 if not perms:
1313 perms = AuthUser.repo_read_perms
1314 perms = AuthUser.repo_read_perms
1314
1315
1315 def _cached_repo_acl(user_id, perm_def, _name_filter):
1316 if not isinstance(perms, list):
1317 raise ValueError('perms parameter must be a list got {} instead'.format(perms))
1318
1319 def _cached_repo_acl(perm_def, _name_filter):
1316 qry = Repository.query()
1320 qry = Repository.query()
1317 if _name_filter:
1321 if _name_filter:
1318 ilike_expression = u'%{}%'.format(safe_unicode(_name_filter))
1322 ilike_expression = u'%{}%'.format(safe_unicode(_name_filter))
@@ -1322,7 +1326,21 b' class AuthUser(object):'
1322 return [x.repo_id for x in
1326 return [x.repo_id for x in
1323 RepoList(qry, perm_set=perm_def, extra_kwargs={'user': self})]
1327 RepoList(qry, perm_set=perm_def, extra_kwargs={'user': self})]
1324
1328
1325 return _cached_repo_acl(self.user_id, perms, name_filter)
1329 log.debug('Computing REPO ACL IDS user %s', self)
1330
1331 cache_namespace_uid = 'cache_user_repo_acl_ids.{}'.format(self.user_id)
1332 region = rc_cache.get_or_create_region('cache_perms', cache_namespace_uid)
1333
1334 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, condition=cache)
1335 def compute_repo_acl_ids(cache_ver, user_id, perm_def, _name_filter):
1336 return _cached_repo_acl(perm_def, _name_filter)
1337
1338 start = time.time()
1339 result = compute_repo_acl_ids('v1', self.user_id, perms, name_filter)
1340 total = time.time() - start
1341 log.debug('REPO ACL IDS for user %s computed in %.4fs', self, total)
1342
1343 return result
1326
1344
1327 def repo_group_acl_ids_from_stack(self, perms=None, prefix_filter=None, cache=False):
1345 def repo_group_acl_ids_from_stack(self, perms=None, prefix_filter=None, cache=False):
1328 if not perms:
1346 if not perms:
@@ -1346,7 +1364,10 b' class AuthUser(object):'
1346 if not perms:
1364 if not perms:
1347 perms = AuthUser.repo_group_read_perms
1365 perms = AuthUser.repo_group_read_perms
1348
1366
1349 def _cached_repo_group_acl(user_id, perm_def, _name_filter):
1367 if not isinstance(perms, list):
1368 raise ValueError('perms parameter must be a list got {} instead'.format(perms))
1369
1370 def _cached_repo_group_acl(perm_def, _name_filter):
1350 qry = RepoGroup.query()
1371 qry = RepoGroup.query()
1351 if _name_filter:
1372 if _name_filter:
1352 ilike_expression = u'%{}%'.format(safe_unicode(_name_filter))
1373 ilike_expression = u'%{}%'.format(safe_unicode(_name_filter))
@@ -1356,7 +1377,21 b' class AuthUser(object):'
1356 return [x.group_id for x in
1377 return [x.group_id for x in
1357 RepoGroupList(qry, perm_set=perm_def, extra_kwargs={'user': self})]
1378 RepoGroupList(qry, perm_set=perm_def, extra_kwargs={'user': self})]
1358
1379
1359 return _cached_repo_group_acl(self.user_id, perms, name_filter)
1380 log.debug('Computing REPO GROUP ACL IDS user %s', self)
1381
1382 cache_namespace_uid = 'cache_user_repo_group_acl_ids.{}'.format(self.user_id)
1383 region = rc_cache.get_or_create_region('cache_perms', cache_namespace_uid)
1384
1385 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, condition=cache)
1386 def compute_repo_group_acl_ids(cache_ver, user_id, perm_def, _name_filter):
1387 return _cached_repo_group_acl(perm_def, _name_filter)
1388
1389 start = time.time()
1390 result = compute_repo_group_acl_ids('v1', self.user_id, perms, name_filter)
1391 total = time.time() - start
1392 log.debug('REPO GROUP ACL IDS for user %s computed in %.4fs', self, total)
1393
1394 return result
1360
1395
1361 def user_group_acl_ids_from_stack(self, perms=None, cache=False):
1396 def user_group_acl_ids_from_stack(self, perms=None, cache=False):
1362 if not perms:
1397 if not perms:
@@ -1378,17 +1413,34 b' class AuthUser(object):'
1378 if not perms:
1413 if not perms:
1379 perms = AuthUser.user_group_read_perms
1414 perms = AuthUser.user_group_read_perms
1380
1415
1381 def _cached_user_group_acl(user_id, perm_def, name_filter):
1416 if not isinstance(perms, list):
1417 raise ValueError('perms parameter must be a list got {} instead'.format(perms))
1418
1419 def _cached_user_group_acl(perm_def, _name_filter):
1382 qry = UserGroup.query()
1420 qry = UserGroup.query()
1383 if name_filter:
1421 if _name_filter:
1384 ilike_expression = u'%{}%'.format(safe_unicode(name_filter))
1422 ilike_expression = u'%{}%'.format(safe_unicode(_name_filter))
1385 qry = qry.filter(
1423 qry = qry.filter(
1386 UserGroup.users_group_name.ilike(ilike_expression))
1424 UserGroup.users_group_name.ilike(ilike_expression))
1387
1425
1388 return [x.users_group_id for x in
1426 return [x.users_group_id for x in
1389 UserGroupList(qry, perm_set=perm_def, extra_kwargs={'user': self})]
1427 UserGroupList(qry, perm_set=perm_def, extra_kwargs={'user': self})]
1390
1428
1391 return _cached_user_group_acl(self.user_id, perms, name_filter)
1429 log.debug('Computing USER GROUP ACL IDS user %s', self)
1430
1431 cache_namespace_uid = 'cache_user_user_group_acl_ids.{}'.format(self.user_id)
1432 region = rc_cache.get_or_create_region('cache_perms', cache_namespace_uid)
1433
1434 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, condition=cache)
1435 def compute_user_group_acl_ids(cache_ver, user_id, perm_def, _name_filter):
1436 return _cached_user_group_acl(perm_def, _name_filter)
1437
1438 start = time.time()
1439 result = compute_user_group_acl_ids('v1', self.user_id, perms, name_filter)
1440 total = time.time() - start
1441 log.debug('USER GROUP ACL IDS for user %s computed in %.4fs', self, total)
1442
1443 return result
1392
1444
1393 @property
1445 @property
1394 def ip_allowed(self):
1446 def ip_allowed(self):
@@ -1402,6 +1454,7 b' class AuthUser(object):'
1402 inherit = self.inherit_default_permissions
1454 inherit = self.inherit_default_permissions
1403 return AuthUser.check_ip_allowed(self.user_id, self.ip_addr,
1455 return AuthUser.check_ip_allowed(self.user_id, self.ip_addr,
1404 inherit_from_default=inherit)
1456 inherit_from_default=inherit)
1457
1405 @property
1458 @property
1406 def personal_repo_group(self):
1459 def personal_repo_group(self):
1407 return RepoGroup.get_user_personal_repo_group(self.user_id)
1460 return RepoGroup.get_user_personal_repo_group(self.user_id)
@@ -1455,9 +1508,40 b' class AuthUser(object):'
1455
1508
1456 return rule, default_perm
1509 return rule, default_perm
1457
1510
1511 def get_notice_messages(self):
1512
1513 notice_level = 'notice-error'
1514 notice_messages = []
1515 if self.is_default:
1516 return [], notice_level
1517
1518 notices = UserNotice.query()\
1519 .filter(UserNotice.user_id == self.user_id)\
1520 .filter(UserNotice.notice_read == false())\
1521 .all()
1522
1523 try:
1524 for entry in notices:
1525
1526 msg = {
1527 'msg_id': entry.user_notice_id,
1528 'level': entry.notification_level,
1529 'subject': entry.notice_subject,
1530 'body': entry.notice_body,
1531 }
1532 notice_messages.append(msg)
1533
1534 log.debug('Got user %s %s messages', self, len(notice_messages))
1535
1536 levels = [x['level'] for x in notice_messages]
1537 notice_level = 'notice-error' if 'error' in levels else 'notice-warning'
1538 except Exception:
1539 pass
1540
1541 return notice_messages, notice_level
1542
1458 def __repr__(self):
1543 def __repr__(self):
1459 return "<AuthUser('id:%s[%s] ip:%s auth:%s')>"\
1544 return self.repr_user(self.user_id, self.username, self.ip_addr, self.is_authenticated)
1460 % (self.user_id, self.username, self.ip_addr, self.is_authenticated)
1461
1545
1462 def set_authenticated(self, authenticated=True):
1546 def set_authenticated(self, authenticated=True):
1463 if self.user_id != self.anonymous_user.user_id:
1547 if self.user_id != self.anonymous_user.user_id:
@@ -1472,6 +1556,11 b' class AuthUser(object):'
1472 }
1556 }
1473
1557
1474 @classmethod
1558 @classmethod
1559 def repr_user(cls, user_id=0, username='ANONYMOUS', ip='0.0.0.0', is_authenticated=False):
1560 tmpl = "<AuthUser('id:{}[{}] ip:{} auth:{}')>"
1561 return tmpl.format(user_id, username, ip, is_authenticated)
1562
1563 @classmethod
1475 def from_cookie_store(cls, cookie_store):
1564 def from_cookie_store(cls, cookie_store):
1476 """
1565 """
1477 Creates AuthUser from a cookie store
1566 Creates AuthUser from a cookie store
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -283,7 +283,7 b' def get_current_lang(request):'
283 return getattr(request, '_LOCALE_', request.locale_name)
283 return getattr(request, '_LOCALE_', request.locale_name)
284
284
285
285
286 def attach_context_attributes(context, request, user_id=None):
286 def attach_context_attributes(context, request, user_id=None, is_api=None):
287 """
287 """
288 Attach variables into template context called `c`.
288 Attach variables into template context called `c`.
289 """
289 """
@@ -379,7 +379,8 b' def attach_context_attributes(context, r'
379 "sideside": "sideside"
379 "sideside": "sideside"
380 }.get(request.GET.get('diffmode'))
380 }.get(request.GET.get('diffmode'))
381
381
382 is_api = hasattr(request, 'rpc_user')
382 if is_api is not None:
383 is_api = hasattr(request, 'rpc_user')
383 session_attrs = {
384 session_attrs = {
384 # defaults
385 # defaults
385 "clone_url_format": "http",
386 "clone_url_format": "http",
@@ -436,7 +437,7 b' def attach_context_attributes(context, r'
436
437
437 context.csrf_token = csrf_token
438 context.csrf_token = csrf_token
438 context.backends = rhodecode.BACKENDS.keys()
439 context.backends = rhodecode.BACKENDS.keys()
439 context.backends.sort()
440
440 unread_count = 0
441 unread_count = 0
441 user_bookmark_list = []
442 user_bookmark_list = []
442 if user_id:
443 if user_id:
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -49,6 +49,7 b' def send_email(recipients, subject, body'
49 :param subject: subject of the mail
49 :param subject: subject of the mail
50 :param body: body of the mail
50 :param body: body of the mail
51 :param html_body: html version of body
51 :param html_body: html version of body
52 :param email_config: specify custom configuration for mailer
52 """
53 """
53 log = get_logger(send_email)
54 log = get_logger(send_email)
54
55
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -12,10 +12,11 b' from sqlalchemy import __version__ as _s'
12
12
13 warnings.simplefilter('always', DeprecationWarning)
13 warnings.simplefilter('always', DeprecationWarning)
14
14
15 _sa_version = tuple(int(re.match("\d+", x).group(0))
15 _sa_version = tuple(int(re.match("\d+", x).group(0)) for x in _sa_version.split("."))
16 for x in _sa_version.split("."))
17 SQLA_07 = _sa_version >= (0, 7)
16 SQLA_07 = _sa_version >= (0, 7)
18 SQLA_08 = _sa_version >= (0, 8)
17 SQLA_08 = _sa_version >= (0, 8)
18 SQLA_09 = _sa_version >= (0, 9)
19 SQLA_10 = _sa_version >= (1, 0)
19
20
20 del re
21 del re
21 del _sa_version
22 del _sa_version
@@ -23,8 +24,8 b' del _sa_version'
23 from rhodecode.lib.dbmigrate.migrate.changeset.schema import *
24 from rhodecode.lib.dbmigrate.migrate.changeset.schema import *
24 from rhodecode.lib.dbmigrate.migrate.changeset.constraint import *
25 from rhodecode.lib.dbmigrate.migrate.changeset.constraint import *
25
26
26 sqlalchemy.schema.Table.__bases__ += (ChangesetTable,)
27 sqlalchemy.schema.Table.__bases__ += (ChangesetTable, )
27 sqlalchemy.schema.Column.__bases__ += (ChangesetColumn,)
28 sqlalchemy.schema.Column.__bases__ += (ChangesetColumn, )
28 sqlalchemy.schema.Index.__bases__ += (ChangesetIndex,)
29 sqlalchemy.schema.Index.__bases__ += (ChangesetIndex, )
29
30
30 sqlalchemy.schema.DefaultClause.__bases__ += (ChangesetDefaultClause,)
31 sqlalchemy.schema.DefaultClause.__bases__ += (ChangesetDefaultClause, )
@@ -97,7 +97,6 b' class ANSIColumnGenerator(AlterTableVisi'
97
97
98 table = self.start_alter_table(column)
98 table = self.start_alter_table(column)
99 self.append("ADD ")
99 self.append("ADD ")
100
101 self.append(self.get_column_specification(column))
100 self.append(self.get_column_specification(column))
102
101
103 for cons in column.constraints:
102 for cons in column.constraints:
@@ -111,7 +111,7 b' class ForeignKeyConstraint(ConstraintCha'
111 refcolnames, reftable = self._normalize_columns(refcolumns,
111 refcolnames, reftable = self._normalize_columns(refcolumns,
112 table_name=True)
112 table_name=True)
113 super(ForeignKeyConstraint, self).__init__(
113 super(ForeignKeyConstraint, self).__init__(
114 colnames, refcolnames, *args,**kwargs
114 colnames, refcolnames, *args, **kwargs
115 )
115 )
116 if table is not None:
116 if table is not None:
117 self._set_parent(table)
117 self._set_parent(table)
@@ -3,16 +3,20 b''
3
3
4 .. _`SQLite`: http://www.sqlite.org/
4 .. _`SQLite`: http://www.sqlite.org/
5 """
5 """
6 from UserDict import DictMixin
6 try: # Python 3
7 from collections.abc import MutableMapping as DictMixin
8 except ImportError: # Python 2
9 from UserDict import DictMixin
7 from copy import copy
10 from copy import copy
8 import re
11 import re
9
12
10 from sqlalchemy.databases import sqlite as sa_base
13 from sqlalchemy.databases import sqlite as sa_base
14 from sqlalchemy.schema import ForeignKeyConstraint
11 from sqlalchemy.schema import UniqueConstraint
15 from sqlalchemy.schema import UniqueConstraint
12
16
13 from rhodecode.lib.dbmigrate.migrate import exceptions
17 from rhodecode.lib.dbmigrate.migrate import exceptions
14 from rhodecode.lib.dbmigrate.migrate.changeset import ansisql
18 from rhodecode.lib.dbmigrate.migrate.changeset import ansisql
15
19 import sqlite3
16
20
17 SQLiteSchemaGenerator = sa_base.SQLiteDDLCompiler
21 SQLiteSchemaGenerator = sa_base.SQLiteDDLCompiler
18
22
@@ -73,10 +77,16 b' class SQLiteHelper(SQLiteCommon):'
73 cons for cons in table.constraints
77 cons for cons in table.constraints
74 if omit_uniques is None or cons.name not in omit_uniques
78 if omit_uniques is None or cons.name not in omit_uniques
75 ])
79 ])
80 tup = sqlite3.sqlite_version_info
81 if tup[0] > 3 or (tup[0] == 3 and tup[1] >= 26):
82 self.append('PRAGMA legacy_alter_table = ON')
83 self.execute()
76
84
77 self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name)
85 self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name)
78 self.execute()
86 self.execute()
79
87 if tup[0] > 3 or (tup[0] == 3 and tup[1] >= 26):
88 self.append('PRAGMA legacy_alter_table = OFF')
89 self.execute()
80 insertion_string = self._modify_table(table, column, delta)
90 insertion_string = self._modify_table(table, column, delta)
81
91
82 table.create(bind=self.connection)
92 table.create(bind=self.connection)
@@ -1,10 +1,13 b''
1 """
1 """
2 Schema module providing common schema operations.
2 Schema module providing common schema operations.
3 """
3 """
4 import abc
5 try: # Python 3
6 from collections.abc import MutableMapping as DictMixin
7 except ImportError: # Python 2
8 from UserDict import DictMixin
4 import warnings
9 import warnings
5
10
6 from UserDict import DictMixin
7
8 import sqlalchemy
11 import sqlalchemy
9
12
10 from sqlalchemy.schema import ForeignKeyConstraint
13 from sqlalchemy.schema import ForeignKeyConstraint
@@ -1,6 +1,17 b''
1 """
1 """
2 Safe quoting method
2 Safe quoting method
3 """
3 """
4 from rhodecode.lib.dbmigrate.migrate.changeset import SQLA_10
5
6
7 def fk_column_names(constraint):
8 if SQLA_10:
9 return [
10 constraint.columns[key].name for key in constraint.column_keys]
11 else:
12 return [
13 element.parent.name for element in constraint.elements]
14
4
15
5 def safe_quote(obj):
16 def safe_quote(obj):
6 # this is the SQLA 0.9 approach
17 # this is the SQLA 0.9 approach
@@ -27,6 +27,10 b' class InvalidVersionError(ControlledSche'
27 """Invalid version number."""
27 """Invalid version number."""
28
28
29
29
30 class VersionNotFoundError(KeyError):
31 """Specified version is not present."""
32
33
30 class DatabaseNotControlledError(ControlledSchemaError):
34 class DatabaseNotControlledError(ControlledSchemaError):
31 """Database should be under version control, but it's not."""
35 """Database should be under version control, but it's not."""
32
36
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now