##// 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
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,5 +1,5 b''
1 1 [bumpversion]
2 current_version = 4.18.3
2 current_version = 4.19.0
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
@@ -5,25 +5,20 b' done = false'
5 5 done = true
6 6
7 7 [task:rc_tools_pinned]
8 done = true
9 8
10 9 [task:fixes_on_stable]
11 done = true
12 10
13 11 [task:pip2nix_generated]
14 done = true
15 12
16 13 [task:changelog_updated]
17 done = true
18 14
19 15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21 18
22 19 [release]
23 state = prepared
24 version = 4.18.3
25
26 [task:updated_translation]
20 state = in_progress
21 version = 4.19.0
27 22
28 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 4 NODE_PATH=./node_modules
5 5 WEBPACK=./node_binaries/webpack
6 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 10 clean:
10 11 make test-clean
@@ -55,6 +56,9 b' web-build:'
55 56 generate-pkgs:
56 57 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
57 58
59 pip-packages:
60 python ${OUTDATED_PACKAGES}
61
58 62 generate-js-pkgs:
59 63 rm -rf node_modules && \
60 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 350 ; This is used to store exception from RhodeCode in shared directory
351 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 364 ; File store configuration. This is used to store and serve uploaded files
354 365 file_store.enabled = true
355 366
@@ -605,8 +616,9 b' vcs.backends = hg, git, svn'
605 616 vcs.connection_timeout = 3600
606 617
607 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
609 #vcs.svn.compatible_version = pre-1.8-compatible
619 ; Set a numeric version for your current SVN e.g 1.8, or 1.12
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 301 ; This is used to store exception from RhodeCode in shared directory
302 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 315 ; File store configuration. This is used to store and serve uploaded files
305 316 file_store.enabled = true
306 317
@@ -556,8 +567,9 b' vcs.backends = hg, git, svn'
556 567 vcs.connection_timeout = 3600
557 568
558 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
560 #vcs.svn.compatible_version = pre-1.8-compatible
570 ; Set a numeric version for your current SVN e.g 1.8, or 1.12
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 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 22 Linux
23 23 ^^^^^
24 24
25 * Ubuntu 14.04
26 * CentOS 6.2 and 7
25 * Ubuntu 14.04+
26 * CentOS 6.2, 7 and 8
27 * RHEL 6.2, 7 and 8
27 28 * Debian 7.8
28 29 * RedHat Fedora
29 30 * Arch Linux
@@ -39,7 +39,7 b' close_pull_request'
39 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 44 Comment on the pull request specified with the `pullrequestid`,
45 45 in the |repo| specified by the `repoid`, and optionally change the
@@ -70,6 +70,8 b' comment_pull_request'
70 70 :type extra_recipients: Optional(list)
71 71 :param userid: Comment on the pull request as this user
72 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 76 Example output:
75 77
@@ -160,6 +162,7 b' get_pull_request'
160 162 "status" : "<status>",
161 163 "created_on": "<date_time_created>",
162 164 "updated_on": "<date_time_updated>",
165 "versions": "<number_or_versions_of_pr>",
163 166 "commit_ids": [
164 167 ...
165 168 "<commit_id>",
@@ -249,7 +252,9 b' get_pull_request_comments'
249 252 },
250 253 "comment_text": "Example text",
251 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 260 error : null
@@ -28,7 +28,7 b' add_field_to_repo'
28 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 33 Set a commit comment, and optionally change the status of the commit.
34 34
@@ -52,6 +52,8 b' comment_commit'
52 52 :type extra_recipients: Optional(list)
53 53 :param userid: Set the user name of the comment creator.
54 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 58 Example error output:
57 59
@@ -3,6 +3,21 b''
3 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 21 search
7 22 ------
8 23
@@ -68,7 +68,7 b' Below is example setup that can be used '
68 68 # Multiple servers can be specified using commas
69 69
70 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 73 *option*: `timeout` => `300`
74 74 # Timeout for LDAP connection
@@ -58,7 +58,7 b' Below is example setup that can be used '
58 58 # Multiple servers can be specified using commas
59 59
60 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 63 *option*: `timeout` => `300`
64 64 # Timeout for LDAP connection
@@ -22,7 +22,7 b' authentication::'
22 22 # Multiple servers can be specified using commas
23 23
24 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 27 *option*: `timeout` => `300`
28 28 # Timeout for LDAP connection
@@ -19,7 +19,7 b' Setup Nix Package Manager'
19 19
20 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 24 or go to https://nixos.org/nix/ and follow the installation instructions.
25 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 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 52 Followed by::
53 53
54 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 58 Install required binaries
@@ -3,20 +3,6 b''
3 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 6 Windows Upload
21 7 --------------
22 8
@@ -49,12 +35,16 b' shipped with the optimal configuration a'
49 35 To fix this issue, upgrade to |RCE| 3.3.2 or greater, and if you discover
50 36 memory consumption issues check the VCS Server settings.
51 37
52 Fedora 23 / Ubuntu 18.04
53 ------------------------
38 Newer Operating system locales
39 ------------------------------
54 40
55 41 |RCC| has a know problem with locales, due to changes in glibc 2.27+ which affects
56 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 49 To work around this problem, you need set path to ``$LOCAL_ARCHIVE`` to the
60 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 65 $ export LOCALE_ARCHIVE=/home/USER/locale-archive # change to your path
76 66
77 This can either added in `~/.rccontrol/supervisor/supervisord.ini`
78 or in user .bashrc/.zshrc etc, or via a startup script that
67 This should be added *both* in `enviroment` variable of `~/.rccontrol/supervisor/supervisord.ini`
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 76 runs `rccontrol self-init`
80 77
81 78 If you happen to be running |RCC| from systemd, use the following
@@ -9,6 +9,7 b' Release Notes'
9 9 .. toctree::
10 10 :maxdepth: 1
11 11
12 release-notes-4.19.0.rst
12 13 release-notes-4.18.3.rst
13 14 release-notes-4.18.2.rst
14 15 release-notes-4.18.1.rst
@@ -1,7 +1,7 b''
1 1 sphinx==1.8.2
2 2 six==1.11.0
3 3 sphinx_rtd_theme==0.4.1
4 docutils==0.14.0
4 docutils==0.16.0
5 5 pygments==2.3.0
6 6 markupsafe==1.0.0
7 7 jinja2==2.9.6
@@ -35,7 +35,8 b''
35 35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
36 36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
37 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 40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
40 41 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
41 42 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
@@ -23,6 +23,7 b''
23 23 "grunt-contrib-watch": "^0.6.1",
24 24 "grunt-webpack": "^3.1.3",
25 25 "grunt-contrib-uglify": "^4.0.1",
26 "sweetalert2": "^9.10.12",
26 27 "jquery": "1.11.3",
27 28 "mark.js": "8.11.1",
28 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 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 53 name = "_at_polymer_slash_iron-autogrow-textarea";
54 54 packageName = "@polymer/iron-autogrow-textarea";
55 version = "3.0.1";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.1.tgz";
58 sha512 = "FgSL7APrOSL9Vu812sBCFlQ17hvnJsBAV2C2e1UAiaHhB+dyfLq8gGdGUpqVWuGJ50q4Y/49QwCNnLf85AdVYA==";
55 version = "3.0.3";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.3.tgz";
58 sha512 = "5r0VkWrIlm0JIp5E5wlnvkw7slK72lFRZXncmrsLZF+6n1dg2rI8jt7xpFzSmUWrqpcyXwyKaGaDvUjl3j4JLA==";
59 59 };
60 60 };
61 61 "@polymer/iron-behaviors-3.0.1" = {
@@ -76,13 +76,13 b' let'
76 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 80 name = "_at_polymer_slash_iron-fit-behavior";
81 81 packageName = "@polymer/iron-fit-behavior";
82 version = "3.0.1";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.1.tgz";
85 sha512 = "/M0B1L30k31vmwNBaGuZcxzUAhJSHoGccb/DF0CDKI/hT8UlkTvcyemaWdOpmHHLgY52ceKIkRwA3AeXrKyvaQ==";
82 version = "3.0.2";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.2.tgz";
85 sha512 = "JndryJYbBR3gSN5IlST4rCHsd01+OyvYpRO6z5Zd3C6u5V/m07TwAtcf3aXwZ8WBNt2eLG28OcvdSO7XR2v2pg==";
86 86 };
87 87 };
88 88 "@polymer/iron-flex-layout-3.0.1" = {
@@ -112,13 +112,13 b' let'
112 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 116 name = "_at_polymer_slash_iron-overlay-behavior";
117 117 packageName = "@polymer/iron-overlay-behavior";
118 version = "3.0.2";
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.2.tgz";
121 sha512 = "j1qmt6mJHCwpe1mKOvqK5kcCUPQr5LSrlqpgRDbUuLgUfNJ/vGTipjrkBlfbEUagm5FEQdc1VLPLSQP6WVuP9g==";
118 version = "3.0.3";
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.3.tgz";
121 sha512 = "Q/Fp0+uOQQ145ebZ7T8Cxl4m1tUKYjyymkjcL2rXUm+aDQGb1wA1M1LYxUF5YBqd+9lipE0PTIiYwA2ZL/sznA==";
122 122 };
123 123 };
124 124 "@polymer/iron-resizable-behavior-3.0.1" = {
@@ -157,13 +157,13 b' let'
157 157 sha512 = "JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg==";
158 158 };
159 159 };
160 "@polymer/paper-ripple-3.0.1" = {
160 "@polymer/paper-ripple-3.0.2" = {
161 161 name = "_at_polymer_slash_paper-ripple";
162 162 packageName = "@polymer/paper-ripple";
163 version = "3.0.1";
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.1.tgz";
166 sha512 = "dgOe12GyCF1VZBLUQqnzGWlf3xb255FajNCVB1VFj/AtskYtoamnafa7m3a+1vs+C8qbg4Benn5KwgxVDSW4cg==";
163 version = "3.0.2";
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.2.tgz";
166 sha512 = "DnLNvYIMsiayeICroYxx6Q6Hg1cUU8HN2sbutXazlemAlGqdq80qz3TIaVdbpbt/pvjcFGX2HtntMlPstCge8Q==";
167 167 };
168 168 };
169 169 "@polymer/paper-spinner-3.0.2" = {
@@ -211,13 +211,13 b' let'
211 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 215 name = "_at_polymer_slash_polymer";
216 216 packageName = "@polymer/polymer";
217 version = "3.3.0";
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.3.0.tgz";
220 sha512 = "rij7suomS7DxdBamnwr/Xa0V5hpypf7I9oYKseF2FWz5Xh2a3wJNpVjgJy1adXVCxqIyPhghsrthnfCt7EblsQ==";
217 version = "3.3.1";
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.3.1.tgz";
220 sha512 = "8KaB48tzyMjdsHdxo5KvCAaqmTe7rYDzQAoj/pyEfq9Fp4YfUaS+/xqwYj0GbiDAUNzwkmEQ7dw9cgnRNdKO8A==";
221 221 };
222 222 };
223 223 "@types/clone-0.1.30" = {
@@ -229,13 +229,13 b' let'
229 229 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
230 230 };
231 231 };
232 "@types/node-6.14.9" = {
232 "@types/node-6.14.10" = {
233 233 name = "_at_types_slash_node";
234 234 packageName = "@types/node";
235 version = "6.14.9";
236 src = fetchurl {
237 url = "https://registry.npmjs.org/@types/node/-/node-6.14.9.tgz";
238 sha512 = "leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w==";
235 version = "6.14.10";
236 src = fetchurl {
237 url = "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz";
238 sha512 = "pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==";
239 239 };
240 240 };
241 241 "@types/parse5-2.2.34" = {
@@ -409,22 +409,22 b' let'
409 409 sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==";
410 410 };
411 411 };
412 "@webcomponents/shadycss-1.9.2" = {
412 "@webcomponents/shadycss-1.9.6" = {
413 413 name = "_at_webcomponents_slash_shadycss";
414 414 packageName = "@webcomponents/shadycss";
415 version = "1.9.2";
416 src = fetchurl {
417 url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.2.tgz";
418 sha512 = "GsD7RpDVrVdgC6e+D8zQia8RGNmEGQ9/qotnVPQYPrIXhGS5xSt6ZED9YmuHz3HbLqY+E54tE1EK3tjLzSCGrw==";
419 };
420 };
421 "@webcomponents/webcomponentsjs-2.3.0" = {
415 version = "1.9.6";
416 src = fetchurl {
417 url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.6.tgz";
418 sha512 = "5fFjvP0jQJZoXK6YzYeYcIDGJ5oEsdjr1L9VaYLw5yxNd4aRz4srMpwCwldeNG0A6Hvr9igbG7fCsBeiiCXd7A==";
419 };
420 };
421 "@webcomponents/webcomponentsjs-2.4.3" = {
422 422 name = "_at_webcomponents_slash_webcomponentsjs";
423 423 packageName = "@webcomponents/webcomponentsjs";
424 version = "2.3.0";
425 src = fetchurl {
426 url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.3.0.tgz";
427 sha512 = "sR6FOrNnnncRuoJDqq9QxtRsJMbIvASw4vnJwIYKVlKO3AMc+NAr/bIQNnUiTTE9pBDTJkFpVaUdjJaRdsjmyA==";
424 version = "2.4.3";
425 src = fetchurl {
426 url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.4.3.tgz";
427 sha512 = "cV4+sAmshf8ysU2USutrSRYQkJzEYKHsRCGa0CkMElGpG5747VHtkfsW3NdVIBV/m2MDKXTDydT4lkrysH7IFA==";
428 428 };
429 429 };
430 430 "@xtuc/ieee754-1.2.0" = {
@@ -463,13 +463,13 b' let'
463 463 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
464 464 };
465 465 };
466 "acorn-5.7.3" = {
466 "acorn-5.7.4" = {
467 467 name = "acorn";
468 468 packageName = "acorn";
469 version = "5.7.3";
470 src = fetchurl {
471 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz";
472 sha512 = "T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==";
469 version = "5.7.4";
470 src = fetchurl {
471 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz";
472 sha512 = "1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==";
473 473 };
474 474 };
475 475 "acorn-dynamic-import-3.0.0" = {
@@ -499,13 +499,13 b' let'
499 499 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
500 500 };
501 501 };
502 "ajv-6.10.2" = {
502 "ajv-6.12.0" = {
503 503 name = "ajv";
504 504 packageName = "ajv";
505 version = "6.10.2";
506 src = fetchurl {
507 url = "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz";
508 sha512 = "TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==";
505 version = "6.12.0";
506 src = fetchurl {
507 url = "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz";
508 sha512 = "D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==";
509 509 };
510 510 };
511 511 "ajv-keywords-3.4.1" = {
@@ -860,13 +860,13 b' let'
860 860 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
861 861 };
862 862 };
863 "aws4-1.8.0" = {
863 "aws4-1.9.1" = {
864 864 name = "aws4";
865 865 packageName = "aws4";
866 version = "1.8.0";
867 src = fetchurl {
868 url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz";
869 sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==";
866 version = "1.9.1";
867 src = fetchurl {
868 url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
869 sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
870 870 };
871 871 };
872 872 "babel-code-frame-6.26.0" = {
@@ -1445,13 +1445,22 b' let'
1445 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 1458 name = "bluebird";
1450 1459 packageName = "bluebird";
1451 version = "3.7.1";
1452 src = fetchurl {
1453 url = "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz";
1454 sha512 = "DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==";
1460 version = "3.7.2";
1461 src = fetchurl {
1462 url = "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz";
1463 sha512 = "XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==";
1455 1464 };
1456 1465 };
1457 1466 "bn.js-4.11.8" = {
@@ -1580,13 +1589,13 b' let'
1580 1589 sha512 = "WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==";
1581 1590 };
1582 1591 };
1583 "buffer-4.9.1" = {
1592 "buffer-4.9.2" = {
1584 1593 name = "buffer";
1585 1594 packageName = "buffer";
1586 version = "4.9.1";
1587 src = fetchurl {
1588 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz";
1589 sha1 = "6d1bb601b07a4efced97094132093027c95bc298";
1595 version = "4.9.2";
1596 src = fetchurl {
1597 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz";
1598 sha512 = "xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==";
1590 1599 };
1591 1600 };
1592 1601 "buffer-from-1.1.1" = {
@@ -1670,22 +1679,22 b' let'
1670 1679 sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c";
1671 1680 };
1672 1681 };
1673 "caniuse-db-1.0.30001006" = {
1682 "caniuse-db-1.0.30001042" = {
1674 1683 name = "caniuse-db";
1675 1684 packageName = "caniuse-db";
1676 version = "1.0.30001006";
1677 src = fetchurl {
1678 url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001006.tgz";
1679 sha512 = "Xn25grc0GXATFnnEX+KP3IwEv6ZdHs4CALyLKvK8pBeeBe+hSpqy3/GyKBgEp4hn6o+bI+GNeNeQBf9PBOK0EQ==";
1680 };
1681 };
1682 "caniuse-lite-1.0.30001006" = {
1685 version = "1.0.30001042";
1686 src = fetchurl {
1687 url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001042.tgz";
1688 sha512 = "2RKrB2hkLCW/8Uj32oaXj0O+N9ROo0/BF0EueWHwgs6AeeSiL+rCSsbICR3ayBJOZavgcFx65ZCw7QiafsoUFQ==";
1689 };
1690 };
1691 "caniuse-lite-1.0.30001042" = {
1683 1692 name = "caniuse-lite";
1684 1693 packageName = "caniuse-lite";
1685 version = "1.0.30001006";
1686 src = fetchurl {
1687 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz";
1688 sha512 = "MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw==";
1694 version = "1.0.30001042";
1695 src = fetchurl {
1696 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001042.tgz";
1697 sha512 = "igMQ4dlqnf4tWv0xjaaE02op9AJ2oQzXKjWf4EuAHFN694Uo9/EfPVIPJcmn2WkU9RqozCxx5e2KPcVClHDbDw==";
1689 1698 };
1690 1699 };
1691 1700 "caseless-0.12.0" = {
@@ -1742,13 +1751,13 b' let'
1742 1751 sha512 = "ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==";
1743 1752 };
1744 1753 };
1745 "chownr-1.1.3" = {
1754 "chownr-1.1.4" = {
1746 1755 name = "chownr";
1747 1756 packageName = "chownr";
1748 version = "1.1.3";
1749 src = fetchurl {
1750 url = "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz";
1751 sha512 = "i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==";
1757 version = "1.1.4";
1758 src = fetchurl {
1759 url = "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz";
1760 sha512 = "jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==";
1752 1761 };
1753 1762 };
1754 1763 "chrome-trace-event-1.0.2" = {
@@ -1787,13 +1796,13 b' let'
1787 1796 sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==";
1788 1797 };
1789 1798 };
1790 "clean-css-4.2.1" = {
1799 "clean-css-4.2.3" = {
1791 1800 name = "clean-css";
1792 1801 packageName = "clean-css";
1793 version = "4.2.1";
1794 src = fetchurl {
1795 url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz";
1796 sha512 = "4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==";
1802 version = "4.2.3";
1803 src = fetchurl {
1804 url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz";
1805 sha512 = "VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==";
1797 1806 };
1798 1807 };
1799 1808 "cli-1.0.1" = {
@@ -1805,13 +1814,13 b' let'
1805 1814 sha1 = "22817534f24bfa4950c34d532d48ecbc621b8c14";
1806 1815 };
1807 1816 };
1808 "clipboard-2.0.4" = {
1817 "clipboard-2.0.6" = {
1809 1818 name = "clipboard";
1810 1819 packageName = "clipboard";
1811 version = "2.0.4";
1812 src = fetchurl {
1813 url = "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz";
1814 sha512 = "Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==";
1820 version = "2.0.6";
1821 src = fetchurl {
1822 url = "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz";
1823 sha512 = "g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==";
1815 1824 };
1816 1825 };
1817 1826 "cliui-2.1.0" = {
@@ -2066,13 +2075,13 b' let'
2066 2075 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
2067 2076 };
2068 2077 };
2069 "convert-source-map-1.6.0" = {
2078 "convert-source-map-1.7.0" = {
2070 2079 name = "convert-source-map";
2071 2080 packageName = "convert-source-map";
2072 version = "1.6.0";
2073 src = fetchurl {
2074 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz";
2075 sha512 = "eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==";
2081 version = "1.7.0";
2082 src = fetchurl {
2083 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz";
2084 sha512 = "4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==";
2076 2085 };
2077 2086 };
2078 2087 "copy-concurrently-1.0.5" = {
@@ -2102,13 +2111,13 b' let'
2102 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 2115 name = "core-js";
2107 2116 packageName = "core-js";
2108 version = "2.6.10";
2109 src = fetchurl {
2110 url = "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz";
2111 sha512 = "I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==";
2117 version = "2.6.11";
2118 src = fetchurl {
2119 url = "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz";
2120 sha512 = "5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==";
2112 2121 };
2113 2122 };
2114 2123 "core-util-is-1.0.2" = {
@@ -2201,13 +2210,13 b' let'
2201 2210 sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
2202 2211 };
2203 2212 };
2204 "css-selector-tokenizer-0.7.1" = {
2213 "css-selector-tokenizer-0.7.2" = {
2205 2214 name = "css-selector-tokenizer";
2206 2215 packageName = "css-selector-tokenizer";
2207 version = "0.7.1";
2208 src = fetchurl {
2209 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz";
2210 sha512 = "xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==";
2216 version = "0.7.2";
2217 src = fetchurl {
2218 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz";
2219 sha512 = "yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==";
2211 2220 };
2212 2221 };
2213 2222 "css-what-2.1.3" = {
@@ -2219,13 +2228,13 b' let'
2219 2228 sha512 = "a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==";
2220 2229 };
2221 2230 };
2222 "cssesc-0.1.0" = {
2231 "cssesc-3.0.0" = {
2223 2232 name = "cssesc";
2224 2233 packageName = "cssesc";
2225 version = "0.1.0";
2226 src = fetchurl {
2227 url = "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz";
2228 sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
2234 version = "3.0.0";
2235 src = fetchurl {
2236 url = "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz";
2237 sha512 = "/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==";
2229 2238 };
2230 2239 };
2231 2240 "cssnano-3.10.0" = {
@@ -2390,13 +2399,13 b' let'
2390 2399 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
2391 2400 };
2392 2401 };
2393 "des.js-1.0.0" = {
2402 "des.js-1.0.1" = {
2394 2403 name = "des.js";
2395 2404 packageName = "des.js";
2396 version = "1.0.0";
2397 src = fetchurl {
2398 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz";
2399 sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
2405 version = "1.0.1";
2406 src = fetchurl {
2407 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz";
2408 sha512 = "Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==";
2400 2409 };
2401 2410 };
2402 2411 "detect-file-1.0.0" = {
@@ -2444,13 +2453,13 b' let'
2444 2453 sha512 = "gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==";
2445 2454 };
2446 2455 };
2447 "dom-serializer-0.2.1" = {
2456 "dom-serializer-0.2.2" = {
2448 2457 name = "dom-serializer";
2449 2458 packageName = "dom-serializer";
2450 version = "0.2.1";
2451 src = fetchurl {
2452 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz";
2453 sha512 = "sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==";
2459 version = "0.2.2";
2460 src = fetchurl {
2461 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz";
2462 sha512 = "2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==";
2454 2463 };
2455 2464 };
2456 2465 "dom5-2.3.0" = {
@@ -2507,13 +2516,13 b' let'
2507 2516 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
2508 2517 };
2509 2518 };
2510 "dropzone-5.5.1" = {
2519 "dropzone-5.7.0" = {
2511 2520 name = "dropzone";
2512 2521 packageName = "dropzone";
2513 version = "5.5.1";
2514 src = fetchurl {
2515 url = "https://registry.npmjs.org/dropzone/-/dropzone-5.5.1.tgz";
2516 sha512 = "3VduRWLxx9hbVr42QieQN25mx/I61/mRdUSuxAmDGdDqZIN8qtP7tcKMa3KfpJjuGjOJGYYUzzeq6eGDnkzesA==";
2522 version = "5.7.0";
2523 src = fetchurl {
2524 url = "https://registry.npmjs.org/dropzone/-/dropzone-5.7.0.tgz";
2525 sha512 = "kOltiZXH5cO/72I22JjE+w6BoT6uaVLfWdFMsi1PMKFkU6BZWpqRwjnsRm0o6ANGTBuZar5Piu7m/CbKqRPiYg==";
2517 2526 };
2518 2527 };
2519 2528 "duplexer-0.1.1" = {
@@ -2543,22 +2552,22 b' let'
2543 2552 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
2544 2553 };
2545 2554 };
2546 "electron-to-chromium-1.3.302" = {
2555 "electron-to-chromium-1.3.412" = {
2547 2556 name = "electron-to-chromium";
2548 2557 packageName = "electron-to-chromium";
2549 version = "1.3.302";
2550 src = fetchurl {
2551 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.302.tgz";
2552 sha512 = "1qConyiVEbj4xZRBXqtGR003+9tV0rJF0PS6aeO0Ln/UL637js9hdwweCl07meh/kJoI2N4W8q3R3g3F5z46ww==";
2553 };
2554 };
2555 "elliptic-6.5.1" = {
2558 version = "1.3.412";
2559 src = fetchurl {
2560 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.412.tgz";
2561 sha512 = "4bVdSeJScR8fT7ERveLWbxemY5uXEHVseqMRyORosiKcTUSGtVwBkV8uLjXCqoFLeImA57Z9hbz3TOid01U4Hw==";
2562 };
2563 };
2564 "elliptic-6.5.2" = {
2556 2565 name = "elliptic";
2557 2566 packageName = "elliptic";
2558 version = "6.5.1";
2559 src = fetchurl {
2560 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz";
2561 sha512 = "xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==";
2567 version = "6.5.2";
2568 src = fetchurl {
2569 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz";
2570 sha512 = "f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==";
2562 2571 };
2563 2572 };
2564 2573 "emojis-list-2.1.0" = {
@@ -2570,6 +2579,15 b' let'
2570 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 2591 "end-of-stream-1.4.4" = {
2574 2592 name = "end-of-stream";
2575 2593 packageName = "end-of-stream";
@@ -2624,22 +2642,22 b' let'
2624 2642 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
2625 2643 };
2626 2644 };
2627 "es-abstract-1.16.0" = {
2645 "es-abstract-1.17.5" = {
2628 2646 name = "es-abstract";
2629 2647 packageName = "es-abstract";
2630 version = "1.16.0";
2631 src = fetchurl {
2632 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz";
2633 sha512 = "xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==";
2634 };
2635 };
2636 "es-to-primitive-1.2.0" = {
2648 version = "1.17.5";
2649 src = fetchurl {
2650 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz";
2651 sha512 = "BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==";
2652 };
2653 };
2654 "es-to-primitive-1.2.1" = {
2637 2655 name = "es-to-primitive";
2638 2656 packageName = "es-to-primitive";
2639 version = "1.2.0";
2640 src = fetchurl {
2641 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz";
2642 sha512 = "qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==";
2657 version = "1.2.1";
2658 src = fetchurl {
2659 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz";
2660 sha512 = "QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==";
2643 2661 };
2644 2662 };
2645 2663 "es6-templates-0.2.3" = {
@@ -2741,13 +2759,13 b' let'
2741 2759 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
2742 2760 };
2743 2761 };
2744 "events-3.0.0" = {
2762 "events-3.1.0" = {
2745 2763 name = "events";
2746 2764 packageName = "events";
2747 version = "3.0.0";
2748 src = fetchurl {
2749 url = "https://registry.npmjs.org/events/-/events-3.0.0.tgz";
2750 sha512 = "Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==";
2765 version = "3.1.0";
2766 src = fetchurl {
2767 url = "https://registry.npmjs.org/events/-/events-3.1.0.tgz";
2768 sha512 = "Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==";
2751 2769 };
2752 2770 };
2753 2771 "evp_bytestokey-1.0.3" = {
@@ -2849,22 +2867,22 b' let'
2849 2867 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
2850 2868 };
2851 2869 };
2852 "fast-deep-equal-2.0.1" = {
2870 "fast-deep-equal-3.1.1" = {
2853 2871 name = "fast-deep-equal";
2854 2872 packageName = "fast-deep-equal";
2855 version = "2.0.1";
2856 src = fetchurl {
2857 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
2858 sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
2859 };
2860 };
2861 "fast-json-stable-stringify-2.0.0" = {
2873 version = "3.1.1";
2874 src = fetchurl {
2875 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
2876 sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
2877 };
2878 };
2879 "fast-json-stable-stringify-2.1.0" = {
2862 2880 name = "fast-json-stable-stringify";
2863 2881 packageName = "fast-json-stable-stringify";
2864 version = "2.0.0";
2865 src = fetchurl {
2866 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
2867 sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
2882 version = "2.1.0";
2883 src = fetchurl {
2884 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
2885 sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
2868 2886 };
2869 2887 };
2870 2888 "fastparse-1.1.2" = {
@@ -2912,6 +2930,15 b' let'
2912 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 2942 "fill-range-4.0.0" = {
2916 2943 name = "fill-range";
2917 2944 packageName = "fill-range";
@@ -3074,13 +3101,13 b' let'
3074 3101 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
3075 3102 };
3076 3103 };
3077 "fsevents-1.2.9" = {
3104 "fsevents-1.2.12" = {
3078 3105 name = "fsevents";
3079 3106 packageName = "fsevents";
3080 version = "1.2.9";
3081 src = fetchurl {
3082 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz";
3083 sha512 = "oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==";
3107 version = "1.2.12";
3108 src = fetchurl {
3109 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz";
3110 sha512 = "Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==";
3084 3111 };
3085 3112 };
3086 3113 "function-bind-1.1.1" = {
@@ -3164,13 +3191,13 b' let'
3164 3191 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
3165 3192 };
3166 3193 };
3167 "glob-7.1.5" = {
3194 "glob-7.1.6" = {
3168 3195 name = "glob";
3169 3196 packageName = "glob";
3170 version = "7.1.5";
3171 src = fetchurl {
3172 url = "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz";
3173 sha512 = "J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==";
3197 version = "7.1.6";
3198 src = fetchurl {
3199 url = "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";
3200 sha512 = "LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==";
3174 3201 };
3175 3202 };
3176 3203 "glob-parent-3.1.0" = {
@@ -3452,13 +3479,13 b' let'
3452 3479 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
3453 3480 };
3454 3481 };
3455 "has-symbols-1.0.0" = {
3482 "has-symbols-1.0.1" = {
3456 3483 name = "has-symbols";
3457 3484 packageName = "has-symbols";
3458 version = "1.0.0";
3459 src = fetchurl {
3460 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz";
3461 sha1 = "ba1a8f1af2a0fc39650f5c850367704122063b44";
3485 version = "1.0.1";
3486 src = fetchurl {
3487 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz";
3488 sha512 = "PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==";
3462 3489 };
3463 3490 };
3464 3491 "has-value-0.3.1" = {
@@ -3884,13 +3911,13 b' let'
3884 3911 sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
3885 3912 };
3886 3913 };
3887 "is-callable-1.1.4" = {
3914 "is-callable-1.1.5" = {
3888 3915 name = "is-callable";
3889 3916 packageName = "is-callable";
3890 version = "1.1.4";
3891 src = fetchurl {
3892 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz";
3893 sha512 = "r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==";
3917 version = "1.1.5";
3918 src = fetchurl {
3919 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz";
3920 sha512 = "ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==";
3894 3921 };
3895 3922 };
3896 3923 "is-data-descriptor-0.1.4" = {
@@ -3911,13 +3938,13 b' let'
3911 3938 sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==";
3912 3939 };
3913 3940 };
3914 "is-date-object-1.0.1" = {
3941 "is-date-object-1.0.2" = {
3915 3942 name = "is-date-object";
3916 3943 packageName = "is-date-object";
3917 version = "1.0.1";
3918 src = fetchurl {
3919 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz";
3920 sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
3944 version = "1.0.2";
3945 src = fetchurl {
3946 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz";
3947 sha512 = "USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==";
3921 3948 };
3922 3949 };
3923 3950 "is-descriptor-0.1.6" = {
@@ -3965,13 +3992,13 b' let'
3965 3992 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
3966 3993 };
3967 3994 };
3968 "is-finite-1.0.2" = {
3995 "is-finite-1.1.0" = {
3969 3996 name = "is-finite";
3970 3997 packageName = "is-finite";
3971 version = "1.0.2";
3972 src = fetchurl {
3973 url = "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz";
3974 sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
3998 version = "1.1.0";
3999 src = fetchurl {
4000 url = "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz";
4001 sha512 = "cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==";
3975 4002 };
3976 4003 };
3977 4004 "is-fullwidth-code-point-1.0.0" = {
@@ -4037,13 +4064,13 b' let'
4037 4064 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
4038 4065 };
4039 4066 };
4040 "is-regex-1.0.4" = {
4067 "is-regex-1.0.5" = {
4041 4068 name = "is-regex";
4042 4069 packageName = "is-regex";
4043 version = "1.0.4";
4044 src = fetchurl {
4045 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz";
4046 sha1 = "5517489b547091b0930e095654ced25ee97e9491";
4070 version = "1.0.5";
4071 src = fetchurl {
4072 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz";
4073 sha512 = "vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==";
4047 4074 };
4048 4075 };
4049 4076 "is-relative-1.0.0" = {
@@ -4073,13 +4100,13 b' let'
4073 4100 sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9";
4074 4101 };
4075 4102 };
4076 "is-symbol-1.0.2" = {
4103 "is-symbol-1.0.3" = {
4077 4104 name = "is-symbol";
4078 4105 packageName = "is-symbol";
4079 version = "1.0.2";
4080 src = fetchurl {
4081 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz";
4082 sha512 = "HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==";
4106 version = "1.0.3";
4107 src = fetchurl {
4108 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz";
4109 sha512 = "OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==";
4083 4110 };
4084 4111 };
4085 4112 "is-typedarray-1.0.0" = {
@@ -4172,13 +4199,13 b' let'
4172 4199 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
4173 4200 };
4174 4201 };
4175 "js-base64-2.5.1" = {
4202 "js-base64-2.5.2" = {
4176 4203 name = "js-base64";
4177 4204 packageName = "js-base64";
4178 version = "2.5.1";
4179 src = fetchurl {
4180 url = "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz";
4181 sha512 = "M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==";
4205 version = "2.5.2";
4206 src = fetchurl {
4207 url = "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz";
4208 sha512 = "Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==";
4182 4209 };
4183 4210 };
4184 4211 "js-tokens-3.0.2" = {
@@ -4235,13 +4262,13 b' let'
4235 4262 sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
4236 4263 };
4237 4264 };
4238 "jshint-2.10.2" = {
4265 "jshint-2.11.0" = {
4239 4266 name = "jshint";
4240 4267 packageName = "jshint";
4241 version = "2.10.2";
4242 src = fetchurl {
4243 url = "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz";
4244 sha512 = "e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==";
4268 version = "2.11.0";
4269 src = fetchurl {
4270 url = "https://registry.npmjs.org/jshint/-/jshint-2.11.0.tgz";
4271 sha512 = "ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==";
4245 4272 };
4246 4273 };
4247 4274 "jshint-2.9.7" = {
@@ -4361,13 +4388,13 b' let'
4361 4388 sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==";
4362 4389 };
4363 4390 };
4364 "kind-of-6.0.2" = {
4391 "kind-of-6.0.3" = {
4365 4392 name = "kind-of";
4366 4393 packageName = "kind-of";
4367 version = "6.0.2";
4368 src = fetchurl {
4369 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz";
4370 sha512 = "s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==";
4394 version = "6.0.3";
4395 src = fetchurl {
4396 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz";
4397 sha512 = "dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==";
4371 4398 };
4372 4399 };
4373 4400 "lazy-cache-1.0.4" = {
@@ -4424,13 +4451,13 b' let'
4424 4451 sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348";
4425 4452 };
4426 4453 };
4427 "loader-utils-1.2.3" = {
4454 "loader-utils-1.4.0" = {
4428 4455 name = "loader-utils";
4429 4456 packageName = "loader-utils";
4430 version = "1.2.3";
4431 src = fetchurl {
4432 url = "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz";
4433 sha512 = "fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==";
4457 version = "1.4.0";
4458 src = fetchurl {
4459 url = "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz";
4460 sha512 = "qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==";
4434 4461 };
4435 4462 };
4436 4463 "locate-path-2.0.0" = {
@@ -4622,13 +4649,13 b' let'
4622 4649 sha1 = "180f1f9ebef8b0e638e4166ad52db879beb2ffc5";
4623 4650 };
4624 4651 };
4625 "math-expression-evaluator-1.2.17" = {
4652 "math-expression-evaluator-1.2.22" = {
4626 4653 name = "math-expression-evaluator";
4627 4654 packageName = "math-expression-evaluator";
4628 version = "1.2.17";
4629 src = fetchurl {
4630 url = "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz";
4631 sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac";
4655 version = "1.2.22";
4656 src = fetchurl {
4657 url = "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz";
4658 sha512 = "L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==";
4632 4659 };
4633 4660 };
4634 4661 "maxmin-2.1.0" = {
@@ -4703,22 +4730,22 b' let'
4703 4730 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
4704 4731 };
4705 4732 };
4706 "mime-db-1.40.0" = {
4733 "mime-db-1.43.0" = {
4707 4734 name = "mime-db";
4708 4735 packageName = "mime-db";
4709 version = "1.40.0";
4710 src = fetchurl {
4711 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz";
4712 sha512 = "jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==";
4713 };
4714 };
4715 "mime-types-2.1.24" = {
4736 version = "1.43.0";
4737 src = fetchurl {
4738 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz";
4739 sha512 = "+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==";
4740 };
4741 };
4742 "mime-types-2.1.26" = {
4716 4743 name = "mime-types";
4717 4744 packageName = "mime-types";
4718 version = "2.1.24";
4719 src = fetchurl {
4720 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz";
4721 sha512 = "WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==";
4745 version = "2.1.26";
4746 src = fetchurl {
4747 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz";
4748 sha512 = "01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==";
4722 4749 };
4723 4750 };
4724 4751 "mimic-fn-2.1.0" = {
@@ -4775,22 +4802,13 b' let'
4775 4802 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
4776 4803 };
4777 4804 };
4778 "minimist-0.0.8" = {
4805 "minimist-1.2.5" = {
4779 4806 name = "minimist";
4780 4807 packageName = "minimist";
4781 version = "0.0.8";
4782 src = fetchurl {
4783 url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
4784 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
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";
4808 version = "1.2.5";
4809 src = fetchurl {
4810 url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
4811 sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
4794 4812 };
4795 4813 };
4796 4814 "mississippi-2.0.0" = {
@@ -4811,13 +4829,13 b' let'
4811 4829 sha512 = "WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==";
4812 4830 };
4813 4831 };
4814 "mkdirp-0.5.1" = {
4832 "mkdirp-0.5.5" = {
4815 4833 name = "mkdirp";
4816 4834 packageName = "mkdirp";
4817 version = "0.5.1";
4818 src = fetchurl {
4819 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";
4820 sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
4835 version = "0.5.5";
4836 src = fetchurl {
4837 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
4838 sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
4821 4839 };
4822 4840 };
4823 4841 "moment-2.24.0" = {
@@ -4829,13 +4847,13 b' let'
4829 4847 sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==";
4830 4848 };
4831 4849 };
4832 "mousetrap-1.6.3" = {
4850 "mousetrap-1.6.5" = {
4833 4851 name = "mousetrap";
4834 4852 packageName = "mousetrap";
4835 version = "1.6.3";
4836 src = fetchurl {
4837 url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.3.tgz";
4838 sha512 = "bd+nzwhhs9ifsUrC2tWaSgm24/oo2c83zaRyZQF06hYA6sANfsXHtnZ19AbbbDXCDzeH5nZBSQ4NvCjgD62tJA==";
4853 version = "1.6.5";
4854 src = fetchurl {
4855 url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz";
4856 sha512 = "QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==";
4839 4857 };
4840 4858 };
4841 4859 "move-concurrently-1.0.1" = {
@@ -4928,13 +4946,13 b' let'
4928 4946 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
4929 4947 };
4930 4948 };
4931 "nopt-4.0.1" = {
4949 "nopt-4.0.3" = {
4932 4950 name = "nopt";
4933 4951 packageName = "nopt";
4934 version = "4.0.1";
4935 src = fetchurl {
4936 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz";
4937 sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
4952 version = "4.0.3";
4953 src = fetchurl {
4954 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz";
4955 sha512 = "CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==";
4938 4956 };
4939 4957 };
4940 4958 "noptify-0.0.3" = {
@@ -5045,13 +5063,13 b' let'
5045 5063 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
5046 5064 };
5047 5065 };
5048 "object-inspect-1.6.0" = {
5066 "object-inspect-1.7.0" = {
5049 5067 name = "object-inspect";
5050 5068 packageName = "object-inspect";
5051 version = "1.6.0";
5052 src = fetchurl {
5053 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz";
5054 sha512 = "GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==";
5069 version = "1.7.0";
5070 src = fetchurl {
5071 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz";
5072 sha512 = "a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==";
5055 5073 };
5056 5074 };
5057 5075 "object-keys-1.1.1" = {
@@ -5072,6 +5090,15 b' let'
5072 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 5102 "object.defaults-1.1.0" = {
5076 5103 name = "object.defaults";
5077 5104 packageName = "object.defaults";
@@ -5081,13 +5108,13 b' let'
5081 5108 sha1 = "3a7f868334b407dea06da16d88d5cd29e435fecf";
5082 5109 };
5083 5110 };
5084 "object.getownpropertydescriptors-2.0.3" = {
5111 "object.getownpropertydescriptors-2.1.0" = {
5085 5112 name = "object.getownpropertydescriptors";
5086 5113 packageName = "object.getownpropertydescriptors";
5087 version = "2.0.3";
5088 src = fetchurl {
5089 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz";
5090 sha1 = "8758c846f5b407adab0f236e0986f14b051caa16";
5114 version = "2.1.0";
5115 src = fetchurl {
5116 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz";
5117 sha512 = "Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==";
5091 5118 };
5092 5119 };
5093 5120 "object.map-1.0.1" = {
@@ -5198,13 +5225,13 b' let'
5198 5225 sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==";
5199 5226 };
5200 5227 };
5201 "p-limit-2.2.1" = {
5228 "p-limit-2.3.0" = {
5202 5229 name = "p-limit";
5203 5230 packageName = "p-limit";
5204 version = "2.2.1";
5205 src = fetchurl {
5206 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz";
5207 sha512 = "85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==";
5231 version = "2.3.0";
5232 src = fetchurl {
5233 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz";
5234 sha512 = "//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==";
5208 5235 };
5209 5236 };
5210 5237 "p-locate-2.0.0" = {
@@ -5243,13 +5270,13 b' let'
5243 5270 sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==";
5244 5271 };
5245 5272 };
5246 "pako-1.0.10" = {
5273 "pako-1.0.11" = {
5247 5274 name = "pako";
5248 5275 packageName = "pako";
5249 version = "1.0.10";
5250 src = fetchurl {
5251 url = "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz";
5252 sha512 = "0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==";
5276 version = "1.0.11";
5277 src = fetchurl {
5278 url = "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz";
5279 sha512 = "4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==";
5253 5280 };
5254 5281 };
5255 5282 "parallel-transform-1.2.0" = {
@@ -6035,13 +6062,13 b' let'
6035 6062 sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
6036 6063 };
6037 6064 };
6038 "readable-stream-2.3.6" = {
6065 "readable-stream-2.3.7" = {
6039 6066 name = "readable-stream";
6040 6067 packageName = "readable-stream";
6041 version = "2.3.6";
6042 src = fetchurl {
6043 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";
6044 sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==";
6068 version = "2.3.7";
6069 src = fetchurl {
6070 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
6071 sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
6045 6072 };
6046 6073 };
6047 6074 "readdirp-2.2.1" = {
@@ -6098,6 +6125,15 b' let'
6098 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 6137 "regenerator-runtime-0.11.1" = {
6102 6138 name = "regenerator-runtime";
6103 6139 packageName = "regenerator-runtime";
@@ -6125,15 +6161,6 b' let'
6125 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 6164 "regexpu-core-2.0.0" = {
6138 6165 name = "regexpu-core";
6139 6166 packageName = "regexpu-core";
@@ -6143,6 +6170,15 b' let'
6143 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 6182 "regjsgen-0.2.0" = {
6147 6183 name = "regjsgen";
6148 6184 packageName = "regjsgen";
@@ -6152,6 +6188,15 b' let'
6152 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 6200 "regjsparser-0.1.5" = {
6156 6201 name = "regjsparser";
6157 6202 packageName = "regjsparser";
@@ -6161,6 +6206,15 b' let'
6161 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 6218 "relateurl-0.2.7" = {
6165 6219 name = "relateurl";
6166 6220 packageName = "relateurl";
@@ -6242,13 +6296,13 b' let'
6242 6296 sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
6243 6297 };
6244 6298 };
6245 "resolve-1.12.0" = {
6299 "resolve-1.16.0" = {
6246 6300 name = "resolve";
6247 6301 packageName = "resolve";
6248 version = "1.12.0";
6249 src = fetchurl {
6250 url = "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz";
6251 sha512 = "B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==";
6302 version = "1.16.0";
6303 src = fetchurl {
6304 url = "https://registry.npmjs.org/resolve/-/resolve-1.16.0.tgz";
6305 sha512 = "LarL/PIKJvc09k1jaeT4kQb/8/7P+qV4qSnN2K80AES+OHdfZELAKVOBjxsvtToT/uLOfFbvYvKfZmV8cee7nA==";
6252 6306 };
6253 6307 };
6254 6308 "resolve-cwd-2.0.0" = {
@@ -6494,13 +6548,13 b' let'
6494 6548 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
6495 6549 };
6496 6550 };
6497 "signal-exit-3.0.2" = {
6551 "signal-exit-3.0.3" = {
6498 6552 name = "signal-exit";
6499 6553 packageName = "signal-exit";
6500 version = "3.0.2";
6501 src = fetchurl {
6502 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz";
6503 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
6554 version = "3.0.3";
6555 src = fetchurl {
6556 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz";
6557 sha512 = "VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==";
6504 6558 };
6505 6559 };
6506 6560 "slash-1.0.0" = {
@@ -6611,13 +6665,13 b' let'
6611 6665 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
6612 6666 };
6613 6667 };
6614 "source-map-resolve-0.5.2" = {
6668 "source-map-resolve-0.5.3" = {
6615 6669 name = "source-map-resolve";
6616 6670 packageName = "source-map-resolve";
6617 version = "0.5.2";
6618 src = fetchurl {
6619 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
6620 sha512 = "MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==";
6671 version = "0.5.3";
6672 src = fetchurl {
6673 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz";
6674 sha512 = "Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==";
6621 6675 };
6622 6676 };
6623 6677 "source-map-support-0.4.18" = {
@@ -6719,13 +6773,13 b' let'
6719 6773 sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==";
6720 6774 };
6721 6775 };
6722 "stream-shift-1.0.0" = {
6776 "stream-shift-1.0.1" = {
6723 6777 name = "stream-shift";
6724 6778 packageName = "stream-shift";
6725 version = "1.0.0";
6726 src = fetchurl {
6727 url = "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz";
6728 sha1 = "d5c752825e5367e786f78e18e445ea223a155952";
6779 version = "1.0.1";
6780 src = fetchurl {
6781 url = "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz";
6782 sha512 = "AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==";
6729 6783 };
6730 6784 };
6731 6785 "strict-uri-encode-1.1.0" = {
@@ -6755,22 +6809,40 b' let'
6755 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 6822 name = "string.prototype.trimleft";
6760 6823 packageName = "string.prototype.trimleft";
6761 version = "2.1.0";
6762 src = fetchurl {
6763 url = "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz";
6764 sha512 = "FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==";
6765 };
6766 };
6767 "string.prototype.trimright-2.1.0" = {
6824 version = "2.1.2";
6825 src = fetchurl {
6826 url = "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz";
6827 sha512 = "gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==";
6828 };
6829 };
6830 "string.prototype.trimright-2.1.2" = {
6768 6831 name = "string.prototype.trimright";
6769 6832 packageName = "string.prototype.trimright";
6770 version = "2.1.0";
6771 src = fetchurl {
6772 url = "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz";
6773 sha512 = "fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==";
6833 version = "2.1.2";
6834 src = fetchurl {
6835 url = "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz";
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 6848 "string_decoder-0.10.31" = {
@@ -6908,6 +6980,15 b' let'
6908 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 6992 "tapable-0.2.9" = {
6912 6993 name = "tapable";
6913 6994 packageName = "tapable";
@@ -7052,13 +7133,13 b' let'
7052 7133 sha1 = "30c6203e1e66b841a88701ed8858f1725d94b026";
7053 7134 };
7054 7135 };
7055 "tslib-1.10.0" = {
7136 "tslib-1.11.1" = {
7056 7137 name = "tslib";
7057 7138 packageName = "tslib";
7058 version = "1.10.0";
7059 src = fetchurl {
7060 url = "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz";
7061 sha512 = "qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==";
7139 version = "1.11.1";
7140 src = fetchurl {
7141 url = "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz";
7142 sha512 = "aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==";
7062 7143 };
7063 7144 };
7064 7145 "tty-browserify-0.0.0" = {
@@ -7124,13 +7205,13 b' let'
7124 7205 sha512 = "Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==";
7125 7206 };
7126 7207 };
7127 "uglify-js-3.6.7" = {
7208 "uglify-js-3.9.1" = {
7128 7209 name = "uglify-js";
7129 7210 packageName = "uglify-js";
7130 version = "3.6.7";
7131 src = fetchurl {
7132 url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.7.tgz";
7133 sha512 = "4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A==";
7211 version = "3.9.1";
7212 src = fetchurl {
7213 url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz";
7214 sha512 = "JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==";
7134 7215 };
7135 7216 };
7136 7217 "uglify-to-browserify-1.0.2" = {
@@ -7196,6 +7277,42 b' let'
7196 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 7316 "union-value-1.0.1" = {
7200 7317 name = "union-value";
7201 7318 packageName = "union-value";
@@ -7358,13 +7475,13 b' let'
7358 7475 sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
7359 7476 };
7360 7477 };
7361 "uuid-3.3.3" = {
7478 "uuid-3.4.0" = {
7362 7479 name = "uuid";
7363 7480 packageName = "uuid";
7364 version = "3.3.3";
7365 src = fetchurl {
7366 url = "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz";
7367 sha512 = "pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==";
7481 version = "3.4.0";
7482 src = fetchurl {
7483 url = "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";
7484 sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==";
7368 7485 };
7369 7486 };
7370 7487 "v8-compile-cache-2.1.0" = {
@@ -7385,13 +7502,13 b' let'
7385 7502 sha512 = "amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==";
7386 7503 };
7387 7504 };
7388 "vendors-1.0.3" = {
7505 "vendors-1.0.4" = {
7389 7506 name = "vendors";
7390 7507 packageName = "vendors";
7391 version = "1.0.3";
7392 src = fetchurl {
7393 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz";
7394 sha512 = "fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==";
7508 version = "1.0.4";
7509 src = fetchurl {
7510 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz";
7511 sha512 = "/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==";
7395 7512 };
7396 7513 };
7397 7514 "verror-1.10.0" = {
@@ -7403,22 +7520,22 b' let'
7403 7520 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
7404 7521 };
7405 7522 };
7406 "vm-browserify-1.1.0" = {
7523 "vm-browserify-1.1.2" = {
7407 7524 name = "vm-browserify";
7408 7525 packageName = "vm-browserify";
7409 version = "1.1.0";
7410 src = fetchurl {
7411 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz";
7412 sha512 = "iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==";
7413 };
7414 };
7415 "watchpack-1.6.0" = {
7526 version = "1.1.2";
7527 src = fetchurl {
7528 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz";
7529 sha512 = "2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==";
7530 };
7531 };
7532 "watchpack-1.6.1" = {
7416 7533 name = "watchpack";
7417 7534 packageName = "watchpack";
7418 version = "1.6.0";
7419 src = fetchurl {
7420 url = "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz";
7421 sha512 = "i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==";
7535 version = "1.6.1";
7536 src = fetchurl {
7537 url = "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz";
7538 sha512 = "+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==";
7422 7539 };
7423 7540 };
7424 7541 "waypoints-4.0.1" = {
@@ -7622,27 +7739,27 b' let'
7622 7739 sources."@polymer/iron-a11y-keys-3.0.1"
7623 7740 sources."@polymer/iron-a11y-keys-behavior-3.0.1"
7624 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 7743 sources."@polymer/iron-behaviors-3.0.1"
7627 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 7746 sources."@polymer/iron-flex-layout-3.0.1"
7630 7747 sources."@polymer/iron-form-element-behavior-3.0.1"
7631 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 7750 sources."@polymer/iron-resizable-behavior-3.0.1"
7634 7751 sources."@polymer/iron-validatable-behavior-3.0.1"
7635 7752 sources."@polymer/paper-behaviors-3.0.1"
7636 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 7755 sources."@polymer/paper-spinner-3.0.2"
7639 7756 sources."@polymer/paper-styles-3.0.1"
7640 7757 sources."@polymer/paper-toast-3.0.1"
7641 7758 sources."@polymer/paper-toggle-button-3.0.1"
7642 7759 sources."@polymer/paper-tooltip-3.0.1"
7643 sources."@polymer/polymer-3.3.0"
7760 sources."@polymer/polymer-3.3.1"
7644 7761 sources."@types/clone-0.1.30"
7645 sources."@types/node-6.14.9"
7762 sources."@types/node-6.14.10"
7646 7763 sources."@types/parse5-2.2.34"
7647 7764 sources."@webassemblyjs/ast-1.7.10"
7648 7765 sources."@webassemblyjs/floating-point-hex-parser-1.7.10"
@@ -7662,12 +7779,12 b' let'
7662 7779 sources."@webassemblyjs/wasm-parser-1.7.10"
7663 7780 sources."@webassemblyjs/wast-parser-1.7.10"
7664 7781 sources."@webassemblyjs/wast-printer-1.7.10"
7665 sources."@webcomponents/shadycss-1.9.2"
7666 sources."@webcomponents/webcomponentsjs-2.3.0"
7782 sources."@webcomponents/shadycss-1.9.6"
7783 sources."@webcomponents/webcomponentsjs-2.4.3"
7667 7784 sources."@xtuc/ieee754-1.2.0"
7668 7785 sources."@xtuc/long-4.2.1"
7669 7786 sources."abbrev-1.1.1"
7670 sources."acorn-5.7.3"
7787 sources."acorn-5.7.4"
7671 7788 sources."acorn-dynamic-import-3.0.0"
7672 7789 (sources."acorn-jsx-3.0.1" // {
7673 7790 dependencies = [
@@ -7727,7 +7844,7 b' let'
7727 7844 ];
7728 7845 })
7729 7846 sources."aws-sign2-0.6.0"
7730 sources."aws4-1.8.0"
7847 sources."aws4-1.9.1"
7731 7848 (sources."babel-code-frame-6.26.0" // {
7732 7849 dependencies = [
7733 7850 sources."ansi-regex-2.1.1"
@@ -7841,7 +7958,8 b' let'
7841 7958 sources."bcrypt-pbkdf-1.0.2"
7842 7959 sources."big.js-5.2.2"
7843 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 7963 sources."bn.js-4.11.8"
7846 7964 sources."boolbase-1.0.0"
7847 7965 sources."boom-2.10.1"
@@ -7859,13 +7977,13 b' let'
7859 7977 sources."browserify-sign-4.0.4"
7860 7978 sources."browserify-zlib-0.2.0"
7861 7979 sources."browserslist-3.2.8"
7862 sources."buffer-4.9.1"
7980 sources."buffer-4.9.2"
7863 7981 sources."buffer-from-1.1.1"
7864 7982 sources."buffer-xor-1.0.3"
7865 7983 sources."builtin-status-codes-3.0.0"
7866 7984 (sources."cacache-10.0.4" // {
7867 7985 dependencies = [
7868 sources."glob-7.1.5"
7986 sources."glob-7.1.6"
7869 7987 sources."graceful-fs-4.2.3"
7870 7988 sources."lru-cache-4.1.5"
7871 7989 sources."minimatch-3.0.4"
@@ -7880,8 +7998,8 b' let'
7880 7998 sources."browserslist-1.7.7"
7881 7999 ];
7882 8000 })
7883 sources."caniuse-db-1.0.30001006"
7884 sources."caniuse-lite-1.0.30001006"
8001 sources."caniuse-db-1.0.30001042"
8002 sources."caniuse-lite-1.0.30001042"
7885 8003 sources."caseless-0.12.0"
7886 8004 sources."center-align-0.1.3"
7887 8005 sources."chalk-0.5.1"
@@ -7890,7 +8008,7 b' let'
7890 8008 sources."is-glob-4.0.1"
7891 8009 ];
7892 8010 })
7893 sources."chownr-1.1.3"
8011 sources."chownr-1.1.4"
7894 8012 sources."chrome-trace-event-1.0.2"
7895 8013 sources."cipher-base-1.0.4"
7896 8014 (sources."clap-1.2.3" // {
@@ -7920,18 +8038,18 b' let'
7920 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 8042 dependencies = [
7925 8043 sources."source-map-0.6.1"
7926 8044 ];
7927 8045 })
7928 8046 (sources."cli-1.0.1" // {
7929 8047 dependencies = [
7930 sources."glob-7.1.5"
8048 sources."glob-7.1.6"
7931 8049 sources."minimatch-3.0.4"
7932 8050 ];
7933 8051 })
7934 sources."clipboard-2.0.4"
8052 sources."clipboard-2.0.6"
7935 8053 (sources."cliui-4.1.0" // {
7936 8054 dependencies = [
7937 8055 sources."ansi-regex-3.0.0"
@@ -7957,21 +8075,21 b' let'
7957 8075 sources."concat-map-0.0.1"
7958 8076 (sources."concat-stream-1.6.2" // {
7959 8077 dependencies = [
7960 sources."readable-stream-2.3.6"
8078 sources."readable-stream-2.3.7"
7961 8079 sources."safe-buffer-5.1.2"
7962 8080 sources."string_decoder-1.1.1"
7963 8081 ];
7964 8082 })
7965 8083 sources."console-browserify-1.1.0"
7966 8084 sources."constants-browserify-1.0.0"
7967 (sources."convert-source-map-1.6.0" // {
8085 (sources."convert-source-map-1.7.0" // {
7968 8086 dependencies = [
7969 8087 sources."safe-buffer-5.1.2"
7970 8088 ];
7971 8089 })
7972 8090 (sources."copy-concurrently-1.0.5" // {
7973 8091 dependencies = [
7974 sources."glob-7.1.5"
8092 sources."glob-7.1.6"
7975 8093 sources."minimatch-3.0.4"
7976 8094 sources."rimraf-2.7.1"
7977 8095 ];
@@ -7983,7 +8101,7 b' let'
7983 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 8105 sources."core-util-is-1.0.2"
7988 8106 sources."create-ecdh-4.0.3"
7989 8107 sources."create-hash-1.2.0"
@@ -7998,13 +8116,16 b' let'
7998 8116 sources."css-color-names-0.0.4"
7999 8117 sources."css-loader-0.28.11"
8000 8118 sources."css-select-1.2.0"
8001 (sources."css-selector-tokenizer-0.7.1" // {
8002 dependencies = [
8003 sources."regexpu-core-1.0.0"
8119 (sources."css-selector-tokenizer-0.7.2" // {
8120 dependencies = [
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 8127 sources."css-what-2.1.3"
8007 sources."cssesc-0.1.0"
8128 sources."cssesc-3.0.0"
8008 8129 sources."cssnano-3.10.0"
8009 8130 sources."csso-2.3.2"
8010 8131 sources."cyclist-1.0.1"
@@ -8024,13 +8145,13 b' let'
8024 8145 sources."defined-1.0.0"
8025 8146 sources."delayed-stream-1.0.0"
8026 8147 sources."delegate-3.2.0"
8027 sources."des.js-1.0.0"
8148 sources."des.js-1.0.1"
8028 8149 sources."detect-file-1.0.0"
8029 8150 sources."detect-indent-4.0.0"
8030 8151 sources."diffie-hellman-5.0.3"
8031 8152 sources."dir-glob-2.2.2"
8032 8153 sources."dom-converter-0.2.0"
8033 (sources."dom-serializer-0.2.1" // {
8154 (sources."dom-serializer-0.2.2" // {
8034 8155 dependencies = [
8035 8156 sources."domelementtype-2.0.1"
8036 8157 sources."entities-2.0.0"
@@ -8046,33 +8167,33 b' let'
8046 8167 sources."domelementtype-1.3.1"
8047 8168 sources."domhandler-2.3.0"
8048 8169 sources."domutils-1.5.1"
8049 sources."dropzone-5.5.1"
8170 sources."dropzone-5.7.0"
8050 8171 sources."duplexer-0.1.1"
8051 8172 (sources."duplexify-3.7.1" // {
8052 8173 dependencies = [
8053 sources."readable-stream-2.3.6"
8174 sources."readable-stream-2.3.7"
8054 8175 sources."safe-buffer-5.1.2"
8055 8176 sources."string_decoder-1.1.1"
8056 8177 ];
8057 8178 })
8058 8179 sources."ecc-jsbn-0.1.2"
8059 sources."electron-to-chromium-1.3.302"
8060 sources."elliptic-6.5.1"
8061 sources."emojis-list-2.1.0"
8180 sources."electron-to-chromium-1.3.412"
8181 sources."elliptic-6.5.2"
8182 sources."emojis-list-3.0.0"
8062 8183 sources."end-of-stream-1.4.4"
8063 8184 (sources."enhanced-resolve-4.1.1" // {
8064 8185 dependencies = [
8065 8186 sources."graceful-fs-4.2.3"
8066 8187 sources."memory-fs-0.5.0"
8067 sources."readable-stream-2.3.6"
8188 sources."readable-stream-2.3.7"
8068 8189 sources."safe-buffer-5.1.2"
8069 8190 sources."string_decoder-1.1.1"
8070 8191 ];
8071 8192 })
8072 8193 sources."entities-1.0.0"
8073 8194 sources."errno-0.1.7"
8074 sources."es-abstract-1.16.0"
8075 sources."es-to-primitive-1.2.0"
8195 sources."es-abstract-1.17.5"
8196 sources."es-to-primitive-1.2.1"
8076 8197 sources."es6-templates-0.2.3"
8077 8198 sources."escape-string-regexp-1.0.5"
8078 8199 sources."eslint-scope-4.0.3"
@@ -8082,7 +8203,7 b' let'
8082 8203 sources."estraverse-4.3.0"
8083 8204 sources."esutils-2.0.3"
8084 8205 sources."eventemitter2-0.4.14"
8085 sources."events-3.0.0"
8206 sources."events-3.1.0"
8086 8207 sources."evp_bytestokey-1.0.3"
8087 8208 sources."execa-1.0.0"
8088 8209 sources."exit-0.1.2"
@@ -8119,13 +8240,14 b' let'
8119 8240 ];
8120 8241 })
8121 8242 sources."extsprintf-1.3.0"
8122 sources."fast-deep-equal-2.0.1"
8123 sources."fast-json-stable-stringify-2.0.0"
8243 sources."fast-deep-equal-3.1.1"
8244 sources."fast-json-stable-stringify-2.1.0"
8124 8245 sources."fastparse-1.1.2"
8125 8246 sources."favico.js-0.3.10"
8126 8247 sources."faye-websocket-0.4.4"
8127 8248 sources."figures-1.7.0"
8128 8249 sources."file-sync-cmp-0.1.1"
8250 sources."file-uri-to-path-1.0.0"
8129 8251 (sources."fill-range-4.0.0" // {
8130 8252 dependencies = [
8131 8253 sources."extend-shallow-2.0.1"
@@ -8145,7 +8267,7 b' let'
8145 8267 sources."flatten-1.0.3"
8146 8268 (sources."flush-write-stream-1.1.1" // {
8147 8269 dependencies = [
8148 sources."readable-stream-2.3.6"
8270 sources."readable-stream-2.3.7"
8149 8271 sources."safe-buffer-5.1.2"
8150 8272 sources."string_decoder-1.1.1"
8151 8273 ];
@@ -8157,7 +8279,7 b' let'
8157 8279 sources."fragment-cache-0.2.1"
8158 8280 (sources."from2-2.3.0" // {
8159 8281 dependencies = [
8160 sources."readable-stream-2.3.6"
8282 sources."readable-stream-2.3.7"
8161 8283 sources."safe-buffer-5.1.2"
8162 8284 sources."string_decoder-1.1.1"
8163 8285 ];
@@ -8168,7 +8290,7 b' let'
8168 8290 ];
8169 8291 })
8170 8292 sources."fs.realpath-1.0.0"
8171 sources."fsevents-1.2.9"
8293 sources."fsevents-1.2.12"
8172 8294 sources."function-bind-1.1.1"
8173 8295 sources."gaze-0.5.2"
8174 8296 sources."get-caller-file-1.0.3"
@@ -8200,7 +8322,7 b' let'
8200 8322 sources."globals-9.18.0"
8201 8323 (sources."globby-7.1.1" // {
8202 8324 dependencies = [
8203 sources."glob-7.1.5"
8325 sources."glob-7.1.6"
8204 8326 sources."minimatch-3.0.4"
8205 8327 ];
8206 8328 })
@@ -8214,7 +8336,7 b' let'
8214 8336 sources."grunt-0.4.5"
8215 8337 (sources."grunt-cli-1.3.2" // {
8216 8338 dependencies = [
8217 sources."nopt-4.0.1"
8339 sources."nopt-4.0.3"
8218 8340 ];
8219 8341 })
8220 8342 (sources."grunt-contrib-concat-0.5.1" // {
@@ -8289,7 +8411,7 b' let'
8289 8411 sources."has-1.0.3"
8290 8412 sources."has-ansi-0.1.0"
8291 8413 sources."has-flag-3.0.0"
8292 sources."has-symbols-1.0.0"
8414 sources."has-symbols-1.0.1"
8293 8415 sources."has-value-1.0.0"
8294 8416 (sources."has-values-1.0.0" // {
8295 8417 dependencies = [
@@ -8321,6 +8443,7 b' let'
8321 8443 (sources."html-webpack-plugin-3.2.0" // {
8322 8444 dependencies = [
8323 8445 sources."big.js-3.2.0"
8446 sources."emojis-list-2.1.0"
8324 8447 sources."json5-0.5.1"
8325 8448 sources."loader-utils-0.2.17"
8326 8449 sources."lodash-4.17.15"
@@ -8348,7 +8471,7 b' let'
8348 8471 dependencies = [
8349 8472 sources."find-up-3.0.0"
8350 8473 sources."locate-path-3.0.0"
8351 sources."p-limit-2.2.1"
8474 sources."p-limit-2.3.0"
8352 8475 sources."p-locate-3.0.0"
8353 8476 sources."p-try-2.2.0"
8354 8477 sources."pkg-dir-3.0.0"
@@ -8368,13 +8491,13 b' let'
8368 8491 sources."is-accessor-descriptor-1.0.0"
8369 8492 sources."is-binary-path-1.0.1"
8370 8493 sources."is-buffer-1.1.6"
8371 sources."is-callable-1.1.4"
8494 sources."is-callable-1.1.5"
8372 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 8497 sources."is-descriptor-1.0.2"
8375 8498 sources."is-extendable-0.1.1"
8376 8499 sources."is-extglob-2.1.1"
8377 sources."is-finite-1.0.2"
8500 sources."is-finite-1.1.0"
8378 8501 sources."is-fullwidth-code-point-1.0.0"
8379 8502 sources."is-glob-3.1.0"
8380 8503 (sources."is-number-3.0.0" // {
@@ -8384,11 +8507,11 b' let'
8384 8507 })
8385 8508 sources."is-plain-obj-1.1.0"
8386 8509 sources."is-plain-object-2.0.4"
8387 sources."is-regex-1.0.4"
8510 sources."is-regex-1.0.5"
8388 8511 sources."is-relative-1.0.0"
8389 8512 sources."is-stream-1.1.0"
8390 8513 sources."is-svg-2.1.0"
8391 sources."is-symbol-1.0.2"
8514 sources."is-symbol-1.0.3"
8392 8515 sources."is-typedarray-1.0.0"
8393 8516 sources."is-unc-path-1.0.0"
8394 8517 sources."is-windows-1.0.2"
@@ -8397,12 +8520,12 b' let'
8397 8520 sources."isobject-3.0.1"
8398 8521 sources."isstream-0.1.2"
8399 8522 sources."jquery-1.11.3"
8400 sources."js-base64-2.5.1"
8523 sources."js-base64-2.5.2"
8401 8524 sources."js-tokens-3.0.2"
8402 8525 sources."js-yaml-2.0.5"
8403 8526 sources."jsbn-0.1.1"
8404 8527 sources."jsesc-1.3.0"
8405 (sources."jshint-2.10.2" // {
8528 (sources."jshint-2.11.0" // {
8406 8529 dependencies = [
8407 8530 sources."lodash-4.17.15"
8408 8531 sources."minimatch-3.0.4"
@@ -8420,7 +8543,7 b' let'
8420 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 8547 sources."lazy-cache-1.0.4"
8425 8548 sources."lcid-2.0.0"
8426 8549 (sources."less-2.7.3" // {
@@ -8434,7 +8557,7 b' let'
8434 8557 ];
8435 8558 })
8436 8559 sources."loader-runner-2.4.0"
8437 sources."loader-utils-1.2.3"
8560 sources."loader-utils-1.4.0"
8438 8561 sources."locate-path-2.0.0"
8439 8562 sources."lodash-0.9.2"
8440 8563 sources."lodash.camelcase-4.3.0"
@@ -8451,7 +8574,7 b' let'
8451 8574 sources."map-cache-0.2.2"
8452 8575 sources."map-visit-1.0.0"
8453 8576 sources."mark.js-8.11.1"
8454 sources."math-expression-evaluator-1.2.17"
8577 sources."math-expression-evaluator-1.2.22"
8455 8578 (sources."maxmin-2.1.0" // {
8456 8579 dependencies = [
8457 8580 sources."ansi-regex-2.1.1"
@@ -8466,7 +8589,7 b' let'
8466 8589 sources."mem-4.3.0"
8467 8590 (sources."memory-fs-0.4.1" // {
8468 8591 dependencies = [
8469 sources."readable-stream-2.3.6"
8592 sources."readable-stream-2.3.7"
8470 8593 sources."safe-buffer-5.1.2"
8471 8594 sources."string_decoder-1.1.1"
8472 8595 ];
@@ -8474,29 +8597,25 b' let'
8474 8597 sources."micromatch-3.1.10"
8475 8598 sources."miller-rabin-4.0.1"
8476 8599 sources."mime-1.6.0"
8477 sources."mime-db-1.40.0"
8478 sources."mime-types-2.1.24"
8600 sources."mime-db-1.43.0"
8601 sources."mime-types-2.1.26"
8479 8602 sources."mimic-fn-2.1.0"
8480 8603 sources."minimalistic-assert-1.0.1"
8481 8604 sources."minimalistic-crypto-utils-1.0.1"
8482 8605 sources."minimatch-0.2.14"
8483 sources."minimist-1.2.0"
8606 sources."minimist-1.2.5"
8484 8607 sources."mississippi-2.0.0"
8485 8608 (sources."mixin-deep-1.3.2" // {
8486 8609 dependencies = [
8487 8610 sources."is-extendable-1.0.1"
8488 8611 ];
8489 8612 })
8490 (sources."mkdirp-0.5.1" // {
8491 dependencies = [
8492 sources."minimist-0.0.8"
8493 ];
8494 })
8613 sources."mkdirp-0.5.5"
8495 8614 sources."moment-2.24.0"
8496 sources."mousetrap-1.6.3"
8615 sources."mousetrap-1.6.5"
8497 8616 (sources."move-concurrently-1.0.1" // {
8498 8617 dependencies = [
8499 sources."glob-7.1.5"
8618 sources."glob-7.1.6"
8500 8619 sources."minimatch-3.0.4"
8501 8620 sources."rimraf-2.7.1"
8502 8621 ];
@@ -8509,7 +8628,7 b' let'
8509 8628 sources."no-case-2.3.2"
8510 8629 (sources."node-libs-browser-2.2.1" // {
8511 8630 dependencies = [
8512 (sources."readable-stream-2.3.6" // {
8631 (sources."readable-stream-2.3.7" // {
8513 8632 dependencies = [
8514 8633 sources."string_decoder-1.1.1"
8515 8634 ];
@@ -8550,11 +8669,12 b' let'
8550 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 8673 sources."object-keys-1.1.1"
8555 8674 sources."object-visit-1.0.1"
8675 sources."object.assign-4.1.0"
8556 8676 sources."object.defaults-1.1.0"
8557 sources."object.getownpropertydescriptors-2.0.3"
8677 sources."object.getownpropertydescriptors-2.1.0"
8558 8678 sources."object.map-1.0.1"
8559 8679 sources."object.pick-1.3.0"
8560 8680 sources."once-1.4.0"
@@ -8569,10 +8689,10 b' let'
8569 8689 sources."p-limit-1.3.0"
8570 8690 sources."p-locate-2.0.0"
8571 8691 sources."p-try-1.0.0"
8572 sources."pako-1.0.10"
8692 sources."pako-1.0.11"
8573 8693 (sources."parallel-transform-1.2.0" // {
8574 8694 dependencies = [
8575 sources."readable-stream-2.3.6"
8695 sources."readable-stream-2.3.7"
8576 8696 sources."safe-buffer-5.1.2"
8577 8697 sources."string_decoder-1.1.1"
8578 8698 ];
@@ -8729,7 +8849,7 b' let'
8729 8849 (sources."readdirp-2.2.1" // {
8730 8850 dependencies = [
8731 8851 sources."graceful-fs-4.2.3"
8732 sources."readable-stream-2.3.6"
8852 sources."readable-stream-2.3.7"
8733 8853 sources."safe-buffer-5.1.2"
8734 8854 sources."string_decoder-1.1.1"
8735 8855 ];
@@ -8747,6 +8867,7 b' let'
8747 8867 })
8748 8868 sources."reduce-function-call-1.0.3"
8749 8869 sources."regenerate-1.4.0"
8870 sources."regenerate-unicode-properties-8.2.0"
8750 8871 sources."regenerator-runtime-0.11.1"
8751 8872 sources."regenerator-transform-0.10.1"
8752 8873 sources."regex-not-1.0.2"
@@ -8771,7 +8892,7 b' let'
8771 8892 sources."request-2.81.0"
8772 8893 sources."require-directory-2.1.1"
8773 8894 sources."require-main-filename-1.0.1"
8774 sources."resolve-1.12.0"
8895 sources."resolve-1.16.0"
8775 8896 sources."resolve-cwd-2.0.0"
8776 8897 sources."resolve-dir-1.0.1"
8777 8898 sources."resolve-from-3.0.0"
@@ -8787,7 +8908,7 b' let'
8787 8908 sources."sax-1.2.4"
8788 8909 (sources."schema-utils-0.4.7" // {
8789 8910 dependencies = [
8790 sources."ajv-6.10.2"
8911 sources."ajv-6.12.0"
8791 8912 ];
8792 8913 })
8793 8914 sources."select-1.1.2"
@@ -8805,7 +8926,7 b' let'
8805 8926 sources."shebang-regex-1.0.0"
8806 8927 sources."shelljs-0.3.0"
8807 8928 sources."sigmund-1.0.1"
8808 sources."signal-exit-3.0.2"
8929 sources."signal-exit-3.0.3"
8809 8930 sources."slash-1.0.0"
8810 8931 (sources."snapdragon-0.8.2" // {
8811 8932 dependencies = [
@@ -8839,7 +8960,7 b' let'
8839 8960 sources."sort-keys-1.1.2"
8840 8961 sources."source-list-map-2.0.1"
8841 8962 sources."source-map-0.5.7"
8842 sources."source-map-resolve-0.5.2"
8963 sources."source-map-resolve-0.5.3"
8843 8964 sources."source-map-support-0.4.18"
8844 8965 sources."source-map-url-0.4.0"
8845 8966 sources."split-string-3.1.0"
@@ -8870,7 +8991,7 b' let'
8870 8991 sources."sticky-sidebar-3.3.1"
8871 8992 (sources."stream-browserify-2.0.2" // {
8872 8993 dependencies = [
8873 sources."readable-stream-2.3.6"
8994 sources."readable-stream-2.3.7"
8874 8995 sources."safe-buffer-5.1.2"
8875 8996 sources."string_decoder-1.1.1"
8876 8997 ];
@@ -8878,12 +8999,12 b' let'
8878 8999 sources."stream-each-1.2.3"
8879 9000 (sources."stream-http-2.8.3" // {
8880 9001 dependencies = [
8881 sources."readable-stream-2.3.6"
9002 sources."readable-stream-2.3.7"
8882 9003 sources."safe-buffer-5.1.2"
8883 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 9008 sources."strict-uri-encode-1.1.0"
8888 9009 (sources."string-width-2.1.1" // {
8889 9010 dependencies = [
@@ -8892,8 +9013,10 b' let'
8892 9013 sources."strip-ansi-4.0.0"
8893 9014 ];
8894 9015 })
8895 sources."string.prototype.trimleft-2.1.0"
8896 sources."string.prototype.trimright-2.1.0"
9016 sources."string.prototype.trimend-1.0.1"
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 9020 sources."string_decoder-0.10.31"
8898 9021 sources."stringstream-0.0.6"
8899 9022 sources."strip-ansi-0.3.0"
@@ -8909,11 +9032,12 b' let'
8909 9032 sources."js-yaml-3.7.0"
8910 9033 ];
8911 9034 })
9035 sources."sweetalert2-9.10.12"
8912 9036 sources."tapable-1.1.3"
8913 9037 sources."through-2.3.8"
8914 9038 (sources."through2-2.0.5" // {
8915 9039 dependencies = [
8916 sources."readable-stream-2.3.6"
9040 sources."readable-stream-2.3.7"
8917 9041 sources."safe-buffer-5.1.2"
8918 9042 sources."string_decoder-1.1.1"
8919 9043 ];
@@ -8942,6 +9066,7 b' let'
8942 9066 dependencies = [
8943 9067 sources."big.js-3.2.0"
8944 9068 sources."colors-1.4.0"
9069 sources."emojis-list-2.1.0"
8945 9070 sources."enhanced-resolve-3.4.1"
8946 9071 sources."graceful-fs-4.2.3"
8947 9072 sources."json5-0.5.1"
@@ -8949,7 +9074,7 b' let'
8949 9074 sources."tapable-0.2.9"
8950 9075 ];
8951 9076 })
8952 sources."tslib-1.10.0"
9077 sources."tslib-1.11.1"
8953 9078 sources."tty-browserify-0.0.0"
8954 9079 sources."tunnel-agent-0.6.0"
8955 9080 sources."tweetnacl-0.14.5"
@@ -8960,11 +9085,7 b' let'
8960 9085 sources."source-map-0.6.1"
8961 9086 ];
8962 9087 })
8963 (sources."uglify-js-3.6.7" // {
8964 dependencies = [
8965 sources."source-map-0.6.1"
8966 ];
8967 })
9088 sources."uglify-js-3.9.1"
8968 9089 sources."uglify-to-browserify-1.0.2"
8969 9090 (sources."uglifyjs-webpack-plugin-1.3.0" // {
8970 9091 dependencies = [
@@ -8974,6 +9095,10 b' let'
8974 9095 sources."unc-path-regex-0.1.2"
8975 9096 sources."underscore-1.7.0"
8976 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 9102 sources."union-value-1.0.1"
8978 9103 sources."uniq-1.0.1"
8979 9104 sources."uniqs-2.0.0"
@@ -9012,17 +9137,17 b' let'
9012 9137 sources."util-deprecate-1.0.2"
9013 9138 sources."util.promisify-1.0.0"
9014 9139 sources."utila-0.4.0"
9015 sources."uuid-3.3.3"
9140 sources."uuid-3.4.0"
9016 9141 sources."v8-compile-cache-2.1.0"
9017 9142 sources."v8flags-3.1.3"
9018 sources."vendors-1.0.3"
9143 sources."vendors-1.0.4"
9019 9144 (sources."verror-1.10.0" // {
9020 9145 dependencies = [
9021 9146 sources."assert-plus-1.0.0"
9022 9147 ];
9023 9148 })
9024 sources."vm-browserify-1.1.0"
9025 (sources."watchpack-1.6.0" // {
9149 sources."vm-browserify-1.1.2"
9150 (sources."watchpack-1.6.1" // {
9026 9151 dependencies = [
9027 9152 sources."graceful-fs-4.2.3"
9028 9153 ];
@@ -9030,7 +9155,7 b' let'
9030 9155 sources."waypoints-4.0.1"
9031 9156 (sources."webpack-4.23.1" // {
9032 9157 dependencies = [
9033 sources."ajv-6.10.2"
9158 sources."ajv-6.12.0"
9034 9159 ];
9035 9160 })
9036 9161 (sources."webpack-cli-3.1.2" // {
@@ -9086,7 +9211,7 b' let'
9086 9211 dependencies = [
9087 9212 sources."find-up-3.0.0"
9088 9213 sources."locate-path-3.0.0"
9089 sources."p-limit-2.2.1"
9214 sources."p-limit-2.3.0"
9090 9215 sources."p-locate-3.0.0"
9091 9216 sources."p-try-2.2.0"
9092 9217 ];
@@ -5,7 +5,7 b''
5 5
6 6 self: super: {
7 7 "alembic" = super.buildPythonPackage {
8 name = "alembic-1.3.1";
8 name = "alembic-1.4.2";
9 9 doCheck = false;
10 10 propagatedBuildInputs = [
11 11 self."sqlalchemy"
@@ -14,8 +14,8 b' self: super: {'
14 14 self."python-dateutil"
15 15 ];
16 16 src = fetchurl {
17 url = "https://files.pythonhosted.org/packages/84/64/493c45119dce700a4b9eeecc436ef9e8835ab67bae6414f040cdc7b58f4b/alembic-1.3.1.tar.gz";
18 sha256 = "1cl2chk5jx0rf4hmsd5lljic7iifw17yv3y5xawvp4i14jvpn9s9";
17 url = "https://files.pythonhosted.org/packages/60/1e/cabc75a189de0fbb2841d0975243e59bde8b7822bacbb95008ac6fe9ad47/alembic-1.4.2.tar.gz";
18 sha256 = "1gsdrzx9h7wfva200qvvsc9sn4w79mk2vs0bbnzjhxi1jw2b0nh3";
19 19 };
20 20 meta = {
21 21 license = [ pkgs.lib.licenses.mit ];
@@ -146,15 +146,15 b' self: super: {'
146 146 };
147 147 };
148 148 "bleach" = super.buildPythonPackage {
149 name = "bleach-3.1.0";
149 name = "bleach-3.1.3";
150 150 doCheck = false;
151 151 propagatedBuildInputs = [
152 152 self."six"
153 153 self."webencodings"
154 154 ];
155 155 src = fetchurl {
156 url = "https://files.pythonhosted.org/packages/78/5a/0df03e8735cd9c75167528299c738702437589b9c71a849489d00ffa82e8/bleach-3.1.0.tar.gz";
157 sha256 = "1yhrgrhkln8bd6gn3imj69g1h4xqah9gaz9q26crqr6gmmvpzprz";
156 url = "https://files.pythonhosted.org/packages/de/09/5267f8577a92487ed43bc694476c4629c6eca2e3c93fcf690a26bfe39e1d/bleach-3.1.3.tar.gz";
157 sha256 = "0al437aw4p2xp83az5hhlrp913nsf0cg6kg4qj3fjhv4wakxipzq";
158 158 };
159 159 meta = {
160 160 license = [ pkgs.lib.licenses.asl20 ];
@@ -171,6 +171,17 b' self: super: {'
171 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 185 "celery" = super.buildPythonPackage {
175 186 name = "celery-4.3.0";
176 187 doCheck = false;
@@ -189,11 +200,11 b' self: super: {'
189 200 };
190 201 };
191 202 "certifi" = super.buildPythonPackage {
192 name = "certifi-2019.11.28";
203 name = "certifi-2020.4.5.1";
193 204 doCheck = false;
194 205 src = fetchurl {
195 url = "https://files.pythonhosted.org/packages/41/bf/9d214a5af07debc6acf7f3f257265618f1db242a3f8e49a9b516f24523a6/certifi-2019.11.28.tar.gz";
196 sha256 = "07qg6864bk4qxa8akr967amlmsq9v310hp039mcpjx6dliylrdi5";
206 url = "https://files.pythonhosted.org/packages/b8/e2/a3a86a67c3fc8249ed305fc7b7d290ebe5e4d46ad45573884761ef4dea7b/certifi-2020.4.5.1.tar.gz";
207 sha256 = "06b5gfs7wmmipln8f3z928d2mmx2j4b3x7pnqmj6cvmyfh8v7z2i";
197 208 };
198 209 meta = {
199 210 license = [ pkgs.lib.licenses.mpl20 { fullName = "Mozilla Public License 2.0 (MPL 2.0)"; } ];
@@ -372,6 +383,17 b' self: super: {'
372 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 397 "decorator" = super.buildPythonPackage {
376 398 name = "decorator-4.1.2";
377 399 doCheck = false;
@@ -429,11 +451,11 b' self: super: {'
429 451 };
430 452 };
431 453 "docutils" = super.buildPythonPackage {
432 name = "docutils-0.14";
454 name = "docutils-0.16";
433 455 doCheck = false;
434 456 src = fetchurl {
435 url = "https://files.pythonhosted.org/packages/84/f4/5771e41fdf52aabebbadecc9381d11dea0fa34e4759b4071244fa094804c/docutils-0.14.tar.gz";
436 sha256 = "0x22fs3pdmr42kvz6c654756wja305qv6cx1zbhwlagvxgr4xrji";
457 url = "https://files.pythonhosted.org/packages/2f/e0/3d435b34abd2d62e8206171892f174b180cd37b09d57b924ca5c2ef2219d/docutils-0.16.tar.gz";
458 sha256 = "1z3qliszqca9m719q3qhdkh0ghh90g500avzdgi7pl77x5h3mpn2";
437 459 };
438 460 meta = {
439 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 589 "enum34" = super.buildPythonPackage {
568 name = "enum34-1.1.6";
590 name = "enum34-1.1.10";
569 591 doCheck = false;
570 592 src = fetchurl {
571 url = "https://files.pythonhosted.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz";
572 sha256 = "1cgm5ng2gcfrkrm3hc22brl6chdmv67b9zvva9sfs7gn7dwc9n4a";
593 url = "https://files.pythonhosted.org/packages/11/c4/2da1f4952ba476677a42f25cd32ab8aaf0e1c0d0e00b89822b835c7e654c/enum34-1.1.10.tar.gz";
594 sha256 = "0j7ji699fwswm4vg6w1v07fkbf8dkzdm6gfh88jvs5nqgr3sgrnc";
573 595 };
574 596 meta = {
575 597 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -631,14 +653,14 b' self: super: {'
631 653 };
632 654 };
633 655 "gevent" = super.buildPythonPackage {
634 name = "gevent-1.4.0";
656 name = "gevent-1.5.0";
635 657 doCheck = false;
636 658 propagatedBuildInputs = [
637 659 self."greenlet"
638 660 ];
639 661 src = fetchurl {
640 url = "https://files.pythonhosted.org/packages/ed/27/6c49b70808f569b66ec7fac2e78f076e9b204db9cf5768740cff3d5a07ae/gevent-1.4.0.tar.gz";
641 sha256 = "1lchr4akw2jkm5v4kz7bdm4wv3knkfhbfn9vkkz4s5yrkcxzmdqy";
662 url = "https://files.pythonhosted.org/packages/5a/79/2c63d385d017b5dd7d70983a463dfd25befae70c824fedb857df6e72eff2/gevent-1.5.0.tar.gz";
663 sha256 = "0aac3d4vhv5n4rsb6cqzq0d1xx9immqz4fmpddw35yxkwdc450dj";
642 664 };
643 665 meta = {
644 666 license = [ pkgs.lib.licenses.mit ];
@@ -689,11 +711,11 b' self: super: {'
689 711 };
690 712 };
691 713 "hupper" = super.buildPythonPackage {
692 name = "hupper-1.9.1";
714 name = "hupper-1.10.2";
693 715 doCheck = false;
694 716 src = fetchurl {
695 url = "https://files.pythonhosted.org/packages/09/3a/4f215659f31eeffe364a984dba486bfa3907bfcc54b7013bdfe825cebb5f/hupper-1.9.1.tar.gz";
696 sha256 = "0pyg879fv9mbwlnbzw2a3234qqycqs9l97h5mpkmk0bvxhi2471v";
717 url = "https://files.pythonhosted.org/packages/41/24/ea90fef04706e54bd1635c05c50dc9cf87cda543c59303a03e7aa7dda0ce/hupper-1.10.2.tar.gz";
718 sha256 = "0am0p6g5cz6xmcaf04xq8q6dzdd9qz0phj6gcmpsckf2mcyza61q";
697 719 };
698 720 meta = {
699 721 license = [ pkgs.lib.licenses.mit ];
@@ -711,17 +733,17 b' self: super: {'
711 733 };
712 734 };
713 735 "importlib-metadata" = super.buildPythonPackage {
714 name = "importlib-metadata-0.23";
736 name = "importlib-metadata-1.6.0";
715 737 doCheck = false;
716 738 propagatedBuildInputs = [
717 739 self."zipp"
740 self."pathlib2"
718 741 self."contextlib2"
719 742 self."configparser"
720 self."pathlib2"
721 743 ];
722 744 src = fetchurl {
723 url = "https://files.pythonhosted.org/packages/5d/44/636bcd15697791943e2dedda0dbe098d8530a38d113b202817133e0b06c0/importlib_metadata-0.23.tar.gz";
724 sha256 = "09mdqdfv5rdrwz80jh9m379gxmvk2vhjfz0fg53hid00icvxf65a";
745 url = "https://files.pythonhosted.org/packages/b4/1b/baab42e3cd64c9d5caac25a9d6c054f8324cdc38975a44d600569f1f7158/importlib_metadata-1.6.0.tar.gz";
746 sha256 = "07icyggasn38yv2swdrd8z6i0plazmc9adavsdkbqqj91j53ll9l";
725 747 };
726 748 meta = {
727 749 license = [ pkgs.lib.licenses.asl20 ];
@@ -765,15 +787,15 b' self: super: {'
765 787 };
766 788 };
767 789 "ipdb" = super.buildPythonPackage {
768 name = "ipdb-0.12";
790 name = "ipdb-0.13.2";
769 791 doCheck = false;
770 792 propagatedBuildInputs = [
771 793 self."setuptools"
772 794 self."ipython"
773 795 ];
774 796 src = fetchurl {
775 url = "https://files.pythonhosted.org/packages/6d/43/c3c2e866a8803e196d6209595020a4a6db1a3c5d07c01455669497ae23d0/ipdb-0.12.tar.gz";
776 sha256 = "1khr2n7xfy8hg65kj1bsrjq9g7656pp0ybfa8abpbzpdawji3qnw";
797 url = "https://files.pythonhosted.org/packages/2c/bb/a3e1a441719ebd75c6dac8170d3ddba884b7ee8a5c0f9aefa7297386627a/ipdb-0.13.2.tar.gz";
798 sha256 = "0jcd849rx30y3wcgzsqbn06v0yjlzvb9x3076q0yxpycdwm1ryvp";
777 799 };
778 800 meta = {
779 801 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -1074,15 +1096,15 b' self: super: {'
1074 1096 };
1075 1097 };
1076 1098 "packaging" = super.buildPythonPackage {
1077 name = "packaging-19.2";
1099 name = "packaging-20.3";
1078 1100 doCheck = false;
1079 1101 propagatedBuildInputs = [
1080 1102 self."pyparsing"
1081 1103 self."six"
1082 1104 ];
1083 1105 src = fetchurl {
1084 url = "https://files.pythonhosted.org/packages/5a/2f/449ded84226d0e2fda8da9252e5ee7731bdf14cd338f622dfcd9934e0377/packaging-19.2.tar.gz";
1085 sha256 = "0izwlz9h0bw171a1chr311g2y7n657zjaf4mq4rgm8pp9lbj9f98";
1106 url = "https://files.pythonhosted.org/packages/65/37/83e3f492eb52d771e2820e88105f605335553fe10422cba9d256faeb1702/packaging-20.3.tar.gz";
1107 sha256 = "18xpablq278janh03bai9xd4kz9b0yfp6vflazn725ns9x3jna9w";
1086 1108 };
1087 1109 meta = {
1088 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 1124 "paste" = super.buildPythonPackage {
1103 name = "paste-3.2.1";
1125 name = "paste-3.4.0";
1104 1126 doCheck = false;
1105 1127 propagatedBuildInputs = [
1106 1128 self."six"
1107 1129 ];
1108 1130 src = fetchurl {
1109 url = "https://files.pythonhosted.org/packages/0d/86/7008b5563594e8a63763f05212a3eb84c85f0b2eff834e5697716e56bca9/Paste-3.2.1.tar.gz";
1110 sha256 = "1vjxr8n1p31c9x9rh8g0f34yisa9028cxpvn36q7g1s0m2b9x71x";
1131 url = "https://files.pythonhosted.org/packages/79/4a/45821b71dd40000507549afd1491546afad8279c0a87527c88776a794158/Paste-3.4.0.tar.gz";
1132 sha256 = "16sichvhyci1gaarkjs35mai8vphh7b244qm14hj1isw38nx4c03";
1111 1133 };
1112 1134 meta = {
1113 1135 license = [ pkgs.lib.licenses.mit ];
1114 1136 };
1115 1137 };
1116 1138 "pastedeploy" = super.buildPythonPackage {
1117 name = "pastedeploy-2.0.1";
1139 name = "pastedeploy-2.1.0";
1118 1140 doCheck = false;
1119 1141 src = fetchurl {
1120 url = "https://files.pythonhosted.org/packages/19/a0/5623701df7e2478a68a1b685d1a84518024eef994cde7e4da8449a31616f/PasteDeploy-2.0.1.tar.gz";
1121 sha256 = "02imfbbx1mi2h546f3sr37m47dk9qizaqhzzlhx8bkzxa6fzn8yl";
1142 url = "https://files.pythonhosted.org/packages/c4/e9/972a1c20318b3ae9edcab11a6cef64308fbae5d0d45ab52c6f8b2b8f35b8/PasteDeploy-2.1.0.tar.gz";
1143 sha256 = "16qsq5y6mryslmbp5pn35x4z8z3ndp5rpgl42h226879nrw9hmg7";
1122 1144 };
1123 1145 meta = {
1124 1146 license = [ pkgs.lib.licenses.mit ];
@@ -1167,14 +1189,14 b' self: super: {'
1167 1189 };
1168 1190 };
1169 1191 "pexpect" = super.buildPythonPackage {
1170 name = "pexpect-4.7.0";
1192 name = "pexpect-4.8.0";
1171 1193 doCheck = false;
1172 1194 propagatedBuildInputs = [
1173 1195 self."ptyprocess"
1174 1196 ];
1175 1197 src = fetchurl {
1176 url = "https://files.pythonhosted.org/packages/1c/b1/362a0d4235496cb42c33d1d8732b5e2c607b0129ad5fdd76f5a583b9fcb3/pexpect-4.7.0.tar.gz";
1177 sha256 = "1sv2rri15zwhds85a4kamwh9pj49qcxv7m4miyr4jfpfwv81yb4y";
1198 url = "https://files.pythonhosted.org/packages/e5/9b/ff402e0e930e70467a7178abb7c128709a30dfb22d8777c043e501bc1b10/pexpect-4.8.0.tar.gz";
1199 sha256 = "032cg337h8awydgypz6f4wx848lw8dyrj4zy988x0lyib4ws8rgw";
1178 1200 };
1179 1201 meta = {
1180 1202 license = [ pkgs.lib.licenses.isc { fullName = "ISC License (ISCL)"; } ];
@@ -1237,6 +1259,24 b' self: super: {'
1237 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 1280 "prompt-toolkit" = super.buildPythonPackage {
1241 1281 name = "prompt-toolkit-1.0.18";
1242 1282 doCheck = false;
@@ -1253,11 +1293,11 b' self: super: {'
1253 1293 };
1254 1294 };
1255 1295 "psutil" = super.buildPythonPackage {
1256 name = "psutil-5.6.5";
1296 name = "psutil-5.7.0";
1257 1297 doCheck = false;
1258 1298 src = fetchurl {
1259 url = "https://files.pythonhosted.org/packages/03/9a/95c4b3d0424426e5fd94b5302ff74cea44d5d4f53466e1228ac8e73e14b4/psutil-5.6.5.tar.gz";
1260 sha256 = "0isil5jxwwd8awz54qk28rpgjg43i5l6yl70g40vxwa4r4m56lfh";
1299 url = "https://files.pythonhosted.org/packages/c4/b8/3512f0e93e0db23a71d82485ba256071ebef99b227351f0f5540f744af41/psutil-5.7.0.tar.gz";
1300 sha256 = "03jykdi3dgf1cdal9bv4fq9zjvzj9l9bs99gi5ar81sdl5nc2pk8";
1261 1301 };
1262 1302 meta = {
1263 1303 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -1348,11 +1388,11 b' self: super: {'
1348 1388 };
1349 1389 };
1350 1390 "pycparser" = super.buildPythonPackage {
1351 name = "pycparser-2.19";
1391 name = "pycparser-2.20";
1352 1392 doCheck = false;
1353 1393 src = fetchurl {
1354 url = "https://files.pythonhosted.org/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz";
1355 sha256 = "1cr5dcj9628lkz1qlwq3fv97c25363qppkmcayqvd05dpy573259";
1394 url = "https://files.pythonhosted.org/packages/0f/86/e19659527668d70be91d0369aeaa055b4eb396b0f387a4f92293a20035bd/pycparser-2.20.tar.gz";
1395 sha256 = "1w0m3xvlrzq4lkbvd1ngfm8mdw64r1yxy6n7djlw6qj5d0km6ird";
1356 1396 };
1357 1397 meta = {
1358 1398 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -1414,11 +1454,11 b' self: super: {'
1414 1454 };
1415 1455 };
1416 1456 "pyparsing" = super.buildPythonPackage {
1417 name = "pyparsing-2.4.5";
1457 name = "pyparsing-2.4.7";
1418 1458 doCheck = false;
1419 1459 src = fetchurl {
1420 url = "https://files.pythonhosted.org/packages/00/32/8076fa13e832bb4dcff379f18f228e5a53412be0631808b9ca2610c0f566/pyparsing-2.4.5.tar.gz";
1421 sha256 = "0fk8gsybiw1gm146mkjdjvaajwh20xwvpv4j7syh2zrnpq0j19jc";
1460 url = "https://files.pythonhosted.org/packages/c1/47/dfc9c342c9842bbe0036c7f763d2d6686bcf5eb1808ba3e170afdb282210/pyparsing-2.4.7.tar.gz";
1461 sha256 = "1hgc8qrbq1ymxbwfbjghv01fm3fbpjwpjwi0bcailxxzhf3yq0y2";
1422 1462 };
1423 1463 meta = {
1424 1464 license = [ pkgs.lib.licenses.mit ];
@@ -1448,7 +1488,7 b' self: super: {'
1448 1488 };
1449 1489 };
1450 1490 "pyramid-debugtoolbar" = super.buildPythonPackage {
1451 name = "pyramid-debugtoolbar-4.5.1";
1491 name = "pyramid-debugtoolbar-4.6.1";
1452 1492 doCheck = false;
1453 1493 propagatedBuildInputs = [
1454 1494 self."pyramid"
@@ -1458,8 +1498,8 b' self: super: {'
1458 1498 self."ipaddress"
1459 1499 ];
1460 1500 src = fetchurl {
1461 url = "https://files.pythonhosted.org/packages/88/21/74e7fa52edc74667e29403bd0cb4f2bb74dc4014711de313868001bf639f/pyramid_debugtoolbar-4.5.1.tar.gz";
1462 sha256 = "0hgf6i1fzvq43m9vjdmb24nnv8fwp7sdzrx9bcwrgpy24n07am9a";
1501 url = "https://files.pythonhosted.org/packages/99/f6/b8603f82c18275be293921bc3a2184205056ca505747bf64ab8a0c08e124/pyramid_debugtoolbar-4.6.1.tar.gz";
1502 sha256 = "185z7q8n959ga5331iczwra2iljwkidfx4qn6bbd7vm3rm4w6llv";
1463 1503 };
1464 1504 meta = {
1465 1505 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
@@ -1646,15 +1686,15 b' self: super: {'
1646 1686 };
1647 1687 };
1648 1688 "python-ldap" = super.buildPythonPackage {
1649 name = "python-ldap-3.1.0";
1689 name = "python-ldap-3.2.0";
1650 1690 doCheck = false;
1651 1691 propagatedBuildInputs = [
1652 1692 self."pyasn1"
1653 1693 self."pyasn1-modules"
1654 1694 ];
1655 1695 src = fetchurl {
1656 url = "https://files.pythonhosted.org/packages/7f/1c/28d721dff2fcd2fef9d55b40df63a00be26ec8a11e8c6fc612ae642f9cfd/python-ldap-3.1.0.tar.gz";
1657 sha256 = "1i97nwfnraylyn0myxlf3vciicrf5h6fymrcff9c00k581wmx5s1";
1696 url = "https://files.pythonhosted.org/packages/ea/93/596f875e003c770447f4b99267820a0c769dd2dc3ae3ed19afe460fcbad0/python-ldap-3.2.0.tar.gz";
1697 sha256 = "13nvrhp85yr0jyxixcjj012iw8l9wynxxlykm9j3alss6waln73x";
1658 1698 };
1659 1699 meta = {
1660 1700 license = [ pkgs.lib.licenses.psfl ];
@@ -1702,11 +1742,11 b' self: super: {'
1702 1742 };
1703 1743 };
1704 1744 "pytz" = super.buildPythonPackage {
1705 name = "pytz-2019.2";
1745 name = "pytz-2019.3";
1706 1746 doCheck = false;
1707 1747 src = fetchurl {
1708 url = "https://files.pythonhosted.org/packages/27/c0/fbd352ca76050952a03db776d241959d5a2ee1abddfeb9e2a53fdb489be4/pytz-2019.2.tar.gz";
1709 sha256 = "0ckb27hhjc8i8gcdvk4d9avld62b7k52yjijc60s2m3y8cpb7h16";
1748 url = "https://files.pythonhosted.org/packages/82/c3/534ddba230bd4fbbd3b7a3d35f3341d014cca213f369a9940925e7e5f691/pytz-2019.3.tar.gz";
1749 sha256 = "1ghrk1wg45d3nymj7bf4zj03n3bh64xmczhk4pfi577hdkdhcb5h";
1710 1750 };
1711 1751 meta = {
1712 1752 license = [ pkgs.lib.licenses.mit ];
@@ -1724,11 +1764,11 b' self: super: {'
1724 1764 };
1725 1765 };
1726 1766 "redis" = super.buildPythonPackage {
1727 name = "redis-3.3.11";
1767 name = "redis-3.4.1";
1728 1768 doCheck = false;
1729 1769 src = fetchurl {
1730 url = "https://files.pythonhosted.org/packages/06/ca/00557c74279d2f256d3c42cabf237631355f3a132e4c74c2000e6647ad98/redis-3.3.11.tar.gz";
1731 sha256 = "1hicqbi5xl92hhml82awrr2rxl9jar5fp8nbcycj9qgmsdwc43wd";
1770 url = "https://files.pythonhosted.org/packages/ef/2e/2c0f59891db7db087a7eeaa79bc7c7f2c039e71a2b5b0a41391e9d462926/redis-3.4.1.tar.gz";
1771 sha256 = "07yaj0j9fs7xdkg5bg926fa990khyigjbp31si8ai20vj8sv7kqd";
1732 1772 };
1733 1773 meta = {
1734 1774 license = [ pkgs.lib.licenses.mit ];
@@ -1779,7 +1819,7 b' self: super: {'
1779 1819 };
1780 1820 };
1781 1821 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1782 name = "rhodecode-enterprise-ce-4.18.3";
1822 name = "rhodecode-enterprise-ce-4.19.0";
1783 1823 buildInputs = [
1784 1824 self."pytest"
1785 1825 self."py"
@@ -1833,6 +1873,7 b' self: super: {'
1833 1873 self."pastedeploy"
1834 1874 self."pastescript"
1835 1875 self."peppercorn"
1876 self."premailer"
1836 1877 self."psutil"
1837 1878 self."py-bcrypt"
1838 1879 self."pycurl"
@@ -1976,11 +2017,11 b' self: super: {'
1976 2017 };
1977 2018 };
1978 2019 "setuptools" = super.buildPythonPackage {
1979 name = "setuptools-44.0.0";
2020 name = "setuptools-44.1.0";
1980 2021 doCheck = false;
1981 2022 src = fetchurl {
1982 url = "https://files.pythonhosted.org/packages/b0/f3/44da7482ac6da3f36f68e253cb04de37365b3dba9036a3c70773b778b485/setuptools-44.0.0.zip";
1983 sha256 = "025h5cnxcmda1893l6i12hrwdvs1n8r31qs6q4pkif2v7rrggfp5";
2023 url = "https://files.pythonhosted.org/packages/ed/7b/bbf89ca71e722b7f9464ebffe4b5ee20a9e5c9a555a56e2d3914bb9119a6/setuptools-44.1.0.zip";
2024 sha256 = "1jja896zvd1ppccnjbhkgagxbwchgq6vfamp6qn1hvywq6q9cjkr";
1984 2025 };
1985 2026 meta = {
1986 2027 license = [ pkgs.lib.licenses.mit ];
@@ -2020,11 +2061,11 b' self: super: {'
2020 2061 };
2021 2062 };
2022 2063 "sqlalchemy" = super.buildPythonPackage {
2023 name = "sqlalchemy-1.3.11";
2064 name = "sqlalchemy-1.3.15";
2024 2065 doCheck = false;
2025 2066 src = fetchurl {
2026 url = "https://files.pythonhosted.org/packages/34/5c/0e1d7ad0ca52544bb12f9cb8d5cc454af45821c92160ffedd38db0a317f6/SQLAlchemy-1.3.11.tar.gz";
2027 sha256 = "12izpqqgy738ndn7qqn962qxi8qw2xb9vg2i880x12paklg599dg";
2067 url = "https://files.pythonhosted.org/packages/8c/30/4134e726dd5ed13728ff814fa91fc01c447ad8700504653fe99d91fdd34b/SQLAlchemy-1.3.15.tar.gz";
2068 sha256 = "0iglkvymfp35zm5pxy5kzqvcv96kkas0chqdx7xpla86sspa9k64";
2028 2069 };
2029 2070 meta = {
2030 2071 license = [ pkgs.lib.licenses.mit ];
@@ -2212,11 +2253,11 b' self: super: {'
2212 2253 };
2213 2254 };
2214 2255 "wcwidth" = super.buildPythonPackage {
2215 name = "wcwidth-0.1.7";
2256 name = "wcwidth-0.1.9";
2216 2257 doCheck = false;
2217 2258 src = fetchurl {
2218 url = "https://files.pythonhosted.org/packages/55/11/e4a2bb08bb450fdbd42cc709dd40de4ed2c472cf0ccb9e64af22279c5495/wcwidth-0.1.7.tar.gz";
2219 sha256 = "0pn6dflzm609m4r3i8ik5ni9ijjbb5fa3vg1n7hn6vkd49r77wrx";
2259 url = "https://files.pythonhosted.org/packages/25/9d/0acbed6e4a4be4fc99148f275488580968f44ddb5e69b8ceb53fc9df55a0/wcwidth-0.1.9.tar.gz";
2260 sha256 = "1wf5ycjx8s066rdvr0fgz4xds9a8zhs91c4jzxvvymm1c8l8cwzf";
2220 2261 };
2221 2262 meta = {
2222 2263 license = [ pkgs.lib.licenses.mit ];
@@ -2234,7 +2275,7 b' self: super: {'
2234 2275 };
2235 2276 };
2236 2277 "weberror" = super.buildPythonPackage {
2237 name = "weberror-0.10.3";
2278 name = "weberror-0.13.1";
2238 2279 doCheck = false;
2239 2280 propagatedBuildInputs = [
2240 2281 self."webob"
@@ -2243,8 +2284,8 b' self: super: {'
2243 2284 self."paste"
2244 2285 ];
2245 2286 src = fetchurl {
2246 url = "https://files.pythonhosted.org/packages/35/76/e7e5c2ce7e9c7f31b54c1ff295a495886d1279a002557d74dd8957346a79/WebError-0.10.3.tar.gz";
2247 sha256 = "0frg4kvycqpj5bi8asfqfs6bxsr2cvjvb6b56c4d1ai1z57kbjx6";
2287 url = "https://files.pythonhosted.org/packages/07/0a/09ca5eb0fab5c0d17b380026babe81c96ecebb13f2b06c3203432dd7be72/WebError-0.13.1.tar.gz";
2288 sha256 = "0r4qvnf2r92gfnpa1kwygh4j2x6j3axg2i4an6hyxwg2gpaqp7y1";
2248 2289 };
2249 2290 meta = {
2250 2291 license = [ pkgs.lib.licenses.mit ];
@@ -2277,7 +2318,7 b' self: super: {'
2277 2318 };
2278 2319 };
2279 2320 "webtest" = super.buildPythonPackage {
2280 name = "webtest-2.0.33";
2321 name = "webtest-2.0.34";
2281 2322 doCheck = false;
2282 2323 propagatedBuildInputs = [
2283 2324 self."six"
@@ -2286,8 +2327,8 b' self: super: {'
2286 2327 self."beautifulsoup4"
2287 2328 ];
2288 2329 src = fetchurl {
2289 url = "https://files.pythonhosted.org/packages/a8/b0/ffc9413b637dbe26e291429bb0f6ed731e518d0cd03da28524a8fe2e8a8f/WebTest-2.0.33.tar.gz";
2290 sha256 = "1l3z0cwqslsf4rcrhi2gr8kdfh74wn2dw76376i4g9i38gz8wd21";
2330 url = "https://files.pythonhosted.org/packages/2c/74/a0e63feee438735d628631e2b70d82280276a930637ac535479e5fad9427/WebTest-2.0.34.tar.gz";
2331 sha256 = "0x1y2c8z4fmpsny4hbp6ka37si2g10r5r2jwxhvv5mx7g3blq4bi";
2291 2332 };
2292 2333 meta = {
2293 2334 license = [ pkgs.lib.licenses.mit ];
@@ -2327,14 +2368,14 b' self: super: {'
2327 2368 };
2328 2369 };
2329 2370 "zipp" = super.buildPythonPackage {
2330 name = "zipp-0.6.0";
2371 name = "zipp-1.2.0";
2331 2372 doCheck = false;
2332 2373 propagatedBuildInputs = [
2333 self."more-itertools"
2374 self."contextlib2"
2334 2375 ];
2335 2376 src = fetchurl {
2336 url = "https://files.pythonhosted.org/packages/57/dd/585d728479d97d25aeeb9aa470d36a4ad8d0ba5610f84e14770128ce6ff7/zipp-0.6.0.tar.gz";
2337 sha256 = "13ndkf7vklw978a4gdl1yfvn8hch28429a0iam67sg4nrp5v261p";
2377 url = "https://files.pythonhosted.org/packages/78/08/d52f0ea643bc1068d6dc98b412f4966a9b63255d20911a23ac3220c033c4/zipp-1.2.0.tar.gz";
2378 sha256 = "1c91lnv1bxjimh8as27hz7bghsjkkbxn1d37xq7in9c82iai0167";
2338 2379 };
2339 2380 meta = {
2340 2381 license = [ pkgs.lib.licenses.mit ];
@@ -3,7 +3,7 b''
3 3 amqp==2.5.2
4 4 babel==1.3
5 5 beaker==1.9.1
6 bleach==3.1.0
6 bleach==3.1.3
7 7 celery==4.3.0
8 8 channelstream==0.5.2
9 9 click==7.0
@@ -14,7 +14,7 b' cssselect==1.0.3'
14 14 cryptography==2.6.1
15 15 decorator==4.1.2
16 16 deform==2.0.8
17 docutils==0.14.0
17 docutils==0.16.0
18 18 dogpile.cache==0.9.0
19 19 dogpile.core==0.4.1
20 20 formencode==1.2.4
@@ -30,38 +30,39 b' markdown==2.6.11'
30 30 markupsafe==1.1.1
31 31 msgpack-python==0.5.6
32 32 pyotp==2.3.0
33 packaging==19.2
33 packaging==20.3
34 34 pathlib2==2.3.5
35 paste==3.2.1
36 pastedeploy==2.0.1
35 paste==3.4.0
36 pastedeploy==2.1.0
37 37 pastescript==3.2.0
38 38 peppercorn==0.6
39 psutil==5.6.5
39 premailer==3.6.1
40 psutil==5.7.0
40 41 py-bcrypt==0.4
41 42 pycurl==7.43.0.3
42 43 pycrypto==2.6.1
43 44 pygments==2.4.2
44 pyparsing==2.4.5
45 pyramid-debugtoolbar==4.5.1
45 pyparsing==2.4.7
46 pyramid-debugtoolbar==4.6.1
46 47 pyramid-mako==1.1.0
47 48 pyramid==1.10.4
48 49 pyramid_mailer==0.15.1
49 50 python-dateutil==2.8.1
50 python-ldap==3.1.0
51 python-ldap==3.2.0
51 52 python-memcached==1.59
52 53 python-pam==1.8.4
53 54 python-saml==2.4.2
54 pytz==2019.2
55 pytz==2019.3
55 56 tzlocal==1.5.1
56 57 pyzmq==14.6.0
57 58 py-gfm==0.1.4
58 redis==3.3.11
59 redis==3.4.1
59 60 repoze.lru==0.7
60 61 requests==2.22.0
61 62 routes==2.4.1
62 63 simplejson==3.16.0
63 64 six==1.11.0
64 sqlalchemy==1.3.11
65 sqlalchemy==1.3.15
65 66 sshpubkeys==3.1.0
66 67 subprocess32==3.5.4
67 68 supervisor==4.1.0
@@ -69,7 +70,7 b' translationstring==1.3'
69 70 urllib3==1.25.2
70 71 urlobject==2.4.3
71 72 venusian==1.2.0
72 weberror==0.10.3
73 weberror==0.13.1
73 74 webhelpers2==2.0
74 75 webob==1.8.5
75 76 whoosh==2.7.4
@@ -94,18 +95,18 b' jupyter-client==5.0.0'
94 95 jupyter-core==4.5.0
95 96
96 97 ## cli tools
97 alembic==1.3.1
98 alembic==1.4.2
98 99 invoke==0.13.0
99 100 bumpversion==0.5.3
100 101
101 102 ## http servers
102 gevent==1.4.0
103 gevent==1.5.0
103 104 greenlet==0.4.15
104 105 gunicorn==19.9.0
105 106 waitress==1.3.1
106 107
107 108 ## debug
108 ipdb==0.12.0
109 ipdb==0.13.2
109 110 ipython==5.1.0
110 111
111 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 10 contextlib2==0.6.0.post1
11 11 ecdsa==0.13.2
12 12 gnureadline==6.3.8
13 hupper==1.9.1
13 hupper==1.10.2
14 14 ipaddress==1.0.23
15 importlib-metadata==0.23
15 importlib-metadata==1.6.0
16 16 jinja2==2.9.6
17 17 jsonschema==2.6.0
18 18 pluggy==0.13.1
@@ -24,4 +24,4 b' tempita==0.5.2'
24 24 testpath==0.4.4
25 25 transaction==2.4.0
26 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 12 cov-core==1.15.0
13 13 coverage==4.5.4
14 14
15 webtest==2.0.33
15 webtest==2.0.34
16 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 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,17 +19,20 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import os
22 from collections import OrderedDict
23
22 24 import sys
23 25 import platform
24 26
25 27 VERSION = tuple(open(os.path.join(
26 28 os.path.dirname(__file__), 'VERSION')).read().split('.'))
27 29
28 BACKENDS = {
29 'hg': 'Mercurial repository',
30 'git': 'Git repository',
31 'svn': 'Subversion repository',
32 }
30 BACKENDS = OrderedDict()
31
32 BACKENDS['hg'] = 'Mercurial repository'
33 BACKENDS['git'] = 'Git repository'
34 BACKENDS['svn'] = 'Subversion repository'
35
33 36
34 37 CELERY_ENABLED = False
35 38 CELERY_EAGER = False
@@ -45,7 +48,7 b' PYRAMID_SETTINGS = {}'
45 48 EXTENSIONS = {}
46 49
47 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 52 __platform__ = platform.system()
50 53 __license__ = 'AGPLv3, and Commercial License'
51 54 __author__ = 'RhodeCode GmbH'
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -60,7 +60,10 b' class TestGetPullRequestComments(object)'
60 60 'comment_text': 'Auto status change to |new_status|\n\n.. |new_status| replace:: *"Under Review"*',
61 61 'comment_type': 'note',
62 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 68 assert_ok(id_, expected, response.body)
66 69
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 49 def assert_ok(id_, expected, given):
50 50 given = json.loads(given)
51 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 55 expected = jsonify({
55 56 'id': id_,
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2014-2019 RhodeCode GmbH
3 # Copyright (C) 2014-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2015-2019 RhodeCode GmbH
3 # Copyright (C) 2015-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 380 "comment_text": "Example text",
381 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 387 error : null
@@ -684,28 +686,9 b' def create_pull_request('
684 686 full_source_ref = resolve_ref_or_error(source_ref, source_db_repo)
685 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 689 source_commit = get_commit_or_error(full_source_ref, source_db_repo)
691 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 692 reviewer_objects = Optional.extract(reviewers) or []
710 693
711 694 # serialize and validate passed in given reviewers
@@ -725,16 +708,16 b' def create_pull_request('
725 708 PullRequestModel().get_reviewer_functions()
726 709
727 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 712 owner, source_db_repo,
730 713 source_commit, target_db_repo, target_commit)
731 714
732 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 718 try:
736 719 reviewers = validate_default_reviewers(
737 reviewer_objects, reviewer_rules)
720 reviewer_objects, default_reviewers_data)
738 721 except ValueError as e:
739 722 raise JSONRPCError('Reviewers Validation: {}'.format(e))
740 723
@@ -746,6 +729,24 b' def create_pull_request('
746 729 source_ref=title_source_ref,
747 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 750 # fetch renderer, if set fallback to plain in case of PR
750 751 rc_config = SettingsModel().get_all_settings()
751 752 default_system_renderer = rc_config.get('rhodecode_markup_renderer', 'plain')
@@ -758,12 +759,13 b' def create_pull_request('
758 759 source_ref=full_source_ref,
759 760 target_repo=target_repo,
760 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 764 reviewers=reviewers,
763 765 title=title,
764 766 description=description,
765 767 description_renderer=description_renderer,
766 reviewer_data=reviewer_rules,
768 reviewer_data=default_reviewers_data,
767 769 auth_user=apiuser
768 770 )
769 771
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 33 from rhodecode.lib import repo_maintenance
34 34 from rhodecode.lib.auth import HasPermissionAnyApi, HasUserGroupPermissionAnyApi
35 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 37 from rhodecode.lib.ext_json import json
38 38 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
39 39 from rhodecode.lib.vcs import RepositoryError
@@ -573,6 +573,7 b' def get_repo_file(request, apiuser, repo'
573 573 elif details == 'full':
574 574 extended_info = content = True
575 575
576 file_path = safe_unicode(file_path)
576 577 try:
577 578 # check if repo is not empty by any chance, skip quicker if it is.
578 579 _scm = repo.scm_instance()
@@ -583,12 +584,12 b' def get_repo_file(request, apiuser, repo'
583 584 repo, commit_id, file_path, extended_info=extended_info,
584 585 content=content, max_file_bytes=max_file_bytes, cache=cache)
585 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 588 repo.repo_name, file_path, commit_id))
588 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 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 593 repo.repo_name, file_path))
593 594
594 595 return node
@@ -1599,7 +1600,8 b' def comment_commit('
1599 1600 validate_repo_permissions(apiuser, repoid, repo, _perms)
1600 1601
1601 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 1605 except Exception as e:
1604 1606 log.exception('Failed to fetch commit')
1605 1607 raise JSONRPCError(safe_str(e))
@@ -1655,10 +1657,14 b' def comment_commit('
1655 1657 except StatusChangeOnClosedPullRequestError:
1656 1658 log.exception(
1657 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 1661 'a closed pull request is not allowed')
1660 1662 raise JSONRPCError(msg)
1661 1663
1664 CommentsModel().trigger_commit_comment_hook(
1665 repo, apiuser, 'create',
1666 data={'comment': comment, 'commit': commit})
1667
1662 1668 Session().commit()
1663 1669 return {
1664 1670 'msg': (
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -22,10 +22,12 b''
22 22 import logging
23 23
24 24 from rhodecode.api import jsonrpc_method
25 from rhodecode.api.exc import JSONRPCValidationError
26 from rhodecode.api.utils import Optional
25 from rhodecode.api.exc import JSONRPCValidationError, JSONRPCForbidden
26 from rhodecode.api.utils import Optional, has_superadmin_permission
27 27 from rhodecode.lib.index import searcher_from_config
28 from rhodecode.lib.user_log_filter import user_log_filter
28 29 from rhodecode.model import validation_schema
30 from rhodecode.model.db import joinedload, UserLog
29 31 from rhodecode.model.validation_schema.schemas import search_schema
30 32
31 33 log = logging.getLogger(__name__)
@@ -116,3 +118,35 b' def search(request, apiuser, search_quer'
116 118 colander_exc=validation_schema.Invalid(node, search_result['error']))
117 119
118 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 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -396,7 +396,11 b' class PathFilter(object):'
396 396 def path_access_allowed(self, path):
397 397 log.debug('Checking ACL permissions for PathFilter for `%s`', path)
398 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 404 return True
401 405
402 406 def filter_patchset(self, patchset):
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 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 38 def trigger_user_permission_flush(event):
30 39 """
@@ -35,9 +44,11 b' def trigger_user_permission_flush(event)'
35 44
36 45 affected_user_ids = set(event.user_ids)
37 46 for user_id in affected_user_ids:
38 cache_namespace_uid = 'cache_user_auth.{}'.format(user_id)
39 del_keys = rc_cache.clear_cache_namespace('cache_perms', cache_namespace_uid)
40 log.debug('Deleted %s cache keys for user_id: %s', del_keys, user_id)
47 for cache_namespace_uid_tmpl in cache_namespaces:
48 cache_namespace_uid = cache_namespace_uid_tmpl.format(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 54 def includeme(config):
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 27 Admin prefixed routes
28 28 """
29
30 29 config.add_route(
31 30 name='admin_audit_logs',
32 31 pattern='/audit_logs')
@@ -291,12 +290,22 b' def admin_routes(config):'
291 290 pattern='/users/{user_id:\d+}/create_repo_group',
292 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 299 # user auth tokens
295 300 config.add_route(
296 301 name='edit_user_auth_tokens',
297 302 pattern='/users/{user_id:\d+}/edit/auth_tokens',
298 303 user_route=True)
299 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 309 name='edit_user_auth_tokens_add',
301 310 pattern='/users/{user_id:\d+}/edit/auth_tokens/new',
302 311 user_route=True)
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -228,7 +228,7 b' class TestAdminPermissionsController(Tes'
228 228 self.log_user()
229 229
230 230 # ADD
231 default_user_id = User.get_default_user().user_id
231 default_user_id = User.get_default_user_id()
232 232 self.app.post(
233 233 route_path('edit_user_ips_add', user_id=default_user_id),
234 234 params={'new_ip': '0.0.0.0/24', 'csrf_token': self.csrf_token})
@@ -238,7 +238,7 b' class TestAdminPermissionsController(Tes'
238 238 response.mustcontain('0.0.0.0 - 0.0.0.255')
239 239
240 240 # DELETE
241 default_user_id = User.get_default_user().user_id
241 default_user_id = User.get_default_user_id()
242 242 del_ip_id = UserIpMap.query().filter(UserIpMap.user_id ==
243 243 default_user_id).first().ip_id
244 244
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -84,15 +84,13 b' class TestAdminRepos(object):'
84 84 with mock.patch('rhodecode.BACKENDS', {'git': 'git'}):
85 85 response = self.app.get(route_path('repo_new'), status=200)
86 86 assert_response = response.assert_response()
87 element = assert_response.get_element('#repo_type')
88 assert element.text_content() == '\ngit\n'
87 element = assert_response.get_element('[name=repo_type]')
88 assert element.get('value') == 'git'
89 89
90 90 def test_create_page_non_restricted_backends(self, autologin_user, backend):
91 91 response = self.app.get(route_path('repo_new'), status=200)
92 92 assert_response = response.assert_response()
93 assert_response.element_contains('#repo_type', 'git')
94 assert_response.element_contains('#repo_type', 'svn')
95 assert_response.element_contains('#repo_type', 'hg')
93 assert ['hg', 'git', 'svn'] == [x.get('value') for x in assert_response.get_elements('[name=repo_type]')]
96 94
97 95 @pytest.mark.parametrize(
98 96 "suffix", [u'', u'xxa'], ids=['', 'non-ascii'])
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -143,7 +143,7 b' class TestAdminUsersView(TestController)'
143 143 response = self.app.get(
144 144 route_path('edit_user_auth_tokens', user_id=user_id))
145 145 for token in auth_tokens:
146 response.mustcontain(token)
146 response.mustcontain(token[:4])
147 147 response.mustcontain('never')
148 148
149 149 @pytest.mark.parametrize("desc, lifetime", [
@@ -165,7 +165,7 b' class TestAdminUsersView(TestController)'
165 165 response = response.follow()
166 166 user = User.get(user_id)
167 167 for auth_token in user.auth_tokens:
168 response.mustcontain(auth_token)
168 response.mustcontain(auth_token[:4])
169 169
170 170 def test_delete_auth_token(self, user_util):
171 171 self.log_user()
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2018-2019 RhodeCode GmbH
3 # Copyright (C) 2018-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -142,7 +142,7 b' class AdminPermissionsView(BaseAppView, '
142 142 h.flash(_('Error occurred during update of permissions'),
143 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 146 PermissionModel().trigger_permission_flush(affected_user_ids)
147 147
148 148 raise HTTPFound(h.route_path('admin_permissions_application'))
@@ -218,7 +218,7 b' class AdminPermissionsView(BaseAppView, '
218 218 h.flash(_('Error occurred during update of permissions'),
219 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 222 PermissionModel().trigger_permission_flush(affected_user_ids)
223 223
224 224 raise HTTPFound(h.route_path('admin_permissions_object'))
@@ -320,7 +320,7 b' class AdminPermissionsView(BaseAppView, '
320 320 h.flash(_('Error occurred during update of permissions'),
321 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 324 PermissionModel().trigger_permission_flush(affected_user_ids)
325 325
326 326 raise HTTPFound(h.route_path('admin_permissions_global'))
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -41,9 +41,9 b' class SvnConfigAdminSettingsView(BaseApp'
41 41 def vcs_svn_generate_config(self):
42 42 _ = self.request.translate
43 43 try:
44 generate_mod_dav_svn_config(self.request.registry)
44 file_path = generate_mod_dav_svn_config(self.request.registry)
45 45 msg = {
46 'message': _('Apache configuration for Subversion generated.'),
46 'message': _('Apache configuration for Subversion generated at `{}`.').format(file_path),
47 47 'level': 'success',
48 48 }
49 49 except Exception:
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 34 from rhodecode.authentication.base import get_authn_registry, RhodeCodeExternalAuthPlugin
35 35 from rhodecode.authentication.plugins import auth_rhodecode
36 36 from rhodecode.events import trigger
37 from rhodecode.model.db import true
37 from rhodecode.model.db import true, UserNotice
38 38
39 39 from rhodecode.lib import audit_logger, rc_cache
40 40 from rhodecode.lib.exceptions import (
41 41 UserCreationError, UserOwnsReposException, UserOwnsRepoGroupsException,
42 UserOwnsUserGroupsException, DefaultUserException)
42 UserOwnsUserGroupsException, UserOwnsPullRequestsException,
43 UserOwnsArtifactsException, DefaultUserException)
43 44 from rhodecode.lib.ext_json import json
44 45 from rhodecode.lib.auth import (
45 46 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
@@ -377,11 +378,13 b' class UsersView(UserAppView):'
377 378 _repos = c.user.repositories
378 379 _repo_groups = c.user.repository_groups
379 380 _user_groups = c.user.user_groups
381 _pull_requests = c.user.user_pull_requests
380 382 _artifacts = c.user.artifacts
381 383
382 384 handle_repos = None
383 385 handle_repo_groups = None
384 386 handle_user_groups = None
387 handle_pull_requests = None
385 388 handle_artifacts = None
386 389
387 390 # calls for flash of handle based on handle case detach or delete
@@ -412,6 +415,15 b' class UsersView(UserAppView):'
412 415 h.flash(_('Deleted %s user groups') % len(_user_groups),
413 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 427 def set_handle_flash_artifacts():
416 428 handle = handle_artifacts
417 429 if handle == 'detach':
@@ -421,6 +433,12 b' class UsersView(UserAppView):'
421 433 h.flash(_('Deleted %s artifacts') % len(_artifacts),
422 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 442 if _repos and self.request.POST.get('user_repos'):
425 443 handle_repos = self.request.POST['user_repos']
426 444
@@ -430,16 +448,25 b' class UsersView(UserAppView):'
430 448 if _user_groups and self.request.POST.get('user_user_groups'):
431 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 454 if _artifacts and self.request.POST.get('user_artifacts'):
434 455 handle_artifacts = self.request.POST['user_artifacts']
435 456
436 457 old_values = c.user.get_api_data()
437 458
438 459 try:
439 UserModel().delete(c.user, handle_repos=handle_repos,
440 handle_repo_groups=handle_repo_groups,
441 handle_user_groups=handle_user_groups,
442 handle_artifacts=handle_artifacts)
460
461 UserModel().delete(
462 c.user,
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 471 audit_logger.store_web(
445 472 'user.delete', action_data={'old_data': old_values},
@@ -449,11 +476,13 b' class UsersView(UserAppView):'
449 476 set_handle_flash_repos()
450 477 set_handle_flash_repo_groups()
451 478 set_handle_flash_user_groups()
479 set_handle_flash_pull_requests()
452 480 set_handle_flash_artifacts()
453 481 username = h.escape(old_values['username'])
454 482 h.flash(_('Successfully deleted user `{}`').format(username), category='success')
455 483 except (UserOwnsReposException, UserOwnsRepoGroupsException,
456 UserOwnsUserGroupsException, DefaultUserException) as e:
484 UserOwnsUserGroupsException, UserOwnsPullRequestsException,
485 UserOwnsArtifactsException, DefaultUserException) as e:
457 486 h.flash(e, category='warning')
458 487 except Exception:
459 488 log.exception("Exception during deletion of user")
@@ -502,6 +531,11 b' class UsersView(UserAppView):'
502 531 user_id = self.db_user_id
503 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 539 c.active = 'advanced'
506 540 c.personal_repo_group = RepoGroup.get_user_personal_repo_group(user_id)
507 541 c.personal_repo_group_name = RepoGroupModel()\
@@ -511,7 +545,6 b' class UsersView(UserAppView):'
511 545 (x.user for x in c.user.user_review_rules),
512 546 key=lambda u: u.username.lower())
513 547
514 c.first_admin = User.get_first_super_admin()
515 548 defaults = c.user.get_dict()
516 549
517 550 # Interim workaround if the user participated on any pull requests as a
@@ -705,6 +738,32 b' class UsersView(UserAppView):'
705 738 @HasPermissionAllDecorator('hg.admin')
706 739 @CSRFRequired()
707 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 767 route_name='user_create_personal_repo_group', request_method='POST',
709 768 renderer='rhodecode:templates/admin/users/user_edit.mako')
710 769 def user_create_personal_repo_group(self):
@@ -778,6 +837,25 b' class UsersView(UserAppView):'
778 837 c.role_vcs = AuthTokenModel.cls.ROLE_VCS
779 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 859 def maybe_attach_token_scope(self, token):
782 860 # implemented in EE edition
783 861 pass
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 88 'modified': ['b/modified_file.rst'],
89 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 100 email_kwargs = {
92 101 'test': {},
93 102 'message': {
@@ -97,6 +106,13 b' Check if we should use full-topic or min'
97 106 'user': user,
98 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 116 'password_reset': {
101 117 'password_reset_url': 'http://example.com/reset-rhodecode-password/token',
102 118
@@ -204,7 +220,7 b' def db():'
204 220 'pr_comment_url': 'http://comment-url',
205 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 224 'comment_line': 'o1210',
209 225 'comment_type': 'todo',
210 226 'comment_body': '''
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2013-2019 RhodeCode GmbH
3 # Copyright (C) 2013-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,7 +19,7 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20 # -*- coding: utf-8 -*-
21 21
22 # Copyright (C) 2016-2019 RhodeCode GmbH
22 # Copyright (C) 2016-2020 RhodeCode GmbH
23 23 #
24 24 # This program is free software: you can redistribute it and/or modify
25 25 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 35 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
36 36 from rhodecode.lib.vcs.nodes import FileNode
37 37 from rhodecode.model.db import (
38 func, true, or_, case, in_filter_generator, Session,
39 Repository, RepoGroup, User, UserGroup)
38 func, true, or_, case, cast, in_filter_generator, String, Session,
39 Repository, RepoGroup, User, UserGroup, PullRequest)
40 40 from rhodecode.model.repo import RepoModel
41 41 from rhodecode.model.repo_group import RepoGroupModel
42 42 from rhodecode.model.user import UserModel
@@ -111,7 +111,7 b' class HomeView(BaseAppView, DataGridAppV'
111 111 org_query = name_contains
112 112 allowed_ids = self._rhodecode_user.repo_acl_ids(
113 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 116 query = Session().query(
117 117 Repository.repo_name,
@@ -162,7 +162,7 b' class HomeView(BaseAppView, DataGridAppV'
162 162 org_query = name_contains
163 163 allowed_ids = self._rhodecode_user.repo_group_acl_ids(
164 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 167 query = Session().query(
168 168 RepoGroup.group_id,
@@ -282,6 +282,61 b' class HomeView(BaseAppView, DataGridAppV'
282 282 }
283 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 340 def _get_hash_commit_list(self, auth_user, searcher, query, repo=None, repo_group=None):
286 341 repo_name = repo_group_name = None
287 342 if repo:
@@ -624,6 +679,17 b' class HomeView(BaseAppView, DataGridAppV'
624 679 has_specialized_search = True
625 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 693 # FTS commit: type search
628 694 if not prefix_match:
629 695 commits, prefix_match = self._get_hash_commit_list(
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2018-2019 RhodeCode GmbH
3 # Copyright (C) 2018-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -50,6 +50,9 b' def includeme(config):'
50 50 name='my_account_auth_tokens',
51 51 pattern=ADMIN_PREFIX + '/my_account/auth_tokens')
52 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 56 name='my_account_auth_tokens_add',
54 57 pattern=ADMIN_PREFIX + '/my_account/auth_tokens/new')
55 58 config.add_route(
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -49,7 +49,7 b' class TestMyAccountAuthTokens(TestContro'
49 49 user = User.get(usr['user_id'])
50 50 response = self.app.get(route_path('my_account_auth_tokens'))
51 51 for token in user.auth_tokens:
52 response.mustcontain(token)
52 response.mustcontain(token[:4])
53 53 response.mustcontain('never')
54 54
55 55 def test_my_account_add_auth_tokens_wrong_csrf(self, user_util):
@@ -79,7 +79,7 b' class TestMyAccountAuthTokens(TestContro'
79 79 response = response.follow()
80 80 user = User.get(user_id)
81 81 for auth_token in user.auth_tokens:
82 response.mustcontain(auth_token)
82 response.mustcontain(auth_token[:4])
83 83
84 84 def test_my_account_delete_auth_token(self, user_util):
85 85 user = user_util.create_user(password='qweqwe')
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,7 +19,7 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20 # -*- coding: utf-8 -*-
21 21
22 # Copyright (C) 2016-2019 RhodeCode GmbH
22 # Copyright (C) 2016-2020 RhodeCode GmbH
23 23 #
24 24 # This program is free software: you can redistribute it and/or modify
25 25 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -25,7 +25,7 b' import string'
25 25 import formencode
26 26 import formencode.htmlfill
27 27 import peppercorn
28 from pyramid.httpexceptions import HTTPFound
28 from pyramid.httpexceptions import HTTPFound, HTTPNotFound
29 29 from pyramid.view import view_config
30 30
31 31 from rhodecode.apps._base import BaseAppView, DataGridAppView
@@ -164,6 +164,27 b' class MyAccountView(BaseAppView, DataGri'
164 164 c.role_vcs = AuthTokenModel.cls.ROLE_VCS
165 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 188 def maybe_attach_token_scope(self, token):
168 189 # implemented in EE edition
169 190 pass
@@ -702,12 +723,12 b' class MyAccountView(BaseAppView, DataGri'
702 723
703 724 pull_requests = PullRequestModel().get_im_participating_in(
704 725 user_id=self._rhodecode_user.user_id,
705 statuses=statuses,
726 statuses=statuses, query=search_q,
706 727 offset=start, length=limit, order_by=order_by,
707 728 order_dir=order_dir)
708 729
709 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 733 data = []
713 734 comments_model = CommentsModel()
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -156,6 +156,10 b' def includeme(config):'
156 156 pattern='/{repo_name:.*?[^/]}/authors/{commit_id}/{f_path:.*}', repo_route=True)
157 157
158 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 163 name='repo_files_remove_file',
160 164 pattern='/{repo_name:.*?[^/]}/remove_file/{commit_id}/{f_path:.*}',
161 165 repo_route=True)
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -22,8 +22,7 b' import pytest'
22 22
23 23 from rhodecode.tests import TestController
24 24
25 from rhodecode.model.db import (
26 ChangesetComment, Notification, UserNotification)
25 from rhodecode.model.db import ChangesetComment, Notification
27 26 from rhodecode.model.meta import Session
28 27 from rhodecode.lib import helpers as h
29 28
@@ -269,7 +268,36 b' class TestRepoCommitCommentsView(TestCon'
269 268 repo_name=backend.repo_name, commit_id=commit_id))
270 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 301 ('rst', 'plain text', '<p>plain text</p>'),
274 302 ('rst', 'header\n======', '<h1 class="title">header</h1>'),
275 303 ('rst', '*italics*', '<em>italics</em>'),
@@ -280,11 +308,11 b' class TestRepoCommitCommentsView(TestCon'
280 308 ('markdown', '**bold**', '<strong>bold</strong>'),
281 309 ], ids=['rst-plain', 'rst-header', 'rst-italics', 'rst-bold', 'md-plain',
282 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 312 self.log_user()
285 313 params = {
286 314 'renderer': renderer,
287 'text': input,
315 'text': text_input,
288 316 'csrf_token': self.csrf_token
289 317 }
290 318 commit_id = '0' * 16 # fake this for tests
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 485 # outgoing commits between those commits
486 486 compare_page = ComparePage(response)
487 compare_page.contains_commits(commits=[commit1], ancestors=[commit0])
487 compare_page.contains_commits(commits=[commit1])
488 488
489 489 def test_errors_when_comparing_unknown_source_repo(self, backend):
490 490 repo = backend.repo
@@ -641,6 +641,7 b' class ComparePage(AssertResponse):'
641 641 self.contains_one_link(
642 642 'r%s:%s' % (commit.idx, commit.short_id),
643 643 self._commit_url(commit))
644
644 645 if ancestors:
645 646 response.mustcontain('Ancestor')
646 647 for ancestor in ancestors:
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -629,7 +629,7 b' class TestPullrequestsView(object):'
629 629 model_patcher = mock.patch.multiple(
630 630 PullRequestModel,
631 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 634 with model_patcher:
635 635 response = self.app.post(
@@ -891,6 +891,8 b' class TestPullrequestsView(object):'
891 891
892 892 vcs = repo.scm_instance()
893 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 897 response = self.app.get(route_path(
896 898 'pullrequest_show',
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -20,6 +20,9 b''
20 20
21 21 from rhodecode.lib import helpers as h
22 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 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 51 def get_default_reviewers_data(
49 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 60 reasons = ['Default reviewer', 'Repository owner']
54 61 json_reviewers = [reviewer_as_json(
55 62 user=target_repo.user, reasons=reasons, mandatory=False, rules=None)]
56 63
57 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 67 'reviewers': json_reviewers,
60 68 'rules': {},
61 69 'rules_data': {},
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -22,7 +22,7 b''
22 22 import logging
23 23 import collections
24 24
25 from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest, HTTPFound
25 from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest, HTTPFound, HTTPForbidden
26 26 from pyramid.view import view_config
27 27 from pyramid.renderers import render
28 28 from pyramid.response import Response
@@ -380,6 +380,11 b' class RepoCommitsView(RepoAppView):'
380 380 'repo_commit', repo_name=self.db_repo_name,
381 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 388 # finalize, commit and redirect
384 389 Session().commit()
385 390
@@ -533,6 +538,10 b' class RepoCommitsView(RepoAppView):'
533 538 # comment already deleted in another call probably
534 539 return True
535 540
541 if comment.immutable:
542 # don't allow deleting comments that are immutable
543 raise HTTPForbidden()
544
536 545 is_repo_admin = h.HasRepoPermissionAny('repository.admin')(self.db_repo_name)
537 546 super_admin = h.HasPermissionAny('hg.admin')()
538 547 comment_owner = (comment.author.user_id == self._rhodecode_db_user.user_id)
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 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 250 repo_id = self.db_repo.repo_id
251 251 force_recache = self.get_recache_flag()
@@ -261,19 +261,19 b' class RepoFilesView(RepoAppView):'
261 261 cache_namespace_uid = 'cache_repo.{}'.format(repo_id)
262 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,
265 condition=cache_on)
266 def compute_file_tree(ver, repo_id, commit_id, f_path, full_load):
264 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, condition=cache_on)
265 def compute_file_tree(ver, _name_hash, _repo_id, _commit_id, _f_path, _full_load, _at_rev):
267 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 270 return render(
272 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 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 278 def _get_archive_spec(self, fname):
279 279 log.debug('Detecting archive spec for: `%s`', fname)
@@ -617,15 +617,12 b' class RepoFilesView(RepoAppView):'
617 617 c.renderer = view_name == 'repo_files:rendered' or \
618 618 not self.request.GET.get('no-render', False)
619 619
620 # redirect to given commit_id from form if given
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)
620 commit_id, f_path = self._get_commit_and_path()
624 621
625 commit_id, f_path = self._get_commit_and_path()
626 622 c.commit = self._get_commit_or_redirect(commit_id)
627 623 c.branch = self.request.GET.get('branch', None)
628 624 c.f_path = f_path
625 at_rev = self.request.GET.get('at')
629 626
630 627 # prev link
631 628 try:
@@ -705,7 +702,7 b' class RepoFilesView(RepoAppView):'
705 702 c.authors = []
706 703 # this loads a simple tree without metadata to speed things up
707 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 707 c.readme_data, c.readme_file = \
711 708 self._get_readme_data(self.db_repo, c.visual.default_renderer,
@@ -782,9 +779,10 b' class RepoFilesView(RepoAppView):'
782 779
783 780 c.file = dir_node
784 781 c.commit = commit
782 at_rev = self.request.GET.get('at')
785 783
786 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 787 return Response(html)
790 788
@@ -915,13 +913,12 b' class RepoFilesView(RepoAppView):'
915 913 cache_namespace_uid = 'cache_repo.{}'.format(repo_id)
916 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,
919 condition=cache_on)
920 def compute_file_search(repo_id, commit_id, f_path):
916 @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, condition=cache_on)
917 def compute_file_search(_name_hash, _repo_id, _commit_id, _f_path):
921 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 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 922 except (RepositoryError, CommitDoesNotExistError, Exception) as e:
926 923 log.exception(safe_str(e))
927 924 h.flash(safe_str(h.escape(e)), category='error')
@@ -931,7 +928,8 b' class RepoFilesView(RepoAppView):'
931 928
932 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 933 return filter(lambda n: self.path_filter.path_access_allowed(n['name']), result)
936 934
937 935 @LoginRequired()
@@ -961,6 +959,9 b' class RepoFilesView(RepoAppView):'
961 959 return commit_id
962 960
963 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 965 new_f_path = vcspath.join(name, f_path)
965 966 return u'%s@%s' % (new_f_path, commit_id)
966 967
@@ -1035,10 +1036,24 b' class RepoFilesView(RepoAppView):'
1035 1036 file_history, _hist = self._get_node_history(commit, f_path)
1036 1037
1037 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 1054 res.append({
1040 'text': obj[1],
1041 'children': [{'id': o[0], 'text': o[1], 'type': o[2]} for o in obj[0]]
1055 'text': section,
1056 'children': items
1042 1057 })
1043 1058
1044 1059 data = {
@@ -1098,6 +1113,42 b' class RepoFilesView(RepoAppView):'
1098 1113 @LoginRequired()
1099 1114 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
1100 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 1152 route_name='repo_files_remove_file', request_method='GET',
1102 1153 renderer='rhodecode:templates/files/files_delete.mako')
1103 1154 def repo_files_remove_file(self):
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -114,21 +114,26 b' class RepoSettingsPermissionsView(RepoAp'
114 114 private_flag = str2bool(self.request.POST.get('private'))
115 115
116 116 try:
117 RepoModel().update(
118 self.db_repo, **{'repo_private': private_flag, 'repo_name': self.db_repo_name})
117 repo = RepoModel().get(self.db_repo.repo_id)
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 124 Session().commit()
120 125
121 126 h.flash(_('Repository `{}` private mode set successfully').format(self.db_repo_name),
122 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 132 except Exception:
124 133 log.exception("Exception during update of repository")
125 134 h.flash(_('Error occurred during update of repository {}').format(
126 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 137 return {
133 138 'redirect_url': h.route_path('edit_repo_perms', repo_name=self.db_repo_name),
134 139 'private': private_flag
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 40 NotAnonymous, CSRFRequired)
41 41 from rhodecode.lib.utils2 import str2bool, safe_str, safe_unicode
42 42 from rhodecode.lib.vcs.backends.base import EmptyCommit, UpdateFailureReason
43 from rhodecode.lib.vcs.exceptions import (CommitDoesNotExistError,
44 RepositoryRequirementError, EmptyRepositoryError)
43 from rhodecode.lib.vcs.exceptions import (
44 CommitDoesNotExistError, RepositoryRequirementError, EmptyRepositoryError)
45 45 from rhodecode.model.changeset_status import ChangesetStatusModel
46 46 from rhodecode.model.comment import CommentsModel
47 from rhodecode.model.db import (func, or_, PullRequest, PullRequestVersion,
48 ChangesetComment, ChangesetStatus, Repository)
47 from rhodecode.model.db import (
48 func, or_, PullRequest, ChangesetComment, ChangesetStatus, Repository)
49 49 from rhodecode.model.forms import PullRequestForm
50 50 from rhodecode.model.meta import Session
51 51 from rhodecode.model.pull_request import PullRequestModel, MergeCheck
@@ -210,10 +210,12 b' class RepoPullRequestsView(RepoAppView, '
210 210 return caching_enabled
211 211
212 212 def _get_diffset(self, source_repo_name, source_repo,
213 ancestor_commit,
213 214 source_ref_id, target_ref_id,
214 215 target_commit, source_commit, diff_limit, file_limit,
215 216 fulldiff, hide_whitespace_changes, diff_context):
216 217
218 target_ref_id = ancestor_commit.raw_id
217 219 vcs_diff = PullRequestModel().get_diff(
218 220 source_repo, source_ref_id, target_ref_id,
219 221 hide_whitespace_changes, diff_context)
@@ -278,6 +280,7 b' class RepoPullRequestsView(RepoAppView, '
278 280 _new_state = {
279 281 'created': PullRequest.STATE_CREATED,
280 282 }.get(self.request.GET.get('force_state'))
283
281 284 if c.is_super_admin and _new_state:
282 285 with pull_request.set_state(PullRequest.STATE_UPDATING, final_state=_new_state):
283 286 h.flash(
@@ -396,9 +399,12 b' class RepoPullRequestsView(RepoAppView, '
396 399 pull_request_latest, auth_user=self._rhodecode_user,
397 400 translator=self.request.translate,
398 401 force_shadow_repo_refresh=force_refresh)
402
399 403 c.pr_merge_errors = _merge_check.error_details
400 404 c.pr_merge_possible = not _merge_check.failed
401 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 409 c.pr_merge_info = MergeCheck.get_merge_conditions(
404 410 pull_request_latest, translator=self.request.translate)
@@ -537,6 +543,13 b' class RepoPullRequestsView(RepoAppView, '
537 543 (ancestor_commit, commit_cache, missing_requirements,
538 544 source_commit, target_commit) = cached_diff['commits']
539 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 553 diff_commit_cache = \
541 554 (ancestor_commit, commit_cache, missing_requirements,
542 555 source_commit, target_commit) = self.get_commits(
@@ -547,7 +560,8 b' class RepoPullRequestsView(RepoAppView, '
547 560 source_scm,
548 561 target_commit,
549 562 target_ref_id,
550 target_scm)
563 target_scm,
564 maybe_unreachable=maybe_unreachable)
551 565
552 566 # register our commit range
553 567 for comm in commit_cache.values():
@@ -581,11 +595,10 b' class RepoPullRequestsView(RepoAppView, '
581 595 has_proper_diff_cache = cached_diff and cached_diff.get('commits')
582 596 if not force_recache and has_proper_diff_cache:
583 597 c.diffset = cached_diff['diff']
584 (ancestor_commit, commit_cache, missing_requirements,
585 source_commit, target_commit) = cached_diff['commits']
586 598 else:
587 599 c.diffset = self._get_diffset(
588 600 c.source_repo.repo_name, commits_source_repo,
601 c.ancestor_commit,
589 602 source_ref_id, target_ref_id,
590 603 target_commit, source_commit,
591 604 diff_limit, file_limit, c.fulldiff,
@@ -665,8 +678,10 b' class RepoPullRequestsView(RepoAppView, '
665 678
666 679 # calculate the diff for commits between versions
667 680 c.commit_changes = []
668 mark = lambda cs, fw: list(
669 h.itertools.izip_longest([], cs, fillvalue=fw))
681
682 def mark(cs, fw):
683 return list(h.itertools.izip_longest([], cs, fillvalue=fw))
684
670 685 for c_type, raw_id in mark(commit_changes.added, 'a') \
671 686 + mark(commit_changes.removed, 'r') \
672 687 + mark(commit_changes.common, 'c'):
@@ -698,15 +713,22 b' class RepoPullRequestsView(RepoAppView, '
698 713
699 714 def get_commits(
700 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 719 commit_cache = collections.OrderedDict()
703 720 missing_requirements = False
721
704 722 try:
705 723 pre_load = ["author", "date", "message", "branch", "parents"]
706 show_revs = pull_request_at_ver.revisions
707 for rev in show_revs:
708 comm = commits_source_repo.get_commit(
709 commit_id=rev, pre_load=pre_load)
724
725 pull_request_commits = pull_request_at_ver.revisions
726 log.debug('Loading %s commits from %s',
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 732 commit_cache[comm.raw_id] = comm
711 733
712 734 # Order here matters, we first need to get target, and then
@@ -715,22 +737,21 b' class RepoPullRequestsView(RepoAppView, '
715 737 commit_id=safe_str(target_ref_id))
716 738
717 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 741 except CommitDoesNotExistError:
720 log.warning(
721 'Failed to get commit from `{}` repo'.format(
722 commits_source_repo), exc_info=True)
742 log.warning('Failed to get commit from `{}` repo'.format(
743 commits_source_repo), exc_info=True)
723 744 except RepositoryRequirementError:
724 log.warning(
725 'Failed to get all required data from repo', exc_info=True)
745 log.warning('Failed to get all required data from repo', exc_info=True)
726 746 missing_requirements = True
727 ancestor_commit = None
747
748 pr_ancestor_id = pull_request_at_ver.common_ancestor_id
749
728 750 try:
729 ancestor_id = source_scm.get_common_ancestor(
730 source_commit.raw_id, target_commit.raw_id, target_scm)
731 ancestor_commit = source_scm.get_commit(ancestor_id)
751 ancestor_commit = source_scm.get_commit(pr_ancestor_id)
732 752 except Exception:
733 753 ancestor_commit = None
754
734 755 return ancestor_commit, commit_cache, missing_requirements, source_commit, target_commit
735 756
736 757 def assure_not_empty_repo(self):
@@ -934,6 +955,7 b' class RepoPullRequestsView(RepoAppView, '
934 955 target_repo = _form['target_repo']
935 956 target_ref = _form['target_ref']
936 957 commit_ids = _form['revisions'][::-1]
958 common_ancestor_id = _form['common_ancestor']
937 959
938 960 # find the ancestor for this pr
939 961 source_db_repo = Repository.get_by_repo_name(_form['source_repo'])
@@ -1020,6 +1042,7 b' class RepoPullRequestsView(RepoAppView, '
1020 1042 target_repo=target_repo,
1021 1043 target_ref=target_ref,
1022 1044 revisions=commit_ids,
1045 common_ancestor_id=common_ancestor_id,
1023 1046 reviewers=reviewers,
1024 1047 title=pullrequest_title,
1025 1048 description=description,
@@ -1458,6 +1481,10 b' class RepoPullRequestsView(RepoAppView, '
1458 1481 self.request.matchdict['comment_id'])
1459 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 1488 if pull_request.is_closed():
1462 1489 log.debug('comment: forbidden because pull request is closed')
1463 1490 raise HTTPForbidden()
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -54,8 +54,20 b' class RepoReviewRulesView(RepoAppView):'
54 54 renderer='json_ext')
55 55 def repo_default_reviewers_data(self):
56 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 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 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 73 return review_data
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -22,6 +22,7 b' import logging'
22 22
23 23 from pyramid.view import view_config
24 24 from pyramid.httpexceptions import HTTPFound
25 from packaging.version import Version
25 26
26 27 from rhodecode import events
27 28 from rhodecode.apps._base import RepoAppView
@@ -64,12 +65,19 b' class RepoSettingsView(RepoAppView):'
64 65 c = self.load_default_context()
65 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 69 c.in_public_journal = UserFollowing.query() \
69 70 .filter(UserFollowing.user_id == c.default_user_id) \
70 71 .filter(UserFollowing.follows_repository == self.db_repo).scalar()
71 72
72 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 82 # update commit cache if GET flag is present
75 83 if self.request.GET.get('update_commit_cache'):
@@ -212,7 +220,7 b' class RepoSettingsView(RepoAppView):'
212 220 _ = self.request.translate
213 221
214 222 try:
215 user_id = User.get_default_user().user_id
223 user_id = User.get_default_user_id()
216 224 ScmModel().toggle_following_repo(self.db_repo.repo_id, user_id)
217 225 h.flash(_('Updated repository visibility in public journal'),
218 226 category='success')
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 60 errors = e.children
61 61
62 62 def url_generator(page_num):
63 q = urllib.quote(safe_str(search_query))
64 63
65 64 query_params = {
66 65 'page': page_num,
67 'q': q,
66 'q': safe_str(search_query),
68 67 'type': safe_str(search_type),
69 68 'max_lines': search_max_lines,
70 69 'sort': search_sort
@@ -72,7 +71,6 b' def perform_search(request, tmpl_context'
72 71
73 72 return '?' + urllib.urlencode(query_params)
74 73
75
76 74 c = tmpl_context
77 75 search_query = search_params.get('search_query')
78 76 search_type = search_params.get('search_type')
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 92 def get_repo_details(self, mode):
93 93 vcs_type = mode if mode in ['svn', 'hg', 'git'] else None
94 mode = mode
95 94 repo_name = None
96 95
97 96 hg_pattern = r'^hg\s+\-R\s+(\S+)\s+serve\s+\-\-stdio$'
@@ -101,8 +100,7 b' class SshWrapper(object):'
101 100 repo_name = hg_match.group(1).strip('/')
102 101 return vcs_type, repo_name, mode
103 102
104 git_pattern = (
105 r'^git-(receive-pack|upload-pack)\s\'[/]?(\S+?)(|\.git)\'$')
103 git_pattern = r'^git-(receive-pack|upload-pack)\s\'[/]?(\S+?)(|\.git)\'$'
106 104 git_match = re.match(git_pattern, self.command)
107 105 if git_match is not None:
108 106 vcs_type = 'git'
@@ -115,7 +113,8 b' class SshWrapper(object):'
115 113
116 114 if svn_match is not None:
117 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 118 return vcs_type, repo_name, mode
120 119
121 120 return vcs_type, repo_name, mode
@@ -188,8 +187,7 b' class SshWrapper(object):'
188 187 log.debug('SSH Connection info %s', self.get_connection_info())
189 188
190 189 if shell and self.command is None:
191 log.info(
192 'Dropping to shell, no command given and shell is allowed')
190 log.info('Dropping to shell, no command given and shell is allowed')
193 191 os.execl('/bin/bash', '-l')
194 192 exit_code = 1
195 193
@@ -216,8 +214,7 b' class SshWrapper(object):'
216 214 exit_code = -1
217 215
218 216 else:
219 log.error(
220 'Unhandled Command: "%s" Aborting.', self.command)
217 log.error('Unhandled Command: "%s" Aborting.', self.command)
221 218 exit_code = -1
222 219
223 220 return exit_code
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 67 def _check_permissions(self, action):
68 68 permission = self.user_permissions.get(self.repo_name)
69 log.debug(
70 'permission for %s on %s are: %s',
71 self.user, self.repo_name, permission)
69 log.debug('permission for %s on %s are: %s',
70 self.user, self.repo_name, permission)
72 71
73 72 if not permission:
74 73 log.error('user `%s` permissions to repo:%s are empty. Forbidding access.',
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -68,8 +68,7 b' class GitServer(VcsServer):'
68 68 self.store = store
69 69 self.ini_path = ini_path
70 70 self.repo_name = repo_name
71 self._path = self.git_path = config.get(
72 'app:main', 'ssh.executable.git')
71 self._path = self.git_path = config.get('app:main', 'ssh.executable.git')
73 72
74 73 self.repo_mode = repo_mode
75 74 self.tunnel = GitTunnelWrapper(server=self)
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 68 def command(self):
69 69 root = self.server.get_root_store()
70 username = self.server.user.username
71
70 72 command = [
71 73 self.server.svn_path, '-t',
72 74 '--config-file', self.svn_conf_path,
75 '--tunnel-user', username,
73 76 '-r', root]
74 77 log.debug("Final CMD: %s", ' '.join(command))
75 78 return command
@@ -95,9 +98,8 b' class SubversionTunnelWrapper(object):'
95 98 signal.alarm(self.timeout)
96 99 first_response = self._read_first_client_response()
97 100 signal.alarm(0)
98 return (
99 self._parse_first_client_response(first_response)
100 if first_response else None)
101 return (self._parse_first_client_response(first_response)
102 if first_response else None)
101 103
102 104 def patch_first_client_response(self, response, **kwargs):
103 105 self.create_hooks_env()
@@ -112,9 +114,8 b' class SubversionTunnelWrapper(object):'
112 114 self.process.stdin.write(buffer_)
113 115
114 116 def fail(self, message):
115 print(
116 "( failure ( ( 210005 {message} 0: 0 ) ) )".format(
117 message=self._svn_string(message)))
117 print("( failure ( ( 210005 {message} 0: 0 ) ) )".format(
118 message=self._svn_string(message)))
118 119 self.remove_configs()
119 120 self.process.kill()
120 121 return 1
@@ -139,6 +140,7 b' class SubversionTunnelWrapper(object):'
139 140 brackets_stack.pop()
140 141 elif next_byte == " " and not brackets_stack:
141 142 break
143
142 144 return buffer_
143 145
144 146 def _parse_first_client_response(self, buffer_):
@@ -149,8 +151,7 b' class SubversionTunnelWrapper(object):'
149 151 ( version:number ( cap:word ... ) url:string ? ra-client:string
150 152 ( ? client:string ) )
151 153
152 Please check https://svn.apache.org/repos/asf/subversion/trunk/
153 subversion/libsvn_ra_svn/protocol
154 Please check https://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_ra_svn/protocol
154 155 """
155 156 version_re = r'(?P<version>\d+)'
156 157 capabilities_re = r'\(\s(?P<capabilities>[\w\d\-\ ]+)\s\)'
@@ -163,8 +164,35 b' class SubversionTunnelWrapper(object):'
163 164 version=version_re, capabilities=capabilities_re,
164 165 url=url_re, ra_client=ra_client_re, client=client_re))
165 166 matcher = regex.match(buffer_)
167
166 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 196 def run(self, extras):
169 197 action = 'pull'
170 198 self.create_svn_config()
@@ -175,7 +203,8 b' class SubversionTunnelWrapper(object):'
175 203 return self.fail("Repository name cannot be extracted")
176 204
177 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 209 exit_code = self.server._check_permissions(action)
181 210 if exit_code:
@@ -200,10 +229,10 b' class SubversionServer(VcsServer):'
200 229 .__init__(user, user_permissions, config, env)
201 230 self.store = store
202 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 234 self.repo_name = repo_name
205 self._path = self.svn_path = config.get(
206 'app:main', 'ssh.executable.svn')
235 self._path = self.svn_path = config.get('app:main', 'ssh.executable.svn')
207 236
208 237 self.tunnel = SubversionTunnelWrapper(server=self)
209 238
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -70,8 +70,10 b' class TestSubversionServer(object):'
70 70 def test_command(self, svn_server):
71 71 server = svn_server.create()
72 72 expected_command = [
73 svn_server.svn_path, '-t', '--config-file',
74 server.tunnel.svn_conf_path, '-r', svn_server.root
73 svn_server.svn_path, '-t',
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 79 assert expected_command == server.tunnel.command()
@@ -89,6 +91,86 b' class TestSubversionServer(object):'
89 91 result = server._check_permissions(action)
90 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 174 def test_run_returns_executes_command(self, svn_server):
93 175 server = svn_server.create()
94 176 from rhodecode.apps.ssh_support.lib.backends.svn import SubversionTunnelWrapper
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 38 def write_mod_dav_svn_config(settings):
39 39 use_ssl = str2bool(settings['force_https'])
40
40 file_path = settings[config_keys.config_file_path]
41 41 config = _render_mod_dav_svn_config(
42 42 use_ssl=use_ssl,
43 43 parent_path_root=get_rhodecode_base_path(),
@@ -45,7 +45,8 b' def write_mod_dav_svn_config(settings):'
45 45 location_root=settings[config_keys.location_root],
46 46 repo_groups=RepoGroup.get_all_repo_groups(),
47 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 52 def generate_mod_dav_svn_config(registry):
@@ -56,11 +57,11 b' def generate_mod_dav_svn_config(registry'
56 57 repositories organized in sub folders.
57 58 """
58 59 settings = registry.settings
59 write_mod_dav_svn_config(settings)
60 file_path = write_mod_dav_svn_config(settings)
60 61
61 62 # Trigger an event on mod dav svn configuration change.
62 63 trigger(ModDavSvnConfigChange(), registry)
63
64 return file_path
64 65
65 66 def _render_mod_dav_svn_config(
66 67 parent_path_root, list_parent_path, location_root, repo_groups, realm,
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -153,25 +153,25 b' class CrowdServer(object):'
153 153 global msg
154 154 msg = ""
155 155 try:
156 rdoc = self.opener.open(request)
157 msg = "".join(rdoc.readlines())
156 ret_doc = self.opener.open(request)
157 msg = ret_doc.read()
158 158 if not msg and empty_response_ok:
159 rval = {}
160 rval["status"] = True
161 rval["error"] = "Response body was empty"
159 ret_val = {}
160 ret_val["status"] = True
161 ret_val["error"] = "Response body was empty"
162 162 elif not noformat:
163 rval = json.loads(msg)
164 rval["status"] = True
163 ret_val = json.loads(msg)
164 ret_val["status"] = True
165 165 else:
166 rval = "".join(rdoc.readlines())
166 ret_val = msg
167 167 except Exception as e:
168 168 if not noformat:
169 rval = {"status": False,
170 "body": body,
171 "error": str(e) + "\n" + msg}
169 ret_val = {"status": False,
170 "body": body,
171 "error": "{}\n{}".format(e, msg)}
172 172 else:
173 rval = None
174 return rval
173 ret_val = None
174 return ret_val
175 175
176 176 def user_auth(self, username, password):
177 177 """Authenticate a user against crowd. Returns brief information about
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -69,6 +69,12 b' class LdapAuthnResource(AuthnPluginResou'
69 69 class AuthLdap(AuthLdapBase):
70 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 78 def __init__(self, server, base_dn, port=389, bind_dn='', bind_pass='',
73 79 tls_kind='PLAIN', tls_reqcert='DEMAND', tls_cert_file=None,
74 80 tls_cert_dir=None, ldap_version=3,
@@ -85,7 +91,7 b' class AuthLdap(AuthLdapBase):'
85 91 self.TLS_KIND = tls_kind
86 92
87 93 if self.TLS_KIND == 'LDAPS':
88 port = port or 689
94 port = port or 636
89 95 self.ldap_server_type += 's'
90 96
91 97 OPT_X_TLS_DEMAND = 2
@@ -148,19 +154,27 b' class AuthLdap(AuthLdapBase):'
148 154 log.debug('simple_bind successful')
149 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 162 try:
153 log.debug('Trying simple bind with %r', dn)
154 server.simple_bind_s(dn, safe_str(password))
155 _dn, attrs = server.search_ext_s(
156 dn, ldap.SCOPE_BASE, '(objectClass=*)', )[0]
163 log.debug('Trying authenticated search bind with dn: %r SCOPE: %s (and filter: %s)',
164 dn, scope_label, ldap_filter)
165 ldap_conn.simple_bind_s(dn, safe_str(password))
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 175 except ldap.INVALID_CREDENTIALS:
161 log.debug(
162 "LDAP rejected password for user '%s': %s, org_exc:",
163 username, dn, exc_info=True)
176 log.debug("LDAP rejected password for user '%s': %s, org_exc:",
177 username, dn, exc_info=True)
164 178
165 179 def authenticate_ldap(self, username, password):
166 180 """
@@ -179,35 +193,38 b' class AuthLdap(AuthLdapBase):'
179 193
180 194 self.validate_password(username, password)
181 195 self.validate_username(username)
196 scope_label = self.scope_labels.get(self.SEARCH_SCOPE)
182 197
183 198 ldap_conn = None
184 199 try:
185 200 ldap_conn = self._get_ldap_conn()
186 201 filter_ = '(&%s(%s=%s))' % (
187 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(
191 self.BASE_DN, self.SEARCH_SCOPE, filter_)
206 ldap_objects = ldap_conn.search_ext_s(
207 self.BASE_DN, self.SEARCH_SCOPE, filter_, attrlist=['*', '+'])
192 208
193 if not lobjects:
209 if not ldap_objects:
194 210 log.debug("No matching LDAP objects for authentication "
195 211 "of UID:'%s' username:(%s)", uid, username)
196 212 raise ldap.NO_SUCH_OBJECT()
197 213
198 log.debug('Found matching ldap object, trying to authenticate')
199 for (dn, _attrs) in lobjects:
214 log.debug('Found %s matching ldap object[s], trying to authenticate on each one now...', len(ldap_objects))
215 for (dn, _attrs) in ldap_objects:
200 216 if dn is None:
201 217 continue
202 218
203 219 user_attrs = self.fetch_attrs_from_simple_bind(
204 220 ldap_conn, dn, username, password)
221
205 222 if user_attrs:
223 log.debug('Got authenticated user attributes from DN:%s', dn)
206 224 break
207 225 else:
208 226 raise LdapPasswordError(
209 'Failed to authenticate user `{}` '
210 'with given password'.format(username))
227 'Failed to authenticate user `{}` with given password'.format(username))
211 228
212 229 except ldap.NO_SUCH_OBJECT:
213 230 log.debug("LDAP says no such user '%s' (%s), org_exc:",
@@ -216,8 +233,7 b' class AuthLdap(AuthLdapBase):'
216 233 except ldap.SERVER_DOWN:
217 234 org_exc = traceback.format_exc()
218 235 raise LdapConnectionError(
219 "LDAP can't access authentication "
220 "server, org_exc:%s" % org_exc)
236 "LDAP can't access authentication server, org_exc:%s" % org_exc)
221 237 finally:
222 238 if ldap_conn:
223 239 log.debug('ldap: connection release')
@@ -249,7 +265,7 b' class LdapSettingsSchema(AuthnPluginSett'
249 265 colander.Int(),
250 266 default=389,
251 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 269 preparer=strip_whitespace,
254 270 title=_('Port'),
255 271 validator=colander.Range(min=0, max=65536),
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2013-2019 RhodeCode GmbH
3 # Copyright (C) 2013-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 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 64 for alias in rhodecode.BACKENDS.keys():
65 65 if alias not in settings['vcs.backends']:
66 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 72 log.info('Enabled VCS backends: %s', rhodecode.BACKENDS.keys())
68 73
69 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 82 rhodecode.PYRAMID_SETTINGS = settings_merged
78 83 rhodecode.CONFIG = settings_merged
84 rhodecode.CONFIG['default_user_id'] = utils.get_default_user_id()
79 85
80 86 if vcs_server_enabled:
81 87 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(settings))
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 611 settings,
612 612 'exception_tracker.store_path',
613 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 623 # cache_perms
616 624 _string_setting(
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -25,6 +25,7 b' from .hooks import ('
25 25 _create_repo_group_hook,
26 26 _pre_create_user_hook,
27 27 _create_user_hook,
28 _comment_commit_repo_hook,
28 29 _delete_repo_hook,
29 30 _delete_user_hook,
30 31 _pre_push_hook,
@@ -33,6 +34,7 b' from .hooks import ('
33 34 _pull_hook,
34 35 _create_pull_request_hook,
35 36 _review_pull_request_hook,
37 _comment_pull_request_hook,
36 38 _update_pull_request_hook,
37 39 _merge_pull_request_hook,
38 40 _close_pull_request_hook,
@@ -40,6 +42,7 b' from .hooks import ('
40 42
41 43 # set as module attributes, we use those to call hooks. *do not change this*
42 44 CREATE_REPO_HOOK = _create_repo_hook
45 COMMENT_COMMIT_REPO_HOOK = _comment_commit_repo_hook
43 46 CREATE_REPO_GROUP_HOOK = _create_repo_group_hook
44 47 PRE_CREATE_USER_HOOK = _pre_create_user_hook
45 48 CREATE_USER_HOOK = _create_user_hook
@@ -51,6 +54,7 b' PRE_PULL_HOOK = _pre_pull_hook'
51 54 PULL_HOOK = _pull_hook
52 55 CREATE_PULL_REQUEST = _create_pull_request_hook
53 56 REVIEW_PULL_REQUEST = _review_pull_request_hook
57 COMMENT_PULL_REQUEST = _comment_pull_request_hook
54 58 UPDATE_PULL_REQUEST = _update_pull_request_hook
55 59 MERGE_PULL_REQUEST = _merge_pull_request_hook
56 60 CLOSE_PULL_REQUEST = _close_pull_request_hook
@@ -24,14 +24,13 b' def _push_hook(*args, **kwargs):'
24 24 # returns list of dicts with key-val fetched from extra fields
25 25 repo_extra_fields = extra_fields.run(**kwargs)
26 26
27 if repo_extra_fields.get('endpoint_url'):
28 field_metadata = repo_extra_fields['endpoint_url']
29 endpoint = field_metadata['field_value']
30 if endpoint:
31 data = {
32 'project': kwargs['repository'],
33 }
34 response = http_call.run(url=endpoint, params=data)
35 return HookResponse(0, 'Called endpoint {}, with response {}\n'.format(endpoint, response))
27 endpoint_url = extra_fields.get_field(repo_extra_fields, key='endpoint_url', default='')
28
29 if endpoint_url:
30 data = {
31 'project': kwargs['repository'],
32 }
33 response = http_call.run(url=endpoint_url, params=data)
34 return HookResponse(0, 'Called endpoint {}, with response {}\n'.format(endpoint_url, response))
36 35
37 36 return HookResponse(0, '')
@@ -24,14 +24,12 b' def _push_hook(*args, **kwargs):'
24 24 # returns list of dicts with key-val fetched from extra fields
25 25 repo_extra_fields = extra_fields.run(**kwargs)
26 26
27 if repo_extra_fields.get('endpoint_url'):
28 field_metadata = repo_extra_fields['endpoint_url']
29 endpoint = field_metadata['field_value']
30 if endpoint:
31 data = {
32 'some_key': 'val'
33 }
34 response = http_call.run(url=endpoint, json_data=data)
35 return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response))
27 endpoint_url = extra_fields.get_field(repo_extra_fields, key='endpoint_url', default='')
28 if endpoint_url:
29 data = {
30 'some_key': 'val'
31 }
32 response = http_call.run(url=endpoint_url, json_data=data)
33 return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint_url, response))
36 34
37 35 return HookResponse(0, '')
@@ -41,11 +41,13 b' def _pre_push_hook(*args, **kwargs):'
41 41 repo_extra_fields = extra_fields.run(**kwargs)
42 42
43 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 46 should_validate = str2bool(validate_author)
46 47
47 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 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 45 # optionally use 'extra fields' to control the logic per repo
46 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 49 forbid_files = aslist(forbid_files)
49 50
50 51 # forbid_files = ['*'] # example pattern
51 52
52 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 57 forbid_size_over = int(forbid_size_over or 0)
55 58
56 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 3 #
4 4 # This program is free software: you can redistribute it and/or modify
5 5 # it under the terms of the GNU Affero General Public License, version 3
@@ -53,3 +53,36 b' def run(*args, **kwargs):'
53 53 fields[field.field_key] = field.get_dict()
54 54
55 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 1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 3 #
4 4 # This program is free software: you can redistribute it and/or modify
5 5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 3 #
4 4 # This program is free software: you can redistribute it and/or modify
5 5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 3 #
4 4 # This program is free software: you can redistribute it and/or modify
5 5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2019 RhodeCode GmbH
2 # Copyright (C) 2016-2020 RhodeCode GmbH
3 3 #
4 4 # This program is free software: you can redistribute it and/or modify
5 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -15,11 +15,12 b''
15 15 # This program is dual-licensed. If you wish to learn more about the
16 16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
18 19 import logging
19 20 from .utils import DotDict, HookResponse, has_kwargs
21
20 22 log = logging.getLogger('rhodecode.' + __name__)
21 23
22
23 24 # Config shortcut to keep, all configuration in one place
24 25 # Example: api_key = CONFIG.my_config.api_key
25 26 CONFIG = DotDict(
@@ -55,13 +56,40 b' def _create_repo_hook(*args, **kwargs):'
55 56
56 57
57 58 @has_kwargs({
58 'group_name': '',
59 'group_parent_id': '',
59 'repo_name': '',
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 88 'group_description': '',
61 'group_id': '',
62 'user_id': '',
63 'created_by': '',
64 'created_on': '',
89 'group_id': '',
90 'user_id': '',
91 'created_by': '',
92 'created_on': '',
65 93 'enable_locking': ''
66 94 })
67 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 103 @has_kwargs({
76 'username': '',
77 'password': '',
78 'email': '',
104 'username': '',
105 'password': '',
106 'email': '',
79 107 'firstname': '',
80 'lastname': '',
81 'active': '',
82 'admin': '',
108 'lastname': '',
109 'active': '',
110 'admin': '',
83 111 'created_by': '',
84 112 })
85 113 def _pre_create_user_hook(*args, **kwargs):
@@ -173,7 +201,7 b' def _delete_repo_hook(*args, **kwargs):'
173 201 'emails': '',
174 202 'inherit_default_permissions': '',
175 203 'deleted_by': '',
176 })
204 })
177 205 def _delete_user_hook(*args, **kwargs):
178 206 """
179 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 376 'scm': 'type of version control "git", "hg", "svn"',
349 377 'username': 'username of actor who triggered this event',
350 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 411 'action': '',
352 412 'repository': 'repository name',
353 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -18,8 +18,10 b''
18 18
19 19 import logging
20 20 import os
21 import string
21 22 import functools
22 23 import collections
24 import urllib
23 25
24 26 log = logging.getLogger('rhodecode.' + __name__)
25 27
@@ -186,4 +188,12 b' def aslist(obj, sep=None, strip=True):'
186 188 elif obj is None:
187 189 return []
188 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 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,7 +19,6 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import os
22 import shlex
23 22 import platform
24 23
25 24 from rhodecode.model import init_model
@@ -91,3 +90,12 b' def set_instance_id(config):'
91 90 prefix = instance_id.lstrip('*')
92 91 _platform_id = platform.uname()[1] or 'instance'
93 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 3 # This program is free software: you can redistribute it and/or modify
4 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 55 from rhodecode.events.repo import ( # pragma: no cover
56 RepoEvent,
56 RepoEvent, RepoCommitCommentEvent,
57 57 RepoPreCreateEvent, RepoCreateEvent,
58 58 RepoPreDeleteEvent, RepoDeleteEvent,
59 59 RepoPrePushEvent, RepoPushEvent,
@@ -75,4 +75,5 b' from rhodecode.events.pullrequest import'
75 75 PullRequestReviewEvent,
76 76 PullRequestMergeEvent,
77 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -44,6 +44,9 b' class RhodecodeEvent(object):'
44 44 self._request = request
45 45 self.utc_timestamp = datetime.datetime.utcnow()
46 46
47 def __repr__(self):
48 return '<%s:(%s)>' % (self.__class__.__name__, self.name)
49
47 50 def get_request(self):
48 51 if self._request:
49 52 return self._request
@@ -116,3 +119,4 b' class RhodeCodeIntegrationEvent(Rhodecod'
116 119 """
117 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 3 # This program is free software: you can redistribute it and/or modify
4 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 3 # This program is free software: you can redistribute it and/or modify
4 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 78 name = 'pullrequest-create'
79 79 display_name = lazy_ugettext('pullrequest created')
80 description = lazy_ugettext('Event triggered after pull request was created')
80 81
81 82
82 83 class PullRequestCloseEvent(PullRequestEvent):
@@ -86,6 +87,7 b' class PullRequestCloseEvent(PullRequestE'
86 87 """
87 88 name = 'pullrequest-close'
88 89 display_name = lazy_ugettext('pullrequest closed')
90 description = lazy_ugettext('Event triggered after pull request was closed')
89 91
90 92
91 93 class PullRequestUpdateEvent(PullRequestEvent):
@@ -95,6 +97,7 b' class PullRequestUpdateEvent(PullRequest'
95 97 """
96 98 name = 'pullrequest-update'
97 99 display_name = lazy_ugettext('pullrequest commits updated')
100 description = lazy_ugettext('Event triggered after pull requests was updated')
98 101
99 102
100 103 class PullRequestReviewEvent(PullRequestEvent):
@@ -104,6 +107,8 b' class PullRequestReviewEvent(PullRequest'
104 107 """
105 108 name = 'pullrequest-review'
106 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 113 def __init__(self, pullrequest, status):
109 114 super(PullRequestReviewEvent, self).__init__(pullrequest)
@@ -117,6 +122,8 b' class PullRequestMergeEvent(PullRequestE'
117 122 """
118 123 name = 'pullrequest-merge'
119 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 129 class PullRequestCommentEvent(PullRequestEvent):
@@ -126,6 +133,8 b' class PullRequestCommentEvent(PullReques'
126 133 """
127 134 name = 'pullrequest-comment'
128 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 139 def __init__(self, pullrequest, comment):
131 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -181,6 +181,40 b' class RepoEvent(RhodeCodeIntegrationEven'
181 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 218 class RepoPreCreateEvent(RepoEvent):
185 219 """
186 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 223 name = 'repo-pre-create'
190 224 display_name = lazy_ugettext('repository pre create')
225 description = lazy_ugettext('Event triggered before repository is created')
191 226
192 227
193 228 class RepoCreateEvent(RepoEvent):
@@ -197,6 +232,7 b' class RepoCreateEvent(RepoEvent):'
197 232 """
198 233 name = 'repo-create'
199 234 display_name = lazy_ugettext('repository created')
235 description = lazy_ugettext('Event triggered after repository was created')
200 236
201 237
202 238 class RepoPreDeleteEvent(RepoEvent):
@@ -206,6 +242,7 b' class RepoPreDeleteEvent(RepoEvent):'
206 242 """
207 243 name = 'repo-pre-delete'
208 244 display_name = lazy_ugettext('repository pre delete')
245 description = lazy_ugettext('Event triggered before a repository is deleted')
209 246
210 247
211 248 class RepoDeleteEvent(RepoEvent):
@@ -215,6 +252,7 b' class RepoDeleteEvent(RepoEvent):'
215 252 """
216 253 name = 'repo-delete'
217 254 display_name = lazy_ugettext('repository deleted')
255 description = lazy_ugettext('Event triggered after repository was deleted')
218 256
219 257
220 258 class RepoVCSEvent(RepoEvent):
@@ -255,6 +293,7 b' class RepoPrePullEvent(RepoVCSEvent):'
255 293 """
256 294 name = 'repo-pre-pull'
257 295 display_name = lazy_ugettext('repository pre pull')
296 description = lazy_ugettext('Event triggered before repository code is pulled')
258 297
259 298
260 299 class RepoPullEvent(RepoVCSEvent):
@@ -264,6 +303,7 b' class RepoPullEvent(RepoVCSEvent):'
264 303 """
265 304 name = 'repo-pull'
266 305 display_name = lazy_ugettext('repository pull')
306 description = lazy_ugettext('Event triggered after repository code was pulled')
267 307
268 308
269 309 class RepoPrePushEvent(RepoVCSEvent):
@@ -273,6 +313,8 b' class RepoPrePushEvent(RepoVCSEvent):'
273 313 """
274 314 name = 'repo-pre-push'
275 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 320 class RepoPushEvent(RepoVCSEvent):
@@ -284,6 +326,8 b' class RepoPushEvent(RepoVCSEvent):'
284 326 """
285 327 name = 'repo-push'
286 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 332 def __init__(self, repo_name, pushed_commit_ids, extras):
289 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 3 # This program is free software: you can redistribute it and/or modify
4 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 61 name = 'repo-group-create'
62 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 66 class RepoGroupDeleteEvent(RepoGroupEvent):
@@ -69,6 +70,7 b' class RepoGroupDeleteEvent(RepoGroupEven'
69 70 """
70 71 name = 'repo-group-delete'
71 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 76 class RepoGroupUpdateEvent(RepoGroupEvent):
@@ -78,3 +80,4 b' class RepoGroupUpdateEvent(RepoGroupEven'
78 80 """
79 81 name = 'repo-group-update'
80 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 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,5 +1,5 b''
1 1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2012-2019 RhodeCode GmbH
2 # Copyright (C) 2012-2020 RhodeCode GmbH
3 3 #
4 4 # This program is free software: you can redistribute it and/or modify
5 5 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 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 142 class EEIntegration(IntegrationTypeBase):
130 143 description = 'Integration available in RhodeCode EE edition.'
@@ -139,30 +152,57 b' class EEIntegration(IntegrationTypeBase)'
139 152 # Helpers #
140 153 # updating this required to update the `common_vars` as well.
141 154 WEBHOOK_URL_VARS = [
142 ('event_name', 'Unique name of the event type, e.g pullrequest-update'),
143 ('repo_name', 'Full name of the repository'),
144 ('repo_type', 'VCS type of repository'),
145 ('repo_id', 'Unique id of repository'),
146 ('repo_url', 'Repository url'),
155 # GENERAL
156 ('General', [
157 ('event_name', 'Unique name of the event type, e.g pullrequest-update'),
158 ('repo_name', 'Full name of the repository'),
159 ('repo_type', 'VCS type of repository'),
160 ('repo_id', 'Unique id of repository'),
161 ('repo_url', 'Repository url'),
162 ]
163 ),
147 164 # extra repo fields
148 ('extra:<extra_key_name>', 'Extra repo variables, read from its settings.'),
149
165 ('Repository', [
166 ('extra:<extra_key_name>', 'Extra repo variables, read from its settings.'),
167 ]
168 ),
150 169 # special attrs below that we handle, using multi-call
151 ('branch', 'Name of each branch submitted, if any.'),
152 ('branch_head', 'Head ID of pushed branch (full sha of last commit), if any.'),
153 ('commit_id', 'ID (full sha) of each commit submitted, if any.'),
154
170 ('Commit push - Multicalls', [
171 ('branch', 'Name of each branch submitted, if any.'),
172 ('branch_head', 'Head ID of pushed branch (full sha of last commit), if any.'),
173 ('commit_id', 'ID (full sha) of each commit submitted, if any.'),
174 ]
175 ),
155 176 # pr events vars
156 ('pull_request_id', 'Unique ID of the pull request.'),
157 ('pull_request_title', 'Title of the pull request.'),
158 ('pull_request_url', 'Pull request url.'),
159 ('pull_request_shadow_url', 'Pull request shadow repo clone url.'),
160 ('pull_request_commits_uid', 'Calculated UID of all commits inside the PR. '
161 'Changes after PR update'),
177 ('Pull request', [
178 ('pull_request_id', 'Unique ID of the pull request.'),
179 ('pull_request_title', 'Title of the pull request.'),
180 ('pull_request_url', 'Pull request url.'),
181 ('pull_request_shadow_url', 'Pull request shadow repo clone url.'),
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 200 # user who triggers the call
164 ('username', 'User who triggered the call.'),
165 ('user_id', 'User id who triggered the call.'),
201 ('Caller', [
202 ('username', 'User who triggered the call.'),
203 ('user_id', 'User id who triggered the call.'),
204 ]
205 ),
166 206 ]
167 207
168 208 # common vars for url template used for CI plugins. Shared with webhook
@@ -271,6 +311,26 b' class WebhookDataHandler(CommitParsingDa'
271 311
272 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 334 def repo_create_event_handler(self, event, data):
275 335 url = self.get_base_parsed_template(data)
276 336 log.debug('register %s call(%s) to url %s', self.name, event, url)
@@ -298,12 +358,13 b' class WebhookDataHandler(CommitParsingDa'
298 358 return self.repo_push_event_handler(event, data)
299 359 elif isinstance(event, events.RepoCreateEvent):
300 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 363 elif isinstance(event, events.PullRequestEvent):
302 364 return self.pull_request_event_handler(event, data)
303 365 else:
304 366 raise ValueError(
305 'event type `%s` not in supported list: %s' % (
306 event.__class__, events))
367 'event type `{}` has no handler defined'.format(event.__class__))
307 368
308 369
309 370 def get_auth(settings):
@@ -320,9 +381,13 b' def get_web_token(settings):'
320 381
321 382
322 383 def get_url_vars(url_vars):
323 return '\n'.join(
324 '{} - {}'.format('${' + key + '}', explanation)
325 for key, explanation in url_vars)
384 items = []
385
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 393 def render_with_traceback(template, *args, **kwargs):
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -19,13 +19,14 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 from __future__ import unicode_literals
22 import deform
23 22 import logging
23
24 24 import colander
25
25 import deform.widget
26 26 from mako.template import Template
27 27
28 28 from rhodecode import events
29 from rhodecode.model.validation_schema.widgets import CheckboxChoiceWidgetDesc
29 30 from rhodecode.translation import _
30 31 from rhodecode.lib.celerylib import run_task
31 32 from rhodecode.lib.celerylib import tasks
@@ -174,6 +175,10 b' class EmailIntegrationType(IntegrationTy'
174 175 display_name = _('Email')
175 176 description = _('Send repo push summaries to a list of recipients via email')
176 177
178 valid_events = [
179 events.RepoPushEvent
180 ]
181
177 182 @classmethod
178 183 def icon(cls):
179 184 return '''
@@ -240,59 +245,86 b' class EmailIntegrationType(IntegrationTy'
240 245
241 246 def settings_schema(self):
242 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 258 return schema
244 259
245 260 def send_event(self, event):
246 data = event.as_dict()
247 log.debug('got event: %r', event)
261 log.debug('handling event %s with integration %s', event.name, self)
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 281 if isinstance(event, events.RepoPushEvent):
250 repo_push_handler(data, self.settings)
282 self.repo_push_handler(event, event_data)
251 283 else:
252 284 log.debug('ignoring event: %r', event)
253 285
254
255 def repo_push_handler(data, settings):
256 commit_num = len(data['push']['commits'])
257 server_url = data['server_url']
286 def repo_push_handler(self, event, data):
287 commit_num = len(data['push']['commits'])
288 server_url = data['server_url']
258 289
259 if commit_num == 1:
260 if data['push']['branches']:
261 _subject = '[{repo_name}] {author} pushed {commit_num} commit on branches: {branches}'
262 else:
263 _subject = '[{repo_name}] {author} pushed {commit_num} commit'
264 subject = _subject.format(
265 author=data['actor']['username'],
266 repo_name=data['repo']['repo_name'],
267 commit_num=commit_num,
268 branches=', '.join(
269 branch['name'] for branch in data['push']['branches'])
270 )
271 else:
272 if data['push']['branches']:
273 _subject = '[{repo_name}] {author} pushed {commit_num} commits on branches: {branches}'
290 if commit_num == 1:
291 if data['push']['branches']:
292 _subject = '[{repo_name}] {author} pushed {commit_num} commit on branches: {branches}'
293 else:
294 _subject = '[{repo_name}] {author} pushed {commit_num} commit'
295 subject = _subject.format(
296 author=data['actor']['username'],
297 repo_name=data['repo']['repo_name'],
298 commit_num=commit_num,
299 branches=', '.join(
300 branch['name'] for branch in data['push']['branches'])
301 )
274 302 else:
275 _subject = '[{repo_name}] {author} pushed {commit_num} commits'
276 subject = _subject.format(
277 author=data['actor']['username'],
278 repo_name=data['repo']['repo_name'],
279 commit_num=commit_num,
280 branches=', '.join(
281 branch['name'] for branch in data['push']['branches']))
303 if data['push']['branches']:
304 _subject = '[{repo_name}] {author} pushed {commit_num} commits on branches: {branches}'
305 else:
306 _subject = '[{repo_name}] {author} pushed {commit_num} commits'
307 subject = _subject.format(
308 author=data['actor']['username'],
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(
284 REPO_PUSH_TEMPLATE_PLAINTEXT,
285 data=data,
286 subject=subject,
287 instance_url=server_url)
314 email_body_plaintext = render_with_traceback(
315 REPO_PUSH_TEMPLATE_PLAINTEXT,
316 data=data,
317 subject=subject,
318 instance_url=server_url)
288 319
289 email_body_html = render_with_traceback(
290 REPO_PUSH_TEMPLATE_HTML,
291 data=data,
292 subject=subject,
293 instance_url=server_url)
320 email_body_html = render_with_traceback(
321 REPO_PUSH_TEMPLATE_HTML,
322 data=data,
323 subject=subject,
324 instance_url=server_url)
294 325
295 for email_address in settings['recipients']:
296 run_task(
297 tasks.send_email, email_address, subject,
298 email_body_plaintext, email_body_html)
326 recipients = self.integration_settings['recipients']
327 for email_address in recipients:
328 run_task(
329 tasks.send_email, email_address, subject,
330 email_body_plaintext, email_body_html)
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -26,6 +26,7 b' import colander'
26 26 import textwrap
27 27 from mako.template import Template
28 28 from rhodecode import events
29 from rhodecode.model.validation_schema.widgets import CheckboxChoiceWidgetDesc
29 30 from rhodecode.translation import _
30 31 from rhodecode.lib import helpers as h
31 32 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
@@ -119,13 +120,10 b' class HipchatIntegrationType(Integration'
119 120
120 121 def send_event(self, event):
121 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 124 return
124 125
125 allowed_events = self.settings['events']
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)
126 if not self.event_enabled(event):
129 127 return
130 128
131 129 data = event.as_dict()
@@ -133,8 +131,6 b' class HipchatIntegrationType(Integration'
133 131 text = '<b>%s<b> caused a <b>%s</b> event' % (
134 132 data['actor']['username'], event.name)
135 133
136 log.debug('handling hipchat event for %s', event.name)
137
138 134 if isinstance(event, events.PullRequestCommentEvent):
139 135 text = self.format_pull_request_comment_event(event, data)
140 136 elif isinstance(event, events.PullRequestReviewEvent):
@@ -154,12 +150,12 b' class HipchatIntegrationType(Integration'
154 150 schema = HipchatSettingsSchema()
155 151 schema.add(colander.SchemaNode(
156 152 colander.Set(),
157 widget=deform.widget.CheckboxChoiceWidget(
153 widget=CheckboxChoiceWidgetDesc(
158 154 values=sorted(
159 [(e.name, e.display_name) for e in self.valid_events]
160 )
155 [(e.name, e.display_name, e.description) for e in self.valid_events]
156 ),
161 157 ),
162 description="Events activated for this integration",
158 description="List of events activated for this integration",
163 159 name='events'
164 160 ))
165 161
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -30,6 +30,7 b' import colander'
30 30 from mako.template import Template
31 31
32 32 from rhodecode import events
33 from rhodecode.model.validation_schema.widgets import CheckboxChoiceWidgetDesc
33 34 from rhodecode.translation import _
34 35 from rhodecode.lib import helpers as h
35 36 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
@@ -134,14 +135,13 b' class SlackIntegrationType(IntegrationTy'
134 135 ]
135 136
136 137 def send_event(self, event):
138 log.debug('handling event %s with integration %s', event.name, self)
139
137 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 142 return
140 143
141 allowed_events = self.settings['events']
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)
144 if not self.event_enabled(event):
145 145 return
146 146
147 147 data = event.as_dict()
@@ -154,8 +154,6 b' class SlackIntegrationType(IntegrationTy'
154 154 fields = None
155 155 overrides = None
156 156
157 log.debug('handling slack event for %s', event.name)
158
159 157 if isinstance(event, events.PullRequestCommentEvent):
160 158 (title, text, fields, overrides) \
161 159 = self.format_pull_request_comment_event(event, data)
@@ -176,12 +174,12 b' class SlackIntegrationType(IntegrationTy'
176 174 schema = SlackSettingsSchema()
177 175 schema.add(colander.SchemaNode(
178 176 colander.Set(),
179 widget=deform.widget.CheckboxChoiceWidget(
177 widget=CheckboxChoiceWidgetDesc(
180 178 values=sorted(
181 [(e.name, e.display_name) for e in self.valid_events]
182 )
179 [(e.name, e.display_name, e.description) for e in self.valid_events]
180 ),
183 181 ),
184 description="Events activated for this integration",
182 description="List of events activated for this integration",
185 183 name='events'
186 184 ))
187 185
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -20,13 +20,14 b''
20 20
21 21 from __future__ import unicode_literals
22 22
23 import deform
24 23 import deform.widget
25 24 import logging
26 25 import colander
27 26
28 27 import rhodecode
29 28 from rhodecode import events
29 from rhodecode.lib.colander_utils import strip_whitespace
30 from rhodecode.model.validation_schema.widgets import CheckboxChoiceWidgetDesc
30 31 from rhodecode.translation import _
31 32 from rhodecode.integrations.types.base import (
32 33 IntegrationTypeBase, get_auth, get_web_token, get_url_vars,
@@ -53,11 +54,12 b' class WebhookSettingsSchema(colander.Sch'
53 54 'objects in data in such cases.'),
54 55 missing=colander.required,
55 56 required=True,
57 preparer=strip_whitespace,
56 58 validator=colander.url,
57 59 widget=widgets.CodeMirrorWidget(
58 60 help_block_collapsable_name='Show url variables',
59 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 63 '?PR_ID=${{pull_request_id}}'
62 64 '\nFull list of vars:\n{}'.format(URL_VARS)),
63 65 codemirror_mode='text',
@@ -146,34 +148,31 b' class WebhookIntegrationType(Integration'
146 148 events.PullRequestCreateEvent,
147 149 events.RepoPushEvent,
148 150 events.RepoCreateEvent,
151 events.RepoCommitCommentEvent,
149 152 ]
150 153
151 154 def settings_schema(self):
152 155 schema = WebhookSettingsSchema()
153 156 schema.add(colander.SchemaNode(
154 157 colander.Set(),
155 widget=deform.widget.CheckboxChoiceWidget(
158 widget=CheckboxChoiceWidgetDesc(
156 159 values=sorted(
157 [(e.name, e.display_name) for e in self.valid_events]
158 )
160 [(e.name, e.display_name, e.description) for e in self.valid_events]
161 ),
159 162 ),
160 description="Events activated for this integration",
163 description="List of events activated for this integration",
161 164 name='events'
162 165 ))
163 166 return schema
164 167
165 168 def send_event(self, event):
166 log.debug(
167 'handling event %s with Webhook integration %s', event.name, self)
169 log.debug('handling event %s with integration %s', event.name, self)
168 170
169 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 173 return
172 174
173 allowed_events = self.settings['events']
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)
175 if not self.event_enabled(event):
177 176 return
178 177
179 178 data = event.as_dict()
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2017-2019 RhodeCode GmbH
3 # Copyright (C) 2017-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 25 import os
26
27 import colander
26 28 import time
27 29 import collections
28 30 import fnmatch
@@ -45,15 +47,14 b' from rhodecode.model import meta'
45 47 from rhodecode.model.meta import Session
46 48 from rhodecode.model.user import UserModel
47 49 from rhodecode.model.db import (
48 User, Repository, Permission, UserToPerm, UserGroupToPerm, UserGroupMember,
49 UserIpMap, UserApiKeys, RepoGroup, UserGroup)
50 false, User, Repository, Permission, UserToPerm, UserGroupToPerm, UserGroupMember,
51 UserIpMap, UserApiKeys, RepoGroup, UserGroup, UserNotice)
50 52 from rhodecode.lib import rc_cache
51 53 from rhodecode.lib.utils2 import safe_unicode, aslist, safe_str, md5, safe_int, sha1
52 54 from rhodecode.lib.utils import (
53 55 get_repo_slug, get_repo_group_slug, get_user_group_slug)
54 56 from rhodecode.lib.caching_query import FromCache
55 57
56
57 58 if rhodecode.is_unix:
58 59 import bcrypt
59 60
@@ -1312,7 +1313,10 b' class AuthUser(object):'
1312 1313 if not perms:
1313 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 1320 qry = Repository.query()
1317 1321 if _name_filter:
1318 1322 ilike_expression = u'%{}%'.format(safe_unicode(_name_filter))
@@ -1322,7 +1326,21 b' class AuthUser(object):'
1322 1326 return [x.repo_id for x in
1323 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 1345 def repo_group_acl_ids_from_stack(self, perms=None, prefix_filter=None, cache=False):
1328 1346 if not perms:
@@ -1346,7 +1364,10 b' class AuthUser(object):'
1346 1364 if not perms:
1347 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 1371 qry = RepoGroup.query()
1351 1372 if _name_filter:
1352 1373 ilike_expression = u'%{}%'.format(safe_unicode(_name_filter))
@@ -1356,7 +1377,21 b' class AuthUser(object):'
1356 1377 return [x.group_id for x in
1357 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 1396 def user_group_acl_ids_from_stack(self, perms=None, cache=False):
1362 1397 if not perms:
@@ -1378,17 +1413,34 b' class AuthUser(object):'
1378 1413 if not perms:
1379 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 1420 qry = UserGroup.query()
1383 if name_filter:
1384 ilike_expression = u'%{}%'.format(safe_unicode(name_filter))
1421 if _name_filter:
1422 ilike_expression = u'%{}%'.format(safe_unicode(_name_filter))
1385 1423 qry = qry.filter(
1386 1424 UserGroup.users_group_name.ilike(ilike_expression))
1387 1425
1388 1426 return [x.users_group_id for x in
1389 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 1445 @property
1394 1446 def ip_allowed(self):
@@ -1402,6 +1454,7 b' class AuthUser(object):'
1402 1454 inherit = self.inherit_default_permissions
1403 1455 return AuthUser.check_ip_allowed(self.user_id, self.ip_addr,
1404 1456 inherit_from_default=inherit)
1457
1405 1458 @property
1406 1459 def personal_repo_group(self):
1407 1460 return RepoGroup.get_user_personal_repo_group(self.user_id)
@@ -1455,9 +1508,40 b' class AuthUser(object):'
1455 1508
1456 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 1543 def __repr__(self):
1459 return "<AuthUser('id:%s[%s] ip:%s auth:%s')>"\
1460 % (self.user_id, self.username, self.ip_addr, self.is_authenticated)
1544 return self.repr_user(self.user_id, self.username, self.ip_addr, self.is_authenticated)
1461 1545
1462 1546 def set_authenticated(self, authenticated=True):
1463 1547 if self.user_id != self.anonymous_user.user_id:
@@ -1472,6 +1556,11 b' class AuthUser(object):'
1472 1556 }
1473 1557
1474 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 1564 def from_cookie_store(cls, cookie_store):
1476 1565 """
1477 1566 Creates AuthUser from a cookie store
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 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 288 Attach variables into template context called `c`.
289 289 """
@@ -379,7 +379,8 b' def attach_context_attributes(context, r'
379 379 "sideside": "sideside"
380 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 384 session_attrs = {
384 385 # defaults
385 386 "clone_url_format": "http",
@@ -436,7 +437,7 b' def attach_context_attributes(context, r'
436 437
437 438 context.csrf_token = csrf_token
438 439 context.backends = rhodecode.BACKENDS.keys()
439 context.backends.sort()
440
440 441 unread_count = 0
441 442 user_bookmark_list = []
442 443 if user_id:
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 49 :param subject: subject of the mail
50 50 :param body: body of the mail
51 51 :param html_body: html version of body
52 :param email_config: specify custom configuration for mailer
52 53 """
53 54 log = get_logger(send_email)
54 55
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2016-2019 RhodeCode GmbH
3 # Copyright (C) 2016-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2011-2019 RhodeCode GmbH
3 # Copyright (C) 2011-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2012-2019 RhodeCode GmbH
3 # Copyright (C) 2012-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 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 13 warnings.simplefilter('always', DeprecationWarning)
14 14
15 _sa_version = tuple(int(re.match("\d+", x).group(0))
16 for x in _sa_version.split("."))
15 _sa_version = tuple(int(re.match("\d+", x).group(0)) for x in _sa_version.split("."))
17 16 SQLA_07 = _sa_version >= (0, 7)
18 17 SQLA_08 = _sa_version >= (0, 8)
18 SQLA_09 = _sa_version >= (0, 9)
19 SQLA_10 = _sa_version >= (1, 0)
19 20
20 21 del re
21 22 del _sa_version
@@ -23,8 +24,8 b' del _sa_version'
23 24 from rhodecode.lib.dbmigrate.migrate.changeset.schema import *
24 25 from rhodecode.lib.dbmigrate.migrate.changeset.constraint import *
25 26
26 sqlalchemy.schema.Table.__bases__ += (ChangesetTable,)
27 sqlalchemy.schema.Column.__bases__ += (ChangesetColumn,)
28 sqlalchemy.schema.Index.__bases__ += (ChangesetIndex,)
27 sqlalchemy.schema.Table.__bases__ += (ChangesetTable, )
28 sqlalchemy.schema.Column.__bases__ += (ChangesetColumn, )
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 98 table = self.start_alter_table(column)
99 99 self.append("ADD ")
100
101 100 self.append(self.get_column_specification(column))
102 101
103 102 for cons in column.constraints:
@@ -111,7 +111,7 b' class ForeignKeyConstraint(ConstraintCha'
111 111 refcolnames, reftable = self._normalize_columns(refcolumns,
112 112 table_name=True)
113 113 super(ForeignKeyConstraint, self).__init__(
114 colnames, refcolnames, *args,**kwargs
114 colnames, refcolnames, *args, **kwargs
115 115 )
116 116 if table is not None:
117 117 self._set_parent(table)
@@ -3,16 +3,20 b''
3 3
4 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 10 from copy import copy
8 11 import re
9 12
10 13 from sqlalchemy.databases import sqlite as sa_base
14 from sqlalchemy.schema import ForeignKeyConstraint
11 15 from sqlalchemy.schema import UniqueConstraint
12 16
13 17 from rhodecode.lib.dbmigrate.migrate import exceptions
14 18 from rhodecode.lib.dbmigrate.migrate.changeset import ansisql
15
19 import sqlite3
16 20
17 21 SQLiteSchemaGenerator = sa_base.SQLiteDDLCompiler
18 22
@@ -73,10 +77,16 b' class SQLiteHelper(SQLiteCommon):'
73 77 cons for cons in table.constraints
74 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 85 self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name)
78 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 90 insertion_string = self._modify_table(table, column, delta)
81 91
82 92 table.create(bind=self.connection)
@@ -1,10 +1,13 b''
1 1 """
2 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 9 import warnings
5 10
6 from UserDict import DictMixin
7
8 11 import sqlalchemy
9 12
10 13 from sqlalchemy.schema import ForeignKeyConstraint
@@ -1,6 +1,17 b''
1 1 """
2 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 16 def safe_quote(obj):
6 17 # this is the SQLA 0.9 approach
@@ -27,6 +27,10 b' class InvalidVersionError(ControlledSche'
27 27 """Invalid version number."""
28 28
29 29
30 class VersionNotFoundError(KeyError):
31 """Specified version is not present."""
32
33
30 34 class DatabaseNotControlledError(ControlledSchemaError):
31 35 """Database should be under version control, but it's not."""
32 36
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
@@ -1,6 +1,6 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 # Copyright (C) 2010-2019 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now