96 lines
2.7 KiB
Python
96 lines
2.7 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
"""
|
||
|
(c) 2015-2016 - Copyright Red Hat Inc
|
||
|
|
||
|
Authors:
|
||
|
Pierre-Yves Chibon <pingou@pingoured.fr>
|
||
|
|
||
|
"""
|
||
|
|
||
|
# pylint: disable=too-many-arguments
|
||
|
|
||
|
|
||
|
import re
|
||
|
|
||
|
import pagure.exceptions
|
||
|
|
||
|
|
||
|
FIXES = [
|
||
|
re.compile(r'(?:.*\s+)?fixe?[sd]?:?\s*?#(\d+)', re.I),
|
||
|
re.compile(
|
||
|
r'(?:.*\s+)?fixe?[sd]?:?\s*?https?://.*/(\w+)'
|
||
|
'/(?:issue|pull-request)/(\d+)', re.I),
|
||
|
re.compile(r'(?:.*\s+)?merge?[sd]?:?\s*?#(\d+)', re.I),
|
||
|
re.compile(
|
||
|
r'(?:.*\s+)?merge?[sd]?:?\s*?https?://.*/(\w+)'
|
||
|
'/(?:issue|pull-request)/(\d+)', re.I),
|
||
|
re.compile(r'(?:.*\s+)?close?[sd]?:?\s*?#(\d+)', re.I),
|
||
|
re.compile(
|
||
|
r'(?:.*\s+)?close?[sd]?:?\s*?https?://.*/(\w+)'
|
||
|
'/(?:issue|pull-request)/(\d+)', re.I),
|
||
|
]
|
||
|
|
||
|
RELATES = [
|
||
|
re.compile(r'(?:.*\s+)?relate[sd]?:?\s*?(?:to)?\s*?#(\d+)', re.I),
|
||
|
re.compile(r'(?:.*\s+)?relate[sd]?:?\s?#(\d+)', re.I),
|
||
|
re.compile(
|
||
|
r'(?:.*\s+)?relate[sd]?:?\s*?(?:to)?\s*?'
|
||
|
'https?://.*/(\w+)/issue/(\d+)', re.I),
|
||
|
]
|
||
|
|
||
|
|
||
|
def get_relation(session, reponame, username, namespace, 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``.
|
||
|
Another reference type is: `fixes` refering to text including for
|
||
|
example: ``this commits fixes #3``.
|
||
|
|
||
|
|
||
|
'''
|
||
|
|
||
|
repo = pagure.lib.get_project(
|
||
|
session, reponame, user=username, namespace=namespace)
|
||
|
if not repo:
|
||
|
return []
|
||
|
|
||
|
regex = RELATES
|
||
|
if reftype == 'fixes':
|
||
|
regex = FIXES
|
||
|
|
||
|
relations = []
|
||
|
for motif in regex:
|
||
|
relid = None
|
||
|
project = None
|
||
|
if motif.match(text):
|
||
|
if len(motif.match(text).groups()) >= 2:
|
||
|
relid = motif.match(text).group(2)
|
||
|
project = motif.match(text).group(1)
|
||
|
else:
|
||
|
relid = motif.match(text).group(1)
|
||
|
|
||
|
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 relation not in relations:
|
||
|
relations.append(relation)
|
||
|
|
||
|
return relations
|