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>
This commit is contained in:
parent
7e3ab9acc9
commit
f7115be3d1
16 changed files with 463 additions and 18 deletions
46
script/flatpak/bundle-flatpak
Executable file
46
script/flatpak/bundle-flatpak
Executable file
|
@ -0,0 +1,46 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/../.."
|
||||
shopt -s extglob
|
||||
|
||||
script/bundle-linux
|
||||
archive_match="zed(-[a-zA-Z0-9]+)?-linux-$(uname -m)\.tar\.gz"
|
||||
archive=$(ls "target/release" | grep -E ${archive_match})
|
||||
channel=$(<crates/zed/RELEASE_CHANNEL)
|
||||
|
||||
export CHANNEL="$channel"
|
||||
export ARCHIVE="$archive"
|
||||
if [[ "$channel" == "dev" ]]; then
|
||||
export APP_ID="dev.zed.Zed-Dev"
|
||||
export APP_NAME="Zed Devel"
|
||||
export BRANDING_LIGHT="#99c1f1"
|
||||
export BRANDING_DARK="#1a5fb4"
|
||||
export ICON_FILE="app-icon-dev"
|
||||
elif [[ "$channel" == "nightly" ]]; then
|
||||
export APP_ID="dev.zed.Zed-Nightly"
|
||||
export APP_NAME="Zed Nightly"
|
||||
export BRANDING_LIGHT="#e9aa6a"
|
||||
export BRANDING_DARK="#1a5fb4"
|
||||
export ICON_FILE="app-icon-nightly"
|
||||
elif [[ "$channel" == "preview" ]]; then
|
||||
export APP_ID="dev.zed.Zed-Preview"
|
||||
export APP_NAME="Zed Preview"
|
||||
export BRANDING_LIGHT="#99c1f1"
|
||||
export BRANDING_DARK="#1a5fb4"
|
||||
export ICON_FILE="app-icon-preview"
|
||||
elif [[ "$channel" == "stable" ]]; then
|
||||
export APP_ID="dev.zed.Zed"
|
||||
export APP_NAME="Zed"
|
||||
export BRANDING_LIGHT="#99c1f1"
|
||||
export BRANDING_DARK="#1a5fb4"
|
||||
export ICON_FILE="app-icon"
|
||||
else
|
||||
echo "Invalid channel: '$channel'"
|
||||
exit
|
||||
fi
|
||||
|
||||
envsubst < "crates/zed/resources/flatpak/manifest-template.json" > "$APP_ID.json"
|
||||
flatpak-builder --user --install --force-clean build "$APP_ID.json"
|
||||
flatpak build-bundle ~/.local/share/flatpak/repo "target/release/$APP_ID.flatpak" "$APP_ID"
|
||||
echo "Created 'target/release/$APP_ID.flatpak'"
|
93
script/flatpak/convert-release-notes.py
Normal file
93
script/flatpak/convert-release-notes.py
Normal file
|
@ -0,0 +1,93 @@
|
|||
import re
|
||||
import requests
|
||||
import sys
|
||||
import textwrap
|
||||
import os
|
||||
|
||||
def clean_line(line: str, in_code_fence: bool) -> str:
|
||||
line = re.sub(r"<", "<", line)
|
||||
line = re.sub(r">", ">", 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}'")
|
9
script/flatpak/deps
Executable file
9
script/flatpak/deps
Executable file
|
@ -0,0 +1,9 @@
|
|||
#!/bin/sh
|
||||
|
||||
flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
||||
|
||||
arch=$(arch)
|
||||
fd_version=23.08
|
||||
flatpak install -y --user org.freedesktop.Platform/${arch}/${fd_version}
|
||||
flatpak install -y --user org.freedesktop.Sdk/${arch}/${fd_version}
|
||||
flatpak install -y --user org.freedesktop.Sdk.Extension.rust-stable/${arch}/${fd_version}
|
Loading…
Add table
Add a link
Reference in a new issue