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>
			
			
This commit is contained in:
		
							parent
							
								
									cf0abb6cfe
								
							
						
					
					
						commit
						d5eb05f01e
					
				
					 2 changed files with 65 additions and 45 deletions
				
			
		|  | @ -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 | ||||
|  |  | |||
|  | @ -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 ...) | ||||
|  |  | |||
		Reference in a new issue