mirror of
https://github.com/Icinga/icingaweb2.git
synced 2025-04-08 17:15:08 +02:00
This behaves the same as in Icinga 2, only the default redmine project is different. There's also an addition for "support" as tracker.
153 lines
4.7 KiB
Python
Executable File
153 lines
4.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# Icinga 2
|
|
# Copyright (C) 2012-2016 Icinga Development Team (https://www.icinga.org/)
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation
|
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
import urllib2, json, sys, string
|
|
from argparse import ArgumentParser
|
|
|
|
DESCRIPTION="update release changes"
|
|
VERSION="1.0.0"
|
|
ISSUE_URL= "https://dev.icinga.org/issues/"
|
|
ISSUE_PROJECT="icingaweb2"
|
|
|
|
arg_parser = ArgumentParser(description= "%s (Version: %s)" % (DESCRIPTION, VERSION))
|
|
arg_parser.add_argument('-V', '--version', required=True, type=str, help="define version to query")
|
|
arg_parser.add_argument('-p', '--project', type=str, help="add urls to issues")
|
|
arg_parser.add_argument('-l', '--links', action='store_true', help="add urls to issues")
|
|
arg_parser.add_argument('-H', '--html', action='store_true', help="print html output (defaults to markdown)")
|
|
|
|
args = arg_parser.parse_args(sys.argv[1:])
|
|
|
|
ftype = "md" if not args.html else "html"
|
|
|
|
def format_header(text, lvl, ftype = ftype):
|
|
if ftype == "html":
|
|
return "<h%s>%s</h%s>" % (lvl, text, lvl)
|
|
if ftype == "md":
|
|
return "#" * lvl + " " + text
|
|
|
|
def format_logentry(log_entry, args = args, issue_url = ISSUE_URL):
|
|
if args.links:
|
|
if args.html:
|
|
return "<li> {0} <a href=\"{3}{1}\">{1}</a>: {2}</li>".format(log_entry[0], log_entry[1], log_entry[2], issue_url)
|
|
else:
|
|
return "* {0} [{1}]({3}{1} \"{0} {1}\"): {2}".format(log_entry[0], log_entry[1], log_entry[2], issue_url)
|
|
else:
|
|
if args.html:
|
|
return "<li>%s %d: %s</li>" % log_entry
|
|
else:
|
|
return "* %s %d: %s" % log_entry
|
|
|
|
def print_category(category, entries):
|
|
if len(entries) > 0:
|
|
print ""
|
|
print format_header(category, 4)
|
|
print ""
|
|
if args.html:
|
|
print "<ul>"
|
|
|
|
for entry in sorted(entries):
|
|
print format_logentry(entry)
|
|
|
|
if args.html:
|
|
print "</ul>"
|
|
print ""
|
|
|
|
|
|
version_name = args.version
|
|
|
|
if args.project:
|
|
ISSUE_PROJECT=args.project
|
|
|
|
rsp = urllib2.urlopen("https://dev.icinga.org/projects/%s/versions.json" % (ISSUE_PROJECT))
|
|
versions_data = json.loads(rsp.read())
|
|
|
|
version_id = None
|
|
|
|
for version in versions_data["versions"]:
|
|
if version["name"] == version_name:
|
|
version_id = version["id"]
|
|
break
|
|
|
|
if version_id == None:
|
|
print "Version '%s' not found." % (version_name)
|
|
sys.exit(1)
|
|
|
|
changes = ""
|
|
|
|
if "custom_fields" in version:
|
|
for field in version["custom_fields"]:
|
|
if field["id"] == 14:
|
|
changes = field["value"]
|
|
break
|
|
|
|
changes = string.join(string.split(changes, "\r\n"), "\n")
|
|
|
|
print format_header("What's New in Version %s" % (version_name), 3)
|
|
print ""
|
|
|
|
if changes:
|
|
print format_header("Changes", 4)
|
|
print ""
|
|
print changes
|
|
print ""
|
|
|
|
offset = 0
|
|
|
|
features = []
|
|
bugfixes = []
|
|
support = []
|
|
|
|
while True:
|
|
# We could filter using &cf_13=1, however this doesn't currently work because the custom field isn't set
|
|
# for some of the older tickets:
|
|
rsp = urllib2.urlopen("https://dev.icinga.org/projects/%s/issues.json?offset=%d&status_id=closed&fixed_version_id=%d" % (ISSUE_PROJECT, offset, version_id))
|
|
issues_data = json.loads(rsp.read())
|
|
issues_count = len(issues_data["issues"])
|
|
offset = offset + issues_count
|
|
|
|
if issues_count == 0:
|
|
break
|
|
|
|
for issue in issues_data["issues"]:
|
|
ignore_issue = False
|
|
|
|
if "custom_fields" in issue:
|
|
for field in issue["custom_fields"]:
|
|
if field["id"] == 13 and "value" in field and field["value"] == "0":
|
|
ignore_issue = True
|
|
break
|
|
|
|
if ignore_issue:
|
|
continue
|
|
|
|
entry = (issue["tracker"]["name"], issue["id"], issue["subject"].strip())
|
|
|
|
if issue["tracker"]["name"] == "Feature":
|
|
features.append(entry)
|
|
elif issue["tracker"]["name"] == "Bug":
|
|
bugfixes.append(entry)
|
|
elif issue["tracker"]["name"] == "Support":
|
|
support.append(entry)
|
|
|
|
print_category("Feature", features)
|
|
print_category("Bugfixes", bugfixes)
|
|
print_category("Support", support)
|
|
|
|
|
|
sys.exit(0)
|