Files
nix-homebrew/pkgs/nuke-homebrew-repository/nuke-homebrew-repository.sh.in
T
2026-06-12 08:35:11 -04:00

64 lines
1.5 KiB
Bash

#!@runtimeShell@
set -euo pipefail
# Note that we do rely on GNU-ism here
export PATH="@path@"
# Homebrew keeps state (Library/Taps, bin, etc, ...) as ignored
# files in `$HOMEBREW_REPOSITORY`. We want to uninstall Homebrew
# while keeping all state, so we remove all files tracked by git.
if [[ "$#" != "1" ]]; then
>&2 echo "Usage: $0 <homebrew repository>"
>&2 echo "This script tries to nuke all tracked files in a Homebrew repository."
exit 1
fi
pushd "$1" >/dev/null
temp_gitconfig=$(mktemp gitconfig.XXXXXXXXXX)
echo -e "[safe]\ndirectory = $(readlink -f $1)" >"${temp_gitconfig}"
export GIT_CONFIG_GLOBAL="${temp_gitconfig}"
finish() {
rm -f "${temp_gitconfig}"
}
trap finish EXIT
if [[ ! -e ".git" ]]; then
>&2 echo "${PWD} is not a git repository"
exit 1
fi
if ! grep -E "^#.*Homebrew" "README.md" >/dev/null; then
>&2 echo "${PWD} does not looks like a Homebrew checkout"
exit 1
fi
# First, delete all files
files_to_delete=()
while read -r file; do
if [[ -e "$file" ]] || [[ -L "$file" ]]; then
files_to_delete+=("$file")
fi
done < <(git ls-files)
printf "%s\0" "${files_to_delete[@]}" | xargs -0 rm
if [[ -e "Library/Homebrew/vendor" ]]; then
>&2 echo "Removing stray vendor directory"
rm -rf --one-file-system "Library/Homebrew/vendor"
fi
# Next, delete all directories
while read -r dir; do
if [[ -d "$dir" ]]; then
rmdir -p --ignore-fail-on-non-empty "$dir"
fi
done < <(git ls-files | sed 's,/[^/]*$,,' | sort | uniq)
# Finally, delete .git
rm -rf --one-file-system ".git"
# vim: set et ts=2 sw=2: