]> granicus.if.org Git - icinga2/blobdiff - changelog.py
Fix check_perfmon to support non-localized names
[icinga2] / changelog.py
index f8cd361c2d91b3d41919fb0b7a86ad7d6f8e0d1b..79bdb0c8bf6b59573f7686bf1efdc824aadccd7e 100755 (executable)
@@ -8,6 +8,10 @@ import sys
 import os
 from datetime import datetime
 from collections import defaultdict
+from collections import OrderedDict
+
+#################################
+## Env Config
 
 try:
     github_auth_username = os.environ['ICINGA_GITHUB_AUTH_USERNAME']
@@ -27,10 +31,34 @@ except:
     print "ERROR: Environment variable 'ICINGA_GITHUB_PROJECT' is not set."
     sys.exit(1)
 
+#################################
+## Config
+
 changelog_file = "CHANGELOG.md" # TODO: config param
 debug = 1
 
-ignored_labels = ["high", "low", "bug", "enhancement", "feedback", "question", "backported"]
+# Keep this in sync with GitHub labels.
+ignored_labels = [
+    "high-priority", "low-priority",
+    "bug", "enhancement",
+    "needs-feedback", "question", "duplicate", "invalid", "wontfix",
+    "backported", "build-fix"
+]
+
+# Selectively show and collect specific categories
+#
+# (category, list of case sensitive matching labels)
+# The order is important!
+# Keep this in sync with GitHub labels.
+categories = OrderedDict(
+[
+    ("Enhancement", ["enhancement"]),
+    ("Bug", ["bug", "crash"]),
+    ("ITL", ["ITL"]),
+    ("Documentation", ["Documentation"]),
+    ("Support", ["code-quality", "Tests", "Packages", "Installation"])
+]
+)
 
 #################################
 ## Helpers
@@ -52,8 +80,8 @@ def fetch_github_resources(uri, params = {}):
         resp = requests.get(url, auth=(github_auth_username, github_auth_token), params=params)
         try:
             resp.raise_for_status()
-        except:
-            break
+        except requests.exceptions.HTTPError as e:
+            raise e
 
         data = resp.json()
 
@@ -74,12 +102,17 @@ def fetch_github_resources(uri, params = {}):
     return resources
 
 def issue_type(issue):
-    if "bug" in [label["name"] for label in issue["labels"]]:
-        return "Bug"
-    elif "enhancement" in [label["name"] for label in issue["labels"]]:
-        return "Enhancement"
-    else:
-        return "Support"
+    issue_labels = [label["name"] for label in issue["labels"]]
+
+    # start with the least important first (e.g. "Support", "Documentation", "Bug", "Enhancement" as order)
+    for category in reversed(categories):
+        labels = categories[category]
+
+        for label in labels:
+            if label in issue_labels:
+                return category
+
+    return "Support"
 
 def escape_markdown(text):
     #tmp = text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
@@ -91,6 +124,10 @@ def escape_markdown(text):
 def format_labels(issue):
     labels = filter(lambda label: label not in ignored_labels, [label["name"] for label in issue["labels"]])
 
+    # Mark PRs as custom label
+    if "pull_request" in issue:
+        labels.append("PR")
+
     if len(labels):
         return " (" + ", ".join(labels) + ")"
     else:
@@ -116,12 +153,19 @@ def format_title(title):
 milestones = {}
 issues = defaultdict(lambda: defaultdict(list))
 
-log(1, "Fetching data from GitHub API for " + project_name)
+log(1, "Fetching data from GitHub API for project " + project_name)
+
+try:
+    tickets = fetch_github_resources("/issues", { "state": "all" })
+except requests.exceptions.HTTPError as e:
+    log(1, "ERROR " + str(e.response.status_code) + ": " + e.response.text)
+
+    sys.exit(1)
 
 clfp = open(changelog_file, "w+")
 
 with open('tickets.pickle', 'wb') as fp:
-    pickle.dump(fetch_github_resources("/issues", { "state": "all" }), fp)
+    pickle.dump(tickets, fp)
 
 with open('tickets.pickle', 'rb') as fp:
     cached_issues = pickle.load(fp)
@@ -145,6 +189,7 @@ for issue in cached_issues: #fetch_github_resources("/issues", { "state": "all"
     ms_tickets = issues[ms_title][issue_type(issue)]
     ms_tickets.append(issue)
 
+# TODO: Generic header based on project_name
 write_changelog("# Icinga 2.x CHANGELOG")
 write_changelog("")
 
@@ -153,8 +198,7 @@ for milestone in sorted(milestones.values(), key=lambda ms: (ms["due_on"], ms["t
         continue
 
     if milestone["due_on"] == None:
-        print "Milestone", milestone["title"], "does not have a due date."
-        sys.exit(1)
+        print "Warning: Milestone", milestone["title"], "does not have a due date."
 
     ms_due_on = datetime.strptime(milestone["due_on"], "%Y-%m-%dT%H:%M:%SZ")
 
@@ -167,7 +211,7 @@ for milestone in sorted(milestones.values(), key=lambda ms: (ms["due_on"], ms["t
     if len(ms_description) > 0:
         write_changelog("### Notes\n\n" + ms_description + "\n") # Don't escape anything, we take care on Github for valid Markdown
 
-    for category in ["Enhancement", "Bug", "Support"]:
+    for category, labels in categories.iteritems():
         try:
             ms_issues = issues[milestone["title"]][category]
         except KeyError: