1
import sys, optparse, getpass
2
import SOAPpy, SOAPpy.Types
6
def __init__(self, jira_host, proj, user, passwd):
8
self.soap = SOAPpy.WSDL.Proxy(
9
'%s/rpc/soap/jirasoapservice-v2?wsdl'%jira_host)
10
self.auth = self.soap.login(user, passwd)
13
def list_methods(self):
14
for m in self.soap.methods.keys():
17
def describe_method(self, name):
18
m = self.soap.methods[name]
20
print p.name.ljust(10), p.type
22
def list_versions(self):
23
versions = self.soap.getVersions(self.auth, self.proj)
24
return [v.name for v in versions]
26
def is_version_released(self, name):
27
versions = self.soap.getVersions(self.auth, self.proj)
32
def get_version_id(self, name):
34
Return the id for a named version, returning None if no such version exists.
36
versions = self.soap.getVersions(self.auth, self.proj)
41
def create_version(self, name):
43
Creates a new version with the specified name.
45
self.soap.addVersion(self.auth, self.proj, {'name': name})
47
def get_open_issues(self, ver_name):
49
Returns keys for unresolved/open issues for the specified version name.
51
jql = 'project = %s and status in (Open, "In Progress", Reopened) and fixVersion = "%s"' % (self.proj, ver_name)
52
n = SOAPpy.Types.intType(500)
53
issues = self.soap.getIssuesFromJqlSearch(self.auth, jql, n)
54
return [i.key for i in issues]
56
def set_fixed_version(self, issue, ver_name):
58
Sets the fixVersion for an issue
60
ver_id = self.get_version_id(ver_name)
62
self.soap.updateIssue(self.auth, issue,
63
[{'id': 'fixVersions', 'values': [ver_id]}])
65
def release_version(self, ver_name):
66
self.soap.releaseVersion(self.auth, self.proj,
67
{'name': ver_name, "released": True})
69
if __name__ == "__main__":
71
p = optparse.OptionParser('Usage: %prog [options] version next_version')
72
p.add_option('-j', '--host', dest='host', default='https://osgeo-org.atlassian.net',
73
help='JIRA host, default is atlassian')
74
p.add_option('-k', '--key', dest='key', default='GEOS',
75
help='JIRA project key, default is GEOS')
76
p.add_option('-u', '--user', dest='user', default=getpass.getuser(),
77
help='JIRA user, default is current OS user')
78
p.add_option('-p', '--passwd', dest='passwd',
80
p.add_option('-v', '--verbose', dest='verbose', action='store_true',
83
opts, args = p.parse_args()
85
p.error('Must specify version to release and next version')
88
jira = JIRA(opts['host'], opts['key'], opts['user'], opts['passwd'])
90
verbose = opts['verbose']
94
ver_id = jira.get_version_id(ver)
96
sys.exit('Version %s does not exist in JIRA' % ver)
98
if jira.is_version_released(ver) == True:
99
print 'Version %s is already released in JIRA, exiting' % ver
102
if not jira.get_version_id(next_ver):
104
print 'creating version %s in JIRA' % next_ver
105
jira.create_version(next_ver)
107
if not jira.get_version_id(next_ver):
108
sys.exit('Unable to create version %s in JIRA' % next_ver)
113
issues = jira.get_open_issues(ver)
117
for i in jira.get_open_issues(ver):
119
print 'Setting fix version of %s to %s' % (i, next_ver)
120
jira.set_fixed_version(i, next_ver)
124
if len(jira.get_open_issues(ver)) > 0:
125
sys.exit('Unable to move back all issues to version %s' % next_ver)
128
print 'Releasing %s (%s) in JIRA' % (ver, ver_id)
129
jira.release_version(ver)