mirror of
https://github.com/sudosylabs/vnidrop.git
synced 2026-08-05 10:29:58 +02:00
Add a second macOS shipping channel alongside the App Store build: - New VniDropDirect target (Release-Direct config) sharing VniDrop's sources via an AppBase target template; links Sparkle behind the DIRECT_DISTRIBUTION flag so the App Store binary never bundles a self-updater. arm64-only (core is arm64). - Sparkle updater (SparkleUpdater.swift) + "Check for Updates" menu, compiled only under DIRECT_DISTRIBUTION; Info.plist SUFeedURL points at the GitHub Release /latest/download/appcast.xml, non-sandboxed entitlements for Developer ID. - build-dmg.sh (archive → Developer ID export → DMG → sign → notarize → staple), generate-appcast.sh, and ExportOptions-DeveloperID.plist. - apple-release.yml: on tag v*.*.*, build/notarize the DMG, publish the GitHub Release with appcast, and push the Homebrew cask to sudosylabs/homebrew-vnidrop. apple.yml gains a PR compile-check of the direct target. - CFBundleVersion is stamped at build time as a UTC YYMMDD.HHMM timestamp for both channels, replacing the hand-maintained build number. - Docs (RELEASE-MACOS.md, README), cask template + tap README, localized updates_check string, Makefile targets, gitignore for dist/ artifacts.
69 lines
2.9 KiB
Bash
Executable File
69 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Generates/updates the Sparkle appcast for the direct-download build. Runs
|
|
# Sparkle's `generate_appcast` over the DMGs in apple/dist/, writing:
|
|
# - apple/dist/appcast.xml
|
|
#
|
|
# The <enclosure> URLs point at the matching GitHub Release download assets, and
|
|
# each item is signed with the project's EdDSA key (from a key file or the
|
|
# keychain). The resulting appcast.xml is uploaded as a release asset; the app's
|
|
# SUFeedURL (/releases/latest/download/appcast.xml) always resolves to the newest.
|
|
#
|
|
# Usage: apple/scripts/generate-appcast.sh [version]
|
|
#
|
|
# Environment:
|
|
# DIST_DIR Folder holding the DMG(s). Default: apple/dist
|
|
# SPARKLE_BIN Dir containing generate_appcast. Auto-located when unset.
|
|
# SPARKLE_ED_KEY_FILE Path to the EdDSA private key file. When unset,
|
|
# generate_appcast reads the key from the login keychain.
|
|
# RELEASE_REPO owner/repo for enclosure URLs. Default: sudosylabs/vnidrop
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
APPLE_DIR="$REPO_ROOT/apple"
|
|
DIST_DIR="${DIST_DIR:-$APPLE_DIR/dist}"
|
|
RELEASE_REPO="${RELEASE_REPO:-sudosylabs/vnidrop}"
|
|
|
|
VERSION="${1:-}"
|
|
if [ -z "$VERSION" ] && [ "${GITHUB_REF_TYPE:-}" = "tag" ]; then
|
|
VERSION="${GITHUB_REF_NAME#v}"
|
|
fi
|
|
[ -n "$VERSION" ] || { echo "error: version required (arg or tag)" >&2; exit 1; }
|
|
|
|
# Enclosure URLs resolve to the specific release's assets.
|
|
DOWNLOAD_PREFIX="https://github.com/$RELEASE_REPO/releases/download/v$VERSION"
|
|
|
|
# --- Locate generate_appcast -------------------------------------------------
|
|
find_tool() {
|
|
local name="$1"
|
|
if [ -n "${SPARKLE_BIN:-}" ] && [ -x "$SPARKLE_BIN/$name" ]; then
|
|
printf '%s' "$SPARKLE_BIN/$name"; return 0
|
|
fi
|
|
if command -v "$name" >/dev/null 2>&1; then command -v "$name"; return 0; fi
|
|
# Sparkle SPM artifact bundle lands under DerivedData SourcePackages.
|
|
local dd="${APPLE_DERIVED_DATA:-$HOME/Library/Developer/Xcode/DerivedData}"
|
|
local hit
|
|
hit="$(find "$dd" "$HOME/Library/Caches/org.swift.swiftpm" -type f -name "$name" \
|
|
-perm -111 2>/dev/null | head -1 || true)"
|
|
[ -n "$hit" ] && { printf '%s' "$hit"; return 0; }
|
|
return 1
|
|
}
|
|
GENERATE_APPCAST="$(find_tool generate_appcast || true)"
|
|
if [ -z "$GENERATE_APPCAST" ]; then
|
|
echo "error: generate_appcast not found. Set SPARKLE_BIN to Sparkle's bin/ dir" >&2
|
|
echo " (download from https://github.com/sparkle-project/Sparkle/releases)." >&2
|
|
exit 1
|
|
fi
|
|
echo "==> Using $GENERATE_APPCAST"
|
|
|
|
# --- Generate ----------------------------------------------------------------
|
|
args=( --download-url-prefix "$DOWNLOAD_PREFIX/" -o "$DIST_DIR/appcast.xml" )
|
|
if [ -n "${SPARKLE_ED_KEY_FILE:-}" ]; then
|
|
args+=( --ed-key-file "$SPARKLE_ED_KEY_FILE" )
|
|
fi
|
|
echo "==> Generating appcast (v$VERSION) → $DIST_DIR/appcast.xml"
|
|
"$GENERATE_APPCAST" "${args[@]}" "$DIST_DIR"
|
|
|
|
echo "==> Done. Enclosure prefix: $DOWNLOAD_PREFIX/"
|