guix_mirror_bot pushed a commit to branch master
in repository guix.
commit 6da26b6b9072b4f9db47374c7b7b5b2a3e933259
Author: Hilton Chain <[email protected]>
AuthorDate: Fri Feb 6 16:25:05 2026 +0800
home: symlink-manager: Handle dangling symlinks.
This is a follow-up to commit 4b9b223bff65645b61666df48c12fd1a4f735b0f.
* gnu/home/services/symlink-manager.scm (update-symlinks-script): Handle
dangling symlinks.
Fixes: #1752
Change-Id: Iedd11f84f816e3043d7bf50db240bf5ec1f3e512
Signed-off-by: Hilton Chain <[email protected]>
Merges: #6169
---
gnu/home/services/symlink-manager.scm | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/gnu/home/services/symlink-manager.scm
b/gnu/home/services/symlink-manager.scm
index d7b22d7fba..9f46f07e86 100644
--- a/gnu/home/services/symlink-manager.scm
+++ b/gnu/home/services/symlink-manager.scm
@@ -103,10 +103,21 @@ subdirectory from XDG_CONFIG_HOME to generate a target
path."
(define backup
(string-append backup-directory "/" (preprocess-file file)))
+ (define (copy-file* oldfile newfile)
+ "Like 'copy-file', but also copies dangling symlinks."
+ (catch 'system-error
+ (lambda ()
+ (copy-file oldfile newfile))
+ (lambda args
+ (if (and (eq? 'symlink (stat:type (lstat oldfile)))
+ (= ENOENT (system-error-errno args)))
+ (symlink (readlink oldfile) newfile)
+ (apply throw args)))))
+
(mkdir-p backup-directory)
(format #t (G_ "Backing up ~a...") (target-file file))
(mkdir-p (dirname backup))
- (copy-file (target-file file) backup)
+ (copy-file* (target-file file) backup)
(delete-file (target-file file))
(display (G_ " done\n")))