mirror of
https://github.com/nix-community/home-manager
synced 2024-11-27 05:29:46 +01:00
files: ignore conflict when files are identical
When the target file exists but has the exact same content then we will now skip creation of the link from the source file. Fixes #1213
This commit is contained in:
parent
7c19bcb822
commit
7f976da068
1 changed files with 17 additions and 3 deletions
|
@ -106,7 +106,12 @@ in
|
||||||
$VERBOSE_ECHO "Skipping collision check for $targetPath"
|
$VERBOSE_ECHO "Skipping collision check for $targetPath"
|
||||||
elif [[ -e "$targetPath" \
|
elif [[ -e "$targetPath" \
|
||||||
&& ! "$(readlink "$targetPath")" == $homeFilePattern ]] ; then
|
&& ! "$(readlink "$targetPath")" == $homeFilePattern ]] ; then
|
||||||
if [[ ! -L "$targetPath" && -n "$HOME_MANAGER_BACKUP_EXT" ]] ; 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"
|
backup="$targetPath.$HOME_MANAGER_BACKUP_EXT"
|
||||||
if [[ -e "$backup" ]]; then
|
if [[ -e "$backup" ]]; then
|
||||||
errorEcho "Existing file '$backup' would be clobbered by backing up '$targetPath'"
|
errorEcho "Existing file '$backup' would be clobbered by backing up '$targetPath'"
|
||||||
|
@ -115,6 +120,7 @@ in
|
||||||
warnEcho "Existing file '$targetPath' is in the way of '$sourcePath', will be moved to '$backup'"
|
warnEcho "Existing file '$targetPath' is in the way of '$sourcePath', will be moved to '$backup'"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
# Fail if nothing else works
|
||||||
errorEcho "Existing file '$targetPath' is in the way of '$sourcePath'"
|
errorEcho "Existing file '$targetPath' is in the way of '$sourcePath'"
|
||||||
collision=1
|
collision=1
|
||||||
fi
|
fi
|
||||||
|
@ -169,11 +175,19 @@ in
|
||||||
relativePath="''${sourcePath#$newGenFiles/}"
|
relativePath="''${sourcePath#$newGenFiles/}"
|
||||||
targetPath="$HOME/$relativePath"
|
targetPath="$HOME/$relativePath"
|
||||||
if [[ -e "$targetPath" && ! -L "$targetPath" && -n "$HOME_MANAGER_BACKUP_EXT" ]] ; then
|
if [[ -e "$targetPath" && ! -L "$targetPath" && -n "$HOME_MANAGER_BACKUP_EXT" ]] ; then
|
||||||
|
# The target exists, back it up
|
||||||
backup="$targetPath.$HOME_MANAGER_BACKUP_EXT"
|
backup="$targetPath.$HOME_MANAGER_BACKUP_EXT"
|
||||||
$DRY_RUN_CMD mv $VERBOSE_ARG "$targetPath" "$backup" || errorEcho "Moving '$targetPath' failed!"
|
$DRY_RUN_CMD mv $VERBOSE_ARG "$targetPath" "$backup" || errorEcho "Moving '$targetPath' failed!"
|
||||||
fi
|
fi
|
||||||
$DRY_RUN_CMD mkdir -p $VERBOSE_ARG "$(dirname "$targetPath")"
|
|
||||||
$DRY_RUN_CMD ln -nsf $VERBOSE_ARG "$sourcePath" "$targetPath"
|
if [[ -e "$targetPath" && ! -L "$targetPath" ]] && cmp -s $sourcePath $targetPath ; then
|
||||||
|
# The target exists but is identical – don't do anything.
|
||||||
|
$VERBOSE_ECHO "Skipping '$targetPath' as it is identical to '$sourcePath'"
|
||||||
|
else
|
||||||
|
# Place that symlink, --force
|
||||||
|
$DRY_RUN_CMD mkdir -p $VERBOSE_ARG "$(dirname "$targetPath")"
|
||||||
|
$DRY_RUN_CMD ln -nsf $VERBOSE_ARG "$sourcePath" "$targetPath"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue