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 67d1cc
from __future__ import unicode_literals, absolute_import
Pierre-Yves Chibon c5ee5f
Pierre-Yves Chibon c5ee5f
import re
Pierre-Yves Chibon 930073
import pagure.lib.query
Pierre-Yves Chibon fe5017
import pagure.exceptions
Pierre-Yves Chibon 7c5e53
import pagure.utils
Pierre-Yves Chibon 7c5e53
from pagure.config import config as pagure_config
Pierre-Yves Chibon c5ee5f
Pierre-Yves Chibon c5ee5f
Pierre-Yves Chibon c5ee5f
FIXES = [
Pierre-Yves Chibon 7c5e53
    re.compile(r"(?:.*\s+)?{0}?[sd]?:?\s*?#(\d+)".format(kw), re.I)
Pierre-Yves Chibon bc2da0
    for kw in ["fix", "fixe", "merge", "close", "resolve"]
Pierre-Yves Chibon 7c5e53
]
Pierre-Yves Chibon 7c5e53
FIXES += [
Pierre-Yves Chibon f610bf
    re.compile(
Pierre-Yves Chibon 7c5e53
        r"(?:.*\s+)?{0}?[sd]?:?\s*?{1}"
Pierre-Yves Chibon 7c5e53
        r"(/.*?/(?:issue|pull-request)/\d+)".format(
Pierre-Yves Chibon 7c5e53
            kw, pagure_config["APP_URL"].rstrip("/")
Pierre-Yves Chibon 7c5e53
        ),
Pierre-Yves Chibon 9c2953
        re.I,
Pierre-Yves Chibon 7c5e53
    )
Pierre-Yves Chibon bc2da0
    for kw in ["fix", "fixe", "merge", "close", "resolve"]
Pierre-Yves Chibon c5ee5f
]
Pierre-Yves Chibon c5ee5f
Pierre-Yves Chibon 7c5e53
Pierre-Yves Chibon c5ee5f
RELATES = [
Pierre-Yves Chibon 7c5e53
    re.compile(r"(?:.*\s+)?{0}?[sd]?:?\s*?(?:to)?\s*?#(\d+)".format(kw), re.I)
Pierre-Yves Chibon 7c5e53
    for kw in ["relate"]
Pierre-Yves Chibon 7c5e53
]
Pierre-Yves Chibon 7c5e53
RELATES += [
Pierre-Yves Chibon c5ee5f
    re.compile(
Pierre-Yves Chibon 7c5e53
        r"(?:.*\s+)?{0}?[sd]?:?\s*?(?:to)?\s*?{1}(/.*?/issue/\d+)".format(
Pierre-Yves Chibon 7c5e53
            kw, pagure_config["APP_URL"].rstrip("/")
Pierre-Yves Chibon 7c5e53
        ),
Pierre-Yves Chibon 9c2953
        re.I,
Pierre-Yves Chibon 7c5e53
    )
Pierre-Yves Chibon 7c5e53
    for kw in ["relate"]
Pierre-Yves Chibon c5ee5f
]
Pierre-Yves Chibon c5ee5f
Pierre-Yves Chibon c5ee5f
Pierre-Yves Chibon 9c2953
def get_relation(
Pierre-Yves Chibon 9c2953
    session,
Pierre-Yves Chibon 9c2953
    reponame,
Pierre-Yves Chibon 9c2953
    username,
Pierre-Yves Chibon 9c2953
    namespace,
Pierre-Yves Chibon 9c2953
    text,
Pierre-Yves Chibon 9c2953
    reftype="relates",
Pierre-Yves Chibon 9c2953
    include_prs=False,
Pierre-Yves Chibon 9c2953
):
Pierre-Yves Chibon 9c2953
    """ 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 9c2953
    """
Pierre-Yves Chibon c5ee5f
Pierre-Yves Chibon 930073
    repo = pagure.lib.query.get_authorized_project(
Pierre-Yves Chibon 9c2953
        session, reponame, user=username, namespace=namespace
Pierre-Yves Chibon 9c2953
    )
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 9c2953
    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 7c5e53
        got_match = motif.match(text)
Pierre-Yves Chibon 7c5e53
        if got_match:
Pierre-Yves Chibon 7c5e53
            relid = got_match.group(1)
Pierre-Yves Chibon 7c5e53
            if not relid.isdigit():
Pierre-Yves Chibon 7c5e53
                (
Pierre-Yves Chibon 7c5e53
                    username,
Pierre-Yves Chibon 7c5e53
                    namespace,
Pierre-Yves Chibon 7c5e53
                    reponame,
Pierre-Yves Chibon 7c5e53
                    objtype,
Pierre-Yves Chibon 7c5e53
                    relid,
Pierre-Yves Chibon 7c5e53
                ) = pagure.utils.parse_path(relid)
Pierre-Yves Chibon 7c5e53
                repo = pagure.lib.query.get_authorized_project(
Pierre-Yves Chibon 7c5e53
                    session, reponame, user=username, namespace=namespace
Pierre-Yves Chibon 7c5e53
                )
Pierre-Yves Chibon 7c5e53
                if not repo:
Pierre-Yves Chibon 7c5e53
                    continue
Pierre-Yves Chibon c5ee5f
Patrick Uiterwijk 2c1a95
        if relid:
Pierre-Yves Chibon 930073
            relation = pagure.lib.query.search_issues(
Pierre-Yves Chibon 9c2953
                session, repo=repo, issueid=relid
Pierre-Yves Chibon 9c2953
            )
Patrick Uiterwijk 2c1a95
Patrick Uiterwijk 2c1a95
            if relation is None and include_prs:
Pierre-Yves Chibon 930073
                relation = pagure.lib.query.search_pull_requests(
Pierre-Yves Chibon 9c2953
                    session, project_id=repo.id, requestid=relid
Pierre-Yves Chibon 9c2953
                )
Patrick Uiterwijk 2c1a95
Pierre-Yves Chibon 9c2953
            if relation is None or relation.project.name not in [
Pierre-Yves Chibon 9c2953
                project,
Pierre-Yves Chibon 9c2953
                repo.name,
Pierre-Yves Chibon 9c2953
            ]:
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