[bug#49610,v3] services: guix: Add channels field.
Commit Message
* doc/guix.texi (Channels): Specify that '/etc/guix/channels.scm'
contains channels configuration.
(Base Services): Document 'guix-configuration-channels' field.
* gnu/services/base.scm (install-channels-file): New procedure.
(%default-channels-file): New variable.
(guix-configuration): Add channels field.
(guix-activation): Use 'install-channels-file' procedure.
---
Updated v3 patch.
Changed the channels field to accept a file-like object instead of an
S-expression. I think this is more flexible because it lets users
specify a local-file rather than just an sexp.
I think this will be a unexpected/breaking change for Guix System users. If they
have /etc/guix/channels.scm customized manually, on their next 'guix system
reconfigure', it will move that file and use the channels field, unless they
modify guix-configuration. Maybe this change should have a NEWS entry?
doc/guix.texi | 17 +++++++++++++++--
gnu/services/base.scm | 44 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 57 insertions(+), 4 deletions(-)
Comments
Hi,
Sorry if I am missing something. A comment about the consistency of the
manual. :-) The section “Invoking guix pull” mentions:
Specifically, @command{guix pull} downloads code from the @dfn{channels}
(@pxref{Channels}) specified by one of the followings, in this order:
@enumerate
@item
the @option{--channels} option;
@item
the user's @file{~/.config/guix/channels.scm} file;
@item
the system-wide @file{/etc/guix/channels.scm} file;
@item
the built-in default channels specified in the @code{%default-channels}
variable.
@end enumerate
On jeu., 25 mai 2023 at 20:12, Antero Mejr via Guix-patches via <guix-patches@gnu.org> wrote:
> -customized by defining @dfn{channels} in the
> -@file{~/.config/guix/channels.scm} file. A channel specifies a URL and branch
> +customized by defining @dfn{channels} in the @file{/etc/guix/channels.scm} and
> +@file{~/.config/guix/channels.scm} files. A channel specifies a URL and branch
I find this wording confusing. I would suggest:
--8<---------------cut here---------------start------------->8---
A channel specifies a URL and branch customized by defining
@dfn{channels} in the @file{~/.config/guix/channels.scm} file, and/or
the @file{/etc/guix/channels.scm} file and/or the built-in default
specified in the @code{%default-channels} variable. Guix honors the
channels file in that previous order (@xref{Invoking guix pull}).
--8<---------------cut here---------------end--------------->8---
or something like that. Keeping in mind that this part is not Guix
System specific.
WDYT?
Cheers,
simon
Simon Tournier <zimon.toutoune@gmail.com> writes:
> Sorry if I am missing something. A comment about the consistency of the
> manual. :-) The section “Invoking guix pull” mentions:
>
> (snip)
>
>> -customized by defining @dfn{channels} in the
>> -@file{~/.config/guix/channels.scm} file. A channel specifies a URL and branch
>> +customized by defining @dfn{channels} in the @file{/etc/guix/channels.scm} and
>> +@file{~/.config/guix/channels.scm} files. A channel specifies a URL and branch
>
> I find this wording confusing. I would suggest:
>
> A channel specifies a URL and branch customized by defining
> @dfn{channels} in the @file{~/.config/guix/channels.scm} file, and/or
> the @file{/etc/guix/channels.scm} file and/or the built-in default
> specified in the @code{%default-channels} variable. Guix honors the
> channels file in that previous order (@xref{Invoking guix pull}).
>
> or something like that. Keeping in mind that this part is not Guix
> System specific.
Updated to use that wording in v4. I put the documentation update for
the Channels section into a separate patch, as that change isn't related
to the guix-configuration changes.
@@ -5397,8 +5397,8 @@ $ wget -O - \
Guix and its package collection are updated by running @command{guix pull}
(@pxref{Invoking guix pull}). By default @command{guix pull} downloads and
deploys Guix itself from the official GNU@tie{}Guix repository. This can be
-customized by defining @dfn{channels} in the
-@file{~/.config/guix/channels.scm} file. A channel specifies a URL and branch
+customized by defining @dfn{channels} in the @file{/etc/guix/channels.scm} and
+@file{~/.config/guix/channels.scm} files. A channel specifies a URL and branch
of a Git repository to be deployed, and @command{guix pull} can be instructed
to pull from one or more channels. In other words, channels can be used
to @emph{customize} and to @emph{extend} Guix, as we will see below.
@@ -18858,6 +18858,19 @@ few seconds when enough entropy is available and is only done once; you
might want to turn it off for instance in a virtual machine that does
not need it and where the extra boot time is a problem.
+@item @code{channels} (default: @code{%default-channels-file})
+File-like object containing a list of channels to be used by
+@command{guix pull}, by default. The file-like object is symlinked to
+@file{/etc/guix/channels.scm}.
+
+@quotation Note
+When reconfiguring a system, the existing @file{/etc/guix/channels.scm}
+file is backed up as @file{/etc/guix/channels.scm.bak} if it was
+determined to be a manually modified file. This is to facilitate
+migration from earlier versions, which allowed for in-place
+modifications to @file{/etc/guix/channels.scm}.
+@end quotation
+
@item @code{max-silent-time} (default: @code{0})
@itemx @code{timeout} (default: @code{0})
The number of seconds of silence and the number of seconds of activity,
@@ -80,6 +80,7 @@ (define-module (gnu services base)
#:use-module ((gnu build file-systems)
#:select (mount-flags->bit-mask
swap-space->flags-bit-mask))
+ #:use-module (guix channels)
#:use-module (guix gexp)
#:use-module (guix records)
#:use-module (guix modules)
@@ -93,6 +94,7 @@ (define-module (gnu services base)
#:use-module (srfi srfi-35)
#:use-module (ice-9 match)
#:use-module (ice-9 format)
+ #:use-module (ice-9 pretty-print)
#:re-export (user-processes-service-type ;backwards compatibility
%default-substitute-urls)
#:export (fstab-service-type
@@ -207,6 +209,7 @@ (define-module (gnu services base)
guix-configuration-use-substitutes?
guix-configuration-substitute-urls
guix-configuration-generate-substitute-key?
+ guix-configuration-channels
guix-configuration-extra-options
guix-configuration-log-file
guix-configuration-environment
@@ -1739,6 +1742,39 @@ (define acl-file #$%acl-file)
;; Installed the declared ACL.
(symlink #+default-acl acl-file))))
+(define %default-channels-file
+ ;; File-like object containing the default list of channels.
+ (plain-file "channels.scm"
+ (with-output-to-string
+ (lambda _
+ (pretty-print (map (lambda (channel)
+ (if (channel? channel)
+ (channel->code channel)
+ channel))
+ %default-channels))))))
+
+;; FIXME: Should this gexp be built before boot, like
+;; substitute-key-authorization does?
+(define (install-channels-file channels-file)
+ "Return a gexp with code to install CHANNELS-FILE, a file-like object."
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+
+ ;; If channels.scm already exists, move it out of the way. Create a
+ ;; backup if it's a regular file: it's likely that the user
+ ;; manually defined it.
+ (if (file-exists? "/etc/guix/channels.scm")
+ (if (and (symbolic-link? "/etc/guix/channels.scm")
+ (store-file-name? (readlink "/etc/guix/channels.scm")))
+ (delete-file "/etc/guix/channels.scm")
+ (rename-file "/etc/guix/channels.scm"
+ "/etc/guix/channels.scm.bak"))
+ (mkdir-p "/etc/guix"))
+
+ ;; Installed the declared channels.
+ (symlink #+channels-file "/etc/guix/channels.scm"))))
+
(define %default-authorized-guix-keys
;; List of authorized substitute keys.
(list (file-append guix "/share/guix/berlin.guix.gnu.org.pub")
@@ -1763,6 +1799,8 @@ (define-record-type* <guix-configuration>
(default %default-substitute-urls))
(generate-substitute-key? guix-configuration-generate-substitute-key?
(default #t)) ;Boolean
+ (channels guix-configuration-channels ;file-like
+ (default %default-channels-file))
(chroot-directories guix-configuration-chroot-directories ;list of file-like/strings
(default '()))
(max-silent-time guix-configuration-max-silent-time ;integer
@@ -1949,7 +1987,7 @@ (define (guix-accounts config)
(define (guix-activation config)
"Return the activation gexp for CONFIG."
(match-record config <guix-configuration>
- (guix generate-substitute-key? authorize-key? authorized-keys)
+ (guix generate-substitute-key? authorize-key? authorized-keys channels)
#~(begin
;; Assume that the store has BUILD-GROUP as its group. We could
;; otherwise call 'chown' here, but the problem is that on a COW overlayfs,
@@ -1963,7 +2001,9 @@ (define (guix-activation config)
#$(if authorize-key?
(substitute-key-authorization authorized-keys guix)
- #~#f))))
+ #~#f)
+
+ #$(install-channels-file channels))))
(define-record-type* <guix-extension>
guix-extension make-guix-extension