86 lines
2.3 KiB
Python
86 lines
2.3 KiB
Python
|
#! /usr/bin/env python2
|
||
|
|
||
|
|
||
|
"""Pagure specific hook to block non-fastforward pushes.
|
||
|
"""
|
||
|
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
from sqlalchemy.exc import SQLAlchemyError
|
||
|
|
||
|
|
||
|
if 'PAGURE_CONFIG' not in os.environ \
|
||
|
and os.path.exists('/etc/pagure/pagure.cfg'):
|
||
|
os.environ['PAGURE_CONFIG'] = '/etc/pagure/pagure.cfg'
|
||
|
|
||
|
|
||
|
import pagure
|
||
|
import pagure.exceptions
|
||
|
import pagure.lib.link
|
||
|
import pagure.ui.plugins
|
||
|
|
||
|
|
||
|
abspath = os.path.abspath(os.environ['GIT_DIR'])
|
||
|
|
||
|
|
||
|
def run_as_pre_receive_hook():
|
||
|
reponame = pagure.lib.git.get_repo_name(abspath)
|
||
|
namespace = pagure.lib.git.get_repo_namespace(abspath)
|
||
|
username = pagure.lib.git.get_username(abspath)
|
||
|
if pagure.APP.config.get('HOOK_DEBUG', False):
|
||
|
print 'repo: ', reponame
|
||
|
print 'user: ', username
|
||
|
print 'namspaces:', namespace
|
||
|
|
||
|
repo = pagure.lib.get_project(
|
||
|
pagure.SESSION, reponame, user=username, namespace=namespace)
|
||
|
if not repo:
|
||
|
print 'Unknown repo %s of username: %s in namespace %s' % (
|
||
|
reponame, username, namespace)
|
||
|
sys.exit(1)
|
||
|
|
||
|
plugin = pagure.ui.plugins.get_plugin('Block non fast-forward pushes')
|
||
|
dbobj = plugin.db_object()
|
||
|
# Get the list of branches
|
||
|
branches = [
|
||
|
branch.strip()
|
||
|
for branch in repo.pagure_force_commit_hook.branches.split(',')
|
||
|
if repo.pagure_force_commit_hook]
|
||
|
|
||
|
# Remove empty branches
|
||
|
branches = [
|
||
|
branch.strip()
|
||
|
for branch in branches
|
||
|
if branch]
|
||
|
|
||
|
for line in sys.stdin:
|
||
|
if pagure.APP.config.get('HOOK_DEBUG', False):
|
||
|
print line
|
||
|
(oldrev, newrev, refname) = line.strip().split(' ', 2)
|
||
|
|
||
|
refname = refname.replace('refs/heads/', '')
|
||
|
if refname in branches:
|
||
|
if pagure.APP.config.get('HOOK_DEBUG', False):
|
||
|
print ' -- Old rev'
|
||
|
print oldrev
|
||
|
print ' -- New rev'
|
||
|
print newrev
|
||
|
print ' -- Ref name'
|
||
|
print refname
|
||
|
|
||
|
if set(newrev) == set(['0']):
|
||
|
print "Deletion is forbidden"
|
||
|
sys.exit(1)
|
||
|
elif pagure.lib.git.is_forced_push(oldrev, newrev, abspath):
|
||
|
print "Non fast-forward push are forbidden"
|
||
|
sys.exit(1)
|
||
|
|
||
|
|
||
|
def main(args):
|
||
|
run_as_pre_receive_hook()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main(sys.argv[1:])
|