mirror of
https://github.com/status-im/status-react.git
synced 2025-01-10 02:56:07 +00:00
771fb111e6
The existing purge script for Darwin would fail and stop at many stages. This commit makes the script more robust to certain failures that were observed and documented in https://github.com/status-im/status-mobile/issues/16404
149 lines
4.6 KiB
Bash
Executable File
149 lines
4.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# This script removes all Nix files.
|
|
|
|
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
|
|
source "${GIT_ROOT}/nix/scripts/lib.sh"
|
|
source "${GIT_ROOT}/scripts/colors.sh"
|
|
|
|
nix_purge_linux_multi_user_service() {
|
|
NIX_SERVICES=(nix-daemon.service nix-daemon.socket)
|
|
for NIX_SERVICE in "${NIX_SERVICES[@]}"; do
|
|
sudo systemctl stop "${NIX_SERVICE}"
|
|
sudo systemctl disable "${NIX_SERVICE}"
|
|
done
|
|
sudo systemctl daemon-reload
|
|
}
|
|
|
|
nix_purge_linux_multi_user_users() {
|
|
for NIX_USER in $(awk -F: '/nixbld/{print $1}' /etc/passwd); do
|
|
sudo userdel "${NIX_USER}"
|
|
done
|
|
sudo groupdel nixbld
|
|
}
|
|
|
|
nix_purge_darwin_multi_user_service() {
|
|
cd /Library/LaunchDaemons
|
|
NIX_SERVICES=(org.nixos.darwin-store.plist org.nixos.nix-daemon.plist)
|
|
for NIX_SERVICE in "${NIX_SERVICES[@]}"; do
|
|
sudo launchctl unload "${NIX_SERVICE}" || true
|
|
sudo launchctl remove "${NIX_SERVICE}" || true
|
|
done
|
|
}
|
|
|
|
nix_purge_darwin_multi_user_users() {
|
|
for NIX_USER in $(dscl . list /Users | grep nixbld); do
|
|
sudo dscl . -delete "/Users/${NIX_USER}"
|
|
done
|
|
sudo dscl . -delete /Groups/nixbld
|
|
}
|
|
|
|
# This still leaves an empty /nix, which will disappear after reboot.
|
|
nix_purge_darwin_multi_user_volumes() {
|
|
sudo sed -i.bkp '/nix/d' /etc/synthetic.conf
|
|
sudo sed -i.bkp '/nix/d' /etc/fstab
|
|
|
|
# Attempt to delete the volume
|
|
if ! sudo diskutil apfs deleteVolume /nix; then
|
|
echo "Failed to unmount /nix because it is in use."
|
|
|
|
# Identify the process using the volume
|
|
local pid=$(lsof +D /nix | awk 'NR==2{print $2}')
|
|
if [ -n "$pid" ]; then
|
|
echo "The volume /nix is in use by process ID $pid."
|
|
|
|
# Ask the user whether to terminate the process
|
|
read -p "Do you want to terminate this process? (y/n): " choice
|
|
if [[ $choice == "y" ]]; then
|
|
sudo kill $pid
|
|
echo "Process $pid terminated."
|
|
else
|
|
echo "Process not terminated. Please close it manually and retry."
|
|
return 1
|
|
fi
|
|
else
|
|
echo "No process found using /nix. Manual intervention required."
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
echo -e "${YLW}You will need to reboot your system!${RST}" >&2
|
|
}
|
|
|
|
nix_purge_multi_user() {
|
|
if [[ $(uname -s) == "Darwin" ]]; then
|
|
nix_purge_darwin_multi_user_service || true
|
|
nix_purge_darwin_multi_user_users || true
|
|
nix_purge_darwin_multi_user_volumes || true
|
|
else
|
|
nix_purge_linux_multi_user_service
|
|
nix_purge_linux_multi_user_users
|
|
fi
|
|
|
|
sudo rm -fr /etc/nix
|
|
sudo rm -f /etc/profile.d/nix.sh*
|
|
|
|
# Restore old shell profiles
|
|
NIX_PROFILE_FILES=(
|
|
/etc/bash.bashrc /etc/bashrc /etc/bash/bashrc
|
|
/etc/zsh.zshhrc /etc/zshrc /etc/zsh/zshrc
|
|
)
|
|
for NIX_FILE in "${NIX_PROFILE_FILES[@]}"; do
|
|
if [[ -f "${NIX_FILE}.backup-before-nix" ]]; then
|
|
sudo mv -f "${NIX_FILE}.backup-before-nix" "${NIX_FILE}"
|
|
fi
|
|
done
|
|
}
|
|
|
|
nix_purge_user_profile() {
|
|
sudo rm -rf \
|
|
~/.nix-* \
|
|
~/.cache/nix \
|
|
~/.config/nixpkgs \
|
|
"${GIT_ROOT}/.nix-gcroots"
|
|
}
|
|
|
|
nix_purge_root() {
|
|
NIX_ROOT=$(nix_root)
|
|
if [[ -z "${NIX_ROOT}" ]]; then
|
|
echo -e "${RED}Unable to identify Nix root!${RST}" >&2
|
|
exit 1
|
|
fi
|
|
sudo rm -fr "${NIX_ROOT}"
|
|
}
|
|
|
|
# Don't run anything if script is just sourced.
|
|
if (return 0 2>/dev/null); then
|
|
echo -e "${YLW}Script sourced, not running purge.${RST}"
|
|
return
|
|
fi
|
|
|
|
# Confirm user decission, unless --force is used.
|
|
if [[ "${1}" != "--force" ]]; then
|
|
echo -e "${YLW}Are you sure you want to purge Nix?${RST}" >&2
|
|
read -p "[y/n]: " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[^Yy]$ ]]; then
|
|
echo -e "${GRN}Aborting Nix purge!${RST}" >&2
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
NIX_INSTALL_TYPE=$(nix_install_type)
|
|
# Purging /nix on NixOS would be disasterous.
|
|
if [[ "${NIX_INSTALL_TYPE}" == "nixos" ]]; then
|
|
echo -e "${RED}You should not purge Nix files on NixOS!${RST}" >&2
|
|
exit
|
|
elif [[ "${NIX_INSTALL_TYPE}" == "none" ]] && [[ "${1}" != "--force" ]]; then
|
|
echo -e "${YLW}Nothing to remove, Nix not installed.${RST}" >&2
|
|
exit
|
|
elif [[ "${NIX_INSTALL_TYPE}" == "multi" ]] || [[ "${1}" == "--force" ]]; then
|
|
echo -e "${YLW}Detected multi-user Nix installation.${RST}" >&2
|
|
nix_purge_multi_user
|
|
elif [[ "${NIX_INSTALL_TYPE}" == "single" ]] || [[ "${1}" == "--force" ]]; then
|
|
echo -e "${YLW}Detected single-user Nix installation.${RST}" >&2
|
|
nix_purge_user_profile
|
|
fi
|
|
nix_purge_root
|
|
|
|
echo -e "${GRN}Purged all Nix files from your system.${RST}" >&2
|