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: 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.
This commit is contained in:
saygo-png 2025-09-24 22:11:51 +02:00 committed by Austin Horstman
parent 7500458e85
commit 004753ae6b
5 changed files with 21 additions and 8 deletions

View file

@ -149,6 +149,9 @@ in
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 # The target exists, back it up
backup="$targetPath.$HOME_MANAGER_BACKUP_EXT" backup="$targetPath.$HOME_MANAGER_BACKUP_EXT"
if [[ -e "$backup" && -n "$HOME_MANAGER_BACKUP_OVERWRITE" ]]; then
run rm $VERBOSE_ARG "$backup"
fi
run mv $VERBOSE_ARG "$targetPath" "$backup" || errorEcho "Moving '$targetPath' failed!" run mv $VERBOSE_ARG "$targetPath" "$backup" || errorEcho "Moving '$targetPath' failed!"
fi fi

View file

@ -33,8 +33,10 @@ for sourcePath in "$@" ; do
elif [[ ! -L "$targetPath" && -n "$HOME_MANAGER_BACKUP_EXT" ]] ; then elif [[ ! -L "$targetPath" && -n "$HOME_MANAGER_BACKUP_EXT" ]] ; then
# Next, try to move the file to a backup location if configured and possible # 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" && -z "$HOME_MANAGER_BACKUP_OVERWRITE" ]] ; then
collisionErrors+=("Existing file '$backup' would be clobbered by backing up '$targetPath'") 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 else
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

View file

@ -28,6 +28,7 @@ in
${lib.optionalString ( ${lib.optionalString (
cfg.backupFileExtension != null cfg.backupFileExtension != null
) "export HOME_MANAGER_BACKUP_EXT=${lib.escapeShellArg cfg.backupFileExtension}"} ) "export HOME_MANAGER_BACKUP_EXT=${lib.escapeShellArg cfg.backupFileExtension}"}
${lib.optionalString cfg.overwriteBackup "export HOME_MANAGER_BACKUP_OVERWRITE=1"}
${lib.optionalString cfg.verbose "export VERBOSE=1"} ${lib.optionalString cfg.verbose "export VERBOSE=1"}
exec ${usercfg.home.activationPackage}/activate --driver-version ${driverVersion} >&2 exec ${usercfg.home.activationPackage}/activate --driver-version ${driverVersion} >&2
''} ''}

View file

@ -91,6 +91,10 @@ in
''; '';
}; };
overwriteBackup = mkEnableOption ''
forced overwriting of existing backup files when using `backupFileExtension`
'';
extraSpecialArgs = mkOption { extraSpecialArgs = mkOption {
type = types.attrs; type = types.attrs;
default = { }; default = { };

View file

@ -7,15 +7,18 @@
}: }:
let let
inherit (lib) mkIf;
cfg = config.home-manager; cfg = config.home-manager;
serviceEnvironment = serviceEnvironment = lib.mkMerge [
lib.optionalAttrs (cfg.backupFileExtension != null) { (mkIf cfg.verbose { VERBOSE = "1"; })
HOME_MANAGER_BACKUP_EXT = cfg.backupFileExtension;
}
// lib.optionalAttrs cfg.verbose { VERBOSE = "1"; };
(mkIf (cfg.backupFileExtension != null) {
HOME_MANAGER_BACKUP_EXT = cfg.backupFileExtension;
})
(mkIf cfg.overwriteBackup { HOME_MANAGER_BACKUP_OVERWRITE = "1"; })
];
in in
{ {
imports = [ ./common.nix ]; imports = [ ./common.nix ];
@ -41,7 +44,7 @@ in
]; ];
}; };
} }
(lib.mkIf (cfg.users != { }) { (mkIf (cfg.users != { }) {
systemd.services = lib.mapAttrs' ( systemd.services = lib.mapAttrs' (
_: usercfg: _: usercfg:
let let