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")))
 

Reply via email to