services: guix: Gracefully handle dangling symlink for ‘machines.scm’.

Previously, if /etc/guix/machines.scm was a dangling symlink, it would
be kept (because ‘file-exists?’ would return #f) and thus the following
‘symlink’ call would throw with EEXIST.

* gnu/services/base.scm (guix-machines-files-installation): Use ‘lstat’
rather than ‘file-exists?’.

Change-Id: I07c7eed842dacabbd19ae2a17ac3e59cf26e46b2
This commit is contained in:
Ludovic Courtès 2024-04-06 11:51:31 +02:00
parent 0b941ea062
commit 91e1a457b5
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -1790,13 +1790,14 @@ (define machines-file
;; If MACHINES-FILE already exists, move it out of the way.
;; Create a backup if it's a regular file: it's likely that the
;; user manually updated it.
(if (file-exists? machines-file)
(if (and (symbolic-link? machines-file)
(store-file-name? (readlink machines-file)))
(delete-file machines-file)
(rename-file machines-file
(string-append machines-file ".bak")))
(mkdir-p (dirname machines-file)))
(let ((stat (false-if-exception (lstat machines-file))))
(if stat
(if (and (eq? 'symlink (stat:type stat))
(store-file-name? (readlink machines-file)))
(delete-file machines-file)
(rename-file machines-file
(string-append machines-file ".bak")))
(mkdir-p (dirname machines-file))))
;; Installed the declared machines file.
(symlink #+(scheme-file "machines.scm"