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
):
Fabien Boucher 9e5f51
    """ Send out-going notifications about the branch/tag.
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
Fabien Boucher 9e5f51
        msg["rev"] = rev
Pierre-Yves Chibon 7190cf
    elif subject == "tag":
Pierre-Yves Chibon 7190cf
        msg["tag"] = refname
Fabien Boucher 9e5f51
        msg["rev"] = rev
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
Fabien Boucher 72b4aa
def send_notifications(
Fabien Boucher 72b4aa
    session, project, repodir, user, refname, revs, forced, oldrev
Fabien Boucher 72b4aa
):
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],
Fabien Boucher 72b4aa
            old_commit=oldrev,
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(
Fabien Boucher 72b4aa
                session,
Fabien Boucher 72b4aa
                project,
Fabien Boucher 72b4aa
                repodir,
Fabien Boucher 72b4aa
                username,
Fabien Boucher 72b4aa
                refname,
Fabien Boucher 72b4aa
                commits,
Fabien Boucher 72b4aa
                forced,
Fabien Boucher 72b4aa
                oldrev,
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