Blame pagure/lib/link.py

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