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.1 |
|
|
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 = |
|
|
24 |
version = 4.1 |
|
|
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 |
|
|
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 6 |
|
|
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 6 |
|
|
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 6 |
|
|
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/ |
|
|
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- |
|
|
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. |
|
|
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 |
|
|
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.1 |
|
|
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. |
|
|
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. |
|
|
56 | src = fetchurl { | |
|
57 |
url = "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0. |
|
|
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. |
|
|
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. |
|
|
83 | src = fetchurl { | |
|
84 |
url = "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0. |
|
|
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. |
|
|
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. |
|
|
119 | src = fetchurl { | |
|
120 |
url = "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0. |
|
|
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. |
|
|
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. |
|
|
164 | src = fetchurl { | |
|
165 |
url = "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0. |
|
|
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. |
|
|
214 | "@polymer/polymer-3.3.1" = { | |
|
215 | 215 | name = "_at_polymer_slash_polymer"; |
|
216 | 216 | packageName = "@polymer/polymer"; |
|
217 |
version = "3.3. |
|
|
218 | src = fetchurl { | |
|
219 |
url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.3. |
|
|
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. |
|
|
232 | "@types/node-6.14.10" = { | |
|
233 | 233 | name = "_at_types_slash_node"; |
|
234 | 234 | packageName = "@types/node"; |
|
235 |
version = "6.14. |
|
|
236 | src = fetchurl { | |
|
237 |
url = "https://registry.npmjs.org/@types/node/-/node-6.14. |
|
|
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. |
|
|
412 | "@webcomponents/shadycss-1.9.6" = { | |
|
413 | 413 | name = "_at_webcomponents_slash_shadycss"; |
|
414 | 414 | packageName = "@webcomponents/shadycss"; |
|
415 |
version = "1.9. |
|
|
416 | src = fetchurl { | |
|
417 |
url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9. |
|
|
418 | sha512 = "GsD7RpDVrVdgC6e+D8zQia8RGNmEGQ9/qotnVPQYPrIXhGS5xSt6ZED9YmuHz3HbLqY+E54tE1EK3tjLzSCGrw=="; | |
|
419 | }; | |
|
420 | }; | |
|
421 |
"@webcomponents/webcomponentsjs-2.3 |
|
|
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 |
|
|
425 | src = fetchurl { | |
|
426 |
url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.3 |
|
|
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. |
|
|
466 | "acorn-5.7.4" = { | |
|
467 | 467 | name = "acorn"; |
|
468 | 468 | packageName = "acorn"; |
|
469 |
version = "5.7. |
|
|
470 | src = fetchurl { | |
|
471 |
url = "https://registry.npmjs.org/acorn/-/acorn-5.7. |
|
|
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 |
|
|
502 | "ajv-6.12.0" = { | |
|
503 | 503 | name = "ajv"; |
|
504 | 504 | packageName = "ajv"; |
|
505 |
version = "6.10 |
|
|
506 | src = fetchurl { | |
|
507 |
url = "https://registry.npmjs.org/ajv/-/ajv-6.10 |
|
|
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. |
|
|
863 | "aws4-1.9.1" = { | |
|
864 | 864 | name = "aws4"; |
|
865 | 865 | packageName = "aws4"; |
|
866 |
version = "1. |
|
|
867 | src = fetchurl { | |
|
868 |
url = "https://registry.npmjs.org/aws4/-/aws4-1. |
|
|
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 |
"b |
|
|
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. |
|
|
1452 | src = fetchurl { | |
|
1453 |
url = "https://registry.npmjs.org/bluebird/-/bluebird-3.7. |
|
|
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. |
|
|
1592 | "buffer-4.9.2" = { | |
|
1584 | 1593 | name = "buffer"; |
|
1585 | 1594 | packageName = "buffer"; |
|
1586 |
version = "4.9. |
|
|
1587 | src = fetchurl { | |
|
1588 |
url = "https://registry.npmjs.org/buffer/-/buffer-4.9. |
|
|
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.300010 |
|
|
1682 | "caniuse-db-1.0.30001042" = { | |
|
1674 | 1683 | name = "caniuse-db"; |
|
1675 | 1684 | packageName = "caniuse-db"; |
|
1676 |
version = "1.0.300010 |
|
|
1677 | src = fetchurl { | |
|
1678 |
url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.300010 |
|
|
1679 | sha512 = "Xn25grc0GXATFnnEX+KP3IwEv6ZdHs4CALyLKvK8pBeeBe+hSpqy3/GyKBgEp4hn6o+bI+GNeNeQBf9PBOK0EQ=="; | |
|
1680 | }; | |
|
1681 | }; | |
|
1682 |
"caniuse-lite-1.0.300010 |
|
|
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.300010 |
|
|
1686 | src = fetchurl { | |
|
1687 |
url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.300010 |
|
|
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. |
|
|
1754 | "chownr-1.1.4" = { | |
|
1746 | 1755 | name = "chownr"; |
|
1747 | 1756 | packageName = "chownr"; |
|
1748 |
version = "1.1. |
|
|
1749 | src = fetchurl { | |
|
1750 |
url = "https://registry.npmjs.org/chownr/-/chownr-1.1. |
|
|
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. |
|
|
1799 | "clean-css-4.2.3" = { | |
|
1791 | 1800 | name = "clean-css"; |
|
1792 | 1801 | packageName = "clean-css"; |
|
1793 |
version = "4.2. |
|
|
1794 | src = fetchurl { | |
|
1795 |
url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2. |
|
|
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. |
|
|
1817 | "clipboard-2.0.6" = { | |
|
1809 | 1818 | name = "clipboard"; |
|
1810 | 1819 | packageName = "clipboard"; |
|
1811 |
version = "2.0. |
|
|
1812 | src = fetchurl { | |
|
1813 |
url = "https://registry.npmjs.org/clipboard/-/clipboard-2.0. |
|
|
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. |
|
|
2078 | "convert-source-map-1.7.0" = { | |
|
2070 | 2079 | name = "convert-source-map"; |
|
2071 | 2080 | packageName = "convert-source-map"; |
|
2072 |
version = "1. |
|
|
2073 | src = fetchurl { | |
|
2074 |
url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1. |
|
|
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.1 |
|
|
2114 | "core-js-2.6.11" = { | |
|
2106 | 2115 | name = "core-js"; |
|
2107 | 2116 | packageName = "core-js"; |
|
2108 |
version = "2.6.1 |
|
|
2109 | src = fetchurl { | |
|
2110 |
url = "https://registry.npmjs.org/core-js/-/core-js-2.6.1 |
|
|
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. |
|
|
2213 | "css-selector-tokenizer-0.7.2" = { | |
|
2205 | 2214 | name = "css-selector-tokenizer"; |
|
2206 | 2215 | packageName = "css-selector-tokenizer"; |
|
2207 |
version = "0.7. |
|
|
2208 | src = fetchurl { | |
|
2209 |
url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7. |
|
|
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 |
|
|
2231 | "cssesc-3.0.0" = { | |
|
2223 | 2232 | name = "cssesc"; |
|
2224 | 2233 | packageName = "cssesc"; |
|
2225 |
version = "0 |
|
|
2226 | src = fetchurl { | |
|
2227 |
url = "https://registry.npmjs.org/cssesc/-/cssesc-0 |
|
|
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. |
|
|
2402 | "des.js-1.0.1" = { | |
|
2394 | 2403 | name = "des.js"; |
|
2395 | 2404 | packageName = "des.js"; |
|
2396 |
version = "1.0. |
|
|
2397 | src = fetchurl { | |
|
2398 |
url = "https://registry.npmjs.org/des.js/-/des.js-1.0. |
|
|
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. |
|
|
2456 | "dom-serializer-0.2.2" = { | |
|
2448 | 2457 | name = "dom-serializer"; |
|
2449 | 2458 | packageName = "dom-serializer"; |
|
2450 |
version = "0.2. |
|
|
2451 | src = fetchurl { | |
|
2452 |
url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2. |
|
|
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. |
|
|
2519 | "dropzone-5.7.0" = { | |
|
2511 | 2520 | name = "dropzone"; |
|
2512 | 2521 | packageName = "dropzone"; |
|
2513 |
version = "5. |
|
|
2514 | src = fetchurl { | |
|
2515 |
url = "https://registry.npmjs.org/dropzone/-/dropzone-5. |
|
|
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. |
|
|
2555 | "electron-to-chromium-1.3.412" = { | |
|
2547 | 2556 | name = "electron-to-chromium"; |
|
2548 | 2557 | packageName = "electron-to-chromium"; |
|
2549 |
version = "1.3. |
|
|
2550 | src = fetchurl { | |
|
2551 |
url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3. |
|
|
2552 | sha512 = "1qConyiVEbj4xZRBXqtGR003+9tV0rJF0PS6aeO0Ln/UL637js9hdwweCl07meh/kJoI2N4W8q3R3g3F5z46ww=="; | |
|
2553 | }; | |
|
2554 | }; | |
|
2555 |
"elliptic-6.5. |
|
|
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. |
|
|
2559 | src = fetchurl { | |
|
2560 |
url = "https://registry.npmjs.org/elliptic/-/elliptic-6.5. |
|
|
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.1 |
|
|
2645 | "es-abstract-1.17.5" = { | |
|
2628 | 2646 | name = "es-abstract"; |
|
2629 | 2647 | packageName = "es-abstract"; |
|
2630 |
version = "1.1 |
|
|
2631 | src = fetchurl { | |
|
2632 |
url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.1 |
|
|
2633 | sha512 = "xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg=="; | |
|
2634 | }; | |
|
2635 | }; | |
|
2636 |
"es-to-primitive-1.2. |
|
|
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. |
|
|
2640 | src = fetchurl { | |
|
2641 |
url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2. |
|
|
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. |
|
|
2762 | "events-3.1.0" = { | |
|
2745 | 2763 | name = "events"; |
|
2746 | 2764 | packageName = "events"; |
|
2747 |
version = "3. |
|
|
2748 | src = fetchurl { | |
|
2749 |
url = "https://registry.npmjs.org/events/-/events-3. |
|
|
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- |
|
|
2870 | "fast-deep-equal-3.1.1" = { | |
|
2853 | 2871 | name = "fast-deep-equal"; |
|
2854 | 2872 | packageName = "fast-deep-equal"; |
|
2855 |
version = " |
|
|
2856 | src = fetchurl { | |
|
2857 |
url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal- |
|
|
2858 | sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"; | |
|
2859 | }; | |
|
2860 | }; | |
|
2861 |
"fast-json-stable-stringify-2. |
|
|
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. |
|
|
2865 | src = fetchurl { | |
|
2866 |
url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2. |
|
|
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. |
|
|
3104 | "fsevents-1.2.12" = { | |
|
3078 | 3105 | name = "fsevents"; |
|
3079 | 3106 | packageName = "fsevents"; |
|
3080 |
version = "1.2. |
|
|
3081 | src = fetchurl { | |
|
3082 |
url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2. |
|
|
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. |
|
|
3194 | "glob-7.1.6" = { | |
|
3168 | 3195 | name = "glob"; |
|
3169 | 3196 | packageName = "glob"; |
|
3170 |
version = "7.1. |
|
|
3171 | src = fetchurl { | |
|
3172 |
url = "https://registry.npmjs.org/glob/-/glob-7.1. |
|
|
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. |
|
|
3482 | "has-symbols-1.0.1" = { | |
|
3456 | 3483 | name = "has-symbols"; |
|
3457 | 3484 | packageName = "has-symbols"; |
|
3458 |
version = "1.0. |
|
|
3459 | src = fetchurl { | |
|
3460 |
url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0. |
|
|
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. |
|
|
3914 | "is-callable-1.1.5" = { | |
|
3888 | 3915 | name = "is-callable"; |
|
3889 | 3916 | packageName = "is-callable"; |
|
3890 |
version = "1.1. |
|
|
3891 | src = fetchurl { | |
|
3892 |
url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1. |
|
|
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. |
|
|
3941 | "is-date-object-1.0.2" = { | |
|
3915 | 3942 | name = "is-date-object"; |
|
3916 | 3943 | packageName = "is-date-object"; |
|
3917 |
version = "1.0. |
|
|
3918 | src = fetchurl { | |
|
3919 |
url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0. |
|
|
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 |
|
|
3995 | "is-finite-1.1.0" = { | |
|
3969 | 3996 | name = "is-finite"; |
|
3970 | 3997 | packageName = "is-finite"; |
|
3971 |
version = "1.0 |
|
|
3972 | src = fetchurl { | |
|
3973 |
url = "https://registry.npmjs.org/is-finite/-/is-finite-1.0 |
|
|
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. |
|
|
4067 | "is-regex-1.0.5" = { | |
|
4041 | 4068 | name = "is-regex"; |
|
4042 | 4069 | packageName = "is-regex"; |
|
4043 |
version = "1.0. |
|
|
4044 | src = fetchurl { | |
|
4045 |
url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0. |
|
|
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. |
|
|
4103 | "is-symbol-1.0.3" = { | |
|
4077 | 4104 | name = "is-symbol"; |
|
4078 | 4105 | packageName = "is-symbol"; |
|
4079 |
version = "1.0. |
|
|
4080 | src = fetchurl { | |
|
4081 |
url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0. |
|
|
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. |
|
|
4202 | "js-base64-2.5.2" = { | |
|
4176 | 4203 | name = "js-base64"; |
|
4177 | 4204 | packageName = "js-base64"; |
|
4178 |
version = "2.5. |
|
|
4179 | src = fetchurl { | |
|
4180 |
url = "https://registry.npmjs.org/js-base64/-/js-base64-2.5. |
|
|
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 |
|
|
4265 | "jshint-2.11.0" = { | |
|
4239 | 4266 | name = "jshint"; |
|
4240 | 4267 | packageName = "jshint"; |
|
4241 |
version = "2.10 |
|
|
4242 | src = fetchurl { | |
|
4243 |
url = "https://registry.npmjs.org/jshint/-/jshint-2.10 |
|
|
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. |
|
|
4391 | "kind-of-6.0.3" = { | |
|
4365 | 4392 | name = "kind-of"; |
|
4366 | 4393 | packageName = "kind-of"; |
|
4367 |
version = "6.0. |
|
|
4368 | src = fetchurl { | |
|
4369 |
url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0. |
|
|
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. |
|
|
4454 | "loader-utils-1.4.0" = { | |
|
4428 | 4455 | name = "loader-utils"; |
|
4429 | 4456 | packageName = "loader-utils"; |
|
4430 |
version = "1. |
|
|
4431 | src = fetchurl { | |
|
4432 |
url = "https://registry.npmjs.org/loader-utils/-/loader-utils-1. |
|
|
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. |
|
|
4652 | "math-expression-evaluator-1.2.22" = { | |
|
4626 | 4653 | name = "math-expression-evaluator"; |
|
4627 | 4654 | packageName = "math-expression-evaluator"; |
|
4628 |
version = "1.2. |
|
|
4629 | src = fetchurl { | |
|
4630 |
url = "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2. |
|
|
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.4 |
|
|
4733 | "mime-db-1.43.0" = { | |
|
4707 | 4734 | name = "mime-db"; |
|
4708 | 4735 | packageName = "mime-db"; |
|
4709 |
version = "1.4 |
|
|
4710 | src = fetchurl { | |
|
4711 |
url = "https://registry.npmjs.org/mime-db/-/mime-db-1.4 |
|
|
4712 | sha512 = "jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="; | |
|
4713 | }; | |
|
4714 | }; | |
|
4715 |
"mime-types-2.1.2 |
|
|
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.2 |
|
|
4719 | src = fetchurl { | |
|
4720 |
url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.2 |
|
|
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- |
|
|
4805 | "minimist-1.2.5" = { | |
|
4779 | 4806 | name = "minimist"; |
|
4780 | 4807 | packageName = "minimist"; |
|
4781 |
version = " |
|
|
4782 | src = fetchurl { | |
|
4783 |
url = "https://registry.npmjs.org/minimist/-/minimist- |
|
|
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. |
|
|
4832 | "mkdirp-0.5.5" = { | |
|
4815 | 4833 | name = "mkdirp"; |
|
4816 | 4834 | packageName = "mkdirp"; |
|
4817 |
version = "0.5. |
|
|
4818 | src = fetchurl { | |
|
4819 |
url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5. |
|
|
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. |
|
|
4850 | "mousetrap-1.6.5" = { | |
|
4833 | 4851 | name = "mousetrap"; |
|
4834 | 4852 | packageName = "mousetrap"; |
|
4835 |
version = "1.6. |
|
|
4836 | src = fetchurl { | |
|
4837 |
url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6. |
|
|
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. |
|
|
4949 | "nopt-4.0.3" = { | |
|
4932 | 4950 | name = "nopt"; |
|
4933 | 4951 | packageName = "nopt"; |
|
4934 |
version = "4.0. |
|
|
4935 | src = fetchurl { | |
|
4936 |
url = "https://registry.npmjs.org/nopt/-/nopt-4.0. |
|
|
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. |
|
|
5066 | "object-inspect-1.7.0" = { | |
|
5049 | 5067 | name = "object-inspect"; |
|
5050 | 5068 | packageName = "object-inspect"; |
|
5051 |
version = "1. |
|
|
5052 | src = fetchurl { | |
|
5053 |
url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1. |
|
|
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 |
|
|
5111 | "object.getownpropertydescriptors-2.1.0" = { | |
|
5085 | 5112 | name = "object.getownpropertydescriptors"; |
|
5086 | 5113 | packageName = "object.getownpropertydescriptors"; |
|
5087 |
version = "2.0 |
|
|
5088 | src = fetchurl { | |
|
5089 |
url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0 |
|
|
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. |
|
|
5228 | "p-limit-2.3.0" = { | |
|
5202 | 5229 | name = "p-limit"; |
|
5203 | 5230 | packageName = "p-limit"; |
|
5204 |
version = "2. |
|
|
5205 | src = fetchurl { | |
|
5206 |
url = "https://registry.npmjs.org/p-limit/-/p-limit-2. |
|
|
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.1 |
|
|
5273 | "pako-1.0.11" = { | |
|
5247 | 5274 | name = "pako"; |
|
5248 | 5275 | packageName = "pako"; |
|
5249 |
version = "1.0.1 |
|
|
5250 | src = fetchurl { | |
|
5251 |
url = "https://registry.npmjs.org/pako/-/pako-1.0.1 |
|
|
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. |
|
|
6065 | "readable-stream-2.3.7" = { | |
|
6039 | 6066 | name = "readable-stream"; |
|
6040 | 6067 | packageName = "readable-stream"; |
|
6041 |
version = "2.3. |
|
|
6042 | src = fetchurl { | |
|
6043 |
url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3. |
|
|
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.1 |
|
|
6299 | "resolve-1.16.0" = { | |
|
6246 | 6300 | name = "resolve"; |
|
6247 | 6301 | packageName = "resolve"; |
|
6248 |
version = "1.1 |
|
|
6249 | src = fetchurl { | |
|
6250 |
url = "https://registry.npmjs.org/resolve/-/resolve-1.1 |
|
|
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. |
|
|
6551 | "signal-exit-3.0.3" = { | |
|
6498 | 6552 | name = "signal-exit"; |
|
6499 | 6553 | packageName = "signal-exit"; |
|
6500 |
version = "3.0. |
|
|
6501 | src = fetchurl { | |
|
6502 |
url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0. |
|
|
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. |
|
|
6668 | "source-map-resolve-0.5.3" = { | |
|
6615 | 6669 | name = "source-map-resolve"; |
|
6616 | 6670 | packageName = "source-map-resolve"; |
|
6617 |
version = "0.5. |
|
|
6618 | src = fetchurl { | |
|
6619 |
url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5. |
|
|
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. |
|
|
6776 | "stream-shift-1.0.1" = { | |
|
6723 | 6777 | name = "stream-shift"; |
|
6724 | 6778 | packageName = "stream-shift"; |
|
6725 |
version = "1.0. |
|
|
6726 | src = fetchurl { | |
|
6727 |
url = "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0. |
|
|
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.trim |
|
|
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. |
|
|
6762 | src = fetchurl { | |
|
6763 |
url = "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1. |
|
|
6764 | sha512 = "FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw=="; | |
|
6765 | }; | |
|
6766 | }; | |
|
6767 |
"string.prototype.trimright-2.1. |
|
|
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. |
|
|
6771 | src = fetchurl { | |
|
6772 |
url = "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1. |
|
|
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.1 |
|
|
7136 | "tslib-1.11.1" = { | |
|
7056 | 7137 | name = "tslib"; |
|
7057 | 7138 | packageName = "tslib"; |
|
7058 |
version = "1.1 |
|
|
7059 | src = fetchurl { | |
|
7060 |
url = "https://registry.npmjs.org/tslib/-/tslib-1.1 |
|
|
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. |
|
|
7208 | "uglify-js-3.9.1" = { | |
|
7128 | 7209 | name = "uglify-js"; |
|
7129 | 7210 | packageName = "uglify-js"; |
|
7130 |
version = "3. |
|
|
7131 | src = fetchurl { | |
|
7132 |
url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3. |
|
|
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. |
|
|
7478 | "uuid-3.4.0" = { | |
|
7362 | 7479 | name = "uuid"; |
|
7363 | 7480 | packageName = "uuid"; |
|
7364 |
version = "3. |
|
|
7365 | src = fetchurl { | |
|
7366 |
url = "https://registry.npmjs.org/uuid/-/uuid-3. |
|
|
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. |
|
|
7505 | "vendors-1.0.4" = { | |
|
7389 | 7506 | name = "vendors"; |
|
7390 | 7507 | packageName = "vendors"; |
|
7391 |
version = "1.0. |
|
|
7392 | src = fetchurl { | |
|
7393 |
url = "https://registry.npmjs.org/vendors/-/vendors-1.0. |
|
|
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. |
|
|
7523 | "vm-browserify-1.1.2" = { | |
|
7407 | 7524 | name = "vm-browserify"; |
|
7408 | 7525 | packageName = "vm-browserify"; |
|
7409 |
version = "1.1. |
|
|
7410 | src = fetchurl { | |
|
7411 |
url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1. |
|
|
7412 | sha512 = "iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw=="; | |
|
7413 | }; | |
|
7414 | }; | |
|
7415 |
"watchpack-1.6. |
|
|
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. |
|
|
7419 | src = fetchurl { | |
|
7420 |
url = "https://registry.npmjs.org/watchpack/-/watchpack-1.6. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
7760 | sources."@polymer/polymer-3.3.1" | |
|
7644 | 7761 | sources."@types/clone-0.1.30" |
|
7645 |
sources."@types/node-6.14. |
|
|
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. |
|
|
7666 |
sources."@webcomponents/webcomponentsjs-2.3 |
|
|
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. |
|
|
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. |
|
|
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."b |
|
|
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. |
|
|
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. |
|
|
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.300010 |
|
|
7884 |
sources."caniuse-lite-1.0.300010 |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
8048 | sources."glob-7.1.6" | |
|
7931 | 8049 | sources."minimatch-3.0.4" |
|
7932 | 8050 | ]; |
|
7933 | 8051 | }) |
|
7934 |
sources."clipboard-2.0. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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.1 |
|
|
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. |
|
|
8002 | dependencies = [ | |
|
8003 |
sources." |
|
|
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 |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
8060 |
sources."elliptic-6.5. |
|
|
8061 |
sources."emojis-list- |
|
|
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. |
|
|
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.1 |
|
|
8075 |
sources."es-to-primitive-1.2. |
|
|
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. |
|
|
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- |
|
|
8123 |
sources."fast-json-stable-stringify-2. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
8494 | sources."is-callable-1.1.5" | |
|
8372 | 8495 | sources."is-data-descriptor-1.0.0" |
|
8373 |
sources."is-date-object-1.0. |
|
|
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 |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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 |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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.4 |
|
|
8478 |
sources."mime-types-2.1.2 |
|
|
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. |
|
|
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 |
|
|
|
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. |
|
|
8615 | sources."mousetrap-1.6.5" | |
|
8497 | 8616 | (sources."move-concurrently-1.0.1" // { |
|
8498 | 8617 | dependencies = [ |
|
8499 |
sources."glob-7.1. |
|
|
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. |
|
|
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. |
|
|
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 |
|
|
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.1 |
|
|
8692 | sources."pako-1.0.11" | |
|
8573 | 8693 | (sources."parallel-transform-1.2.0" // { |
|
8574 | 8694 | dependencies = [ |
|
8575 |
sources."readable-stream-2.3. |
|
|
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. |
|
|
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.1 |
|
|
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 |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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.trim |
|
|
8896 |
sources."string.prototype.trim |
|
|
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. |
|
|
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.1 |
|
|
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 |
|
|
|
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. |
|
|
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. |
|
|
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. |
|
|
9025 |
(sources."watchpack-1.6. |
|
|
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 |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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/ |
|
|
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-20 |
|
|
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.1 |
|
|
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. |
|
|
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. |
|
|
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 |
|
|
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. |
|
|
714 | name = "hupper-1.10.2"; | |
|
693 | 715 | doCheck = false; |
|
694 | 716 | src = fetchurl { |
|
695 |
url = "https://files.pythonhosted.org/packages/0 |
|
|
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 |
|
|
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 |
|
|
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- |
|
|
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/5 |
|
|
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. |
|
|
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 |
|
|
1139 | name = "pastedeploy-2.1.0"; | |
|
1118 | 1140 | doCheck = false; |
|
1119 | 1141 | src = fetchurl { |
|
1120 |
url = "https://files.pythonhosted.org/packages/ |
|
|
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. |
|
|
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 |
|
|
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. |
|
|
1296 | name = "psutil-5.7.0"; | |
|
1257 | 1297 | doCheck = false; |
|
1258 | 1298 | src = fetchurl { |
|
1259 |
url = "https://files.pythonhosted.org/packages/ |
|
|
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. |
|
|
1391 | name = "pycparser-2.20"; | |
|
1352 | 1392 | doCheck = false; |
|
1353 | 1393 | src = fetchurl { |
|
1354 |
url = "https://files.pythonhosted.org/packages/6 |
|
|
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. |
|
|
1457 | name = "pyparsing-2.4.7"; | |
|
1418 | 1458 | doCheck = false; |
|
1419 | 1459 | src = fetchurl { |
|
1420 |
url = "https://files.pythonhosted.org/packages/ |
|
|
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. |
|
|
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 |
|
|
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. |
|
|
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. |
|
|
1745 | name = "pytz-2019.3"; | |
|
1706 | 1746 | doCheck = false; |
|
1707 | 1747 | src = fetchurl { |
|
1708 |
url = "https://files.pythonhosted.org/packages/2 |
|
|
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. |
|
|
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.1 |
|
|
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. |
|
|
2020 | name = "setuptools-44.1.0"; | |
|
1980 | 2021 | doCheck = false; |
|
1981 | 2022 | src = fetchurl { |
|
1982 |
url = "https://files.pythonhosted.org/packages/b |
|
|
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.1 |
|
|
2064 | name = "sqlalchemy-1.3.15"; | |
|
2024 | 2065 | doCheck = false; |
|
2025 | 2066 | src = fetchurl { |
|
2026 |
url = "https://files.pythonhosted.org/packages/34 |
|
|
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. |
|
|
2256 | name = "wcwidth-0.1.9"; | |
|
2216 | 2257 | doCheck = false; |
|
2217 | 2258 | src = fetchurl { |
|
2218 |
url = "https://files.pythonhosted.org/packages/ |
|
|
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.1 |
|
|
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/ |
|
|
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.3 |
|
|
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 |
|
|
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- |
|
|
2371 | name = "zipp-1.2.0"; | |
|
2331 | 2372 | doCheck = false; |
|
2332 | 2373 | propagatedBuildInputs = [ |
|
2333 |
self." |
|
|
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. |
|
|
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.1 |
|
|
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== |
|
|
33 | packaging==20.3 | |
|
34 | 34 | pathlib2==2.3.5 |
|
35 |
paste==3. |
|
|
36 |
pastedeploy==2. |
|
|
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. |
|
|
45 |
pyramid-debugtoolbar==4. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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.1 |
|
|
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.1 |
|
|
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. |
|
|
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. |
|
|
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.1 |
|
|
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. |
|
|
13 | hupper==1.10.2 | |
|
14 | 14 | ipaddress==1.0.23 |
|
15 |
importlib-metadata==0 |
|
|
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. |
|
|
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.3 |
|
|
15 | webtest==2.0.34 | |
|
16 | 16 | beautifulsoup4==4.6.3 |
@@ -1,6 +1,6 b'' | |||
|
1 | 1 | # -*- coding: utf-8 -*- |
|
2 | 2 | |
|
3 |
# Copyright (C) 2010-20 |
|
|
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__ = 10 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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 |
|
|
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 |
|
|
716 | reviewer_objects = default_reviewers_data['reviewers'] + reviewer_objects | |
|
734 | 717 | |
|
735 | 718 | try: |
|
736 | 719 | reviewers = validate_default_reviewers( |
|
737 |
reviewer_objects, reviewer |
|
|
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 |
|
|
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-20 |
|
|
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 |
|
|
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 c |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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 |
|
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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 |
|
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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() |
|
|
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() |
|
|
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-20 |
|
|
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(' |
|
|
88 |
assert element. |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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() |
|
|
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() |
|
|
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() |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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, |
|
|
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 |
|
|
|
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, |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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/ |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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= |
|
|
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= |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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] |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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': |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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_ |
|
|
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, |
|
|
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 |
|
|
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': |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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 ( |
|
|
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_ |
|
|
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-20 |
|
|
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 |
|
|
|
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-20 |
|
|
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-20 |
|
|
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() |
|
|
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() |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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', |
|
|
74 |
server.tunnel.svn_conf_path, |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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, |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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 = |
|
|
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 = |
|
|
166 | ret_val = msg | |
|
167 | 167 | except Exception as e: |
|
168 | 168 | if not noformat: |
|
169 | rval = {"status": False, | |
|
170 | "body": body, | |
|
171 |
"error": |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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 6 |
|
|
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, |
|
|
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 |
|
|
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 |
|
|
|
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", |
|
|
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 6 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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 = |
|
|
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 = |
|
|
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 |
|
|
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 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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 |
' |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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_ |
|
|
146 |
('repo_ |
|
|
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 |
|
|
153 |
(' |
|
|
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_ |
|
|
158 |
('pull_request_ |
|
|
159 |
('pull_request_ |
|
|
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 |
|
|
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-20 |
|
|
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( |
|
|
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 |
|
|
|
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-20 |
|
|
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 |
|
|
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= |
|
|
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=" |
|
|
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-20 |
|
|
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 |
|
|
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= |
|
|
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=" |
|
|
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-20 |
|
|
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= |
|
|
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=" |
|
|
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 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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-20 |
|
|
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