hooks: added new pretx hook to allow mercurial checks such as protected branches, or force push.

This commit is contained in:
Marcin Kuzminski 2017-02-23 16:53:11 +01:00
parent 2ccbac2f22
commit 1f65204749
8 changed files with 3985 additions and 6 deletions

View file

@ -51,7 +51,7 @@ PYRAMID_SETTINGS = {}
EXTENSIONS = {}
__version__ = ('.'.join((str(each) for each in VERSION[:3])))
__dbversion__ = 64 # defines current db version for migrations
__dbversion__ = 65 # defines current db version for migrations
__platform__ = platform.system()
__license__ = 'AGPLv3, and Commercial License'
__author__ = 'RhodeCode GmbH'

View file

@ -315,6 +315,7 @@ class DbManage(object):
(RhodeCodeUi.HOOK_PRE_PULL, 'python:vcsserver.hooks.pre_pull'),
(RhodeCodeUi.HOOK_PULL, 'python:vcsserver.hooks.log_pull_action'),
(RhodeCodeUi.HOOK_PRE_PUSH, 'python:vcsserver.hooks.pre_push'),
(RhodeCodeUi.HOOK_PRETX_PUSH, 'python:vcsserver.hooks.pre_push'),
(RhodeCodeUi.HOOK_PUSH, 'python:vcsserver.hooks.log_push_action'),
]

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,63 @@
import logging
from sqlalchemy import *
from rhodecode.model import meta
from rhodecode.lib.dbmigrate.versions import _reset_base, notify
log = logging.getLogger(__name__)
def get_by_key(cls, key):
return cls.query().filter(cls.ui_key == key).scalar()
def create_or_update_hook(cls, key, val, SESSION):
new_ui = get_by_key(cls, key) or cls()
new_ui.ui_section = 'hooks'
new_ui.ui_active = True
new_ui.ui_key = key
new_ui.ui_value = val
SESSION().add(new_ui)
def upgrade(migrate_engine):
"""
Upgrade operations go here.
Don't create your own engine; bind migrate_engine to your metadata
"""
_reset_base(migrate_engine)
from rhodecode.lib.dbmigrate.schema import db_4_7_0_0 as db
# issue fixups
fixups(db, meta.Session)
def downgrade(migrate_engine):
meta = MetaData()
meta.bind = migrate_engine
def fixups(models, _SESSION):
cleanup_if_present = (
models.RhodeCodeUi.HOOK_PRETX_PUSH,
)
for hook in cleanup_if_present:
ui_cfg = models.RhodeCodeUi.query().filter(
models.RhodeCodeUi.ui_key == hook).scalar()
if ui_cfg is not None:
log.info('Removing RhodeCodeUI for hook "%s".', hook)
_SESSION().delete(ui_cfg)
to_add = [
(models.RhodeCodeUi.HOOK_PRETX_PUSH,
'python:vcsserver.hooks.pre_push'),
]
for hook, value in to_add:
log.info('Adding RhodeCodeUI for hook "%s".', hook)
create_or_update_hook(models.RhodeCodeUi, hook, value, _SESSION)
_SESSION().commit()

View file

@ -411,6 +411,7 @@ def config_data_from_db(clear_session=True, repo=None):
skip_entries.append(('hooks', RhodeCodeUi.HOOK_PRE_PULL))
if 'push' not in enabled_hook_classes:
skip_entries.append(('hooks', RhodeCodeUi.HOOK_PRE_PUSH))
skip_entries.append(('hooks', RhodeCodeUi.HOOK_PRETX_PUSH))
config = [entry for entry in config if entry[:2] not in skip_entries]

View file

@ -350,6 +350,7 @@ class RhodeCodeUi(Base, BaseModel):
HOOK_PRE_PULL = 'preoutgoing.pre_pull'
HOOK_PULL = 'outgoing.pull_logger'
HOOK_PRE_PUSH = 'prechangegroup.pre_push'
HOOK_PRETX_PUSH = 'pretxnchangegroup.pre_push'
HOOK_PUSH = 'changegroup.push_logger'
# TODO: johbo: Unify way how hooks are configured for git and hg,

View file

@ -50,8 +50,8 @@ class SettingNotFound(Exception):
class SettingsModel(BaseModel):
BUILTIN_HOOKS = (
RhodeCodeUi.HOOK_REPO_SIZE, RhodeCodeUi.HOOK_PUSH,
RhodeCodeUi.HOOK_PRE_PUSH, RhodeCodeUi.HOOK_PULL,
RhodeCodeUi.HOOK_PRE_PULL)
RhodeCodeUi.HOOK_PRE_PUSH, RhodeCodeUi.HOOK_PRETX_PUSH,
RhodeCodeUi.HOOK_PULL, RhodeCodeUi.HOOK_PRE_PULL)
HOOKS_SECTION = 'hooks'
def __init__(self, sa=None, repo=None):

View file

@ -81,23 +81,27 @@ def disable_hooks(request, hooks):
HOOK_PRE_PUSH = db.RhodeCodeUi.HOOK_PRE_PUSH
HOOK_PRETX_PUSH = db.RhodeCodeUi.HOOK_PRETX_PUSH
HOOK_PUSH = db.RhodeCodeUi.HOOK_PUSH
HOOK_PRE_PULL = db.RhodeCodeUi.HOOK_PRE_PULL
HOOK_PULL = db.RhodeCodeUi.HOOK_PULL
HOOK_REPO_SIZE = db.RhodeCodeUi.HOOK_REPO_SIZE
HG_HOOKS = frozenset(
(HOOK_PRE_PULL, HOOK_PULL, HOOK_PRE_PUSH, HOOK_PUSH, HOOK_REPO_SIZE))
(HOOK_PRE_PULL, HOOK_PULL, HOOK_PRE_PUSH, HOOK_PRETX_PUSH, HOOK_PUSH,
HOOK_REPO_SIZE))
@pytest.mark.parametrize('disabled_hooks,expected_hooks', [
([], HG_HOOKS),
([HOOK_PRE_PUSH, HOOK_REPO_SIZE], [HOOK_PRE_PULL, HOOK_PULL, HOOK_PUSH]),
(HG_HOOKS, []),
([HOOK_PRE_PUSH, HOOK_PRETX_PUSH, HOOK_REPO_SIZE], [HOOK_PRE_PULL, HOOK_PULL, HOOK_PUSH]),
# When a pull/push hook is disabled, its pre-pull/push counterpart should
# be disabled too.
([HOOK_PUSH], [HOOK_PRE_PULL, HOOK_PULL, HOOK_REPO_SIZE]),
([HOOK_PULL], [HOOK_PRE_PUSH, HOOK_PUSH, HOOK_REPO_SIZE]),
([HOOK_PULL], [HOOK_PRE_PUSH, HOOK_PRETX_PUSH, HOOK_PUSH, HOOK_REPO_SIZE]),
])
def test_make_db_config_hg_hooks(pylonsapp, request, disabled_hooks,
expected_hooks):