feat(task-for-automatic-pr-merge): added f-ty to support pull request auto merge for EE. Fixes: RCCE-67

This commit is contained in:
Serhii Ilin 2024-10-28 12:35:44 +02:00
parent 9e9b09f082
commit 38d5e39b57
8 changed files with 57 additions and 2 deletions

View file

@ -48,6 +48,7 @@ class TestVcsSettings(object):
'extensions_evolve': False,
'phases_publish': 'False',
'rhodecode_pr_merge_enabled': False,
'rhodecode_auto_merge_enabled': False,
'rhodecode_use_outdated_comments': False,
'new_svn_branch': '',
'new_svn_tag': ''
@ -59,7 +60,7 @@ class TestVcsSettings(object):
response = self.app.get(route_path('edit_repo_vcs', repo_name=repo_name))
expected_settings = (
'rhodecode_use_outdated_comments', 'rhodecode_pr_merge_enabled',
'rhodecode_use_outdated_comments', 'rhodecode_pr_merge_enabled', 'rhodecode_auto_merge_enabled',
'hooks_changegroup_repo_size', 'hooks_changegroup_push_logger',
'hooks_outgoing_pull_logger'
)

View file

@ -49,7 +49,7 @@ from rhodecode.lib.plugins.utils import register_rhodecode_plugin
from rhodecode.lib.utils2 import AttributeDict
from rhodecode.lib.exc_tracking import store_exception, format_exc
from rhodecode.subscribers import (
scan_repositories_if_enabled, write_js_routes_if_enabled,
auto_merge_pr_if_needed, scan_repositories_if_enabled, write_js_routes_if_enabled,
write_metadata_if_needed, write_usage_data, import_license_if_present)
from rhodecode.lib.statsd_client import StatsdClient
@ -392,6 +392,7 @@ def includeme(config, auth_resources=None):
# Add subscribers.
if load_all:
log.debug('Adding subscribers...')
config.add_subscriber(auto_merge_pr_if_needed, rhodecode.events.PullRequestReviewEvent)
config.add_subscriber(scan_repositories_if_enabled,
pyramid.events.ApplicationCreated)
config.add_subscriber(write_metadata_if_needed,

View file

@ -445,6 +445,7 @@ class _BaseVcsSettingsForm(formencode.Schema):
# PR/Code-review
rhodecode_pr_merge_enabled = v.StringBoolean(if_missing=False)
rhodecode_auto_merge_enabled = v.StringBoolean(if_missing=False)
rhodecode_use_outdated_comments = v.StringBoolean(if_missing=False)
# hg

View file

@ -2125,6 +2125,10 @@ class PullRequestModel(BaseModel):
return self._get_general_setting(
pull_request, 'rhodecode_pr_merge_enabled')
def is_automatic_merge_enabled(self, pull_request):
return self._get_general_setting(
pull_request, 'rhodecode_auto_merge_enabled')
def _use_rebase_for_merging(self, pull_request):
repo_type = pull_request.target_repo.repo_type
if repo_type == 'hg':

View file

@ -461,6 +461,7 @@ class VcsSettingsModel(object):
GENERAL_SETTINGS = (
'use_outdated_comments',
'pr_merge_enabled',
'auto_merge_enabled',
'hg_use_rebase_for_merging',
'hg_close_branch_before_merging',
'git_use_rebase_for_merging',

View file

@ -57,6 +57,34 @@ def add_renderer_globals(event):
event['h'] = helpers
def auto_merge_pr_if_needed(event):
from rhodecode.model.db import PullRequest
from rhodecode.model.pull_request import (
PullRequestModel, ChangesetStatus, MergeCheck
)
pr_event_data = event.as_dict()['pullrequest']
pull_request = PullRequest.get(pr_event_data['pull_request_id'])
calculated_status = pr_event_data['status']
if (calculated_status == ChangesetStatus.STATUS_APPROVED
and PullRequestModel().is_automatic_merge_enabled(pull_request)):
user = pull_request.author.AuthUser()
merge_check = MergeCheck.validate(
pull_request, user, translator=lambda x: x, fail_early=True
)
if merge_check.merge_possible:
from rhodecode.lib.base import vcs_operation_context
extras = vcs_operation_context(
event.request.environ, repo_name=pull_request.target_repo.repo_name,
username=user.username, action='push',
scm=pull_request.target_repo.repo_type)
from rc_ee.lib.celerylib.tasks import auto_merge_repo
auto_merge_repo.apply_async(
args=(pull_request.pull_request_id, extras)
)
def set_user_lang(event):
request = event.request
cur_user = getattr(request, 'user', None)

View file

@ -210,6 +210,23 @@
<div class="label">
<span class="help-block">${_('Note: when this feature is enabled, it only runs hooks defined in the rcextension package. Custom hooks added on the Admin -> Settings -> Hooks page will not be run when pull requests are automatically merged from the web interface.')}</span>
</div>
%if c.rhodecode_edition_id != 'EE':
<div class="checkbox">
<input type="checkbox" disabled>
<label for="rhodecode_auto_merge_enabled${suffix}">${_('Enable automatic merge for approved pull requests')}</label>
</div>
<div class="label">
<span class="help-block">${_('This feature is available in RhodeCode EE edition only. Contact {sales_email} to obtain a trial license.').format(sales_email='<a href="mailto:sales@rhodecode.com">sales@rhodecode.com</a>')|n}</span>
<div>
%else:
<div class="checkbox">
${h.checkbox('rhodecode_auto_merge_enabled' + suffix, 'True', **kwargs)}
<label for="rhodecode_auto_merge_enabled${suffix}">${_('Enable automatic merge for approved pull requests')}</label>
</div>
<div class="label">
<span class="help-block">${_('When this is enabled, the pull request will be merged once it has at least one reviewer and is approved.')}</span>
</div>
%endif
<div class="checkbox">
${h.checkbox('rhodecode_use_outdated_comments' + suffix, 'True', **kwargs)}
<label for="rhodecode_use_outdated_comments${suffix}">${_('Invalidate and relocate inline comments during update')}</label>

View file

@ -38,6 +38,7 @@ SVN_FORM_DATA = {
GENERAL_FORM_DATA = {
'rhodecode_pr_merge_enabled': True,
'rhodecode_auto_merge_enabled': True,
'rhodecode_use_outdated_comments': True,
'rhodecode_hg_use_rebase_for_merging': True,
'rhodecode_hg_close_branch_before_merging': True,
@ -989,6 +990,7 @@ class TestCreateOrUpdateRepoSettings(object):
'vcs_git_lfs_enabled': False,
'phases_publish': 'False',
'rhodecode_pr_merge_enabled': False,
'rhodecode_auto_merge_enabled': False,
'rhodecode_use_outdated_comments': False,
'new_svn_branch': '',
'new_svn_tag': ''