Skip to content

Instantly share code, notes, and snippets.

@J-Swift
Created July 16, 2021 00:58
Show Gist options
  • Save J-Swift/5aef3173d7201d7f04f1fc637cd0e263 to your computer and use it in GitHub Desktop.
Save J-Swift/5aef3173d7201d7f04f1fc637cd0e263 to your computer and use it in GitHub Desktop.
Helper for comparing what macOS user defaults change between 2 points in time
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p bash
set -euo pipefail
readonly _mode="${1:-}"
case "$_mode" in
'pre' | 'post' | 'compare')
readonly mode="${_mode}"
;;
*)
echo "Unsupported mode [${_mode}]. Must be one of [pre, post, compare]"
exit 1
esac
if [ "${mode}" == 'compare' ]; then
readonly target="${2:-}"
if [ -z "${target}" ]; then
echo "Must provide a comparison target"
exit 1
fi
fi
readonly basedir="$HOME/.local/share/apple_defaults_helper"
containsElement () {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 0; done
return 1
}
setup() {
mkdir -p "${basedir}"/{pre,post}
rm -rf "${basedir}/${mode}"/*
}
write_all_domains() {
local -r targetdir="${1}"
local -r ignored_domains=( ContextStoreAgent com.apple.xpc.activity2 )
echo "--------------------"
echo "Reading defaults"
echo "--------------------"
orig_ifs=$IFS
IFS=','
for domain in $( defaults domains | sort ); do
local trimmed_domain=$( echo $domain | xargs )
local destfile="${targetdir}/default__${trimmed_domain}"
if containsElement "${trimmed_domain}" "${ignored_domains[@]}"; then
continue
fi
(defaults read $trimmed_domain 2>/dev/null || echo 'unknown') > "${destfile}"
local sum=$( md5 -q "${destfile}" )
echo "$trimmed_domain: $sum" >> "${targetdir}/default__md5sums"
done
IFS=$orig_ifs
echo "Done"
}
write_all_preferences() {
local -r targetdir="${1}"
local -r ignored_prefs=( com.apple.TimeMachine.plist com.apple.apsd.plist com.apple.Bluetooth.plist com.apple.networkextension.uuidcache.plist )
echo
echo "--------------------"
echo "Reading preferences"
echo "--------------------"
for plist in /Library/Preferences/*.plist; do
local base_plist=$( basename $plist )
local destfile="${targetdir}/plist__${base_plist}"
if containsElement "${base_plist}" "${ignored_prefs[@]}"; then
continue
fi
/usr/libexec/PlistBuddy -c "Print" "${plist}" > "${destfile}" || (echo "Error reading ${base_plist}"; continue)
local sum=$( md5 -q "${destfile}" )
echo "$base_plist: $sum" >> "${targetdir}/plist__md5sums"
done
echo "Done"
}
do_compare() {
echo
echo "--------------------"
echo "comparing defaults"
echo "--------------------"
(diff --side-by-side --suppress-common-lines "${basedir}/pre/default__md5sums" "${basedir}/post/default__md5sums" && echo "No changes") || true
echo
echo "--------------------"
echo "comparing plists"
echo "--------------------"
(diff --side-by-side --suppress-common-lines "${basedir}/pre/plist__md5sums" "${basedir}/post/plist__md5sums" && echo "No changes") || true
}
main() {
if [ "${mode}" == "compare" ]; then
if [ "${target##*.}" == "plist" ]; then
diff --text --side-by-side "${basedir}/pre/plist__${target}" "${basedir}/post/plist__${target}"
else
diff --text --side-by-side "${basedir}/pre/default__${target}" "${basedir}/post/default__${target}"
fi
else
setup
write_all_domains "${basedir}/${mode}"
write_all_preferences "${basedir}/${mode}"
if [ "${mode}" == "post" ]; then
do_compare
fi
fi
echo
echo 'Done.'
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment