Skip to content
Snippets Groups Projects
Commit 2854ab80 authored by Pier Angelo Vendrame's avatar Pier Angelo Vendrame :jack_o_lantern: Committed by richard
Browse files

Bug 41042: Add options to include updates in the changelog scripts.

Pass the new version of components as arguments to avoid having to
change the changelog output after it has been generated by the script.
parent ce0b2ec7
Branches
Tags
1 merge request!867Bug 41042: Add options to include updates in the changelog scripts.
#!/usr/bin/env python3
import argparse
from datetime import datetime
import enum
from pathlib import Path
......@@ -23,6 +24,11 @@ project_order = {
}
class EntryType(enum.IntFlag):
UPDATE = 0
ISSUE = 1
class Platform(enum.IntFlag):
WINDOWS = 8
MACOS = 4
......@@ -32,40 +38,12 @@ class Platform(enum.IntFlag):
ALL_PLATFORMS = 8 | 4 | 2 | 1
class Issue:
def __init__(self, j):
self.title = j["title"]
self.project, self.number = (
j["references"]["full"].rsplit("/", 2)[-1].split("#")
)
self.number = int(self.number)
self.platform = 0
self.num_platforms = 0
if "Desktop" in j["labels"]:
self.platform = Platform.DESKTOP
self.num_platforms += 3
else:
if "Windows" in j["labels"]:
self.platform |= Platform.WINDOWS
self.num_platforms += 1
if "MacOS" in j["labels"]:
self.platform |= Platform.MACOS
self.num_platforms += 1
if "Linux" in j["labels"]:
self.platform |= Platform.LINUX
self.num_platforms += 1
if "Android" in j["labels"]:
if is_mb and self.num_platforms == 0:
raise Exception(
f"Android-only issue on Mullvad Browser: {j['references']['full']}!"
)
elif not is_mb:
self.platform |= Platform.ANDROID
self.num_platforms += 1
if not self.platform or (is_mb and self.platform == Platform.DESKTOP):
self.platform = Platform.ALL_PLATFORMS
self.num_platforms = 4
self.is_build = "Build System" in j["labels"]
class ChangelogEntry:
def __init__(self, type_, platform, num_platforms, is_build):
self.type = type_
self.platform = platform
self.num_platforms = num_platforms
self.is_build = is_build
def get_platforms(self):
if self.platform == Platform.ALL_PLATFORMS:
......@@ -81,15 +59,78 @@ class Issue:
platforms.append("Android")
return " + ".join(platforms)
def __str__(self):
return f"Bug {self.number}: {self.title} [{self.project}]"
def __lt__(self, other):
if self.type != other.type:
return self.type < other.type
if self.type == EntryType.UPDATE:
# Rely on sorting being stable on Python
return False
if self.project == other.project:
return self.number < other.number
return project_order[self.project] < project_order[other.project]
class UpdateEntry(ChangelogEntry):
def __init__(self, name, version):
if name == "Firefox" and not is_mb:
platform = Platform.DESKTOP
num_platforms = 3
elif name == "GeckoView":
platform = Platform.ANDROID
num_platforms = 3
else:
platform = Platform.ALL_PLATFORMS
num_platforms = 4
super().__init__(
EntryType.UPDATE, platform, num_platforms, name == "Go"
)
self.name = name
self.version = version
def __str__(self):
return f"Updated {self.name} to {self.version}"
class Issue(ChangelogEntry):
def __init__(self, j):
self.title = j["title"]
self.project, self.number = (
j["references"]["full"].rsplit("/", 2)[-1].split("#")
)
self.number = int(self.number)
platform = 0
num_platforms = 0
if "Desktop" in j["labels"]:
platform = Platform.DESKTOP
num_platforms += 3
else:
if "Windows" in j["labels"]:
platform |= Platform.WINDOWS
num_platforms += 1
if "MacOS" in j["labels"]:
platform |= Platform.MACOS
num_platforms += 1
if "Linux" in j["labels"]:
platform |= Platform.LINUX
num_platforms += 1
if "Android" in j["labels"]:
if is_mb and num_platforms == 0:
raise Exception(
f"Android-only issue on Mullvad Browser: {j['references']['full']}!"
)
elif not is_mb:
platform |= Platform.ANDROID
num_platforms += 1
if not platform or (is_mb and platform == Platform.DESKTOP):
platform = Platform.ALL_PLATFORMS
num_platforms = 4
is_build = "Build System" in j["labels"]
super().__init__(EntryType.ISSUE, platform, num_platforms, is_build)
def __str__(self):
return f"Bug {self.number}: {self.title} [{self.project}]"
def sorted_issues(issues):
issues = [sorted(v) for v in issues.values()]
return sorted(
......@@ -99,8 +140,20 @@ def sorted_issues(issues):
)
if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} version-to-release or #issue-id")
parser = argparse.ArgumentParser()
parser.add_argument("issue_version")
parser.add_argument("--date", help="The date of the release")
parser.add_argument("--firefox", help="New Firefox version (if we rebased)")
parser.add_argument("--tor", help="New Tor version (if updated)")
parser.add_argument("--no-script", help="New NoScript version (if updated)")
parser.add_argument("--openssl", help="New OpenSSL version (if updated)")
parser.add_argument("--ublock", help="New uBlock version (if updated)")
parser.add_argument("--zlib", help="New zlib version (if updated)")
parser.add_argument("--go", help="New Go version (if updated)")
args = parser.parse_args()
if not args.issue_version:
parser.print_help()
sys.exit(1)
token_file = Path(__file__).parent / ".changelogs_token"
......@@ -121,7 +174,7 @@ with token_file.open() as f:
token = f.read().strip()
headers = {"PRIVATE-TOKEN": token}
version = sys.argv[1]
version = args.issue_version
r = requests.get(
f"{API_URL}/projects/{PROJECT_ID}/issues?labels=Release Prep",
headers=headers,
......@@ -132,7 +185,7 @@ if r.status_code == 401:
issue = None
issues = []
for i in r.json():
if i["title"].find(sys.argv[1]) != -1:
if i["title"].find(version) != -1:
issues.append(i)
if len(issues) == 1:
issue = issues[0]
......@@ -172,20 +225,44 @@ iid = issue["iid"]
linked = {}
linked_build = {}
def add_entry(entry):
target = linked_build if entry.is_build else linked
if entry.platform not in target:
target[entry.platform] = []
target[entry.platform].append(entry)
if args.firefox:
add_entry(UpdateEntry("Firefox", args.firefox))
if not is_mb:
add_entry(UpdateEntry("GeckoView", args.firefox))
if args.tor and not is_mb:
add_entry(UpdateEntry("Tor", args.tor))
if args.no_script:
add_entry(UpdateEntry("NoScript", args.no_script))
if not is_mb:
if args.openssl:
add_entry(UpdateEntry("OpenSSL", args.openssl))
if args.zlib:
add_entry(UpdateEntry("zlib", args.zlib))
if args.go:
add_entry(UpdateEntry("Go", args.go))
elif args.ublock:
add_entry(UpdateEntry("uBlock Origin", args.ublock))
r = requests.get(
f"{API_URL}/projects/{PROJECT_ID}/issues/{iid}/links", headers=headers
)
for i in r.json():
i = Issue(i)
target = linked_build if i.is_build else linked
if i.platform not in target:
target[i.platform] = []
target[i.platform].append(i)
add_entry(Issue(i))
linked = sorted_issues(linked)
linked_build = sorted_issues(linked_build)
name = "Mullvad" if is_mb else "Tor"
date = datetime.now().strftime("%B %d %Y")
date = args.date if args.date else datetime.now().strftime("%B %d %Y")
print(f"{name} Browser {version} - {date}")
for issues in linked:
print(f" * {issues[0].get_platforms()}")
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment