forked from gera/gitzilla
-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.py
140 lines (105 loc) · 3.5 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
"""
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, bIncludeDiffStat, sRefName, sRefPrefix):
"""
returns an array of chronological changes, between sOldRev and sNewRev,
according to the format spec sFormatSpec.
Gets changes which are only on the specified ref, excluding changes
also present on other refs starting with sRefPrefix.
"""
if sOldRev == sNoCommitRev:
sCommitRange = sNewRev
elif sNewRev == sNoCommitRev:
sCommitRange = sOldRev
else:
sCommitRange = "%s..%s" % (sOldRev, sNewRev)
sFormatSpec = sFormatSpec.strip("\n").replace("\n", "%n")
if bIncludeDiffStat:
sCommand = "whatchanged"
else:
sCommand = "log"
asCommand = ['git', sCommand,
"--format=format:%s%s" % (sSeparator, sFormatSpec)]
# exclude all changes which are also found on other refs
# and hence have already been processed.
if sRefName is not None:
asAllRefs = execute(
['git', 'for-each-ref', '--format=%(refname)', sRefPrefix],
bSplitLines=True)
asAllRefs = map(lambda x: x.strip(), asAllRefs)
asOtherRefs = filter(lambda x: x != sRefName, asAllRefs)
asNotOtherRefs = execute(
['git', 'rev-parse', '--not'] + asOtherRefs,
bSplitLines=True)
asNotOtherRefs = map(lambda x: x.strip(), asNotOtherRefs)
asCommand += asNotOtherRefs
asCommand.append(sCommitRange)
sChangeLog = execute(asCommand)
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)