gitzilla/hookscripts.py

197 lines
5.7 KiB
Python

"""
hookscripts - ready to use hook scripts for gitzilla.
These pick up configuration values from the environment.
"""
import os
import sys
import re
import gitzilla.hooks
import logging
import ConfigParser
import bugz
def get_or_default(conf, section, option, default=None):
if conf.has_option(section, option):
return conf.get(section, option)
return None
def bz_auth_from_config(config, sRepo):
sBZUser = None
sBZPasswd = None
if config.has_section(sRepo):
if config.has_option(sRepo, "bugzilla_user") and config.has_option(sRepo, "bugzilla_password"):
sBZUser = config.get(sRepo, "bugzilla_user")
sBZPasswd = config.get(sRepo, "bugzilla_password")
return (sBZUser, sBZPasswd)
def get_bz_data(siteconfig, userconfig):
sRepo = os.getcwd()
bAllowDefaultAuth = False
try:
sBZUrl = siteconfig.get(sRepo, "bugzilla_url")
except:
print "missing/incomplete bugzilla conf"
sys.exit(1)
sUserOption = get_or_default(siteconfig, sRepo, "user_config", "allow")
sUserOption = {"deny": "deny", "force": "force"}.get(sUserOption, "allow")
(sBZUser, sBZPasswd) = bz_auth_from_config(userconfig, sRepo)
# ignore auth from site-config if "force"
if sUserOption == "force":
bAllowDefaultAuth = False
# for 'allow', get the auth from user config but allow fallback
if sUserOption == "allow":
bAllowDefaultAuth = True
# ignore auth from user config is "deny"
if sUserOption == "deny":
(sBZUser, sBZPasswd) = bz_auth_from_config(siteconfig, sRepo)
if None in (sBZUser, sBZPasswd):
raise ValueError("No default Bugzilla auth found. Cannot use user-auth because user_config is set to 'deny'")
return (sBZUrl, sBZUser, sBZPasswd, bAllowDefaultAuth)
def get_logger(siteconfig):
sRepo = os.getcwd()
logger = None
if siteconfig.has_option(sRepo, "logfile"):
logger = logging.getLogger("gitzilla")
logger.addHandler(logging.FileHandler(siteconfig.get(sRepo, "logfile")))
# default to debug, but switch to info if asked.
sLogLevel = get_or_default(siteconfig, sRepo, "loglevel", "debug")
logger.setLevel({"info": logging.INFO}.get(sLogLevel, logging.DEBUG))
return logger
def get_bug_regex(siteconfig):
sRepo = os.getcwd()
oBugRegex = None
if siteconfig.has_option(sRepo, "bug_regex"):
oBugRegex = re.compile(siteconfig.get(sRepo, "bug_regex"),
re.MULTILINE | re.DOTALL | re.IGNORECASE)
return oBugRegex
def make_bz_init(siteconfig, bAllowDefaultAuth):
# return a bz_init function which does the right thing.
def bz_init(sBZUrl, sBZUser, sBZPasswd):
# if username/passwd are none, then modify the Bugz instance so that
# Bugz.get_input and getpass.getpass get the username and passwd
# from the siteconfig.
if sBZUrl is None:
raise ValueError("No Bugzilla URL specified")
sSiteUser = sBZUser
sSitePasswd = sBZPasswd
sRepo = os.getcwd()
if None in (sBZUser, sBZPasswd):
if bAllowDefaultAuth:
# get data from siteconfig
(sSiteUser, sSitePasswd) = bz_auth_from_config(siteconfig, sRepo)
oBZ = bugz.bugzilla.Bugz(sBZUrl, user=sBZUser, password=sBZPasswd)
oBZ.get_input = lambda prompt: sSiteUser
import getpass
getpass.getpass = lambda: sSitePasswd
return oBZ
return bz_init
def post_receive():
"""
The gitzilla-post-receive hook script.
The configuration is picked up from /etc/gitzillarc and ~/.gitzillarc
The user specific configuration is allowed to override the bugzilla
username and password.
"""
siteconfig = ConfigParser.RawConfigParser()
siteconfig.readfp(file("/etc/gitzillarc"))
sRepo = os.getcwd()
if not siteconfig.has_section(sRepo):
print "No %s section found in /etc/gitzillarc" % (sRepo,)
sys.exit(1)
userconfig = ConfigParser.RawConfigParser()
userconfig.read(os.path.expanduser("~/.gitzillarc"))
(sBZUrl, sBZUser, sBZPasswd, bAllowDefaultAuth) = get_bz_data(siteconfig, userconfig)
logger = get_logger(siteconfig)
oBugRegex = get_bug_regex(siteconfig)
sSeparator = get_or_default(siteconfig, sRepo, "separator")
sFormatSpec = get_or_default(siteconfig, sRepo, "formatspec")
sChangeLogCommand = get_or_default(siteconfig, sRepo, "changelogcmd")
bz_init = make_bz_init(siteconfig, bAllowDefaultAuth)
gitzilla.hooks.post_receive(sBZUrl, sBZUser, sBZPasswd, sFormatSpec,
sChangeLogCommand,
oBugRegex, sSeparator, logger, bz_init)
def update():
"""
The gitzilla-update hook script.
The configuration is picked up from /etc/gitzillarc and ~/.gitzillarc
The user specific configuration is allowed to override the bugzilla
username and password.
"""
siteconfig = ConfigParser.RawConfigParser()
siteconfig.readfp(file("/etc/gitzillarc"))
sRepo = os.getcwd()
if not siteconfig.has_section(sRepo):
print "No %s section found in /etc/gitzillarc" % (sRepo,)
sys.exit(1)
logger = get_logger(siteconfig)
oBugRegex = get_bug_regex(siteconfig)
sSeparator = get_or_default(siteconfig, sRepo, "separator")
sFormatSpec = get_or_default(siteconfig, sRepo, "formatspec")
asAllowedStatuses = None
if siteconfig.has_option(sRepo, "allowed_bug_states"):
asAllowedStatuses = map(lambda x: x.strip(),
siteconfig.get(sRepo, "allowed_bug_states").split(","))
# and the bugzilla info.
userconfig = ConfigParser.RawConfigParser()
userconfig.read(os.path.expanduser("~/.gitzillarc"))
(sBZUrl, sBZUser, sBZPasswd, bAllowDefaultAuth) = get_bz_data(siteconfig, userconfig)
bz_init = make_bz_init(siteconfig, bAllowDefaultAuth)
gitzilla.hooks.update(oBugRegex, asAllowedStatuses, sSeparator,
sBZUrl, sBZUser, sBZPasswd, logger, bz_init)