guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/15: guix home: import: Make the user to specify a destination directo


From: guix-commits
Subject: 01/15: guix home: import: Make the user to specify a destination directory.
Date: Sat, 30 Oct 2021 18:52:32 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit d5eb05f01ea59da8435e9df4f15835edbb31a30e
Author: Xinglu Chen <public@yoctocell.xyz>
AuthorDate: Sat Oct 30 12:42:27 2021 +0200

    guix home: import: Make the user to specify a destination directory.
    
    Copy the appropriate the relevant configuration files to the destination
    directory, and call ‘local-file’ on them.
    
    Without this, ‘guix home import’ will generate a service declaration like 
this
    
      (service
       home-bash-service-type
       (home-bash-configuration
        (bashrc
         (list (slurp-file-gexp
                (local-file "/home/yoctocell/.bashrc"))))))
    
    but when running ‘guix home reconfigure’, the ~/.bashrc file would be 
moved, so
    when running ‘guix home reconfigure’ for the second time, it would read the
    ~/.bashrc which is itself a symlink to a file the store.
    
    * guix/scripts/home/import.scm (generate-bash-module+configuration): Take
    ‘destination-directory’ parameter
    (modules+configurations): Copy the user’s configuration file to
    ‘%destination-directory’.
    * guix/scripts/home.scm (process-command): Adjust accordingly; create
    ‘destination’ if it doesn’t exist.
    
    Signed-off-by: Ludovic Courtès <ludo@gnu.org>
---
 guix/scripts/home.scm        | 24 ++++++++-----
 guix/scripts/home/import.scm | 86 +++++++++++++++++++++++++-------------------
 2 files changed, 65 insertions(+), 45 deletions(-)

diff --git a/guix/scripts/home.scm b/guix/scripts/home.scm
index 55e7b43..3f48b98 100644
--- a/guix/scripts/home.scm
+++ b/guix/scripts/home.scm
@@ -40,6 +40,7 @@
   #:autoload   (guix scripts pull) (channel-commit-hyperlink)
   #:use-module (guix scripts home import)
   #:use-module ((guix status) #:select (with-status-verbosity))
+  #:use-module ((guix build utils) #:select (mkdir-p))
   #:use-module (guix gexp)
   #:use-module (guix monads)
   #:use-module (srfi srfi-1)
@@ -260,15 +261,20 @@ argument list and OPTS is the option alist."
      (apply search args))
     ((import)
      (let* ((profiles (delete-duplicates
-                      (match (filter-map (match-lambda
-                                           (('profile . p) p)
-                                           (_              #f))
-                                         opts)
-                        (() (list %current-profile))
-                        (lst (reverse lst)))))
-           (manifest (concatenate-manifests
-                      (map profile-manifest profiles))))
-       (import-manifest manifest (current-output-port))))
+                       (match (filter-map (match-lambda
+                                            (('profile . p) p)
+                                            (_              #f))
+                                          opts)
+                         (() (list %current-profile))
+                         (lst (reverse lst)))))
+            (manifest (concatenate-manifests
+                       (map profile-manifest profiles)))
+            (destination (match args
+                           ((destination) destination)
+                           (_ (leave (G_ "wrong number of arguments~%"))))))
+       (unless (file-exists? destination)
+         (mkdir-p destination))
+       (import-manifest manifest destination (current-output-port))))
     ((describe)
      (match (generation-number %guix-home)
        (0
diff --git a/guix/scripts/home/import.scm b/guix/scripts/home/import.scm
index 611f580..c7c60e9 100644
--- a/guix/scripts/home/import.scm
+++ b/guix/scripts/home/import.scm
@@ -36,49 +36,61 @@
 ;;;
 ;;; Code:
 
+(define (generate-bash-configuration+modules destination-directory)
+  (define (destination-append path)
+    (string-append destination-directory "/" path))
 
-(define (generate-bash-module+configuration)
-  (let ((rc (string-append (getenv "HOME") "/.bashrc"))
-        (profile (string-append (getenv "HOME") "/.bash_profile"))
-        (logout (string-append (getenv "HOME") "/.bash_logout")))
-    `((gnu home services bash)
+  (let ((rc (destination-append ".bashrc"))
+        (profile (destination-append ".bash_profile"))
+        (logout (destination-append ".bash_logout")))
+    `((gnu home-services bash)
       (service home-bash-service-type
-                 (home-bash-configuration
-                  ,@(if (file-exists? rc)
-                        `((bashrc
-                           (list (local-file ,rc))))
-                        '())
-                  ,@(if (file-exists? profile)
-                        `((bash-profile
-                           (list (local-file ,profile))))
-                        '())
-                  ,@(if (file-exists? logout)
-                        `((bash-logout
-                           (list (local-file ,logout))))
-                        '()))))))
-
+               (home-bash-configuration
+                ,@(if (file-exists? rc)
+                      `((bashrc
+                         (list (slurp-file-gexp
+                                (local-file ,rc)))))
+                      '())
+                ,@(if (file-exists? profile)
+                      `((bash-profile
+                         (list (slurp-file-gexp
+                                (local-file ,profile)))))
+                      '())
+                ,@(if (file-exists? logout)
+                      `((bash-logout
+                         (list (slurp-file-gexp
+                                (local-file ,logout)))))
+                      '()))))))
 
 (define %files-configurations-alist
   `((".bashrc" . ,generate-bash-module+configuration)
     (".bash_profile" . ,generate-bash-module+configuration)
     (".bash_logout" . ,generate-bash-module+configuration)))
 
-(define (modules+configurations)
-  (let ((configurations (delete-duplicates
-                         (filter-map (match-lambda
-                                ((file . proc)
-                                 (if (file-exists?
-                                      (string-append (getenv "HOME") "/" file))
-                                     proc
-                                     #f)))
-                                     %files-configurations-alist)
-                         (lambda (x y)
-                           (equal? (procedure-name x) (procedure-name y))))))
-    (map (lambda (proc) (proc)) configurations)))
+(define (configurations+modules destination-directory)
+  "Return a list of procedures which when called, generate code for a home
+service declaration."
+  (define configurations
+    (delete-duplicates
+     (filter-map (match-lambda
+                   ((file . proc)
+                    (let ((absolute-path (string-append (getenv "HOME")
+                                                        "/" file)))
+                      (and (file-exists? absolute-path)
+                           (begin
+                             (copy-file absolute-path
+                                        (string-append
+                                         destination-directory "/" file))
+                             proc)))))
+                 %files+configurations-alist)
+     (lambda (x y)
+       (equal? (procedure-name x) (procedure-name y)))))
+  
+  (map (lambda (proc) (proc destination-directory)) configurations))
 
 ;; Based on `manifest->code' from (guix profiles)
 ;; MAYBE: Upstream it?
-(define* (manifest->code manifest
+(define* (manifest->code manifest destination-directory
                          #:key
                          (entry-package-version (const ""))
                          (home-environment? #f))
@@ -129,7 +141,8 @@ available."
                                                    ":" output))))
                         (manifest-entries manifest))))
         (if home-environment?
-            (let ((modules+configurations (modules+configurations)))
+            (let ((configurations+modules
+                   (configurations+modules destination-directory)))
               `(begin
                (use-modules (gnu home)
                             (gnu packages)
@@ -171,7 +184,8 @@ available."
                              (options->transformation ',options))))
                        transformation-procedures)))
         (if home-environment?
-            (let ((modules+configurations (modules+configurations)))
+            (let ((configurations+modules
+                   (configurations+modules destination-directory)))
               `(begin
                  (use-modules (guix transformations)
                               (gnu home)
@@ -204,7 +218,7 @@ containing PACKAGES, or SPECS (package specifications), and 
SERVICES."
      (services (list ,@services))))
 
 (define* (import-manifest
-          manifest
+          manifest destination-directory
           #:optional (port (current-output-port)))
   "Write to PORT a <home-environment> corresponding to MANIFEST."
   (define (version-spec entry)
@@ -227,7 +241,7 @@ containing PACKAGES, or SPECS (package specifications), and 
SERVICES."
                (version-unique-prefix (manifest-entry-version entry)
                                       versions)))))))
 
-  (match (manifest->code manifest
+  (match (manifest->code manifest destination-directory
                          #:entry-package-version version-spec
                          #:home-environment? #t)
     (('begin exp ...)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]