1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 11:36:05 +01:00
home-manager/modules/files/check-link-targets.sh
saygo-png 004753ae6b home-manager: add backup overwrite option
When using the backupFileExtension option, if the backup file exists,
the activation process fails. This adds an option to instead overwrite
the old backup instead of failing.
2025-10-01 11:45:00 -05:00

62 lines
2.3 KiB
Bash

# -*- mode: sh; sh-shell: bash -*-
@initHomeManagerLib@
# A symbolic link whose target path matches this pattern will be
# considered part of a Home Manager generation.
homeFilePattern="$(readlink -e @storeDir@)/*-home-manager-files/*"
forcedPaths=(@forcedPaths@)
newGenFiles="$1"
shift
for sourcePath in "$@" ; do
relativePath="${sourcePath#$newGenFiles/}"
targetPath="$HOME/$relativePath"
forced=""
for forcedPath in "${forcedPaths[@]}"; do
if [[ $targetPath == $forcedPath* ]]; then
forced="yeah"
break
fi
done
if [[ -n $forced ]]; then
verboseEcho "Skipping collision check for $targetPath"
elif [[ -e "$targetPath" \
&& ! "$(readlink "$targetPath")" == $homeFilePattern ]] ; then
# The target file already exists and it isn't a symlink owned by Home Manager.
if cmp -s "$sourcePath" "$targetPath"; then
# First compare the files' content. If they're equal, we're fine.
warnEcho "Existing file '$targetPath' is in the way of '$sourcePath', will be skipped since they are the same"
elif [[ ! -L "$targetPath" && -n "$HOME_MANAGER_BACKUP_EXT" ]] ; then
# Next, try to move the file to a backup location if configured and possible
backup="$targetPath.$HOME_MANAGER_BACKUP_EXT"
if [[ -e "$backup" && -z "$HOME_MANAGER_BACKUP_OVERWRITE" ]] ; then
collisionErrors+=("Existing file '$backup' would be clobbered by backing up '$targetPath'")
elif [[ -e "$backup" && -n "$HOME_MANAGER_BACKUP_OVERWRITE" ]] ; then
warnEcho "Existing file '$targetPath' is in the way of '$sourcePath' and '$backup' exists. Backup will be clobbered due to HOME_MANAGER_BACKUP_OVERWRITE=1"
else
warnEcho "Existing file '$targetPath' is in the way of '$sourcePath', will be moved to '$backup'"
fi
else
# Fail if nothing else works
collisionErrors+=("Existing file '$targetPath' would be clobbered")
fi
fi
done
if [[ ${#collisionErrors[@]} -gt 0 ]] ; then
errorEcho "Please do one of the following:
- Move or remove the files below and try again.
- In standalone mode, use 'home-manager switch -b backup' to back up"\
" files automatically.
- When used as a NixOS or nix-darwin module, set"\
" 'home-manager.backupFileExtension'"\
" to, for example, 'backup' and rebuild."
for error in "${collisionErrors[@]}" ; do
errorEcho "$error"
done
exit 1
fi