diff --git a/progit/lib.py b/progit/lib.py index 82691eb..13ed5c4 100644 --- a/progit/lib.py +++ b/progit/lib.py @@ -680,14 +680,17 @@ def get_pull_request( return query.first() -def close_pull_request(session, request): +def close_pull_request(session, request, merged=True): ''' Close the provided pull-request. ''' request.status = False session.add(request) session.flush() - progit.notify.notify_merge_pull_request(request) + if merged == True: + progit.notify.notify_merge_pull_request(request) + else: + progit.notify.notify_cancelled_pull_request(request) def get_issue_statuses(session): diff --git a/progit/notify.py b/progit/notify.py index 203ee2d..1b5292b 100644 --- a/progit/notify.py +++ b/progit/notify.py @@ -201,3 +201,41 @@ Merged pull-request: ','.join(mail_to), mail_id=request.mail_id, ) + + +def notify_cancelled_pull_request(request): + ''' Notify the people following a project that a pull-request was + cancelled in it. + ''' + text = """ +%s canceled a pull-request against the project: `%s` that you are following. + +Cancelled pull-request: + +`` +%s +`` + +%s +""" % ( + request.user.user, + request.repo.name, + request.title, + '%s/%s/request-pull/%s' % ( + progit.APP.config['APP_URL'], + request.repo.name, + request.id, + ), + ) + mail_to = set([cmt.user.emails[0].email for cmt in request.comments]) + mail_to.add(request.repo.user.emails[0].email) + for prouser in request.repo.users: + if prouser.user.emails: + mail_to.add(prouser.user.emails[0].email) + + send_email( + text, + 'Pull-Request #%s `%s`' % (request.id, request.title), + ','.join(mail_to), + mail_id=request.mail_id, + ) diff --git a/progit/templates/pull_request.html b/progit/templates/pull_request.html index e04f3e4..9e37b99 100644 --- a/progit/templates/pull_request.html +++ b/progit/templates/pull_request.html @@ -21,12 +21,16 @@ {% if request %}

Title: {{ request.title }}

{% if request.status and repo_admin %} - +
- Merge + repo=repo.name, requestid=requestid) }}"> + - + + + +
{% elif request and request.status == False %} Merged {% endif %} @@ -151,6 +155,10 @@ window.location.href = final_url; } ); + + $('#cancel_pr').click(function(){ + return window.confirm("Are you sure you want to cancel requested pull?"); + }); }); function comment() { diff --git a/progit/ui/fork.py b/progit/ui/fork.py index d260d8a..795c797 100644 --- a/progit/ui/fork.py +++ b/progit/ui/fork.py @@ -383,6 +383,34 @@ def merge_request_pull(repo, requestid, username=None): return flask.redirect(flask.url_for('view_repo', repo=repo.name)) +@APP.route('//request-pull/cancel/') +@APP.route('/fork///request-pull/cancel/') +def cancel_request_pull(repo, requestid, username=None): + """ Cancel request pulling request. + """ + repo = progit.lib.get_project(SESSION, repo, user=username) + + if not repo: + flask.abort(404, 'Project not found') + + request = progit.lib.get_pull_request( + SESSION, project_id=repo.id, requestid=requestid) + + if not request: + flask.abort(404, 'Pull-request not found') + + if not is_repo_admin(repo): + flask.abort( + 403, + 'You are not allowed to merge pull-request for this project') + + progit.lib.close_pull_request(SESSION, request, merged=False) + SESSION.commit() + flask.flash('Request pull canceled!') + + return flask.redirect(flask.url_for('view_repo', repo=repo.name)) + + ## Specific actions