1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 19:46:05 +01:00
home-manager/modules/files/check-link-targets.sh
fidgetingbits c4aaddeaec home-manager: Document 'force = true' option in error output
Add a note about 'force = true' as an option for addressing collision
errors
2025-10-11 22:20:30 -05:00

65 lines
2.5 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.
- Set 'force = true' on the related file options to forcefully overwrite"\
" the files below. eg. 'xdg.configFile.\"mimeapps.list\".force = true'"
for error in "${collisionErrors[@]}" ; do
errorEcho "$error"
done
exit 1
fi