From 2c1a956773d35f373000782dc7b8ed086113f221 Mon Sep 17 00:00:00 2001 From: Patrick Uiterwijk Date: Dec 15 2015 11:14:20 +0000 Subject: Also allow PRs to be closed by post hooks Signed-off-by: Patrick Uiterwijk --- diff --git a/pagure/hooks/files/pagure_hook.py b/pagure/hooks/files/pagure_hook.py index d1c6234..eb8fc87 100755 --- a/pagure/hooks/files/pagure_hook.py +++ b/pagure/hooks/files/pagure_hook.py @@ -6,9 +6,7 @@ relates to an issue. """ import os -import re import sys -import subprocess from sqlalchemy.exc import SQLAlchemyError @@ -37,13 +35,15 @@ def generate_revision_change_log(new_commits_list): line = line.strip() print '*', line - for issue in pagure.lib.link.get_relation( + for relation in pagure.lib.link.get_relation( pagure.SESSION, pagure.lib.git.get_repo_name(abspath), pagure.lib.git.get_username(abspath), line, - 'fixes'): - fixes_commit(commitid, issue, pagure.APP.config.get('APP_URL')) + 'fixes', + include_prs=True): + fixes_relation(commitid, relation, + pagure.APP.config.get('APP_URL')) for issue in pagure.lib.link.get_relation( pagure.SESSION, @@ -70,7 +70,7 @@ def relates_commit(commitid, issue, app_url=None): commitid[:8], url) try: - message = pagure.lib.add_issue_comment( + pagure.lib.add_issue_comment( pagure.SESSION, issue=issue, comment=comment, @@ -85,30 +85,42 @@ def relates_commit(commitid, issue, app_url=None): pagure.APP.logger.exception(err) -def fixes_commit(commitid, issue, app_url=None): - ''' Add a comment to an issue that this commit fixes it and update +def fixes_relation(commitid, relation, app_url=None): + ''' Add a comment to an issue or PR that this commit fixes it and update the status if the commit is in the master branch. ''' url = '../%s' % commitid[:8] if app_url: if app_url.endswith('/'): app_url = app_url[:-1] - project = issue.project.path.split('.git')[0] - if issue.project.is_fork: + project = relation.project.path.split('.git')[0] + if relation.project.is_fork: project = 'fork/%s' % project url = '%s/%s/%s' % (app_url, project, commitid[:8]) - comment = ''' Commit [%s](%s) fixes this ticket''' % ( - commitid[:8], url) + comment = ''' Commit [%s](%s) fixes this %s''' % ( + commitid[:8], url, relation.isa) try: - message = pagure.lib.add_issue_comment( - pagure.SESSION, - issue=issue, - comment=comment, - user=pagure.lib.git.get_pusher_email(commitid, abspath), - ticketfolder=pagure.APP.config['TICKETS_FOLDER'], - ) + if relation.isa == 'issue': + pagure.lib.add_issue_comment( + pagure.SESSION, + issue=relation, + comment=comment, + user=pagure.lib.git.get_pusher_email(commitid, abspath), + ticketfolder=pagure.APP.config['TICKETS_FOLDER'], + ) + elif relation.isa == 'pull-request': + pagure.lib.add_pull_request_comment( + pagure.SESSION, + request=relation, + commit=None, + filename=None, + row=None, + comment=comment, + user=pagure.lib.git.get_pusher_email(commitid, abspath), + requestfolder=pagure.APP.config['REQUESTS_FOLDER'], + ) pagure.SESSION.commit() except pagure.exceptions.PagureException as err: print err @@ -124,12 +136,20 @@ def fixes_commit(commitid, issue, app_url=None): if 'master' in branches: try: - pagure.lib.edit_issue( - pagure.SESSION, - issue, - ticketfolder=pagure.APP.config['TICKETS_FOLDER'], - user=pagure.lib.git.get_pusher_email(commitid, abspath), - status='Fixed') + if relation.isa == 'issue': + pagure.lib.edit_issue( + pagure.SESSION, + relation, + ticketfolder=pagure.APP.config['TICKETS_FOLDER'], + user=pagure.lib.git.get_pusher_email(commitid, abspath), + status='Fixed') + elif relation.isa == 'pull-request': + pagure.lib.close_pull_request( + pagure.SESSION, + relation, + requestfolder=pagure.APP.config['REQUESTS_FOLDER'], + user=pagure.lib.git.get_pusher_email(commitid, abspath), + merged=True) pagure.SESSION.commit() except pagure.exceptions.PagureException as err: print err @@ -140,7 +160,6 @@ def fixes_commit(commitid, issue, app_url=None): def run_as_post_receive_hook(): - changes = [] for line in sys.stdin: if pagure.APP.config.get('HOOK_DEBUG', False): print line diff --git a/pagure/lib/link.py b/pagure/lib/link.py index 3ca01d3..311c978 100644 --- a/pagure/lib/link.py +++ b/pagure/lib/link.py @@ -30,11 +30,14 @@ RELATES = [ ] -def get_relation(session, reponame, username, text, reftype='relates'): +def get_relation(session, reponame, username, text, reftype='relates', + include_prs=False): ''' For a given text, searches using regex if the text contains reference to another issue in this project or another one. Returns the list of issues referenced (possibly empty). + If include_prs=True, it may also contain pull requests (may still + be empty). By default it searches for references of type: `relates`, for example: ``this commits relates to #2``. @@ -52,24 +55,30 @@ def get_relation(session, reponame, username, text, reftype='relates'): if reftype == 'fixes': regex = FIXES - issues = [] + relations = [] for motif in regex: - issueid = None + relid = None project = None if motif.match(text): if len(motif.match(text).groups()) >= 2: - issueid = motif.match(text).group(2) + relid = motif.match(text).group(2) project = motif.match(text).group(1) else: - issueid = motif.match(text).group(1) + relid = motif.match(text).group(1) - if issueid: - issue = pagure.lib.search_issues( - session, repo=repo, issueid=issueid) - if issue is None or issue.project.name not in [project, repo.name]: + if relid: + relation = pagure.lib.search_issues( + session, repo=repo, issueid=relid) + + if relation is None and include_prs: + relation = pagure.lib.search_pull_requests( + session, project_id=repo.id, requestid=relid) + + if relation is None or relation.project.name not in [project, + repo.name]: continue - if issue not in issues: - issues.append(issue) + if relation not in relations: + relations.append(relation) - return issues + return relations