ai/at
1
0
Files
at/ios/setup.zsh
2025-12-09 23:03:59 +09:00

296 lines
8.6 KiB
Bash
Executable File

#!/bin/zsh
cd ${0:a:h}
# iOS Social App Patch Setup Script
# Usage: ./ios/setup.zsh [patch|reset]
# Cross-platform sed (macOS vs Linux)
function sediment() {
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "$@"
else
sed -i "$@"
fi
}
# Arrays for patch management
typeset -a FAILED_PATCHES
# Patch file lists for iOS
typeset -a PATCH_FILES_IOS
PATCH_FILES_IOS=(
"001-social-app-ios-config.patch"
"002-social-app-ios-lib.patch"
"003-social-app-ios-view.patch"
"004-social-app-ios-core.patch"
"005-social-app-ios-screens.patch"
"006-social-app-ios-shell.patch"
"007-social-app-ios-misc.patch"
"009-social-app-ios-license.patch"
"010-social-app-ios-remove-contact-support.patch"
"011-social-app-ios-splash-license-footer.patch"
"013-social-app-ios-settings-remove-help.patch"
"019-social-app-ios-entitlements-plugin.patch"
"020-social-app-ios-bypass-age-assurance.patch"
"021-social-app-ios-clean-feed.patch"
"022-social-app-ios-bskyweb-support-pages.patch"
"023-social-app-ios-disable-dm.patch"
"024-social-app-ios-disable-external-services.patch"
"025-social-app-ios-bskyweb-title.patch"
"026-social-app-ios-serverinput-label.patch"
"027-social-app-ios-remove-birthdate.patch"
"028-social-app-ios-remove-discover-feeds.patch"
"029-social-app-ios-remove-feeds-discover.patch"
"030-social-app-ios-appinfo.patch"
)
function ios-env() {
d=${0:a:h:h}
patching_dir=${0:a:h}/patching
target_dir=$d/repos/social-app
}
# Common patch function with status detection
function apply-patch() {
local patch_name=$1
local target_dir=$2
local patch_file=$3
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📝 Patch: ${patch_name}"
echo " Target: ${target_dir}"
echo " File: ${patch_file}"
pushd ${target_dir} > /dev/null
# Check if patch is already applied (reverse dry-run succeeds)
if patch -f --dry-run -p1 -R < ${patch_file} > /dev/null 2>&1; then
echo "✅ Already applied - skipping"
popd > /dev/null
echo ""
return 0
fi
# Check if patch can be applied (forward dry-run succeeds)
if patch --dry-run -p1 < ${patch_file} > /dev/null 2>&1; then
echo "🔧 Applying patch..."
if patch -p1 < ${patch_file}; then
echo "✅ Applied successfully"
popd > /dev/null
echo ""
return 0
else
echo "❌ Failed to apply"
FAILED_PATCHES+=("${patch_name} (${patch_file})")
popd > /dev/null
echo ""
return 1
fi
else
echo "⚠️ Cannot apply - file may have been modified"
echo " Please check manually"
FAILED_PATCHES+=("${patch_name} (${patch_file}) - file modified")
popd > /dev/null
echo ""
return 1
fi
}
function show-failed-patches() {
if [ ${#FAILED_PATCHES[@]} -eq 0 ]; then
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ All patches applied successfully!"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
return 0
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "⚠️ FAILED PATCHES SUMMARY"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "The following patches could not be applied:"
echo ""
for failed_patch in "${FAILED_PATCHES[@]}"; do
echo "${failed_patch}"
done
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
}
# Helper function for applying patches
function patch-apply() {
local name=$1
local patch_file=$2
apply-patch "${name}" "$target_dir" "$patching_dir/${patch_file}"
}
# Generate build number from timestamp (YYMMDDHHMMSS)
function ios-generate-build-number() {
local build_number=$(date +%y%m%d%H%M%S)
local config_patch="$patching_dir/001-social-app-ios-config.patch"
if [ -f "$config_patch" ]; then
# Replace placeholder with timestamp
sediment "s/__BUILD_NUMBER__/${build_number}/" "$config_patch"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🔢 Build number: ${build_number}"
echo ""
fi
}
# Restore placeholder after patching (for git cleanliness)
function ios-restore-build-placeholder() {
local config_patch="$patching_dir/001-social-app-ios-config.patch"
if [ -f "$config_patch" ]; then
# Restore placeholder for next build
sediment "s/buildNumber: '[0-9]*'/buildNumber: '__BUILD_NUMBER__'/" "$config_patch"
fi
}
# Auto-apply patches from list
function ios-patch-apply-all() {
for filename in "${PATCH_FILES_IOS[@]}"; do
local title="${filename%.*}"
patch-apply "$title" "$filename"
done
}
# Copy new files that aren't in patches
function ios-copy-new-files() {
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📁 Copying new files..."
# Copy all assets from ios/assets/ to repos/social-app/assets/
if [ -d "$d/ios/assets" ]; then
cp -rf "$d/ios/assets/"* "$target_dir/assets/"
echo "✅ Copied all assets (including logo.png, app-icons)"
fi
# Copy License.tsx
if [ -f "$patching_dir/License.tsx" ]; then
mkdir -p "$target_dir/src/view/screens"
cp "$patching_dir/License.tsx" "$target_dir/src/view/screens/License.tsx"
echo "✅ Copied License.tsx"
fi
# Copy pre-generated favicons for bskyweb
local favicon_src="$d/ios/assets/favicons"
local bskyweb_static="$target_dir/bskyweb/static"
if [ -d "$favicon_src" ] && [ -d "$bskyweb_static" ]; then
cp -f "$d/ios/assets/logo.png" "$bskyweb_static/app.png"
cp -f "$favicon_src/favicon.png" "$bskyweb_static/favicon.png"
cp -f "$favicon_src/favicon-16x16.png" "$bskyweb_static/favicon-16x16.png"
cp -f "$favicon_src/favicon-32x32.png" "$bskyweb_static/favicon-32x32.png"
cp -f "$favicon_src/apple-touch-icon.png" "$bskyweb_static/apple-touch-icon.png"
echo "✅ Copied favicons to bskyweb/static"
fi
echo ""
}
function ios-setup-clone() {
if [ ! -d $target_dir ]; then
echo "Error: social-app repository not found at $target_dir"
echo "Please run install.zsh first to clone repositories"
return 1
fi
echo "Repository found: $target_dir"
}
# Generate static HTML for at.syui.ai (CF Pages)
function ios-generate-static-html() {
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🌐 Generating static HTML for at.syui.ai..."
local templates="$target_dir/bskyweb/templates"
local html_out="$d/html/about/support"
local static_out="$d/html/static"
# Check if templates exist
if [ ! -d "$templates" ]; then
echo "⚠️ Templates not found, skipping static HTML generation"
return 1
fi
# Create output directories
mkdir -p "$html_out"
mkdir -p "$static_out"
# Convert templates to static HTML
# Replace {{ staticCDNHost }} with empty string (use relative paths)
for template in about-privacy.html about-license.html about-tos.html about-help.html; do
if [ -f "$templates/$template" ]; then
local output_name="${template#about-}" # Remove 'about-' prefix
sed 's/{{ staticCDNHost }}//g' "$templates/$template" > "$html_out/$output_name"
fi
done
# Copy static assets from ios/assets
local favicon_src="$d/ios/assets/favicons"
if [ -d "$favicon_src" ]; then
cp -f "$favicon_src/favicon.png" "$static_out/" 2>/dev/null
fi
if [ -f "$d/ios/assets/logo.png" ]; then
cp -f "$d/ios/assets/logo.png" "$static_out/app.png"
fi
# Use about-app.html as index.html (root page)
if [ -f "$templates/about-app.html" ]; then
sed 's/{{ staticCDNHost }}//g' "$templates/about-app.html" > "$d/html/index.html"
fi
echo "✅ Generated static HTML in $d/html/"
echo " - index.html (app info)"
echo " - about/support/privacy.html"
echo " - about/support/license.html"
echo ""
}
function ios-setup-reset() {
echo "Resetting social-app repository..."
cd $target_dir
git stash
git checkout .
echo "Reset complete"
}
# Main execution
ios-env
case "$1" in
patch)
ios-setup-clone
ios-generate-build-number
ios-patch-apply-all
ios-restore-build-placeholder
ios-copy-new-files
ios-generate-static-html
show-failed-patches
exit
;;
reset)
ios-setup-reset
exit
;;
html)
# Generate static HTML only (requires patches to be applied first)
ios-generate-static-html
exit
;;
*)
ios-setup-clone
ios-generate-build-number
ios-patch-apply-all
ios-restore-build-placeholder
ios-copy-new-files
ios-generate-static-html
show-failed-patches
;;
esac