@@ -0,0 +1,10 | |||||
|
1 | { | |||
|
2 | "presets": [ | |||
|
3 | ["env", { | |||
|
4 | "targets": { | |||
|
5 | "browsers": ["last 2 versions"] | |||
|
6 | } | |||
|
7 | }] | |||
|
8 | ], | |||
|
9 | "plugins": ["transform-object-rest-spread"] | |||
|
10 | } |
@@ -0,0 +1,44 | |||||
|
1 | .. _integrations-rcextensions: | |||
|
2 | ||||
|
3 | ||||
|
4 | rcextensions integrations | |||
|
5 | ========================= | |||
|
6 | ||||
|
7 | ||||
|
8 | Since RhodeCode 4.14 release rcextensions aren't part of rhodecode-tools, and instead | |||
|
9 | they are shipped with the new or upgraded installations. | |||
|
10 | ||||
|
11 | The rcextensions template `rcextensions.tmpl` is created in the `etc/` directory | |||
|
12 | of enterprise or community installation. It's always re-created and updated on upgrades. | |||
|
13 | ||||
|
14 | ||||
|
15 | Activating rcextensions | |||
|
16 | +++++++++++++++++++++++ | |||
|
17 | ||||
|
18 | To activate rcextensions simply copy or rename the created template rcextensions | |||
|
19 | into the path where the rhodecode.ini file is located:: | |||
|
20 | ||||
|
21 | pushd ~/rccontrol/enterprise-1/ | |||
|
22 | or | |||
|
23 | pushd ~/rccontrol/community-1/ | |||
|
24 | ||||
|
25 | mv etc/rcextensions.tmpl rcextensions | |||
|
26 | ||||
|
27 | ||||
|
28 | rcextensions are loaded when |RCE| starts. So a restart is required after activation or | |||
|
29 | change of code in rcextensions. | |||
|
30 | ||||
|
31 | Simply restart only the enterprise/community instance:: | |||
|
32 | ||||
|
33 | rccontrol restart enterprise-1 | |||
|
34 | or | |||
|
35 | rccontrol restart community-1 | |||
|
36 | ||||
|
37 | ||||
|
38 | Example usage | |||
|
39 | +++++++++++++ | |||
|
40 | ||||
|
41 | ||||
|
42 | To see examples of usage please check the examples directory under: | |||
|
43 | ||||
|
44 | https://code.rhodecode.com/rhodecode-enterprise-ce/files/stable/rhodecode/config/rcextensions/examples |
@@ -0,0 +1,114 | |||||
|
1 | |RCE| 4.14.0 |RNS| | |||
|
2 | ------------------ | |||
|
3 | ||||
|
4 | Release Date | |||
|
5 | ^^^^^^^^^^^^ | |||
|
6 | ||||
|
7 | - 2018-11-02 | |||
|
8 | ||||
|
9 | ||||
|
10 | New Features | |||
|
11 | ^^^^^^^^^^^^ | |||
|
12 | ||||
|
13 | - Diffs: expose range diff inside the PR view. It's now possible to show | |||
|
14 | commit-per-commit view of changes in pull request. | |||
|
15 | - Diffs: new sticky context bar. | |||
|
16 | When browsing diffs we show file path of the current diff so users are aware all the time | |||
|
17 | what file they are reviewing. | |||
|
18 | - Diffs: added quick file selector in diffs views. Now it's possible to select a file | |||
|
19 | in large diffs from the sticky header for quicker access to certain interesting files | |||
|
20 | in diffs. | |||
|
21 | - Diffs: introducing diff menu for whitespace toggle and context changes. | |||
|
22 | It's now possible to show/hide whitespace changes and toggle the file context in | |||
|
23 | all diff places including pull requests. | |||
|
24 | - Comments: allow commenting on empty files without content. | |||
|
25 | - Repositories: added option to archive repositories instead of deleting them. | |||
|
26 | Archived repositories are useful for future auditing, but they are read-only. | |||
|
27 | - rcextensions: new rcextensions. We're introducing new `rcextensions` that will be base | |||
|
28 | for future low-level integrations. It's now possible to expose nice messages back | |||
|
29 | to the users when using `rcextensions`. | |||
|
30 | - Summary page: slightly re-organize summary page for better user experience. | |||
|
31 | ||||
|
32 | ||||
|
33 | General | |||
|
34 | ^^^^^^^ | |||
|
35 | ||||
|
36 | - Mailing: switched from custom library to pyramid_mailer with python3 compatibility. | |||
|
37 | - Frontend: Switched to Polymer 3.0. | |||
|
38 | - Frontend: fixed problems with IE11 and brought back support for that browser. | |||
|
39 | - Git: use a fetch_sync based creation of remote repositories. | |||
|
40 | This fixes problems with importing from Bitbucket. | |||
|
41 | - Comments: update comments email templates. | |||
|
42 | - Packaging: only wrap external dependency scripts. This makes execution of scripts | |||
|
43 | roughly 5x faster due to much smaller PATH tree. | |||
|
44 | - HTTP: use application wide detection of invalid bytes sent via URL/GET/POST data. | |||
|
45 | - Fonts/UI: use consistent fonts across the whole application. | |||
|
46 | Few places had non-standard custom fonts. | |||
|
47 | - Google: updated google auth plugin with latest API changes. | |||
|
48 | - Core: handle edge case requesting matched routes but with hg/svn/git or api context. | |||
|
49 | - Dependencies: bumped rhodecode-tools to 1.0.0 release using Apache2 license. | |||
|
50 | - Dependencies: atomicwrites==1.2.1 | |||
|
51 | - Dependencies: attrs==18.2.0 | |||
|
52 | - Dependencies: dogpile.cache==0.6.7 | |||
|
53 | - Dependencies: psutil==5.4.7 | |||
|
54 | - Dependencies: pathlib2==2.3.2 | |||
|
55 | - Dependencies: subprocess32==3.5.2 | |||
|
56 | - Dependencies: gevent==1.3.6 | |||
|
57 | - Dependencies: greenlet==0.4.15 | |||
|
58 | - Dependencies: pytest==3.8.2 | |||
|
59 | - Dependencies: py==1.6.0 | |||
|
60 | - Dependencies: pytest-cov==2.6.0 | |||
|
61 | - Dependencies: pytest-timeout==1.3.2 | |||
|
62 | - Dependencies: coverage==4.5.1 | |||
|
63 | - Dependencies: psycopg2==2.7.5 | |||
|
64 | ||||
|
65 | ||||
|
66 | Security | |||
|
67 | ^^^^^^^^ | |||
|
68 | ||||
|
69 | - RST: improve Javascript RST sandbox. | |||
|
70 | - Jupyter: sanitize markdown cells similar as we do for our own markdown cleanup. | |||
|
71 | ||||
|
72 | ||||
|
73 | Performance | |||
|
74 | ^^^^^^^^^^^ | |||
|
75 | ||||
|
76 | - SSH: improved SSH wrapper execution speed by using optimized binary script wrapping. | |||
|
77 | - Core: reduced font and JavaScript load times. | |||
|
78 | ||||
|
79 | ||||
|
80 | Fixes | |||
|
81 | ^^^^^ | |||
|
82 | ||||
|
83 | - Comments: ensure we always display unmatched comments. | |||
|
84 | - Branch Permissions: fixed changing rule order for branch permissions. | |||
|
85 | - Users: ensure get_first_superadmin actually gets the 1st created super-admin. | |||
|
86 | - Users: when deleting users ensure we also clear personal flag. | |||
|
87 | This fixes some problems with multiple personal groups. | |||
|
88 | - Diffs: disable the error border on highlight errors. | |||
|
89 | - Integrations: implement retry to HTTP[S] calls for integrations. | |||
|
90 | Web parts will do a 3x retry call in case service is not reachable or | |||
|
91 | responds with 5XX codes. | |||
|
92 | - Git: fixed pull-request updates in case branch names are the same as the file names. | |||
|
93 | - Supervisor: add patch for older kernel support. | |||
|
94 | - Compare: fixed file after/before links in compare view for cross repo compare. | |||
|
95 | - Emails: improve fonts and rendering of email HTML. | |||
|
96 | - Permissions: flush members of user groups permissions to clear caches. | |||
|
97 | - Repository: add check preventing of removal of repo with attached pull requests. Users | |||
|
98 | should use the new archive repo function instead. | |||
|
99 | ||||
|
100 | ||||
|
101 | Upgrade notes | |||
|
102 | ^^^^^^^^^^^^^ | |||
|
103 | ||||
|
104 | - In this release, we're shipping a new `rcextensions`. The changes made are | |||
|
105 | backward incompatible. An update of `rcextensions` is required | |||
|
106 | prior to using them again. Please check the new `rcextensions.tmpl` directory | |||
|
107 | located in `etc/rcextensions.tmpl` in your instance installation path. | |||
|
108 | Old code should be 100% portable by just copy&paste to the right function. | |||
|
109 | ||||
|
110 | - Mailing: We introduced a new mailing library. The older options should be compatible and | |||
|
111 | generally, old configuration doesn't need any changes in order to send emails. | |||
|
112 | We, however, encourage users to re-check mailing setup in case of some more | |||
|
113 | sophisticated email setups. | |||
|
114 | There's a possibility to send a test email from admin > settings > email section. |
@@ -0,0 +1,16 | |||||
|
1 | diff -rup supervisor-3.3.4-orig/supervisor/options.py supervisor-3.3.4/supervisor/options.py | |||
|
2 | --- supervisor-3.3.4-orig/supervisor/options.py 1970-01-01 01:00:01.000000000 +0100 | |||
|
3 | +++ supervisor-3.3.4/supervisor-new/options.py 2018-10-24 10:53:19.368503735 +0200 | |||
|
4 | @@ -1395,7 +1395,11 @@ class ServerOptions(Options): | |||
|
5 | name = limit['name'] | |||
|
6 | name = name # name is used below by locals() | |||
|
7 | ||||
|
8 | - soft, hard = resource.getrlimit(res) | |||
|
9 | + try: | |||
|
10 | + soft, hard = resource.getrlimit(res) | |||
|
11 | + except Exception: | |||
|
12 | + # handle old kernel problems, this is not critical to execute | |||
|
13 | + soft, hard = -1, -1 | |||
|
14 | ||||
|
15 | if (soft < min) and (soft != -1): # -1 means unlimited | |||
|
16 | if (hard < min) and (hard != -1): |
@@ -0,0 +1,3 | |||||
|
1 | ## special libraries we could extend the requirements.txt file with to add some | |||
|
2 | ## custom libraries usefull for debug and memory tracing | |||
|
3 | objgraph==3.1.1 |
@@ -0,0 +1,7 | |||||
|
1 | This is template rcextensions. | |||
|
2 | ||||
|
3 | To edit rcextensions please edit hooks.py file. | |||
|
4 | The examples/ directory contain some basic example how to use hooks. | |||
|
5 | ||||
|
6 | ||||
|
7 | Changes to rcextensions requires restart of RhodeCode instances. |
@@ -0,0 +1,56 | |||||
|
1 | # Copyright (C) 2016-2018 RhodeCode GmbH | |||
|
2 | # | |||
|
3 | # This program is free software: you can redistribute it and/or modify | |||
|
4 | # it under the terms of the GNU Affero General Public License, version 3 | |||
|
5 | # (only), as published by the Free Software Foundation. | |||
|
6 | # | |||
|
7 | # This program is distributed in the hope that it will be useful, | |||
|
8 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
9 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
10 | # GNU General Public License for more details. | |||
|
11 | # | |||
|
12 | # You should have received a copy of the GNU Affero General Public License | |||
|
13 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
14 | # | |||
|
15 | # This program is dual-licensed. If you wish to learn more about the | |||
|
16 | # RhodeCode Enterprise Edition, including its added features, Support services, | |||
|
17 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |||
|
18 | ||||
|
19 | """ | |||
|
20 | rcextensions module, please edit `hooks.py` to over write hooks logic | |||
|
21 | """ | |||
|
22 | ||||
|
23 | from .hooks import ( | |||
|
24 | _create_repo_hook, | |||
|
25 | _create_repo_group_hook, | |||
|
26 | _pre_create_user_hook, | |||
|
27 | _create_user_hook, | |||
|
28 | _delete_repo_hook, | |||
|
29 | _delete_user_hook, | |||
|
30 | _pre_push_hook, | |||
|
31 | _push_hook, | |||
|
32 | _pre_pull_hook, | |||
|
33 | _pull_hook, | |||
|
34 | _create_pull_request_hook, | |||
|
35 | _review_pull_request_hook, | |||
|
36 | _update_pull_request_hook, | |||
|
37 | _merge_pull_request_hook, | |||
|
38 | _close_pull_request_hook, | |||
|
39 | ) | |||
|
40 | ||||
|
41 | # set as module attributes, we use those to call hooks. *do not change this* | |||
|
42 | CREATE_REPO_HOOK = _create_repo_hook | |||
|
43 | CREATE_REPO_GROUP_HOOK = _create_repo_group_hook | |||
|
44 | PRE_CREATE_USER_HOOK = _pre_create_user_hook | |||
|
45 | CREATE_USER_HOOK = _create_user_hook | |||
|
46 | DELETE_REPO_HOOK = _delete_repo_hook | |||
|
47 | DELETE_USER_HOOK = _delete_user_hook | |||
|
48 | PRE_PUSH_HOOK = _pre_push_hook | |||
|
49 | PUSH_HOOK = _push_hook | |||
|
50 | PRE_PULL_HOOK = _pre_pull_hook | |||
|
51 | PULL_HOOK = _pull_hook | |||
|
52 | CREATE_PULL_REQUEST = _create_pull_request_hook | |||
|
53 | REVIEW_PULL_REQUEST = _review_pull_request_hook | |||
|
54 | UPDATE_PULL_REQUEST = _update_pull_request_hook | |||
|
55 | MERGE_PULL_REQUEST = _merge_pull_request_hook | |||
|
56 | CLOSE_PULL_REQUEST = _close_pull_request_hook |
@@ -0,0 +1,36 | |||||
|
1 | # Example to trigger a HTTP call via an HTTP helper via post_push hook | |||
|
2 | ||||
|
3 | ||||
|
4 | @has_kwargs({ | |||
|
5 | 'server_url': 'url of instance that triggered this hook', | |||
|
6 | 'config': 'path to .ini config used', | |||
|
7 | 'scm': 'type of version control "git", "hg", "svn"', | |||
|
8 | 'username': 'username of actor who triggered this event', | |||
|
9 | 'ip': 'ip address of actor who triggered this hook', | |||
|
10 | 'action': '', | |||
|
11 | 'repository': 'repository name', | |||
|
12 | 'repo_store_path': 'full path to where repositories are stored', | |||
|
13 | 'commit_ids': '', | |||
|
14 | 'hook_type': '', | |||
|
15 | 'user_agent': '', | |||
|
16 | }) | |||
|
17 | def _push_hook(*args, **kwargs): | |||
|
18 | """ | |||
|
19 | POST PUSH HOOK, this function will be executed after each push it's | |||
|
20 | executed after the build-in hook that RhodeCode uses for logging pushes | |||
|
21 | """ | |||
|
22 | ||||
|
23 | from .helpers import http_call, extra_fields | |||
|
24 | # returns list of dicts with key-val fetched from extra fields | |||
|
25 | repo_extra_fields = extra_fields.run(**kwargs) | |||
|
26 | ||||
|
27 | if repo_extra_fields.get('endpoint_url'): | |||
|
28 | endpoint = repo_extra_fields['endpoint_url'] | |||
|
29 | if endpoint: | |||
|
30 | data = { | |||
|
31 | 'some_key': 'val' | |||
|
32 | } | |||
|
33 | response = http_call.run(url=endpoint, json_data=data) | |||
|
34 | return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response)) | |||
|
35 | ||||
|
36 | return HookResponse(0, '') |
@@ -0,0 +1,36 | |||||
|
1 | # Example to trigger a CI call via an HTTP helper via post_push hook | |||
|
2 | ||||
|
3 | ||||
|
4 | @has_kwargs({ | |||
|
5 | 'server_url': 'url of instance that triggered this hook', | |||
|
6 | 'config': 'path to .ini config used', | |||
|
7 | 'scm': 'type of version control "git", "hg", "svn"', | |||
|
8 | 'username': 'username of actor who triggered this event', | |||
|
9 | 'ip': 'ip address of actor who triggered this hook', | |||
|
10 | 'action': '', | |||
|
11 | 'repository': 'repository name', | |||
|
12 | 'repo_store_path': 'full path to where repositories are stored', | |||
|
13 | 'commit_ids': '', | |||
|
14 | 'hook_type': '', | |||
|
15 | 'user_agent': '', | |||
|
16 | }) | |||
|
17 | def _push_hook(*args, **kwargs): | |||
|
18 | """ | |||
|
19 | POST PUSH HOOK, this function will be executed after each push it's | |||
|
20 | executed after the build-in hook that RhodeCode uses for logging pushes | |||
|
21 | """ | |||
|
22 | ||||
|
23 | from .helpers import http_call, extra_fields | |||
|
24 | # returns list of dicts with key-val fetched from extra fields | |||
|
25 | repo_extra_fields = extra_fields.run(**kwargs) | |||
|
26 | ||||
|
27 | if repo_extra_fields.get('endpoint_url'): | |||
|
28 | endpoint = repo_extra_fields['endpoint_url'] | |||
|
29 | if endpoint: | |||
|
30 | data = { | |||
|
31 | 'some_key': 'val' | |||
|
32 | } | |||
|
33 | response = http_call.run(url=endpoint, json_data=data) | |||
|
34 | return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response)) | |||
|
35 | ||||
|
36 | return HookResponse(0, '') |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 |
@@ -0,0 +1,17 | |||||
|
1 | # Copyright (C) 2016-2018 RhodeCode GmbH | |||
|
2 | # | |||
|
3 | # This program is free software: you can redistribute it and/or modify | |||
|
4 | # it under the terms of the GNU Affero General Public License, version 3 | |||
|
5 | # (only), as published by the Free Software Foundation. | |||
|
6 | # | |||
|
7 | # This program is distributed in the hope that it will be useful, | |||
|
8 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
9 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
10 | # GNU General Public License for more details. | |||
|
11 | # | |||
|
12 | # You should have received a copy of the GNU Affero General Public License | |||
|
13 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
14 | # | |||
|
15 | # This program is dual-licensed. If you wish to learn more about the | |||
|
16 | # RhodeCode Enterprise Edition, including its added features, Support services, | |||
|
17 | # and proprietary license terms, please see https://rhodecode.com/licenses/ |
@@ -0,0 +1,40 | |||||
|
1 | # -*- coding: utf-8 -*- | |||
|
2 | # Copyright (C) 2016-2018 RhodeCode GmbH | |||
|
3 | # | |||
|
4 | # This program is free software: you can redistribute it and/or modify | |||
|
5 | # it under the terms of the GNU Affero General Public License, version 3 | |||
|
6 | # (only), as published by the Free Software Foundation. | |||
|
7 | # | |||
|
8 | # This program is distributed in the hope that it will be useful, | |||
|
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
11 | # GNU General Public License for more details. | |||
|
12 | # | |||
|
13 | # You should have received a copy of the GNU Affero General Public License | |||
|
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
15 | # | |||
|
16 | # This program is dual-licensed. If you wish to learn more about the | |||
|
17 | # RhodeCode Enterprise Edition, including its added features, Support services, | |||
|
18 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |||
|
19 | ||||
|
20 | """ | |||
|
21 | us in hooks:: | |||
|
22 | ||||
|
23 | from .helpers import extra_fields | |||
|
24 | # returns list of dicts with key-val fetched from extra fields | |||
|
25 | repo_extra_fields = extra_fields.run(**kwargs) | |||
|
26 | ||||
|
27 | """ | |||
|
28 | ||||
|
29 | ||||
|
30 | def run(*args, **kwargs): | |||
|
31 | from rhodecode.model.db import Repository | |||
|
32 | # use temp name then the main one propagated | |||
|
33 | repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository'] | |||
|
34 | repo = Repository.get_by_repo_name(repo_name) | |||
|
35 | ||||
|
36 | fields = {} | |||
|
37 | for field in repo.extra_fields: | |||
|
38 | fields[field.field_key] = field.get_dict() | |||
|
39 | ||||
|
40 | return fields |
@@ -0,0 +1,61 | |||||
|
1 | # -*- coding: utf-8 -*- | |||
|
2 | # Copyright (C) 2016-2018 RhodeCode GmbH | |||
|
3 | # | |||
|
4 | # This program is free software: you can redistribute it and/or modify | |||
|
5 | # it under the terms of the GNU Affero General Public License, version 3 | |||
|
6 | # (only), as published by the Free Software Foundation. | |||
|
7 | # | |||
|
8 | # This program is distributed in the hope that it will be useful, | |||
|
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
11 | # GNU General Public License for more details. | |||
|
12 | # | |||
|
13 | # You should have received a copy of the GNU Affero General Public License | |||
|
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
15 | # | |||
|
16 | # This program is dual-licensed. If you wish to learn more about the | |||
|
17 | # RhodeCode Enterprise Edition, including its added features, Support services, | |||
|
18 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |||
|
19 | ||||
|
20 | """ | |||
|
21 | Extract and serialize commits taken from a list of commit_ids. This should | |||
|
22 | be used in post_push hook | |||
|
23 | ||||
|
24 | us in hooks:: | |||
|
25 | ||||
|
26 | from .helpers import extract_post_commits | |||
|
27 | # returns list of dicts with key-val fetched from extra fields | |||
|
28 | commit_list = extract_post_commits.run(**kwargs) | |||
|
29 | """ | |||
|
30 | import traceback | |||
|
31 | ||||
|
32 | ||||
|
33 | def run(*args, **kwargs): | |||
|
34 | from rhodecode.lib.utils2 import extract_mentioned_users | |||
|
35 | from rhodecode.model.db import Repository | |||
|
36 | ||||
|
37 | commit_ids = kwargs.get('commit_ids') | |||
|
38 | if not commit_ids: | |||
|
39 | return 0 | |||
|
40 | ||||
|
41 | # use temp name then the main one propagated | |||
|
42 | repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository'] | |||
|
43 | ||||
|
44 | repo = Repository.get_by_repo_name(repo_name) | |||
|
45 | commits = [] | |||
|
46 | ||||
|
47 | vcs_repo = repo.scm_instance(cache=False) | |||
|
48 | try: | |||
|
49 | for commit_id in commit_ids: | |||
|
50 | cs = vcs_repo.get_changeset(commit_id) | |||
|
51 | cs_data = cs.__json__() | |||
|
52 | cs_data['mentions'] = extract_mentioned_users(cs_data['message']) | |||
|
53 | # optionally add more logic to parse the commits, like reading extra | |||
|
54 | # fields of repository to read managers of reviewers ? | |||
|
55 | commits.append(cs_data) | |||
|
56 | except Exception: | |||
|
57 | print(traceback.format_exc()) | |||
|
58 | # we don't send any commits when crash happens, only full list matters | |||
|
59 | # we short circuit then. | |||
|
60 | return [] | |||
|
61 | return commits |
@@ -0,0 +1,63 | |||||
|
1 | # -*- coding: utf-8 -*- | |||
|
2 | # Copyright (C) 2016-2018 RhodeCode GmbH | |||
|
3 | # | |||
|
4 | # This program is free software: you can redistribute it and/or modify | |||
|
5 | # it under the terms of the GNU Affero General Public License, version 3 | |||
|
6 | # (only), as published by the Free Software Foundation. | |||
|
7 | # | |||
|
8 | # This program is distributed in the hope that it will be useful, | |||
|
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
11 | # GNU General Public License for more details. | |||
|
12 | # | |||
|
13 | # You should have received a copy of the GNU Affero General Public License | |||
|
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
15 | # | |||
|
16 | # This program is dual-licensed. If you wish to learn more about the | |||
|
17 | # RhodeCode Enterprise Edition, including its added features, Support services, | |||
|
18 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |||
|
19 | ||||
|
20 | """ | |||
|
21 | us in hooks:: | |||
|
22 | ||||
|
23 | from .helpers import extract_pre_commits | |||
|
24 | # returns list of dicts with key-val fetched from extra fields | |||
|
25 | commit_list = extract_pre_commits.run(**kwargs) | |||
|
26 | ||||
|
27 | """ | |||
|
28 | import re | |||
|
29 | import collections | |||
|
30 | ||||
|
31 | ||||
|
32 | def get_hg_commits(repo, refs): | |||
|
33 | commits = [] | |||
|
34 | return commits | |||
|
35 | ||||
|
36 | ||||
|
37 | def get_git_commits(repo, refs): | |||
|
38 | commits = [] | |||
|
39 | return commits | |||
|
40 | ||||
|
41 | ||||
|
42 | def run(*args, **kwargs): | |||
|
43 | from rhodecode.model.db import Repository | |||
|
44 | ||||
|
45 | vcs_type = kwargs['scm'] | |||
|
46 | # use temp name then the main one propagated | |||
|
47 | repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository'] | |||
|
48 | ||||
|
49 | repo = Repository.get_by_repo_name(repo_name) | |||
|
50 | vcs_repo = repo.scm_instance(cache=False) | |||
|
51 | ||||
|
52 | commits = [] | |||
|
53 | ||||
|
54 | for rev_data in kwargs['commit_ids']: | |||
|
55 | new_environ = dict((k, v) for k, v in rev_data['hg_env']) | |||
|
56 | ||||
|
57 | if vcs_type == 'git': | |||
|
58 | commits = get_git_commits(vcs_repo, kwargs['commit_ids']) | |||
|
59 | ||||
|
60 | if vcs_type == 'hg': | |||
|
61 | commits = get_hg_commits(vcs_repo, kwargs['commit_ids']) | |||
|
62 | ||||
|
63 | return commits |
@@ -0,0 +1,36 | |||||
|
1 | # -*- coding: utf-8 -*- | |||
|
2 | # Copyright (C) 2016-2018 RhodeCode GmbH | |||
|
3 | # | |||
|
4 | # This program is free software: you can redistribute it and/or modify | |||
|
5 | # it under the terms of the GNU Affero General Public License, version 3 | |||
|
6 | # (only), as published by the Free Software Foundation. | |||
|
7 | # | |||
|
8 | # This program is distributed in the hope that it will be useful, | |||
|
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
11 | # GNU General Public License for more details. | |||
|
12 | # | |||
|
13 | # You should have received a copy of the GNU Affero General Public License | |||
|
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
15 | # | |||
|
16 | # This program is dual-licensed. If you wish to learn more about the | |||
|
17 | # RhodeCode Enterprise Edition, including its added features, Support services, | |||
|
18 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |||
|
19 | ||||
|
20 | """ | |||
|
21 | us in hooks:: | |||
|
22 | ||||
|
23 | from .helpers import http_call | |||
|
24 | # returns response after making a POST call | |||
|
25 | response = http_call.run(url=url, json_data=data) | |||
|
26 | ||||
|
27 | """ | |||
|
28 | ||||
|
29 | from rhodecode.integrations.types.base import requests_retry_call | |||
|
30 | ||||
|
31 | ||||
|
32 | def run(url, json_data, method='post'): | |||
|
33 | requests_session = requests_retry_call() | |||
|
34 | requests_session.verify = True # Verify SSL | |||
|
35 | resp = requests_session.post(url, json=json_data, timeout=60) | |||
|
36 | return resp.raise_for_status() # raise exception on a failed request |
@@ -0,0 +1,431 | |||||
|
1 | # Copyright (C) 2016-2018 RhodeCode GmbH | |||
|
2 | # | |||
|
3 | # This program is free software: you can redistribute it and/or modify | |||
|
4 | # it under the terms of the GNU Affero General Public License, version 3 | |||
|
5 | # (only), as published by the Free Software Foundation. | |||
|
6 | # | |||
|
7 | # This program is distributed in the hope that it will be useful, | |||
|
8 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
9 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
10 | # GNU General Public License for more details. | |||
|
11 | # | |||
|
12 | # You should have received a copy of the GNU Affero General Public License | |||
|
13 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
14 | # | |||
|
15 | # This program is dual-licensed. If you wish to learn more about the | |||
|
16 | # RhodeCode Enterprise Edition, including its added features, Support services, | |||
|
17 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |||
|
18 | ||||
|
19 | from .utils import DotDict, HookResponse, has_kwargs | |||
|
20 | ||||
|
21 | ||||
|
22 | # Config shortcut to keep, all configuration in one place | |||
|
23 | # Example: api_key = CONFIG.my_config.api_key | |||
|
24 | CONFIG = DotDict( | |||
|
25 | my_config=DotDict( | |||
|
26 | api_key='<secret>', | |||
|
27 | ), | |||
|
28 | ||||
|
29 | ) | |||
|
30 | ||||
|
31 | ||||
|
32 | @has_kwargs({ | |||
|
33 | 'repo_name': '', | |||
|
34 | 'repo_type': '', | |||
|
35 | 'description': '', | |||
|
36 | 'private': '', | |||
|
37 | 'created_on': '', | |||
|
38 | 'enable_downloads': '', | |||
|
39 | 'repo_id': '', | |||
|
40 | 'user_id': '', | |||
|
41 | 'enable_statistics': '', | |||
|
42 | 'clone_uri': '', | |||
|
43 | 'fork_id': '', | |||
|
44 | 'group_id': '', | |||
|
45 | 'created_by': '' | |||
|
46 | }) | |||
|
47 | def _create_repo_hook(*args, **kwargs): | |||
|
48 | """ | |||
|
49 | POST CREATE REPOSITORY HOOK. This function will be executed after | |||
|
50 | each repository is created. kwargs available: | |||
|
51 | ||||
|
52 | """ | |||
|
53 | return HookResponse(0, '') | |||
|
54 | ||||
|
55 | ||||
|
56 | @has_kwargs({ | |||
|
57 | 'group_name': '', | |||
|
58 | 'group_parent_id': '', | |||
|
59 | 'group_description': '', | |||
|
60 | 'group_id': '', | |||
|
61 | 'user_id': '', | |||
|
62 | 'created_by': '', | |||
|
63 | 'created_on': '', | |||
|
64 | 'enable_locking': '' | |||
|
65 | }) | |||
|
66 | def _create_repo_group_hook(*args, **kwargs): | |||
|
67 | """ | |||
|
68 | POST CREATE REPOSITORY GROUP HOOK, this function will be | |||
|
69 | executed after each repository group is created. kwargs available: | |||
|
70 | """ | |||
|
71 | return HookResponse(0, '') | |||
|
72 | ||||
|
73 | ||||
|
74 | @has_kwargs({ | |||
|
75 | 'username': '', | |||
|
76 | 'password': '', | |||
|
77 | 'email': '', | |||
|
78 | 'firstname': '', | |||
|
79 | 'lastname': '', | |||
|
80 | 'active': '', | |||
|
81 | 'admin': '', | |||
|
82 | 'created_by': '', | |||
|
83 | }) | |||
|
84 | def _pre_create_user_hook(*args, **kwargs): | |||
|
85 | """ | |||
|
86 | PRE CREATE USER HOOK, this function will be executed before each | |||
|
87 | user is created, it returns a tuple of bool, reason. | |||
|
88 | If bool is False the user creation will be stopped and reason | |||
|
89 | will be displayed to the user. | |||
|
90 | ||||
|
91 | Return HookResponse(1, reason) to block user creation | |||
|
92 | ||||
|
93 | """ | |||
|
94 | ||||
|
95 | reason = 'allowed' | |||
|
96 | return HookResponse(0, reason) | |||
|
97 | ||||
|
98 | ||||
|
99 | @has_kwargs({ | |||
|
100 | 'username': '', | |||
|
101 | 'full_name_or_username': '', | |||
|
102 | 'full_contact': '', | |||
|
103 | 'user_id': '', | |||
|
104 | 'name': '', | |||
|
105 | 'firstname': '', | |||
|
106 | 'short_contact': '', | |||
|
107 | 'admin': '', | |||
|
108 | 'lastname': '', | |||
|
109 | 'ip_addresses': '', | |||
|
110 | 'extern_type': '', | |||
|
111 | 'extern_name': '', | |||
|
112 | 'email': '', | |||
|
113 | 'api_key': '', | |||
|
114 | 'api_keys': '', | |||
|
115 | 'last_login': '', | |||
|
116 | 'full_name': '', | |||
|
117 | 'active': '', | |||
|
118 | 'password': '', | |||
|
119 | 'emails': '', | |||
|
120 | 'inherit_default_permissions': '', | |||
|
121 | 'created_by': '', | |||
|
122 | 'created_on': '', | |||
|
123 | }) | |||
|
124 | def _create_user_hook(*args, **kwargs): | |||
|
125 | """ | |||
|
126 | POST CREATE USER HOOK, this function will be executed after each user is created | |||
|
127 | """ | |||
|
128 | return HookResponse(0, '') | |||
|
129 | ||||
|
130 | ||||
|
131 | @has_kwargs({ | |||
|
132 | 'repo_name': '', | |||
|
133 | 'repo_type': '', | |||
|
134 | 'description': '', | |||
|
135 | 'private': '', | |||
|
136 | 'created_on': '', | |||
|
137 | 'enable_downloads': '', | |||
|
138 | 'repo_id': '', | |||
|
139 | 'user_id': '', | |||
|
140 | 'enable_statistics': '', | |||
|
141 | 'clone_uri': '', | |||
|
142 | 'fork_id': '', | |||
|
143 | 'group_id': '', | |||
|
144 | 'deleted_by': '', | |||
|
145 | 'deleted_on': '', | |||
|
146 | }) | |||
|
147 | def _delete_repo_hook(*args, **kwargs): | |||
|
148 | """ | |||
|
149 | POST DELETE REPOSITORY HOOK, this function will be executed after | |||