diff options
Diffstat (limited to 'gnu/home')
-rw-r--r-- | gnu/home/services.scm | 55 | ||||
-rw-r--r-- | gnu/home/services/guix.scm | 44 | ||||
-rw-r--r-- | gnu/home/services/shells.scm | 23 |
3 files changed, 91 insertions, 31 deletions
diff --git a/gnu/home/services.scm b/gnu/home/services.scm index 5ee3357792..b05ec53e2a 100644 --- a/gnu/home/services.scm +++ b/gnu/home/services.scm @@ -46,6 +46,7 @@ home-run-on-change-service-type home-provenance-service-type + environment-variable-shell-definitions home-files-directory xdg-configuration-files-directory xdg-data-files-directory @@ -169,6 +170,34 @@ packages, configuration files, activation script, and so on."))) configuration files that the user has declared in their @code{home-environment} record."))) +(define (environment-variable-shell-definitions variables) + "Return a gexp that evaluates to a list of POSIX shell statements defining +VARIABLES, a list of environment variable name/value pairs. The returned code +ensures variable values are properly quoted." + #~(let ((shell-quote + (lambda (value) + ;; Double-quote VALUE, leaving dollar sign as is. + (let ((quoted (list->string + (string-fold-right + (lambda (chr lst) + (case chr + ((#\" #\\) + (append (list chr #\\) lst)) + (else (cons chr lst)))) + '() + value)))) + (string-append "\"" quoted "\""))))) + (string-append + #$@(map (match-lambda + ((key . #f) + "") + ((key . #t) + #~(string-append "export " #$key "\n")) + ((key . value) + #~(string-append "export " #$key "=" + (shell-quote #$value) "\n"))) + variables)))) + (define (environment-variables->setup-environment-script vars) "Return a file that can be sourced by a POSIX compliant shell which initializes the environment. The file will source the home @@ -181,7 +210,7 @@ If value is @code{#f} variable will be omitted. If value is @code{#t} variable will be just exported. For any other, value variable will be set to the @code{value} and exported." - (define (warn-about-duplicate-defenitions) + (define (warn-about-duplicate-definitions) (fold (lambda (x acc) (when (equal? (car x) (car acc)) @@ -192,15 +221,18 @@ exported." (sort vars (lambda (a b) (string<? (car a) (car b)))))) - (warn-about-duplicate-defenitions) + (warn-about-duplicate-definitions) (with-monad %store-monad (return `(("setup-environment" ;; TODO: It's necessary to source ~/.guix-profile too ;; on foreign distros - ,(apply mixed-text-file "setup-environment" - "\ + ,(computed-file "setup-environment" + #~(call-with-output-file #$output + (lambda (port) + (set-port-encoding! port "UTF-8") + (display "\ HOME_ENVIRONMENT=$HOME/.guix-home GUIX_PROFILE=\"$HOME_ENVIRONMENT/profile\" PROFILE_FILE=\"$HOME_ENVIRONMENT/profile/etc/profile\" @@ -227,17 +259,10 @@ case $XCURSOR_PATH in *) export XCURSOR_PATH=$HOME_ENVIRONMENT/profile/share/icons:$XCURSOR_PATH ;; esac -" - - (append-map - (match-lambda - ((key . #f) - '()) - ((key . #t) - (list "export " key "\n")) - ((key . value) - (list "export " key "=" value "\n"))) - vars))))))) +" port) + (display + #$(environment-variable-shell-definitions vars) + port))))))))) (define home-environment-variables-service-type (service-type (name 'home-environment-variables) diff --git a/gnu/home/services/guix.scm b/gnu/home/services/guix.scm new file mode 100644 index 0000000000..819b20b6c9 --- /dev/null +++ b/gnu/home/services/guix.scm @@ -0,0 +1,44 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2022 Reily Siegel <[email protected]> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu home services guix) + #:use-module (gnu home services) + #:use-module (guix channels) + #:use-module (guix gexp) + #:use-module (ice-9 pretty-print) + #:use-module (srfi srfi-1) + #:export (home-channels-service-type)) + +(define (channels-xdg-files channels) + `(("guix/channels.scm" + ,(plain-file + "channels.scm" + (call-with-output-string + (lambda (port) + (pretty-print (cons 'list (map channel->code channels)) port))))))) + +(define home-channels-service-type + (service-type + (name 'home-channels) + (default-value %default-channels) + (compose concatenate) + (extend append) + (extensions + (list (service-extension home-xdg-configuration-files-service-type + channels-xdg-files))) + (description "Manages the per-user Guix channels specification."))) diff --git a/gnu/home/services/shells.scm b/gnu/home/services/shells.scm index fd5a66090d..172e58a9ff 100644 --- a/gnu/home/services/shells.scm +++ b/gnu/home/services/shells.scm @@ -111,16 +111,7 @@ service type can be extended with a list of file-like objects."))) (define (serialize-boolean field-name val) "") (define (serialize-posix-env-vars field-name val) - #~(string-append - #$@(map - (match-lambda - ((key . #f) - "") - ((key . #t) - #~(string-append "export " #$key "\n")) - ((key . value) - #~(string-append "export " #$key "=" #$value "\n"))) - val))) + (environment-variable-shell-definitions val)) ;;; @@ -192,9 +183,9 @@ another process for example).")) (mixed-text-file "zprofile" "\ -# Setups system and user profiles and related variables +# Set up the system, user profile, and related variables. source /etc/profile -# Setups home environment profile +# Set up the home environment profile. source ~/.profile # It's only necessary if zsh is a login shell, otherwise profiles will @@ -443,9 +434,9 @@ alias grep='grep --color=auto'\n") ,(mixed-text-file "bash_profile" "\ -# Setups system and user profiles and related variables +# Set up the system, user profile, and related variables. # /etc/profile will be sourced by bash automatically -# Setups home environment profile +# Set up the home environment profile. if [ -f ~/.profile ]; then source ~/.profile; fi # Honor per-interactive-shell startup file @@ -555,9 +546,9 @@ with text blocks from other extensions and the base service.")) ((key . #f) "") ((key . #t) - #~(string-append "set " #$key "\n")) + #~(string-append "set -x " #$key "\n")) ((key . value) - #~(string-append "set " #$key " " #$value "\n"))) + #~(string-append "set -x " #$key " " #$value "\n"))) val))) (define-configuration home-fish-configuration |