feat: sidebar update card (web + macOS) with app-first mac update flow and Sparkle beta track (#104171)

* feat: sidebar update card (web + macOS) with app-first mac update flow and Sparkle beta track

Squashed from claude/update-notification-display-c6cfb9 after semantic merge
with #104178 (channel-aware CLI installs). See PR #104171 body for details.

* chore(i18n): resync generated inventories after rebase

* chore(i18n): resync locale metadata after rebase
This commit is contained in:
Peter Steinberger
2026-07-11 00:34:10 -07:00
committed by GitHub
parent 7da12cbbe5
commit ebc848deec
86 changed files with 1318 additions and 274 deletions
+10
View File
@@ -38,6 +38,15 @@ if [[ -z "$VERSION" ]]; then
fi
fi
CHANNEL_ARGS=()
if [[ "$VERSION" == *-alpha.* || "$VERSION" == *.alpha.* ]]; then
echo "Alpha releases do not ship via Sparkle: $VERSION" >&2
exit 1
fi
if [[ "$VERSION" == *-beta.* || "$VERSION" == *.beta.* ]]; then
CHANNEL_ARGS=(--channel beta)
fi
TMP_DIR="$(mktemp -d)"
NOTES_HTML=""
cleanup() {
@@ -74,6 +83,7 @@ fi
--download-url-prefix "$DOWNLOAD_URL_PREFIX" \
--embed-release-notes \
--link "$FEED_URL" \
"${CHANNEL_ARGS[@]}" \
"$TMP_DIR"
cp -f "$TMP_DIR/appcast.xml" "$ROOT/appcast.xml"
+4
View File
@@ -1107,6 +1107,7 @@ export function collectAppcastSparkleVersionErrors(xml: string): string[] {
const title = extractTag(item, "title") ?? "unknown";
const shortVersion = extractTag(item, "sparkle:shortVersionString");
const sparkleVersion = extractTag(item, "sparkle:version");
const sparkleChannel = extractTag(item, "sparkle:channel");
if (!sparkleVersion) {
errors.push(`appcast item '${title}' is missing sparkle:version.`);
@@ -1120,6 +1121,9 @@ export function collectAppcastSparkleVersionErrors(xml: string): string[] {
if (!shortVersion) {
continue;
}
if (/(?:^|[.-])beta(?:[.-]|$)/i.test(shortVersion) && sparkleChannel !== "beta") {
errors.push(`appcast item '${title}' must set sparkle:channel to 'beta'.`);
}
const floors = sparkleBuildFloorsFromShortVersion(shortVersion);
if (floors === null) {
errors.push(