#!/bin/bash # ๐ SUPER HUFTERPROOF ShotScreen Release Script V2 # Zero HTML, Zero Problems, 100% Bulletproof # ๐ฏ NEW: Auto-increment version detection! # # Usage: # ./release_hufterproof_v2.sh # Auto-increment from current version # ./release_hufterproof_v2.sh 1.15 # Use specific version set -e # Colors GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' PURPLE='\033[0;35m' NC='\033[0m' # Config GITEA_URL="https://git.plet.i234.me" RELEASES_REPO="Nick/shotscreen" echo -e "${PURPLE}๐ SUPER HUFTERPROOF Release Script V2${NC}" echo -e "${PURPLE}=====================================${NC}" # Get current version from Info.plist and auto-increment get_next_version() { if [ -f "Info.plist" ]; then CURRENT_VERSION=$(plutil -extract CFBundleShortVersionString raw Info.plist 2>/dev/null || echo "1.0") echo -e "${BLUE}๐ Current version: $CURRENT_VERSION${NC}" # Split version into parts (e.g., "1.12" -> major=1, minor=12) IFS='.' read -r MAJOR MINOR <<< "$CURRENT_VERSION" # Increment minor version NEXT_MINOR=$((MINOR + 1)) SUGGESTED_VERSION="$MAJOR.$NEXT_MINOR" echo -e "${GREEN}๐ Suggested next version: $SUGGESTED_VERSION${NC}" return 0 else SUGGESTED_VERSION="1.0" echo -e "${YELLOW}โ ๏ธ No Info.plist found, suggesting: $SUGGESTED_VERSION${NC}" return 1 fi } # Determine version NEW_VERSION="$1" if [ -z "$NEW_VERSION" ]; then get_next_version echo -e "${YELLOW}Press ENTER to use suggested version ($SUGGESTED_VERSION) or type custom version:${NC}" read -r USER_INPUT if [ -z "$USER_INPUT" ]; then NEW_VERSION="$SUGGESTED_VERSION" echo -e "${GREEN}โ Using suggested version: $NEW_VERSION${NC}" else NEW_VERSION="$USER_INPUT" echo -e "${BLUE}โ Using custom version: $NEW_VERSION${NC}" fi fi echo -e "${BLUE}๐ Building version: $NEW_VERSION${NC}" # Update Info.plist echo -e "${BLUE}๐ Updating Info.plist...${NC}" plutil -replace CFBundleVersion -string "$NEW_VERSION" Info.plist plutil -replace CFBundleShortVersionString -string "$NEW_VERSION" Info.plist # Update build_release_signed.sh with new version echo -e "${BLUE}๐ Updating build script version...${NC}" sed -i '' "s/APP_VERSION=\".*\"/APP_VERSION=\"$NEW_VERSION\"/" build_release_signed.sh # Build app with Developer ID signing and notarization echo -e "${BLUE}๐จ Building app with Developer ID signing...${NC}" if ! ./build_release_signed.sh; then echo -e "${RED}โ Build failed${NC}" exit 1 fi # Check DMG exists DMG_PATH="./dist/ShotScreen-$NEW_VERSION.dmg" if [ ! -f "$DMG_PATH" ]; then echo -e "${RED}โ DMG not found: $DMG_PATH${NC}" exit 1 fi # Get signature and size echo -e "${BLUE}๐ Getting signature...${NC}" SIG_OUTPUT=$(./.build/artifacts/sparkle/Sparkle/bin/sign_update "$DMG_PATH") SIGNATURE=$(echo "$SIG_OUTPUT" | grep -o 'sparkle:edSignature="[^"]*"' | cut -d'"' -f2) DMG_SIZE=$(stat -f%z "$DMG_PATH") if [ -z "$SIGNATURE" ]; then echo -e "${RED}โ Signature generation failed${NC}" exit 1 fi echo -e "${GREEN}โ Signature: ${SIGNATURE:0:20}...${NC}" echo -e "${GREEN}โ Size: $DMG_SIZE bytes${NC}" # Get release notes from TXT file (preserve original formatting) RELEASE_NOTES=$(awk ' /^ShotScreen [0-9]/ { if (count++ > 0) exit next } /^=+$/ { next } /^[A-Za-z]/ && !/^ShotScreen/ && NF > 0 { print $0 } /^ / && NF > 0 { print $0 } ' release_notes.txt) if [ -z "$RELEASE_NOTES" ]; then RELEASE_NOTES="Release version $NEW_VERSION" fi # Create Gitea release echo -e "${BLUE}๐ฆ Creating Gitea release...${NC}" # Format release notes beautifully for Gitea (markdown format) FORMATTED_NOTES="## ๐ ShotScreen $NEW_VERSION Features $RELEASE_NOTES" # Clean JSON (proper escaping for multiline text) CLEAN_NOTES=$(printf "%s" "$FORMATTED_NOTES" | sed 's/"/\\"/g' | awk '{printf "%s\\n", $0}' | sed 's/\\n$//') JSON_PAYLOAD="{ \"tag_name\": \"v$NEW_VERSION\", \"name\": \"ShotScreen v$NEW_VERSION\", \"body\": \"$CLEAN_NOTES\", \"draft\": false, \"prerelease\": false }" RESPONSE=$(curl -s -X POST \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d "$JSON_PAYLOAD" \ "$GITEA_URL/api/v1/repos/$RELEASES_REPO/releases") RELEASE_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2) if [ -z "$RELEASE_ID" ]; then echo -e "${YELLOW}โ ๏ธ Checking for existing release...${NC}" EXISTING=$(curl -s "$GITEA_URL/api/v1/repos/$RELEASES_REPO/releases/tags/v$NEW_VERSION") RELEASE_ID=$(echo "$EXISTING" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2) fi if [ -z "$RELEASE_ID" ]; then echo -e "${RED}โ Could not create/find release${NC}" exit 1 fi echo -e "${GREEN}โ Release ID: $RELEASE_ID${NC}" # Upload DMG echo -e "${BLUE}๐ค Uploading DMG...${NC}" UPLOAD_RESPONSE=$(curl -s -X POST \ -H "Authorization: token $GITEA_TOKEN" \ -F "attachment=@$DMG_PATH" \ "$GITEA_URL/api/v1/repos/$RELEASES_REPO/releases/$RELEASE_ID/assets") ASSET_ID=$(echo "$UPLOAD_RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2) if [ -z "$ASSET_ID" ]; then echo -e "${RED}โ DMG upload failed${NC}" exit 1 fi echo -e "${GREEN}โ DMG uploaded${NC}" # Create super simple appcast (no HTML, just plain text) echo -e "${BLUE}๐ Creating simple appcast...${NC}" # Convert plain text to simple HTML for appcast HTML_NOTES=$(echo "$RELEASE_NOTES" | sed 's/^- /