Blame pagure/hooks/default.py

Pierre-Yves Chibon 8f4948
# -*- coding: utf-8 -*-
Pierre-Yves Chibon 8f4948
Pierre-Yves Chibon 8f4948
"""
Pierre-Yves Chibon 5729b8
 (c) 2016-2017 - Copyright Red Hat Inc
Pierre-Yves Chibon 8f4948
Pierre-Yves Chibon 8f4948
 Authors:
Pierre-Yves Chibon 8f4948
   Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
Pierre-Yves Chibon 8f4948
Pierre-Yves Chibon 8f4948
"""
Pierre-Yves Chibon 8f4948
Pierre-Yves Chibon 67d1cc
from __future__ import unicode_literals, print_function, absolute_import
Aurélien Bompard dcf6f6
Pierre-Yves Chibon 420d37
import logging
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
import pygit2
Pierre-Yves Chibon 420d37
import six
Pierre-Yves Chibon 8f4948
Pierre-Yves Chibon 420d37
import pagure.config
Pierre-Yves Chibon 420d37
import pagure.exceptions
Pierre-Yves Chibon 930073
import pagure.lib.query
Pierre-Yves Chibon 420d37
import pagure.lib.tasks
Pierre-Yves Chibon 420d37
import pagure.lib.tasks_services
Pierre-Yves Chibon 420d37
import pagure.utils
Pierre-Yves Chibon 420d37
from pagure.hooks import BaseHook, BaseRunner
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
_config = pagure.config.reload_config()
Pierre-Yves Chibon 420d37
_log = logging.getLogger(__name__)
Pierre-Yves Chibon 8f4948
Pierre-Yves Chibon 8f4948
Pierre-Yves Chibon 7190cf
FEDMSG_INIT = False
Pierre-Yves Chibon 7190cf
Pierre-Yves Chibon 7190cf
Pierre-Yves Chibon 420d37
def send_fedmsg_notifications(project, topic, msg):
Pierre-Yves Chibon 5313a3
    """ If the user or admin asked for fedmsg notifications on commit, this will
Pierre-Yves Chibon 420d37
    do it.
Pierre-Yves Chibon 420d37
    """
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 5313a3
    fedmsg_hook = pagure.lib.plugins.get_plugin("Fedmsg")
Pierre-Yves Chibon 5313a3
    fedmsg_hook.db_object()
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 5313a3
    always_fedmsg = _config.get("ALWAYS_FEDMSG_ON_COMMITS") or None
Pierre-Yves Chibon 5313a3
Pierre-Yves Chibon 5313a3
    # Send fedmsg and fedora-messaging notification
Pierre-Yves Chibon 5313a3
    # (if fedmsg and fedora-messaging are there and set-up)
Pierre-Yves Chibon 5313a3
    if always_fedmsg or (project.fedmsg_hook and project.fedmsg_hook.active):
Pierre-Yves Chibon a8bd0f
        if _config.get("FEDMSG_NOTIFICATIONS", True):
Pierre-Yves Chibon a8bd0f
            try:
Pierre-Yves Chibon 7190cf
                global FEDMSG_INIT
Pierre-Yves Chibon a8bd0f
                print("  - to fedmsg")
Pierre-Yves Chibon a8bd0f
                import fedmsg
Pierre-Yves Chibon a8bd0f
Pierre-Yves Chibon a8bd0f
                config = fedmsg.config.load_config([], None)
Pierre-Yves Chibon a8bd0f
                config["active"] = True
Pierre-Yves Chibon a8bd0f
                config["endpoints"]["relay_inbound"] = config["relay_inbound"]
Pierre-Yves Chibon 7190cf
                if not FEDMSG_INIT:
Pierre-Yves Chibon 7190cf
                    fedmsg.init(name="relay_inbound", **config)
Pierre-Yves Chibon 7190cf
                    FEDMSG_INIT = True
Pierre-Yves Chibon a8bd0f
Pierre-Yves Chibon a8bd0f
                pagure.lib.notify.fedmsg_publish(topic=topic, msg=msg)
Pierre-Yves Chibon a8bd0f
            except Exception:
Pierre-Yves Chibon a8bd0f
                _log.exception(
Pierre-Yves Chibon a8bd0f
                    "Error sending fedmsg notifications on commit push"
Pierre-Yves Chibon a8bd0f
                )
Pierre-Yves Chibon a8bd0f
Pierre-Yves Chibon a8bd0f
        if _config.get("FEDORA_MESSAGING_NOTIFICATIONS", False):
Pierre-Yves Chibon a8bd0f
            try:
Pierre-Yves Chibon a8bd0f
                print("  - to fedora-message")
Pierre-Yves Chibon a8bd0f
                pagure.lib.notify.fedora_messaging_publish(topic, msg)
Pierre-Yves Chibon a8bd0f
            except Exception:
Pierre-Yves Chibon a8bd0f
                _log.exception(
Pierre-Yves Chibon a8bd0f
                    "Error sending fedora-messaging notifications on "
Pierre-Yves Chibon a8bd0f
                    "commit push"
Pierre-Yves Chibon a8bd0f
                )
Pierre-Yves Chibon 5313a3
Pierre-Yves Chibon 5313a3
Pierre-Yves Chibon 5313a3
def send_stomp_notifications(project, topic, msg):
Pierre-Yves Chibon 5313a3
    """ If the user or admin asked for stomp notifications on commit, this will
Pierre-Yves Chibon 5313a3
    do it.
Pierre-Yves Chibon 5313a3
    """
Pierre-Yves Chibon 5313a3
    always_stomp = _config.get("ALWAYS_STOMP_ON_COMMITS") or None
Pierre-Yves Chibon 5313a3
    # Send stomp notification (if stomp is there and set-up)
Pierre-Yves Chibon 5313a3
    if always_stomp or (project.fedmsg_hook and project.fedmsg_hook.active):
Pierre-Yves Chibon 5313a3
        try:
Pierre-Yves Chibon 5313a3
            print("  - to stomp")
Pierre-Yves Chibon 5313a3
            pagure.lib.notify.stomp_publish(topic, msg)
Pierre-Yves Chibon 5313a3
        except Exception:
Pierre-Yves Chibon 5313a3
            _log.exception("Error sending stomp notifications on commit push")
Pierre-Yves Chibon 5313a3
Pierre-Yves Chibon 5313a3
Pierre-Yves Chibon 5313a3
def send_mqtt_notifications(project, topic, msg):
Pierre-Yves Chibon 5313a3
    """ If the user or admin asked for mqtt notifications on commit, this will
Pierre-Yves Chibon 5313a3
    do it.
Pierre-Yves Chibon 5313a3
    """
Pierre-Yves Chibon 5313a3
    always_mqtt = _config.get("ALWAYS_MQTT_ON_COMMITS") or None
Pierre-Yves Chibon 5313a3
    # Send mqtt notification (if mqtt is there and set-up)
Pierre-Yves Chibon 5313a3
    if always_mqtt or (project.fedmsg_hook and project.fedmsg_hook.active):
Pierre-Yves Chibon 5313a3
        try:
Pierre-Yves Chibon 5313a3
            print("  - to mqtt")
Pierre-Yves Chibon 5313a3
            pagure.lib.notify.mqtt_publish(topic, msg)
Pierre-Yves Chibon 5313a3
        except Exception:
Pierre-Yves Chibon 5313a3
            _log.exception("Error sending stomp notifications on commit push")
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
def send_webhook_notifications(project, topic, msg):
Pierre-Yves Chibon 420d37
    """ If the user asked for webhook notifications on commit, this will
Pierre-Yves Chibon 420d37
    do it.
Pierre-Yves Chibon 420d37
    """
Pierre-Yves Chibon 5313a3
    if project.settings.get("Web-hooks"):
Pierre-Yves Chibon 5313a3
        try:
Pierre-Yves Chibon 5313a3
            print("  - to web-hooks")
Pierre-Yves Chibon 5313a3
            pagure.lib.tasks_services.webhook_notification.delay(
Pierre-Yves Chibon 5313a3
                topic=topic,
Pierre-Yves Chibon 5313a3
                msg=msg,
Pierre-Yves Chibon 5313a3
                namespace=project.namespace,
Pierre-Yves Chibon 5313a3
                name=project.name,
Pierre-Yves Chibon 5313a3
                user=project.user.username if project.is_fork else None,
Pierre-Yves Chibon 5313a3
            )
Pierre-Yves Chibon 5313a3
        except Exception:
Pierre-Yves Chibon 5313a3
            _log.exception(
Pierre-Yves Chibon 5313a3
                "Error sending web-hook notifications on commit push"
Pierre-Yves Chibon 5313a3
            )
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 7190cf
def send_action_notification(
Pierre-Yves Chibon 7190cf
    session, subject, action, project, repodir, user, refname, rev
Pierre-Yves Chibon 7190cf
):
Pierre-Yves Chibon 7190cf
    """ Send out-going notifications about the branch that was just deleted.
Pierre-Yves Chibon 7190cf
    """
Pierre-Yves Chibon 7190cf
    email = pagure.lib.git.get_author_email(rev, repodir)
Pierre-Yves Chibon 7190cf
    name = pagure.lib.git.get_author(rev, repodir)
Pierre-Yves Chibon 7190cf
    author = pagure.lib.query.search_user(session, email=email)
Pierre-Yves Chibon 7190cf
    if author:
Pierre-Yves Chibon 7190cf
        author = author.to_json(public=True)
Pierre-Yves Chibon 7190cf
    else:
Pierre-Yves Chibon 7190cf
        author = name
Pierre-Yves Chibon 7190cf
Pierre-Yves Chibon 7190cf
    topic = "git.%s.%s" % (subject, action)
Pierre-Yves Chibon 7190cf
    msg = dict(
Pierre-Yves Chibon 7190cf
        authors=[author],
Pierre-Yves Chibon 7190cf
        agent=user,
Pierre-Yves Chibon 7190cf
        repo=project.to_json(public=True)
Pierre-Yves Chibon 7190cf
        if not isinstance(project, six.string_types)
Pierre-Yves Chibon 7190cf
        else project,
Pierre-Yves Chibon 7190cf
    )
Pierre-Yves Chibon 7190cf
    if subject == "branch":
Pierre-Yves Chibon 7190cf
        msg["branch"] = refname
Pierre-Yves Chibon 7190cf
    elif subject == "tag":
Pierre-Yves Chibon 7190cf
        msg["tag"] = refname
Pierre-Yves Chibon 7190cf
Pierre-Yves Chibon 7190cf
    # Send blink notification to any 3rd party plugins, if there are any
Pierre-Yves Chibon 7190cf
    pagure.lib.notify.blinker_publish(topic, msg)
Pierre-Yves Chibon 7190cf
Pierre-Yves Chibon 7190cf
    if not project.private:
Pierre-Yves Chibon 7190cf
        send_fedmsg_notifications(project, topic, msg)
Pierre-Yves Chibon 7190cf
        send_stomp_notifications(project, topic, msg)
Pierre-Yves Chibon 7190cf
        send_mqtt_notifications(project, topic, msg)
Pierre-Yves Chibon 7190cf
        send_webhook_notifications(project, topic, msg)
Pierre-Yves Chibon 7190cf
Pierre-Yves Chibon 7190cf
Pierre-Yves Chibon 420d37
def send_notifications(session, project, repodir, user, refname, revs, forced):
Pierre-Yves Chibon 420d37
    """ Send out-going notifications about the commits that have just been
Pierre-Yves Chibon 420d37
    pushed.
Pierre-Yves Chibon 420d37
    """
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
    auths = set()
Pierre-Yves Chibon 420d37
    for rev in revs:
Pierre-Yves Chibon 420d37
        email = pagure.lib.git.get_author_email(rev, repodir)
Pierre-Yves Chibon 420d37
        name = pagure.lib.git.get_author(rev, repodir)
Pierre-Yves Chibon 930073
        author = pagure.lib.query.search_user(session, email=email) or name
Pierre-Yves Chibon 420d37
        auths.add(author)
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
    authors = []
Pierre-Yves Chibon 420d37
    for author in auths:
Pierre-Yves Chibon 420d37
        if not isinstance(author, six.string_types):
Pierre-Yves Chibon 420d37
            author = author.to_json(public=True)
Pierre-Yves Chibon 420d37
        authors.append(author)
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
    if revs:
Pierre-Yves Chibon 420d37
        revs.reverse()
Pierre-Yves Chibon 420d37
        print("* Publishing information for %i commits" % len(revs))
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
        topic = "git.receive"
Pierre-Yves Chibon 420d37
        msg = dict(
Pierre-Yves Chibon 420d37
            total_commits=len(revs),
Pierre-Yves Chibon 420d37
            start_commit=revs[0],
Pierre-Yves Chibon 420d37
            end_commit=revs[-1],
Pierre-Yves Chibon 420d37
            branch=refname,
Pierre-Yves Chibon 420d37
            forced=forced,
Pierre-Yves Chibon 420d37
            authors=list(authors),
Pierre-Yves Chibon 420d37
            agent=user,
Pierre-Yves Chibon 420d37
            repo=project.to_json(public=True)
Pierre-Yves Chibon 420d37
            if not isinstance(project, six.string_types)
Pierre-Yves Chibon 420d37
            else project,
Pierre-Yves Chibon 420d37
        )
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon daeb44
        # Send blink notification to any 3rd party plugins, if there are any
Pierre-Yves Chibon daeb44
        pagure.lib.notify.blinker_publish(topic, msg)
Pierre-Yves Chibon daeb44
Pierre-Yves Chibon 5313a3
        if not project.private:
Pierre-Yves Chibon 5313a3
            send_fedmsg_notifications(project, topic, msg)
Pierre-Yves Chibon 5313a3
            send_stomp_notifications(project, topic, msg)
Pierre-Yves Chibon 5313a3
            send_mqtt_notifications(project, topic, msg)
Pierre-Yves Chibon 5313a3
            send_webhook_notifications(project, topic, msg)
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
        if (
Pierre-Yves Chibon 420d37
            _config.get("PAGURE_CI_SERVICES")
Pierre-Yves Chibon 420d37
            and project.ci_hook
Pierre-Yves Chibon 420d37
            and project.ci_hook.active_commit
Pierre-Yves Chibon 420d37
            and not project.private
Pierre-Yves Chibon 420d37
        ):
Pierre-Yves Chibon 420d37
            pagure.lib.tasks_services.trigger_ci_build.delay(
Pierre-Yves Chibon 420d37
                project_name=project.fullname,
Pierre-Yves Chibon 420d37
                cause=revs[-1],
Pierre-Yves Chibon 420d37
                branch=refname,
Pierre-Yves Chibon 420d37
                ci_type=project.ci_hook.ci_type,
Pierre-Yves Chibon fd1956
                branch_to=None,
Pierre-Yves Chibon 420d37
            )
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
def inform_pull_request_urls(
Pierre-Yves Chibon 420d37
    session, project, commits, refname, default_branch
Pierre-Yves Chibon 420d37
):
Pierre-Yves Chibon 420d37
    """ Inform the user about the URLs to open a new pull-request or visit
Pierre-Yves Chibon 420d37
    the existing one.
Pierre-Yves Chibon 420d37
    """
Pierre-Yves Chibon 420d37
    target_repo = project
Pierre-Yves Chibon 420d37
    if project.is_fork:
Pierre-Yves Chibon 420d37
        target_repo = project.parent
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon ca7bbc
    pr_uids = []
Pierre-Yves Chibon ca7bbc
Pierre-Yves Chibon 420d37
    if (
Pierre-Yves Chibon 420d37
        commits
Pierre-Yves Chibon 420d37
        and refname != default_branch
Pierre-Yves Chibon 420d37
        and target_repo.settings.get("pull_requests", True)
Pierre-Yves Chibon 420d37
    ):
Pierre-Yves Chibon 420d37
        print()
Pierre-Yves Chibon 930073
        prs = pagure.lib.query.search_pull_requests(
Pierre-Yves Chibon 420d37
            session,
Pierre-Yves Chibon ca7bbc
            project_id_from=target_repo.id,
Pierre-Yves Chibon 420d37
            status="Open",
Pierre-Yves Chibon 420d37
            branch_from=refname,
Pierre-Yves Chibon 420d37
        )
Pierre-Yves Chibon ca7bbc
        if project.id != target_repo.id:
Pierre-Yves Chibon ca7bbc
            prs.extend(
Pierre-Yves Chibon ca7bbc
                pagure.lib.query.search_pull_requests(
Pierre-Yves Chibon ca7bbc
                    session,
Pierre-Yves Chibon ca7bbc
                    project_id_from=project.id,
Pierre-Yves Chibon ca7bbc
                    status="Open",
Pierre-Yves Chibon ca7bbc
                    branch_from=refname,
Pierre-Yves Chibon ca7bbc
                )
Pierre-Yves Chibon ca7bbc
            )
Pierre-Yves Chibon 420d37
        # Link to existing PRs if there are any
Pierre-Yves Chibon 420d37
        seen = len(prs) != 0
Pierre-Yves Chibon 420d37
        for pr in prs:
Pierre-Yves Chibon ca7bbc
            # Refresh the PR in the db and everywhere else where needed
Pierre-Yves Chibon ca7bbc
            pagure.lib.tasks.update_pull_request.delay(pr.uid)
Pierre-Yves Chibon ca7bbc
Pierre-Yves Chibon 420d37
            # Link tickets with pull-requests if the commit mentions it
Pierre-Yves Chibon 420d37
            pagure.lib.tasks.link_pr_to_ticket.delay(pr.uid)
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
            # Inform the user about the PR
Pierre-Yves Chibon 420d37
            print("View pull-request for %s" % refname)
Pierre-Yves Chibon 420d37
            print(
Pierre-Yves Chibon 420d37
                "   %s/%s/pull-request/%s"
Pierre-Yves Chibon 420d37
                % (_config["APP_URL"].rstrip("/"), pr.project.url_path, pr.id)
Pierre-Yves Chibon 420d37
            )
Pierre-Yves Chibon ca7bbc
            pr_uids.append(pr.uid)
Pierre-Yves Chibon 974201
Pierre-Yves Chibon 420d37
        # If no existing PRs, provide the link to open one
Pierre-Yves Chibon 420d37
        if not seen:
Pierre-Yves Chibon 420d37
            print("Create a pull-request for %s" % refname)
Pierre-Yves Chibon 420d37
            print(
Pierre-Yves Chibon 420d37
                "   %s/%s/diff/%s..%s"
Pierre-Yves Chibon 420d37
                % (
Pierre-Yves Chibon 420d37
                    _config["APP_URL"].rstrip("/"),
Pierre-Yves Chibon 420d37
                    project.url_path,
Pierre-Yves Chibon 420d37
                    default_branch,
Pierre-Yves Chibon 420d37
                    refname,
Pierre-Yves Chibon 420d37
                )
Pierre-Yves Chibon 420d37
            )
Pierre-Yves Chibon 420d37
        print()
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon ca7bbc
    return pr_uids
Pierre-Yves Chibon ca7bbc
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
class DefaultRunner(BaseRunner):
Pierre-Yves Chibon 420d37
    """ Runner for the default hook."""
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
    @staticmethod
Pierre-Yves Chibon 420d37
    def post_receive(session, username, project, repotype, repodir, changes):
Pierre-Yves Chibon 420d37
        """ Run the default post-receive hook.
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
        For args, see BaseRunner.runhook.
Pierre-Yves Chibon 420d37
        """
Pierre-Yves Chibon 420d37
        if repotype != "main":
Pierre-Yves Chibon 420d37
            if _config.get("HOOK_DEBUG", False):
Pierre-Yves Chibon 998b35
                print("Default hook only runs on the main project repository")
Patrick Uiterwijk 4329df
            return
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
        if changes:
Pierre-Yves Chibon 420d37
            # Retrieve the default branch
Pierre-Yves Chibon 420d37
            repo_obj = pygit2.Repository(repodir)
Pierre-Yves Chibon 420d37
            default_branch = None
Pierre-Yves Chibon 420d37
            if not repo_obj.is_empty and not repo_obj.head_is_unborn:
Pierre-Yves Chibon 420d37
                default_branch = repo_obj.head.shorthand
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon ca7bbc
        pr_uids = []
Pierre-Yves Chibon ca7bbc
Pierre-Yves Chibon 420d37
        for refname in changes:
Pierre-Yves Chibon 420d37
            (oldrev, newrev) = changes[refname]
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
            forced = False
Pierre-Yves Chibon 420d37
            if set(newrev) == set(["0"]):
Pierre-Yves Chibon 7190cf
                if refname.startswith("refs/tags"):
Pierre-Yves Chibon 7190cf
                    refname = refname.replace("refs/tags/", "")
Pierre-Yves Chibon 7190cf
                    send_action_notification(
Pierre-Yves Chibon 7190cf
                        session,
Pierre-Yves Chibon 7190cf
                        "tag",
Pierre-Yves Chibon 7190cf
                        "deletion",
Pierre-Yves Chibon 7190cf
                        project,
Pierre-Yves Chibon 7190cf
                        repodir,
Pierre-Yves Chibon 7190cf
                        username,
Pierre-Yves Chibon 7190cf
                        refname,
Pierre-Yves Chibon 7190cf
                        oldrev,
Pierre-Yves Chibon 7190cf
                    )
Pierre-Yves Chibon 7190cf
                    print("Deleting a tag, so we won't run the " "pagure hook")
Pierre-Yves Chibon 7190cf
                elif refname.startswith("refs/heads/"):
Pierre-Yves Chibon 7190cf
                    refname = refname.replace("refs/heads/", "")
Pierre-Yves Chibon 7190cf
                    send_action_notification(
Pierre-Yves Chibon 7190cf
                        session,
Pierre-Yves Chibon 7190cf
                        "branch",
Pierre-Yves Chibon 7190cf
                        "deletion",
Pierre-Yves Chibon 7190cf
                        project,
Pierre-Yves Chibon 7190cf
                        repodir,
Pierre-Yves Chibon 7190cf
                        username,
Pierre-Yves Chibon 7190cf
                        refname,
Pierre-Yves Chibon 7190cf
                        oldrev,
Pierre-Yves Chibon 7190cf
                    )
Pierre-Yves Chibon 7190cf
                    print(
Pierre-Yves Chibon 7190cf
                        "Deleting a branch, so we won't run the " "pagure hook"
Pierre-Yves Chibon 7190cf
                    )
Pierre-Yves Chibon 7190cf
                else:
Pierre-Yves Chibon 7190cf
                    print(
Pierre-Yves Chibon 7190cf
                        "Deleting %s, so we wont run the pagure hook nor "
Pierre-Yves Chibon 7190cf
                        "send notifications"
Pierre-Yves Chibon 7190cf
                    )
Pierre-Yves Chibon 7190cf
                continue
Pierre-Yves Chibon 420d37
            elif set(oldrev) == set(["0"]):
Pierre-Yves Chibon 420d37
                oldrev = "^%s" % oldrev
Pierre-Yves Chibon 7190cf
                if refname.startswith("refs/tags"):
Pierre-Yves Chibon 7190cf
                    refname = refname.replace("refs/tags/", "")
Pierre-Yves Chibon 7190cf
                    send_action_notification(
Pierre-Yves Chibon 7190cf
                        session,
Pierre-Yves Chibon 7190cf
                        "tag",
Pierre-Yves Chibon 7190cf
                        "creation",
Pierre-Yves Chibon 7190cf
                        project,
Pierre-Yves Chibon 7190cf
                        repodir,
Pierre-Yves Chibon 7190cf
                        username,
Pierre-Yves Chibon 7190cf
                        refname,
Pierre-Yves Chibon 7190cf
                        newrev,
Pierre-Yves Chibon 7190cf
                    )
Pierre-Yves Chibon 420d37
            elif pagure.lib.git.is_forced_push(oldrev, newrev, repodir):
Pierre-Yves Chibon 420d37
                forced = True
Pierre-Yves Chibon 420d37
                base = pagure.lib.git.get_base_revision(
Pierre-Yves Chibon 998b35
                    oldrev, newrev, repodir
Pierre-Yves Chibon 998b35
                )
Pierre-Yves Chibon 420d37
                if base:
Pierre-Yves Chibon 420d37
                    oldrev = base[0]
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
            refname = refname.replace("refs/heads/", "")
Pierre-Yves Chibon 420d37
            commits = pagure.lib.git.get_revs_between(
Pierre-Yves Chibon 420d37
                oldrev, newrev, repodir, refname
Pierre-Yves Chibon 420d37
            )
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon fccbed
            log_all = _config.get("LOG_ALL_COMMITS", False)
Pierre-Yves Chibon fccbed
            if log_all or refname == default_branch:
Pierre-Yves Chibon 420d37
                print(
Pierre-Yves Chibon 420d37
                    "Sending to redis to log activity and send commit "
Pierre-Yves Chibon 420d37
                    "notification emails"
Pierre-Yves Chibon 420d37
                )
Pierre-Yves Chibon 420d37
            else:
Pierre-Yves Chibon 420d37
                print("Sending to redis to send commit notification emails")
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
            # This is logging the commit to the log table in the DB so we can
Pierre-Yves Chibon 420d37
            # render commits in the calendar heatmap.
Pierre-Yves Chibon 420d37
            # It is also sending emails about commits to people using the
Pierre-Yves Chibon 420d37
            # 'watch' feature to be made aware of new commits.
Pierre-Yves Chibon 420d37
            pagure.lib.tasks_services.log_commit_send_notifications.delay(
Pierre-Yves Chibon 420d37
                name=project.name,
Pierre-Yves Chibon 420d37
                commits=commits,
Pierre-Yves Chibon 420d37
                abspath=repodir,
Pierre-Yves Chibon 420d37
                branch=refname,
Pierre-Yves Chibon 420d37
                default_branch=default_branch,
Pierre-Yves Chibon 420d37
                namespace=project.namespace,
Pierre-Yves Chibon 420d37
                username=project.user.user if project.is_fork else None,
Pierre-Yves Chibon 420d37
            )
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
            # This one is sending fedmsg and web-hook notifications for project
Pierre-Yves Chibon 420d37
            # that set them up
Pierre-Yves Chibon 420d37
            send_notifications(
Pierre-Yves Chibon 998b35
                session, project, repodir, username, refname, commits, forced
Pierre-Yves Chibon 998b35
            )
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
            # Now display to the user if this isn't the default branch links to
Pierre-Yves Chibon 420d37
            # open a new pr or review the existing one
Pierre-Yves Chibon ca7bbc
            pr_uids.extend(
Pierre-Yves Chibon ca7bbc
                inform_pull_request_urls(
Pierre-Yves Chibon ca7bbc
                    session, project, commits, refname, default_branch
Pierre-Yves Chibon ca7bbc
                )
Pierre-Yves Chibon 420d37
            )
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon ca7bbc
        # Refresh of all opened PRs
Pierre-Yves Chibon 420d37
        parent = project.parent or project
Pierre-Yves Chibon d5cf4f
        if not _config.get("GIT_HOOK_DB_RO", False):
Pierre-Yves Chibon 5c0786
            pagure.lib.tasks.refresh_pr_cache(
Pierre-Yves Chibon 5c0786
                parent.name,
Pierre-Yves Chibon 5c0786
                parent.namespace,
Pierre-Yves Chibon 5c0786
                parent.user.user if parent.is_fork else None,
Pierre-Yves Chibon 5c0786
                but_uids=pr_uids,
Pierre-Yves Chibon 5c0786
            )
Pierre-Yves Chibon 5c0786
        else:
Pierre-Yves Chibon 5c0786
            pagure.lib.tasks.refresh_pr_cache.delay(
Pierre-Yves Chibon 5c0786
                parent.name,
Pierre-Yves Chibon 5c0786
                parent.namespace,
Pierre-Yves Chibon 5c0786
                parent.user.user if parent.is_fork else None,
Pierre-Yves Chibon 5c0786
                but_uids=pr_uids,
Pierre-Yves Chibon 5c0786
            )
Pierre-Yves Chibon ca7bbc
Pierre-Yves Chibon 97d19d
        if not project.is_on_repospanner and _config.get(
Pierre-Yves Chibon 97d19d
            "GIT_GARBAGE_COLLECT", False
Pierre-Yves Chibon 97d19d
        ):
Slavek Kabrda de8507
            pagure.lib.tasks.git_garbage_collect.delay(
Slavek Kabrda de8507
                project.repopath("main")
Slavek Kabrda de8507
            )
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 420d37
Pierre-Yves Chibon 8f4948
class Default(BaseHook):
Pierre-Yves Chibon 9c2953
    """ Default hooks. """
Pierre-Yves Chibon 8f4948
Pierre-Yves Chibon 9c2953
    name = "default"
Pierre-Yves Chibon 9c2953
    description = (
Pierre-Yves Chibon 9c2953
        "Default hooks that should be enabled for each and every project."
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 420d37
    runner = DefaultRunner
Slavek Kabrda adbb5f
Slavek Kabrda adbb5f
    @classmethod
Slavek Kabrda adbb5f
    def is_enabled_for(cls, project):
Slavek Kabrda adbb5f
        return True