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',