diff --git a/pagure/forms.py b/pagure/forms.py index 0afd626..e505967 100644 --- a/pagure/forms.py +++ b/pagure/forms.py @@ -786,3 +786,11 @@ class SubscribtionForm(PagureForm): [wtforms.validators.optional()], false_values=FALSE_VALUES, ) + + +class MergePRForm(PagureForm): + delete_branch = wtforms.BooleanField( + 'Delete branch after merging', + [wtforms.validators.optional()], + false_values=FALSE_VALUES, + ) diff --git a/pagure/lib/tasks.py b/pagure/lib/tasks.py index 727e80b..8f9b93d 100644 --- a/pagure/lib/tasks.py +++ b/pagure/lib/tasks.py @@ -676,7 +676,7 @@ def refresh_pr_cache(self, session, name, namespace, user): @conn.task(queue=pagure_config.get('FAST_CELERY_QUEUE', None), bind=True) @pagure_task def merge_pull_request(self, session, name, namespace, user, requestid, - user_merger): + user_merger, delete_branch_after=False): """ Merge pull-request. """ project = pagure.lib._get_project( @@ -692,6 +692,15 @@ def merge_pull_request(self, session, name, namespace, user, requestid, pagure.lib.git.merge_pull_request( session, request, user_merger, pagure_config['REQUESTS_FOLDER']) + if delete_branch_after: + _log.debug('Will delete source branch of pull-request: %s/#%s', + request.project.fullname, request.id) + delete_branch.delay( + request.project_from.name, + request.project_from.namespace, + request.project_from.user.username if request.project_from.parent else None, + request.branch_from) + refresh_pr_cache.delay(name, namespace, user) return ret( 'ui_ns.view_repo', repo=name, username=user, namespace=namespace) diff --git a/pagure/templates/pull_request.html b/pagure/templates/pull_request.html index 13b1d1d..2f6ab1e 100644 --- a/pagure/templates/pull_request.html +++ b/pagure/templates/pull_request.html @@ -681,6 +681,9 @@ requestid=requestid) }}" method="POST"> {{ mergeform.csrf_token }} + {% if can_delete_branch %} + + {% endif %} diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index db8ef13..de40cf9 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -34,7 +34,7 @@ import pagure.forms from pagure.config import config as pagure_config from pagure.ui import UI_NS from pagure.utils import ( - login_required, __get_file_in_tree, get_parent_repo_path) + login_required, __get_file_in_tree, get_parent_repo_path, is_repo_committer) _log = logging.getLogger(__name__) @@ -232,7 +232,7 @@ def request_pull(repo, requestid, username=None, namespace=None): if diff: diff.find_similar() - form = pagure.forms.ConfirmationForm() + form = pagure.forms.MergePRForm() return flask.render_template( 'pull_request.html', @@ -247,6 +247,10 @@ def request_pull(repo, requestid, username=None, namespace=None): mergeform=form, subscribers=pagure.lib.get_watch_list(flask.g.session, request), tag_list=pagure.lib.get_tags_of_project(flask.g.session, repo), + can_delete_branch=(pagure_config.get('ALLOW_DELETE_BRANCH', True) + and not request.remote_git + and pagure.utils.is_repo_committer(request.project_from) + ) ) @@ -715,7 +719,7 @@ def merge_request_pull(repo, requestid, username=None, namespace=None): """ Create a pull request with the changes from the fork into the project. """ - form = pagure.forms.ConfirmationForm() + form = pagure.forms.MergePRForm() if not form.validate_on_submit(): flask.flash('Invalid input submitted', 'error') return flask.redirect(flask.url_for( @@ -764,12 +768,32 @@ def merge_request_pull(repo, requestid, username=None, namespace=None): 'ui_ns.request_pull', username=username, namespace=namespace, repo=repo.name, requestid=requestid)) + if form.delete_branch.data: + if not pagure_config.get('ALLOW_DELETE_BRANCH', True): + flask.flash( + 'This pagure instance does not allow branch deletion', 'error') + return flask.redirect(flask.url_for( + 'ui_ns.request_pull', username=username, namespace=namespace, + repo=repo.name, requestid=requestid)) + if not pagure.utils.is_repo_committer(request.project_from): + flask.flash( + 'You do not have permissions to delete the branch in the source repo', 'error') + return flask.redirect(flask.url_for( + 'ui_ns.request_pull', username=username, namespace=namespace, + repo=repo.name, requestid=requestid)) + if request.remote_git: + flask.flash( + 'You can not delete branch in remote repo', 'error') + return flask.redirect(flask.url_for( + 'ui_ns.request_pull', username=username, namespace=namespace, + repo=repo.name, requestid=requestid)) + _log.info('All checks in the controller passed') try: task = pagure.lib.tasks.merge_pull_request.delay( repo.name, namespace, username, requestid, - flask.g.fas_user.username) + flask.g.fas_user.username, delete_branch_after=form.delete_branch.data) return pagure.utils.wait_for_task( task, prev=flask.url_for('ui_ns.request_pull',