[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#50873] [PATCH v3 1/8] guix home: import: Make the user to specify a
From: |
Xinglu Chen |
Subject: |
[bug#50873] [PATCH v3 1/8] guix home: import: Make the user to specify a destination directory. |
Date: |
Sat, 30 Oct 2021 12:42:27 +0200 |
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.
---
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 55e7b436c1..3f48b98ed4 100644
--- a/guix/scripts/home.scm
+++ b/guix/scripts/home.scm
@@ -40,6 +40,7 @@ (define-module (guix scripts home)
#: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 @@ (define-syntax-rule (with-store* store exp ...)
(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 611f580e85..c7c60e95e8 100644
--- a/guix/scripts/home/import.scm
+++ b/guix/scripts/home/import.scm
@@ -36,49 +36,61 @@ (define-module (guix scripts home import)
;;;
;;; 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 @@ (define (qualified-name entry)
":" 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 @@ (define name
(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 @@ (define* (home-environment-template #:key (packages #f)
(specs #f) 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 @@ (define (version-spec entry)
(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 ...)
--
2.33.0
[bug#50873] [PATCH 3/7] guix home: import: Fix module name for Bash service., Xinglu Chen, 2021/10/10
[bug#50873] [PATCH 2/7] guix home: import: Allow multiple modules to be imported for each service., Xinglu Chen, 2021/10/10
[bug#50873] [PATCH 4/7] guix home: import: Don’t use 'slurp-file-gexp'., Xinglu Chen, 2021/10/10
[bug#50873] [PATCH 6/7] doc: Document the ‘guix home import’ subcommand., Xinglu Chen, 2021/10/10
[bug#50873] [PATCH 5/7] guix home: import: Delete duplicate modules when importing., Xinglu Chen, 2021/10/10
[bug#50873] [PATCH v3 0/8] Fixes to ‘guix home import’, Xinglu Chen, 2021/10/30
- [bug#50873] [PATCH v3 1/8] guix home: import: Make the user to specify a destination directory.,
Xinglu Chen <=
- [bug#50873] [PATCH v3 6/8] doc: Document the ‘guix home import’ subcommand., Xinglu Chen, 2021/10/30
- [bug#50873] [PATCH v3 4/8] guix home: import: Don’t use 'slurp-file-gexp'., Xinglu Chen, 2021/10/30
- [bug#50873] [PATCH v3 2/8] guix home: import: Allow multiple modules to be imported for each service., Xinglu Chen, 2021/10/30
- [bug#50873] [PATCH v3 3/8] guix home: import: Fix module name for Bash service., Xinglu Chen, 2021/10/30
- [bug#50873] [PATCH v3 7/8] Add tests for ‘guix home import’., Xinglu Chen, 2021/10/30
- [bug#50873] [PATCH v3 5/8] guix home: import: Delete duplicate modules when importing., Xinglu Chen, 2021/10/30
- [bug#50873] [PATCH v3 8/8] guix home: import: Call ‘local-file’ with ‘name’, Xinglu Chen, 2021/10/30
- [bug#50873] [PATCH 0/5] Fixes to ‘guix home import’, Ludovic Courtès, 2021/10/30