all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Ludovic Courtès" <ludo@gnu.org>
To: 54180@debbugs.gnu.org
Cc: "Ludovic Courtès" <ludo@gnu.org>
Subject: [bug#54180] [PATCH 01/12] home: symlink-manager: Clarify module imports.
Date: Sun, 27 Feb 2022 14:53:31 +0100	[thread overview]
Message-ID: <20220227135342.10296-1-ludo@gnu.org> (raw)
In-Reply-To: <20220227134006.9860-1-ludo@gnu.org>

* gnu/home/services/symlink-manager.scm (update-symlinks-script): Wrap
body in 'with-imported-modules'.  Move (guix build utils) import to the
top.  Move #$%initialize-gettext after definitions.
---
 gnu/home/services/symlink-manager.scm | 336 +++++++++++++-------------
 1 file changed, 170 insertions(+), 166 deletions(-)

diff --git a/gnu/home/services/symlink-manager.scm b/gnu/home/services/symlink-manager.scm
index 314da3ba3e..c60cdcffb7 100644
--- a/gnu/home/services/symlink-manager.scm
+++ b/gnu/home/services/symlink-manager.scm
@@ -20,7 +20,7 @@
 (define-module (gnu home services symlink-manager)
   #:use-module (gnu home services)
   #:use-module (guix gexp)
-
+  #:use-module (guix modules)
   #:export (home-symlink-manager-service-type))
 
 ;;; Comment:
@@ -37,15 +37,19 @@ (define-module (gnu home services symlink-manager)
 (define (update-symlinks-script)
   (program-file
    "update-symlinks"
-   #~(begin
-       (use-modules (ice-9 ftw)
-                    (ice-9 curried-definitions)
-                    (ice-9 match)
-                    (srfi srfi-1)
-                    (guix i18n))
-       #$%initialize-gettext
-       (define ((simplify-file-tree parent) file)
-         "Convert the result produced by `file-system-tree' to less
+   (with-imported-modules (source-module-closure
+                           '((guix build utils)
+                             (guix i18n)))
+     #~(begin
+         (use-modules (ice-9 ftw)
+                      (ice-9 curried-definitions)
+                      (ice-9 match)
+                      (srfi srfi-1)
+                      (guix i18n)
+                      (guix build utils))
+
+         (define ((simplify-file-tree parent) file)
+           "Convert the result produced by `file-system-tree' to less
 verbose and more suitable for further processing format.
 
 Extract dir/file info from stat and compose a relative path to the
@@ -60,178 +64,178 @@ (define ((simplify-file-tree parent) file)
   ((dir . \"config/isync\")
    (file . \"config/isync/mbsyncrc\"))))
 "
-         (match file
-           ((name stat) `(file . ,(string-append parent name)))
-           ((name stat children ...)
-            (cons `(dir . ,(string-append parent name))
-                  (map (simplify-file-tree
-                        (if (equal? name ".")
-                            ""
-                            (string-append parent name "/")))
-                       children)))))
+           (match file
+             ((name stat) `(file . ,(string-append parent name)))
+             ((name stat children ...)
+              (cons `(dir . ,(string-append parent name))
+                    (map (simplify-file-tree
+                          (if (equal? name ".")
+                              ""
+                              (string-append parent name "/")))
+                         children)))))
 
-       (define ((file-tree-traverse preordering) node)
-         "Traverses the file tree in different orders, depending on PREORDERING.
+         (define ((file-tree-traverse preordering) node)
+           "Traverses the file tree in different orders, depending on PREORDERING.
 
 if PREORDERING is @code{#t} resulting list will contain directories
 before files located in those directories, otherwise directory will
 appear only after all nested items already listed."
-         (let ((prepend (lambda (a b) (append b a))))
-           (match node
-             (('file . path) (list node))
-             ((('dir . path) . rest)
-              ((if preordering append prepend)
-               (list (cons 'dir path))
-               (append-map (file-tree-traverse preordering) rest))))))
-
-       (use-modules (guix build utils))
-
-       (let* ((config-home    (or (getenv "XDG_CONFIG_HOME")
-                                  (string-append (getenv "HOME") "/.config")))
-
-              (he-path (string-append (getenv "HOME") "/.guix-home"))
-              (new-he-path (string-append he-path ".new"))
-              (new-home (getenv "GUIX_NEW_HOME"))
-              (old-home (getenv "GUIX_OLD_HOME"))
-
-              (new-files-path (string-append new-home "/files"))
-              ;; Trailing dot is required, because files itself is symlink and
-              ;; to make file-system-tree works it should be a directory.
-              (new-files-dir-path (string-append new-files-path "/."))
-
-              (home-path (getenv "HOME"))
-              (backup-dir (string-append home-path "/"
-                                         (number->string (current-time))
-                                         "-guix-home-legacy-configs-backup"))
-
-              (old-tree (if old-home
-                          ((simplify-file-tree "")
-                           (file-system-tree
-                            (string-append old-home "/files/.")))
-                          #f))
-              (new-tree ((simplify-file-tree "")
-                         (file-system-tree new-files-dir-path)))
-
-              (get-source-path
-               (lambda (path)
-                 (readlink (string-append new-files-path "/" path))))
-
-              (get-target-path
-               (lambda (path)
-                 (string-append home-path "/." path)))
-
-              (get-backup-path
-               (lambda (path)
-                 (string-append backup-dir "/." path)))
-
-              (directory?
-               (lambda (path)
-                 (equal? (stat:type (stat path)) 'directory)))
-
-              (empty-directory?
-               (lambda (dir)
-                 (equal? (scandir dir) '("." ".."))))
-
-              (symlink-to-store?
-               (lambda (path)
-                 (and
-                  (equal? (stat:type (lstat path)) 'symlink)
-                  (store-file-name? (readlink path)))))
-
-              (backup-file
-               (lambda (path)
-                 (mkdir-p backup-dir)
-                 (format #t (G_ "Backing up ~a...") (get-target-path path))
-                 (mkdir-p (dirname (get-backup-path path)))
-                 (rename-file (get-target-path path) (get-backup-path path))
-                 (display (G_ " done\n"))))
-
-              (cleanup-symlinks
-               (lambda ()
-                 (let ((to-delete ((file-tree-traverse #f) old-tree)))
-                   (display
-                    (G_
-                    "Cleaning up symlinks from previous home-environment.\n\n"))
-                   (map
-                    (match-lambda
-                      (('dir . ".")
-                       (display (G_ "Cleanup finished.\n\n")))
-
-                      (('dir . path)
-                       (if (and
-                            (file-exists? (get-target-path path))
-                            (directory? (get-target-path path))
-                            (empty-directory? (get-target-path path)))
-                           (begin
-                             (format #t (G_ "Removing ~a...")
-                                     (get-target-path path))
-                             (rmdir (get-target-path path))
-                             (display (G_ " done\n")))
-                           (format
-                            #t
-                            (G_ "Skipping ~a (not an empty directory)... done\n")
-                            (get-target-path path))))
-
-                      (('file . path)
-                       (when (file-exists? (get-target-path path))
-                         ;; DO NOT remove the file if it is no longer
-                         ;; a symlink to the store, it will be backed
-                         ;; up later during create-symlinks phase.
-                         (if (symlink-to-store? (get-target-path path))
+           (let ((prepend (lambda (a b) (append b a))))
+             (match node
+               (('file . path) (list node))
+               ((('dir . path) . rest)
+                ((if preordering append prepend)
+                 (list (cons 'dir path))
+                 (append-map (file-tree-traverse preordering) rest))))))
+
+         #$%initialize-gettext
+
+         (let* ((config-home    (or (getenv "XDG_CONFIG_HOME")
+                                    (string-append (getenv "HOME") "/.config")))
+
+                (he-path (string-append (getenv "HOME") "/.guix-home"))
+                (new-he-path (string-append he-path ".new"))
+                (new-home (getenv "GUIX_NEW_HOME"))
+                (old-home (getenv "GUIX_OLD_HOME"))
+
+                (new-files-path (string-append new-home "/files"))
+                ;; Trailing dot is required, because files itself is symlink and
+                ;; to make file-system-tree works it should be a directory.
+                (new-files-dir-path (string-append new-files-path "/."))
+
+                (home-path (getenv "HOME"))
+                (backup-dir (string-append home-path "/"
+                                           (number->string (current-time))
+                                           "-guix-home-legacy-configs-backup"))
+
+                (old-tree (if old-home
+                              ((simplify-file-tree "")
+                               (file-system-tree
+                                (string-append old-home "/files/.")))
+                              #f))
+                (new-tree ((simplify-file-tree "")
+                           (file-system-tree new-files-dir-path)))
+
+                (get-source-path
+                 (lambda (path)
+                   (readlink (string-append new-files-path "/" path))))
+
+                (get-target-path
+                 (lambda (path)
+                   (string-append home-path "/." path)))
+
+                (get-backup-path
+                 (lambda (path)
+                   (string-append backup-dir "/." path)))
+
+                (directory?
+                 (lambda (path)
+                   (equal? (stat:type (stat path)) 'directory)))
+
+                (empty-directory?
+                 (lambda (dir)
+                   (equal? (scandir dir) '("." ".."))))
+
+                (symlink-to-store?
+                 (lambda (path)
+                   (and
+                    (equal? (stat:type (lstat path)) 'symlink)
+                    (store-file-name? (readlink path)))))
+
+                (backup-file
+                 (lambda (path)
+                   (mkdir-p backup-dir)
+                   (format #t (G_ "Backing up ~a...") (get-target-path path))
+                   (mkdir-p (dirname (get-backup-path path)))
+                   (rename-file (get-target-path path) (get-backup-path path))
+                   (display (G_ " done\n"))))
+
+                (cleanup-symlinks
+                 (lambda ()
+                   (let ((to-delete ((file-tree-traverse #f) old-tree)))
+                     (display
+                      (G_
+                       "Cleaning up symlinks from previous home-environment.\n\n"))
+                     (map
+                      (match-lambda
+                        (('dir . ".")
+                         (display (G_ "Cleanup finished.\n\n")))
+
+                        (('dir . path)
+                         (if (and
+                              (file-exists? (get-target-path path))
+                              (directory? (get-target-path path))
+                              (empty-directory? (get-target-path path)))
                              (begin
-                               (format #t (G_ "Removing ~a...") (get-target-path path))
-                               (delete-file (get-target-path path))
+                               (format #t (G_ "Removing ~a...")
+                                       (get-target-path path))
+                               (rmdir (get-target-path path))
                                (display (G_ " done\n")))
                              (format
                               #t
-                              (G_ "Skipping ~a (not a symlink to store)... done\n")
-                              (get-target-path path))))))
-                    to-delete))))
+                              (G_ "Skipping ~a (not an empty directory)... done\n")
+                              (get-target-path path))))
 
-              (create-symlinks
-               (lambda ()
-                 (let ((to-create ((file-tree-traverse #t) new-tree)))
-                   (map
-                    (match-lambda
-                      (('dir . ".")
-                       (display
-                        (G_ "New symlinks to home-environment will be created soon.\n"))
-                       (format
-                        #t (G_ "All conflicting files will go to ~a.\n\n") backup-dir))
+                        (('file . path)
+                         (when (file-exists? (get-target-path path))
+                           ;; DO NOT remove the file if it is no longer
+                           ;; a symlink to the store, it will be backed
+                           ;; up later during create-symlinks phase.
+                           (if (symlink-to-store? (get-target-path path))
+                               (begin
+                                 (format #t (G_ "Removing ~a...") (get-target-path path))
+                                 (delete-file (get-target-path path))
+                                 (display (G_ " done\n")))
+                               (format
+                                #t
+                                (G_ "Skipping ~a (not a symlink to store)... done\n")
+                                (get-target-path path))))))
+                      to-delete))))
 
-                      (('dir . path)
-                       (let ((target-path (get-target-path path)))
-                         (when (and (file-exists? target-path)
-                                    (not (directory? target-path)))
+                (create-symlinks
+                 (lambda ()
+                   (let ((to-create ((file-tree-traverse #t) new-tree)))
+                     (map
+                      (match-lambda
+                        (('dir . ".")
+                         (display
+                          (G_ "New symlinks to home-environment will be created soon.\n"))
+                         (format
+                          #t (G_ "All conflicting files will go to ~a.\n\n") backup-dir))
+
+                        (('dir . path)
+                         (let ((target-path (get-target-path path)))
+                           (when (and (file-exists? target-path)
+                                      (not (directory? target-path)))
+                             (backup-file path))
+
+                           (if (file-exists? target-path)
+                               (format
+                                #t (G_ "Skipping   ~a (directory already exists)... done\n")
+                                target-path)
+                               (begin
+                                 (format #t (G_ "Creating   ~a...") target-path)
+                                 (mkdir target-path)
+                                 (display (G_ " done\n"))))))
+
+                        (('file . path)
+                         (when (file-exists? (get-target-path path))
                            (backup-file path))
+                         (format #t (G_ "Symlinking ~a -> ~a...")
+                                 (get-target-path path) (get-source-path path))
+                         (symlink (get-source-path path) (get-target-path path))
+                         (display (G_ " done\n"))))
+                      to-create)))))
 
-                         (if (file-exists? target-path)
-                             (format
-                              #t (G_ "Skipping   ~a (directory already exists)... done\n")
-                              target-path)
-                             (begin
-                               (format #t (G_ "Creating   ~a...") target-path)
-                               (mkdir target-path)
-                               (display (G_ " done\n"))))))
+           (when old-tree
+             (cleanup-symlinks))
 
-                      (('file . path)
-                       (when (file-exists? (get-target-path path))
-                         (backup-file path))
-                       (format #t (G_ "Symlinking ~a -> ~a...")
-                               (get-target-path path) (get-source-path path))
-                       (symlink (get-source-path path) (get-target-path path))
-                       (display (G_ " done\n"))))
-                    to-create)))))
+           (create-symlinks)
 
-         (when old-tree
-           (cleanup-symlinks))
+           (symlink new-home new-he-path)
+           (rename-file new-he-path he-path)
 
-         (create-symlinks)
-
-         (symlink new-home new-he-path)
-         (rename-file new-he-path he-path)
-
-         (display (G_" done\nFinished updating symlinks.\n\n"))))))
+           (display (G_" done\nFinished updating symlinks.\n\n")))))))
 
 
 (define (update-symlinks-gexp _)
-- 
2.34.0





  reply	other threads:[~2022-02-27 14:00 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-27 13:40 [bug#54180] [PATCH 00/12] Home: Clarify and better test symlink-manager.scm Ludovic Courtès
2022-02-27 13:53 ` Ludovic Courtès [this message]
2022-02-27 13:53   ` [bug#54180] [PATCH 02/12] home: symlink-manager: Move helper procedures as top-level defines Ludovic Courtès
2022-02-27 15:58     ` Maxime Devos
2022-03-10 10:28       ` [bug#54180] [PATCH 00/12] Home: Clarify and better test symlink-manager.scm Ludovic Courtès
2022-02-27 13:53   ` [bug#54180] [PATCH 03/12] home: symlink-manager: Use 'for-each' when used for effects Ludovic Courtès
2022-02-27 13:53   ` [bug#54180] [PATCH 04/12] home: symlink-manager: Use 'file-is-directory?' Ludovic Courtès
2022-02-27 13:53   ` [bug#54180] [PATCH 05/12] home: symlink-manager: Remove 'empty-directory?' and avoid TOCTTOU race Ludovic Courtès
2022-02-27 15:54     ` Maxime Devos
2022-03-05 22:19       ` [bug#54180] [PATCH 00/12] Home: Clarify and better test symlink-manager.scm Ludovic Courtès
2022-03-05 22:37         ` Maxime Devos
2022-02-27 13:53   ` [bug#54180] [PATCH 06/12] home: symlink-manager: Avoid extra 'lstat' call Ludovic Courtès
2022-02-27 15:52     ` Maxime Devos
2022-02-27 13:53   ` [bug#54180] [PATCH 07/12] tests: Make sure 'guix home reconfigure' backs up files Ludovic Courtès
2022-02-27 13:53   ` [bug#54180] [PATCH 08/12] tests: Simplify use of 'local-file' in 'tests/guix-home.sh' Ludovic Courtès
2022-02-27 13:53   ` [bug#54180] [PATCH 09/12] tests: Check 'guix home reconfigure' for a second generation Ludovic Courtès
2022-02-27 15:49     ` Maxime Devos
2022-03-05 22:20       ` [bug#54180] [PATCH 00/12] Home: Clarify and better test symlink-manager.scm Ludovic Courtès
2022-03-05 22:27         ` Maxime Devos
2022-03-05 22:38           ` Maxime Devos
2022-03-10 10:24             ` Ludovic Courtès
2022-03-10 10:23           ` Ludovic Courtès
2022-02-27 13:53   ` [bug#54180] [PATCH 10/12] home: symlink-manager: 'cleanup-symlinks' uses 'file-system-fold' Ludovic Courtès
2022-02-27 13:53   ` [bug#54180] [PATCH 11/12] home: symlink-manager: 'create-symlinks' " Ludovic Courtès
2022-02-27 16:00     ` Maxime Devos
2022-02-27 13:53   ` [bug#54180] [PATCH 12/12] home: symlink-manager: Rename "path" to "file" where appropriate Ludovic Courtès
2022-02-28  7:53 ` [bug#54180] [PATCH 00/12] Home: Clarify and better test symlink-manager.scm Andrew Tropin
2022-03-10 10:45 ` bug#54180: " Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220227135342.10296-1-ludo@gnu.org \
    --to=ludo@gnu.org \
    --cc=54180@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.