Blame pagure/hooks/pagure_no_new_branches.py

Slavek Kabrda 5afad4
# -*- coding: utf-8 -*-
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
"""
Slavek Kabrda 5afad4
 (c) 2014-2018 - Copyright Red Hat Inc
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
 Authors:
Slavek Kabrda 5afad4
   Slavek Kabrda <bkabrda@redhat.com></bkabrda@redhat.com>
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
"""
Slavek Kabrda 5afad4
Pierre-Yves Chibon 67d1cc
from __future__ import unicode_literals, absolute_import
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
import sqlalchemy as sa
Slavek Kabrda 5afad4
import wtforms
Pierre-Yves Chibon 9c2953
Slavek Kabrda 5afad4
try:
Slavek Kabrda 5afad4
    from flask_wtf import FlaskForm
Slavek Kabrda 5afad4
except ImportError:
Slavek Kabrda 5afad4
    from flask_wtf import Form as FlaskForm
Slavek Kabrda 5afad4
from sqlalchemy.orm import relation
Slavek Kabrda 5afad4
from sqlalchemy.orm import backref
Slavek Kabrda 5afad4
Pierre-Yves Chibon 2300bb
from pagure.hooks import BaseHook, BaseRunner
Slavek Kabrda 5afad4
from pagure.lib.model import BASE, Project
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
class PagureNoNewBranchesTable(BASE):
Slavek Kabrda 5afad4
    """ Stores information about the pagure hook deployed on a project.
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
    Table -- hook_pagure_no_new_branches
Slavek Kabrda 5afad4
    """
Slavek Kabrda 5afad4
Pierre-Yves Chibon 9c2953
    __tablename__ = "hook_pagure_no_new_branches"
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
    id = sa.Column(sa.Integer, primary_key=True)
Slavek Kabrda 5afad4
    project_id = sa.Column(
Slavek Kabrda 5afad4
        sa.Integer,
Pierre-Yves Chibon 9c2953
        sa.ForeignKey("projects.id", onupdate="CASCADE", ondelete="CASCADE"),
Slavek Kabrda 5afad4
        nullable=False,
Slavek Kabrda 5afad4
        unique=True,
Pierre-Yves Chibon 9c2953
        index=True,
Pierre-Yves Chibon 9c2953
    )
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
    active = sa.Column(sa.Boolean, nullable=False, default=False)
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
    project = relation(
Pierre-Yves Chibon 9c2953
        "Project",
Pierre-Yves Chibon 9c2953
        remote_side=[Project.id],
Slavek Kabrda 5afad4
        backref=backref(
Pierre-Yves Chibon 9c2953
            "pagure_hook_no_new_branches",
Slavek Kabrda 5afad4
            cascade="delete, delete-orphan",
Pierre-Yves Chibon 9c2953
            single_parent=True,
Pierre-Yves Chibon 9c2953
            uselist=False,
Pierre-Yves Chibon 9c2953
        ),
Slavek Kabrda 5afad4
    )
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
Pierre-Yves Chibon 2300bb
class PagureNoNewBranchRunner(BaseRunner):
Pierre-Yves Chibon 2300bb
    """ Runner for the hook blocking new branches from being created. """
Pierre-Yves Chibon 2300bb
Pierre-Yves Chibon 2300bb
    @staticmethod
Pierre-Yves Chibon 2300bb
    def pre_receive(session, username, project, repotype, repodir, changes):
Pierre-Yves Chibon 2300bb
        """ Run the pre-receive tasks of a hook.
Pierre-Yves Chibon 2300bb
Pierre-Yves Chibon 2300bb
        For args, see BaseRunner.runhook.
Pierre-Yves Chibon 2300bb
        """
Pierre-Yves Chibon 2300bb
Slavek Kabrda c9ac74
        if repotype != "main":
Slavek Kabrda c9ac74
            print("The no new branches hook only runs on the main git repo.")
Slavek Kabrda c9ac74
            return
Slavek Kabrda c9ac74
Pierre-Yves Chibon 2300bb
        for refname in changes:
Lubomír Sedlář 73f7f5
            if refname.startswith("refs/tags/"):
Lubomír Sedlář 73f7f5
                # Allow creating new tags
Lubomír Sedlář 73f7f5
                continue
Lubomír Sedlář 73f7f5
Pierre-Yves Chibon 2300bb
            (oldrev, newrev) = changes[refname]
Pierre-Yves Chibon 2300bb
Pierre-Yves Chibon 2300bb
            if set(oldrev) == set(["0"]):
Patrick Uiterwijk e3347b
                raise Exception(
Patrick Uiterwijk e3347b
                    "Creating a new reference/branch is not "
Patrick Uiterwijk e3347b
                    "allowed in this project."
Pierre-Yves Chibon 2300bb
                )
Pierre-Yves Chibon 2300bb
Pierre-Yves Chibon 2300bb
Slavek Kabrda 5afad4
class PagureNoNewBranchesForm(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()])
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
Slavek Kabrda 5afad4
class PagureNoNewBranchesHook(BaseHook):
Pierre-Yves Chibon 9c2953
    """ PagureNoNewBranches hook. """
Slavek Kabrda 5afad4
Pierre-Yves Chibon 9c2953
    name = "Prevent creating new branches by git push"
Pierre-Yves Chibon 9c2953
    description = "This hook prevents creating new branches by git push."
Slavek Kabrda 5afad4
    form = PagureNoNewBranchesForm
Slavek Kabrda 5afad4
    db_object = PagureNoNewBranchesTable
Pierre-Yves Chibon 9c2953
    backref = "pagure_hook_no_new_branches"
Pierre-Yves Chibon 9c2953
    form_fields = ["active"]
Pierre-Yves Chibon 9c2953
    hook_type = "pre-receive"
Pierre-Yves Chibon 2300bb
    runner = PagureNoNewBranchRunner