mirror of
https://github.com/nix-community/home-manager.git
synced 2025-11-08 11:36:05 +01:00
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.
62 lines
2.3 KiB
Bash
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
|