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.
|
> 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
|
### 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.
|
- 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">
|
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
|
||||||
<channel>
|
<channel>
|
||||||
<title>iKeyMon</title>
|
<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>
|
<item>
|
||||||
<title>26.0.13</title>
|
<title>26.0.13</title>
|
||||||
<pubDate>Tue, 25 Nov 2025 00:05:46 +0100</pubDate>
|
<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_ENTITLEMENTS = iKeyMon.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 32;
|
CURRENT_PROJECT_VERSION = 34;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -325,7 +325,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 26.0.13;
|
MARKETING_VERSION = 26.0.15;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon;
|
PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
@@ -341,7 +341,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = iKeyMon.entitlements;
|
CODE_SIGN_ENTITLEMENTS = iKeyMon.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 32;
|
CURRENT_PROJECT_VERSION = 34;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -356,7 +356,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 26.0.13;
|
MARKETING_VERSION = 26.0.15;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon;
|
PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
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