Blame pagure/hooks/pagure_request_hook.py

Pierre-Yves Chibon 3390f9
# -*- coding: utf-8 -*-
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
"""
Pierre-Yves Chibon 5a5352
 (c) 2014-2016 - Copyright Red Hat Inc
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
 Authors:
Pierre-Yves Chibon 3390f9
   Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
"""
Pierre-Yves Chibon 3390f9
Aurélien Bompard dcf6f6
from __future__ import unicode_literals
Aurélien Bompard dcf6f6
Pierre-Yves Chibon 3390f9
import sqlalchemy as sa
Pierre-Yves Chibon 3390f9
import wtforms
Pierre-Yves Chibon 9c2953
Pierre-Yves Chibon 5a5352
try:
Pierre-Yves Chibon 2011e2
    from flask_wtf import FlaskForm
Pierre-Yves Chibon 2011e2
except ImportError:
Pierre-Yves Chibon 5a5352
    from flask_wtf import Form as FlaskForm
Pierre-Yves Chibon 3390f9
from sqlalchemy.orm import relation
Pierre-Yves Chibon 3390f9
from sqlalchemy.orm import backref
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 4e1723
import pagure.lib.git
Pierre-Yves Chibon 930073
import pagure.lib.tasks_services
Pierre-Yves Chibon 4e1723
from pagure.hooks import BaseHook, BaseRunner
Pierre-Yves Chibon fe5017
from pagure.lib.model import BASE, Project
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon fe5017
class PagureRequestsTable(BASE):
Pierre-Yves Chibon fe5017
    """ Stores information about the pagure requests hook deployed on a
Pierre-Yves Chibon 3390f9
    project.
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon fe5017
    Table -- hook_pagure_requests
Pierre-Yves Chibon 3390f9
    """
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 9c2953
    __tablename__ = "hook_pagure_requests"
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
    id = sa.Column(sa.Integer, primary_key=True)
Pierre-Yves Chibon 3390f9
    project_id = sa.Column(
Pierre-Yves Chibon 3390f9
        sa.Integer,
Pierre-Yves Chibon 9c2953
        sa.ForeignKey("projects.id", onupdate="CASCADE", ondelete="CASCADE"),
Pierre-Yves Chibon 3390f9
        nullable=False,
Pierre-Yves Chibon 3390f9
        unique=True,
Pierre-Yves Chibon 9c2953
        index=True,
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
    active = sa.Column(sa.Boolean, nullable=False, default=False)
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
    project = relation(
Pierre-Yves Chibon 9c2953
        "Project",
Pierre-Yves Chibon 9c2953
        remote_side=[Project.id],
Pierre-Yves Chibon 3390f9
        backref=backref(
Pierre-Yves Chibon 9c2953
            "pagure_hook_requests",
Pierre-Yves Chibon 9c2953
            cascade="delete, delete-orphan",
Pierre-Yves Chibon 9c2953
            single_parent=True,
Pierre-Yves Chibon 9c2953
            uselist=False,
Pierre-Yves Chibon 9c2953
        ),
farhaanbukhsh 9b97b4
    )
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 4e1723
class PagureRequestRunner(BaseRunner):
Pierre-Yves Chibon 4e1723
    """ Runner for the hook updating the db about requests on push to the
Pierre-Yves Chibon 4e1723
    git repo containing the meta-data about pull-requests.
Pierre-Yves Chibon 4e1723
    """
Pierre-Yves Chibon 4e1723
Pierre-Yves Chibon 4e1723
    @staticmethod
Pierre-Yves Chibon 4e1723
    def post_receive(session, username, project, repotype, repodir, changes):
Pierre-Yves Chibon 4e1723
        """ Run the default post-receive hook.
Pierre-Yves Chibon 4e1723
Pierre-Yves Chibon 4e1723
        For args, see BaseRunner.runhook.
Pierre-Yves Chibon 4e1723
        """
Pierre-Yves Chibon 4e1723
Pierre-Yves Chibon 4e1723
        if repotype != "requests":
Pierre-Yves Chibon 4e1723
            print(
Pierre-Yves Chibon 4e1723
                "The pagure requests hook only runs on the requests "
Pierre-Yves Chibon 998b35
                "git repo."
Pierre-Yves Chibon 998b35
            )
Pierre-Yves Chibon 4e1723
            return
Pierre-Yves Chibon 4e1723
Patrick Uiterwijk 1d5e11
        if username == "pagure":
Patrick Uiterwijk 1d5e11
            # This was an update from inside the UI. Do not trigger further
Patrick Uiterwijk 1d5e11
            # database updates, as this has already been done
Patrick Uiterwijk 1d5e11
            return
Patrick Uiterwijk 1d5e11
Pierre-Yves Chibon 4e1723
        for refname in changes:
Pierre-Yves Chibon 4e1723
            (oldrev, newrev) = changes[refname]
Pierre-Yves Chibon 4e1723
Pierre-Yves Chibon 4e1723
            if set(newrev) == set(["0"]):
Pierre-Yves Chibon 4e1723
                print(
Pierre-Yves Chibon 4e1723
                    "Deleting a reference/branch, so we won't run the "
Pierre-Yves Chibon 4e1723
                    "pagure hook"
Pierre-Yves Chibon 4e1723
                )
Pierre-Yves Chibon 4e1723
                return
Pierre-Yves Chibon 4e1723
Pierre-Yves Chibon 4e1723
            commits = pagure.lib.git.get_revs_between(
Pierre-Yves Chibon 4e1723
                oldrev, newrev, repodir, refname
Pierre-Yves Chibon 4e1723
            )
Pierre-Yves Chibon 4e1723
Pierre-Yves Chibon 4e1723
            pagure.lib.tasks_services.load_json_commits_to_db.delay(
Pierre-Yves Chibon 4e1723
                name=project.name,
Pierre-Yves Chibon 4e1723
                commits=commits,
Pierre-Yves Chibon 4e1723
                abspath=repodir,
Pierre-Yves Chibon 4e1723
                data_type="pull-request",
Pierre-Yves Chibon 4e1723
                agent=username,
Pierre-Yves Chibon 4e1723
                namespace=project.namespace,
Pierre-Yves Chibon 4e1723
                username=project.user.user if project.is_fork else None,
Pierre-Yves Chibon 4e1723
            )
Pierre-Yves Chibon 4e1723
Pierre-Yves Chibon 4e1723
Pierre-Yves Chibon 5a5352
class PagureRequestsForm(FlaskForm):
Pierre-Yves Chibon 9c2953
    """ Form to configure the pagure hook. """
Pierre-Yves Chibon 9c2953
Pierre-Yves Chibon 9c2953
    active = wtforms.BooleanField("Active", [wtforms.validators.Optional()])
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon fe5017
class PagureRequestHook(BaseHook):
Pierre-Yves Chibon 9c2953
    """ Pagure request hook. """
Pierre-Yves Chibon 3390f9
Pierre-Yves Chibon 9c2953
    name = "Pagure requests"
Pierre-Yves Chibon 9c2953
    description = (
Pierre-Yves Chibon 9c2953
        "Pagure specific hook to update pull-requests stored "
Pierre-Yves Chibon 9c2953
        "in the database based on the information pushed in the requests "
Pierre-Yves Chibon 9c2953
        "git repository."
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon fe5017
    form = PagureRequestsForm
Pierre-Yves Chibon fe5017
    db_object = PagureRequestsTable
Pierre-Yves Chibon 9c2953
    backref = "pagure_hook_requests"
Pierre-Yves Chibon 9c2953
    form_fields = ["active"]
Pierre-Yves Chibon 4e1723
    runner = PagureRequestRunner