From 6f3ed4f3b8eb45734ca77916b4c96fab937cb2e2 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Sun, 31 May 2026 02:58:27 +0800
Subject: [PATCH] Prepare 7.8.7 dock policy release
---
build.sh | 121 ++++++++++++++++++++++++++++++++++++----
1 files changed, 109 insertions(+), 12 deletions(-)
diff --git a/build.sh b/build.sh
index dd08a5b..621d812 100644
--- a/build.sh
+++ b/build.sh
@@ -5,6 +5,7 @@
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILD_DIR="$PROJECT_DIR/build"
APP_BUNDLE="$BUILD_DIR/$APP_NAME.app"
+APP_INFO_PLIST="$APP_BUNDLE/Contents/Info.plist"
MACOS_DIR="$APP_BUNDLE/Contents/MacOS"
RESOURCES_DIR="$APP_BUNDLE/Contents/Resources"
SWIFT_DIR="$PROJECT_DIR/Apptag"
@@ -14,8 +15,9 @@
TARGET="arm64-apple-macosx15.0"
APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$INFO_PLIST")
-APP_BUILD=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$INFO_PLIST")
-if [ -z "$APP_VERSION" ] || ! [[ "$APP_BUILD" =~ ^[0-9]+$ ]]; then
+APP_BUILD="${APP_BUILD:-$(date '+%Y%m%d.%H%M')}"
+SOURCE_INFO_PLIST_HASH_BEFORE=$(shasum -a 256 "$INFO_PLIST" | awk '{print $1}')
+if [ -z "$APP_VERSION" ] || ! [[ "$APP_BUILD" =~ ^[0-9]{8}\.[0-9]{4}$ ]]; then
echo "❌ Invalid version metadata in $INFO_PLIST: version='$APP_VERSION' build='$APP_BUILD'"
exit 1
fi
@@ -57,19 +59,51 @@
-framework AppKit \
-framework SwiftUI \
-framework Carbon \
+ -framework CoreServices \
+ -lcompression \
-sdk "$SDK_PATH" \
-target "$TARGET" \
-Osize \
"${SWIFT_FILES[@]}"
echo "==> Copying Info.plist..."
-cp "$INFO_PLIST" "$APP_BUNDLE/Contents/Info.plist"
+cp "$INFO_PLIST" "$APP_INFO_PLIST"
+/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $APP_BUILD" "$APP_INFO_PLIST"
echo "==> Copying AppIcon.icns..."
-if [ -f "$PROJECT_DIR/icon-icns.icns" ]; then
+APPICON_SOURCE_DIR="$SWIFT_DIR/Assets.xcassets/AppIcon.appiconset"
+if [ -d "$APPICON_SOURCE_DIR" ]; then
+ TMP_ICONSET_PARENT="$(mktemp -d -t taglauncher-appicon.XXXXXX)"
+ TMP_ICONSET="$TMP_ICONSET_PARENT/AppIcon.iconset"
+ mkdir -p "$TMP_ICONSET"
+ ICON_NAMES=(
+ icon_16x16.png
+ icon_16x16@2x.png
+ icon_32x32.png
+ icon_32x32@2x.png
+ icon_128x128.png
+ icon_128x128@2x.png
+ icon_256x256.png
+ icon_256x256@2x.png
+ icon_512x512.png
+ icon_512x512@2x.png
+ )
+ for icon_name in "${ICON_NAMES[@]}"; do
+ if [ ! -f "$APPICON_SOURCE_DIR/$icon_name" ]; then
+ echo "❌ Missing AppIcon asset: $APPICON_SOURCE_DIR/$icon_name"
+ exit 1
+ fi
+ cp "$APPICON_SOURCE_DIR/$icon_name" "$TMP_ICONSET/$icon_name"
+ done
+ iconutil -c icns "$TMP_ICONSET" -o "$RESOURCES_DIR/AppIcon.icns"
+ rm -rf "$TMP_ICONSET_PARENT"
+elif [ -f "$PROJECT_DIR/icon-icns.icns" ]; then
cp "$PROJECT_DIR/icon-icns.icns" "$RESOURCES_DIR/AppIcon.icns"
elif [ -f "$SWIFT_DIR/AppIcon.iconset/icon_512x512@2x.png" ]; then
iconutil -c icns "$SWIFT_DIR/AppIcon.iconset" -o "$RESOURCES_DIR/AppIcon.icns" 2>/dev/null
+else
+ echo "❌ Missing AppIcon source"
+ exit 1
fi
echo "==> Copying menu bar icon..."
@@ -81,14 +115,70 @@
cp -r "$SWIFT_DIR/Localization" "$RESOURCES_DIR/Localization"
echo "==> Copying Smart Start catalog..."
-if [ -f "$PROJECT_DIR/Research/SmartStart/UltimateDefaultCatalog/SmartStart_UltimateDefaultCatalog.json" ]; then
- cp "$PROJECT_DIR/Research/SmartStart/UltimateDefaultCatalog/SmartStart_UltimateDefaultCatalog.json" "$RESOURCES_DIR/SmartStartUltimateDefaultCatalog.json"
-fi
-if [ -f "$PROJECT_DIR/Research/SmartStart/UltimateDefaultCatalog/SmartStart_UltimateDefaultCatalog.csv" ]; then
- cp "$PROJECT_DIR/Research/SmartStart/UltimateDefaultCatalog/SmartStart_UltimateDefaultCatalog.csv" "$RESOURCES_DIR/SmartStartUltimateDefaultCatalog.csv"
-fi
-if [ -f "$PROJECT_DIR/Research/SmartStart/AppDefaultTags_Review.csv" ]; then
- cp "$PROJECT_DIR/Research/SmartStart/AppDefaultTags_Review.csv" "$RESOURCES_DIR/SmartStartAppDefaultTags.csv"
+SMARTSTART_SOURCE_DIR="$PROJECT_DIR/Research/SmartStart/UltimateDefaultCatalog"
+for required in \
+ "SmartStart_UltimateDefaultCatalog.base.json" \
+ "SmartStart_UltimateDefaultCatalog.manifest.json" \
+ "SmartStart_UltimateDefaultCatalog.notes.en.json" \
+ "SmartStart_UltimateDefaultCatalog.notes.zh-Hans.json"; do
+ if [ ! -f "$SMARTSTART_SOURCE_DIR/$required" ]; then
+ echo "❌ Missing Smart Start split resource: $required"
+ echo " Run: node Research/SmartStart/Scripts/build-ultimate-default-catalog.mjs"
+ exit 1
+ fi
+done
+python3 - "$SMARTSTART_SOURCE_DIR/SmartStart_UltimateDefaultCatalog.base.json" "$RESOURCES_DIR/SmartStartUltimateDefaultCatalog.base.json" <<'PY'
+import json
+import sys
+source, destination = sys.argv[1], sys.argv[2]
+with open(source, "r", encoding="utf-8") as f:
+ data = json.load(f)
+with open(destination, "w", encoding="utf-8") as f:
+ json.dump(data, f, ensure_ascii=False, separators=(",", ":"))
+PY
+python3 - "$SMARTSTART_SOURCE_DIR/SmartStart_UltimateDefaultCatalog.manifest.json" "$RESOURCES_DIR/SmartStartUltimateDefaultCatalog.manifest.json" <<'PY'
+import json
+import sys
+source, destination = sys.argv[1], sys.argv[2]
+with open(source, "r", encoding="utf-8") as f:
+ data = json.load(f)
+with open(destination, "w", encoding="utf-8") as f:
+ json.dump(data, f, ensure_ascii=False, separators=(",", ":"))
+PY
+for notes_file in "$SMARTSTART_SOURCE_DIR"/SmartStart_UltimateDefaultCatalog.notes.*.json; do
+ [ -e "$notes_file" ] || continue
+ output_name="$(basename "$notes_file" | sed 's/SmartStart_UltimateDefaultCatalog/SmartStartUltimateDefaultCatalog/').deflate"
+ python3 - "$notes_file" "$RESOURCES_DIR/$output_name" <<'PY'
+import json
+import sys
+import zlib
+source, destination = sys.argv[1], sys.argv[2]
+with open(source, "r", encoding="utf-8") as f:
+ data = json.load(f)
+payload = json.dumps(data, ensure_ascii=False, separators=(",", ":")).encode("utf-8")
+compressor = zlib.compressobj(level=9, wbits=-15)
+compressed = compressor.compress(payload) + compressor.flush()
+with open(destination, "wb") as f:
+ f.write(compressed)
+PY
+done
+
+if find "$RESOURCES_DIR" -maxdepth 1 -type f \( \
+ -name '*TranslationCache*' -o \
+ -name '*invalid*' -o \
+ -name 'SmartStartUltimateDefaultCatalog.json' -o \
+ -name 'SmartStartUltimateDefaultCatalog.csv' -o \
+ -name 'SmartStartUltimateDefaultCatalog.notes.*.json' \
+ \) | grep -q .; then
+ echo "❌ Forbidden Smart Start artifact copied into app bundle"
+ find "$RESOURCES_DIR" -maxdepth 1 -type f \( \
+ -name '*TranslationCache*' -o \
+ -name '*invalid*' -o \
+ -name 'SmartStartUltimateDefaultCatalog.json' -o \
+ -name 'SmartStartUltimateDefaultCatalog.csv' -o \
+ -name 'SmartStartUltimateDefaultCatalog.notes.*.json' \
+ \) -print
+ exit 1
fi
echo "==> Embedding PkgInfo..."
@@ -125,6 +215,13 @@
codesign --force --deep --sign - "$APP_BUNDLE"
fi
+echo "==> Verifying source Info.plist was not modified..."
+SOURCE_INFO_PLIST_HASH_AFTER=$(shasum -a 256 "$INFO_PLIST" | awk '{print $1}')
+if [ "$SOURCE_INFO_PLIST_HASH_BEFORE" != "$SOURCE_INFO_PLIST_HASH_AFTER" ]; then
+ echo "❌ Build mutated tracked source file: $INFO_PLIST"
+ exit 1
+fi
+
echo ""
echo "✅ App built at: $APP_BUNDLE"
echo " Run: open $APP_BUNDLE"
--
Gitblit v1.9.3