115 lines
2.7 KiB
Python
115 lines
2.7 KiB
Python
|
|
"""
|
|
utils module for gitzilla
|
|
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
import bugz.bugzilla
|
|
|
|
|
|
sNoCommitRev = "0000000000000000000000000000000000000000"
|
|
|
|
def execute(asCommand, bSplitLines=False, bIgnoreErrors=False):
|
|
"""
|
|
Utility function to execute a command and return the output.
|
|
"""
|
|
p = subprocess.Popen(asCommand,
|
|
stdin=subprocess.PIPE,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.STDOUT,
|
|
shell=False,
|
|
close_fds=True,
|
|
universal_newlines=True,
|
|
env=None)
|
|
if bSplitLines:
|
|
data = p.stdout.readlines()
|
|
else:
|
|
data = p.stdout.read()
|
|
iRetCode = p.wait()
|
|
if iRetCode and not bIgnoreErrors:
|
|
print >>sys.stderr, 'Failed to execute command: %s\n%s' % (asCommand, data)
|
|
sys.exit(-1)
|
|
|
|
return data
|
|
|
|
|
|
def init_bugzilla(sBZUrl, sBZUser, sBZPasswd):
|
|
"""
|
|
initializes and returns a bugz.bugzilla.Bugz instance.
|
|
|
|
This may be overridden in custom hook scripts in order to expand auth
|
|
support.
|
|
"""
|
|
if sBZUrl is None:
|
|
raise ValueError("No Bugzilla URL specified")
|
|
|
|
oBZ = bugz.bugzilla.Bugz(sBZUrl, user=sBZUser, password=sBZPasswd)
|
|
return oBZ
|
|
|
|
|
|
|
|
def get_changes(sOldRev, sNewRev, sFormatSpec, sSeparator, sChangeLogCommand):
|
|
"""
|
|
returns an array of chronological changes, between sOldRev and sNewRev,
|
|
according to the format spec sFormatSpec.
|
|
"""
|
|
if sOldRev == sNoCommitRev:
|
|
sCommitRange = sNewRev
|
|
elif sNewRev == sNoCommitRev:
|
|
sCommitRange = sOldRev
|
|
else:
|
|
sCommitRange = "%s..%s" % (sOldRev, sNewRev)
|
|
|
|
sChangeLog = execute(["git", "%s" % (sChangeLogCommand),
|
|
"--format=format:%s%s" % (sSeparator, sFormatSpec),
|
|
sCommitRange])
|
|
asChangeLogs = sChangeLog.split(sSeparator)
|
|
asChangeLogs.reverse()
|
|
|
|
return asChangeLogs[:-1]
|
|
|
|
|
|
|
|
def post_to_bugzilla(iBugId, sComment, sBZUrl, sBZUser, sBZPasswd):
|
|
"""
|
|
posts the comment to the given bug id.
|
|
"""
|
|
if sBZUrl is None:
|
|
raise ValueError("No Bugzilla URL specified")
|
|
|
|
oBZ = bugz.bugzilla.Bugz(sBZUrl, user=sBZUser, password=sBZPasswd)
|
|
oBZ.modify(iBugId, comment=sComment)
|
|
|
|
|
|
|
|
def get_bug_status(oBugz, iBugId):
|
|
"""
|
|
given the bugz.bugzilla.Bugz instance and the bug id, returns the bug
|
|
status.
|
|
"""
|
|
oBug = oBugz.get(iBugId)
|
|
if oBug is None:
|
|
return None
|
|
return oBug.getroot().find("bug/bug_status").text
|
|
|
|
|
|
def notify_and_exit(sMsg):
|
|
"""
|
|
notifies the error and exits.
|
|
"""
|
|
print """
|
|
|
|
======================================================================
|
|
Cannot accept commit.
|
|
|
|
%s
|
|
|
|
======================================================================
|
|
|
|
""" % (sMsg,)
|
|
sys.exit(1)
|
|
|