From 190d6542d3d0be664ff14b11d7c93937293d8efe Mon Sep 17 00:00:00 2001 From: Karol Mazurek Date: Mon, 22 Dec 2025 23:54:41 +0100 Subject: [PATCH] Add diff_apss.sh script for app patching analysis --- App Bundle Extension/custom/diff_apss.sh | 149 +++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 App Bundle Extension/custom/diff_apss.sh diff --git a/App Bundle Extension/custom/diff_apss.sh b/App Bundle Extension/custom/diff_apss.sh new file mode 100644 index 0000000..6b3ea14 --- /dev/null +++ b/App Bundle Extension/custom/diff_apss.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash + +# Check if the correct number of arguments provided +if [ $# -ne 2 ]; then + echo "Usage: $0 OLD_APP NEW_APP" + echo "Example: $0 OLD/Fantastical.app NEW/Fantastical.app" + exit 1 +fi + +OLD_APP="$1" +NEW_APP="$2" + +# Check if directories exist +if [ ! -d "$OLD_APP" ]; then + echo "Error: Old app directory '$OLD_APP' does not exist" + exit 1 +fi + +if [ ! -d "$NEW_APP" ]; then + echo "Error: New app directory '$NEW_APP' does not exist" + exit 1 +fi + +echo "==========================================" +echo "APP PATCHING ANALYSIS" +echo "==========================================" +echo "Old App: $OLD_APP" +echo "New App: $NEW_APP" +echo "==========================================" + +# Run diff with -r for recursive and -q for brief output +DIFF_OUTPUT=$(diff -rq "$OLD_APP" "$NEW_APP" 2>/dev/null) + +# Process new files +echo -e "\nšŸ†• NEW FILES:" +echo "----------------------------------------" +NEW_LIST=$(echo "$DIFF_OUTPUT" | grep "Only in $NEW_APP" | sed "s|Only in $NEW_APP/||" | sed 's|: | → |') +if [ -n "$NEW_LIST" ]; then + echo "$NEW_LIST" | while read -r line; do + echo " + $line" + done +else + echo " (No new files)" +fi + +# Process deleted files +echo -e "\nāŒ DELETED FILES:" +echo "----------------------------------------" +DELETED_LIST=$(echo "$DIFF_OUTPUT" | grep "Only in $OLD_APP" | sed "s|Only in $OLD_APP/||" | sed 's|: | → |') +if [ -n "$DELETED_LIST" ]; then + echo "$DELETED_LIST" | while read -r line; do + echo " - $line" + done +else + echo " (No deleted files)" +fi + +# Process modified files +echo -e "\nšŸ“ MODIFIED FILES:" +echo "----------------------------------------" +MODIFIED_LIST=$(echo "$DIFF_OUTPUT" | grep "^Files.*differ$" | sed "s|Files $OLD_APP/||" | sed "s| and $NEW_APP/.*differ$||") +if [ -n "$MODIFIED_LIST" ]; then + echo "$MODIFIED_LIST" | while read -r line; do + echo " ~ $line" + done +else + echo " (No modified files)" +fi + +# Find and report symlink changes +echo -e "\nšŸ”— SYMLINK CHANGES:" +echo "----------------------------------------" +SYMLINK_CHANGES="" + +# Find all symlinks in OLD_APP +while IFS= read -r old_symlink; do + rel_path="${old_symlink#$OLD_APP/}" + new_symlink="$NEW_APP/$rel_path" + + if [ ! -L "$new_symlink" ]; then + # Symlink was removed or converted to regular file + SYMLINK_CHANGES="${SYMLINK_CHANGES} - Removed: $rel_path\n" + else + # Check if symlink target changed + old_target=$(readlink "$old_symlink") + new_target=$(readlink "$new_symlink") + if [ "$old_target" != "$new_target" ]; then + SYMLINK_CHANGES="${SYMLINK_CHANGES} ~ Modified: $rel_path\n" + SYMLINK_CHANGES="${SYMLINK_CHANGES} Old target: $old_target\n" + SYMLINK_CHANGES="${SYMLINK_CHANGES} New target: $new_target\n" + fi + fi +done < <(find "$OLD_APP" -type l) + +# Find new symlinks in NEW_APP +while IFS= read -r new_symlink; do + rel_path="${new_symlink#$NEW_APP/}" + old_symlink="$OLD_APP/$rel_path" + + if [ ! -L "$old_symlink" ]; then + # New symlink added + new_target=$(readlink "$new_symlink") + SYMLINK_CHANGES="${SYMLINK_CHANGES} + Added: $rel_path → $new_target\n" + fi +done < <(find "$NEW_APP" -type l) + +if [ -n "$SYMLINK_CHANGES" ]; then + echo -e "$SYMLINK_CHANGES" +else + echo " (No symlink changes)" +fi + +# Count totals +NEW_COUNT=$(echo "$DIFF_OUTPUT" | grep -c "Only in $NEW_APP" 2>/dev/null || echo "0") +DELETED_COUNT=$(echo "$DIFF_OUTPUT" | grep -c "Only in $OLD_APP" 2>/dev/null || echo "0") +MODIFIED_COUNT=$(echo "$DIFF_OUTPUT" | grep -c "^Files.*differ$" 2>/dev/null || echo "0") + +# Ensure counts are single integers +NEW_COUNT=$(echo "$NEW_COUNT" | head -n1 | tr -d '\n') +DELETED_COUNT=$(echo "$DELETED_COUNT" | head -n1 | tr -d '\n') +MODIFIED_COUNT=$(echo "$MODIFIED_COUNT" | head -n1 | tr -d '\n') + +# Summary +echo -e "\nšŸ“Š SUMMARY:" +echo "==========================================" +echo "New files: $NEW_COUNT" +echo "Deleted files: $DELETED_COUNT" +echo "Modified files: $MODIFIED_COUNT" +echo "Total changes: $((NEW_COUNT + DELETED_COUNT + MODIFIED_COUNT))" +echo "==========================================" + +# Binary file detection +BINARY_CHANGES="" +while IFS= read -r file; do + if [ -n "$file" ]; then + full_path="$NEW_APP/$file" + if [ -f "$full_path" ] && [ ! -L "$full_path" ]; then + file_type=$(file -b "$full_path" 2>/dev/null) + if echo "$file_type" | grep -qE "(executable|shared library)"; then + BINARY_CHANGES="$BINARY_CHANGES$file\n" + fi + fi + fi +done <<< "$MODIFIED_LIST" + +if [ -n "$BINARY_CHANGES" ]; then + echo "āš ļø Binary files modified:" + echo -e "$BINARY_CHANGES" | sed 's/^/ /' +fi \ No newline at end of file