pagure/pagure/hooks/pagure_hook.py

138 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
"""
(c) 2014 - Copyright Red Hat Inc
Authors:
Pierre-Yves Chibon <pingou@pingoured.fr>
"""
import os
import sqlalchemy as sa
import pygit2
import wtforms
from flask.ext import wtf
from sqlalchemy.orm import relation
from sqlalchemy.orm import backref
from pagure.hooks import BaseHook
from pagure.lib.model import BASE, Project
from pagure import APP, get_repo_path
class PagureTable(BASE):
""" Stores information about the pagure hook deployed on a project.
Table -- hook_pagure
"""
__tablename__ = 'hook_pagure'
id = sa.Column(sa.Integer, primary_key=True)
project_id = sa.Column(
sa.Integer,
sa.ForeignKey(
'projects.id', onupdate='CASCADE', ondelete='CASCADE'),
nullable=False,
unique=True,
index=True)
active = sa.Column(sa.Boolean, nullable=False, default=False)
project = relation(
'Project', remote_side=[Project.id],
backref=backref(
'pagure_hook', cascade="delete, delete-orphan",
single_parent=True)
)
class PagureForm(wtf.Form):
''' Form to configure the pagure hook. '''
active = wtforms.BooleanField(
'Active',
[wtforms.validators.Optional()]
)
DESCRIPTION = '''
Pagure specific hook to add a comment to issues or pull requests if the pushed
commits fix them
or relate to them. This is determined based on the commit message.
To reference an issue/PR you need to use one of recognized keywords followed by
a reference to the issue or PR, separated by whitespace and and optional colon.
Such references can be either:
* The issue/PR number preceded by the `#` symbol
* The full URL of the issue or PR
If using the full URL, it is possible to reference issues in other projects.
The recognized keywords are:
* fix/fixed/fixes
* relate/related/relates
* merge/merges/merged
Examples:
* Fixes #21
* related: https://pagure.io/myproject/issue/32
* this commit merges #74
* Merged: https://pagure.io/myproject/pull-request/74
Capitalization does not matter; neither does the colon between keyword and
number.
'''
class PagureHook(BaseHook):
''' Pagure hook. '''
name = 'Pagure'
description = DESCRIPTION
form = PagureForm
db_object = PagureTable
backref = 'pagure_hook'
form_fields = ['active']
@classmethod
def install(cls, project, dbobj):
''' Method called to install the hook for a project.
:arg project: a ``pagure.model.Project`` object to which the hook
should be installed
'''
repopaths = [get_repo_path(project)]
for folder in [
APP.config.get('DOCS_FOLDER'),
APP.config.get('REQUESTS_FOLDER')]:
repopaths.append(
os.path.join(folder, project.path)
)
cls.base_install(repopaths, dbobj, 'pagure', 'pagure_hook.py')
@classmethod
def remove(cls, project):
''' Method called to remove the hook of a project.
:arg project: a ``pagure.model.Project`` object to which the hook
should be installed
'''
repopaths = [get_repo_path(project)]
for folder in [
APP.config.get('DOCS_FOLDER'),
APP.config.get('REQUESTS_FOLDER')]:
repopaths.append(
os.path.join(folder, project.path)
)
cls.base_remove(repopaths, 'pagure')