Ricardo Wurmus <rek...@elephly.net> writes: > * can we avoid this by extending modify-services to support “delete” > much like modify-phases, and suggesting to use that instead of > “remove”?
The attached patch does this. What do you think? -- Ricardo
>From 40c1208cbe9cbfa58ee385ef6ee06b775d309753 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus <rek...@elephly.net> Date: Sun, 10 May 2020 23:29:38 +0200 Subject: [PATCH] services: Support DELETE in MODIFY-SERVICES macro. * gnu/services.scm (%modify-service): Add clause for DELETE syntax. (modify-services): Use FILTER-MAP; adjust docstring. * doc/guix.texi (System Services): Mention alternative syntax. (X Window): Use MODIFY-SERVICES syntax. --- doc/guix.texi | 13 ++++++++++--- gnu/services.scm | 23 +++++++++++++++-------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 14a42e7070..25274a8539 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -11230,6 +11230,14 @@ following expression returns a list that contains all the services in %desktop-services) @end lisp +Alternatively, the @code{modify-services} macro can be used: + +@lisp +(modify-services %desktop-services + (delete avahi-service-type)) +@end lisp + + @unnumberedsubsec Instantiating the System Assuming the @code{operating-system} declaration @@ -14732,9 +14740,8 @@ and tty8. (service slim-service-type (slim-configuration (display ":1") (vt "vt8"))) - (remove (lambda (service) - (eq? (service-kind service) gdm-service-type)) - %desktop-services)))) + (modify-services %desktop-services + (delete gdm-service-type))))) @end lisp @end defvr diff --git a/gnu/services.scm b/gnu/services.scm index 2e4648bf78..ac614a7317 100644 --- a/gnu/services.scm +++ b/gnu/services.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <l...@gnu.org> ;;; Copyright © 2016 Chris Marusich <cmmarus...@gmail.com> +;;; Copyright © 2020 Ricardo Wurmus <rek...@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -33,7 +34,7 @@ #:use-module (guix modules) #:use-module (gnu packages base) #:use-module (gnu packages bash) - #:use-module (srfi srfi-1) + #:use-module ((srfi srfi-1) #:hide (delete)) #:use-module (srfi srfi-9) #:use-module (srfi srfi-9 gnu) #:use-module (srfi srfi-26) @@ -272,7 +273,11 @@ singleton service type NAME, of which the returned service is an instance." (service type value))) (define-syntax %modify-service - (syntax-rules (=>) + (syntax-rules (=> delete) + ((_ svc (delete kind) clauses ...) + (if (eq? (service-kind svc) kind) + #f + (%modify-service svc clauses ...))) ((_ service) service) ((_ svc (kind param => exp ...) clauses ...) @@ -302,16 +307,18 @@ TYPE. Consider this example: (mingetty-service-type config => (mingetty-configuration (inherit config) - (motd (plain-file \"motd\" \"Hi there!\"))))) + (motd (plain-file \"motd\" \"Hi there!\")))) + (delete udev-service-type)) It changes the configuration of the GUIX-SERVICE-TYPE instance, and that of -all the MINGETTY-SERVICE-TYPE instances. +all the MINGETTY-SERVICE-TYPE instances, and it deletes instances of the +UDEV-SERVICE-TYPE. -This is a shorthand for (map (lambda (svc) ...) %base-services)." +This is a shorthand for (filter-map (lambda (svc) ...) %base-services)." ((_ services clauses ...) - (map (lambda (service) - (%modify-service service clauses ...)) - services)))) + (filter-map (lambda (service) + (%modify-service service clauses ...)) + services)))) ;;; -- 2.25.1