zed/script/flatpak/convert-release-notes.py
Owen Law f7115be3d1
Add Flatpak build system and support (#12006)
ping #6687 

This is the third iteration of this PR ([v2
here](https://github.com/zed-industries/zed/pull/11949)) and uses a
different approach to the first two (the process wrapper lib was a
maintainability nightmare). While the first two attempted to spawn the
necessary processes using flatpak-spawn and host-spawn from the app
inside the sandbox, this version first spawns the cli binary which then
restart's itself *outside* of the sandbox using flatpak-spawn. The
restarted cli process than can call the bundled app binary normally,
with no need for flatpak-spawn because it is already outside of the
sandbox. This is done instead of keeping the cli in the sandbox because
ipc becomes very difficult and broken when trying to do it across the
sandbox.

Gnome software (example using nightly channel and release notes
generated using the script):
<img
src="https://github.com/zed-industries/zed/assets/81528246/6391d217-0f44-4638-9569-88c46e5fc4ba"
width="600"/>

TODO in this PR:
- [x] Bundle libs.
- [x] Cleanup release note converter.

Future work:

- [ ] Auto-update dialog
- [ ] Flatpak auto-update (complete 'Auto-update dialog' first)
- [ ] Experimental
[bundle](https://docs.flatpak.org/en/latest/single-file-bundles.html)
releases for feedback (?).

*(?) = Maybe / Request for feedback*

Release Notes:

- N/A

---------

Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>
Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
2024-05-27 19:01:20 -06:00

94 lines
3.2 KiB
Python

import re
import requests
import sys
import textwrap
import os
def clean_line(line: str, in_code_fence: bool) -> str:
line = re.sub(r"<", "&lt;", line)
line = re.sub(r">", "&gt;", line)
line = re.sub(r"\(\[(#\d+)\]\([\w|\d\:|\/|\.|\-|_]*\)\)", lambda match: f"[{match.group(1)}]", line)
line = re.sub(r"\[(#\d+)\]\([\w|\d\:|\/|\.|\-|_]*\)", lambda match: f"[{match.group(1)}]", line)
if not in_code_fence:
line = line.strip()
return line
def convert_body(body: str) -> str:
formatted = ""
in_code_fence = False
in_list = False
for line in body.splitlines():
line = clean_line(line, in_code_fence)
if not line:
continue
if re.search(r'\[[\w|\d|:|\/|\.|\-|_]*\]\([\w|\d|:|\/|\.|\-|_]*\)', line):
continue
line = re.sub(r"(?<!\`)`([^`\n]+)`(?!`)", lambda match: f"<code>{match.group(1)}</code>", line)
contains_code_fence = bool(re.search(r"```", line))
is_list = bool(re.search(r"^-\s*", line))
if in_list and not is_list:
formatted += "</ul>\n"
if (not in_code_fence and contains_code_fence) or (not in_list and is_list):
formatted += "<ul>\n"
in_list = is_list
in_code_fence = contains_code_fence != in_code_fence
if is_list:
line = re.sub(r"^-\s*", "", line)
line = f" <li>{line}</li>"
elif in_code_fence or contains_code_fence:
line = f" <li><code> {line}</code></li>"
else:
line = f"<p>{line}</p>"
formatted += f"{line}\n"
if (not in_code_fence and contains_code_fence):
formatted += "</ul>\n"
if in_code_fence or in_list:
formatted += "</ul>\n"
return formatted
def get_release_info(tag: str):
url = f"https://api.github.com/repos/zed-industries/zed/releases/tags/{tag}"
response = requests.get(url)
if response.status_code == 200:
return response.json()
else:
print(f"Failed to fetch release info for tag '{tag}'. Status code: {response.status_code}")
quit()
if __name__ == "__main__":
os.chdir(sys.path[0])
if len(sys.argv) != 3:
print("Usage: python convert-release-notes.py <tag> <channel>")
sys.exit(1)
tag = sys.argv[1]
channel = sys.argv[2]
release_info = get_release_info(tag)
body = convert_body(release_info["body"])
version = tag.removeprefix("v").removesuffix("-pre")
date = release_info["published_at"]
release_info_str = f"<release version=\"{version}\" date=\"{date}\">\n"
release_info_str += f" <description>\n"
release_info_str += textwrap.indent(body, " " * 8)
release_info_str += f" </description>\n"
release_info_str += f" <url>https://github.com/zed-industries/zed/releases/tag/{tag}</url>\n"
release_info_str += "</release>\n"
channel_releases_file = f"../../crates/zed/resources/flatpak/release-info/{channel}"
with open(channel_releases_file) as f:
old_release_info = f.read()
with open(channel_releases_file, "w") as f:
f.write(textwrap.indent(release_info_str, " " * 8) + old_release_info)
print(f"Added release notes from {tag} to '{channel_releases_file}'")