richard pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits: 2854ab80 by Pier Angelo Vendrame at 2023-12-14T13:48:08+00:00 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.
- - - - - ae04fe1d by Pier Angelo Vendrame at 2023-12-14T13:48:08+00:00 Update the GitLab templates.
Update the release preparations for the new changelog script arguments and also to fix some steps that were not correct anymore.
- - - - -
7 changed files:
- .gitlab/issue_templates/Release Prep - Mullvad Browser Alpha.md - .gitlab/issue_templates/Release Prep - Mullvad Browser Stable.md - .gitlab/issue_templates/Release Prep - Tor Browser Alpha.md - .gitlab/issue_templates/Release Prep - Tor Browser Stable.md - .gitlab/merge_request_templates/default.md - + .gitlab/merge_request_templates/relprep.md - tools/fetch-changelogs.py
Changes:
===================================== .gitlab/issue_templates/Release Prep - Mullvad Browser Alpha.md ===================================== @@ -62,26 +62,20 @@ - [ ] ***(Optional)*** If new version available, update `mullvad-extension` section of `input_files` in `projects/browser/config` - [ ] `URL` - [ ] `sha256sum` - - [ ] Update `ChangeLog-MB.txt` - - [ ] Ensure ChangeLog-MB.txt is sync'd between alpha and stable branches - - [ ] Check the linked issues: ask people to check if any are missing, remove the not fixed ones - - [ ] Run `tools/fetch-changelogs.py $(TOR_BROWSER_VERSION)` or `tools/fetch-changelogs.py '#$(ISSUE_NUMBER)'` - - Make sure you have `requests` installed (e.g., `apt install python3-requests`) - - The first time you run this script you will need to generate an access token; the script will guide you - - [ ] Copy the output of the script to the beginning of `ChangeLog-MB.txt` and update its output - - [ ] Version - - [ ] Browser Name - - [ ] Release Date - - [ ] Under `All Platforms` include any version updates for: - - NoScript - - uBlock-origin - - Mullvad Browser Extension - - Firefox - - [ ] Open MR with above changes - - [ ] Build the MR after initial review on at least two of: - - [ ] Tor Project build machine - - [ ] Mullvad build machine - - [ ] Local developer machine + - [ ] Update `ChangeLog-MB.txt` + - [ ] Ensure `ChangeLog-MB.txt` is sync'd between alpha and stable branches + - [ ] Check the linked issues: ask people to check if any are missing, remove the not fixed ones + - [ ] Run `tools/fetch-changelogs.py $(ISSUE_NUMBER) --date $date $updateArgs` + - Make sure you have `requests` installed (e.g., `apt install python3-requests`) + - The first time you run this script you will need to generate an access token; the script will guide you + - `$updateArgs` should be these arguments, depending on what you actually updated: + - [ ] `--firefox` + - [ ] `--no-script` + - [ ] `--ublock` + - E.g., `tools/fetch-changelogs.py 41029 --date 'December 19 2023' --firefox 115.6.0esr --no-script 11.4.29 --ublock 1.54.0` + - `--date $date` is optional, if omitted it will be the date on which you run the command + - [ ] Copy the output of the script to the beginning of `ChangeLog-MB.txt` and adjust its output + - [ ] Open MR with above changes, using the template for release preparations - [ ] Ensure builders have matching builds - [ ] Merge - [ ] Sign+Tag @@ -92,32 +86,11 @@ - pierov - richard - [ ] Run: `make mullvadbrowser-signtag-alpha` - - [ ] Push tag to `origin` - -</details> - -<details> - <summary>QA</summary> - - ### send the build - - [ ] Email Mullvad QA: support@mullvad.net, rui@mullvad.net - <details> - <summary>email template</summary> - - Subject: - New build: Mullvad Browser $(MULLVAD_BROWSER_VERION) (unsigned) - - Body: - unsigned builds: https://tb-build-05.torproject.org/~$(BUILDER)/builds/mullvadbrowser/alpha/u...) - - changelog: - ... - - </details> - - - ***(Optional)*** Add additional information: - - [ ] Note any new functionality which needs testing - - [ ] Link to any known issues + - [ ] Push tag to `upstream` + - [ ] Build the tag on at least two of: + - [ ] Tor Project build machine + - [ ] Mullvad build machine + - [ ] Local developer machine
</details>
===================================== .gitlab/issue_templates/Release Prep - Mullvad Browser Stable.md ===================================== @@ -60,7 +60,20 @@ Mullvad Browser Stable lives in the various `maint-$(MULLVAD_BROWSER_MAJOR).$(MU - [ ] ***(Optional)*** If new version available, update `mullvad-extension` section of `input_files` in `projects/browser/config` - [ ] `URL` - [ ] `sha256sum` -- [ ] Open MR with above changes +- [ ] Update `ChangeLog-MB.txt` + - [ ] Ensure `ChangeLog-MB.txt` is sync'd between alpha and stable branches + - [ ] Check the linked issues: ask people to check if any are missing, remove the not fixed ones + - [ ] Run `tools/fetch-changelogs.py $(ISSUE_NUMBER) --date $date $updateArgs` + - Make sure you have `requests` installed (e.g., `apt install python3-requests`) + - The first time you run this script you will need to generate an access token; the script will guide you + - `$updateArgs` should be these arguments, depending on what you actually updated: + - [ ] `--firefox` + - [ ] `--no-script` + - [ ] `--ublock` + - E.g., `tools/fetch-changelogs.py 41029 --date 'December 19 2023' --firefox 115.6.0esr --no-script 11.4.29 --ublock 1.54.0` + - `--date $date` is optional, if omitted it will be the date on which you run the command + - [ ] Copy the output of the script to the beginning of `ChangeLog-MB.txt` and adjust its output +- [ ] Open MR with above changes, using the template for release preparations - [ ] Merge - [ ] Sign/Tag commit: `make mullvadbrowser-signtag-release` - [ ] Push tag to `origin` @@ -70,32 +83,6 @@ Mullvad Browser Stable lives in the various `maint-$(MULLVAD_BROWSER_MAJOR).$(MU
</details>
-<details> - <summary>QA</summary> - -### send the build - - - [ ] Email Mullvad QA: support@mullvad.net, rui@mullvad.net - <details> - <summary>email template</summary> - - Subject: - New build: Mullvad Browser $(MULLVAD_BROWSER_VERION) (unsigned) - - Body: - unsigned builds: https://tb-build-05.torproject.org/~$(BUILDER)/builds/mullvadbrowser/release...) - - changelog: - ... - - </details> - - - ***(Optional)*** Add additional information: - - [ ] Note any new functionality which needs testing - - [ ] Link to any known issues - -</details> - <details> <summary>Signing</summary>
@@ -192,4 +179,4 @@ Mullvad Browser Stable lives in the various `maint-$(MULLVAD_BROWSER_MAJOR).$(MU
</details>
-/label ~"Release Prep" +/label ~"Release Prep" ~"Sponsor 131"
===================================== .gitlab/issue_templates/Release Prep - Tor Browser Alpha.md ===================================== @@ -93,30 +93,22 @@ - [ ] Change the `version` to `$PIPELINEID` - [ ] Update `sha256sum` in the `input_files` section - [ ] Update `ChangeLog-TBB.txt` - - [ ] Ensure ChangeLog-TBB.txt is sync'd between alpha and stable branches + - [ ] Ensure `ChangeLog-TBB.txt` is sync'd between alpha and stable branches - [ ] Check the linked issues: ask people to check if any are missing, remove the not fixed ones - - [ ] Run `tools/fetch-changelogs.py $(TOR_BROWSER_VERSION)` or `tools/fetch-changelogs.py '#$(ISSUE_NUMBER)'` + - [ ] Run `tools/fetch-changelogs.py $(ISSUE_NUMBER) --date $date $updateArgs` - Make sure you have `requests` installed (e.g., `apt install python3-requests`) - The first time you run this script you will need to generate an access token; the script will guide you - - [ ] Copy the output of the script to the beginning of `ChangeLog-TBB.txt` and update its output - - [ ] Version - - [ ] Browser Name - - [ ] Release Date - - [ ] Under `All Platforms` include any version updates for: - - NoScript - - tor - - OpenSSL - - lyrebird - - Snowflake - - [ ] Under `Windows + macOS + Linux` include any version updates for: - - Firefox - - [ ] Under `Android` include any version updates for: - - Geckoview - - [ ] Under `Windows + Android` include any version updates for: - - zlib - - [ ] Under `Build System/All Platforms` include any version updates for: - - Go - - [ ] Open MR with above changes + - `$updateArgs` should be these arguments, depending on what you actually updated: + - [ ] `--firefox` (be sure to include esr at the end if needed, which is usually the case) + - [ ] `--tor` + - [ ] `--no-script` + - [ ] `--openssl` + - [ ] `--zlib` + - [ ] `--go` + - E.g., `tools/fetch-changelogs.py 41028 --date 'December 19 2023' --firefox 115.6.0esr --tor 0.4.8.10 --no-script 11.4.29 --zlib 1.3 --go 1.21.5 --openssl 3.0.12` + - `--date $date` is optional, if omitted it will be the date on which you run the command + - [ ] Copy the output of the script to the beginning of `ChangeLog-TBB.txt` and adjust its output + - [ ] Open MR with above changes, using the template for release preparations - [ ] Build the MR after initial review on at least two of: - [ ] Tor Project build machine - [ ] Mullvad build machine
===================================== .gitlab/issue_templates/Release Prep - Tor Browser Stable.md ===================================== @@ -45,10 +45,11 @@ Tor Browser Stable lives in the various `maint-$(TOR_BROWSER_MAJOR).$(TOR_BROWSE - [ ] ***(Optional)*** `var/firefox_platform_version` : update to latest `$(ESR_VERSION)` if rebased - [ ] Update `projects/translation/config`: - [ ] run `make list_translation_updates-release` to get updated hashes - - [ ] `steps/base-browser/git_hash` : update with `HEAD` commit of project's `base-browser` branch - - [ ] `steps/base-browser-fluent/git_hash` : update with `HEAD` commit of project's `basebrowser-newidentityftl` branch - - [ ] `steps/tor-browser/git_hash` : update with `HEAD` commit of project's `tor-browser` branch - - [ ] `steps/fenix/git_hash` : update with `HEAD` commit of project's `fenix-torbrowserstringsxml` branch + - [ ] Update `projects/translation/config`: + - [ ] run `make list_translation_updates-alpha` to get updated hashes + - [ ] `steps/base-browser/git_hash` : update with `HEAD` commit of project's `base-browser` branch + - [ ] `steps/tor-browser/git_hash` : update with `HEAD` commit of project's `tor-browser` branch + - [ ] `steps/fenix/git_hash` : update with `HEAD` commit of project's `fenix-torbrowserstringsxml` branch - [ ] Update Android-specific build configs - [ ] Update `projects/geckoview/config` - [ ] `browser_build` : update to match `tor-browser` tag @@ -58,10 +59,9 @@ Tor Browser Stable lives in the various `maint-$(TOR_BROWSER_MAJOR).$(TOR_BROWSE - [ ] ***(Optional)*** Update `projects/application-services/config`: **NOTE** we don't currently have any of our own patches for this project - [ ] `git_hash` : update to appropriate git commit associated with `$(ESR_VERSION)` - - [ ] ***(Optional)*** Update `projects/android-components/config`: - - [ ] `android_components_build` : update to match stable android-components tag - - [ ] ***(Optional)*** Update `projects/fenix/config` - - [ ] `fenix_build` : update to match fenix tag + - [ ] ***(Optional)*** Update `projects/firefox-android/config`: + - [ ] `fenix_version` : update to match alpha `firefox-android` build tag + - [ ] `browser_branch` : update to match alpha `firefox-android` build tag - [ ] Update allowed_addons.json by running (from `tor-browser-build` root): - `./tools/fetch_allowed_addons.py > projects/browser/allowed_addons.json` - [ ] Update common build configs @@ -79,43 +79,39 @@ Tor Browser Stable lives in the various `maint-$(TOR_BROWSER_MAJOR).$(TOR_BROWSE - [ ] Check for tor updates here : https://gitlab.torproject.org/tpo/core/tor/-/tags - [ ] ***(Optional)*** Update `projects/tor/config` - [ ] `version` : update to latest non `-alpha` tag (ping dgoulet or ahf if unsure) - - [ ] Check for go updates here : https://golang.org/dl + - [ ] Check for go updates here : https://go.dev/dl - **NOTE** : Tor Browser Stable uses the latest of the *previous* Stable major series go version (apart from the transition phase from Tor Browser Alpha to Stable, in which case Tor Browser Stable may use the latest major series go version) - [ ] ***(Optional)*** Update `projects/go/config` - [ ] `version` : update go version - [ ] `input_files/sha256sum` for `go` : update sha256sum of archive (sha256 sums are displayed on the go download page) - - [ ] Check for manual updates by running (from `tor-browser-build` root): `./tools/fetch-manual.py` - - [ ] ***(Optional)*** If new version is available: - - [ ] Upload the downloaded `manual_$PIPELINEID.zip` file to `tb-build-02.torproject.org` - - [ ] Deploy to `tb-builder`'s `public_html` directory: - - `sudo -u tb-builder cp manual_$PIPELINEID.zip ~/../tb-builder/public_html/.` - - [ ] Update `projects/manual/config`: - - [ ] Change the `version` to `$PIPELINEID` - - [ ] Update `sha256sum` in the `input_files` section -- [ ] Update `ChangeLog.txt` - - [ ] Ensure ChangeLog.txt is sync'd between alpha and stable branches + - [ ] Check for manual updates by running (from `tor-browser-build` root): `./tools/fetch-manual.py` + - [ ] ***(Optional)*** If new version is available: + - [ ] Upload the downloaded `manual_$PIPELINEID.zip` file to `tb-build-02.torproject.org` + - [ ] Deploy to `tb-builder`'s `public_html` directory: + - `sudo -u tb-builder cp manual_$PIPELINEID.zip ~/../tb-builder/public_html/.` + - [ ] Update `projects/manual/config`: + - [ ] Change the `version` to `$PIPELINEID` + - [ ] Update `sha256sum` in the `input_files` section +- [ ] Update `ChangeLog-TBB.txt` + - [ ] Ensure `ChangeLog-TBB.txt` is sync'd between alpha and stable branches - [ ] Check the linked issues: ask people to check if any are missing, remove the not fixed ones - - [ ] Run `tools/fetch-changelogs.py $(TOR_BROWSER_VERSION)` or `tools/fetch-changelogs.py '#$(ISSUE_NUMBER)'` + - [ ] Run `tools/fetch-changelogs.py $(ISSUE_NUMBER) --date $date $updateArgs` - Make sure you have `requests` installed (e.g., `apt install python3-requests`) - The first time you run this script you will need to generate an access token; the script will guide you - - [ ] Copy the output of the script to the beginning of `ChangeLog.txt` and adjust its output - - **NOTE** : If you used the issue number, you will need to write the Tor Browser version manually - - [ ] ***(Optional)*** Under `All Platforms` include any version updates for: - - [ ] Translations - - [ ] OpenSSL - - [ ] NoScript - - [ ] zlib - - [ ] tor daemon - - [ ] ***(Optional)*** Under `Windows + macOS + Linux` include updates for: - - [ ] Firefox - - [ ] ***(Optional)*** Under `Android`, include updates for: - - [ ] Geckoview - - [ ] ***(Optional)*** Under `Build System/All Platforms` include updates for: - - [ ] Go -- [ ] Open MR with above changes + - `$updateArgs` should be these arguments, depending on what you actually updated: + - [ ] `--firefox` (be sure to include esr at the end if needed, which is usually the case) + - [ ] `--tor` + - [ ] `--no-script` + - [ ] `--openssl` + - [ ] `--zlib` + - [ ] `--go` + - E.g., `tools/fetch-changelogs.py 41028 --date 'December 19 2023' --firefox 115.6.0esr --tor 0.4.8.10 --no-script 11.4.29 --zlib 1.3 --go 1.21.5 --openssl 3.0.12` + - `--date $date` is optional, if omitted it will be the date on which you run the command + - [ ] Copy the output of the script to the beginning of `ChangeLog-TBB.txt` and adjust its output +- [ ] Open MR with above changes, using the template for release preparations - [ ] Merge - [ ] Sign/Tag commit: `make torbrowser-signtag-release` -- [ ] Push tag to `origin` +- [ ] Push tag to `upstream` - [ ] Begin build on `$(BUILD_SERVER)` (fix any issues in subsequent MRs) - [ ] **TODO** Submit build-tag to Mullvad build infra - [ ] Ensure builders have matching builds
===================================== .gitlab/merge_request_templates/default.md ===================================== @@ -43,16 +43,16 @@ - **localization** : henry, pierov - **macos** : clairehurst, dan - **nightly builds** : boklm - - **rebases/release-prep** : dan, ma1, pierov, richard + - **rebases/release-prep** : boklm, dan, ma1, pierov, richard - **security** : ma1 - **signing** : boklm, richard - **updater** : pierov - **misc/other** : pierov, richard
-#### Change Description +### Change Description
<!-- Whatever context the reviewer needs to effectively review the patchset; if the patch includes UX updates be sure to include screenshots/video of how any new behaviour -->
#### How Tested
-<!-- Description of steps taken to verify the change --> \ No newline at end of file +<!-- Description of steps taken to verify the change -->
===================================== .gitlab/merge_request_templates/relprep.md ===================================== @@ -0,0 +1,15 @@ +## Merge Info + +### Related Issues + +- tor-browser-build#xxxxx +- tor-browser-build#xxxxx + +## Review + +### Request Reviewer + +- [ ] Request review from a release engineer: boklm, dan, ma1, pierov, richard + +### Change Description +
===================================== tools/fetch-changelogs.py ===================================== @@ -1,4 +1,5 @@ #!/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()}")
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/c...