|
Pierre-Yves Chibon |
c5ee5f |
# -*- coding: utf-8 -*-
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
"""
|
|
Pierre-Yves Chibon |
341785 |
(c) 2015-2016 - Copyright Red Hat Inc
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
Authors:
|
|
Pierre-Yves Chibon |
c5ee5f |
Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
"""
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
22a554 |
# pylint: disable=too-many-arguments
|
|
Pierre-Yves Chibon |
341785 |
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
import re
|
|
Farhaan Bukhsh |
72e9db |
import pagure
|
|
Pierre-Yves Chibon |
fe5017 |
import pagure.exceptions
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
FIXES = [
|
|
Mike McLean |
e7d4db |
re.compile(r'(?:.*\s+)?fixe?[sd]?:?\s*?#(\d+)', re.I),
|
|
Pierre-Yves Chibon |
f610bf |
re.compile(
|
|
Pierre-Yves Chibon |
f610bf |
r'(?:.*\s+)?fixe?[sd]?:?\s*?https?://.*/(\w+)'
|
|
Pierre-Yves Chibon |
f610bf |
'/(?:issue|pull-request)/(\d+)', re.I),
|
|
Mike McLean |
e7d4db |
re.compile(r'(?:.*\s+)?merge?[sd]?:?\s*?#(\d+)', re.I),
|
|
Pierre-Yves Chibon |
f610bf |
re.compile(
|
|
Pierre-Yves Chibon |
f610bf |
r'(?:.*\s+)?merge?[sd]?:?\s*?https?://.*/(\w+)'
|
|
Pierre-Yves Chibon |
f610bf |
'/(?:issue|pull-request)/(\d+)', re.I),
|
|
Patrick Uiterwijk |
12ee6f |
re.compile(r'(?:.*\s+)?close?[sd]?:?\s*?#(\d+)', re.I),
|
|
Pierre-Yves Chibon |
f610bf |
re.compile(
|
|
Pierre-Yves Chibon |
f610bf |
r'(?:.*\s+)?close?[sd]?:?\s*?https?://.*/(\w+)'
|
|
Pierre-Yves Chibon |
f610bf |
'/(?:issue|pull-request)/(\d+)', re.I),
|
|
Pierre-Yves Chibon |
c5ee5f |
]
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
RELATES = [
|
|
Mike McLean |
e7d4db |
re.compile(r'(?:.*\s+)?relate[sd]?:?\s*?(?:to)?\s*?#(\d+)', re.I),
|
|
Mike McLean |
e7d4db |
re.compile(r'(?:.*\s+)?relate[sd]?:?\s?#(\d+)', re.I),
|
|
Pierre-Yves Chibon |
c5ee5f |
re.compile(
|
|
Pierre-Yves Chibon |
f610bf |
r'(?:.*\s+)?relate[sd]?:?\s*?(?:to)?\s*?'
|
|
Pierre-Yves Chibon |
f610bf |
'https?://.*/(\w+)/issue/(\d+)', re.I),
|
|
Pierre-Yves Chibon |
c5ee5f |
]
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
08a80b |
def get_relation(session, reponame, username, namespace, text,
|
|
Pierre-Yves Chibon |
08f92e |
reftype='relates', include_prs=False):
|
|
Pierre-Yves Chibon |
c5ee5f |
''' For a given text, searches using regex if the text contains
|
|
Pierre-Yves Chibon |
c5ee5f |
reference to another issue in this project or another one.
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
Returns the list of issues referenced (possibly empty).
|
|
Patrick Uiterwijk |
2c1a95 |
If include_prs=True, it may also contain pull requests (may still
|
|
Patrick Uiterwijk |
2c1a95 |
be empty).
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
By default it searches for references of type: `relates`, for example:
|
|
Pierre-Yves Chibon |
c5ee5f |
``this commits relates to #2``.
|
|
Pierre-Yves Chibon |
c5ee5f |
Another reference type is: `fixes` refering to text including for
|
|
Pierre-Yves Chibon |
c5ee5f |
example: ``this commits fixes #3``.
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
'''
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
b130e5 |
repo = pagure.lib.get_authorized_project(
|
|
Pierre-Yves Chibon |
08f92e |
session, reponame, user=username, namespace=namespace)
|
|
Pierre-Yves Chibon |
c5ee5f |
if not repo:
|
|
Pierre-Yves Chibon |
c5ee5f |
return []
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Pierre-Yves Chibon |
c5ee5f |
regex = RELATES
|
|
Pierre-Yves Chibon |
c5ee5f |
if reftype == 'fixes':
|
|
Pierre-Yves Chibon |
c5ee5f |
regex = FIXES
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Patrick Uiterwijk |
2c1a95 |
relations = []
|
|
Pierre-Yves Chibon |
c5ee5f |
for motif in regex:
|
|
Patrick Uiterwijk |
2c1a95 |
relid = None
|
|
Pierre-Yves Chibon |
c5ee5f |
project = None
|
|
Pierre-Yves Chibon |
c5ee5f |
if motif.match(text):
|
|
Pierre-Yves Chibon |
c5ee5f |
if len(motif.match(text).groups()) >= 2:
|
|
Patrick Uiterwijk |
2c1a95 |
relid = motif.match(text).group(2)
|
|
Pierre-Yves Chibon |
c5ee5f |
project = motif.match(text).group(1)
|
|
Pierre-Yves Chibon |
c5ee5f |
else:
|
|
Patrick Uiterwijk |
2c1a95 |
relid = motif.match(text).group(1)
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Patrick Uiterwijk |
2c1a95 |
if relid:
|
|
Patrick Uiterwijk |
2c1a95 |
relation = pagure.lib.search_issues(
|
|
Patrick Uiterwijk |
2c1a95 |
session, repo=repo, issueid=relid)
|
|
Patrick Uiterwijk |
2c1a95 |
|
|
Patrick Uiterwijk |
2c1a95 |
if relation is None and include_prs:
|
|
Patrick Uiterwijk |
2c1a95 |
relation = pagure.lib.search_pull_requests(
|
|
Patrick Uiterwijk |
2c1a95 |
session, project_id=repo.id, requestid=relid)
|
|
Patrick Uiterwijk |
2c1a95 |
|
|
Patrick Uiterwijk |
2c1a95 |
if relation is None or relation.project.name not in [project,
|
|
Patrick Uiterwijk |
2c1a95 |
repo.name]:
|
|
Pierre-Yves Chibon |
c5ee5f |
continue
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Patrick Uiterwijk |
2c1a95 |
if relation not in relations:
|
|
Patrick Uiterwijk |
2c1a95 |
relations.append(relation)
|
|
Pierre-Yves Chibon |
c5ee5f |
|
|
Patrick Uiterwijk |
2c1a95 |
return relations
|