new scripts

This commit is contained in:
Mark Gregory
2026-10-19 15:02:33 +01:00
parent ac0c5410c1
commit b81829012a
12 changed files with 75 additions and 539 deletions
Regular → Executable
+16 -13
View File
@@ -1,11 +1,11 @@
#!/bin/bash
set -euo pipefail
# DBSyn direct distribution: Developer ID signed, notarized app and DMG.
# macOS/Xcode required. Install as scripts/release-dbsyn-direct.sh.
APP_NAME=DBSyn
SCHEME=DBSyn
PROJECT=DBSyn.xcodeproj
# Rsync Studio direct distribution: Developer ID signed, notarized app and DMG.
# macOS/Xcode required. Install as Scripts/release.sh.
APP_NAME="Rsync Studio"
SCHEME="Rsync Studio"
PROJECT="Rsync Studio.xcodeproj"
TEAM_ID="${TEAM_ID:-39R6U3437D}"
SIGNING_IDENTITY="${SIGNING_IDENTITY:-B99D353C88996866C49E4389B375645F76870A3F}"
NOTARY_PROFILE="${NOTARY_PROFILE:-orion-notary}"
@@ -49,7 +49,7 @@ cat > "$EXPORT_OPTIONS" <<PLIST
</dict></plist>
PLIST
echo '==> Archiving DBSyn with hardened runtime...'
echo '==> Archiving Rsync Studio with hardened runtime...'
xcodebuild -project "$PROJECT" -scheme "$SCHEME" -configuration Release \
-destination 'generic/platform=macOS' -archivePath "$ARCHIVE_PATH" \
DEVELOPMENT_TEAM="$TEAM_ID" CODE_SIGN_STYLE=Automatic \
@@ -64,20 +64,23 @@ xcodebuild -exportArchive -archivePath "$ARCHIVE_PATH" \
# Xcode's generated Info.plist can omit CFBundleIconFile even when the
# build setting specifies it. Set it on the exported bundle BEFORE the
# final Developer ID signature, so the signed app includes the icon key.
ICON_PATH="$APP_PATH/Contents/Resources/DBSyn.icns"
ICON_PATH="$APP_PATH/Contents/Resources/AppIcon.icns"
if [[ ! -s "$ICON_PATH" ]]; then
ICON_PATH="$(find "$APP_PATH/Contents/Resources" -maxdepth 1 -name "*.icns" -type f -print -quit)"
fi
[[ -s "$ICON_PATH" ]] || { echo "ERROR: Missing bundled icon $ICON_PATH" >&2; exit 1; }
PLIST_PATH="$APP_PATH/Contents/Info.plist"
ICON_KEY="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIconFile' "$PLIST_PATH" 2>/dev/null || true)"
if [[ "$ICON_KEY" != DBSyn && "$ICON_KEY" != DBSyn.icns ]]; then
if [[ "$ICON_KEY" != "$(basename "$ICON_PATH" .icns)" && "$ICON_KEY" != "$(basename "$ICON_PATH")" ]]; then
echo "==> Setting CFBundleIconFile in exported app (before signing)..."
if /usr/libexec/PlistBuddy -c 'Print :CFBundleIconFile' "$PLIST_PATH" >/dev/null 2>&1; then
/usr/libexec/PlistBuddy -c 'Set :CFBundleIconFile DBSyn.icns' "$PLIST_PATH"
/usr/libexec/PlistBuddy -c 'Set :CFBundleIconFile $(basename "$ICON_PATH")' "$PLIST_PATH"
else
/usr/libexec/PlistBuddy -c 'Add :CFBundleIconFile string DBSyn.icns' "$PLIST_PATH"
/usr/libexec/PlistBuddy -c 'Add :CFBundleIconFile string $(basename "$ICON_PATH")' "$PLIST_PATH"
fi
fi
ICON_KEY="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIconFile' "$PLIST_PATH")"
[[ "$ICON_KEY" == DBSyn || "$ICON_KEY" == DBSyn.icns ]] || {
[[ "$ICON_KEY" == "$(basename "$ICON_PATH" .icns)" || "$ICON_KEY" == "$(basename "$ICON_PATH")" ]] || {
echo "ERROR: CFBundleIconFile still incorrect: '$ICON_KEY'" >&2; exit 1;
}
echo "==> Application icon verified: $ICON_KEY"
@@ -116,7 +119,7 @@ MOUNTED=1
ditto "$DMG_STAGE/$APP_NAME.app" "$MOUNT_POINT/$APP_NAME.app"
ln -s /Applications "$MOUNT_POINT/Applications"
cp "$ICON_PATH" "$MOUNT_POINT/.VolumeIcon.icns"
xcrun SetFile -a C "$MOUNT_POINT"
if xcrun --find SetFile >/dev/null 2>&1; then xcrun SetFile -a C "$MOUNT_POINT"; else echo "WARNING: SetFile unavailable; skipping custom volume icon flag"; fi
hdiutil detach "$MOUNT_POINT" -quiet
MOUNTED=0
hdiutil convert "$RW_DMG" -format UDZO -o "$TMP_DMG" -ov
@@ -154,4 +157,4 @@ ditto "$TMP_DMG" "$DMG_PATH"
echo '==> Release ready:'
ls -lh "$DMG_PATH"
shasum -a 256 "$DMG_PATH"
printf '\n========== DBSyn RELEASE COMPLETE ==========\n%s\n' "$DMG_PATH"
printf '\n========== RSYNC STUDIO RELEASE COMPLETE ==========\n%s\n' "$DMG_PATH"