fix: target fix for sparkle

This commit is contained in:
Michael Freno
2026-01-11 20:22:26 -05:00
parent 1fc5dcce04
commit 18139dd24a
6 changed files with 45 additions and 13 deletions

1
.gitignore vendored
View File

@@ -4,3 +4,4 @@ AGENTS.md
*.app *.app
*.env *.env
*.dmg *.dmg
*.delta

View File

@@ -424,7 +424,7 @@
CODE_SIGN_ENTITLEMENTS = Gaze/Gaze.entitlements; CODE_SIGN_ENTITLEMENTS = Gaze/Gaze.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 2;
DEVELOPMENT_TEAM = 6GK4F9L62V; DEVELOPMENT_TEAM = 6GK4F9L62V;
ENABLE_APP_SANDBOX = YES; ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES; ENABLE_HARDENED_RUNTIME = YES;
@@ -460,7 +460,7 @@
CODE_SIGN_ENTITLEMENTS = Gaze/Gaze.entitlements; CODE_SIGN_ENTITLEMENTS = Gaze/Gaze.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 2;
DEVELOPMENT_TEAM = 6GK4F9L62V; DEVELOPMENT_TEAM = 6GK4F9L62V;
ENABLE_APP_SANDBOX = YES; ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES; ENABLE_HARDENED_RUNTIME = YES;

View File

@@ -27,6 +27,7 @@ echo "📦 Building Gaze DMG for v${VERSION} (build ${BUILD_NUMBER})"
RELEASES_DIR="./releases" RELEASES_DIR="./releases"
APPCAST_OUTPUT="${RELEASES_DIR}/appcast.xml" APPCAST_OUTPUT="${RELEASES_DIR}/appcast.xml"
FEED_URL="https://freno.me/api/Gaze/appcast.xml" FEED_URL="https://freno.me/api/Gaze/appcast.xml"
DOWNLOAD_URL_PREFIX="https://freno.me/api/downloads/"
DMG_NAME="Gaze-${VERSION}.dmg" DMG_NAME="Gaze-${VERSION}.dmg"
# Find Sparkle generate_appcast tool # Find Sparkle generate_appcast tool
@@ -79,7 +80,7 @@ if [ -n "$SPARKLE_BIN" ] && [ -d "$SPARKLE_BIN" ]; then
# Generate appcast with download URL prefix and key # Generate appcast with download URL prefix and key
"$SPARKLE_BIN/generate_appcast" \ "$SPARKLE_BIN/generate_appcast" \
--download-url-prefix "https://freno.me/downloads/" \ --download-url-prefix "$DOWNLOAD_URL_PREFIX" \
$KEY_OPTION \ $KEY_OPTION \
"$RELEASES_DIR" "$RELEASES_DIR"
@@ -106,7 +107,7 @@ if [ -n "$SPARKLE_BIN" ] && [ -d "$SPARKLE_BIN" ]; then
# Add signature to appcast XML # Add signature to appcast XML
# Find the enclosure line and add sparkle:edSignature attribute # Find the enclosure line and add sparkle:edSignature attribute
sed -i '' "s|<enclosure url=\"https://freno.me/downloads/$DMG_NAME\" length=\"[0-9]*\"|<enclosure url=\"https://freno.me/downloads/$DMG_NAME\" sparkle:edSignature=\"$ED_SIGNATURE\" length=\"$FILE_LENGTH\"|g" "$APPCAST_OUTPUT" sed -i '' "s|<enclosure url=\"${DOWNLOAD_URL_PREFIX}$DMG_NAME\" length=\"[0-9]*\"|<enclosure url=\"${DOWNLOAD_URL_PREFIX}$DMG_NAME\" sparkle:edSignature=\"$ED_SIGNATURE\" length=\"$FILE_LENGTH\"|g" "$APPCAST_OUTPUT"
# Verify signature was added # Verify signature was added
if grep -q "edSignature" "$APPCAST_OUTPUT"; then if grep -q "edSignature" "$APPCAST_OUTPUT"; then
@@ -129,7 +130,7 @@ else
echo "" echo ""
echo "⚠️ Skipping appcast generation (Sparkle tools not found)" echo "⚠️ Skipping appcast generation (Sparkle tools not found)"
echo "To generate appcast manually, run:" echo "To generate appcast manually, run:"
echo " ./generate_appcast --ed-key-file ~/sparkle_private_key_backup.pem --download-url-prefix 'https://freno.me/downloads/' '$RELEASES_DIR'" echo " ./generate_appcast --ed-key-file ~/sparkle_private_key_backup.pem --download-url-prefix '$DOWNLOAD_URL_PREFIX' '$RELEASES_DIR'"
fi fi
# Upload to AWS S3 if environment variables are set # Upload to AWS S3 if environment variables are set
@@ -142,17 +143,36 @@ if [ -n "$AWS_ACCESS_KEY_ID" ] && [ -n "$AWS_SECRET_ACCESS_KEY" ] && [ -n "$AWS_
export AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" export AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY"
export AWS_DEFAULT_REGION="$AWS_REGION" export AWS_DEFAULT_REGION="$AWS_REGION"
# Upload DMG to S3 # Upload all DMG files in releases directory
aws s3 cp "$RELEASES_DIR/$DMG_NAME" "s3://$AWS_BUCKET_NAME/downloads/$DMG_NAME" --region "$AWS_REGION" echo "Uploading DMG files..."
for dmg_file in "$RELEASES_DIR"/*.dmg; do
if [ -f "$dmg_file" ]; then
dmg_basename=$(basename "$dmg_file")
echo " Uploading $dmg_basename..."
aws s3 cp "$dmg_file" "s3://$AWS_BUCKET_NAME/downloads/$dmg_basename" --region "$AWS_REGION"
fi
done
# Upload all delta files in releases directory
echo "Uploading delta files..."
for delta_file in "$RELEASES_DIR"/*.delta; do
if [ -f "$delta_file" ]; then
delta_basename=$(basename "$delta_file")
echo " Uploading $delta_basename..."
aws s3 cp "$delta_file" "s3://$AWS_BUCKET_NAME/downloads/$delta_basename" --region "$AWS_REGION"
fi
done
# Upload appcast if it exists # Upload appcast if it exists
if [ -f "$APPCAST_OUTPUT" ]; then if [ -f "$APPCAST_OUTPUT" ]; then
echo "Uploading appcast..."
aws s3 cp "$APPCAST_OUTPUT" "s3://$AWS_BUCKET_NAME/api/Gaze/appcast.xml" --region "$AWS_REGION" aws s3 cp "$APPCAST_OUTPUT" "s3://$AWS_BUCKET_NAME/api/Gaze/appcast.xml" --region "$AWS_REGION"
echo "✅ Appcast uploaded to S3" echo "✅ Appcast uploaded to S3"
fi fi
echo "✅ Upload complete!" echo "✅ Upload complete!"
echo " DMG: s3://$AWS_BUCKET_NAME/downloads/$DMG_NAME" echo " DMG files: s3://$AWS_BUCKET_NAME/downloads/*.dmg"
echo " Delta files: s3://$AWS_BUCKET_NAME/downloads/*.delta"
echo " Appcast: s3://$AWS_BUCKET_NAME/api/Gaze/appcast.xml" echo " Appcast: s3://$AWS_BUCKET_NAME/api/Gaze/appcast.xml"
else else
echo "" echo ""
@@ -168,7 +188,7 @@ if [ -f "$APPCAST_OUTPUT" ]; then
fi fi
echo "" echo ""
echo "Next steps:" echo "Next steps:"
echo " 1. Upload DMG to: https://freno.me/downloads/$DMG_NAME" echo " 1. Upload DMG to: ${DOWNLOAD_URL_PREFIX}$DMG_NAME"
echo " 2. Upload appcast to: $FEED_URL" echo " 2. Upload appcast to: $FEED_URL"
echo " 3. Verify appcast is accessible and valid" echo " 3. Verify appcast is accessible and valid"
echo " 4. Test update from previous version" echo " 4. Test update from previous version"

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -2,13 +2,24 @@
<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>Gaze</title> <title>Gaze</title>
<item>
<title>0.2.1</title>
<pubDate>Sun, 11 Jan 2026 19:58:11 -0500</pubDate>
<sparkle:version>2</sparkle:version>
<sparkle:shortVersionString>0.2.1</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>14.6</sparkle:minimumSystemVersion>
<enclosure url="https://freno.me/api/downloads/Gaze-0.2.1.dmg" length="4832775" type="application/octet-stream" sparkle:edSignature="rIMuezCOzKhKKZV+HgJV7LNoXFkjVse82toPgSYNfp2YWO8EITVaCBr4ZP2wqXZlRfdE4J6r9BDewbkKxkf7AQ=="/>
<sparkle:deltas>
<enclosure url="https://freno.me/api/downloads/Gaze2-1.delta" sparkle:deltaFrom="1" length="94254" type="application/octet-stream" sparkle:deltaFromSparkleExecutableSize="858560" sparkle:deltaFromSparkleLocales="de,he,ar,el,ja,fa,uk" sparkle:edSignature="qfxSfqD9iVJ7GVL19V8T4OuOTz0ZgqJNceBH6W+dwoKel1R+BTPkU9Ia8xR12v07GoXkyyqc+ba79OOL7jIpBw=="/>
</sparkle:deltas>
</item>
<item> <item>
<title>0.1.1</title> <title>0.1.1</title>
<pubDate>Sun, 11 Jan 2026 18:07:02 -0500</pubDate> <pubDate>Sun, 11 Jan 2026 18:07:02 -0500</pubDate>
<sparkle:version>1</sparkle:version> <sparkle:version>1</sparkle:version>
<sparkle:shortVersionString>0.2.0</sparkle:shortVersionString> <sparkle:shortVersionString>0.2.0</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>14.6</sparkle:minimumSystemVersion> <sparkle:minimumSystemVersion>14.6</sparkle:minimumSystemVersion>
<enclosure url="https://freno.me/downloads/Gaze-0.2.0.dmg" length="4831161" type="application/octet-stream" sparkle:edSignature="zCEmiiO4Q7HV7uGbI/CQcfJElm1uqrYorznE6uCWaKm/Zg1bUrWaeTRf9+Uv9f9+0iptyiS2FNdglLQB8RKkCA=="/> <enclosure url="https://freno.me/api/downloads/Gaze-0.2.0.dmg" length="4831161" type="application/octet-stream" sparkle:edSignature="zCEmiiO4Q7HV7uGbI/CQcfJElm1uqrYorznE6uCWaKm/Zg1bUrWaeTRf9+Uv9f9+0iptyiS2FNdglLQB8RKkCA=="/>
</item> </item>
</channel> </channel>
</rss> </rss>