mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-27 14:52:05 -05:00
76c58ed59c
* guix/scripts/home/import.scm (manifest+configuration-files->code): Insert calls to 'comment' and 'vertical-space'. (import-manifest): Use 'pretty-print-with-comments/splice' instead of a loop on 'pretty-print'. * tests/home-import.scm (remove-recursively): New procedure. (eval-test-with-home-environment): Use it.
227 lines
7 KiB
Scheme
227 lines
7 KiB
Scheme
;;; GNU Guix --- Functional package management for GNU
|
|
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
|
|
;;; Copyright © 2022 Arjan Adriaanse <arjan@adriaan.se>
|
|
;;;
|
|
;;; 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 (test-home-import)
|
|
#:use-module (guix scripts home import)
|
|
#:use-module (guix utils)
|
|
#:use-module (guix build utils)
|
|
#:use-module (guix packages)
|
|
#:use-module (ice-9 match)
|
|
#:use-module ((guix read-print) #:select (blank?))
|
|
#:use-module ((guix profiles) #:hide (manifest->code))
|
|
#:use-module ((guix build syscalls) #:select (mkdtemp!))
|
|
#:use-module ((guix scripts package)
|
|
#:select (manifest-entry-version-prefix))
|
|
#:use-module (gnu packages)
|
|
#:use-module (srfi srfi-1)
|
|
#:use-module (srfi srfi-26)
|
|
#:use-module (srfi srfi-64))
|
|
|
|
;; Test the (guix scripts home import) tools.
|
|
|
|
(test-begin "home-import")
|
|
|
|
;; Example manifest entries.
|
|
|
|
(define guile-2.0.9
|
|
(manifest-entry
|
|
(name "guile")
|
|
(version "2.0.9")
|
|
(item "/gnu/store/...")))
|
|
|
|
(define glibc
|
|
(manifest-entry
|
|
(name "glibc")
|
|
(version "2.19")
|
|
(item "/gnu/store/...")))
|
|
|
|
(define gcc
|
|
(manifest-entry
|
|
(name "gcc")
|
|
(version "")
|
|
(output "lib")
|
|
(item "/gnu/store/...")))
|
|
|
|
;; Helpers for checking and generating home environments.
|
|
|
|
(define %destination-directory "/tmp/guix-config")
|
|
(mkdir-p %destination-directory)
|
|
|
|
(define %temporary-home-directory (mkdtemp! "/tmp/guix-home-import.XXXXXX"))
|
|
|
|
(define-syntax-rule (define-home-environment-matcher name pattern)
|
|
(define (name obj)
|
|
(match obj
|
|
(pattern #t)
|
|
(x (pk 'fail x #f)))))
|
|
|
|
(define (create-temporary-home files-alist)
|
|
"Create a temporary home directory in '%temporary-home-directory'.
|
|
FILES-ALIST is an association list of files and the content of the
|
|
corresponding file."
|
|
(define (create-file file content)
|
|
(let ((absolute-path (string-append %temporary-home-directory "/" file)))
|
|
(unless (file-exists? absolute-path)
|
|
(mkdir-p (dirname absolute-path)))
|
|
(call-with-output-file absolute-path
|
|
(cut display content <>))))
|
|
|
|
(for-each (match-lambda
|
|
((file . content) (create-file file content)))
|
|
files-alist))
|
|
|
|
(define (remove-recursively pred sexp)
|
|
"Like SRFI-1 'remove', but recurse within SEXP."
|
|
(let loop ((sexp sexp))
|
|
(match sexp
|
|
((lst ...)
|
|
(map loop (remove pred lst)))
|
|
(x x))))
|
|
|
|
(define (eval-test-with-home-environment files-alist manifest matcher)
|
|
(create-temporary-home files-alist)
|
|
(setenv "HOME" %temporary-home-directory)
|
|
(mkdir-p %temporary-home-directory)
|
|
(let* ((home-environment (manifest+configuration-files->code
|
|
manifest %destination-directory))
|
|
(result (matcher (remove-recursively blank? home-environment))))
|
|
(delete-file-recursively %temporary-home-directory)
|
|
result))
|
|
|
|
(define-home-environment-matcher match-home-environment-no-services
|
|
('begin
|
|
('use-modules
|
|
('gnu 'home)
|
|
('gnu 'packages)
|
|
('gnu 'services))
|
|
('home-environment
|
|
('packages
|
|
('specifications->packages
|
|
('list "guile@2.0.9" "gcc:lib" "glibc@2.19")))
|
|
('services
|
|
('list)))))
|
|
|
|
(define-home-environment-matcher match-home-environment-transformations
|
|
('begin
|
|
('use-modules
|
|
('gnu 'home)
|
|
('gnu 'packages)
|
|
('gnu 'services)
|
|
('guix 'transformations))
|
|
|
|
('define transform ('options->transformation _))
|
|
('home-environment
|
|
('packages
|
|
('list (transform ('specification->package "guile@2.0.9"))
|
|
('list ('specification->package "gcc") "lib")
|
|
('specification->package "glibc@2.19")))
|
|
('services ('list)))))
|
|
|
|
(define-home-environment-matcher match-home-environment-no-services-nor-packages
|
|
('begin
|
|
('use-modules
|
|
('gnu 'home)
|
|
('gnu 'packages)
|
|
('gnu 'services))
|
|
('home-environment
|
|
('packages
|
|
('specifications->packages ('list)))
|
|
('services
|
|
('list)))))
|
|
|
|
(define-home-environment-matcher match-home-environment-bash-service
|
|
('begin
|
|
('use-modules
|
|
('gnu 'home)
|
|
('gnu 'packages)
|
|
('gnu 'services)
|
|
('guix 'gexp)
|
|
('gnu 'home 'services 'shells))
|
|
('home-environment
|
|
('packages
|
|
('specifications->packages ('list)))
|
|
('services
|
|
('list ('service
|
|
'home-bash-service-type
|
|
('home-bash-configuration
|
|
('aliases ('quote ()))
|
|
('bashrc
|
|
('list ('local-file "/tmp/guix-config/.bashrc"
|
|
"bashrc"))))))))))
|
|
|
|
(define-home-environment-matcher match-home-environment-bash-service-with-alias
|
|
('begin
|
|
('use-modules
|
|
('gnu 'home)
|
|
('gnu 'packages)
|
|
('gnu 'services)
|
|
('guix 'gexp)
|
|
('gnu 'home 'services 'shells))
|
|
('home-environment
|
|
('packages
|
|
('specifications->packages ('list)))
|
|
('services
|
|
('list ('service
|
|
'home-bash-service-type
|
|
('home-bash-configuration
|
|
('aliases
|
|
('quote (("grep" . "grep --exclude-from=\"$HOME/.grep-exclude\"")
|
|
("ls" . "ls -p"))))
|
|
('bashrc
|
|
('list ('local-file "/tmp/guix-config/.bashrc"
|
|
"bashrc"))))))))))
|
|
|
|
|
|
(test-assert "manifest->code: No services"
|
|
(eval-test-with-home-environment
|
|
'()
|
|
(make-manifest (list guile-2.0.9 gcc glibc))
|
|
match-home-environment-no-services))
|
|
|
|
(test-assert "manifest->code: No services, package transformations"
|
|
(eval-test-with-home-environment
|
|
'()
|
|
(make-manifest (list (manifest-entry
|
|
(inherit guile-2.0.9)
|
|
(properties `((transformations
|
|
. ((foo . "bar"))))))
|
|
gcc glibc))
|
|
match-home-environment-transformations))
|
|
|
|
(test-assert "manifest->code: No packages nor services"
|
|
(eval-test-with-home-environment
|
|
'()
|
|
(make-manifest '())
|
|
match-home-environment-no-services-nor-packages))
|
|
|
|
(test-assert "manifest->code: Bash service"
|
|
(eval-test-with-home-environment
|
|
'((".bashrc" . "echo 'hello guix'"))
|
|
(make-manifest '())
|
|
match-home-environment-bash-service))
|
|
|
|
(test-assert "manifest->code: Bash service with aliases"
|
|
(eval-test-with-home-environment
|
|
'((".bashrc"
|
|
. "# Aliases
|
|
alias ls=\"ls -p\"; alias grep='grep --exclude-from=\"$HOME/.grep-exclude\"'\n"))
|
|
(make-manifest '())
|
|
match-home-environment-bash-service-with-alias))
|
|
|
|
(test-end "home-import")
|