more Sparkle tests
This commit is contained in:
10
README.md
10
README.md
@@ -79,6 +79,16 @@ Preferences expose Sparkle’s built-in toggles for “Automatically check” an
|
||||
|
||||
> Build settings include `INFOPLIST_KEY_SUFeedURL` and `INFOPLIST_KEY_SUPublicEDKey`. Make sure to fill both before shipping a build so Sparkle knows where to fetch updates and how to verify them.
|
||||
|
||||
### Automated release push
|
||||
|
||||
If you want `git push origin master` to build/sign/notarize/upload automatically, enable the provided pre-push hook:
|
||||
|
||||
```bash
|
||||
git config core.hooksPath hooks
|
||||
```
|
||||
|
||||
The hook (see `hooks/pre-push`) watches for pushes that include `refs/heads/master`, runs `scripts/build_release.sh`, and automatically commits the updated `Sparkle/appcast.xml` so it travels with your release. To skip the automation temporarily, prepend `SKIP_RELEASE=1` to your `git push` command.
|
||||
|
||||
### Versioning workflow
|
||||
|
||||
- The canonical marketing version lives in `version.json` and follows the format `YY.major.minor` (example: `26.1.2`). Update that file manually whenever you cut a new release branch.
|
||||
|
||||
8
Sparkle/appcast.xml
vendored
8
Sparkle/appcast.xml
vendored
@@ -2,6 +2,14 @@
|
||||
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
|
||||
<channel>
|
||||
<title>iKeyMon</title>
|
||||
<item>
|
||||
<title>26.0.15</title>
|
||||
<pubDate>Tue, 25 Nov 2025 17:42:56 +0100</pubDate>
|
||||
<sparkle:version>34</sparkle:version>
|
||||
<sparkle:shortVersionString>26.0.15</sparkle:shortVersionString>
|
||||
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
|
||||
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/iKeyMon-26.0.15.zip" length="4800821" type="application/octet-stream" sparkle:edSignature="bojJ638CY0n+34POoJX3OBrXRAiPOYPiDTfgJOS9fCslw8YGKZLviJvcExC2PKh1HDt0Raabo0FJUJrAFUMmBQ=="/>
|
||||
</item>
|
||||
<item>
|
||||
<title>26.0.13</title>
|
||||
<pubDate>Tue, 25 Nov 2025 00:05:46 +0100</pubDate>
|
||||
|
||||
41
hooks/pre-push
Executable file
41
hooks/pre-push
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
|
||||
if [[ -n "${SKIP_RELEASE:-}" ]]; then
|
||||
echo "⚙️ SKIP_RELEASE set — skipping automated release build."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
should_release=false
|
||||
while read -r local_ref local_sha remote_ref remote_sha; do
|
||||
[[ -z "${local_ref:-}" ]] && continue
|
||||
if [[ "$local_ref" == "refs/heads/master" || "$remote_ref" == "refs/heads/master" ]]; then
|
||||
should_release=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$should_release" != true ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "🚀 Pre-push hook detected master — running release build..."
|
||||
"$ROOT_DIR/scripts/build_release.sh"
|
||||
|
||||
APPCAST_PATH="$ROOT_DIR/Sparkle/appcast.xml"
|
||||
if ! git -C "$ROOT_DIR" diff --quiet "$APPCAST_PATH"; then
|
||||
git -C "$ROOT_DIR" add "$APPCAST_PATH"
|
||||
VERSION="$(python3 - "$ROOT_DIR/version.json" <<'PY'
|
||||
import json, sys
|
||||
with open(sys.argv[1], "r", encoding="utf-8") as handle:
|
||||
data = json.load(handle)
|
||||
print(data.get("marketing_version", "dev"))
|
||||
PY
|
||||
)"
|
||||
git -C "$ROOT_DIR" commit -m "chore: update Sparkle appcast for ${VERSION}" >/dev/null
|
||||
echo "📝 Committed updated Sparkle appcast for ${VERSION}."
|
||||
fi
|
||||
|
||||
echo "✅ Release build complete — continuing push."
|
||||
@@ -310,7 +310,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = iKeyMon.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 32;
|
||||
CURRENT_PROJECT_VERSION = 34;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
||||
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
@@ -325,7 +325,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 26.0.13;
|
||||
MARKETING_VERSION = 26.0.15;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
@@ -341,7 +341,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = iKeyMon.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 32;
|
||||
CURRENT_PROJECT_VERSION = 34;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
||||
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
@@ -356,7 +356,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 26.0.13;
|
||||
MARKETING_VERSION = 26.0.15;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"marketing_version": "26.0.13"
|
||||
"marketing_version": "26.0.15"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user