~ruther/guix-local

749c3e016a4297d2794cbebac0e07297d19b4ffd — Guillaume Le Vaillant 2 years ago ea832b4 + 5377680
Merge branch 'master' into lisp-team

Change-Id: I6c2ce53e782a00861c3adf01c2505099daef7728
118 files changed, 5280 insertions(+), 1694 deletions(-)

M .guix-authorizations
M .mailmap
M build-aux/test-driver.scm
M doc/guix.texi
M etc/news.scm
M etc/teams.scm
M gnu/home/services/shepherd.scm
M gnu/image.scm
M gnu/local.mk
M gnu/packages/admin.scm
M gnu/packages/bioconductor.scm
M gnu/packages/bioinformatics.scm
M gnu/packages/bootloaders.scm
M gnu/packages/bootstrap.scm
M gnu/packages/check.scm
M gnu/packages/chemistry.scm
M gnu/packages/cpp.scm
M gnu/packages/curl.scm
M gnu/packages/display-managers.scm
M gnu/packages/education.scm
M gnu/packages/emacs-xyz.scm
M gnu/packages/finance.scm
M gnu/packages/firmware.scm
M gnu/packages/fonts.scm
M gnu/packages/game-development.scm
M gnu/packages/games.scm
M gnu/packages/gcc.scm
M gnu/packages/geo.scm
M gnu/packages/gl.scm
M gnu/packages/gnome.scm
M gnu/packages/gnuzilla.scm
M gnu/packages/golang-web.scm
M gnu/packages/golang.scm
M gnu/packages/graph.scm
M gnu/packages/graphviz.scm
M gnu/packages/gtk.scm
M gnu/packages/guile-xyz.scm
M gnu/packages/jami.scm
M gnu/packages/libsigsegv.scm
M gnu/packages/linux.scm
M gnu/packages/lisp-xyz.scm
M gnu/packages/lisp.scm
M gnu/packages/llvm.scm
M gnu/packages/logging.scm
M gnu/packages/machine-learning.scm
M gnu/packages/minetest.scm
M gnu/packages/mpd.scm
M gnu/packages/multiprecision.scm
M gnu/packages/networking.scm
M gnu/packages/parallel.scm
M gnu/packages/patches/curl-use-ssl-cert-env.patch
A gnu/packages/patches/dtc-meson-cell-overflow.patch
D gnu/packages/patches/emacs-ess-fix-obsolete-function-alias.patch
A gnu/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch
A gnu/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch
A gnu/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch
A gnu/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch
A gnu/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch
A gnu/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch
A gnu/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch
A gnu/packages/patches/guile-fibers-libevent-timeout.patch
M gnu/packages/patches/jami-disable-integration-tests.patch
M gnu/packages/patches/jami-libjami-headers-search.patch
A gnu/packages/patches/jami-qml-tests-discovery.patch
A gnu/packages/patches/jami-skip-tests-requiring-internet.patch
A gnu/packages/patches/jami-unbundle-dependencies.patch
A gnu/packages/patches/libjami-ac-config-files.patch
A gnu/packages/patches/python-pyreadstat-link-libiconv.patch
A gnu/packages/patches/python-uqbar-python3.10.patch
M gnu/packages/plan9.scm
M gnu/packages/potassco.scm
M gnu/packages/python-compression.scm
M gnu/packages/python-web.scm
M gnu/packages/python-xyz.scm
M gnu/packages/serialization.scm
M gnu/packages/shellutils.scm
M gnu/packages/statistics.scm
M gnu/packages/swig.scm
M gnu/packages/tbb.scm
M gnu/packages/telephony.scm
M gnu/packages/terminals.scm
M gnu/packages/textutils.scm
M gnu/packages/tls.scm
M gnu/packages/valgrind.scm
M gnu/packages/version-control.scm
M gnu/packages/video.scm
M gnu/packages/vim.scm
M gnu/packages/web-browsers.scm
M gnu/packages/web.scm
M gnu/packages/wm.scm
M gnu/packages/xfce.scm
M gnu/packages/xorg.scm
M gnu/services/base.scm
M gnu/services/messaging.scm
M gnu/services/shepherd.scm
M gnu/services/ssh.scm
M gnu/services/xorg.scm
M gnu/system.scm
M gnu/system/hurd.scm
M gnu/system/image.scm
M gnu/tests/data/jami-dummy-account.dat
M gnu/tests/docker.scm
M gnu/tests/telephony.scm
M gnu/tests/virtualization.scm
M guix/build-system/zig.scm
M guix/build/zig-build-system.scm
M guix/docker.scm
M guix/import/crate.scm
M guix/platforms/x86.scm
M guix/read-print.scm
M guix/scripts/import/crate.scm
M guix/scripts/pack.scm
M guix/scripts/system.scm
M guix/ui.scm
M guix/utils.scm
M nix/libstore/globals.cc
M tests/crate.scm
M tests/pack.scm
M .guix-authorizations => .guix-authorizations +2 -0
@@ 100,6 100,8 @@
  (;; primary: "D6B0 C593 DA8C 5EDC A44C  7A58 C336 91F7 1188 B004"
   "A02C 2D82 0EF4 B25B A6B5  1D90 2AC6 A5EC 1C35 7C59"
   (name "samplet"))
  ("9847 81DE 689C 21C2 6418  0867 76D7 27BF F62C D2B5"
   (name "sharlatan"))
  ("F494 72F4 7A59 00D5 C235  F212 89F9 6D48 08F3 59C7"
   (name "snape"))
  ("6580 7361 3BFC C5C7 E2E4  5D45 DC51 8FC8 7F97 16AA"

M .mailmap => .mailmap +1 -0
@@ 90,6 90,7 @@ Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
Theodoros Foradis <theodoros.for@openmailbox.org> <theodoros@foradis.org>
Thomas Danckaert <thomas.danckaert@gmail.com> <post@thomasdanckaert.be>
Tobias Geerinckx-Rice <me@tobias.gr> <tobias.geerinckx.rice@gmail.com>
Tomas Volf <~@wolfsden.cz> <wolf@wolfsden.cz>
Tomáš Čech <sleep_walker@gnu.org> <sleep_walker@suse.cz>
Vincent Legoll <vincent.legoll@gmail.com> <vincent.legoll@idgrilles.fr>
Zheng Junjie <873216071@qq.com> Z572 <873216071@qq.com>

M build-aux/test-driver.scm => build-aux/test-driver.scm +2 -1
@@ 3,7 3,7 @@ exec guile --no-auto-compile -e main -s "$0" "$@"
!#
;;;; test-driver.scm - Guile test driver for Automake testsuite harness

(define script-version "2021-02-02.05") ;UTC
(define script-version "2023-12-08.14") ;UTC

;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>


@@ 274,6 274,7 @@ cases based on their names."
    (exit 0)))

;;; Local Variables:
;;; mode: scheme
;;; eval: (add-hook 'write-file-functions 'time-stamp)
;;; time-stamp-start: "(define script-version \""
;;; time-stamp-format: "%:y-%02m-%02d.%02H"

M doc/guix.texi => doc/guix.texi +85 -42
@@ 56,7 56,7 @@ Copyright @copyright{} 2017 Andy Wingo@*
Copyright @copyright{} 2017, 2018, 2019, 2020, 2023 Arun Isaac@*
Copyright @copyright{} 2017 nee@*
Copyright @copyright{} 2018 Rutger Helling@*
Copyright @copyright{} 2018, 2021 Oleg Pykhalov@*
Copyright @copyright{} 2018, 2021, 2023 Oleg Pykhalov@*
Copyright @copyright{} 2018 Mike Gerwitz@*
Copyright @copyright{} 2018 Pierre-Antoine Rouby@*
Copyright @copyright{} 2018, 2019 Gábor Boskovits@*


@@ 122,6 122,7 @@ Copyright @copyright{} 2023 Felix Lechner@*
Copyright @copyright{} 2023 Foundation Devices, Inc.@*
Copyright @copyright{} 2023 Thomas Ieong@*
Copyright @copyright{} 2023 Saku Laesvuori@*
Copyright @copyright{} 2023 Graham James Addis@*

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or


@@ 1799,7 1800,7 @@ Setup}), or simply fail.
When the build or substitution process remains silent for more than
@var{seconds}, terminate it and report a build failure.

The default value is @code{0}, which disables the timeout.
The default value is @code{3600} (one hour).

The value specified here can be overridden by clients (@pxref{Common
Build Options, @option{--max-silent-time}}).


@@ 1808,7 1809,7 @@ Build Options, @option{--max-silent-time}}).
Likewise, when the build or substitution process lasts for more than
@var{seconds}, terminate it and report a build failure.

The default value is @code{0}, which disables the timeout.
The default value is 24 hours.

The value specified here can be overridden by clients (@pxref{Common
Build Options, @option{--timeout}}).


@@ 7406,7 7407,7 @@ execution engines listed above by setting the
@env{GUIX_EXECUTION_ENGINE} environment variable accordingly.
@end quotation

@cindex entry point, for Docker images
@cindex entry point, for Docker and Singularity images
@item --entry-point=@var{command}
Use @var{command} as the @dfn{entry point} of the resulting pack, if the pack
format supports it---currently @code{docker} and @code{squashfs} (Singularity)


@@ 7429,6 7430,41 @@ docker load -i pack.tar.gz
docker run @var{image-id}
@end example

@cindex entry point arguments, for docker images
@item --entry-point-argument=@var{command}
@itemx -A @var{command}
Use @var{command} as an argument to @dfn{entry point} of the resulting pack.
This option is only valid in conjunction with @code{--entry-point} and can
appear multiple times on the command line.

@example
guix pack -f docker --entry-point=bin/guile --entry-point-argument="--help" guile
@end example

@cindex maximum layers argument, for docker images
@item --max-layers=@code{n}
Specifies the maximum number of Docker image layers allowed when
building an image.

@example
guix pack -f docker --max-layers=100 guile
@end example

This option allows you to limit the number of layers in a Docker image.
Docker images are comprised of multiple layers, and each layer adds to
the overall size and complexity of the image.  By setting a maximum
number of layers, you can control the following effects:

@itemize
@item Disk Usage:
Increasing the number of layers can help optimize the disk space
required to store multiple images built with a similar package graph.

@item Pulling:
When transferring images between different nodes or systems, having more
layers can reduce the time required to pull the image.
@end itemize

@item --expression=@var{expr}
@itemx -e @var{expr}
Consider the package @var{expr} evaluates to.


@@ 14549,6 14585,13 @@ Additional options include:
Traverse the dependency graph of the given upstream package recursively
and generate package expressions for all those packages that are not yet
in Guix.
@item --recursive-dev-dependencies
If @option{--recursive-dev-dependencies} is specified, also the recursively
imported packages contain their development dependencies, which are recursively
imported as well.
@item --allow-yanked
If no non-yanked version of a crate is available, use the latest yanked
version instead instead of aborting.
@end table

@item elm


@@ 19455,8 19498,8 @@ 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{max-silent-time} (default: @code{0})
@itemx @code{timeout} (default: @code{0})
@item @code{max-silent-time} (default: @code{3600})
@itemx @code{timeout} (default: @code{(* 3600 24)})
The number of seconds of silence and the number of seconds of activity,
respectively, after which a build process times out.  A value of zero
disables the timeout.


@@ 45243,25 45286,25 @@ PulseAudio clients to use PipeWire transparently.

@node Mail Home Services
@subsection Mail Home Services
 

The @code{(gnu home services mail)} module provides services that help
you set up the tools to work with emails in your home environment.
 

@cindex msmtp
@uref{https://marlam.de/msmtp, MSMTP} is a @acronym{SMTP, Simple Mail
Transfer Protocol} client.  It sends mail to a predefined SMTP server
that takes care of proper delivery.
 

The service reference is given below.
 

@defvar home-msmtp-service-type
This is the service type for @command{msmtp}.  Its value must be a
@code{home-msmtp-configuration}, as shown below.  It provides the
@file{~/.config/msmtp/config} file.
 

As an example, here is how you would configure @code{msmtp} for a single
account:
 

@lisp
(service home-msmtp-service-type
         (home-msmtp-configuration


@@ 45279,101 45322,101 @@ account:
@end defvar

@c %start of fragment
 

@deftp {Data Type} home-msmtp-configuration
Available @code{home-msmtp-configuration} fields are:
 

@table @asis
@item @code{defaults} (type: msmtp-configuration)
The configuration that will be set as default for all accounts.
 

@item @code{accounts} (default: @code{'()}) (type: list-of-msmtp-accounts)
A list of @code{msmtp-account} records which contain information about
all your accounts.
 

@item @code{default-account} (type: maybe-string)
Set the default account.
 

@item @code{extra-content} (default: @code{""}) (type: string)
Extra content appended as-is to the configuration file.  Run
@command{man msmtp} for more information about the configuration file
format.
 

@end table
 

@end deftp
 

@c %end of fragment
 

@c %start of fragment
 

@deftp {Data Type} msmtp-account
Available @code{msmtp-account} fields are:
 

@table @asis
@item @code{name} (type: string)
The unique name of the account.
 

@item @code{configuration} (type: msmtp-configuration)
The configuration for this given account.
 

@end table
 

@end deftp
 

@c %end of fragment

@c %start of fragment
 

@deftp {Data Type} msmtp-configuration
Available @code{msmtp-configuration} fields are:
 

@table @asis
@item @code{auth?} (type: maybe-boolean)
Enable or disable authentication.
 

@item @code{tls?} (type: maybe-boolean)
Enable or disable TLS (also known as SSL) for secured connections.
 

@item @code{tls-starttls?} (type: maybe-boolean)
Choose the TLS variant: start TLS from within the session (‘on’,
default), or tunnel the session through TLS (‘off’).
 

@item @code{tls-trust-file} (type: maybe-string)
Activate server certificate verification using a list of trusted
Certification Authorities (CAs).
 

@item @code{log-file} (type: maybe-string)
Enable logging to the specified file.  An empty argument disables
logging.  The file name ‘-’ directs the log information to standard
output.
 

@item @code{host} (type: maybe-string)
The SMTP server to send the mail to.
 

@item @code{port} (type: maybe-integer)
The port that the SMTP server listens on.  The default is 25 ("smtp"),
unless TLS without STARTTLS is used, in which case it is 465 ("smtps").
 

@item @code{user} (type: maybe-string)
Set the user name for authentication.
 

@item @code{from} (type: maybe-string)
Set the envelope-from address.
 

@item @code{password-eval} (type: maybe-string)
Set the password for authentication to the output (stdout) of the
command cmd.
 

@item @code{extra-content} (default: @code{""}) (type: string)
Extra content appended as-is to the configuration block.  Run
@command{man msmtp} for more information about the configuration file
format.
 

@end table
 

@end deftp
 

@c %end of fragment

@node Messaging Home Services

M etc/news.scm => etc/news.scm +57 -0
@@ 18,6 18,7 @@
;; Copyright © 2021 Andrew Tropin <andrew@trop.in>
;; Copyright © 2021, 2023 Jonathan Brielmaier <jonathan.brielmaier@web.de>
;; Copyright © 2022 Thiago Jung Bauermann <bauermann@kolabnow.com>
;; Copyright © 2024 Oleg Pykhalov <go.wigust@gmail.com>
;;
;; Copying and distribution of this file, with or without modification, are
;; permitted in any medium without royalty provided the copyright notice and


@@ 26,6 27,62 @@
(channel-news
 (version 0)

 (entry (commit "519e1e3eb88ec532fc83ebb742d9919269b57c87")
        (title
         (de "Neues Option @samp{--max-layers=N} für den Befehl @command{guix pack}")
         (en "New @samp{--max-layers=N} option for the @command{guix pack} command")
         (ru "Новая опция @samp{--max-layers=N} для @command{guix pack} команды"))
        (body
         (de "Sie können jetzt auch mehrschichtige Docker-Abbilder mit dem Befehl
@command{guix pack --format=docker --max-layers=N} erzeugen. Damit bekommen Sie ein
Docker-Abbild, bei dem Store-Pfade auf getrennten Schichten („Layer“)
untergebracht sind, die sich mehrere Abbilder teilen können.  Das Abbild wird
im Store als gzip-komprimierter Tarball erzeugt.  Hier ist ein einfaches
Beispiel, wo ein mehrschichtiges Docker-Abbild für das Paket @code{hello}
angelegt wird:

@example
guix pack --format=docker --max-layers=N --symlink=/usr/bin/hello=bin/hello hello
@end example

@command{guix system image} kann jetzt geschichtete Docker-Abbilder erzeugen,
indem Sie @code{--max-layers=N}.

Siehe @command{info \"(guix.de) Aufruf von guix pack\"} und
@command{info \"(guix.de) Systemabbilder\"} für weitere Informationen.")
         (en "Docker layered images can now be produced via the @command{guix
pack --format=docker --max-layers=N} command, providing a Docker image with
many of the store paths being on their own layer to improve sharing between
images.  The image is realized into the GNU store as a gzipped tarball.  Here
is a simple example that generates a layered Docker image for the @code{hello}
package:

@example
guix pack --format=docker --max-layers=N --symlink=/usr/bin/hello=bin/hello hello
@end example

The @command{guix system image} can now produce layered Docker image by passing
@code{--max-layers=N}.

See @command{info \"(guix) Invoking guix pack\"} and
@command{info \"(guix) System Images\"} for more information.")
         (ru "Появилась команда создания многослойных Docker образов с помощью
@command{guix pack --format=docker --max-layers=N}, которая соберет Docker образ с
путями в store расположенными на отдельных слоях, ускоряя таким образом
передачу образов.  Образ будет создан в GNU store в качестве gzipped tarball.

Пример создания Docker layered образ с @code{hello} пакетом:
@example
guix pack --format=docker --max-layers=N --symlink=/usr/bin/hello=bin/hello hello
@end example

@command{guix system image} теперь может создавать layered Docker образ путем
указания опции @option{--max-layers=N}.

Смотрите @command{info \"(guix) Invoking guix pack\"} и
@command{info \"(guix) System Images\"} для получения более детальных
сведений.")))

 (entry (commit "953c65ffdd43c02c934518fb7a1c68542584b223")
        (title
         (en "Declarative offloading on Guix System and childhurds")

M etc/teams.scm => etc/teams.scm +18 -2
@@ 310,7 310,8 @@ asdf-build-system."
(define-team bootstrap
  (team 'bootstrap
        #:name "Bootstrap"
        #:scope (list "gnu/packages/mes.scm")))
        #:scope (list "gnu/packages/commencement.scm"
                      "gnu/packages/mes.scm")))

(define-team embedded
  (team 'embedded


@@ 424,6 425,21 @@ asdf-build-system."
              (make-regexp* "^guix/scripts/")
              (make-regexp* "^guix/store/"))))

(define-team core-packages
  (team 'core-packages
        #:name "Core packages"
        #:description "Core packages: the GNU tool chain, Guile, Coreutils, etc."
        #:scope (list "gnu/packages/base.scm"
                      "gnu/packages/bootstrap.scm"
                      "gnu/packages/commencement.scm"
                      "gnu/packages/cross-base.scm"
                      "gnu/packages/gcc.scm"
                      "gnu/packages/guile.scm"
                      "gnu/packages/make-bootstrap.scm"
                      "guix/build/gnu-build-system.scm"
                      "guix/build/utils.scm"
                      "guix/build-system/gnu.scm")))

(define-team games
  (team 'games
        #:name "Games and Toys"


@@ 556,7 572,7 @@ GLib/GIO, GTK, GStreamer and Webkit."

(define-member (person "Ludovic Courtès"
                       "ludo@gnu.org")
  core home bootstrap installer mentors)
  core home bootstrap core-packages installer mentors)

(define-member (person "Andreas Enge"
                       "andreas@enge.fr")

M gnu/home/services/shepherd.scm => gnu/home/services/shepherd.scm +4 -8
@@ 1,6 1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2021, 2023 Andrew Tropin <andrew@trop.in>
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2024 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 75,11 76,8 @@ as shepherd package."
      #~(begin
          (use-modules (srfi srfi-34)
                       (system repl error-handling))
          (apply
           register-services
           (map
            (lambda (file) (load file))
            '#$files))

          (register-services (map load '#$files))

          #$@(if daemonize?
                 `((action 'root 'daemonize))


@@ 90,9 88,7 @@ as shepherd package."
                 '#$(append-map shepherd-service-provision
                                (filter shepherd-service-auto-start?
                                        services))))
            (if (defined? 'start-in-the-background)
                (start-in-the-background services-to-start)
                (for-each start services-to-start))
            (start-in-the-background services-to-start)

            (redirect-port (open-input-file "/dev/null")
                           (current-input-port)))))

M gnu/image.scm => gnu/image.scm +4 -0
@@ 1,5 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2020, 2022 Mathieu Othacehe <othacehe@gnu.org>
;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 42,6 43,7 @@
            image-format
            image-platform
            image-size
            image-max-layers
            image-operating-system
            image-partition-table-type
            image-partitions


@@ 170,6 172,8 @@ that is not in SET, mentioning FIELD in the error message."
  (size               image-size  ;size in bytes as integer
                      (default 'guess)
                      (sanitize validate-size))
  (max-layers         image-max-layers  ;number of layers as integer
                      (default #false))
  (operating-system   image-operating-system)  ;<operating-system>
  (partition-table-type image-partition-table-type ; 'mbr or 'gpt
                      (default 'mbr)

M gnu/local.mk => gnu/local.mk +17 -2
@@ 1,5 1,5 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
# Copyright © 2012-2024 Ludovic Courtès <ludo@gnu.org>
# Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2022, 2023 Andreas Enge <andreas@enge.fr>
# Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
# Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Mark H Weaver <mhw@netris.org>


@@ 62,6 62,7 @@
# Copyright © 2023 B. Wilson <elaexuotee@wilsonb.com>
# Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
# Copyright © 2023 Herman Rimm <herman@rimm.ee>
# Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
#
# This file is part of GNU Guix.
#


@@ 1092,6 1093,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/doxygen-hurd.patch			\
  %D%/packages/patches/dstat-fix-crash-when-specifying-delay.patch	\
  %D%/packages/patches/dstat-skip-devices-without-io.patch	\
  %D%/packages/patches/dtc-meson-cell-overflow.patch		\
  %D%/packages/patches/dune-common-skip-failing-tests.patch	\
  %D%/packages/patches/dune-grid-add-missing-include-cassert.patch	\
  %D%/packages/patches/dune-istl-fix-solver-playground.patch	\


@@ 1111,7 1113,6 @@ dist_patch_DATA =						\
  %D%/packages/patches/emacs-deferred-fix-number-of-arguments.patch	\
  %D%/packages/patches/emacs-elpy-dup-test-name.patch		\
  %D%/packages/patches/emacs-exec-path.patch			\
  %D%/packages/patches/emacs-ess-fix-obsolete-function-alias.patch	\
  %D%/packages/patches/emacs-git-email-missing-parens.patch	\
  %D%/packages/patches/emacs-fix-scheme-indent-function.patch	\
  %D%/packages/patches/emacs-json-reformat-fix-tests.patch	\


@@ 1166,6 1167,13 @@ dist_patch_DATA =						\
  %D%/packages/patches/fenics-dolfin-demo-init.patch		\
  %D%/packages/patches/fenics-dolfin-boost.patch		\
  %D%/packages/patches/fenics-dolfin-config-slepc.patch		\
  %D%/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch	\
  %D%/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch	\
  %D%/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch	\
  %D%/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch	\
  %D%/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch \
  %D%/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch	\
  %D%/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch	\
  %D%/packages/patches/fifengine-boost-compat.patch		\
  %D%/packages/patches/fifengine-swig-compat.patch		\
  %D%/packages/patches/fifo-map-fix-flags-for-gcc.patch		\


@@ 1384,6 1392,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/guile-fibers-fd-finalizer-leak.patch	\
  %D%/packages/patches/guile-fibers-wait-for-io-readiness.patch \
  %D%/packages/patches/guile-fibers-libevent-32-bit.patch	\
  %D%/packages/patches/guile-fibers-libevent-timeout.patch	\
  %D%/packages/patches/guile-fix-invalid-unicode-handling.patch \
  %D%/packages/patches/guile-gdbm-ffi-support-gdbm-1.14.patch	\
  %D%/packages/patches/guile-git-adjust-for-libgit2-1.2.0.patch \


@@ 1458,6 1467,9 @@ dist_patch_DATA =						\
  %D%/packages/patches/itk-snap-alt-glibc-compat.patch		\
  %D%/packages/patches/jami-disable-integration-tests.patch	\
  %D%/packages/patches/jami-libjami-headers-search.patch	\
  %D%/packages/patches/jami-qml-tests-discovery.patch		\
  %D%/packages/patches/jami-skip-tests-requiring-internet.patch	\
  %D%/packages/patches/jami-unbundle-dependencies.patch		\
  %D%/packages/patches/jamvm-1.5.1-aarch64-support.patch	\
  %D%/packages/patches/jamvm-1.5.1-armv7-support.patch	\
  %D%/packages/patches/jamvm-2.0.0-aarch64-support.patch	\


@@ 1548,6 1560,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/libgnome-encoding.patch			\
  %D%/packages/patches/libgnomeui-utf8.patch			\
  %D%/packages/patches/libgrss-CVE-2016-2001.patch		\
  %D%/packages/patches/libjami-ac-config-files.patch		\
  %D%/packages/patches/libjxr-fix-function-signature.patch	\
  %D%/packages/patches/libjxr-fix-typos.patch			\
  %D%/packages/patches/libofa-ftbfs-1.diff		\


@@ 1776,6 1789,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/python-louvain-fix-test.patch		\
  %D%/packages/patches/python-random2-getrandbits-test.patch		\
  %D%/packages/patches/python-poppler-qt5-fix-build.patch	\
  %D%/packages/patches/python-pyreadstat-link-libiconv.patch	\
  %D%/packages/patches/python-pypdf-annotate-tests-appropriately.patch	\
  %D%/packages/patches/python-pytorch2-system-libraries.patch	\
  %D%/packages/patches/python-sip-include-dirs.patch	\


@@ 1783,6 1797,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/python-sphinx-prompt-docutils-0.19.patch	\
  %D%/packages/patches/python-telingo-fix-comparison.patch	\
  %D%/packages/patches/python-typeguard-python3.10.patch	\
  %D%/packages/patches/python-uqbar-python3.10.patch	        \
  %D%/packages/patches/python-wxwidgets-type-errors.patch	\
  %D%/packages/patches/qtdeclarative-5-disable-qmlcache.patch	\
  %D%/packages/patches/qtdeclarative-disable-qmlcache.patch	\

M gnu/packages/admin.scm => gnu/packages/admin.scm +2 -2
@@ 373,14 373,14 @@ interface and is based on GNU Guile.")
(define-public shepherd-0.10
  (package
    (inherit shepherd-0.9)
    (version "0.10.2")
    (version "0.10.3")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/shepherd/shepherd-"
                                  version ".tar.gz"))
              (sha256
               (base32
                "0v9ld9gbqdp5ya380fbkdsxa0iqr90gi6yk004ccz3n792nq6wlj"))))
                "1vxghlxnxajx2iciqmjia49c5hkir8li0gv29kl55frhn2zgxilf"))))
    (native-inputs (modify-inputs (package-native-inputs shepherd-0.9)
                     (replace "guile-fibers"
                       ;; Work around

M gnu/packages/bioconductor.scm => gnu/packages/bioconductor.scm +35 -3
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015-2023 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2015-2024 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2016, 2017, 2018, 2020, 2021 Roel Janssen <roel@gnu.org>
;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl>
;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>


@@ 7324,13 7324,13 @@ global-scaling and full-quantile normalization.")
(define-public r-edger
  (package
    (name "r-edger")
    (version "4.0.3")
    (version "4.0.5")
    (source (origin
              (method url-fetch)
              (uri (bioconductor-uri "edgeR" version))
              (sha256
               (base32
                "0sz46pwa1bsqrff2igswfhhj1fcwzn34zrlawy4fnb58z48kccb0"))))
                "16cghh83v14jdq5n6xkm3jxj87n6l6zrxjgqdwb2ffgc26vkpb7w"))))
    (properties `((upstream-name . "edgeR")))
    (build-system r-build-system)
    (propagated-inputs


@@ 10510,6 10510,38 @@ expression information.  The package functions as a wrapper for Startrac and
powerTCR R packages.")
    (license license:gpl2)))

(define-public r-scrnaseq
  (package
    (name "r-scrnaseq")
    (version "2.16.0")
    (source
     (origin
       (method url-fetch)
       (uri (bioconductor-uri "scRNAseq" version
                              'experiment))
       (sha256
        (base32 "0dbh3sqq7lkkdf7vls5qg7fbn6y74c7hsigb4d69pvk934ll88aw"))))
    (properties `((upstream-name . "scRNAseq")))
    (build-system r-build-system)
    (propagated-inputs (list r-annotationdbi
                             r-annotationhub
                             r-biocgenerics
                             r-ensembldb
                             r-experimenthub
                             r-genomicfeatures
                             r-genomicranges
                             r-s4vectors
                             r-singlecellexperiment
                             r-summarizedexperiment))
    (native-inputs (list r-knitr))
    (home-page "https://bioconductor.org/packages/scRNAseq")
    (synopsis "Collection of public single-cell RNA-seq datasets")
    (description
     "This package contains gene-level counts for a collection of public
@code{scRNA-seq} datasets, provided as @code{SingleCellExperiment} objects
with cell- and gene-level metadata.")
    (license license:cc0)))

(define-public r-scry
  (package
    (name "r-scry")

M gnu/packages/bioinformatics.scm => gnu/packages/bioinformatics.scm +200 -17
@@ 130,6 130,7 @@
  #:use-module (gnu packages pdf)
  #:use-module (gnu packages perl)
  #:use-module (gnu packages perl-check)
  #:use-module (gnu packages perl-web)
  #:use-module (gnu packages pkg-config)
  #:use-module (gnu packages popt)
  #:use-module (gnu packages protobuf)


@@ 574,6 575,30 @@ BED, GFF/GTF, VCF.")
whole-genome bisulfite sequencing (WGBS) reads from directional protocol.")
    (license license:asl2.0)))

(define-public bustools
  (package
    (name "bustools")
    (version "0.43.2")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/BUStools/bustools")
                    (commit (string-append "v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "068kjlc4d528269nl5mc3j8h2c95r1v545d3fi1iw1ckg8rba0hg"))))
    (build-system cmake-build-system)
    (arguments (list #:tests? #f))          ;no test target
    (inputs (list zlib))
    (home-page "https://bustools.github.io")
    (synopsis "Tools for working with BUS files")
    (description "bustools is a program for manipulating BUS files for single
cell RNA-Seq datasets.  It can be used to error correct barcodes, collapse
UMIs, produce gene count or transcript compatibility count matrices, and is useful
for many other tasks.")
    (license license:bsd-2)))

(define-public cellsnp-lite
  ;; Last release is from November 2021 and does not contain fixes.
  (let ((commit "0885d746b0b1ea65c8ef92f8943ca7669ca9734a")


@@ 2365,6 2390,40 @@ sequencing data and the end result are tables of UMI-unique DamID and CEL-Seq
counts.")
    (license license:expat)))

(define-public python-snaptools
  (package
    (name "python-snaptools")
    (version "1.4.8")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "snaptools" version))
       (sha256
        (base32
         "1s5373g5jjbshh3q39zy7dlxr7nda6ksxq9d1gw46h82c4fsmfbn"))))
    (build-system pyproject-build-system)
    (propagated-inputs
     (list python-future
           python-h5py
           python-louvain
           python-numpy
           python-pybedtools
           python-pysam))
    (home-page "https://github.com/r3fang/SnapTools")
    (synopsis "Tools for processing snap files" )
    (description
     "@code{SnapTools} can operate on snap files the following types of
operations:

@itemize
@item index the reference genome before alignment;
@item align reads to the corresponding reference genome;
@item pre-process by convert pair-end reads into fragments, checking the
  mapping quality score, alingment and filtration;
@item create the cell-by-bin matrix.
@end itemize")
    (license license:asl2.0)))

(define-public python-bioframe
  (package
    (name "python-bioframe")


@@ 4999,6 5058,126 @@ be of arbitrary length. Repeats with pattern size in the range from 1 to 2000
bases are detected.")
    (license license:agpl3+)))

(define-public trinityrnaseq
  (package
    (name "trinityrnaseq")
    (version "2.13.2")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/trinityrnaseq/trinityrnaseq.git")
                    (commit (string-append "Trinity-v" version))
                    (recursive? #true)))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "1qszrxqbx4q5pavpgm4rkrh1z1v1mf7qx83vv3fnlqdmncnsf1gv"))))
    (build-system gnu-build-system)
    (arguments
     (list
      #:test-target "test"
      #:modules
      '((guix build gnu-build-system)
        (guix build utils)
        (ice-9 match)
        (srfi srfi-1))
      #:make-flags
      #~(list (string-append "CC=" #$(cc-for-target)))
      #:phases
      #~(modify-phases %standard-phases
          (replace 'configure
            (lambda _
              (setenv "SHELL" (which "sh"))
              (setenv "CONFIG_SHELL" (which "sh"))
              ;; Do not require version.h, which triggers a local build of a
              ;; vendored htslib.
              (substitute* "trinity-plugins/bamsifter/Makefile"
                (("sift_bam_max_cov.cpp htslib/version.h")
                 "sift_bam_max_cov.cpp"))))
          (add-after 'build 'build-plugins
            (lambda _
              ;; Run this in the subdirectory to avoid running the
              ;; tests right here.
              (with-directory-excursion "trinity-plugins"
                (invoke "make" "plugins"))))
          ;; The install script uses rsync, provides no overrides for the
          ;; default location at /usr/local/bin, and patching it would change
          ;; all lines that do something.
          (replace 'install
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((share (string-append #$output "/share/trinity/"))
                    (bin   (string-append #$output "/bin/")))
                (mkdir-p bin)
                (copy-recursively "." share)
                (delete-file (string-append share "/Chrysalis/build/CMakeFiles/CMakeOutput.log"))
                (delete-file (string-append share "/Inchworm/build/CMakeFiles/CMakeOutput.log"))

                (wrap-program (string-append share "Trinity")
                  `("R_LIBS_SITE" ":" = (,(getenv "R_LIBS_SITE")))
                  `("PERL5LIB"    ":" = (,(getenv "PERL5LIB")))
                  `("PYTHONPATH"  ":" = (,(getenv "GUIX_PYTHONPATH")))
                  `("PATH"        ":" =
                    ,(cons (string-append share "/trinity-plugins/BIN")
                           (filter-map (match-lambda
                                         ((name . dir)
                                          (string-append dir "/bin")))
                                       inputs))))
                (symlink (string-append share "Trinity")
                         (string-append bin "Trinity"))))))))
    (inputs
     (list blast+
           bowtie
           fastqc
           hisat
           htslib
           icedtea-8
           jellyfish
           kallisto
           multiqc
           perl
           perl-uri-escape
           python-numpy
           python-wrapper
           r-ape
           r-argparse
           r-biobase
           r-ctc
           r-deseq2
           r-edger
           r-fastcluster
           r-glimma
           r-goplot
           r-goseq
           r-gplots
           r-minimal
           r-qvalue
           r-rots
           r-sm
           r-tidyverse
           rsem
           salmon
           samtools
           sra-tools
           star
           zlib))
    (propagated-inputs
     (list coreutils
           gzip
           which))
    (native-inputs (list cmake))
    (home-page "https://github.com/trinityrnaseq/trinityrnaseq/wiki")
    (synopsis "Trinity RNA-Seq de novo transcriptome assembly")
    (description "Trinity assembles transcript sequences from Illumina RNA-Seq
data.  Trinity represents a novel method for the efficient and robust de novo
reconstruction of transcriptomes from RNA-seq data.  Trinity combines three
independent software modules: Inchworm, Chrysalis, and Butterfly, applied
sequentially to process large volumes of RNA-seq reads.  Trinity partitions
the sequence data into many individual de Bruijn graphs, each representing the
transcriptional complexity at a given gene or locus, and then processes each
graph independently to extract full-length splicing isoforms and to tease
apart transcripts derived from paralogous genes.")
    (license license:bsd-3)))

(define-public repeat-masker
  (package
    (name "repeat-masker")


@@ 20521,24 20700,28 @@ aligner.")
       (uri (pypi-uri "scvelo" version))
       (sha256
        (base32 "0h5ha1459ljs0qgpnlfsw592i8dxqn6p9bl08l1ikpwk36baxb7z"))))
    (build-system python-build-system)
    (build-system pyproject-build-system)
    (arguments
     `(#:phases
       (modify-phases %standard-phases
         ;; Numba needs a writable dir to cache functions.
         (add-before 'check 'set-numba-cache-dir
           (lambda _
             (setenv "NUMBA_CACHE_DIR" "/tmp")))
         (replace 'check
           (lambda* (#:key outputs tests? #:allow-other-keys)
             (when tests?
               ;; The discovered test file names must match the names of the
               ;; compiled files, so we cannot run the tests from
               ;; /tmp/guix-build-*.
               (with-directory-excursion
                   (string-append (assoc-ref outputs "out")
                                  "/lib/python3.10/site-packages/scvelo/core/tests/")
                 (invoke "pytest" "-v"))))))))
     (list
       #:test-flags
       ;; XXX: these two tests fail for unknown reasons
       '(list "-k" "not test_perfect_fit and not test_perfect_fit_2d")
       #:phases
       #~(modify-phases %standard-phases
           ;; Numba needs a writable dir to cache functions.
           (add-before 'check 'set-numba-cache-dir
             (lambda _
               (setenv "NUMBA_CACHE_DIR" "/tmp")))
           (replace 'check
             (lambda* (#:key tests? test-flags #:allow-other-keys)
               (when tests?
                 ;; The discovered test file names must match the names of the
                 ;; compiled files, so we cannot run the tests from
                 ;; /tmp/guix-build-*.
                 (with-directory-excursion
                     (string-append #$output
                                    "/lib/python3.10/site-packages/scvelo/core/tests/")
                   (apply invoke "pytest" "-v" test-flags))))))))
    (propagated-inputs
     (list python-anndata
           python-hnswlib

M gnu/packages/bootloaders.scm => gnu/packages/bootloaders.scm +38 -20
@@ 55,9 55,12 @@
  #:use-module (gnu packages man)
  #:use-module (gnu packages mtools)
  #:use-module (gnu packages ncurses)
  #:use-module (gnu packages ninja)
  #:use-module (gnu packages package-management)
  #:use-module (gnu packages perl)
  #:use-module (gnu packages pkg-config)
  #:use-module (gnu packages python)
  #:use-module (gnu packages python-build)
  #:use-module (gnu packages python-crypto)
  #:use-module (gnu packages texinfo)
  #:use-module (gnu packages tls)


@@ 71,6 74,7 @@
  #:use-module (gnu packages python-web)
  #:use-module (gnu packages python-xyz)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system meson)
  #:use-module (guix build-system pyproject)
  #:use-module (guix build-system trivial)
  #:use-module (guix download)


@@ 631,7 635,7 @@ The SUBDIR argument defaults to \"efi/Guix\", as it is also the case for
(define-public dtc
  (package
    (name "dtc")
    (version "1.6.1")
    (version "1.7.0")
    (source (origin
              (method url-fetch)
              (uri (string-append


@@ 639,42 643,56 @@ The SUBDIR argument defaults to \"efi/Guix\", as it is also the case for
                    "dtc-" version ".tar.gz"))
              (sha256
               (base32
                "0xm38h31jb29xfh2sfyk48d8wdfq4b8lmb412zx9vjr35izjb9iq"))))
    (build-system gnu-build-system)
                "0cij9399snpn672pdbda8qbxljdkfg068kvv3g5811rz6yslx124"))
              (patches
               (search-patches "dtc-meson-cell-overflow.patch"))))
    (build-system meson-build-system)
    (arguments
     (list
      #:modules `(,@%gnu-build-system-modules (srfi srfi-26))
      #:make-flags
      #~(list (string-append "CC=" #$(cc-for-target))
              ;; /bin/fdt{get,overlay,put} need help finding libfdt.so.1.
              (string-append "LDFLAGS=-Wl,-rpath=" #$output "/lib")
              (string-append "PREFIX=" #$output)
              (string-append "SETUP_PREFIX=" #$output)
              "INSTALL=install")
      #:modules '((guix build meson-build-system)
                  (guix build utils)
                  (srfi srfi-26))
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'patch-pkg-config
          (add-after 'unpack 'preparations
            (lambda _
              (substitute* '("Makefile"
                             "tests/run_tests.sh")
                (("pkg-config")
                 #$(pkg-config-for-target)))))
          (delete 'configure)           ;no configure script
          (add-before 'build 'install-doc
              ;; The version string is usually derived via setuptools-scm, but
              ;; without the git metadata available this fails.
              (setenv "SETUPTOOLS_SCM_PRETEND_VERSION" #$version)

              ;; Needed by setup.py.
              (setenv "DESTDIR" "/")

              ;; Native gcc needed by run_test.sh.
              (setenv "CC" "gcc")

              ;; /bin/fdt{get,overlay,put} need help finding libfdt.so.1.
              (setenv "LDFLAGS"
                      (string-append "-Wl,-rpath=" #$output "/lib"))))
          (add-after 'unpack 'install-doc
            (lambda _
              (with-directory-excursion "Documentation"
                (for-each (cut install-file <> (string-append
                                                #$output "/share/doc/dtc/"))
                          '("dts-format.txt"
                            "dt-object-internal.txt"
                            "manual.txt"))))))))
                            "manual.txt")))))
          (add-after 'unpack 'patch-pkg-config
            (lambda _
              (substitute* '("tests/run_tests.sh")
                (("pkg-config")
                 #$(pkg-config-for-target))))))))
    (native-inputs
     (append
      (list bison
            flex
            libyaml
            ninja
            pkg-config
            swig)
            python
            python-setuptools-scm
            swig
            which)
      (if (member (%current-system) (package-supported-systems valgrind))
          (list valgrind)
          '())))

M gnu/packages/bootstrap.scm => gnu/packages/bootstrap.scm +4 -1
@@ 1,7 1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014, 2015, 2018, 2019 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2017, 2020 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2017, 2020, 2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2018, 2020, 2022 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2019 Carl Dong <contact@carldong.me>
;;; Copyright © 2019 Léo Le Bouter <lle-bout@zaclys.net>


@@ 323,6 323,9 @@ or false to signal an error."
     ((string=? system "powerpc64-linux") "/lib/ld64.so.1")
     ((string=? system "alpha-linux") "/lib/ld-linux.so.2")

     ;; TODO: Differentiate between x86_64-linux-gnu and x86_64-linux-gnux32.
     ((string=? system "x86_64-linux-gnux32") "/lib/ld-linux-x32.so.2")

     ;; XXX: This one is used bare-bones, without a libc, so add a case
     ;; here just so we can keep going.
     ((string=? system "arm-eabi") "no-ld.so")

M gnu/packages/check.scm => gnu/packages/check.scm +28 -3
@@ 47,6 47,7 @@
;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
;;; Copyright © 2023 Reza Housseini <reza@housseini.me>
;;; Copyright © 2023 Hilton Chain <hako@ultrarare.space>
;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 602,10 603,10 @@ It allows the specification of behaviour scenarios using a given-when-then
pattern.")
      (license license:apsl2))))

(define-public catch2-3.3
(define-public catch2-3
  (package
    (name "catch2")
    (version "3.4.0")
    (version "3.5.1")
    (home-page "https://github.com/catchorg/Catch2")
    (source (origin
              (method git-fetch)


@@ 615,7 616,7 @@ pattern.")
              (file-name (git-file-name name version))
              (sha256
               (base32
                "1gdfsva6mnd66px85fmm3s65h8qzqnmgbmws2i3nygfav1y8d88f"))))
                "0p7rk01n4qfnnm1bgakllyqi83n1kbpz11gh65z1vspfz58hs9iv"))))
    (build-system cmake-build-system)
    (arguments
     (list


@@ 1416,6 1417,30 @@ distributed testing in both @code{load} and @code{each} modes.  It also
supports coverage of subprocesses.")
  (license license:expat)))

(define-public python-pytest-dotenv
  (package
    (name "python-pytest-dotenv")
    (version "0.5.2")
    (source
     (origin
       ;; No tests in the PyPI tarball.
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/quiqua/pytest-dotenv")
             (commit version)))
       (file-name (git-file-name name version))
       (sha256
        (base32 "0bdxwaak5clhsd63b9q65nf2amqqv5hfn7dskfakyldxsqnnh0y6"))))
    (build-system pyproject-build-system)
    (propagated-inputs (list python-dotenv))
    (native-inputs (list python-pytest))
    (home-page "https://github.com/quiqua/pytest-dotenv")
    (synopsis "Automatically detect and load a .env file before running tests")
    (description
     "This Pytest plugin automatically detects and loads environment variables
from a .env file before running tests.")
    (license license:expat)))

(define-public python-pytest-httpserver
  (package
    (name "python-pytest-httpserver")

M gnu/packages/chemistry.scm => gnu/packages/chemistry.scm +1 -1
@@ 263,7 263,7 @@ molecules.")
    (arguments '(#:tests? #f))
    ;; There is no support for modern msgpack versions yet (see:
    ;; https://github.com/rcsb/mmtf-cpp/issues/44).
    (propagated-inputs (list msgpack))  ;included by mmtf/structure_data.hpp
    (propagated-inputs (list msgpack-3)) ;included by mmtf/structure_data.hpp
    (home-page "https://mmtf.rcsb.org/")
    (synopsis "C++ API for the Macromolecular Transmission Format")
    (description "This package is a library for the

M gnu/packages/cpp.scm => gnu/packages/cpp.scm +23 -1
@@ 31,7 31,7 @@
;;; Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net>
;;; Copyright © 2022, 2023 David Elsing <david.elsing@posteo.net>
;;; Copyright © 2022, 2023 Zheng Junjie <873216071@qq.com>
;;; Copyright © 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2022 Antero Mejr <antero@mailbox.org>
;;; Copyright © 2023 Sughosha <Sughosha@proton.me>
;;; Copyright © 2023 Artyom V. Poptsov <poptsov.artyom@gmail.com>


@@ 327,6 327,28 @@ the @code{Clang/LLVM} infrastructure to extract the data, and emits it in
various formats, including @code{json}.")
    (license license:gpl2+)))

(define-public expected-lite
  (package
    (name "expected-lite")
    (version "0.6.3")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/martinmoene/expected-lite")
                    (commit (string-append "v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "0d58nqh2fwdzdpln2wlnf898wyfxdnskq6ff33azbg92d5ibzys2"))))
    (build-system cmake-build-system)
    (home-page "https://github.com/martinmoene/expected-lite")
    (synopsis "Expected objects in C++11 and later")
    (description "@i{expected lite} is a single-file header-only library for
objects that either represent a valid value or an error that can be passed by
value.  It is intended for use with C++11 and later.  The library is based on
the @code{std::expected} proposal (@url{http://wg21.link/p0323}).")
    (license license:boost1.0)))

(define-public libzen
  (package
    (name "libzen")

M gnu/packages/curl.scm => gnu/packages/curl.scm +10 -5
@@ 65,14 65,14 @@
(define-public curl
  (package
    (name "curl")
    (version "8.4.0")
    (version "8.5.0")
    (source (origin
              (method url-fetch)
              (uri (string-append "https://curl.se/download/curl-"
                                  version ".tar.xz"))
              (sha256
               (base32
                "0bd8y8v66biyqvg70ka1sdd0aixs6yzpnvfsig907xzh9af2mihn"))
                "1sqfflilf7mcz1g03lazyr6v6pf1rsrzprrknsir10hdwawqvas2"))
              (patches (search-patches "curl-use-ssl-cert-env.patch"))))
    (build-system gnu-build-system)
    (outputs '("out"


@@ 127,15 127,20 @@
                                   (if parallel-tests?
                                       (number->string (parallel-job-count))
                                       "1")))
                       ;; Ignore test 1477 due to a missing file in the 8.5.0
                       ;; release.  See
                       ;; <https://github.com/curl/curl/issues/12462>.
                       (arguments `("-C" "tests" "test"
                                    ,@make-flags
                                    ,(if #$(or (system-hurd?)
                                               (target-arm32?)
                                               (target-aarch64?))
                                         ;; protocol FAIL
                                         (string-append "TFLAGS=\"~1474 "
                                                        job-count "\"")
                                         (string-append "TFLAGS=" job-count)))))
                                         (string-append "TFLAGS=~1474 "
                                                        "!1477 "
                                                        job-count)
                                         (string-append "TFLAGS=\"~1477 "
                                                        job-count "\"")))))
                  ;; The top-level "make check" does "make -C tests quiet-test", which
                  ;; is too quiet.  Use the "test" target instead, which is more
                  ;; verbose.

M gnu/packages/display-managers.scm => gnu/packages/display-managers.scm +37 -43
@@ 69,25 69,16 @@
(define-public sddm
  (package
    (name "sddm")
    (version "0.19.0")
    (version "0.20.0")
    (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://github.com/sddm/sddm"
                    "/releases/download/v" version "/"
                    "sddm-" version ".tar.xz"))
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/sddm/sddm")
                    (commit (string-append "v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "0hcdysw8ibr66vk8i7v56l0v5ijvhlq67v4460mc2xf2910g2m72"))
              (snippet
               #~(begin
                   ;; https://github.com/sddm/sddm/issues/1536
                   ;; https://github.com/sddm/sddm/commit/e93bf95c54ad8c2a1604f8d7be05339164b19308
                   ;; Commit comes shortly after the 0.19.0 release.
                   (use-modules ((guix build utils)))
                   (substitute* "src/daemon/XorgDisplayServer.cpp"
                     (("m_cookie\\[i\\] = digits\\[dis\\(gen\\)\\]")
                      "m_cookie[i] = QLatin1Char(digits[dis(gen)])"))))))
                "1450zv03d3mbid27986p4mdshw9qf3ar8crl4idybf7khxgan22y"))))
    (build-system qt-build-system)
    (native-inputs
     (list extra-cmake-modules pkg-config qttools-5))


@@ 109,36 100,39 @@
           shadow
           wayland))
    (arguments
     `(#:configure-flags
       ,#~(list
            ;; This option currently does nothing, but will presumably be enabled
            ;; if/when <https://github.com/sddm/sddm/pull/616> is merged.
            "-DENABLE_WAYLAND=ON"
            "-DENABLE_PAM=ON"
            ;; Both flags are required for elogind support.
            "-DNO_SYSTEMD=ON" "-DUSE_ELOGIND=ON"
            "-DCONFIG_FILE=/etc/sddm.conf"
            ;; Set path to /etc/login.defs.
            ;; An alternative would be to use -DUID_MIN and -DUID_MAX.
            (string-append "-DLOGIN_DEFS_PATH="
                           #$(this-package-input "shadow")
                           "/etc/login.defs")
            (string-append "-DQT_IMPORTS_DIR="
                           #$output "/lib/qt5/qml")
            (string-append "-DCMAKE_INSTALL_SYSCONFDIR="
                           #$output "/etc"))
       #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'embed-loginctl-reference
           (lambda _
             (substitute* "CMakeLists.txt"
               (("/usr/bin/loginctl") (which "loginctl")))
               #t)))))
     (list
      #:configure-flags
      #~(list
         "-DENABLE_WAYLAND=ON"
         "-DENABLE_PAM=ON"
         ;; Both flags are required for elogind support.
         "-DNO_SYSTEMD=ON"
         "-DUSE_ELOGIND=ON"
         "-DCONFIG_FILE=/etc/sddm.conf"
         ;; Set path to /etc/login.defs.
         ;; An alternative would be to use -DUID_MIN and -DUID_MAX.
         (string-append "-DLOGIN_DEFS_PATH="
                        #$(this-package-input "shadow")
                        "/etc/login.defs")
         (string-append "-DCMAKE_CXX_FLAGS=-I"
                        #$(this-package-input
                           "qtdeclarative") "/include/qt5")
         (string-append "-DQT_IMPORTS_DIR="
                        #$output "/lib/qt5/qml")
         (string-append "-DCMAKE_INSTALL_SYSCONFDIR="
                        #$output "/etc"))
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'embed-loginctl-reference
            (lambda _
              (substitute* "CMakeLists.txt"
                (("/usr/bin/loginctl")
                 (which "loginctl"))))))))
    (synopsis "QML based X11 and Wayland display manager")
    (description "SDDM is a display manager for X11 and Wayland aiming to be
fast, simple and beautiful.  SDDM is themeable and puts no restrictions on the
user interface design.  It uses QtQuick which gives the designer the ability to
create smooth, animated user interfaces.")
user interface design.  It uses QtQuick which gives the designer the ability
to create smooth, animated user interfaces.")
    (home-page "https://github.com/sddm/sddm")
    ;; QML files are MIT licensed and images are CC BY 3.0.
    (license (list license:gpl2+ license:expat license:cc-by3.0))))

M gnu/packages/education.scm => gnu/packages/education.scm +3 -3
@@ 4,7 4,7 @@
;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2017-2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2018–2021 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018-2023 Nicolas Goaziou <mail@nicolasgoaziou.fr>
;;; Copyright © 2018-2024 Nicolas Goaziou <mail@nicolasgoaziou.fr>
;;; Copyright © 2020 Robert Smith <robertsmith@posteo.net>
;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org>
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>


@@ 564,7 564,7 @@ a pen-tablet display and a beamer.")
(define-public fet
  (package
    (name "fet")
    (version "6.9.0")
    (version "6.15.0")
    (source
     (origin
       (method url-fetch)


@@ 573,7 573,7 @@ a pen-tablet display and a beamer.")
              (list (string-append directory base)
                    (string-append directory "old/" base))))
       (sha256
        (base32 "1lnw58ga1ldhqfznclmk9l21698pg152w3slq2cwmr69ywqr5wys"))))
        (base32 "0mmk9f0b23lmmk40mv25wf9vgb7wdgfn5zsa1qrkvkh7dh1hjpax"))))
    (build-system gnu-build-system)
    (arguments
     (list

M gnu/packages/emacs-xyz.scm => gnu/packages/emacs-xyz.scm +58 -6
@@ 2017,6 2017,27 @@ Apprentice and Sourcerer.")
theme but now takes more inspiration from the Nano theme.")
    (license license:gpl3+)))

(define-public emacs-adwaita-dark-theme
  ;; Version 1.1.1 isn't tagged upstream.
  (package
    (name "emacs-adwaita-dark-theme")
    (version "1.1.1")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://gitlab.com/jessieh/adwaita-dark-theme")
                    (commit "057c39313341907b35c68d2179226886a0c276fd")))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "1g7hyg2hfvn24gaw4lca4g8lw10q2wg9nfrgl7pfdggz202m027c"))))
    (build-system emacs-build-system)
    (home-page "https://gitlab.com/jessieh/adwaita-dark-theme")
    (synopsis "Adwaita-inspired dark color scheme for Emacs")
    (description
     "This package provides an Adwaita-inspired dark color scheme for Emacs.")
    (license license:gpl2+)))

(define-public emacs-treepy
  (package
    (name "emacs-treepy")


@@ 10105,13 10126,20 @@ constants and units into an Emacs buffer.")
       (sha256
        (base32 "0kq40g46s8kgiafrhdq99h79rz9h5fvgz59k7ralmf86bl4sdmdb"))))
    (build-system emacs-build-system)
    (arguments
     (list #:phases
           #~(modify-phases %standard-phases
               (add-after 'unpack 'remove-spurious-require
                 (lambda _
                   (substitute* "tagedit.el"
                     (("\\(require 'assoc\\)") "")))))))
    (propagated-inputs
     (list emacs-s emacs-dash))
     (list emacs-dash emacs-s))
    (home-page "https://github.com/magnars/tagedit")
    (synopsis "Some paredit-like features for html-mode")
    (synopsis "Some Paredit-like features for HTML mode")
    (description
     "This package provides a collection of paredit-like functions for editing
in @code{html-mode}.")
     "This package provides a collection of Paredit-like functions for editing
in HTML mode.")
    (license license:gpl3+)))

(define-public emacs-slime


@@ 11388,6 11416,30 @@ package provides a light and a dark variant.")
Solarized color scheme.")
      (license license:expat))))

(define-public emacs-color-identifiers-mode
  (let ((commit "a26d00d898e0a3295cb7da9323046397223ea1fe")
        (revision "0"))
    (package
      (name "emacs-color-identifiers-mode")
      (version (git-version "1.1" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/ankurdave/color-identifiers-mode")
               (commit commit)))
         (file-name (git-file-name name version))
         (sha256
          (base32 "1kky827f922ziiwasrfnv97vqdf62fp9yml36x1fjsm2h6qw0c8v"))))
      (build-system emacs-build-system)
      (propagated-inputs (list emacs-dash))
      (home-page "https://github.com/ankurdave/color-identifiers-mode")
      (synopsis "Minor mode for coloring identifiers based on their names")
      (description
       "This package provides an Emacs minor mode to highlight each source
code identifier uniquely based on its name.")
      (license license:gpl3+))))

(define-public emacs-poet-theme
  (let ((commit "16eb694f0755c04c4db98614d0eca1199fddad70")
        (revision "1"))


@@ 29880,14 29932,14 @@ buffer and launches Magit from the status buffer for the project at point.")
(define-public emacs-repology
  (package
    (name "emacs-repology")
    (version "1.2.3")
    (version "1.2.4")
    (source
     (origin
       (method url-fetch)
       (uri (string-append "https://elpa.gnu.org/packages/"
                           "repology-" version ".tar"))
       (sha256
        (base32 "1ngx23b7dilyps20nznrrn867kbxyn6nryf4p1sy5m576hkw18kn"))))
        (base32 "0l53wl0bk8rnqwsjdh1hwvkvbay080l10bslcj3scn42bgbi59j1"))))
    (build-system emacs-build-system)
    (arguments
     (list

M gnu/packages/finance.scm => gnu/packages/finance.scm +2 -2
@@ 2300,7 2300,7 @@ mining.")
(define-public p2pool
  (package
    (name "p2pool")
    (version "3.7")
    (version "3.10")
    (source
     (origin
       (method git-fetch)


@@ 2309,7 2309,7 @@ mining.")
             (commit (string-append "v" version))
             (recursive? #t)))
       (file-name (git-file-name name version))
       (sha256 (base32 "1sghdk8yq8si0bq0z83fji48q8yrq0ymvsxbbh5mscw6223syrjq"))
       (sha256 (base32 "0lp9slfwaq3wp4x6xpsiazam5lv6dz57m20adzlzzk0anb1ascr0"))
       (modules '((guix build utils)))
       (snippet
        #~(for-each delete-file-recursively

M gnu/packages/firmware.scm => gnu/packages/firmware.scm +2 -2
@@ 875,7 875,7 @@ Executables included are:
  (let ((toolchain-ver "GCC5"))
    (package
      (name "ovmf")
      (version "202308")
      (version "202311")
      (source (origin
                (method git-fetch)
                (uri (git-reference


@@ 886,7 886,7 @@ Executables included are:
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "04rnfnaqr2c7ayplj7ib730zp1snw157zx5rmykz5hz1zz2vb20j"))))
                  "136dl5cxpjpg37whzlqq7jrrjsgybmwrgkbbmks8xaixqmzwhbw0"))))
      (build-system gnu-build-system)
      (arguments
       (list

M gnu/packages/fonts.scm => gnu/packages/fonts.scm +26 -3
@@ 123,6 123,29 @@
titling.")
    (license license:silofl1.1)))

(define-public font-cardo
  (package
    (name "font-cardo")
    (version "1.04")
    (source (origin
              (method url-fetch)
              (uri (string-append "https://scholarsfonts.net/cardo"
                                  (string-delete #\. version) ".zip"))
              (sha256
               (base32
                "0ps55zjva4fzmg47w2i8srrh8sqxz1wkcclihwgzlwfbaxixn0cl"))))
    (build-system font-build-system)
    (home-page "https://scholarsfonts.net/cardofnt.html")
    (synopsis "Unicode font for classical scholarship")
    (description
     "Cardo is a large unicode font specifically designed for the needs of
classicists, biblical scholars, medievalists, and linguists.  Since it may be
used to prepare materials for publication, it also contains features that are
required for high-quality typography, such as ligatures, text figures (also
known as old style numerals), true small capitals and a variety of punctuation
and space characters.")
    (license license:silofl1.1)))

(define-public font-chivo
  (let ((commit "dc61c468d79781eb5183426e88e844af16cdc3e5")
        (revision "0"))


@@ 1952,15 1975,15 @@ weights and five widths in both Roman and Italic, plus variable fonts.")
(define-public font-sarasa-gothic
  (package
    (name "font-sarasa-gothic")
    (version "0.42.6")
    (version "1.0.3")
    (source
     (origin
       (method url-fetch)
       (uri (string-append "https://github.com/be5invis/Sarasa-Gothic"
                           "/releases/download/v" version
                           "/sarasa-gothic-ttc-" version ".7z"))
                           "/Sarasa-TTC-" version ".7z"))
       (sha256
        (base32 "0czx10yph2lxg2k4w6qjnil73zb2pgg3g400apm9gay41m04990v"))))
        (base32 "1cgqf15fhg567s2bwjpal3xfcdnbgyy0iav5181zkn6b4k56dgl4"))))
    (build-system font-build-system)
    (arguments
     `(#:phases (modify-phases %standard-phases

M gnu/packages/game-development.scm => gnu/packages/game-development.scm +67 -64
@@ 196,69 196,71 @@ is used in some video games and movies.")
    (license license:zlib)))

(define-public dds
  (package
    (name "dds")
    (version "2.9.0")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/dds-bridge/dds")
             (commit (string-append "v" version))))
       (file-name (git-file-name name version))
       (sha256
        (base32
         "1iv09qic43nvla02lm8zgnkqpjgnc95p8zh3wyifmnmlh1rz02yj"))))
    (build-system gnu-build-system)
    (arguments
     (list #:phases
           #~(modify-phases %standard-phases
               (add-after 'unpack 'chdir
                 (lambda _
                   (chdir "src")))
               (replace 'configure
                 ;; Configuration is done by copying the appropriate
                 ;; make file in the working directory.  There is no
                 ;; configure script.
                 (lambda _
                   (copy-file "Makefiles/Makefile_linux_shared"
                              "Makefile")))
               (replace 'check
                 ;; There is no "check" traget.  We must compile
                 ;; a "dtest" program and apply it on a data set.
                 (lambda* (#:key tests? #:allow-other-keys)
                   (when tests?
                     (install-file "libdds.so" "../test")
                     (with-directory-excursion "../test"
                       (copy-file "Makefiles/Makefile_linux"
                                  "Makefile")
                       (substitute* "Makefile"
                         (("-Werror") ""))
                       (invoke "make")
                       (invoke "./dtest" "-f" "../hands/list100.txt")))))
               (replace 'install
                 ;; "install" target merely moves ".so" file around
                 ;; the source directory.  We install it in the store,
                 ;; along with all shipped documentation (which cannot
                 ;; be built from source unfortunately).
                 (lambda _
                   (install-file "libdds.so"
                                 (string-append #$output "/lib"))
                   (let ((doc (string-append #$output
                                             "/share/doc/"
                                             #$name "-" #$version)))
                     (install-file "../LICENSE" doc)
                     (copy-recursively "../doc" doc)))))))
    (native-inputs
     (list gawk procps))
    (inputs
     (list boost))
    (home-page "https://privat.bahnhof.se/wb758135/")
    (synopsis "Double dummy solver for the bridge card game")
    (description "DDS is a double-dummy solver of bridge hands.  It supports
  (let ((commit "d2bc4c2c703941664fc1d73e69caa5233cdeac18")
        (revision "1"))
    (package
      (name "dds")
      (version (git-version "2.9.0" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/dds-bridge/dds")
               (commit commit)))
         (file-name (git-file-name name version))
         (sha256
          (base32
           "1ishbb69cvyv96xdxshnly0m5ydwljgdf8fwa1cr9rj2qj40q4rm"))))
      (build-system gnu-build-system)
      (arguments
       (list #:phases
             #~(modify-phases %standard-phases
                 (add-after 'unpack 'chdir
                   (lambda _
                     (chdir "src")))
                 (replace 'configure
                   ;; Configuration is done by copying the appropriate
                   ;; make file in the working directory.  There is no
                   ;; configure script.
                   (lambda _
                     (copy-file "Makefiles/Makefile_linux_shared"
                                "Makefile")))
                 (replace 'check
                   ;; There is no "check" traget.  We must compile
                   ;; a "dtest" program and apply it on a data set.
                   (lambda* (#:key tests? #:allow-other-keys)
                     (when tests?
                       (install-file "libdds.so" "../test")
                       (with-directory-excursion "../test"
                         (copy-file "Makefiles/Makefile_linux"
                                    "Makefile")
                         (substitute* "Makefile"
                           (("-Werror") ""))
                         (invoke "make")
                         (invoke "./dtest" "-f" "../hands/list100.txt")))))
                 (replace 'install
                   ;; "install" target merely moves ".so" file around
                   ;; the source directory.  We install it in the store,
                   ;; along with all shipped documentation (which cannot
                   ;; be built from source unfortunately).
                   (lambda _
                     (install-file "libdds.so"
                                   (string-append #$output "/lib"))
                     (let ((doc (string-append #$output
                                               "/share/doc/"
                                               #$name "-" #$version)))
                       (install-file "../LICENSE" doc)
                       (copy-recursively "../doc" doc)))))))
      (native-inputs
       (list gawk procps))
      (inputs
       (list boost))
      (home-page "https://privat.bahnhof.se/wb758135/")
      (synopsis "Double dummy solver for the bridge card game")
      (description "DDS is a double-dummy solver of bridge hands.  It supports
single-threading and multi-threading for improved performance.  DDS
offers a wide range of functions, including par-score calculations.")
    (license license:asl2.0)))
      (license license:asl2.0))))

(define-public deutex
  (package


@@ 3269,16 3271,16 @@ progresses the level, or you may regenerate tiles as the world changes.")
(define-public bbcsdl
  (package
    (name "bbcsdl")
    (version "1.35a")
    (version "1.39a")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/rtrussell/BBCSDL/")
                    (commit "b9b2a3eb438cb799edb2766055b3c38e9518e3e3")))
                    (commit "93b0ffae960f4c4f45fdc2202bc6e83ee5ca277c")))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "1d03xmhrl6ba6w0vwfk46mpyc9d0w3bixxj2d4irx7wl7bh3bfic"))))
                "03ga14k2hbhflnaynbyx9lwlbxlzx3rv6zqq21yhl183s6d4c0wa"))))
    (build-system gnu-build-system)
    (arguments
     (list


@@ 3318,6 3320,7 @@ progresses the level, or you may regenerate tiles as the world changes.")
                     inputs (string-append "share/fonts/truetype/" font))
                    (string-append opt "/lib/" font)))
                 '("DejaVuSans.ttf" "DejaVuSansMono.ttf"
                   "DejaVuSans-Oblique.ttf"
                   "FreeSans.ttf" "FreeMono.ttf" "FreeSerif.ttf"))
                (mkdir bin)
                (symlink (string-append opt "/bbcsdl")

M gnu/packages/games.scm => gnu/packages/games.scm +135 -22
@@ 78,7 78,8 @@
;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
;;; Copyright © 2023 Florian Pelz <pelzflorian@pelzflorian.de>
;;; Copyright © 2023 Ivana Drazovic <iv.dra@hotmail.com>
;;; Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
;;; Copyright © 2023, 2024 gemmaro <gemmaro.dev@gmail.com>
;;; Copyright © 2023 Wilko Meyer <w@wmeyer.eu>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 193,6 194,7 @@
  #:use-module (gnu packages protobuf)
  #:use-module (gnu packages pulseaudio)
  #:use-module (gnu packages python)
  #:use-module (gnu packages python-compression)
  #:use-module (gnu packages python-web)
  #:use-module (gnu packages python-xyz)
  #:use-module (gnu packages qt)


@@ 230,6 232,7 @@
  #:use-module (guix build-system meson)
  #:use-module (guix build-system perl)
  #:use-module (guix build-system python)
  #:use-module (guix build-system pyproject)
  #:use-module (guix build-system qt)
  #:use-module (guix build-system scons)
  #:use-module (guix build-system trivial)


@@ 2367,6 2370,55 @@ Every puzzle has a complete solution, although there may be more than one.")
    "PrBoom+ is a Doom source port developed from the original PrBoom project.")
   (license license:gpl2+)))

(define-public redeal
  (let ((commit "e2e81a477fd31ae548a340b5f0f380594d3d0ad6")
        (revision "1"))
    (package
      (name "redeal")
      (version (git-version "0.2.0" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/anntzer/redeal")
               (commit commit)))
         (file-name (git-file-name name version))
         (sha256
          (base32
           "1vac36bg4ah9gs4hgmp745xq6nnmd7s71vsq99d72ng3sxap0wa3"))))
      (build-system pyproject-build-system)
      (arguments
       (list
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'unbundle-dds
              (lambda* (#:key inputs #:allow-other-keys)
                (substitute* "setup.py"
                  (("cmdclass=.*") ""))
                (let ((libdds (search-input-file inputs "lib/libdds.so")))
                  (substitute* "redeal/dds.py"
                    ((" and os.path.exists\\(dll_path\\)") "")
                    (("dll = DLL\\(dll_path\\)")
                     (format #f "dll = DLL(~s)" libdds))))))
            (add-after 'install 'install-examples
              (lambda _
                (let* ((doc (string-append #$output "/share/doc/"))
                       (examples
                        (string-append doc #$name "-" #$version "/examples")))
                  (mkdir-p examples)
                  (copy-recursively "examples" examples)))))))
      (inputs (list dds `(,python "tk")))
      (propagated-inputs (list python-colorama))
      (home-page "https://github.com/anntzer/redeal")
      (synopsis
       "Deal generator for bridge card game, written in Python")
      (description
       "Redeal is a deal generator written in Python.  It outputs deals
satisfying whatever conditions you specify --- deals with a double void, deals
with a strong 2♣ opener opposite a yarborough, etc.  Using Bo Haglund's double
dummy solver, it can even solve the hands it has generated for you.")
      (license license:gpl3))))

(define-public retux
  (let ((release "1.6.1")
        (revision 0))


@@ 3385,25 3437,29 @@ a C library, so they can easily be integrated into other programs.")
(define-public taisei
  (package
    (name "taisei")
    (version "1.3.2")
    (version "1.4")
    (source
     (origin
       (method url-fetch)
       (uri (string-append "https://github.com/taisei-project/"
                           "taisei/releases/download/v" version
                           "/taisei-v" version ".tar.xz"))
                           "/taisei-" version ".tar.xz"))
       (sha256
        (base32 "1g53fcyrlzmvlsb40pw90gaglysv6n1w42hk263iv61ibhdmzh6v"))))
        (base32 "1glrr99xiyz674d1izgvmk9w1zxanc94d34pacd0wya66bbml0nc"))))
    (build-system meson-build-system)
    (arguments
     `(#:build-type "release"      ;comment out for bug-reporting (and cheats)
       #:configure-flags
       (list "-Dr_default=gles30"
             "-Dr_gles20=true"
             "-Dr_gles30=true"
             "-Dshader_transpiler=true")))
     (list
      #:build-type "release" ;comment out for bug-reporting (and cheats)
      #:configure-flags #~(list "-Dr_default=gles30"
                                "-Dr_gles20=true"
                                "-Dr_gles30=true"
                                "-Dshader_transpiler=true")))
    (native-inputs
     (list pkg-config python python-docutils python-pygments))
     (list pkg-config
           python
           python-docutils
           python-pygments
           python-zstandard))
    (inputs
     (list cglm
           freetype


@@ 3417,21 3473,23 @@ a C library, so they can easily be integrated into other programs.")
           sdl2-mixer
           shaderc
           spirv-cross
           zlib))
           zlib
           (list zstd "lib")))
    (home-page "https://taisei-project.org/")
    (synopsis "Shoot'em up fangame and libre clone of Touhou Project")
    (description
     "The player controls a character (one of three: Good, Bad, and Dead),
dodges the missiles (lots of it cover the screen, but the character's hitbox
is very small), and shoot at the adversaries that keep appear on the screen.")
    (license (list ;;game
                   license:expat
                   ;;resources/00-taisei.pkgdir/bgm/
                   ;;atlas/portraits/
                   license:cc-by4.0
                   ;;miscellaneous
                   license:cc0
                   license:public-domain))))
    (license (list
              ;; game
              license:expat
              ;; resources/00-taisei.pkgdir/bgm/
              ;; atlas/portraits/
              license:cc-by4.0
              ;; miscellaneous
              license:cc0
              license:public-domain))))

(define-public cmatrix
  (package


@@ 3833,7 3891,7 @@ for common mesh file formats, and collision detection.")
  (package
    (inherit irrlicht)
    (name "irrlicht-for-minetest")
    (version "1.9.0mt10")
    (version "1.9.0mt13")
    (source
     (origin
       (method git-fetch)


@@ 3843,7 3901,7 @@ for common mesh file formats, and collision detection.")
       (file-name (git-file-name name version))
       (sha256
        (base32
         "0y5vchz91khs8dmrkpgc7sqmvzx2yjj6svivvm80r4yppv7s03rw"))))
         "11pxg0yh50ym1hvh8va5jbbcjz5dsshj3xxvm3qhkgg96vpism06"))))
    (build-system cmake-build-system)
    (arguments
     ;; No check target.


@@ 10115,6 10173,36 @@ can be downloaded from @url{https://zero.sjeng.org/best-network}.")
   (home-page "https://github.com/bernds/q5Go")
   (license license:gpl2+)))

(define-public qcheckers
  (package
    (name "qcheckers")
    (version "0.9.0")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/portnov/qcheckers")
             (commit version)))
       (file-name (git-file-name name version))
       (sha256
        (base32 "05wzql6abzdf6l0vdzki4rfy2zn31mcplh1wkw3ddk8w81pvaymw"))))
    (build-system qt-build-system)
    (arguments
     (list
      #:tests? #f
      #:phases
      #~(modify-phases %standard-phases
          (replace 'configure
            (lambda _
              (invoke "qmake"
                      (string-append "PREFIX=" #$output)))))))
    (inputs (list qtbase-5 qtsvg-5))
    (home-page "https://portnov.github.io/qcheckers/")
    (synopsis "Qt-based checkers boardgame")
    (description "QCheckers, formely known as KCheckers, is a is a Qt version
of the classic boardgame checkers (also known as draughts).")
    (license license:gpl2+)))

(define-public xmoto
  (package
    (name "xmoto")


@@ 10415,6 10503,31 @@ sunfish, but is written in C rather than Python.  It also has TUI tools for
using any UCI engine and also to connect UCI engines to Lichess.")
      (license license:agpl3+))))

(define-public morris
  (package
    (name "morris")
    (version "0.3")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/farindk/morris")
             (commit (string-append "v" version))))
       (file-name (git-file-name name version))
       (sha256
        (base32 "1kkcnpkzgybm7rqg7nafd7sqd5m4alns6l4j5zcf3p41jdc9s3iv"))))
    (build-system glib-or-gtk-build-system)
    (inputs (list automake autoconf pkg-config intltool
		 gnu-gettext libtool glib gtk+-2 boost))
    (arguments `(#:tests? #f))
    (home-page "http://nine-mens-morris.net/downloads.html")
    (synopsis "Morris is an implementation of the board game Nine Men's Morris")
    (description "Morris is an implementation of the board game Nine Men's Morris.
It supports not only the standard game, but also several rule-variants and different
board layouts. You can play against the computer, or simply use the program to
present the board, but play against another human opponent.")
    (license license:gpl3)))

(define-public barrage
  (package
    (name "barrage")

M gnu/packages/gcc.scm => gnu/packages/gcc.scm +4 -1
@@ 3,7 3,7 @@
;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2014, 2015, 2016, 2017, 2019, 2021 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2015, 2023 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2015-2018, 2020-2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2015-2018, 2020-2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016 Carlos Sánchez de La Lama <csanchezdll@gmail.com>
;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018, 2020, 2022 Marius Bakke <marius@gnu.org>


@@ 75,6 75,9 @@ where the OS part is overloaded to denote a specific ABI---into GCC
           "--with-mode=thumb"
           "--with-fpu=neon"))

        ((string-match "x86_64-linux-gnux32" target)
         '("--with-abi=mx32"))

        ((and (string-suffix? "-gnu" target)
              (not (string-contains target "-linux")))
         ;; Cross-compilation of libcilkrts in GCC 5.5.0 to GNU/Hurd fails

M gnu/packages/geo.scm => gnu/packages/geo.scm +28 -0
@@ 3228,3 3228,31 @@ For maps, it can uses its own \"binfile\" map format, or Garmin map
file format, and data from OpenStreetMap, Garmin maps, Marco Polo
Grosser Reiseplaner, Routeplaner Europa 2007, Map + Route.")
    (license license:gpl2)))

(define-public laszip
  (package
    (name "laszip")
    (version "3.4.3")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/LASzip/LASzip")
             (commit "3.4.3")))
       (file-name (git-file-name name version))
       (sha256
        (base32 "09lcsgxwv0jq50fhsgfhx0npbf1zcwn3hbnq6q78fshqksbxmz7m"))))
    (build-system cmake-build-system)
    (arguments
     (list
      #:configure-flags #~(list "-DLASZIP_BUILD_STATIC=NO")
      #:build-type "Release"
      ;; No tests.
      #:tests? #f))
    (home-page "https://laszip.org/")
    (synopsis "Compression library for LAS files")
    (description
     "LASzip is a library for compressing @code{LAS} files and uncompressing
@code{LAZ} files.  The @code{LAS} format is a file format designed for the
interchange and archiving of lidar point cloud data.")
    (license license:asl2.0)))

M gnu/packages/gl.scm => gnu/packages/gl.scm +17 -12
@@ 18,7 18,7 @@
;;; Copyright © 2021, 2022, 2023 John Kehayias <john.kehayias@protonmail.com>
;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
;;; Copyright © 2023 Kaelyn Takata <kaelyn.alexi@protonmail.com>
;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
;;; Copyright © 2023, 2024 Zheng Junjie <873216071@qq.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 62,6 62,7 @@
  #:use-module (guix download)
  #:use-module (guix git-download)
  #:use-module (guix hg-download)
  #:use-module (gnu packages cmake)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system cmake)
  #:use-module (guix build-system meson)


@@ 294,7 295,7 @@ also known as DXTn or DXTC) for Mesa.")
(define-public mesa
  (package
    (name "mesa")
    (version "23.2.1")
    (version "23.3.2")
    (source
      (origin
        (method url-fetch)


@@ 304,7 305,7 @@ also known as DXTn or DXTC) for Mesa.")
                                  "mesa-" version ".tar.xz")))
        (sha256
         (base32
          "1k61pgw0vcjrlb4299q98cy7iqmk2r7jmb5ika91z01dzhb0dpk4"))))
          "1p4swrbmz3kb1805kdj973hf8virgmix4m9qprmcb2bgl4gviz1w"))))
    (build-system meson-build-system)
    (propagated-inputs
     ;; The following are in the Requires.private field of gl.pc.


@@ 338,7 339,8 @@ also known as DXTn or DXTC) for Mesa.")
            python-wrapper
            (@ (gnu packages base) which)
            (if (%current-target-system)
              (list pkg-config-for-build
              (list cmake-minimal-cross
                    pkg-config-for-build
                    wayland
                    wayland-protocols)
              '())))


@@ 351,16 353,16 @@ also known as DXTn or DXTC) for Mesa.")
             ((target-aarch64?)
              ;; TODO: Fix svga driver for non-Intel architectures.
              '("-Dgallium-drivers=etnaviv,freedreno,kmsro,lima,nouveau,\
panfrost,r300,r600,swrast,tegra,v3d,vc4,virgl"))
panfrost,r300,r600,swrast,tegra,v3d,vc4,virgl,zink"))
             ((target-arm32?)
              ;; Freedreno FTBFS when built on a 64-bit machine.
              '("-Dgallium-drivers=etnaviv,kmsro,lima,nouveau,panfrost,\
r300,r600,swrast,tegra,v3d,vc4,virgl"))
r300,r600,swrast,tegra,v3d,vc4,virgl,zink"))
             ((or (target-ppc64le?) (target-ppc32?) (target-riscv64?))
              '("-Dgallium-drivers=nouveau,r300,r600,radeonsi,swrast,virgl"))
              '("-Dgallium-drivers=nouveau,r300,r600,radeonsi,swrast,virgl,zink"))
             (else
              '("-Dgallium-drivers=crocus,iris,nouveau,r300,r600,radeonsi,\
svga,swrast,virgl")))
svga,swrast,virgl,zink")))
         ;; Enable various optional features.  TODO: opencl requires libclc,
         ;; omx requires libomxil-bellagio
         "-Dplatforms=x11,wayland"


@@ 415,10 417,13 @@ svga,swrast,virgl")))
       #~(modify-phases %standard-phases
         #$@(if (%current-target-system)
              #~((add-after 'unpack 'fix-cross-compiling
                   (lambda* (#:key inputs #:allow-other-keys)
                     ;; It isn't a problem to use the host's llvm-config.
                     (setenv "LLVM_CONFIG"
                             (search-input-file inputs "/bin/llvm-config")))))
                   (lambda* (#:key native-inputs #:allow-other-keys)
                     ;; When cross compiling, we use cmake to find llvm, not
                     ;; llvm-config, because llvm-config cannot be executed
                     ;; see https://github.com/llvm/llvm-project/issues/58984
                     (setenv "CMAKE"
                             (search-input-file
                              native-inputs "/bin/cmake")))))
              #~())
         (add-after 'unpack 'disable-failing-test
           (lambda _

M gnu/packages/gnome.scm => gnu/packages/gnome.scm +10 -7
@@ 11,7 11,7 @@
;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020, 2023 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2015, 2016, 2017, 2018, 2021 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2015 David Thompson <davet@gnu.org>
;;; Copyright © 2015-2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2015-2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016, 2017, 2018 Rene Saavedra <pacoon@protonmail.com>
;;; Copyright © 2016 Jochem Raat <jchmrt@riseup.net>
;;; Copyright © 2016, 2017, 2019 Kei Kebreau <kkebreau@posteo.net>


@@ 4781,12 4781,15 @@ GLib and GObject, and integrates JSON with GLib data types.")
                           (string-append #$output:doc
                                          "/share/gtk-doc"))))))))))
    (native-inputs
     (modify-inputs (package-native-inputs json-glib-minimal)
       (prepend docbook-xml-4.3
                docbook-xsl
                gobject-introspection
                gtk-doc
                libxslt)))))
     (if (%current-target-system)
         ;; No docs, no additional inputs.
         (package-native-inputs json-glib-minimal)
         (modify-inputs (package-native-inputs json-glib-minimal)
                        (prepend docbook-xml-4.3
                                 docbook-xsl
                                 gobject-introspection
                                 gtk-doc
                                 libxslt))))))

(define-public libxklavier
  (package

M gnu/packages/gnuzilla.scm => gnu/packages/gnuzilla.scm +4 -1
@@ 1034,6 1034,9 @@ variable defined below.  It requires guile-json to be installed."
                (setenv "MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE" "system")
                (setenv "MOZ_BUILD_DATE" #$%icecat-build-id) ; avoid timestamp

                ;; WM_CLASS (default is "$MOZ_APP_NAME-$MOZ_UPDATE_CHANNEL").
                (setenv "MOZ_APP_REMOTINGNAME" "Icecat")

                ;; XXX TODO: Fix this to work on systems other than x86_64-linux.
                (setenv "GUIX_PYTHONPATH"
                        (string-append (getcwd)


@@ 1126,7 1129,7 @@ variable defined below.  It requires guile-json to be installed."
                  (("NewWindow")        "new-window")
                  (("NewPrivateWindow") "new-private-window")
                  (("StartupNotify=true")
                   "StartupNotify=true\nStartupWMClass=Navigator"))
                   "StartupNotify=true\nStartupWMClass=Icecat"))
                (install-file desktop-file applications))))
          (add-after 'install-desktop-entry 'install-icons
            (lambda _

M gnu/packages/golang-web.scm => gnu/packages/golang-web.scm +3 -2
@@ 21,6 21,7 @@
;;; Copyright © 2023 Hilton Chain <hako@ultrarare.space>
;;; Copyright © 2023 Katherine Cox-Buday <cox.katherine.e@gmail.com>
;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
;;; Copyright © 2023 Artyom V. Poptsov <poptsov.artyom@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 870,7 871,7 @@ protocol.")
(define-public go-github-com-hjson-hjson-go
  (package
    (name "go-github-com-hjson-hjson-go")
    (version "3.1.0")
    (version "4.3.1")
    (source
     (origin
       (method git-fetch)


@@ 879,7 880,7 @@ protocol.")
             (commit (string-append "v" version))))
       (file-name (git-file-name name version))
       (sha256
        (base32 "1dfdiahimg6z9idg8jiqxwnlwjnmasbjccx8gnag49cz4yfqskaz"))))
        (base32 "138vmbnrwzxf64cia27k407clrydvs2jx927dlv6ziydiqyvy7m3"))))
    (build-system go-build-system)
    (arguments
     '(#:import-path "github.com/hjson/hjson-go"))

M gnu/packages/golang.scm => gnu/packages/golang.scm +15 -37
@@ 3959,11 3959,11 @@ packages.")
      (license license:bsd-3))))

(define-public go-golang-org-x-sys
  (let ((commit "b60007cc4e6f966b1c542e343d026d06723e5653")
  (let ((commit "ca59edaa5a761e1d0ea91d6c07b063f85ef24f78")
        (revision "0"))
    (package
      (name "go-golang-org-x-sys")
      (version (git-version "0.4.0" revision commit))
      (version (git-version "0.8.0" revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference


@@ 3972,7 3972,7 @@ packages.")
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "0fr2d6fnpbqx6n89sg9lsinqkdaw49y068kqj2g0cxlhbh69hzii"))))
                  "1p81niiin8dwyrjl2xsc95136w3vdw4kmj0w3mlh0vh5v134s4xq"))))
      (build-system go-build-system)
      (arguments
       (list


@@ 3989,24 3989,6 @@ support for low-level interaction with the operating system.")
      (home-page "https://go.googlesource.com/sys")
      (license license:bsd-3))))

;; XXX: This version is required for "go-github-com-quic-go-qtls-go1-20".
(define-public go-golang-org-x-sys-0.8
  (let ((commit "ca59edaa5a761e1d0ea91d6c07b063f85ef24f78")
        (revision "0"))
    (package
      (inherit go-golang-org-x-sys)
      (name "go-golang-org-x-sys")
      (version (git-version "0.8.0" revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://go.googlesource.com/sys")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "1p81niiin8dwyrjl2xsc95136w3vdw4kmj0w3mlh0vh5v134s4xq")))))))

(define-public go-golang-org-x-text
  (package
    (name "go-golang-org-x-text")


@@ 7269,7 7251,7 @@ implementation of generics.")
      #:import-path "github.com/quic-go/qtls-go1-20"
      #:go go-1.20))
    (propagated-inputs (list go-golang-org-x-crypto
                             go-golang-org-x-sys-0.8))
                             go-golang-org-x-sys))
    (synopsis "TLS 1.3 for QUIC")
    (description
     "Go standard library TLS 1.3 implementation, modified for QUIC.  For


@@ 7330,21 7312,17 @@ the Go standard library}.")
           #:tests? #f
           #:go go-1.20))
    (propagated-inputs
     (let ((p (package-input-rewriting
               `((,go-golang-org-x-sys . ,go-golang-org-x-sys-0.8))
               #:deep? #true)))
       (cons go-golang-org-x-sys-0.8
             (map p
                  (list go-github-com-quic-go-qtls-go1-20
                        go-github-com-quic-go-qpack
                        go-golang-org-x-crypto
                        go-github-com-cheekybits-genny
                        go-github-com-marten-seemann-chacha20
                        go-github-com-golang-protobuf-proto
                        go-golang-org-x-crypto
                        go-golang-org-x-exp
                        go-golang-org-x-net
                        go-golang-org-x-sync)))))
     (list go-github-com-quic-go-qtls-go1-20
           go-github-com-quic-go-qpack
           go-golang-org-x-crypto
           go-github-com-cheekybits-genny
           go-github-com-marten-seemann-chacha20
           go-github-com-golang-protobuf-proto
           go-golang-org-x-crypto
           go-golang-org-x-exp
           go-golang-org-x-net
           go-golang-org-x-sys
           go-golang-org-x-sync))
    (synopsis "QUIC in Go")
    (description "This package provides a Go language implementation of the QUIC
network protocol.")

M gnu/packages/graph.scm => gnu/packages/graph.scm +46 -4
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017, 2018, 2019, 2020, 2022, 2023 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2017-2024 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2018 Joshua Sierles, Nextjournal <joshua@nextjournal.com>
;;; Copyright © 2018, 2020, 2022 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2019, 2021, 2022 Efraim Flashner <efraim@flashner.co.il>


@@ 426,6 426,48 @@ algorithm for community detection in large networks.")
large networks.")
    (license license:gpl3+)))

(define-public python-louvain-igraph
  (package
    (name "python-louvain-igraph")
    (version "0.8.1")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/vtraag/louvain-igraph")
             (commit version)))
       (file-name (git-file-name name version))
       (sha256
        (base32
         "1j2ybihvvzggwjb9zvm829aqb5b94q10h8bw6v0h42xd9w75z9sv"))))
    (build-system pyproject-build-system)
    (arguments
     (list
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'find-igraph
            (lambda _
              (setenv "SETUPTOOLS_SCM_PRETEND_VERSION" #$version)
              (substitute* "setup.py"
                (("/usr/include/igraph")
                 (string-append #$(this-package-input "igraph")
                                "/include/igraph"))))))))
    (propagated-inputs (list python-igraph))
    (inputs (list igraph))
    (native-inputs
     (list python-ddt
           python-setuptools-scm
           pkg-config))
    (home-page "https://github.com/vtraag/louvain-igraph")
    (synopsis "Implementation of the Louvain algorithm")
    (description "This package implements the Louvain algorithm for community
detection in C++ and exposes it to Python.  Besides the relative flexibility
of the implementation, it also scales well, and can be run on graphs of
millions of nodes (as long as they can fit in memory).  The core function is
@code{find_partition} which finds the optimal partition using the louvain
algorithm for a number of different methods.")
    (license license:gpl3+)))

(define-public faiss
  (package
    (name "faiss")


@@ 449,8 491,8 @@ large networks.")
    (build-system cmake-build-system)
    (arguments
     `(#:configure-flags
       (list "-DBUILD_WITH_GPU=OFF"  ; thanks, but no thanks, CUDA.
             "-DBUILD_TUTORIAL=OFF") ; we don't need those
       (list "-DBUILD_WITH_GPU=OFF"     ; thanks, but no thanks, CUDA.
             "-DBUILD_TUTORIAL=OFF")    ; we don't need those
       #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'prepare-build


@@ 466,7 508,7 @@ large networks.")
                                         '()))))))
               (substitute* "CMakeLists.txt"
                 (("-m64") "")
                 (("-mpopcnt") "") ; only some architectures
                 (("-mpopcnt") "")      ; only some architectures
                 (("-msse4")
                  (string-append
                   (string-join features)

M gnu/packages/graphviz.scm => gnu/packages/graphviz.scm +3 -9
@@ 195,7 195,7 @@ structure and layout algorithms.")
(define-public python-uqbar
  (package
    (name "python-uqbar")
    (version "0.5.6")
    (version "0.5.9")
    (source
     (origin
       (method git-fetch)


@@ 205,18 205,12 @@ structure and layout algorithms.")
       (file-name (git-file-name name version))
       (sha256
        (base32
         "1ml3x2mf7nlnvrh9lari5yk0sz2mmg39jwsbjxnpzhnw4kcwpdrs"))))
         "0c573nzpm51qgz2g296f8pw8ys0i3r6daynxk06zagk5l5fgw9ar"))
       (patches (search-patches "python-uqbar-python3.10.patch"))))
    (build-system python-build-system)
    (arguments
     `(#:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'patch
           (lambda _
             (substitute* "setup.py"
               ;; Latest versions of sphink-rtd-theme require npm to build.
               (("sphinx-rtd-theme >= 0.5.0") "sphinx-rtd-theme >= 0.2.4")
               (("black") "black >= 19.10b0"))
             #t))
         (replace 'check
           (lambda* (#:key tests? #:allow-other-keys)
             (when tests?

M gnu/packages/gtk.scm => gnu/packages/gtk.scm +5 -1
@@ 1178,7 1178,11 @@ application suites.")
                ;; The unaligned-offscreen test fails for unknown reasons, also
                ;; on different distributions (see:
                ;; https://gitlab.gnome.org/GNOME/gtk/-/issues/4889).
                (("  'unaligned-offscreen',") ""))
                (("  'unaligned-offscreen',") "")
                ;; This test, 'gtk:tools / validate', started failing for
                ;; unknown reasons after updating mesa to 23.3.1 and xorgproto
                ;; to 2023.2.
                ((" 'validate',") ""))
              (substitute* "testsuite/reftests/meson.build"
                (("[ \t]*'label-wrap-justify.ui',") "")
                ;; The inscription-markup.ui fails due to /etc/machine-id

M gnu/packages/guile-xyz.scm => gnu/packages/guile-xyz.scm +154 -2
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2012-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2015, 2017, 2022 Christine Lemmer-Webber <cwebber@dustycloud.org>
;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>


@@ 816,7 816,8 @@ tables.")
               (base32
                "0wvdi4l58f9a5c9wi3cdc9l1bniscsixb6w2zj86mch7j7j814lc"))
              (patches
               (search-patches "guile-fibers-libevent-32-bit.patch"))))
               (search-patches "guile-fibers-libevent-32-bit.patch"
                               "guile-fibers-libevent-timeout.patch"))))
    (build-system gnu-build-system)
    (arguments
     (list #:make-flags


@@ 1839,6 1840,33 @@ written in pure Scheme by using Guile's foreign function interface.")
library}.")
    (license license:gpl3+)))

(define-public guile-yamlpp
  (package
    (name "guile-yamlpp")
    (version "0.2")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://gitlab.com/yorgath/guile-yamlpp")
             (commit version)))
       (file-name (git-file-name name version))
       (sha256
        (base32 "14mlqi7hw7pi9scwk1g432issnqcn185pd8na2plijxq55cy0iq7"))))
    (build-system gnu-build-system)
    (native-inputs (list autoconf automake libtool pkg-config))
    (inputs (list guile-3.0 yaml-cpp))
    (native-search-paths
     (list (search-path-specification
            (variable "GUILE_EXTENSIONS_PATH")
            (files (list "lib/guile/3.0")))))
    (home-page "https://gitlab.com/yorgath/guile-yamlpp")
    (synopsis "Guile YAML reader/writer based on @code{yaml-cpp}")
    (description
     "A module for GNU Guile to read and write YAML files.  It works using
bindings to the @code{yaml-cpp} C++ library.")
    (license license:gpl3+)))

(define-public guile-dbi
  (package
    (name "guile-dbi")


@@ 3565,6 3593,80 @@ structures.  This package re-uses the SRFI sample implementation.")
           ;; contains ISC code from the SRFI sample implementation
           license:isc))))

(define-public guile-srfi-133
  (package
    (name "guile-srfi-133")
    (version "0.0.1")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/scheme-requests-for-implementation/srfi-133")
             (commit "db81a114cd3e23375f024baec15482614ec90453")))
       (file-name (git-file-name name version))
       (sha256
        (base32
         "0a7srl72291yah0aj6rwddhj041v2spximhknjj7hczlparsrm7f"))))
    (build-system guile-build-system)
    (arguments
     (list
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'move-create-and-delete-files
            (lambda _
              (rename-file "vectors" "srfi")
              (rename-file "srfi/vectors-test.scm" "srfi/srfi-test.scm")
              (rename-file "srfi/vectors-impl.scm" "srfi/srfi-impl.scm")
              (with-output-to-file "srfi/srfi-133.scm"
                (lambda ()
                  (display "(define-module (srfi srfi-133)
  #:replace (;; Constructors
             vector-copy

             ;; Mutators
             vector-fill! vector-copy!

             ;; Conversion
             vector->list list->vector)
  #:export (;; Constructors
            vector-unfold vector-unfold-right vector-reverse-copy
            vector-append vector-concatenate vector-append-subvectors

            ;; Predicates
            vector-empty? vector=

            ;; Iteration
            vector-fold vector-fold-right vector-map vector-map!
            vector-for-each vector-count vector-cumulate

            ;; Searching
            vector-index vector-index-right vector-skip vector-skip-right
            vector-binary-search vector-any vector-every vector-partition

            ;; Mutators
            vector-swap! vector-reverse!
            vector-reverse-copy! vector-unfold! vector-unfold-right!

            ;; Conversion
            reverse-vector->list reverse-list->vector
            vector->string string->vector))

(include \"srfi-impl.scm\")")))
              (for-each (lambda (filename)
                          (delete-file filename))
                        '("tests/run.scm"
                          "srfi/vectors.sld"
                          "srfi/vectors.scm")))))))
    (native-inputs
     (list guile-3.0))
    (home-page "https://github.com/scheme-requests-for-implementation/srfi-133")
    (synopsis "R7RS-compatible vector library for Guile")
    (description
     "This package provides a Guile implementation of
@uref{https://srfi.schemers.org/srfi-133/srfi-133.html, SRFI-133}, a
comprehensive library of vector operations.")
    (license license:expat)))

(define-public guile-srfi-145
  (package
    (name "guile-srfi-145")


@@ 3766,6 3868,56 @@ Either represents the concept of values which are either correct (Right)
or errors (Left).")
      (license license:expat))))

(define-public guile-srfi-232
  (package
    (name "guile-srfi-232")
    (version "0.0.1")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/scheme-requests-for-implementation/srfi-232")
             (commit "c3f580d220778cd71492aba4fdd0c7040968e705")))
       (file-name (git-file-name name version))
       (sha256
        (base32
         "0lp4zcqjjj6hwfh3ix71wak1nffgg4npzsg7cdxfn9hf6iwf9xby"))))
    (build-system guile-build-system)
    (arguments
     (list
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'move-and-delete-things
            (lambda _
              (let* ((srfi-directory (string-append #$output "/srfi")))
                (mkdir-p "srfi")
                (with-output-to-file "srfi/srfi-232.scm"
                  (lambda ()
                    (display "(define-library (srfi srfi-232)
 (export curried define-curried)
 (import (only (guile) import)
         (scheme base))
 (include \"../srfi-232.scm\"))")))
                (for-each (lambda (filename)
                            (delete-file filename))
                          '("test-body.scm"
                            "test-chibi.scm"
                            "test-srfi-64.scm"))))))))
    (native-inputs
     (list guile-3.0))
    (home-page "https://github.com/scheme-requests-for-implementation/srfi-232")
    (synopsis "Flexible curried procedures")
    (description
     " This package provides an implementation of
@uref{https://srfi.schemers.org/srfi-232/srfi-232.html, SRFI-232}, which
describes @code{curried}, a variant of @code{lambda} that creates true curried
procedures which also behave just like ordinary Scheme procedures.  They can
be applied to their arguments one by one, all at once, or anywhere in between,
without any novel syntax.  @code{curried} also supports nullary and variadic
procedures, and procedures created with it have predictable behavior when
applied to surplus arguments.")
    (license license:expat)))

(define-public emacsy
  (package
    (name "emacsy")

M gnu/packages/jami.scm => gnu/packages/jami.scm +119 -325
@@ 2,7 2,7 @@
;;; Copyright © 2019 Pierre Neidhardt <mail@ambrevar.xyz>
;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
;;; Copyright © 2019, 2020 Jan Wielkiewicz <tona_kosmicznego_smiecia@interia.pl>
;;; Copyright © 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020, 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 38,6 38,7 @@
  #:use-module (gnu packages guile)
  #:use-module (gnu packages libcanberra)
  #:use-module (gnu packages linux)
  #:use-module (gnu packages markup)
  #:use-module (gnu packages networking)
  #:use-module (gnu packages perl)
  #:use-module (gnu packages pkg-config)


@@ 54,6 55,7 @@
  #:use-module (gnu packages version-control)
  #:use-module (gnu packages video)
  #:use-module (gnu packages vulkan)
  #:use-module (gnu packages web)
  #:use-module (gnu packages webkit)
  #:use-module (gnu packages xdisorg)
  #:use-module (gnu packages xiph)


@@ 68,307 70,33 @@
  #:use-module (guix packages)
  #:use-module (guix utils))

(define %jami-version "20230323.0")
;;; We use nightlies as stable versions are a bit far in-between, and often
;;; have bugs anyway.  When the nightly version change, do not forget to
;;; retrieve the associated daemon submodule commit and update it in
;;; %jami-daemon-commit variable below.

(define %jami-sources
  ;; Return an origin object of the tarball release sources archive of the
  ;; Jami project.
  (origin
    (method url-fetch)
    (uri (string-append "https://dl.jami.net/release/tarballs/jami-"
                        %jami-version ".tar.gz"))
    (modules '((guix build utils)))
    (snippet
     ;; Delete multiple MiBs of bundled tarballs.  The daemon/contrib
     ;; directory contains the custom patches for pjproject and other
     ;; libraries used by Jami.
     '(delete-file-recursively "daemon/contrib/tarballs"))
    (sha256
     (base32
      "0vjsjr37cb87j9hqbmipyxn4877k1wn3l0vzca3l3ldgknglz7v2"))
    (patches (search-patches "jami-disable-integration-tests.patch"
                             "jami-libjami-headers-search.patch"))))

;; Jami maintains a set of patches for some key dependencies (currently
;; pjproject and ffmpeg) of Jami that haven't yet been integrated upstream.
;; This procedure simplifies the process of applying them.
(define jami-apply-custom-patches
  #~(lambda* (#:key dep-name patches)
      (let ((patches-directory "patches"))
        (mkdir-p patches-directory)
        (invoke "tar" "-xvf" #$%jami-sources
                "-C" patches-directory
                "--strip-components=5"
                "--wildcards"
                (string-append "jami-*/daemon/contrib/src/" dep-name))
        (for-each (lambda (f)
                    (invoke "patch" "--force" "--ignore-whitespace" "-p1" "-i"
                            (string-append patches-directory "/" f ".patch")))
                  patches))))

(define-public pjproject-jami
  (let ((commit "e4b83585a0bdf1523e808a4fc1946ec82ac733d0")
        (revision "3"))
    (package
      (inherit pjproject)
      (name "pjproject-jami")
      (version (git-version "2.12" revision commit))
      (source (origin
                (inherit (package-source pjproject))
                ;; The Jami development team regularly issues patches to
                ;; pjproject to extend the its functionality and fix bugs;
                ;; they are submitted for inclusion upstream but larger
                ;; patches take time to be reviewed and merged, hence this
                ;; forked repository.
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/savoirfairelinux/pjproject")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "0gky5idyyqxhqk959lzys5l7x1i925db773lfdpvxxmkmfizdq21"))))
      (arguments
       (substitute-keyword-arguments (package-arguments pjproject)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-after 'unpack 'apply-patches
                (lambda _
                  (#$jami-apply-custom-patches
                   #:dep-name "pjproject"
                   #:patches
                   ;; This adds a config_site.h configuration file that sets
                   ;; constants such as PJ_ICE_MAX_CAND that cannot be
                   ;; configured at build time.
                   '("0009-add-config-site")))))))))))

;; The following variables are configure flags used by ffmpeg-jami.  They're
;; from the jami/daemon/contrib/src/ffmpeg/rules.mak file.  We try to keep it
;; as close to the official Jami package as possible, to provide all the
;; codecs and extra features that are expected (see:
;; https://review.jami.net/plugins/gitiles/jami-daemon/+/refs/heads/master/contrib/src/ffmpeg/rules.mak).
;; An exception are the ffnvcodec-related switches, which is not packaged in
;; Guix and would not work with Mesa.
(define %ffmpeg-default-configure-flags
  '("--disable-everything"
    "--enable-zlib"
    "--enable-gpl"
    "--enable-swscale"
    "--enable-bsfs"
    "--disable-filters"
    "--disable-programs"
    "--disable-postproc"
    "--disable-protocols"
    "--enable-protocol=crypto"
    "--enable-protocol=file"
    "--enable-protocol=rtp"
    "--enable-protocol=srtp"
    "--enable-protocol=tcp"
    "--enable-protocol=udp"
    "--enable-protocol=unix"
    "--enable-protocol=pipe"

    ;; Enable muxers/demuxers.
    "--disable-demuxers"
    "--disable-muxers"
    "--enable-muxer=rtp"
    "--enable-muxer=g722"
    "--enable-muxer=g726"
    "--enable-muxer=g726le"
    "--enable-muxer=h263"
    "--enable-muxer=h264"
    "--enable-muxer=hevc"
    "--enable-muxer=matroska"
    "--enable-muxer=wav"
    "--enable-muxer=webm"
    "--enable-muxer=ogg"
    "--enable-muxer=pcm_s16be"
    "--enable-muxer=pcm_s16le"
    "--enable-demuxer=rtp"
    "--enable-demuxer=mjpeg"
    "--enable-demuxer=mjpeg_2000"
    "--enable-demuxer=mpegvideo"
    "--enable-demuxer=gif"
    "--enable-demuxer=image_jpeg_pipe"
    "--enable-demuxer=image_png_pipe"
    "--enable-demuxer=image_webp_pipe"
    "--enable-demuxer=matroska"
    "--enable-demuxer=m4v"
    "--enable-demuxer=mp3"
    "--enable-demuxer=ogg"
    "--enable-demuxer=flac"
    "--enable-demuxer=wav"
    "--enable-demuxer=ac3"
    "--enable-demuxer=g722"
    "--enable-demuxer=g723_1"
    "--enable-demuxer=g726"
    "--enable-demuxer=g726le"
    "--enable-demuxer=pcm_mulaw"
    "--enable-demuxer=pcm_alaw"
    "--enable-demuxer=pcm_s16be"
    "--enable-demuxer=pcm_s16le"
    "--enable-demuxer=h263"
    "--enable-demuxer=h264"
    "--enable-demuxer=hevc"

    ;; Enable parsers.
    "--enable-parser=h263"
    "--enable-parser=h264"
    "--enable-parser=hevc"
    "--enable-parser=mpeg4video"
    "--enable-parser=vp8"
    "--enable-parser=vp9"
    "--enable-parser=opus"

    ;; Encoders/decoders.
    "--enable-encoder=adpcm_g722"
    "--enable-decoder=adpcm_g722"
    "--enable-encoder=adpcm_g726"
    "--enable-decoder=adpcm_g726"
    "--enable-encoder=adpcm_g726le"
    "--enable-decoder=adpcm_g726le"
    "--enable-decoder=g729"
    "--enable-encoder=g723_1"
    "--enable-decoder=g723_1"
    "--enable-encoder=rawvideo"
    "--enable-decoder=rawvideo"
    "--enable-encoder=libx264"
    "--enable-decoder=h264"
    "--enable-encoder=pcm_alaw"
    "--enable-decoder=pcm_alaw"
    "--enable-encoder=pcm_mulaw"
    "--enable-decoder=pcm_mulaw"
    "--enable-encoder=mpeg4"
    "--enable-decoder=mpeg4"
    "--enable-encoder=libvpx_vp8"
    "--enable-decoder=vp8"
    "--enable-decoder=vp9"
    "--enable-encoder=h263"
    "--enable-encoder=h263p"
    "--enable-decoder=h263"
    "--enable-encoder=mjpeg"
    "--enable-decoder=mjpeg"
    "--enable-decoder=mjpegb"
    "--enable-libspeex"
    "--enable-libopus"
    "--enable-libvpx"
    "--enable-libx264"
    "--enable-encoder=libspeex"
    "--enable-decoder=libspeex"
    "--enable-encoder=libopus"
    "--enable-decoder=libopus"

    ;; Encoders/decoders for ringtones and audio streaming.
    "--enable-decoder=flac"
    "--enable-decoder=vorbis"
    "--enable-decoder=aac"
    "--enable-decoder=ac3"
    "--enable-decoder=eac3"
    "--enable-decoder=mp3"
    "--enable-decoder=pcm_u24le"
    "--enable-decoder=pcm_u32le"
    "--enable-decoder=pcm_u8"
    "--enable-decoder=pcm_f16le"
    "--enable-decoder=pcm_f32le"
    "--enable-decoder=pcm_f64le"
    "--enable-decoder=pcm_s16le"
    "--enable-decoder=pcm_s24le"
    "--enable-decoder=pcm_s32le"
    "--enable-decoder=pcm_s64le"
    "--enable-decoder=pcm_u16le"
    "--enable-encoder=pcm_u8"
    "--enable-encoder=pcm_f32le"
    "--enable-encoder=pcm_f64le"
    "--enable-encoder=pcm_s16le"
    "--enable-encoder=pcm_s32le"
    "--enable-encoder=pcm_s64le"

    ;; Encoders/decoders for images.
    "--enable-encoder=gif"
    "--enable-decoder=gif"
    "--enable-encoder=jpegls"
    "--enable-decoder=jpegls"
    "--enable-encoder=ljpeg"
    "--enable-decoder=jpeg2000"
    "--enable-encoder=png"
    "--enable-decoder=png"
    "--enable-encoder=bmp"
    "--enable-decoder=bmp"
    "--enable-encoder=tiff"
    "--enable-decoder=tiff"

    ;; Filters.
    "--enable-filter=scale"
    "--enable-filter=overlay"
    "--enable-filter=amix"
    "--enable-filter=amerge"
    "--enable-filter=aresample"
    "--enable-filter=format"
    "--enable-filter=aformat"
    "--enable-filter=fps"
    "--enable-filter=transpose"
    "--enable-filter=pad"))

(define %ffmpeg-linux-configure-flags
  '("--enable-pic"
    "--extra-cxxflags=-fPIC"
    "--extra-cflags=-fPIC"
    "--target-os=linux"
    "--enable-indev=v4l2"
    "--enable-indev=xcbgrab"
    "--enable-vdpau"
    "--enable-hwaccel=h264_vdpau"
    "--enable-hwaccel=mpeg4_vdpau"
    "--enable-vaapi"
    "--enable-hwaccel=h264_vaapi"
    "--enable-hwaccel=mpeg4_vaapi"
    "--enable-hwaccel=h263_vaapi"
    "--enable-hwaccel=vp8_vaapi"
    "--enable-hwaccel=mjpeg_vaapi"
    "--enable-hwaccel=hevc_vaapi"
    "--enable-encoder=h264_vaapi"
    "--enable-encoder=vp8_vaapi"
    "--enable-encoder=mjpeg_vaapi"
    "--enable-encoder=hevc_vaapi"))

(define (ffmpeg-compose-configure-flags)
  "Compose the configure flag lists of ffmpeg-jami."
  #~(append '#$%ffmpeg-default-configure-flags
            (if (string-contains #$(%current-system) "linux")
                '#$%ffmpeg-linux-configure-flags
                '())))

(define-public ffmpeg-jami
  (package
    (inherit ffmpeg)
    (name "ffmpeg-jami")
    (arguments
     (substitute-keyword-arguments (package-arguments ffmpeg)
       ((#:configure-flags _ '())
        #~(cons* "--disable-static"
                 "--enable-shared"
                 "--disable-stripping"
                 #$(ffmpeg-compose-configure-flags)))
       ((#:phases phases)
        #~(modify-phases #$phases
            (add-after 'unpack 'apply-patches
              (lambda _
                ;; These patches come from:
                ;; "jami-project/daemon/contrib/src/ffmpeg/rules.mak".
                (#$jami-apply-custom-patches
                 #:dep-name "ffmpeg"
                 #:patches '("remove-mjpeg-log"
                             "change-RTCP-ratio"
                             "rtp_ext_abs_send_time"
                             "libopusdec-enable-FEC"
                             "libopusenc-reload-packet-loss-at-encode"
                             "screen-sharing-x11-fix"))))))))))
;;; When updating Jami, make sure that the patches used for ffmpeg-jami are up
;;; to date with those listed in
;;; <https://review.jami.net/plugins/gitiles/jami-daemon/+/refs/heads/master/contrib/src/ffmpeg/rules.mak>.
(define %jami-nightly-version "20231222.2")
(define %jami-daemon-commit "317b7317dcda4afb733ddb9bd5b450d4635941ae")

(define-public libjami
  (package
    (name "libjami")
    (version %jami-version)
    (source %jami-sources)
    (version %jami-nightly-version)
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://review.jami.net/jami-daemon")
                    (commit %jami-daemon-commit)))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "16qx50xz2mkw894irjsvql82iw7wpc5xncxpvw1nqd2sxhgfiq0i"))
              (patches (search-patches
                        "libjami-ac-config-files.patch"
                        "jami-disable-integration-tests.patch"))))
    (outputs '("out" "bin" "debug"))    ;"bin' contains jamid
    (build-system gnu-build-system)
    (arguments


@@ 378,13 106,25 @@
      ;; user scripts too, until more general purpose Scheme bindings are made
      ;; available (see: test/agent/README.md).
      #:configure-flags #~(list "--enable-agent" "--enable-debug")
      #:make-flags #~(list "V=1")       ;build verbosely
      #:make-flags
      #~(list
         "V=1"                 ;build verbosely
         ;; The 'ut_media_player' is known to fail (see:
         ;; https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/935).
         "XFAIL_TESTS=ut_media_player")
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'change-directory/maybe
            (lambda _
              ;; Allow building from the tarball or a git checkout.
              (false-if-exception (chdir "daemon"))))
          (add-after 'change-directory/maybe 'extend-scheduler-test-timeout
            (lambda _
              ;; The ut_scheduler unit test may fail on slower machines (see:
              ;; https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/939).
              (substitute* "test/unitTest/scheduler.cpp"
                (("std::chrono::seconds\\(3)")
                 "std::chrono::seconds(30)"))))
          (add-after 'install 'delete-static-libraries
            ;; Remove 100+ MiB of static libraries.  "--disable-static" cannot
            ;; be used as the test suite requires access to private symbols


@@ 409,14 149,14 @@
    (inputs
     (list alsa-lib
           asio
           dbus-c++
           dhtnet
           eudev
           ffmpeg-jami
           guile-3.0
           jack-1
           jsoncpp
           libarchive
           libgit2
           libgit2-1.6
           libnatpmp
           libsecp256k1
           libupnp


@@ 424,6 164,7 @@
           openssl
           pjproject-jami
           pulseaudio
           sdbus-c++
           speex
           speexdsp
           webrtc-audio-processing


@@ 447,18 188,71 @@ service definitions.")
    (home-page "https://jami.net/")
    (license license:gpl3+)))

;;; Private package; this is used in source form: the project build system has
;;; no install target.
(define sortfilterproxymodel
  ;; Use the latest commit available from the 'qt-6' branch.
  (let ((commit "6cc21205dbf36640613f0e6e67b2b13b1855c377")
        (revision "0"))
    (package
      (name "sortfilterproxymodel")
      ;; There are no recent release tag; the module version defined in the
      ;; source is used (see:
      ;; https://github.com/oKcerG/SortFilterProxyModel/blob/
      ;; 5a930885b7ea99f7f41c25fce08bf8006ee54e3f/
      ;; qqmlsortfilterproxymodel.cpp#L574C15-L574C15).
      (version (git-version "0.2" revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      ;; The upstream is
                      ;; https://github.com/oKcerG/SortFilterProxyModel, but
                      ;; it lacks Qt 6 support, so use this fork, which is the
                      ;; one used by Jami.
                      (url "https://github.com/atraczyk/SortFilterProxyModel")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "1n54jkimr3a818i3w7w3lnbqn47x72nnr5xi9vk0mdnbwri3viwy"))))
      (build-system qt-build-system)
      (arguments
       (list #:qtbase qtbase            ;use Qt 6
             #:tests? #f                ;no test suite
             #:configure-flags #~(list "BUILD_SFPM_PIC=ON")))
      (inputs (list qtdeclarative))
      (home-page "https://github.com/oKcerG/SortFilterProxyModel")
      (synopsis "Improved QSortFilterProxyModel implementation for QML")
      (description "SortFilterProxyModel is an implementation of
QSortFilterProxyModel conveniently exposed for QML.")
      (license license:expat))))

(define-public jami
  (package
    (name "jami")
    (version %jami-version)
    (source %jami-sources)
    (version %jami-nightly-version)
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://review.jami.net/jami-client-qt")
                    (commit (string-append "nightly/" %jami-nightly-version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "0ypbbyqmq6x9zq4sr550k38v8pg7yq685bmwqmigqzhqgfazcg97"))
              (patches (search-patches
                        "jami-libjami-headers-search.patch"
                        "jami-qml-tests-discovery.patch"
                        "jami-skip-tests-requiring-internet.patch"
                        "jami-unbundle-dependencies.patch"))))
    (build-system qt-build-system)
    (outputs '("out" "debug"))
    (arguments
     (list
      #:qtbase qtbase
      #:configure-flags
      #~(list "-DENABLE_TESTS=ON"
      #~(list "-DWITH_DAEMON_SUBMODULE=OFF"
              "-DENABLE_TESTS=ON"
              ;; Disable the webengine since it grows the closure size by
              ;; about 450 MiB and requires more resources.
              "-DWITH_WEBENGINE=OFF"


@@ 467,11 261,7 @@ service definitions.")
              "-DENABLE_LIBWRAP=ON")
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'change-directory/maybe
            (lambda _
              ;; Allow building from the tarball or a git checkout.
              (false-if-exception (chdir "client-qt"))))
          (add-after 'change-directory/maybe 'fix-version-string
          (add-after 'unpack 'fix-version-string
            (lambda _
              (substitute* "src/app/version.h"
                (("VERSION_STRING")


@@ 480,6 270,17 @@ service definitions.")
                 (string-append "const char VERSION_STRING[] = \""
                                #$version "\";\n"
                                anchor)))))
          (add-after 'unpack 'copy-3rdparty-source-dependencies
            (lambda _
              (copy-recursively #$(package-source sortfilterproxymodel)
                                "3rdparty/SortFilterProxyModel")))
          (add-before 'configure 'fake-x11-environment
            (lambda _
              ;; This works around the lack of configuration for the X11
              ;; push-to-talk feature, which is auto-detected via the
              ;; XDG_SESSION_TYPE environment variable (see:
              ;; https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1504).
              (setenv "XDG_SESSION_TYPE" "x11")))
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?


@@ 488,22 289,13 @@ service definitions.")
                ;; The tests require a writable HOME.
                (setenv "HOME" "/tmp")

                (display "Running unittests...\n")
                (invoke "tests/unittests" "-mutejamid")
                (display "Running unit tests...\n")
                (invoke "tests/unit_tests")

                ;; XXX: There are currently multiple failures with the
                ;; functional tests (see:
                ;; https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/883),
                ;; so the code below is disabled for now.
                ;;
                ;; XXX: The QML test suite fails, exiting with status code 1 (see:
                ;; https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/883).
                ;; (display "Running functional tests...\n")
                ;; ;; This is to allow building from the source tarball or
                ;; ;; directly from the git repository.
                ;; (let  ((tests-qml (if (file-exists? "../client-qt/tests")
                ;;                       "../client-qt/tests/qml"
                ;;                       "../tests/qml")))
                ;;   (invoke "tests/qml_tests" "-mutejamid"
                ;;           "-input" tests-qml))
                ;; (invoke "tests/qml_tests")
                ))))))
    (native-inputs
     (list googletest


@@ 518,6 310,7 @@ service definitions.")
           libnotify
           libxcb
           libxkbcommon
           md4c
           network-manager
           qrencode
           qt5compat


@@ 526,6 319,7 @@ service definitions.")
           qtnetworkauth
           qtpositioning
           qtsvg
           tidy-html                    ;used by src/app/htmlparser.h
           vulkan-loader))
    (home-page "https://jami.net")
    (synopsis "Qt Jami client")


@@ 538,8 332,8 @@ P2P-DHT.")

(define-public jami-docs
  ;; There aren't any tags, so use the latest commit.
  (let ((revision "1")
        (commit "ff466ebadb9b99a1672a814126793de670c3099b"))
  (let ((revision "2")
        (commit "a48997de84cc4933bd111fa93fbf6a58189b166d"))
    (package
      (name "jami-docs")
      (version (git-version "0.0.0" revision commit))


@@ 551,7 345,7 @@ P2P-DHT.")
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "1n8a9dk8mi617rk3ycz5jrzbwv9ybfynlci5faz1klckx0aqdf6q"))))
                  "0a1kcflvk39aag2vk83cn4m0ifkgb3gvwkr8pbbvf0hcd2cj2j31"))))
      (build-system copy-build-system)
      (arguments
       (list

M gnu/packages/libsigsegv.scm => gnu/packages/libsigsegv.scm +11 -16
@@ 1,6 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2018 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2017, 2024 Efraim Flashner <efraim@flashner.co.il>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 21,6 21,7 @@
  #:use-module (guix licenses)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix utils)
  #:use-module (guix build-system gnu))

(define-public libsigsegv


@@ 40,21 41,15 @@
   (arguments
    `(;; The shared library isn't built by default but some packages need it.
      #:configure-flags '("--enable-shared")

      ;; On MIPS, work around this error:
      ;;
      ;; In file included from fault-linux-mips-old.h:18:0,
      ;;    [...]
      ;; linux-libre-headers-cross-mips64el-linux-gnu-3.3.8/include/asm/sigcontext.h:57:8: error: redefinition of 'struct sigcontext'
      ,@(if (string-contains (or (%current-target-system) (%current-system))
                             "mips64el")
            `(#:phases (modify-phases %standard-phases
                         (add-before 'configure 'patch-mips-old-h
                           (lambda _
                             (substitute* "src/fault-linux-mips-old.h"
                               (("#include <asm/sigcontext\\.h>") ""))
                             #t))))
            '())))
      ;; On some architectures 'struct sigcontext' gets redefined from
      ;; %linux-libre-headers/include/asm/sigcontext.h
      ,@(cond ((%current-target-system)
               `(#:phases (modify-phases %standard-phases
                            (add-before 'configure 'patch-asm-sigcontext-h
                              (lambda _
                                (substitute* (find-files "src" "^fault-.*-old\\.h$")
                                  (("#include <asm/sigcontext\\.h>") "")))))))
              (else '()))))
   (description
    "GNU libsigsegv is a library to handle page faults, which occur when a
program tries to access an unavailable region of memory, in user mode.  By

M gnu/packages/linux.scm => gnu/packages/linux.scm +22 -22
@@ 76,7 76,7 @@
;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
;;; Copyright © 2023 dan <i@dan.games>
;;; Copyright © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
;;; Copyright © 2023 Wilko Meyer <w@wmeyer.eu>
;;; Copyright © 2023, 2024 Wilko Meyer <w@wmeyer.eu>
;;; Copyright © 2023 Jaeme Sifat <jaeme@runbox.com>
;;;
;;; This file is part of GNU Guix.


@@ 494,17 494,17 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
;; The current "stable" kernels. That is, the most recently released major
;; versions that are still supported upstream.

(define-public linux-libre-6.6-version "6.6.8")
(define-public linux-libre-6.6-version "6.6.10")
(define-public linux-libre-6.6-gnu-revision "gnu")
(define deblob-scripts-6.6
  (linux-libre-deblob-scripts
   linux-libre-6.6-version
   linux-libre-6.6-gnu-revision
   (base32 "0g8m0rb15b0231dv8ji456s75a67szsaim71may3yprplycz6pav")
   (base32 "1hg3ck1j8288fhlhcvhgs1zzwh3i62nfvphw7x3vsaqr75kiwbjp")))
   (base32 "0kavbby960k7wg355p3hjb9v1c4gnk8dv3lkfhpz44ayhv7kihg5")))
(define-public linux-libre-6.6-pristine-source
  (let ((version linux-libre-6.6-version)
        (hash (base32 "05i4ayj9wyjkd1s8ixx7bxwcyagqyx8rhj1zvbc3cjqyw4sc8djh")))
        (hash (base32 "0v2l0l90w7scv7bxkxxjgqnay0fjh678k9gdlgycgbh9q7j2grly")))
   (make-linux-libre-source version
                            (%upstream-linux-source version hash)
                            deblob-scripts-6.6)))


@@ 512,92 512,92 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
;; The "longterm" kernels — the older releases with long-term upstream support.
;; Here are the support timelines:
;; <https://www.kernel.org/category/releases.html>
(define-public linux-libre-6.1-version "6.1.69")
(define-public linux-libre-6.1-version "6.1.71")
(define-public linux-libre-6.1-gnu-revision "gnu")
(define deblob-scripts-6.1
  (linux-libre-deblob-scripts
   linux-libre-6.1-version
   linux-libre-6.1-gnu-revision
   (base32 "1sf80f2i4vf888xjcn84ymn4w5ynn30ib9033zwmv7f09yvfhapy")
   (base32 "1hdibv43xbn1lv83i6qjgfmf1bvqxvq17fryfsq4r4sjgs9212js")))
   (base32 "1jg2v1nxd6i5x536vmd1l14xhpzrcimpmjfipb1zkrwil102y25f")))
(define-public linux-libre-6.1-pristine-source
  (let ((version linux-libre-6.1-version)
        (hash (base32 "0hdm28k49kmy9r96hckps0bvvaq9m06l72n8ih305rccs6a2cgby")))
        (hash (base32 "0hghnwsa282js9hy4krhdbgrb4khjzslr05zgvjx9zzragfp9xrd")))
   (make-linux-libre-source version
                            (%upstream-linux-source version hash)
                            deblob-scripts-6.1)))

(define-public linux-libre-5.15-version "5.15.145")
(define-public linux-libre-5.15-version "5.15.146")
(define-public linux-libre-5.15-gnu-revision "gnu")
(define deblob-scripts-5.15
  (linux-libre-deblob-scripts
   linux-libre-5.15-version
   linux-libre-5.15-gnu-revision
   (base32 "18ac30kxg2mf2f6gk3p935hzhz2qs110jy4xwk21kblnnkskbxj8")
   (base32 "1idjrn2w8jrixj8ifkk1awxyyq5042nc4p2mld4rda96azlnp948")))
   (base32 "14pw0yl0yxdgcdp01rpi91ylil9irwzxfq04kfvn3gg2abaq37bn")))
(define-public linux-libre-5.15-pristine-source
  (let ((version linux-libre-5.15-version)
        (hash (base32 "086nssif66s86wkixz4yb7xilz1k49g32l0ib28r8fjzc23rv95j")))
        (hash (base32 "14nijbspmzd4r38l8cpl4vn9dhawzcfnhyc0gnaxl2m8l9gpm02s")))
   (make-linux-libre-source version
                            (%upstream-linux-source version hash)
                            deblob-scripts-5.15)))

(define-public linux-libre-5.10-version "5.10.205")
(define-public linux-libre-5.10-version "5.10.206")
(define-public linux-libre-5.10-gnu-revision "gnu1")
(define deblob-scripts-5.10
  (linux-libre-deblob-scripts
   linux-libre-5.10-version
   linux-libre-5.10-gnu-revision
   (base32 "1b33rkn32b923025iiz4xzxiy8y5ii9j5qk4021mg575890rl4ch")
   (base32 "0xrrnmb5kcc5r21bdm24aq0fnkk1imn367c1cxlj78b6l6gigx4b")))
   (base32 "0zmmqj5gyiy2q81f199c29b14isfiqbvl87y72k14yy0q5398276")))
(define-public linux-libre-5.10-pristine-source
  (let ((version linux-libre-5.10-version)
        (hash (base32 "0qw8g0h4k0b4dyvspbj51cwr68ihwjzsi2b2261ipy3l1nl1fln5")))
        (hash (base32 "0ns8qxcrxj9i76b93xcghl002l8vbkg7ksd435sikig62qr62gf4")))
   (make-linux-libre-source version
                            (%upstream-linux-source version hash)
                            deblob-scripts-5.10)))

(define-public linux-libre-5.4-version "5.4.265")
(define-public linux-libre-5.4-version "5.4.266")
(define-public linux-libre-5.4-gnu-revision "gnu1")
(define deblob-scripts-5.4
  (linux-libre-deblob-scripts
   linux-libre-5.4-version
   linux-libre-5.4-gnu-revision
   (base32 "0xg5cz82k2cb0ikxvwv1hp5c3h377jkb5sd6aszvsk7hnabhk62v")
   (base32 "0sw67b2pk3lng4y67diqqnhxaggnp3nbkx8dxc5fs27rinfxr4m1")))
   (base32 "08wn4rjrmi8asmdkg92xbbm6v0sw44kackp69agbw57zy6fp2zys")))
(define-public linux-libre-5.4-pristine-source
  (let ((version linux-libre-5.4-version)
        (hash (base32 "05cvvwjiznn7hfd02qklklalg0chahvh5v18w64lcva6kzj9kbjd")))
        (hash (base32 "1dmcn9i3nvf1gldm1a32gnl5ybwbk2lizb3wa4gc06g7dxz2y1ys")))
   (make-linux-libre-source version
                            (%upstream-linux-source version hash)
                            deblob-scripts-5.4)))

(define-public linux-libre-4.19-version "4.19.303")
(define-public linux-libre-4.19-version "4.19.304")
(define-public linux-libre-4.19-gnu-revision "gnu1")
(define deblob-scripts-4.19
  (linux-libre-deblob-scripts
   linux-libre-4.19-version
   linux-libre-4.19-gnu-revision
   (base32 "0pjal2cc2f99cvw8r4icb4l24j41k48jkj6bqk7pcahzcgx33ycb")
   (base32 "1425mhkfxn18vxn05bb4h3li7x1jl7l1hf1zi8xhnqv3wa31h9wl")))
   (base32 "07j33w4pq319gaypfsym6v0i2xqc5jagm47nxyy2010zn8k6y8kd")))
(define-public linux-libre-4.19-pristine-source
  (let ((version linux-libre-4.19-version)
        (hash (base32 "0dlbl47xs7z4yf9cxbxqzd7zs1f9070jr6ck231wgppa6lwwwb82")))
        (hash (base32 "165mljr8v1cf4vf4a4b44hx089rprkssvi2azq5wbxxg3basbind")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-4.19)))

(define-public linux-libre-4.14-version "4.14.334")
(define-public linux-libre-4.14-version "4.14.335")
(define-public linux-libre-4.14-gnu-revision "gnu1")
(define deblob-scripts-4.14
  (linux-libre-deblob-scripts
   linux-libre-4.14-version
   linux-libre-4.14-gnu-revision
   (base32 "1vbgykwzf7j0yjqcwn747cfhwj0rgw3s9h627q94wb9a19x9p0fr")
   (base32 "1faagsj4i31z2bp83hflx3q9vrddjnn37a3ah2b47iaplva7z1nd")))
   (base32 "1ir96bbhw77xw6lmsnh42gi130nnzjklpgfyd46pxmqckrpydcvx")))
(define-public linux-libre-4.14-pristine-source
  (let ((version linux-libre-4.14-version)
        (hash (base32 "0iaaqdkszmfarvjfszc9rf7y9zsv3w82934xmvmzmsbiz86547ca")))
        (hash (base32 "0aa0xi1sn4rw9ichgmvxp0s9hsi6rfzhzd9wgbvzvc90md2qfs19")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-4.14)))

M gnu/packages/lisp-xyz.scm => gnu/packages/lisp-xyz.scm +68 -34
@@ 23,7 23,7 @@
;;; Copyright © 2020-2023 Sharlatan Hellseher <sharlatanus@gmail.com>
;;; Copyright © 2021, 2022 Aurora <rind38@disroot.org>
;;; Copyright © 2021 Matthew James Kraai <kraai@ftbfs.org>
;;; Copyright © 2021, 2022, 2023 André A. Gomes <andremegafone@gmail.com>
;;; Copyright © 2021-2024 André A. Gomes <andremegafone@gmail.com>
;;; Copyright © 2021, 2022, 2023 Cage <cage-dev@twistfold.it>
;;; Copyright © 2021 Cameron Chaparro <cameron@cameronchaparro.com>
;;; Copyright © 2021 Charles Jackson <charles.b.jackson@protonmail.com>


@@ 6126,6 6126,38 @@ BTCPay, Paypal, and Stripe.")
(define-public ecl-lisp-pay
  (sbcl-package->ecl-package sbcl-lisp-pay))

(define-public sbcl-stripe
  (let ((commit "b59631d21d63e101de6eb96b56941471504ba644")
        (revision "0"))
    (package
      (name "sbcl-stripe")
      (version (git-version "0.0.0" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/atlas-engineer/stripe")
               (commit commit)))
         (file-name (git-file-name "cl-stripe" version))
         (sha256
          (base32 "00sfq2f6dnpwa6pf7rgw5hazbwx4yf1g0jrkfz9h4kq5zyxwk1cy"))))
      (build-system asdf-build-system/sbcl)
      (inputs
       (list sbcl-dexador
             sbcl-golden-utils
             sbcl-local-time
             sbcl-yason))
      (home-page "https://github.com/atlas-engineer/stripe")
      (synopsis "Stripe payment API client for Common Lisp")
      (description "A client for the Stripe payment API.")
      (license license:expat))))

(define-public cl-stripe
  (sbcl-package->cl-source-package sbcl-stripe))

(define-public ecl-stripe
  (sbcl-package->ecl-package sbcl-stripe))

(define-public sbcl-drakma
  (package
    (name "sbcl-drakma")


@@ 26284,43 26316,45 @@ extra features like type inference.")
  (sbcl-package->cl-source-package sbcl-nclasses))

(define-public sbcl-prompter
  (package
    (name "sbcl-prompter")
    (version "0.1.1")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/atlas-engineer/prompter")
             (commit version)))
       (file-name (git-file-name "cl-prompter" version))
       (sha256
        (base32
         "008bq36siza9qwmz6b1pvpm53lxmzryahnhy372l18gl3180in03"))))
    (build-system asdf-build-system/sbcl)
    (inputs
     (list
      sbcl-alexandria
      sbcl-calispel
      sbcl-cl-containers
      sbcl-cl-str
      sbcl-closer-mop
      sbcl-lparallel
      sbcl-moptilities
      sbcl-nclasses
      sbcl-serapeum
      sbcl-trivial-package-local-nicknames))
    (native-inputs
     (list sbcl-lisp-unit2))
    (home-page "https://github.com/atlas-engineer/prompter")
    (synopsis "Live-narrowing, fuzzy-matching, extensible prompt framework")
    (description
     "This prompter library is heavily inspired by Emacs' minibuffer and
  (let ((commit "7890ed5d02e70aba01ceb964c6ee4f40776e7dc0")
        (revision "0"))
    (package
      (name "sbcl-prompter")
      (version (git-version "0.1.1" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/atlas-engineer/prompter")
               (commit commit)))
         (file-name (git-file-name "cl-prompter" version))
         (sha256
          (base32
           "0r15a6cagyp5x8aqx92ln2anni737h73bdshkvpzrac04ajss4md"))))
      (build-system asdf-build-system/sbcl)
      (inputs
       (list
        sbcl-alexandria
        sbcl-calispel
        sbcl-cl-containers
        sbcl-cl-str
        sbcl-closer-mop
        sbcl-lparallel
        sbcl-moptilities
        sbcl-nclasses
        sbcl-serapeum
        sbcl-trivial-package-local-nicknames))
      (native-inputs
       (list sbcl-lisp-unit2))
      (home-page "https://github.com/atlas-engineer/prompter")
      (synopsis "Live-narrowing, fuzzy-matching, extensible prompt framework")
      (description
       "This prompter library is heavily inspired by Emacs' minibuffer and
Helm (@url{https://emacs-helm.github.io/helm/}).  It only deals with the
backend side of things, it does not handle any display.  Features include
asynchronous suggestion computation, multiple sources, actions and resumable
prompters.")
    (license license:bsd-3)))
      (license license:bsd-3))))

(define-public cl-prompter
  (sbcl-package->cl-source-package sbcl-prompter))

M gnu/packages/lisp.scm => gnu/packages/lisp.scm +2 -2
@@ 1486,7 1486,7 @@ includes a compiler as well as an interpreter.")

(define-public s7-bootstrap
  ;; Need s7-bootstrap to build libc_s7.so (for the REPL) and run tests
  (let ((commit "a5b4bb49f8bcd7c33ae2366065fc8c254b734460") ;no releases
  (let ((commit "618de30e0f9851515724245e3ebbfa1be4de6906") ;no releases
        (revision "0"))
    (hidden-package
     (package


@@ 1500,7 1500,7 @@ includes a compiler as well as an interpreter.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
                   "03n1axdlypzmbgzrhlwfqwa1xiw36hi25j2hwc7vw77mz90cd9f8"))))
                   "0kh1f49g24ppjpr16v1nc9lr7pvr5nzb82bpw8c6q8ll7pqalqaf"))))
       (build-system gnu-build-system)
       (arguments
        (list #:tests? #f ;no tests in bootstrap

M gnu/packages/llvm.scm => gnu/packages/llvm.scm +21 -9
@@ 27,6 27,7 @@
;;; Copyright © 2022 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2022 Zhu Zihao <all_but_last@163.com>
;;; Copyright © 2023 Hilton Chain <hako@ultrarare.space>
;;; Copyright © 2023, 2024 Zheng Junjie <873216071@qq.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 2169,20 2170,31 @@ using @code{clang-rename}.")))
              ;; AMDGPU is needed by the vulkan drivers.
              #$(string-append "-DLLVM_TARGETS_TO_BUILD="
                               (system->llvm-target) ";AMDGPU")
              #$@(if (%current-target-system)
                     '("-DBUILD_SHARED_LIBS:BOOL=TRUE"
                       "-DCMAKE_BUILD_WITH_INSTALL_RPATH=TRUE")
                    '())
              ;; Skipping tools and utils decreases the output by ~100 MiB.
              "-DLLVM_BUILD_TOOLS=NO"
              (remove (cut string-match
                           "-DLLVM_(TARGETS_TO_BUILD|INSTALL_UTILS).*" <>)
              (remove
               (cut string-match
                    #$(if (%current-target-system)
                          "-DLLVM_(LINK_LLVM_DYLIB|TARGETS_TO_BUILD|INSTALL_UTILS).*"
                          "-DLLVM_(TARGETS_TO_BUILD|INSTALL_UTILS).*") <>)
                      #$cf)))
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-after 'install 'delete-static-libraries
                ;; If these are just relocated then llvm-config can't find them.
                (lambda* (#:key outputs #:allow-other-keys)
                  (for-each delete-file
                            (find-files (string-append
                                          (assoc-ref outputs "out") "/lib")
                                        "\\.a$"))))
              #$@(if (%current-target-system)
                     '()
                     #~((add-after 'install 'delete-static-libraries
                          ;; If these are just relocated then llvm-config
                          ;; can't find them.
                          (lambda* (#:key outputs #:allow-other-keys)
                            (for-each delete-file
                                      (find-files
                                       (string-append
                                        (assoc-ref outputs "out") "/lib")
                                       "\\.a$"))))))
              ;; llvm-config is how mesa and others find the various
              ;; libraries and headers they use.
              (add-after 'install 'build-and-install-llvm-config

M gnu/packages/logging.scm => gnu/packages/logging.scm +1 -1
@@ 232,7 232,7 @@ output in multiple windows in a terminal.")
       (list "-DSPDLOG_BUILD_BENCH=OFF"
             "-DSPDLOG_BUILD_SHARED=ON"
             "-DSPDLOG_BUILD_TESTS=ON")))
    (native-inputs (list catch2-3.3))
    (native-inputs (list catch2-3))
    (home-page "https://github.com/gabime/spdlog")
    (synopsis "Fast C++ logging library")
    (description "Spdlog is a very fast header-only/compiled C++ logging

M gnu/packages/machine-learning.scm => gnu/packages/machine-learning.scm +108 -3
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015-2023 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2015-2024 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2016, 2020-2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016, 2017, 2020 Marius Bakke <mbakke@fastmail.com>
;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>


@@ 21,6 21,7 @@
;;; Copyright © 2023 zamfofex <zamfofex@twdb.moe>
;;; Copyright © 2023 Navid Afkhami <navid.afkhami@mdc-berlin.de>
;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 812,6 813,94 @@ SentencePiece allows us to make a purely end-to-end system that does not
depend on language-specific pre- or post-processing.")
    (license license:asl2.0)))

(define-public python-hopcroftkarp
  ;; This commit fixes a broken import, but has not been released to PyPI.
  (let ((commit "2846e1dd3265d95d2bddb0cf4190b830cbb4efe6")
        (revision "1"))
    (package
      (name "python-hopcroftkarp")
      (version (git-version "1.2.5" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/sofiatolaosebikan/hopcroftkarp")
               (commit commit)))
         (file-name (git-file-name name version))
         (sha256
          (base32 "018ilrp41fcclmb5lsml3aijwbmhbq3m7wy65hr1fryj0avic8fr"))))
      (build-system pyproject-build-system)
      (home-page "https://github.com/sofiatolaosebikan/hopcroftkarp")
      (synopsis "Implementation of the Hopcroft-Karp algorithm")
      (description
       "This package implements the Hopcroft-Karp algorithm, producing a maximum
cardinality matching from a bipartite graph.")
      (license license:gpl3))))

(define-public python-persim
  (package
    (name "python-persim")
    (version "0.3.2")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "persim" version))
       (sha256
        (base32 "0q8wfakx8q4h3ryvw8cba0v6z7xn9139qkrzs3mi1ggyzacnx9d7"))))
    (build-system pyproject-build-system)
    (propagated-inputs (list python-deprecated
                             python-hopcroftkarp
                             python-joblib
                             python-matplotlib
                             python-numpy
                             python-scikit-learn
                             python-scipy))
    (native-inputs (list python-pytest python-pytest-cov))
    (home-page "https://persim.scikit-tda.org")
    (synopsis "Tools for analyzing persistence diagrams in Python")
    (description
     "This package includes a variety of tools used to analyze persistence diagrams.
It currently houses implementations of
@itemize
@item Persistence images
@item Persistence landscapes
@item Bottleneck distance
@item Modified Gromov–Hausdorff distance
@item Sliced Wasserstein kernel
@item Heat kernel
@item Diagram plotting
@end itemize
")
    (license license:expat))) ; MIT License

(define-public python-ripser
  (package
    (name "python-ripser")
    (version "0.6.4")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "ripser" version))
       (sha256
        (base32 "1575nwsn6b29z7w1mjk23ri83bxq2b4ld979hpgm174642a3x6vs"))))
    (build-system pyproject-build-system)
    (propagated-inputs (list python-numpy python-persim python-scikit-learn
                             python-scipy))
    (native-inputs (list python-cython python-pytest))
    (home-page "https://ripser.scikit-tda.org")
    (synopsis "Persistent homology library for Python")
    (description
     "This package implements a variety of persistent homology algorithms.  It
provides an interface for
@itemize
@item computing persistence cohomology of sparse and dense data sets
@item visualizing persistence diagrams
@item computing lowerstar filtrations on images
@item computing representative cochains
@end itemize
")
    (license license:expat))) ; MIT License

(define-public python-sacrebleu
  (package
    (name "python-sacrebleu")


@@ 1151,6 1240,11 @@ in terms of new algorithms.")
    (build-system python-build-system)
    (arguments
     '(#:phases (modify-phases %standard-phases
                  (add-after 'unpack 'relax-requirements
                    (lambda _
                      ;; Does this difference really matter?
                      (substitute* "requirements.txt"
                        (("3.20.1") "3.20.2"))))
                  (add-before 'build 'pass-cmake-arguments
                    (lambda* (#:key outputs #:allow-other-keys)
                      ;; Pass options to the CMake-based build process.


@@ 1235,7 1329,13 @@ operators and standard data types.")
               '(begin
                  (delete-file-recursively "third_party")
                  (substitute* "onnx/backend/test/runner/__init__.py"
                    (("urlretrieve\\(.*") "raise unittest.SkipTest('Skipping download')\n"))))))))
                    (("urlretrieve\\(.*") "raise unittest.SkipTest('Skipping download')\n"))))))
    (arguments
     ;; reuse build system tweaks
     (substitute-keyword-arguments (package-arguments onnx)
       ((#:phases phases)
        #~(modify-phases #$phases
            (delete 'relax-requirements)))))))

(define-public python-onnx
  ;; This used to be called "python-onnx" because it provided nothing but


@@ 1262,7 1362,12 @@ operators and standard data types.")
              (modules '((guix build utils)))
              (snippet '(delete-file-recursively "third_party"))))
    (build-system python-build-system)
    (arguments (package-arguments onnx))          ;reuse build system tweaks
    (arguments
     ;; reuse build system tweaks
     (substitute-keyword-arguments (package-arguments onnx)
       ((#:phases phases)
        #~(modify-phases #$phases
            (delete 'relax-requirements)))))
    (native-inputs
     (list cmake python-pytest python-pytest-runner python-nbval
           python-coverage))

M gnu/packages/minetest.scm => gnu/packages/minetest.scm +3 -3
@@ 52,7 52,7 @@
(define-public minetest
  (package
    (name "minetest")
    (version "5.7.0")
    (version "5.8.0")
    (source (origin
              (method git-fetch)
              (uri (git-reference


@@ 61,7 61,7 @@
              (file-name (git-file-name name version))
              (sha256
               (base32
                "008l44zwwsarwk4hn7wx2nj2m21b1iqsphl7g69rrlxj760zl0pl"))
                "1sww17h8z77w38jk19nsqxn8xcj27msq0glbil7pyj4i0ffprjrr"))
              (modules '((guix build utils)))
              (snippet
               '(begin


@@ 166,7 166,7 @@ in different ways.")
              (file-name (git-file-name name version))
              (sha256
               (base32
                "02kbj1h6jsq6k8x4v2ir0njczdz7nyx6dbym85ixxp3mrqxiws61"))))
                "1pq4rm15lzwcqv6npgyz6v89hi3zj8zybw25n9i0d27qj786xc4z"))))
    (build-system copy-build-system)
    (arguments
     (list #:install-plan

M gnu/packages/mpd.scm => gnu/packages/mpd.scm +3 -2
@@ 117,7 117,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
(define-public mpd
  (package
    (name "mpd")
    (version "0.23.14")
    (version "0.23.15")
    (source (origin
              (method url-fetch)
              (uri


@@ 126,7 126,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
                              "/mpd-" version ".tar.xz"))
              (sha256
               (base32
                "1lh9nn4a7ng6i08df7rbs8c4nbgmz883pss9p2gswa6m4rsadfc5"))))
                "06k60ych9crifyx6zfc98hdcihixq5nba1c9rwngib6ik8ik40am"))))
    (build-system meson-build-system)
    (arguments
     (list


@@ 162,6 162,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
                   boost
                   chromaprint
                   curl
                   dbus
                   elogind
                   expat
                   ffmpeg

M gnu/packages/multiprecision.scm => gnu/packages/multiprecision.scm +3 -1
@@ 6,7 6,7 @@
;;; Copyright © 2016, 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018 Eric Bavier <bavier@member.fsf.org>
;;; Copyright © 2018, 2019, 2021, 2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2018, 2019, 2021, 2023, 2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2021 Vinicius Monego <monego@posteo.net>
;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2023 Janneke Nieuwenhuizen <janneke@gnu.org>


@@ 71,6 71,8 @@
                 ;; they produce different headers.  We need shared.
                 `("--disable-static"
                   "--enable-shared"))
                ((target-x32?)
                 `("ABI=x32"))
                (else '())))
      ;; Remove after core-updates merge.
      ;; Workaround for gcc-7 transition breakage, -system and cross-build,

M gnu/packages/networking.scm => gnu/packages/networking.scm +229 -116
@@ 26,7 26,7 @@
;;; Copyright © 2018, 2020-2022 Marius Bakke <marius@gnu.org>
;;; Copyright © 2018, 2020, 2021, 2022 Oleg Pykhalov <go.wigust@gmail.com>
;;; Copyright © 2018 Pierre Neidhardt <mail@ambrevar.xyz>
;;; Copyright © 2019, 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2019, 2020, 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2019 Vasile Dumitrascu <va511e@yahoo.com>
;;; Copyright © 2019 Julien Lepiller <julien@lepiller.eu>
;;; Copyright © 2019 Timotej Lazar <timotej.lazar@araneo.si>


@@ 164,8 164,10 @@
  #:use-module (gnu packages sqlite)
  #:use-module (gnu packages ssh)
  #:use-module (gnu packages tcl)
  #:use-module (gnu packages telephony)
  #:use-module (gnu packages textutils)
  #:use-module (gnu packages tls)
  #:use-module (gnu packages upnp)
  #:use-module (gnu packages valgrind)
  #:use-module (gnu packages web)
  #:use-module (gnu packages wxwidgets)


@@ 1414,39 1416,50 @@ files contain direct mappings of the abstractions provided by the ØMQ C API.")
    (license license:expat)))

(define-public libnatpmp
  (package
    (name "libnatpmp")
    (version "20230423")
    (source (origin
              (method url-fetch)
              (uri (string-append
                    "http://miniupnp.free.fr/files/"
                    name "-" version ".tar.gz"))
              (sha256
               (base32
                "0w7wvf4yi8qv659dg9d3ndqvh3bqhgm21gd135spwhq6hhnfv106"))))
    (build-system gnu-build-system)
    (arguments
     `(#:phases
       (modify-phases %standard-phases
         (delete 'configure)
         (delete 'check)) ; no tests
       #:make-flags
       (let* ((target ,(%current-target-system))
              (gcc (if target
                       (string-append target "-gcc")
                       "gcc")))
         (list
          (string-append "CC=" gcc)
          (string-append "INSTALLPREFIX=" (assoc-ref %outputs "out"))
          (string-append "LDFLAGS=-Wl,-rpath=" %output "/lib")))))
    (home-page "http://miniupnp.free.fr/libnatpmp.html")
    (synopsis "C library implementing NAT-PMP")
    (description
     "@code{libnatpmp} is a portable and asynchronous implementation of
  ;; Install the latest commit as it provides a pkg-config (.pc) file.
  (let ((base-version "20230423")
        (commit "6a850fd2bd9b08e6edc886382a1dbae2a7df55ec")
        (revision "0"))
    (package
      (name "libnatpmp")
      (version (git-version base-version revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/miniupnp/libnatpmp")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "18hf9a3i3mncl3w80nzi1684iac3by86bv0hgmbm1v2w8gbfjyw0"))))
      (build-system cmake-build-system)
      (arguments
       (list
        #:tests? #f                     ;no test suite
        #:configure-flags #~(list "-DBUILD_SHARED_LIBS=ON")
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'patch-build-system
              ;; Have CMake install the natpmp_declspec.h missing header file
              ;; that is referenced by natpmp.h (see:
              ;; https://github.com/miniupnp/libnatpmp/issues/41).
              (lambda _
                (substitute* "CMakeLists.txt"
                  (("install\\(FILES natpmp.h")
                   "install(FILES natpmp.h natpmp_declspec.h"))))
            (add-after 'unpack 'fix-version
              (lambda _
                (with-output-to-file "VERSION"
                  (lambda ()
                    (display #$base-version))))))))
      (native-inputs (list which))
      (home-page "https://miniupnp.tuxfamily.org/libnatpmp.html")
      (synopsis "C library implementing NAT-PMP")
      (description
       "@code{libnatpmp} is a portable and asynchronous implementation of
the Network Address Translation - Port Mapping Protocol (NAT-PMP)
written in the C programming language.")
    (license license:bsd-3)))
      (license license:bsd-3))))

(define-public librdkafka
  (package


@@ 3382,14 3395,14 @@ eight bytes) tools
(define-public asio
  (package
    (name "asio")
    (version "1.22.2")
    (version "1.28.0")
    (source
     (origin
       (method url-fetch)
       (uri (string-append "mirror://sourceforge/asio/asio/"
                           version " (Stable)/asio-" version ".tar.bz2"))
       (sha256
        (base32 "0v5w9j4a02j2rkc7mrdj3ms0kfpqbgq2ipkixlz2l0p8xs0vfsvp"))))
        (base32 "0cp2c4v0kz0ln4bays0s3fr1mcxl527ay2lp7s14qbxx38vc5pfh"))))
    (build-system gnu-build-system)
    (inputs
     (list boost openssl))


@@ 3701,61 3714,103 @@ communication over HTTP.")
    (license license:agpl3+)))

(define-public restinio
  ;; Temporarily use an unreleased commit, which includes fixes to be able to
  ;; run the test suite in the resolver-less Guix build environment.
  (let ((revision "0")
        (commit "eda471ec3a2815965ca02ec93a1124a342b7601d"))
    (package
      (name "restinio")
      (version (git-version "0.6.18" revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/Stiffstream/restinio")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "0f4w7714r0ic7csgxydw2vzfh35ssk34pns9jycmc08dzc3r7whb"))))
      (build-system cmake-build-system)
      (arguments
       (list
        #:configure-flags #~(list "-DRESTINIO_FIND_DEPS=ON"
                                  "-DRESTINIO_INSTALL=ON"
                                  "-DRESTINIO_TEST=ON"
                                  "-DRESTINIO_USE_EXTERNAL_HTTP_PARSER=ON"
                                  "-DRESTINIO_USE_EXTERNAL_SOBJECTIZER=ON")
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'change-directory
              (lambda _
                (chdir "dev"))))))
      (native-inputs
       (list catch2
             clara
             json-dto))
      (inputs
       (list openssl
             sobjectizer))
      (propagated-inputs
       ;; These are all #include'd by restinio's .hpp header files.
       (list asio
             fmt
             http-parser
             pcre
             pcre2
             zlib))
      (home-page "https://stiffstream.com/en/products/restinio.html")
      (synopsis "C++14 library that gives you an embedded HTTP/Websocket server")
      (description "RESTinio is a header-only C++14 library that gives you an embedded
  (package
    (name "restinio")
    (version "0.7.1")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/Stiffstream/restinio")
                    (commit (string-append "v." version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "06p9gcnzgynsgfxxa1lk58pq5755px7sn00x2xh21qjnspwld1sy"))))
    (build-system cmake-build-system)
    (arguments
     (list
      #:configure-flags
      #~(list "-DRESTINIO_INSTALL=ON"
              "-DRESTINIO_TEST=ON"
              "-DRESTINIO_DEP_LLHTTP=system"
              "-DRESTINIO_DEP_FMT=system"
              "-DRESTINIO_DEP_EXPECTED_LITE=system"
              "-DRESTINIO_DEP_CATCH2=system"
              ;; No support to use a system provided so_5
              ;; (see:
              ;; https://github.com/Stiffstream/restinio/issues/207).
              "-DRESTINIO_WITH_SOBJECTIZER=OFF")
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'change-directory
            (lambda _
              (chdir "dev")))
          (add-after 'change-directory 'use-system-catch2
            ;; It's not currently possible to select a system-provided catch2,
            ;; so patch the build system (see:
            ;; https://github.com/Stiffstream/restinio/issues/208).
            (lambda _
              (substitute* "CMakeLists.txt"
                (("add_subdirectory\\(catch2\\)")
                 "find_package(Catch2 REQUIRED)")))))))
    (native-inputs
     (list catch2-3
           expected-lite
           json-dto))
    (inputs
     (list openssl
           sobjectizer))
    (propagated-inputs
     ;; These are all #include'd by restinio's .hpp header files.
     (list asio
           fmt
           llhttp
           pcre
           pcre2
           zlib))
    (home-page "https://stiffstream.com/en/products/restinio.html")
    (synopsis "C++14 library that gives you an embedded HTTP/Websocket server")
    (description "RESTinio is a header-only C++14 library that gives you an embedded
HTTP/Websocket server.  It is based on standalone version of ASIO
and targeted primarily for asynchronous processing of HTTP-requests.")
      (license license:bsd-3))))
    (license license:bsd-3)))

(define-public restinio-0.6
  (package
    (inherit restinio)
    (name "restinio")
    (version "0.6.19")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/Stiffstream/restinio")
                    (commit (string-append "v." version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "1qrb1qr075r5059w984c4slgpsiwv94j6fmi9naa5l48dbi1p7jz"))))
    (arguments
     (list
      #:configure-flags #~(list "-DRESTINIO_FIND_DEPS=ON"
                                "-DRESTINIO_INSTALL=ON"
                                "-DRESTINIO_TEST=ON"
                                "-DRESTINIO_USE_EXTERNAL_HTTP_PARSER=ON"
                                "-DRESTINIO_USE_EXTERNAL_SOBJECTIZER=ON")
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'change-directory
            (lambda _
              (chdir "dev"))))))
    (native-inputs (list catch2 clara json-dto))
    ;; These are all #include'd by restinio's .hpp header files.
    (propagated-inputs
     (modify-inputs (package-propagated-inputs restinio)
       (replace "llhttp" http-parser)))))

(define-public opendht
  (package
    (name "opendht")
    (version "2.4.12")
    (version "3.1.7")
    (source (origin
              (method git-fetch)
              (uri (git-reference


@@ 3764,7 3819,7 @@ and targeted primarily for asynchronous processing of HTTP-requests.")
              (file-name (git-file-name name version))
              (sha256
               (base32
                "0yji5pziqxfvyfizk3fn9j59bqlfdwfa1a0y9jjfknb2mmlwwb9w"))))
                "15jx62fm1frbbvpkxysvvwz1a8d605xi53aacf0bvp4mb1dzpddn"))))
    (outputs '("out" "python" "tools" "debug"))
    (build-system gnu-build-system)
    (arguments


@@ 3792,6 3847,14 @@ and targeted primarily for asynchronous processing of HTTP-requests.")
              (substitute* "tests/Makefile.am"
                (("\\bdhtrunnertester\\.(h|cpp)\\b")
                 ""))))
          (add-after 'unupack 'relax-test-timeouts
            (lambda _
              ;; At least the 'test_send_json' has been seen to fail
              ;; non-deterministically, but it seems hard to reproducible that
              ;; failure.
              (substitute* "tests/httptester.cpp"
                (("std::chrono::seconds\\(10)")
                 "std::chrono::seconds(30)"))))
          (add-after 'unpack 'fix-python-installation-prefix
            ;; Specify the installation prefix for the compiled Python module
            ;; that would otherwise attempt to installs itself to Python's own


@@ 3835,8 3898,8 @@ and targeted primarily for asynchronous processing of HTTP-requests.")
           fmt
           readline))
    (propagated-inputs
     (list msgpack                      ;included in several installed headers
           restinio                     ;included in opendht/http.h
     (list msgpack-cxx                  ;included in several installed headers
           restinio-0.6                 ;included in opendht/http.h
           ;; The following are listed in the 'Requires.private' field of
           ;; opendht.pc:
           argon2


@@ 3880,6 3943,60 @@ A very simple IM client working over the DHT.
@end table")
    (license license:gpl3+)))

(define-public dhtnet
  ;; There is no tag nor release; use the latest available commit.
  (let ((revision "0")
        (commit "8b6e99fd34f150fde5f21f3a57e0e9f28174c70c"))
    (package
      (name "dhtnet")
      ;; The base version is taken from the CMakeLists.txt file.
      (version (git-version "0.0.1" revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/savoirfairelinux/dhtnet")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "1yhygsimcl9j6hbww1b77am1kgbcriczslcrfb838nbfh18n1780"))))
      (outputs (list "out" "debug"))
      (build-system cmake-build-system)
      (arguments
       (list
        #:configure-flags #~(list "-DBUILD_DEPENDENCIES=OFF"
                                  "-DBUILD_SHARED_LIBS=ON"
                                  "-DBUILD_TESTING=ON")
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'delete-problematic-tests
              (lambda _
                (substitute* "CMakeLists.txt"
                  ;; The connectionManager test currently segfaults (see:
                  ;; https://git.jami.net/savoirfairelinux/dhtnet/-/issues/18).
                  ((".*tests_connectionManager.*") "")
                  ;; The fileutils test fail, asserting an unexpected returned
                  ;; value for the removeAll call when the directory to be
                  ;; removed is missing (see:
                  ;; https://git.jami.net/savoirfairelinux/dhtnet/-/issues/17).
                  ((".*tests_fileutils.*") "")))))))
      (native-inputs (list cppunit pkg-config))
      ;; This library depends on the Jami fork of pjproject that adds ICE
      ;; support.
      (inputs
       (list asio
             fmt
             msgpack-cxx
             opendht
             libupnp
             pjproject-jami
             readline))
      (home-page "https://github.com/savoirfairelinux/dhtnet/")
      (synopsis "OpenDHT network library for C++")
      (description "The @code{dhtnet} is a C++ library providing abstractions
for interacting with an OpenDHT distributed network.")
      (license license:gpl3+))))

(define-public frrouting
  (package
    (name "frrouting")


@@ 4445,36 4562,32 @@ QUIC protocol.")
                            "github.com/yggdrasil-network/yggdrasil-go/cmd/yggdrasilctl"
                            "github.com/yggdrasil-network/yggdrasil-go/cmd/genkeys"))))))))
    (propagated-inputs
     (let ((p (package-input-rewriting
               `((,go-golang-org-x-sys . ,go-golang-org-x-sys-0.8))
               #:deep? #true)))
       (cons go-golang-org-x-sys-0.8
             (map p
                  (list go-golang-zx2c4-com-wireguard
                        go-golang-org-x-text
                        go-golang-org-x-net
                        go-golang-org-x-crypto
                        go-golang-org-x-tools
                        go-netns
                        go-netlink
                        go-github-com-bits-and-blooms-bitset
                        go-github-com-bits-and-blooms-bloom
                        go-github-com-quic-go-quic-go
                        go-github-com-hjson-hjson-go
                        go-github-com-olekukonko-tablewriter
                        go-github-com-mitchellh-mapstructure
                        go-github-com-mattn-go-runewidth
                        go-github-com-mattn-go-isatty
                        go-github-com-mattn-go-colorable
                        go-github-com-kardianos-minwinsvc
                        go-github-com-hjson-hjson-go
                        go-github-com-hashicorp-go-syslog
                        go-github-com-gologme-log
                        go-github-com-fatih-color
                        go-github-com-cheggaaa-pb-v3
                        go-github-com-vividcortex-ewma
                        go-github-com-arceliar-phony
                        go-github-com-arceliar-ironwood)))))
     (list go-golang-zx2c4-com-wireguard
           go-golang-org-x-text
           go-golang-org-x-net
           go-golang-org-x-crypto
           go-golang-org-x-tools
           go-golang-org-x-sys
           go-netns
           go-netlink
           go-github-com-bits-and-blooms-bitset
           go-github-com-bits-and-blooms-bloom
           go-github-com-quic-go-quic-go
           go-github-com-hjson-hjson-go
           go-github-com-olekukonko-tablewriter
           go-github-com-mitchellh-mapstructure
           go-github-com-mattn-go-runewidth
           go-github-com-mattn-go-isatty
           go-github-com-mattn-go-colorable
           go-github-com-kardianos-minwinsvc
           go-github-com-hjson-hjson-go
           go-github-com-hashicorp-go-syslog
           go-github-com-gologme-log
           go-github-com-fatih-color
           go-github-com-cheggaaa-pb-v3
           go-github-com-vividcortex-ewma
           go-github-com-arceliar-phony
           go-github-com-arceliar-ironwood))
    (home-page "https://yggdrasil-network.github.io/blog.html")
    (synopsis
     "Experiment in scalable routing as an encrypted IPv6 overlay network")

M gnu/packages/parallel.scm => gnu/packages/parallel.scm +2 -2
@@ 64,14 64,14 @@
(define-public parallel
  (package
    (name "parallel")
    (version "20231122")
    (version "20231222")
    (source
     (origin
      (method url-fetch)
      (uri (string-append "mirror://gnu/parallel/parallel-"
                          version ".tar.bz2"))
      (sha256
       (base32 "1qpa3dhmdddw7l5906y8ck8rnri66kqkxcbxhsnj058pmbw9qb42"))
       (base32 "1alvva2dlnlq5rbbklzc2a7l84mg550l1xc632zdgfx9dzf6sihr"))
      (snippet
       '(begin
          (use-modules (guix build utils))

M gnu/packages/patches/curl-use-ssl-cert-env.patch => gnu/packages/patches/curl-use-ssl-cert-env.patch +13 -13
@@ 5,37 5,37 @@ must be called when no other threads exist).
This fixes network functionality in rust:cargo, and probably removes the need
for other future workarounds.
===================================================================
--- curl-7.66.0.orig/lib/easy.c	2020-01-02 15:43:11.883921171 +0100
+++ curl-7.66.0/lib/easy.c	2020-01-02 16:18:54.691882797 +0100
@@ -134,6 +134,9 @@
 #  pragma warning(default:4232) /* MSVC extension, dllimport identity */
--- curl-8.5.0.orig/lib/easy.c	2023-12-17 00:36:32.400468561 -0500
+++ curl-8.5.0/lib/easy.c	2023-12-17 00:39:08.898612331 -0500
@@ -137,6 +137,9 @@
 static char *leakpointer;
 #endif
 

+char * Curl_ssl_cert_dir = NULL;
+char * Curl_ssl_cert_file = NULL;
+
 /**
  * curl_global_init() globally initializes curl given a bitwise set of the
  * different features of what to initialize.
@@ -155,6 +158,9 @@
 #endif
@@ -163,6 +166,9 @@
     goto fail;
   }
 

+  Curl_ssl_cert_dir = curl_getenv("SSL_CERT_DIR");
+  Curl_ssl_cert_file = curl_getenv("SSL_CERT_FILE");
+
   if(!Curl_ssl_init()) {
     DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
     return CURLE_FAILED_INIT;
@@ -260,6 +266,9 @@
     goto fail;
@@ -287,6 +293,9 @@
   Curl_ssl_cleanup();
   Curl_resolver_global_cleanup();
 

+  free(Curl_ssl_cert_dir);
+  free(Curl_ssl_cert_file);
+
 #ifdef WIN32
   Curl_win32_cleanup(init_flags);
 #ifdef _WIN32
   Curl_win32_cleanup(easy_init_flags);
 #endif
diff -ur curl-7.66.0.orig/lib/url.c curl-7.66.0/lib/url.c
--- curl-7.66.0.orig/lib/url.c	2020-01-02 15:43:11.883921171 +0100

A gnu/packages/patches/dtc-meson-cell-overflow.patch => gnu/packages/patches/dtc-meson-cell-overflow.patch +32 -0
@@ 0,0 1,32 @@
Taken from upstream:
https://git.kernel.org/pub/scm/utils/dtc/dtc.git/commit/?id=32174a66efa4ad19fc6a2a6422e4af2ae4f055cb

From 32174a66efa4ad19fc6a2a6422e4af2ae4f055cb Mon Sep 17 00:00:00 2001
From: David Gibson <david@gibson.dropbear.id.au>
Date: Tue, 28 Feb 2023 10:33:58 +1100
Subject: [PATCH] meson: Fix cell overflow tests when running from meson

Because meson always builds out-of-tree we need to reference things in the
original source tree via $SRCDIR from run_tests.sh.  We forgot a couple of
cases for the cell overflow tests.  Fix them.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 tests/run_tests.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 91350ad3..f899d8cb 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -519,8 +519,8 @@ libfdt_tests () {
     check_tests "$SRCDIR/phandle-args-overflow.dts" clocks_property
 
     ## https://github.com/dgibson/dtc/issues/74
-    run_dtc_test -I dts -O dtb -o cell-overflow-results.test.dtb cell-overflow-results.dts
-    run_dtc_test -I dts -O dtb -o cell-overflow.test.dtb cell-overflow.dts
+    run_dtc_test -I dts -O dtb -o cell-overflow-results.test.dtb "$SRCDIR/cell-overflow-results.dts"
+    run_dtc_test -I dts -O dtb -o cell-overflow.test.dtb "$SRCDIR/cell-overflow.dts"
     run_test dtbs_equal_ordered cell-overflow.test.dtb cell-overflow-results.test.dtb
 
     # check full tests

D gnu/packages/patches/emacs-ess-fix-obsolete-function-alias.patch => gnu/packages/patches/emacs-ess-fix-obsolete-function-alias.patch +0 -23
@@ 1,23 0,0 @@
From 9cc5520e1998d03f5dec0fbb1fe71b7cdec38b65 Mon Sep 17 00:00:00 2001
From: Alex Branham <alex.branham@gmail.com>
Date: Wed, 6 Jan 2021 06:41:20 -0500
Subject: [PATCH] Add required when to obsolete function alias

Closes #1085
---
 lisp/ess-r-package.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lisp/ess-r-package.el b/lisp/ess-r-package.el
index 260959955..397ce14e6 100644
--- a/lisp/ess-r-package.el
+++ b/lisp/ess-r-package.el
@@ -577,7 +577,7 @@ package mode. Use this function if state of the buffer such as
   (error "As of ESS 16.04, `ess-developer' is deprecated. Use `ess-r-set-evaluation-env' instead"))
 
 (defalias 'ess-toggle-developer 'ess-developer)
-(define-obsolete-function-alias 'ess-r-devtools-check-package-buildwin 'ess-r-devtools-check-with-winbuilder)
+(define-obsolete-function-alias 'ess-r-devtools-check-package-buildwin 'ess-r-devtools-check-with-winbuilder "18.04")
 (define-obsolete-function-alias 'ess-r-devtools-ask 'ess-r-devtools-execute-command "18.04")
 
 (make-obsolete-variable 'ess-developer "Please use `ess-developer-select-package' and `ess-r-set-evaluation-env' instead." "16.04")

A gnu/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch => gnu/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch +27 -0
@@ 0,0 1,27 @@
From a884b62c9e6f23b9f4369d724e25db2f42dad28d Mon Sep 17 00:00:00 2001
From: Pierre LESPAGNOL <pierre.lespagnol@savoirfairelinux.com>
Date: Tue, 28 May 2019 16:18:20 -0400
Subject: [PATCH] Changement du ratio de 0.5% a 5%

---
 libavformat/rtp.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavformat/rtp.h b/libavformat/rtp.h
index 54512c6f71..16916ff86a 100644
--- a/libavformat/rtp.h
+++ b/libavformat/rtp.h
@@ -78,8 +78,8 @@ enum AVCodecID ff_rtp_codec_id(const char *buf, enum AVMediaType codec_type);
 #define RTP_VERSION 2
 #define RTP_MAX_SDES 256   /**< maximum text length for SDES */
 
-/* RTCP packets use 0.5% of the bandwidth */
-#define RTCP_TX_RATIO_NUM 5
+/* RTCP packets use 2.5% of the bandwidth */
+#define RTCP_TX_RATIO_NUM 25
 #define RTCP_TX_RATIO_DEN 1000
 
 /* An arbitrary id value for RTP Xiph streams - only relevant to indicate
-- 
2.17.1


A gnu/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch => gnu/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch +127 -0
@@ 0,0 1,127 @@
diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c
index 9b9a610343..8ec5bfc1ad 100644
--- a/libavcodec/libopusdec.c
+++ b/libavcodec/libopusdec.c
@@ -45,6 +45,8 @@ struct libopus_context {
 #ifdef OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST
     int apply_phase_inv;
 #endif
+    int decode_fec;
+    int64_t expected_next_pts;
 };
 
 #define OPUS_HEAD_SIZE 19
@@ -141,6 +143,8 @@ static av_cold int libopus_decode_init(AVCodecContext *avc)
     /* Decoder delay (in samples) at 48kHz */
     avc->delay = avc->internal->skip_samples = opus->pre_skip;
 
+    opus->expected_next_pts = AV_NOPTS_VALUE;
+
     return 0;
 }
 
@@ -161,27 +165,82 @@ static int libopus_decode(AVCodecContext *avc, AVFrame *frame,
                           int *got_frame_ptr, AVPacket *pkt)
 {
     struct libopus_context *opus = avc->priv_data;
-    int ret, nb_samples;
+    uint8_t *outptr;
+    int ret, nb_samples = 0, nb_lost_samples = 0, nb_samples_left;
+
+    // If FEC is enabled, calculate number of lost samples
+    if (opus->decode_fec &&
+        opus->expected_next_pts != AV_NOPTS_VALUE &&
+        pkt->pts != AV_NOPTS_VALUE &&
+        pkt->pts != opus->expected_next_pts) {
+        // Cap at recovering 120 ms of lost audio.
+        nb_lost_samples = pkt->pts - opus->expected_next_pts;
+        nb_lost_samples = FFMIN(nb_lost_samples, MAX_FRAME_SIZE);
+    }
 
-    frame->nb_samples = MAX_FRAME_SIZE;
+    frame->nb_samples = MAX_FRAME_SIZE + nb_lost_samples;
     if ((ret = ff_get_buffer(avc, frame, 0)) < 0)
         return ret;
 
+    outptr = frame->data[0];
+    nb_samples_left = frame->nb_samples;
+
+    if (opus->decode_fec && nb_lost_samples) {
+        // Try to recover the lost samples with FEC data from this one.
+        // If there's no FEC data, the decoder will do loss concealment instead.
+        if (avc->sample_fmt == AV_SAMPLE_FMT_S16)
+             nb_samples = opus_multistream_decode(opus->dec, pkt->data, pkt->size,
+                                                  (opus_int16 *)outptr,
+                                                  nb_lost_samples, 1);
+        else
+            nb_samples = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size,
+                                                       (float *)outptr,
+                                                       nb_lost_samples, 1);
+
+        if (nb_samples < 0) {
+            av_log(avc, AV_LOG_ERROR, "Decoding error: %s\n",
+                   opus_strerror(nb_samples));
+            return ff_opus_error_to_averror(nb_samples);
+        }
+
+        av_log(avc, AV_LOG_WARNING, "Recovered %d samples with FEC/PLC\n",
+                   nb_samples);
+
+        outptr += nb_samples * avc->channels * av_get_bytes_per_sample(avc->sample_fmt);
+        nb_samples_left -= nb_samples;
+        if (pkt->pts != AV_NOPTS_VALUE) {
+            pkt->pts -= nb_samples;
+            frame->pts = pkt->pts;
+        }
+    }
+
+    // Decode the actual, non-lost data.
     if (avc->sample_fmt == AV_SAMPLE_FMT_S16)
-        nb_samples = opus_multistream_decode(opus->dec, pkt->data, pkt->size,
-                                             (opus_int16 *)frame->data[0],
-                                             frame->nb_samples, 0);
+        ret = opus_multistream_decode(opus->dec, pkt->data, pkt->size,
+                                      (opus_int16 *)outptr,
+                                      nb_samples_left, 0);
     else
-        nb_samples = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size,
-                                                   (float *)frame->data[0],
-                                                   frame->nb_samples, 0);
+        ret = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size,
+                                            (float *)outptr,
+                                            nb_samples_left, 0);
 
-    if (nb_samples < 0) {
+    if (ret < 0) {
         av_log(avc, AV_LOG_ERROR, "Decoding error: %s\n",
-               opus_strerror(nb_samples));
-        return ff_opus_error_to_averror(nb_samples);
+               opus_strerror(ret));
+        return ff_opus_error_to_averror(ret);
     }
 
+    nb_samples += ret;
+
+    if (opus->decode_fec)
+    {
+        // Calculate the next expected pts
+        if (pkt->pts == AV_NOPTS_VALUE) {
+            opus->expected_next_pts = AV_NOPTS_VALUE;
+        } else {
+            opus->expected_next_pts = pkt->pts + nb_samples;
+        }
+    }
 #ifndef OPUS_SET_GAIN
     {
         int i = avc->ch_layout.nb_channels * nb_samples;
@@ -220,6 +279,7 @@ static const AVOption libopusdec_options[] = {
 #ifdef OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST
     { "apply_phase_inv", "Apply intensity stereo phase inversion", OFFSET(apply_phase_inv), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
 #endif
+    { "decode_fec", "Decode FEC data or use PLC", OFFSET(decode_fec), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
     { NULL },
 };
 
-- 
2.34.1


A gnu/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch => gnu/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch +50 -0
@@ 0,0 1,50 @@
diff --git a/libavcodec/libopusencc.c b/libavcodec/libopusencc.c
index 2a97811d18..40ee7b8fec 100644
--- a/libavcodec/libopusenc.c
+++ b/libavcodec/libopusenc.c
@@ -33,6 +33,7 @@
 typedef struct LibopusEncOpts {
     int vbr;
     int application;
+    int enable_fec;
     int packet_loss;
     int complexity;
     float frame_duration;
@@ -143,6 +144,13 @@
                "Unable to set constrained VBR: %s\n", opus_strerror(ret));

     ret = opus_multistream_encoder_ctl(enc,
+                                       OPUS_SET_INBAND_FEC(opts->enable_fec));
+    if (ret != OPUS_OK)
+        av_log(avctx, AV_LOG_WARNING,
+               "Unable to set enable FEC flag percentage: %s\n",
+               opus_strerror(ret));
+
+    ret = opus_multistream_encoder_ctl(enc,
                                        OPUS_SET_PACKET_LOSS_PERC(opts->packet_loss));
     if (ret != OPUS_OK)
         av_log(avctx, AV_LOG_WARNING,
@@ -452,6 +460,15 @@
     int ret;
     int discard_padding;
 
+    // Reload packet loss setting
+    ret = opus_multistream_encoder_ctl(opus->enc,
+                                       OPUS_SET_PACKET_LOSS_PERC(opus->opts.packet_loss));
+    if (ret != OPUS_OK)
+        av_log(avctx, AV_LOG_WARNING,
+               "Unable to set expected packet loss percentage: %s\n",
+               opus_strerror(ret));
+
+
     if (frame) {
         ret = ff_af_queue_add(&opus->afq, frame);
         if (ret < 0)
@@ -543,6 +560,7 @@
         { "audio",          "Favor faithfulness to the input",         0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_AUDIO },               0, 0, FLAGS, "application" },
         { "lowdelay",       "Restrict to only the lowest delay modes", 0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_RESTRICTED_LOWDELAY }, 0, 0, FLAGS, "application" },
     { "frame_duration", "Duration of a frame in milliseconds", OFFSET(frame_duration), AV_OPT_TYPE_FLOAT, { .dbl = 20.0 }, 2.5, 120.0, FLAGS },
+    { "enable_fec",     "Enable forward error correction",     OFFSET(enable_fec),     AV_OPT_TYPE_BOOL,  { .i64 = 0 },    0,   1,     FLAGS },
     { "packet_loss",    "Expected packet loss percentage",     OFFSET(packet_loss),    AV_OPT_TYPE_INT,   { .i64 = 0 },    0,   100,  FLAGS },
     { "vbr",            "Variable bit rate mode",              OFFSET(vbr),            AV_OPT_TYPE_INT,   { .i64 = 1 },    0,   2,    FLAGS, "vbr" },
         { "off",            "Use constant bit rate", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "vbr" },

A gnu/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch => gnu/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch +44 -0
@@ 0,0 1,44 @@
From dba13d03bc8e827fededc20b0ab1f574a1500f2a Mon Sep 17 00:00:00 2001
From: Philip-Dylan Gleonec <philip-dylan.gleonec@savoirfairelinux.com>
Date: Thu, 11 Feb 2021 12:25:14 +0100
Subject: [PATCH 2/2] avcodec/libopusenc: reload packet loss at encode

An estimation of packet loss is required by libopus to compute its FEC
data. Currently, this estimation is constant, and can not be changed
after configuration. This means an application using libopus through
ffmpeg can not adapt the packet loss estimation when the network
quality degrades.

This patch makes the encoder reload the packet_loss AVOption before
encoding samples, if fec is enabled. This way an application can modify
the packet loss estimation by changing the AVOption. Typical use-case
is a RTP stream, where packet loss can be estimated from RTCP packets.

Signed-off-by: Philip-Dylan Gleonec <philip-dylan.gleonec@savoirfairelinux.com>
---
 libavcodec/libopusenc.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
index 70d17f802b..c18e8ae7fa 100644
--- a/libavcodec/libopusenc.c
+++ b/libavcodec/libopusenc.c
@@ -460,6 +460,15 @@ static int libopus_encode(AVCodecContext *avctx, AVPacket *avpkt,
     int ret;
     int discard_padding;
 
+    if (opus->opts.fec) {
+        ret = opus_multistream_encoder_ctl(opus->enc,
+                                           OPUS_SET_PACKET_LOSS_PERC(opus->opts.packet_loss));
+        if (ret != OPUS_OK)
+            av_log(avctx, AV_LOG_WARNING,
+                   "Unable to set expected packet loss percentage: %s\n",
+                   opus_strerror(ret));
+    }
+
     if (frame) {
         ret = ff_af_queue_add(&opus->afq, frame);
         if (ret < 0)
-- 
2.25.1


A gnu/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch => gnu/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch +26 -0
@@ 0,0 1,26 @@
From c557a6211f5a29d89fc2ab561e0fb3d8878fb6ad Mon Sep 17 00:00:00 2001
From: philippegorley <gorley.philippe@gmail.com>
Date: Mon, 17 Dec 2018 15:27:57 -0500
Subject: [PATCH] remove mjpeg log

---
 libavcodec/mjpegdec.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index d1dca84d36..4a26c23cd4 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -2294,9 +2294,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
                    "restart marker: %d\n", start_code & 0x0f);
             /* APP fields */
         } else if (start_code >= APP0 && start_code <= APP15) {
-            if ((ret = mjpeg_decode_app(s)) < 0)
-                av_log(avctx, AV_LOG_ERROR, "unable to decode APP fields: %s\n",
-                       av_err2str(ret));
+            ret = mjpeg_decode_app(s);
             /* Comment */
         } else if (start_code == COM) {
             ret = mjpeg_decode_com(s);
--
2.17.1

A gnu/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch => gnu/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch +71 -0
@@ 0,0 1,71 @@
diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c
index 63047beccc..d59ec3dc8c 100644
--- a/libavformat/rtpenc.c
+++ b/libavformat/rtpenc.c
@@ -28,6 +28,8 @@
 
 #include "rtpenc.h"
 
+#define EXT_ABS_SEND_TIME
+
 static const AVOption options[] = {
     FF_RTP_FLAG_OPTS(RTPMuxContext, flags),
     { "payload_type", "Specify RTP payload type", offsetof(RTPMuxContext, payload_type), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM },
@@ -146,7 +148,11 @@ static int rtp_write_header(AVFormatContext *s1)
                                     s1->pb->max_packet_size);
     } else
         s1->packet_size = s1->pb->max_packet_size;
+#ifdef EXT_ABS_SEND_TIME
+    if (s1->packet_size <= 20) {
+#else
     if (s1->packet_size <= 12) {
+#endif
         av_log(s1, AV_LOG_ERROR, "Max packet size %u too low\n", s1->packet_size);
         return AVERROR(EIO);
     }
@@ -154,7 +160,11 @@ static int rtp_write_header(AVFormatContext *s1)
     if (!s->buf) {
         return AVERROR(ENOMEM);
     }
+#ifdef EXT_ABS_SEND_TIME
+    s->max_payload_size = s1->packet_size - 20;
+#else
     s->max_payload_size = s1->packet_size - 12;
+#endif
 
     if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
         avpriv_set_pts_info(st, 32, 1, st->codecpar->sample_rate);
@@ -332,16 +342,34 @@ static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time, int bye)
 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
 {
     RTPMuxContext *s = s1->priv_data;
+    uint64_t ntp64_time;
+    uint32_t absoluteSendTime;
 
     av_log(s1, AV_LOG_TRACE, "rtp_send_data size=%d\n", len);
 
     /* build the RTP header */
+#ifdef EXT_ABS_SEND_TIME
+    avio_w8(s1->pb, RTP_VERSION << 6 | 0x10); // extention bit
+#else
     avio_w8(s1->pb, RTP_VERSION << 6);
+#endif
     avio_w8(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
     avio_wb16(s1->pb, s->seq);
     avio_wb32(s1->pb, s->timestamp);
     avio_wb32(s1->pb, s->ssrc);
 
+#ifdef EXT_ABS_SEND_TIME
+    avio_wb16(s1->pb, 0xBEDE);      // magic word
+    avio_wb16(s1->pb, 0x0001);      // length=1
+    avio_w8(s1->pb, 0x32);         // ID=3 and lenght=2
+    ntp64_time = ff_get_formatted_ntp_time(ff_ntp_time());
+    absoluteSendTime = (uint32_t)((ntp64_time>> 14) & 0x00ffffff);
+    av_log(s1, AV_LOG_TRACE, "ntp64:%lu, abs_time:%u\n", ntp64_time, absoluteSendTime);
+    avio_w8(s1->pb, (uint8_t)(absoluteSendTime >> 16));
+    avio_w8(s1->pb, (uint8_t)(absoluteSendTime >> 8 & 0xff));
+    avio_w8(s1->pb, (uint8_t)(absoluteSendTime & 0xff));
+#endif
+
     avio_write(s1->pb, buf1, len);
     avio_flush(s1->pb);

A gnu/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch => gnu/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch +302 -0
@@ 0,0 1,302 @@
From c1b210534b15188c964b31dc47e172f8ed4aca55 Mon Sep 17 00:00:00 2001
From: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
Date: Tue, 19 Jul 2022 13:35:19 -0300
Subject: [PATCH] Screen sharing x11 fixes

+ We can now have a single stream in the x11grab, which can be updated to follow window resizing
+ Due to stream reinit, shm may cause memory issues and was removed
+ Adds one option (is_area) that defines if we are grabing a region of the display/window or the hole screen/window.

note: This is a custom patch for later rebase
---
 libavdevice/xcbgrab.c | 186 ++++++++++--------------------------------
 1 file changed, 45 insertions(+), 141 deletions(-)

diff --git a/libavdevice/xcbgrab.c b/libavdevice/xcbgrab.c
index 64a68ba497..76e654b424 100644
--- a/libavdevice/xcbgrab.c
+++ b/libavdevice/xcbgrab.c
@@ -29,11 +29,6 @@
 #include <xcb/xfixes.h>
 #endif
 
-#if CONFIG_LIBXCB_SHM
-#include <sys/shm.h>
-#include <xcb/shm.h>
-#endif
-
 #if CONFIG_LIBXCB_SHAPE
 #include <xcb/shape.h>
 #endif
@@ -53,9 +48,6 @@ typedef struct XCBGrabContext {
     xcb_connection_t *conn;
     xcb_screen_t *screen;
     xcb_window_t window;
-#if CONFIG_LIBXCB_SHM
-    AVBufferPool *shm_pool;
-#endif
     int64_t time_frame;
     AVRational time_base;
     int64_t frame_duration;
@@ -72,10 +64,9 @@ typedef struct XCBGrabContext {
     int region_border;
     int centered;
     int select_region;
+    int is_area;
 
     const char *framerate;
-
-    int has_shm;
 } XCBGrabContext;
 
 #define FOLLOW_CENTER -1
@@ -97,6 +88,7 @@ static const AVOption options[] = {
     { "show_region", "Show the grabbing region.", OFFSET(show_region), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, D },
     { "region_border", "Set the region border thickness.", OFFSET(region_border), AV_OPT_TYPE_INT, { .i64 = 3 }, 1, 128, D },
     { "select_region", "Select the grabbing region graphically using the pointer.", OFFSET(select_region), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, D },
+    { "is_area", "Define if we are grabing a region of the display/window.", OFFSET(is_area), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, D },
     { NULL },
 };
 
@@ -216,99 +208,6 @@ static int64_t wait_frame(AVFormatContext *s, AVPacket *pkt)
     return curtime;
 }
 
-#if CONFIG_LIBXCB_SHM
-static int check_shm(xcb_connection_t *conn)
-{
-    xcb_shm_query_version_cookie_t cookie = xcb_shm_query_version(conn);
-    xcb_shm_query_version_reply_t *reply;
-
-    reply = xcb_shm_query_version_reply(conn, cookie, NULL);
-    if (reply) {
-        free(reply);
-        return 1;
-    }
-
-    return 0;
-}
-
-static void free_shm_buffer(void *opaque, uint8_t *data)
-{
-    shmdt(data);
-}
-
-static AVBufferRef *allocate_shm_buffer(void *opaque, size_t size)
-{
-    xcb_connection_t *conn = opaque;
-    xcb_shm_seg_t segment;
-    AVBufferRef *ref;
-    uint8_t *data;
-    int id;
-
-    id = shmget(IPC_PRIVATE, size, IPC_CREAT | 0777);
-    if (id == -1)
-        return NULL;
-
-    segment = xcb_generate_id(conn);
-    xcb_shm_attach(conn, segment, id, 0);
-    data = shmat(id, NULL, 0);
-    shmctl(id, IPC_RMID, 0);
-    if ((intptr_t)data == -1 || !data)
-        return NULL;
-
-    ref = av_buffer_create(data, size, free_shm_buffer, (void *)(ptrdiff_t)segment, 0);
-    if (!ref)
-        shmdt(data);
-
-    return ref;
-}
-
-static int xcbgrab_frame_shm(AVFormatContext *s, AVPacket *pkt)
-{
-    XCBGrabContext *c = s->priv_data;
-    xcb_shm_get_image_cookie_t iq;
-    xcb_shm_get_image_reply_t *img;
-    xcb_drawable_t drawable = c->window_id;
-    xcb_generic_error_t *e = NULL;
-    AVBufferRef *buf;
-    xcb_shm_seg_t segment;
-
-    buf = av_buffer_pool_get(c->shm_pool);
-    if (!buf) {
-        av_log(s, AV_LOG_ERROR, "Could not get shared memory buffer.\n");
-        return AVERROR(ENOMEM);
-    }
-    segment = (xcb_shm_seg_t)(uintptr_t)av_buffer_pool_buffer_get_opaque(buf);
-
-    iq = xcb_shm_get_image(c->conn, drawable,
-                           c->x, c->y, c->width, c->height, ~0,
-                           XCB_IMAGE_FORMAT_Z_PIXMAP, segment, 0);
-    img = xcb_shm_get_image_reply(c->conn, iq, &e);
-
-    xcb_flush(c->conn);
-
-    if (e) {
-        av_log(s, AV_LOG_ERROR,
-               "Cannot get the image data "
-               "event_error: response_type:%u error_code:%u "
-               "sequence:%u resource_id:%u minor_code:%u major_code:%u.\n",
-               e->response_type, e->error_code,
-               e->sequence, e->resource_id, e->minor_code, e->major_code);
-
-        free(e);
-        av_buffer_unref(&buf);
-        return AVERROR(EACCES);
-    }
-
-    free(img);
-
-    pkt->buf = buf;
-    pkt->data = buf->data;
-    pkt->size = c->frame_size;
-
-    return 0;
-}
-#endif /* CONFIG_LIBXCB_SHM */
-
 #if CONFIG_LIBXCB_XFIXES
 static int check_xfixes(xcb_connection_t *conn)
 {
@@ -462,14 +361,7 @@ static int xcbgrab_read_packet(AVFormatContext *s, AVPacket *pkt)
     if (c->show_region)
         xcbgrab_update_region(s, win_x, win_y);
 
-#if CONFIG_LIBXCB_SHM
-    if (c->has_shm && xcbgrab_frame_shm(s, pkt) < 0) {
-        av_log(s, AV_LOG_WARNING, "Continuing without shared memory.\n");
-        c->has_shm = 0;
-    }
-#endif
-    if (!c->has_shm)
-        ret = xcbgrab_frame(s, pkt);
+    ret = xcbgrab_frame(s, pkt);
     pkt->dts = pkt->pts = pts;
     pkt->duration = c->frame_duration;
 
@@ -488,11 +380,8 @@ static av_cold int xcbgrab_read_close(AVFormatContext *s)
 {
     XCBGrabContext *ctx = s->priv_data;
 
-#if CONFIG_LIBXCB_SHM
-    av_buffer_pool_uninit(&ctx->shm_pool);
-#endif
-
     xcb_disconnect(ctx->conn);
+    ctx->conn = NULL;
 
     return 0;
 }
@@ -572,7 +461,15 @@ static int pixfmt_from_pixmap_format(AVFormatContext *s, int depth,
 static int create_stream(AVFormatContext *s)
 {
     XCBGrabContext *c = s->priv_data;
-    AVStream *st      = avformat_new_stream(s, NULL);
+
+    // If we try to open another stream to x11grab, there is no reason
+    // to keep more than one stream in the context.
+    AVStream *st;
+    if (!s->nb_streams) {
+        st = avformat_new_stream(s, NULL);
+    } else {
+        st = s->streams[0];
+    }
     xcb_get_geometry_cookie_t gc;
     xcb_get_geometry_reply_t *geo;
     int64_t frame_size_bits;
@@ -594,11 +491,26 @@ static int create_stream(AVFormatContext *s)
         return AVERROR_EXTERNAL;
     }
 
+    // av_log(s, AV_LOG_ERROR, "Capture is_area %d\n", c->is_area);
+    // Width and Height are not 0 only when we set a window area to share
+    // This if may be valid only in  the first call to create_stream
     if (!c->width || !c->height) {
+        // av_log(s, AV_LOG_ERROR, "Capture area!\n");
+        c->is_area = 0;
+        c->width = geo->width;
+        c->height = geo->height;
+    }
+    // If not a predefined area, then we should follow geometry changes
+    // This can be valid only on the second call onwards
+    if (!c->is_area && (c->width != geo->width || c->height != geo->height)) {
         c->width = geo->width;
         c->height = geo->height;
     }
 
+    // av_log(s, AV_LOG_ERROR, "Capture area %dx%d at position %d.%d\n",
+    //            c->width, c->height,
+    //            c->x, c->y);
+
     if (c->x + c->width > geo->width ||
         c->y + c->height > geo->height) {
         av_log(s, AV_LOG_ERROR,
@@ -628,13 +540,6 @@ static int create_stream(AVFormatContext *s)
     }
     c->frame_size = frame_size_bits / 8;
 
-#if CONFIG_LIBXCB_SHM
-    c->shm_pool = av_buffer_pool_init2(c->frame_size + AV_INPUT_BUFFER_PADDING_SIZE,
-                                           c->conn, allocate_shm_buffer, NULL);
-    if (!c->shm_pool)
-        return AVERROR(ENOMEM);
-#endif
-
     st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
     st->codecpar->codec_id   = AV_CODEC_ID_RAWVIDEO;
     st->codecpar->width      = c->width;
@@ -829,23 +734,26 @@ static av_cold int xcbgrab_read_header(AVFormatContext *s)
         sscanf(s->url, "+%d,%d", &c->x, &c->y);
     }
 
-    c->conn = xcb_connect(display_name[0] ? display_name : NULL, &screen_num);
-    av_freep(&display_name);
+    if (!c->conn || !c->screen) {
+        xcbgrab_read_close(s);
+        c->conn = xcb_connect(display_name[0] ? display_name : NULL, &screen_num);
+        av_freep(&display_name);
 
-    if ((ret = xcb_connection_has_error(c->conn))) {
-        av_log(s, AV_LOG_ERROR, "Cannot open display %s, error %d.\n",
-               s->url[0] ? s->url : "default", ret);
-        return AVERROR(EIO);
-    }
+        if ((ret = xcb_connection_has_error(c->conn))) {
+            av_log(s, AV_LOG_ERROR, "Cannot open display %s, error %d.\n",
+                s->url[0] ? s->url : "default", ret);
+            return AVERROR(EIO);
+        }
 
-    setup = xcb_get_setup(c->conn);
+       setup = xcb_get_setup(c->conn);
 
-    c->screen = get_screen(setup, screen_num);
-    if (!c->screen) {
-        av_log(s, AV_LOG_ERROR, "The screen %d does not exist.\n",
-               screen_num);
-        xcbgrab_read_close(s);
-        return AVERROR(EIO);
+        c->screen = get_screen(setup, screen_num);
+        if (!c->screen) {
+            av_log(s, AV_LOG_ERROR, "The screen %d does not exist.\n",
+                screen_num);
+            xcbgrab_read_close(s);
+            return AVERROR(EIO);
+        }
     }
 
     if (c->window_id == XCB_NONE)
@@ -876,10 +784,6 @@ static av_cold int xcbgrab_read_header(AVFormatContext *s)
         return ret;
     }
 
-#if CONFIG_LIBXCB_SHM
-    c->has_shm = check_shm(c->conn);
-#endif
-
 #if CONFIG_LIBXCB_XFIXES
     if (c->draw_mouse) {
         if (!(c->draw_mouse = check_xfixes(c->conn))) {
-- 
2.34.1


A gnu/packages/patches/guile-fibers-libevent-timeout.patch => gnu/packages/patches/guile-fibers-libevent-timeout.patch +61 -0
@@ 0,0 1,61 @@
commit 2ca397bfcca94c106380368b5b0ce920b0a62a95
Author: Ludovic Courtès <ludo@gnu.org>
Date:   Sat Jan 6 16:22:45 2024 +0100

    libevent: Fix computation of the timeout value.
    
diff --git a/extensions/libevent.c b/extensions/libevent.c
index 134460a..62e50a3 100644
--- a/extensions/libevent.c
+++ b/extensions/libevent.c
@@ -192,30 +192,27 @@ scm_primitive_resize (SCM lst, SCM eventsv)
 }
 #undef FUNC_NAME
 
-static uint64_t time_units_per_microsec;
+static uint64_t time_units_per_microsec, microsec_per_time_units;
 
 static void*
 run_event_loop (void *p)
 #define FUNC_NAME "primitive-event-loop"
 {
-  int ret = 0;
-  int microsec = 0;
-  struct timeval tv;
-
+  int ret;
   struct loop_data *data = p;
 
-  if (data->timeout < 0)
-    microsec = -1;
-  else if (data->timeout >= 0)
+  if (data->timeout >= 0)
     {
-      microsec = (time_units_per_microsec == 0)
-	? 0 : data->timeout / time_units_per_microsec;
-      tv.tv_sec = 0;
-      tv.tv_usec = microsec;
-    }
+      struct timeval tv;
+
+      tv.tv_sec = data->timeout / scm_c_time_units_per_second;
+      tv.tv_usec =
+	time_units_per_microsec > 0
+	? ((data->timeout % scm_c_time_units_per_second)
+	   / time_units_per_microsec)
+	: ((data->timeout % scm_c_time_units_per_second)
+	   * microsec_per_time_units);
 
-  if (microsec >= 0)
-    {
       ret = event_base_loopexit (data->base, &tv);
       if (ret == -1)
         SCM_MISC_ERROR ("event loop exit failed", SCM_EOL);
@@ -307,6 +304,7 @@ void
 init_fibers_libevt (void)
 {
   time_units_per_microsec = scm_c_time_units_per_second / 1000000;
+  microsec_per_time_units = 1000000 / scm_c_time_units_per_second;
 
   scm_c_define_gsubr ("primitive-event-wake", 1, 0, 0,
                       scm_primitive_event_wake);

M gnu/packages/patches/jami-disable-integration-tests.patch => gnu/packages/patches/jami-disable-integration-tests.patch +6 -4
@@ 1,3 1,5 @@
This issue is tracked at https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/824.

From 3fd7acc6e5a8c316c366827956d7c06affdc9685 Mon Sep 17 00:00:00 2001
From: Olivier Dion <olivier.dion@savoirfairelinux.com>
Date: Fri, 7 Oct 2022 15:20:37 -0400


@@ 17,8 19,8 @@ With file names adjusted for the source tarball.

diff --git a/configure.ac b/configure.ac
index 27215d044..aaeef1c1b 100644
--- a/daemon/configure.ac
+++ b/daemon/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -40,6 +40,11 @@ AS_IF([test "x$enable_debug" = "xyes"],
   [DAEMONCFLAGS+=" -DNDEBUG=1 -O3"
    DAEMONCXXFLAGS+=" -DNDEBUG=1 -O3 -Wno-deprecated"])


@@ 33,8 35,8 @@ index 27215d044..aaeef1c1b 100644
     [Build fuzzing tools]))
diff --git a/test/unitTest/Makefile.am b/test/unitTest/Makefile.am
index f2b0fd994..ab232ddb7 100644
--- a/daemon/test/unitTest/Makefile.am
+++ b/daemon/test/unitTest/Makefile.am
--- a/test/unitTest/Makefile.am
+++ b/test/unitTest/Makefile.am
@@ -13,30 +13,6 @@ check_PROGRAMS =
 
 ####### Unit Test ########

M gnu/packages/patches/jami-libjami-headers-search.patch => gnu/packages/patches/jami-libjami-headers-search.patch +4 -1
@@ 1,4 1,7 @@
Upstream status: https://review.jami.net/c/jami-client-qt/+/24273.
It was applied, then reverted (by mistake?) in 4d2c55348bc014.

It's been resubmitted here:
https://lists.gnu.org/archive/html/jami/2024-01/msg00005.html

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8d71b84b..36729698 100644

A gnu/packages/patches/jami-qml-tests-discovery.patch => gnu/packages/patches/jami-qml-tests-discovery.patch +15 -0
@@ 0,0 1,15 @@
Upstream status: https://review.jami.net/c/jami-client-qt/+/25640

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index d50908cf..587c9d15 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -73,6 +73,8 @@ endif()
 
 string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
 
+set(QUICK_TEST_SOURCE_DIR "${CMAKE_SOURCE_DIR}tests/qml/src")
+
 set(QML_TESTS_SOURCE_FILES
     ${CMAKE_SOURCE_DIR}/tests/qml/main.cpp
     ${TEST_QML_RESOURCES}

A gnu/packages/patches/jami-skip-tests-requiring-internet.patch => gnu/packages/patches/jami-skip-tests-requiring-internet.patch +51 -0
@@ 0,0 1,51 @@
Forwarded upstream: https://lists.gnu.org/archive/html/jami/2024-01/msg00010.html

From 1d3b044c85c32341cca392254fe8bbf34a4639e1 Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Date: Tue, 9 Jan 2024 11:14:04 -0500
Subject: [PATCH] tests: Skip tests that need Internet when there's none.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* tests/unittests/messageparser_unittest.cpp (ALinkIsParsedCorrectly)
(YoutubeLinkIsParsedCorrectly): Skip when there is no Internet.

Series-to: jami@gnu.org
Series-cc: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
Fixes: <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1507>
Change-Id: I0a5b57cd82f93fd7edf3fbeb73fb3db5a04c628c
---
 tests/unittests/messageparser_unittest.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/tests/unittests/messageparser_unittest.cpp b/tests/unittests/messageparser_unittest.cpp
index c10b0d0b..df7a0692 100644
--- a/tests/unittests/messageparser_unittest.cpp
+++ b/tests/unittests/messageparser_unittest.cpp
@@ -69,6 +69,9 @@ TEST_F(MessageParserFixture, TextIsParsedCorrectly)
  */
 TEST_F(MessageParserFixture, ALinkIsParsedCorrectly)
 {
+    if (!globalEnv.connectivityMonitor->isOnline())
+        GTEST_SKIP() << "ALinkIsParsedCorrectly requires Internet connectivity";
+
     auto linkColor = QColor::fromRgb(0, 0, 255);
     auto backgroundColor = QColor::fromRgb(0, 0, 255);
 
@@ -174,6 +177,9 @@ TEST_F(MessageParserFixture, FencedCodeIsParsedCorrectly)
  */
 TEST_F(MessageParserFixture, YoutubeLinkIsParsedCorrectly)
 {
+    if (!globalEnv.connectivityMonitor->isOnline())
+        GTEST_SKIP() << "YoutubeLinkIsParsedCorrectly requires Internet connectivity";
+
     auto url = "https://www.youtube.com/watch?v=1234567890";
     auto msg = "blah blah " + QString(url) + " blah blah";
 

base-commit: a4300308dc8d03d59f620bb5fed753df5cf31ed9
prerequisite-patch-id: 90a419e7de1f4fa5bb68bc58ad0da2817ed268e0
-- 
2.41.0


A gnu/packages/patches/jami-unbundle-dependencies.patch => gnu/packages/patches/jami-unbundle-dependencies.patch +71 -0
@@ 0,0 1,71 @@
Forwarded here: https://lists.gnu.org/archive/html/jami/2024-01/msg00007.html

From a302dc0a0faf2778331745a1d01bc3071e182d4d Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Date: Mon, 8 Jan 2024 16:07:05 -0500
Subject: [PATCH] build: Allow using system-provided md4c and tidy libraries.

* CMakeLists.txt <md4c, tidy>: Search for libraries in the system
first, falling back to bundled copies in case they aren't found.

Series-to: jami@gnu.org
Fixes: <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1506>
Change-Id: I637959fefce6a21b0ee73a793acb6c3c42dcdce0
---
 CMakeLists.txt | 36 +++++++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 11 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 38e7a4e2..3f1bd599 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -545,19 +545,33 @@ add_subdirectory(3rdparty/SortFilterProxyModel)
 set(SFPM_OBJECTS $<TARGET_OBJECTS:SortFilterProxyModel>)
 
 # md4c
-set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
-add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
-list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
-list(APPEND CLIENT_INCLUDE_DIRS ${MD4C_SOURCE_DIR}/src)
-list(APPEND CLIENT_LIBS md4c-html)
+find_package(md4c)
+if(md4c_FOUND)
+  message(STATUS "Using system-provided md4c-html")
+  list(APPEND CLIENT_LIBS md4c::md4c-html)
+else()
+  message("Using bundled md4c-html library")
+  set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
+  add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
+  list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
+  list(APPEND CLIENT_INCLUDE_DIRS ${MD4C_SOURCE_DIR}/src)
+  list(APPEND CLIENT_LIBS md4c-html)
+endif()
 
 # tidy-html5
-set(BUILD_SHARED_LIB OFF CACHE BOOL "Don't build shared tidy library" FORCE)
-set(SUPPORT_CONSOLE_APP OFF CACHE BOOL "Don't build tidy console app" FORCE)
-add_subdirectory(3rdparty/tidy-html5 EXCLUDE_FROM_ALL)
-list(APPEND CLIENT_LINK_DIRS ${tidy_BINARY_DIR}/Release)
-list(APPEND CLIENT_INCLUDE_DIRS ${tidy_SOURCE_DIR}/include)
-list(APPEND CLIENT_LIBS tidy-static)
+pkg_check_modules(tidy IMPORTED_TARGET tidy)
+if(tidy_FOUND)
+  message(STATUS "Using system-provided tidy")
+  list(APPEND CLIENT_LIBS PkgConfig::tidy)
+else()
+  message("Using bundled tidy library")
+  set(BUILD_SHARED_LIB OFF CACHE BOOL "Don't build shared tidy library" FORCE)
+  set(SUPPORT_CONSOLE_APP OFF CACHE BOOL "Don't build tidy console app" FORCE)
+  add_subdirectory(3rdparty/tidy-html5 EXCLUDE_FROM_ALL)
+  list(APPEND CLIENT_LINK_DIRS ${tidy_BINARY_DIR}/Release)
+  list(APPEND CLIENT_INCLUDE_DIRS ${tidy_SOURCE_DIR}/include)
+  list(APPEND CLIENT_LIBS tidy-static)
+endif()
 
 # common executable sources
 qt_add_executable(

base-commit: a4300308dc8d03d59f620bb5fed753df5cf31ed9
-- 
2.41.0


A gnu/packages/patches/libjami-ac-config-files.patch => gnu/packages/patches/libjami-ac-config-files.patch +52 -0
@@ 0,0 1,52 @@
Forwarded here: https://lists.gnu.org/archive/html/jami/2024-01/msg00003.html

From 20a1702d881b381979d31c456f1b8cf5e0f728ad Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Date: Sun, 7 Jan 2024 16:40:41 -0500
Subject: [PATCH] configure.ac: Expand AC_CONFIG_FILES to fix a race.

The commands apparently run for each file listed, or something
similar, leading to:

  configure: creating ./config.status
  config.status: creating test/agent/Makefile
  chmod: cannot access 'test/agent/pre-inst-env': No such file or directory
  chmod: cannot access 'test/agent/scenarios/bulk-calls/run-scenario': No such file or directory
  config.status: creating test/agent/pre-inst-env
  chmod: cannot access 'test/agent/scenarios/bulk-calls/run-scenario': No such file or directory

* configure.ac [ENABLE_AGENT]: Separate AC_CONFIG_FILES uses per file.

Series-to: jami@gnu.org
Series-postfix: daemon
Change-Id: Ib283955b73540248e09bf31ef44ef3d178b216fa
---
 configure.ac | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index cdea5ff1c..2ab96d817 100644
--- a/configure.ac
+++ b/configure.ac
@@ -61,11 +61,11 @@ AC_ARG_ENABLE([agent],
     [Build agent]))
 AM_CONDITIONAL([ENABLE_AGENT], [test "x$enable_agent" = "xyes"])
 AM_COND_IF([ENABLE_AGENT],
-           [AC_CONFIG_FILES([test/agent/Makefile
-                             test/agent/pre-inst-env:test/agent/build-aux/pre-inst-env.in
-                             test/agent/scenarios/bulk-calls/run-scenario],
-                            [chmod +x test/agent/pre-inst-env
-                             chmod +x test/agent/scenarios/bulk-calls/run-scenario])])
+  [AC_CONFIG_FILES([test/agent/Makefile])
+   AC_CONFIG_FILES([test/agent/pre-inst-env:test/agent/build-aux/pre-inst-env.in],
+                   [chmod +x test/agent/pre-inst-env])
+   AC_CONFIG_FILES([test/agent/scenarios/bulk-calls/run-scenario],
+                   [chmod +x test/agent/scenarios/bulk-calls/run-scenario])])
 
 AC_ARG_ENABLE([tracepoints], AS_HELP_STRING([--enable-tracepoints], [Enable tracepoints]))
 

base-commit: e246fb2e090c9b3de55e2d455eee5a6f05a5b286
-- 
2.41.0


A gnu/packages/patches/python-pyreadstat-link-libiconv.patch => gnu/packages/patches/python-pyreadstat-link-libiconv.patch +15 -0
@@ 0,0 1,15 @@
To ensure libiconv can be found by Guix, we need to link the library.

--- a/setup.py
+++ b/setup.py
@@ -81,8 +81,7 @@ else:
     libraries.extend(["m", "z"])
     _platform = sys.platform
     # Mac: iconv needs to be linked statically
-    if _platform.lower().startswith("darwin"):
-        libraries.append("iconv")
+    libraries.append("iconv")
 
 # Extensions
 sources.sort()


A gnu/packages/patches/python-uqbar-python3.10.patch => gnu/packages/patches/python-uqbar-python3.10.patch +23 -0
@@ 0,0 1,23 @@
Since Python 3.10 the output of a CLI program created with argparse
uses "options" instead of "optional arguments". This behaviour breaks
the tests in python-uqbar.

--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -84,7 +84,7 @@ def test_call_help():
 
         speak like a cat
 
-        optional arguments:
+        options:
           -h, --help  show this help message and exit
           --version   show program's version number and exit
           --loud      be adamant
@@ -101,6 +101,6 @@ def test_help():
         """
         usage: vox-aggregator [-h] [--version] {help,list,birds,mammals} ...
 
-        optional arguments:
+        options:
           -h, --help            show this help message and exit
           --version             show program's version number and exit

M gnu/packages/plan9.scm => gnu/packages/plan9.scm +66 -70
@@ 73,8 73,8 @@ reconstruct a Plan 9 terminal-like experience from a non-Plan 9 system.")

(define-public plan9port
  ;; no releases
  (let ((commit "cc4571fec67407652b03d6603ada6580de2194dc")
        (revision "0"))
  (let ((commit "f8681acb374fa0d5ed1568dbedb00a4abe1ca6f1")
        (revision "1"))
    (package
      (name "plan9port")
      (version (git-version "0.1.0" revision commit))


@@ 86,7 86,7 @@ reconstruct a Plan 9 terminal-like experience from a non-Plan 9 system.")
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "1g2kzlghcghs560na6xalfsjq5zwp015wv9wk8wxn26981zs759x"))
                  "01343jvn8kr63i78h8xlgscn6wihdsr44xzh1cylvhigjbqw8n2x"))
                (modules '((guix build utils)))
                (snippet #~(for-each delete-file-recursively
                                     '("font/luc" ;nonfree


@@ 94,73 94,69 @@ reconstruct a Plan 9 terminal-like experience from a non-Plan 9 system.")
      (build-system gnu-build-system)
      (arguments
       (list #:tests? #f ;no tests
             #:phases #~(modify-phases %standard-phases
                          (add-after 'unpack 'setup
                            (lambda _
                              (delete-file "src/cmd/mk/mk.pdf")
                              (substitute* "src/cmd/acme/acme.c"
                                (("/lib/font/bit/lucsans/euro.8.font")
                                 (string-append #$output
                                  "/font/fixed/unicode.5x8.font"))
                                (("/lib/font/bit/lucm/unicode.9.font")
                                 (string-append #$output
                                  "/font/fixed/unicode.6x9.font")))
                              (substitute* (find-files "src")
                                (("/lib/font/bit")
                                 (string-append #$output "/font")))
                              (substitute* "bin/9c"
                                (("which")
                                 (which "which")))
                              (substitute* "src/cmd/fontsrv/freetyperules.sh"
                                (("'\\$i'/freetype2")
                                 (string-append "-I"
                                                #$freetype
                                                "/include/freetype2")))
                              (with-output-to-file "LOCAL.config"
                                (lambda _
                                  (format #t "CC9=~a~%" #$(cc-for-target))
                                  (format #t "FONTSRV=fontsrv~%")))
                              (setenv "X11"
                                      #$libx11)
                              (setenv "PLAN9"
                                      (getcwd))
                              (setenv "PLAN9_TARGET"
                                      #$output)))
                          (delete 'configure) ;no configure
                          (replace 'build
                            (lambda _
                              (invoke "./INSTALL" "-b")))
                          (replace 'install
                            (lambda _
                              (for-each (lambda (x)
                                          (let ((out (string-append #$output
                                                                    "/" x)))
                                            (mkdir-p out)
                                            (copy-recursively x out)))
                                        ;; TODO: use external sky and dict packages
                                        '("bin" "face"
                                          "font"
                                          "include"
                                          "lib"
                                          "lp"
                                          "mail"
                                          "man"
                                          "ndb"
                                          "plumb"
                                          "tmac"
                                          "troff"
                                          "postscript"))
                              (install-file "rcmain" #$output)))
                          (add-after 'install 'wrap-executables
                            (lambda _
                              (for-each (lambda (exe)
                                          (wrap-program exe
                                            `("PLAN9" ":" prefix
                                              (,#$output))))
                                        (find-files
                                         (string-append #$output "/bin")))))
                          ;; Plan9 doesn't compress man pages
                          (delete 'compress-documentation))))
             #:strip-directories #~'("plan9/bin")
             #:phases
             #~(modify-phases %standard-phases
                 (add-after 'unpack 'setup
                   (lambda _
                     (let ((dest (string-append #$output "/plan9")))
                       (delete-file "src/cmd/mk/mk.pdf")
                       (substitute* "src/cmd/acme/acme.c"
                         (("/lib/font/bit/lucsans/euro.8.font")
                          (string-append dest
                                         "/font/fixed/unicode.5x8.font"))
                         (("/lib/font/bit/lucm/unicode.9.font")
                          (string-append dest
                                         "/font/fixed/unicode.6x9.font")))
                       (substitute* (find-files "src")
                         (("/lib/font/bit")
                          (string-append dest "/font")))
                       (substitute* "bin/9c"
                         (("which")
                          (which "which")))
                       (substitute* "src/cmd/fontsrv/freetyperules.sh"
                         (("'\\$i'/freetype2")
                          (string-append "-I"
                                         #$freetype
                                         "/include/freetype2")))
                       (with-output-to-file "LOCAL.config"
                         (lambda _
                           (format #t "CC9=~a~%" #$(cc-for-target))
                           (format #t "FONTSRV=fontsrv~%")))
                       (setenv "X11" #$libx11)
                       (setenv "PLAN9" (getcwd))
                       (setenv "PLAN9_TARGET" dest))))
                 (delete 'configure)    ;no configure
                 (replace 'build
                   (lambda _
                     (invoke "./INSTALL" "-b")))
                 (replace 'install
                   (lambda _
                     (invoke "./INSTALL" "-c")
                     (let ((dest (getenv "PLAN9_TARGET")))
                       (for-each (lambda (x)
                                   (let ((out (string-append dest "/" x)))
                                     (mkdir-p out)
                                     (copy-recursively x out)))
                                 ;; TODO: use external sky and dict packages
                                 '("bin" "face"
                                   "font"
                                   "include"
                                   "lib"
                                   "lp"
                                   "mail"
                                   "man"
                                   "ndb"
                                   "plumb"
                                   "tmac"
                                   "troff"
                                   "postscript"))
                       (install-file "rcmain" dest)
                       (mkdir-p (string-append #$output "/bin"))
                       (symlink (string-append dest "/bin/9")
                                (string-append #$output "/bin/9")))))
                 ;; Plan9 doesn't compress man pages
                 (delete 'compress-documentation))))
      (native-inputs (list perl which))
      (inputs (list bash-minimal                  ;for 'wrap-program'
                    fontconfig libx11 libxext libxt))

M gnu/packages/potassco.scm => gnu/packages/potassco.scm +1 -1
@@ 209,7 209,7 @@ satisfiability checking (SAT).")
                                "unpool-ast-v2" "parse_term"
                                "propagator" "propgator-sequence-mining"
                                "symbol" "visitor"))))))))))
    (inputs (list catch2-3.3 clasp libpotassco))
    (inputs (list catch2-3 clasp libpotassco))
    (native-inputs (list mpark-variant
                         pkg-config
                         tl-optional

M gnu/packages/python-compression.scm => gnu/packages/python-compression.scm +34 -0
@@ 7,6 7,7 @@
;;; Copyright © 2020 Nicolas Goaziou <mail@nicolasgoaziou.fr>
;;; Copyright © 2020, 2022, 2023 Marius Bakke <marius@gnu.org>
;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot>
;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 416,6 417,39 @@ the LZ4 frame format.")
    (description "Lz-string is a string compressor library for Python.")
    (license license:expat)))

(define-public python-python-snappy
  (package
    ;; PyPI contains both `snappy' and `python-snappy' as completely distinct
    ;; packages. To avoid a name collision in Guix, we use the variable name
    ;; `python-python-snappy' for the package called `python-snappy' on PyPI.
    (name "python-python-snappy")
    (version "0.6.1")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "python-snappy" version))
       (sha256
        (base32 "0amv12w0ybn6n1lk36x70a3l8bdjv4mn7iflb59wqsi00smhg8dn"))))
    (build-system python-build-system)
    (arguments
     '(#:phases (modify-phases %standard-phases
                  (replace 'check
                    (lambda* (#:key tests? #:allow-other-keys)
                      (when tests?
                        (invoke "pytest" "-vv" "-k"
                                ;; CFFI is only supported for PyPy builds.
                                (string-append "not test_snappy_cffi_enum "
                                               "and not test_snappy_all_cffi"))))))))
    (inputs (list snappy))
    (native-inputs (list python-pytest))
    (home-page "https://github.com/andrix/python-snappy")
    (synopsis "Python bindings for the Snappy compression library")
    (description
     "@code{python-python-snappy} provides bindings to the Snappy library and
can be used to compress and decompress files and streams.  It can also be used
directly from the command line.")
    (license license:bsd-3)))

(define-public bitshuffle
  (package
    (name "bitshuffle")

M gnu/packages/python-web.scm => gnu/packages/python-web.scm +59 -0
@@ 60,6 60,7 @@
;;; Copyright © 2022 Baptiste Strazzulla <bstrazzull@hotmail.fr>
;;; Copyright © 2023 John Kehayias <john.kehayias@protonmail.com>
;;; Copyright © 2023 Ivan Vilata-i-Balaguer <ivan@selidor.net>
;;; Copyright © 2024 Troy Figiel <troy@troyfigiel.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 201,6 202,38 @@ scripting Launchpad via its the web service API.")
reusable library for parsing, manipulating, and generating URIs.")
    (license license:lgpl3)))

(define-public python-portend
  (package
    (name "python-portend")
    (version "3.2.0")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "portend" version))
       (sha256
        (base32 "0wpvixicc3d0lack65554mvdrrckkn18p1xcgiv9v5cwq59a6l2j"))))
    (build-system pyproject-build-system)
    ;; Do not test pyproject.toml with python-pytest-checkdocs as it tries to
    ;; download dependencies.
    (arguments
     '(#:test-flags '("-k" "not project")))
    (propagated-inputs (list python-tempora))
    ;; TODO: Add python-pytest-ruff to native-inputs once it has been packaged.
    (native-inputs (list python-pytest
                         python-pytest-black
                         python-pytest-checkdocs
                         python-pytest-cov
                         python-pytest-enabler
                         python-pytest-mypy))
    (home-page "https://github.com/jaraco/portend")
    (synopsis "Monitor TCP ports for bound or unbound states")
    (description
     "@code{python-portend} can be used to monitor TCP ports for bound or
unbound states.  For example, waiting for a port to be occupied or freed
within a set timeout.  @code{python-portend} can also be used directly from
the command line.")
    (license license:expat)))

(define-public python-prawcore
  (package
    (name "python-prawcore")


@@ 2595,6 2628,32 @@ your Web app.")
object to help create WSGI responses.")
    (license license:expat)))

(define-public python-zc-lockfile
  (package
    (name "python-zc-lockfile")
    (version "3.0.post1")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "zc.lockfile" version))
       (sha256
        (base32 "1v41irj7azaag3f14xyviv3l8mvap74v5p3q274k68vakrnyxcmd"))))
    (build-system python-build-system)
    (arguments
     '(#:phases (modify-phases %standard-phases
                  (replace 'check
                    (lambda* (#:key tests? #:allow-other-keys)
                      (if tests?
                          (invoke "zope-testrunner" "--test-path=src")
                          (format #t "test suite not run~%")))))))
    (native-inputs (list python-zope-testing python-zope-testrunner))
    (home-page "https://github.com/zopefoundation/zc.lockfile")
    (synopsis "Interprocess locks using lock files")
    (description
     "This package provides an implementation of interprocess locks using lock
files.  These locks can also be used to mediate access to other files.")
    (license license:zpl2.1)))

(define-public python-zope-event
  (package
    (name "python-zope-event")

M gnu/packages/python-xyz.scm => gnu/packages/python-xyz.scm +296 -18
@@ 145,7 145,7 @@
;;; Copyright © c4droid <c4droid@foxmail.com>
;;; Copyright © 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2023 Attila Lendvai <attila@lendvai.name>
;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
;;; Copyright © 2023, 2024 Troy Figiel <troy@troyfigiel.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 2250,25 2250,21 @@ library.")
    (version "3.8.0")
    (source
     (origin
      (method url-fetch)
      (uri (pypi-uri "h5py" version))
      (sha256
       (base32
        "0pyr6z4h2xqbp49yx2i1401gl6yqh03h771zslwcy0201hpxiskg"))))
       (method url-fetch)
       (uri (pypi-uri "h5py" version))
       (sha256
        (base32 "0pyr6z4h2xqbp49yx2i1401gl6yqh03h771zslwcy0201hpxiskg"))))
    (build-system python-build-system)
    (arguments
     `(#:tests? #f ; no test target
       #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'fix-hdf5-paths
          (lambda* (#:key inputs #:allow-other-keys)
            (setenv "HDF5_DIR" (assoc-ref inputs "hdf5")))))))
    (propagated-inputs
     (list python-six python-numpy))
    (inputs
     (list hdf5-1.10))
    (native-inputs
     (list python-cython python-pkgconfig pkg-config))
     '(#:phases (modify-phases %standard-phases
                  (add-after 'unpack 'fix-hdf5-paths
                    (lambda* (#:key inputs #:allow-other-keys)
                      (setenv "HDF5_DIR"
                              (assoc-ref inputs "hdf5")))))))
    (propagated-inputs (list python-six python-numpy))
    (inputs (list hdf5-1.10))
    (native-inputs (list pkg-config python-cython python-ipython
                         python-pkgconfig python-pytest))
    (home-page "https://www.h5py.org/")
    (synopsis "Read and write HDF5 files from Python")
    (description


@@ 2279,6 2275,30 @@ access to HDF5 files, datasets and groups using established Python and NumPy
concepts.")
    (license license:bsd-3)))

(define-public python-hdf5storage
  (package
    (name "python-hdf5storage")
    (version "0.1.19")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "hdf5storage" version))
       (sha256
        (base32 "11pgxsqap9l7jsf52649q9mpj8a0w6p9im929lpr9s26ynnnn6ks"))))
    (build-system pyproject-build-system)
    (propagated-inputs (list python-h5py python-numpy))
    (native-inputs (list python-nose))
    (home-page "https://github.com/frejanordsiek/hdf5storage")
    (synopsis "Read and write Python data types from and to HDF5 files")
    (description
     "This Python package provides high-level utilities to read and write a
variety of Python types from and to @acronym{HDF5, Hierarchical Data Format}
formatted files.  This package also provides support for MATLAB MAT v7.3
formatted files, which are HDF5 files with a different extension and some
extra metadata.  Because HDF5 and MAT files might need to be read from
untrusted sources, pickling is avoided in this package.")
    (license license:bsd-2)))

(define-public python-hjson
  ;; Using commit from master branch as the PyPI version does not contain
  ;; the hjson/tests/ directory.


@@ 9236,6 9256,105 @@ converting, and viewing many of the proprietary file formats used to store
experimental data and metadata at the Laboratory for Fluorescence Dynamics.")
    (license license:bsd-3)))

(define-public python-av
  (package
    (name "python-av")
    (version "10.0.0")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "av" version))
       (sha256
        (base32 "01byqsjclkg65mhr6b4i2r2n4y7af9kdd2c35lxny27121b3vzca"))))
    (build-system pyproject-build-system)
    (arguments
     (list
      #:test-flags
      #~(list
         ;; Tests require outbound access to download data samples from
         ;; http://fate.ffmpeg.org/fate-suite:
         ;;
         ;; E urllib.error.URLError: <urlopen error [Errno -3]
         ;; Temporary failure in name resolution>
         ;;
         "--ignore=tests/test_doctests.py"
         "--ignore=tests/test_timeout.py"
         "-k"
         (string-append
          "not test_data"
          " and not test_container_probing"
          " and not test_stream_probing"
          " and not test_transcode"
          " and not test_codec_tag"
          " and not test_parse"
          " and not test_decode_audio_sample_count"
          " and not test_decoded_motion_vectors"
          " and not test_decoded_motion_vectors_no_flag"
          " and not test_decoded_time_base"
          " and not test_decoded_video_frame_count"
          " and not test_encoding_aac"
          " and not test_encoding_dnxhd"
          " and not test_encoding_dvvideo"
          " and not test_encoding_h264"
          " and not test_encoding_mjpeg"
          " and not test_encoding_mp2"
          " and not test_encoding_mpeg1video"
          " and not test_encoding_mpeg4"
          " and not test_encoding_pcm_s24le"
          " and not test_encoding_png"
          " and not test_encoding_tiff"
          " and not test_encoding_xvid"
          " and not test_reading_from_buffer"
          " and not test_reading_from_buffer_no_seek"
          " and not test_reading_from_file"
          " and not test_reading_from_pipe_readonly"
          " and not test_reading_from_write_readonly"
          " and not test_writing_to_custom_io_dash"
          " and not test_writing_to_custom_io_image2"
          " and not test_decode_half"
          " and not test_seek_end"
          " and not test_seek_float"
          " and not test_seek_int64"
          " and not test_seek_middle"
          " and not test_seek_start"
          " and not test_stream_seek"
          " and not test_selection"
          " and not test_stream_tuples"
          " and not test_movtext"
          " and not test_vobsub"
          " and not test_roundtrip"
          " and not test_stream_probing"))
      #:phases
      #~(modify-phases %standard-phases
          (add-before 'check 'build-extensions
            (lambda _
              (invoke "python" "setup.py" "build_ext" "--inplace"))))))
    (native-inputs
     (list pkg-config
           python-cython
           python-editorconfig
           python-numpy
           python-pillow
           python-pytest))
    (inputs
     ;; XXX: Build is failing with FFmpeg 6.0, unresolved upstream.
     ;; See https://github.com/PyAV-Org/PyAV/issues/1106
     (list ffmpeg-5))
    (home-page "https://github.com/PyAV-Org/PyAV")
    (synopsis "Pythonic bindings for FFmpeg's libraries")
    (description
     "PyAV is a Python library that allows for direct and precise manipulation
of media through containers, streams, packets, codecs, and frames.  It provides
access to the powerful FFmpeg libraries while managing the complex details as
much as possible.
PyAV also facilitates data transformation and integration with
other packages such as Numpy and Pillow.  However, working with media is a
challenging task and PyAV cannot abstract it away or make all the best decisions
for you.  If you can accomplish your tasks with the ffmpeg command, PyAV may not
be necessary.  Nonetheless, PyAV is an essential tool when working with media
that requires its specific capabilities.")
    (license license:bsd-3)))

(define-public python-ffmpeg-python
  ;; The latest release (0.2.0) is old and its test suite crashs on Python 3.10.
  (let ((commit "df129c7ba30aaa9ffffb81a48f53aa7253b0b4e6") (revision "0"))


@@ 10275,6 10394,67 @@ finding unresolved symbols in Python code and their corresponding imports.")
class constructs.")
    (license license:expat)))

(define-public python-jaraco-collections
  (package
    (name "python-jaraco-collections")
    (version "5.0.0")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "jaraco.collections" version))
       (sha256
        (base32 "0s7y3jr7c173k38pck1b17kxnvx2fl0qh9m9gdf64pr9kz8fi00n"))))
    (build-system pyproject-build-system)
    ;; Do not test pyproject.toml with python-pytest-checkdocs as it tries to
    ;; download dependencies.
    (arguments
     '(#:test-flags '("-k" "not project")))
    (propagated-inputs (list python-jaraco-text))
    ;; TODO: Add python-pytest-ruff to native-inputs once it has been
    ;; packaged.
    (native-inputs (list python-pytest
                         python-pytest-black
                         python-pytest-checkdocs
                         python-pytest-cov
                         python-pytest-enabler
                         python-pytest-mypy))
    (home-page "https://github.com/jaraco/jaraco.collections")
    (synopsis "Provides various collection objects")
    (description
     "This package provides models and classes to supplement the
standard library @code{collections} module.  Examples include
@itemize
@item
RangeMap: A mapping that accepts a range of values for keys.
@item
Projection: A subset over an existing mapping.
@item
KeyTransformingDict: Generalized mapping with keys transformed by a function.
@item
FoldedCaseKeyedDict: A dict whose string keys are case-insensitive.
@item
BijectiveMap: A map where keys map to values and values back to their keys.
@item
ItemsAsAttributes: A mapping mix-in exposing items as attributes.
@item
IdentityOverrideMap: A map whose keys map by default to themselves unless overridden.
@item
FrozenDict: A hashable, immutable map.
@item
Enumeration: An object whose keys are enumerated.
@item
Everything: A container that contains all things.
@item
Least, Greatest: Objects that are always less than or greater than any other.
@item
pop_all: Return all items from the mutable sequence and remove them from that sequence.
@item
DictStack: A stack of dicts, great for sharing scopes.
@item
WeightedLookup: A specialized RangeMap for selecting an item by weights.
@end itemize")
    (license license:expat)))

;;; Variant used to break a cycle with python-pytest-enabler.
(define-public python-jaraco-context-bootstrap
  (hidden-package


@@ 10439,6 10619,41 @@ releases.")
    (description "This package provides testing support by jaraco.")
    (license license:expat)))

(define-public python-jaraco-text
  (package
    (name "python-jaraco-text")
    (version "3.12.0")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "jaraco.text" version))
       (sha256
        (base32 "0b2rmx0sa61f75lkkr4nfaj3mkgmn3x9c1akpwarfbmksk42b7iq"))))
    (build-system pyproject-build-system)
    ;; Do not test pyproject.toml with python-pytest-checkdocs as it tries to
    ;; download dependencies.
    (arguments
     '(#:test-flags '("-k" "not project")))
    (propagated-inputs (list python-autocommand python-inflect
                             python-jaraco-context python-jaraco-functools
                             python-more-itertools))
    ;; TODO: Add python-pytest-ruff to native-inputs once it has been
    ;; packaged.
    (native-inputs (list python-pytest
                         python-pytest-black
                         python-pytest-checkdocs
                         python-pytest-cov
                         python-pytest-enabler
                         python-pytest-mypy))
    (home-page "https://github.com/jaraco/jaraco.text")
    (synopsis "Provides various routines for text manipulation")
    (description
     "This package provides handy routines for dealing with text,
such as wrapping, substitution, trimming, stripping, prefix and suffix
removal, line continuation, indentation, comment processing, identifier
processing, values parsing, case insensitive comparison, and more.")
    (license license:expat)))

(define-public python-simplegeneric
  (package
    (name "python-simplegeneric")


@@ 30176,6 30391,45 @@ heterogeneous and multi-platform clusters (including clusters running other
applications with variable CPU loads).")
    (license license:bsd-3)))

(define-public python-djitellopy
  (package
    (name "python-djitellopy")
    (version "2.5.0")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "djitellopy" version))
       (sha256
        (base32 "1kc0syb4hpn7fay0rxpazmczag6jw3pncrrc6v762jj0afiwkrps"))))
    (build-system pyproject-build-system)
    (arguments
     (list
      #:tests? #f                       ;no test suite
      #:phases
      #~(modify-phases %standard-phases
          ;; OpenCV does not ship metadata files for its Python library, which
          ;; makes it invisible to the sanity_check script (see:
          ;; https://github.com/opencv/opencv/issues/24810).
          (delete 'sanity-check))))
    (propagated-inputs
     (list opencv                       ;for opencv-python
           python-av
           python-numpy
           python-pillow))
    (home-page "https://github.com/damiafuentes/DJITelloPy")
    (synopsis
     "DJI Tello drone video streaming, swarms and state packets library")
    (description
     "DJI Tello drone Python interface using the official Tello SDK and Tello
EDU SDK.  This library has the following features:
@itemize
@item Implementation of all tello commands
@item Retrieve a video stream easily
@item Receive and parse state packets
@item Control a swarm of drones.
@end itemize")
    (license license:expat)))

(define-public python-djvulibre
  (package
    (name "python-djvulibre")


@@ 31490,6 31744,30 @@ graph can be output for rendering by GraphViz or yEd.")
function implementations based on the types of the arguments.")
    (license license:bsd-3)))

(define-public python-multimethod
  (package
    (name "python-multimethod")
    (version "1.10")
    (source
     (origin
       ;; No tests in the PyPI tarball.
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/coady/multimethod")
             (commit (string-append "v" version))))
       (file-name (git-file-name name version))
       (sha256
        (base32 "07xv92q7f4bkp6dzkqvcv0zxr11729qdak4s3ldmbhdwgsf44g5h"))))
    (build-system pyproject-build-system)
    (native-inputs (list python-pytest))
    (home-page "https://github.com/coady/multimethod")
    (synopsis "Python support for multiple argument dispatching")
    (description
     "This package provides a decorator for adding multiple argument
dispatching to functions.  The decorator creates a multimethod object as
needed and registers the function with its annotations.")
    (license license:asl2.0)))

(define-public python-logical-unification
  (package
    (name "python-logical-unification")

M gnu/packages/serialization.scm => gnu/packages/serialization.scm +57 -14
@@ 15,6 15,7 @@
;;; Copyright © 2023 Alexey Abramov <levenson@mmer.org>
;;; Copyright © 2023 Sharlatan Hellseher <sharlatanus@gmail.com>
;;; Copyright © 2023 Vinicius Monego <monego@posteo.net>
;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 219,8 220,60 @@ such as compact binary encodings, XML, or JSON.")
     (list doxygen gcc-10
           (package-source cereal)))))

(define-public msgpack-c
  (package
    (name "msgpack-c")
    (version "6.0.0")
    (source
     (origin
       (method url-fetch)
       (uri
        (string-append
         "https://github.com/msgpack/msgpack-c/releases/download/"
         "c-" version "/" name "-" version ".tar.gz"))
       (sha256
        (base32 "1fmf08babfsjq5qkgw034wk2nw6mayxp1qlkm7h55p2jqvigam1n"))
       (snippet
        '(let ((p (open-file "msgpack-c.pc.in" "a")))
           (display "Requires: zlib\n" p)
           (close-output-port p)))))
    (build-system cmake-build-system)
    (arguments (list #:configure-flags #~(list "-DMSGPACK_BUILD_TESTS=ON")))
    (native-inputs (list googletest))
    (propagated-inputs (list zlib))  ;zbuffer.h includes zlib.h
    (home-page "https://www.msgpack.org")
    (synopsis "Binary serialization library")
    (description "Msgpack is a library for C that implements binary
serialization.")
    (license license:boost1.0)))

(define-public msgpack-cxx
  (package
    (inherit msgpack-c)
    (name "msgpack-cxx")
    (version "6.1.0")
    (source
     (origin
       (method url-fetch)
       (uri
        (string-append
         "https://github.com/msgpack/msgpack-c/releases/download/"
         "cpp-" version "/" name "-" version ".tar.gz"))
       (sha256
        (base32 "1rrrf3nskcv994z3pbq6a5z2021piz118rccmm1y7zlf7klygv93"))))
    (build-system cmake-build-system)
    (propagated-inputs (list boost zlib)) ;included in headers
    (description "Msgpack is a library for C++ that implements binary
serialization.")))

;;; The msgpack package was split into msgpack-c and msgpack-cxx starting from
;;; version 4.0.0.
(define-public msgpack
  (deprecated-package "msgpack" msgpack-c))

(define-public msgpack-3
  (package
    (inherit msgpack-c)
    (name "msgpack")
    (version "3.3.0")
    (source


@@ 234,23 287,13 @@ such as compact binary encodings, XML, or JSON.")
        '(let ((p (open-file "msgpack.pc.in" "a")))
           (display
            (string-append "Requires: " "zlib" "\n") p)
           (close-output-port p)
           #t))
           (close-output-port p)))
       (sha256
        (base32 "0yzhq50ijvwrfkr97knhvn54lj3f4hr3zy39yq8wpf6xll94s4bf"))))
    (build-system cmake-build-system)
    (native-inputs
     (list googletest-1.8 pkg-config))
    (propagated-inputs
     (list zlib)) ;; Msgpack installs two headers (zbuffer.h,
    ;; zbuffer.hpp) which #include <zlib.h>.  However, 'guix gc --references'
    ;; does not detect a store reference to zlib since these headers are not
    ;; compiled.
    (home-page "https://www.msgpack.org")
    (synopsis "Binary serialization library")
    (native-inputs (list googletest-1.8))
    (description "Msgpack is a library for C/C++ that implements binary
serialization.")
    (license license:boost1.0)))
serialization.  This is the legacy version that predates the split into C and
C++ specific packages.")))

(define-public libmpack
  (package

M gnu/packages/shellutils.scm => gnu/packages/shellutils.scm +2 -2
@@ 331,7 331,7 @@ particularly in catching syntax errors.")
(define-public grml-zsh-config
  (package
    (name "grml-zsh-config")
    (version "0.19.5")
    (version "0.19.6")
    (source (origin
              (method url-fetch)
              (uri (string-append


@@ 339,7 339,7 @@ particularly in catching syntax errors.")
                    version ".tar.gz"))
              (sha256
               (base32
                "0ifw490z3v9ljccbmm04adz39fj2dmx8mjgayxqj0a9ln90yfdc4"))))
                "1k1m2fbmvw73qy9mc6k2ygjg6zz8h7nn3d9pvj6jbjadnx4pz770"))))
    (build-system copy-build-system)
    (arguments
     (list

M gnu/packages/statistics.scm => gnu/packages/statistics.scm +128 -49
@@ 18,6 18,7 @@
;;; Copyright © 2021 Frank Pursel <frank.pursel@gmail.com>
;;; Copyright © 2022 Simon Tournier <zimon.toutoune@gmail.com>
;;; Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 6757,11 6758,9 @@ Java package that provides routines for various statistical distributions.")
    (license license:gpl2+)))

(define-public emacs-ess
  ;; Latest release is old.  This is not the latest commit either due to bug
  ;; reported here: <https://github.com/emacs-ess/ESS/issues/987>.
  (let ((commit "24da603184ce39246611dd5b8602e769d7ebd5bf")
  (let ((commit "3691ecc642eab5d016887e42699648e0eeeef566")
        (version "18.10.2")
        (revision "0"))
        (revision "1"))
    (package
      (name "emacs-ess")
      (version (git-version version revision commit))


@@ 6772,60 6771,96 @@ Java package that provides routines for various statistical distributions.")
               (url "https://github.com/emacs-ess/ESS")
               (commit commit)))
         (sha256
          (base32 "0j98lv07nzwzd54d4dgcfz01wy5gj48m0mnirxzh5r45ik2myh1r"))
          (base32 "19p8djsbgvahpsx1w8i6h3qvpbdr4isjwm3wi82yk2648ri0qsq1"))
         (file-name (git-file-name name version))
         (modules '((guix build utils)))
         (snippet
          '(begin
             ;; Stop ESS from trying to bundle an external julia-mode.el.
             (substitute* "lisp/Makefile"
               ((" \\$\\(JULIAS)") "")
               (("\ttest.*julia-mode.*\\.el") ""))
             ;; Only build docs in info format.
             (substitute* "doc/Makefile"
               (("all  : info text")
                "all  : info")
               (("install: install-info install-other-docs")
                "install: install-info"))
             ;; Stop install-info from trying to update the info directory.
             (substitute* "doc/Makefile"
               ((".*/dir.*") ""))
             ;; Fix r-help-mode test.
             (substitute* "test/ess-test-r.el"
               (("\\(equal ess-help-object \"plot.default\")") "t"))
             ;; Avoid generating ess-autoloads.el twice.
             (substitute* "Makefile"
               (("all: lisp doc etc autoloads")
                "all: lisp doc etc"))
             ;; Install to correct directories.
             (substitute* "Makefile"
               (("mkdir -p \\$\\(ESSDESTDIR)")
                "$(MAKE) -C lisp install; $(MAKE) -C doc install")
               (("\\$\\(INSTALL) -R \\./\\* \\$\\(ESSDESTDIR)/")
                "$(MAKE) -C etc install"))
             #t))
         (patches
          (search-patches "emacs-ess-fix-obsolete-function-alias.patch"))))
          #~(begin
              ;; Stop ESS from trying to bundle an external julia-mode.el.
              (substitute* "lisp/Makefile"
                ((" \\$\\(JULIAS)") "")
                (("\ttest.*julia-mode.*\\.el") ""))
              ;; Only build docs in info format.
              (substitute* "doc/Makefile"
                (("all  : info text")
                 "all  : info")
                (("install: install-info install-other-docs")
                 "install: install-info"))
              ;; Stop install-info from trying to update the info directory.
              (substitute* "doc/Makefile"
                ((".*/dir.*") ""))
              ;; Fix r-help-mode test.
              (substitute* "test/ess-test-r.el"
                (("\\(equal ess-help-object \"plot.default\")") "t"))
              ;; Avoid generating ess-autoloads.el twice.
              (substitute* "Makefile"
                (("all: lisp doc etc autoloads")
                 "all: lisp doc etc"))
              ;; Install to correct directories.
              (substitute* "Makefile"
                (("mkdir -p \\$\\(ESSDESTDIR)")
                 "$(MAKE) -C lisp install; $(MAKE) -C doc install")
                (("\\$\\(INSTALL) -R \\./\\* \\$\\(ESSDESTDIR)/")
                 "$(MAKE) -C etc install"))))))
      (build-system gnu-build-system)
      (arguments
       (let ((base-directory "/share/emacs/site-lisp"))
         `(#:make-flags (list (string-append "PREFIX=" %output)
                              (string-append "ETCDIR=" %output
                                             ,base-directory "/etc")
                              (string-append "LISPDIR=" %output
                                             ,base-directory)
                              (string-append "INFODIR=" %output
                                             "/share/info"))
           #:phases
           (modify-phases %standard-phases
             (delete 'configure)
             (replace 'check
               (lambda _ (invoke "make" "test")))))))
         (list
          #:modules '((guix build gnu-build-system)
                      (guix build utils)
                      (guix build emacs-utils))
          #:imported-modules `(,@%gnu-build-system-modules
                               (guix build emacs-build-system)
                               (guix build emacs-utils))
          #:make-flags
          #~(list (string-append "PREFIX=" #$output)
                  (string-append "ETCDIR=" #$output #$base-directory "/etc")
                  (string-append "LISPDIR=" #$output #$base-directory)
                  (string-append "INFODIR=" #$output "/share/info"))
          #:phases
          #~(modify-phases %standard-phases
              (delete 'configure)
              (add-before 'check 'skip-failing-tests
                ;; XXX: Skip 10 failing tests (out of 187).
                (lambda _
                  (let-syntax
                      ((disable-tests
                        (syntax-rules ()
                          ((_ file ())
                           (syntax-error "test names list must not be empty"))
                          ((_ file (test-name ...))
                           (substitute* file
                             (((string-append "^\\(ert-deftest " test-name ".*")
                               all)
                              (string-append all "(skip-unless nil)\n"))
                             ...)))))
                    (disable-tests (list "test/ess-test-inf.el"
                                         "test/ess-test-r.el")
                                   ("ess--derive-connection-path"
                                    "ess-eval-line-test"
                                    "ess-eval-region-test"
                                    "ess-mock-remote-process"
                                    "ess-r-load-ESSR-github-fetch-no"
                                    "ess-r-load-ESSR-github-fetch-yes"
                                    "ess-set-working-directory-test"
                                    "ess-test-r-startup-directory")))
                  ;; The two tests below use a different syntax.
                  (emacs-batch-edit-file "test/ess-test-r-eval.el"
                    '(progn
                      (mapc (lambda (test)
                              (goto-char (point-min))
                              (search-forward (format "etest-deftest %s " test))
                              (beginning-of-line)
                              (kill-sexp))
                            '("ess-r-eval-ns-env-roxy-tracebug-test"
                              "ess-r-eval-sink-freeze-test"))
                      (basic-save-buffer)))))
              (replace 'check
                (lambda _ (invoke "make" "test")))))))
      (native-inputs
       (list perl r-roxygen2 texinfo))
      (inputs
       `(("emacs" ,emacs-minimal)
         ("r-minimal" ,r-minimal)))
       (list emacs-minimal r-minimal))
      (propagated-inputs
       (list emacs-julia-mode))
      (home-page "https://ess.r-project.org/")


@@ 6885,6 6920,50 @@ files, including Rmarkdown files.")
popular stats packages like SAS, Stata and SPSS.")
    (license license:expat)))

(define-public python-pyreadstat
  (package
    (name "python-pyreadstat")
    (version "1.2.4")
    ;; No tests in the PyPI tarball.
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/Roche/pyreadstat")
             (commit (string-append "v" version))))
       (file-name (git-file-name name version))
       (sha256
        (base32 "0zysrzixvqw2lwwykxqg5yj8a0zyv5s2bmk22x30f4rj2hgvq1pv"))
       (patches (search-patches "python-pyreadstat-link-libiconv.patch"))))
    (arguments
     '(#:phases (modify-phases %standard-phases
                  (add-before 'check 'change-home-dir
                    (lambda _
                      ;; test_sav_expand and test_sav_write_basic_expanduser need a
                      ;; home directory with write permissions.
                      (setenv "HOME" "/tmp")))
                  (replace 'check
                    (lambda* (#:key tests? #:allow-other-keys)
                      (when tests?
                        ;; The source also contains tests/test_version.py
                        ;; which checks the version in __init__.py against the
                        ;; one in setup.py. Since this requires texlive
                        ;; dependencies to run and is also not mentioned in
                        ;; how_to_test.md, this test is skipped.
                        (invoke "python" "tests/test_basic.py")))))))
    (build-system python-build-system)
    (propagated-inputs (list python-pandas))
    (inputs (list libiconv zlib))
    (native-inputs (list python-cython-3))
    (home-page "https://github.com/Roche/pyreadstat")
    (synopsis
     "Read and write SAS, SPSS and Stata files into/from Pandas DataFrames")
    (description
     "This Python package can be used to read and write SAS, SPSS and Stata
files into/from Pandas DataFrames.  It is a wrapper around the C library
@code{readstat}.")
    (license license:asl2.0)))

(define-public r-quantpsyc
  (package
    (name "r-quantpsyc")

M gnu/packages/swig.scm => gnu/packages/swig.scm +2 -2
@@ 79,7 79,7 @@ you tailor the wrapping process to suit your application.")
  (package
    (inherit swig)
    (name "swig")
    (version "4.1.1")
    (version "4.2.0")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://sourceforge/" name "/" name "/"


@@ 87,5 87,5 @@ you tailor the wrapping process to suit your application.")
                                 name "-" version ".tar.gz"))
              (sha256
               (base32
                "16xc767gf5ip40jh698wbdrxrghli5v2c966bkdmrmpwv378mw1a"))))
                "15wwh9215rdkflpr85r7zxr2nmrib03jr4bvh5i0f9lyb3bs4716"))))
    (inputs (list pcre2))))

M gnu/packages/tbb.scm => gnu/packages/tbb.scm +24 -22
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015, 2016, 2022 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2015, 2016, 2022, 2024 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2016 Nikita <nikita@n0.is>
;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>


@@ 51,31 51,31 @@
     `(#:configure-flags
       '(,@(if (or (target-riscv64?)
                   (target-ppc32?))
            '("-DTBB_TEST_LINK_FLAGS=-latomic")
            `())
               '("-DTBB_TEST_LINK_FLAGS=-latomic")
               `())
         ,@(if (or (target-arm32?)
                   (target-ppc32?))
             '("-DTBB_TEST_COMPILE_FLAGS=-DTBB_TEST_LOW_WORKLOAD")
             `())
         "-DTBB_STRICT=OFF")   ;; Don't fail on warnings
               '("-DTBB_TEST_COMPILE_FLAGS=-DTBB_TEST_LOW_WORKLOAD")
               `())
         "-DTBB_STRICT=OFF") ;; Don't fail on warnings
       #:phases
       (modify-phases %standard-phases
         ,@(cond
             ((target-arm32?)
              `((add-after 'unpack 'adjust-test-suite
                  (lambda _
                    (substitute* "test/CMakeLists.txt"
                      ;; Bus error, skipped on mips.
                      ((".*test_malloc_pools.*") ""))))))
             ((target-ppc32?)
              `((add-after 'unpack 'adjust-test-suite
                  (lambda _
                      (substitute* "test/CMakeLists.txt"
                        ;; These tests hang forever.
                        ((".*test_function_node.*") "")
                        ((".*test_multifunction_node.*") "")
                        ((".*test_async_node.*") ""))))))
             (else '())))))
            ((target-arm32?)
             `((add-after 'unpack 'adjust-test-suite
                 (lambda _
                   (substitute* "test/CMakeLists.txt"
                     ;; Bus error, skipped on mips.
                     ((".*test_malloc_pools.*") ""))))))
            ((target-ppc32?)
             `((add-after 'unpack 'adjust-test-suite
                 (lambda _
                   (substitute* "test/CMakeLists.txt"
                     ;; These tests hang forever.
                     ((".*test_function_node.*") "")
                     ((".*test_multifunction_node.*") "")
                     ((".*test_async_node.*") ""))))))
            (else '())))))
    (home-page "https://www.threadingbuildingblocks.org")
    (synopsis "C++ library for parallel programming")
    (description


@@ 101,7 101,9 @@ tasks, synchronization primitives, atomic operations, and more.")
            (lambda _
              (substitute* "python/CMakeLists.txt"
                (("\\$\\{PYTHON_BUILD_WORK_DIR\\}/build")
                 #$output))
                 #$output)
                (("install --prefix.*-f" m)
                 (string-append m " --root=/")))
              (substitute* "python/setup.py"
                (("extra_link_args=tbb_flag,")
                 (string-append "extra_link_args=['-Wl,-rpath="

M gnu/packages/telephony.scm => gnu/packages/telephony.scm +70 -1
@@ 17,7 17,7 @@
;;; Copyright © 2020 Brett Gilio <brettg@gnu.org>
;;; Copyright © 2020, 2022 Michael Rohleder <mike@rohleder.de>
;;; Copyright © 2020 Raghav Gururajan <raghavgururajan@disroot.org>
;;; Copyright © 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020, 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
;;; Copyright © 2021 LibreMiami <packaging-guix@libremiami.org>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>


@@ 855,6 855,75 @@ your calls and messages.")
Initiation Protocol (SIP) and a multimedia framework.")
    (license license:gpl2+)))

(define-public pjproject-jami
  (let ((commit "d044ad6c5b4221648c555da16196804e4721299c")
        (revision "0"))
    (package
      (inherit pjproject)
      (name "pjproject-jami")
      ;; The version is taken from
      ;; <https://raw.githubusercontent.com/savoirfairelinux/pjproject/master/version.mak>.
      (version (git-version "2.13.1" revision commit))
      (source (origin
                (inherit (package-source pjproject))
                ;; The Jami development team regularly issues patches to
                ;; pjproject to extend the its functionality and fix bugs;
                ;; they are submitted for inclusion upstream but larger
                ;; patches take time to be reviewed and merged, hence this
                ;; forked repository.
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/savoirfairelinux/pjproject")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "0z4d7wdpa2mlaygb283k0j8n3l6q68gn0xqd62b5ngqvkhlaf775"))))
      (arguments
       (substitute-keyword-arguments (package-arguments pjproject)
         ((#:configure-flags _ ''())
          ;; This package is tailored for DhtNet; see how it is built for its
          ;; CI in
          ;; <https://git.jami.net/savoirfairelinux/dhtnet/-/raw/master/Dockerfile>.
          #~(list
             ;; Some flags preserved flags from parent package.
             "--with-external-srtp"
             #$@(if (string-contains (or (%current-system)
                                         (%current-target-system)) "linux")
                    #~("--enable-epoll")
                    #~())
             "--with-gnutls"            ;disable OpenSSL checks
             ;; -DNDEBUG is set to prevent pjproject from raising
             ;; assertions that aren't critical, crashing
             ;; applications as the result.
             "CFLAGS=-DNDEBUG"
             ;; Specify a runpath reference to itself, which is missing and
             ;; causes the validate-runpath phase to fail.
             (string-append "LDFLAGS=-Wl,-rpath=" #$output "/lib")
             "--enable-shared"
             "--disable-libyuv"         ;TODO: add missing package

             ;; These flags are specific to DhtNet.
             "--disable-sound"
             "--enable-video"
             "--enable-ext-sound"
             "--disable-speex-aec"
             "--disable-g711-codec"
             "--disable-l16-codec"
             "--disable-gsm-codec"
             "--disable-g722-codec"
             "--disable-g7221-codec"
             "--disable-speex-codec"
             "--disable-ilbc-codec"
             "--disable-opencore-amr"
             "--disable-silk"
             "--disable-sdl"
             "--disable-ffmpeg"
             "--disable-v4l2"
             "--disable-openh264"
             "--disable-resample"
             "--disable-libwebrtc")))))))

(define-public libtgvoip
  (package
    (name "libtgvoip")

M gnu/packages/terminals.scm => gnu/packages/terminals.scm +2 -4
@@ 1289,10 1289,8 @@ that can be displayed terminal.")
        (base32
         "0x5c31yq7ansmiy20a0qf59wagba9v3pq97mlkxrqxn4n1gcc6vi"))))
    (build-system gnu-build-system)
    (inputs
     (list libevent libssh msgpack ncurses))
    (native-inputs
     (list autoconf automake pkg-config))
    (inputs (list libevent libssh msgpack-3 ncurses))
    (native-inputs (list autoconf automake pkg-config))
    (home-page "https://tmate.io/")
    (synopsis "Terminal sharing application")
    (description "tmate is a terminal sharing application that allows you to

M gnu/packages/textutils.scm => gnu/packages/textutils.scm +2 -2
@@ 996,13 996,13 @@ and Cython.")
(define-public txt2tags
  (package
    (name "txt2tags")
    (version "3.7")
    (version "3.9")
    (source (origin
              (method url-fetch)
              (uri (pypi-uri "txt2tags" version))
              (sha256
               (base32
                "12hpnvdy7dgarq6ini9jp7dp2zcmvpax04zbl3jb84kd423r75i7"))))
                "0ik7gpr3gymgxnj0p86k8768kyxncbncv93zq67sbak3dbdl8hky"))))
    (build-system python-build-system)
    (native-inputs (list python-tox))
    (home-page "https://txt2tags.org")

M gnu/packages/tls.scm => gnu/packages/tls.scm +9 -20
@@ 5,7 5,7 @@
;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2015 David Thompson <davet@gnu.org>
;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020, 2021 Leo Famulari <leo@famulari.name>
;;; Copyright © 2016, 2017, 2019, 2021-2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016, 2017, 2019, 2021-2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016, 2017, 2018 Nikita <nikita@n0.is>
;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>


@@ 15,7 15,7 @@
;;; Copyright © 2018 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2020, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2020, 2021, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020, 2021, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021 Solene Rapenne <solene@perso.pw>
;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re>
;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>


@@ 200,7 200,7 @@ living in the same process.")
  (package
    (name "gnutls")
    (version "3.7.7")
    (replacement gnutls-3.8.1)
    (replacement gnutls-3.8.2)
    (source (origin
              (method url-fetch)
              ;; Note: Releases are no longer on ftp.gnu.org since the


@@ 305,11 305,11 @@ required structures.")
(define-deprecated/public-alias gnutls-latest gnutls)

;; Replacement for gnutls@3.7.7 to address GNUTLS-SA-2020-07-14 /
;; CVE-2023-0361
(define-public gnutls-3.8.1
;; CVE-2023-0361 and GNUTLS-SA-2023-10-23 / CVE-2023-5981.
(define gnutls-3.8.2
  (package
    (inherit gnutls)
    (version "3.8.1")
    (version "3.8.2")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnupg/gnutls/v"


@@ 318,20 318,7 @@ required structures.")
              (patches (search-patches "gnutls-skip-trust-store-test.patch"))
              (sha256
               (base32
                "1742jiigwsfhx7nj5rz7dwqr8d46npsph6b68j7siar0mqarx2xs"))))
    (arguments
     (if (target-hurd?)
         ;; Fix reference to undefined 'PATH_MAX'.  This is fixed in GnuTLS
         ;; commit 3b6ec1e01de4e96d36276dfe34ee9e183f285264.
         (substitute-keyword-arguments (package-arguments gnutls)
           ((#:phases phases #~%standard-phases)
            #~(modify-phases #$phases
                (add-after 'unpack 'set-path-max
                  (lambda _
                    (substitute* "lib/pathbuf.h"
                      (("^#define GNUTLS_PATH_MAX PATH_MAX")
                       "#define GNUTLS_PATH_MAX 8192\n")))))))
         (package-arguments gnutls)))))
                "0xzgmp1ck5ifvdki4jg29r278w2p1m3a0qz38g99v6zsdw0yarg7"))))))

(define-public gnutls/dane
  ;; GnuTLS with build libgnutls-dane, implementing DNS-based


@@ 429,6 416,8 @@ OpenSSL for TARGET."
             (cond
              ((target-x86-32? target)
               "x86")
              ((target-x32? target)
               "x32")
              ((target-x86-64? target)
               "x86_64")
              ((target-mips64el? target)

M gnu/packages/valgrind.scm => gnu/packages/valgrind.scm +2 -2
@@ 39,7 39,7 @@
(define-public valgrind
  (package
    (name "valgrind")
    (version "3.20.0")
    (version "3.22.0")
    (source (origin
              (method url-fetch)
              (uri (list (string-append "https://sourceware.org/pub/valgrind"


@@ 48,7 48,7 @@
                                        "/valgrind-" version ".tar.bz2")))
              (sha256
               (base32
                "1ipkp6yi202pml2r0qwflysmq86dkqd8iyi1y51d6y70vcqw0dl5"))))
                "0k1ddnzxfpbng2sp5r31jjxsmp35g977rx6a8jcp4prcvmddn4f8"))))
    (build-system gnu-build-system)
    (outputs '("doc"                              ;16 MB
               "out"))

M gnu/packages/version-control.scm => gnu/packages/version-control.scm +158 -109
@@ 33,7 33,7 @@
;;; Copyright © 2020 Tanguy Le Carrour <tanguy@bioneland.org>
;;; Copyright © 2020, 2021, 2022 Michael Rohleder <mike@rohleder.de>
;;; Copyright © 2021 Greg Hogan <code@greghogan.com>
;;; Copyright © 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
;;; Copyright © 2021 Léo Le Bouter <lle-bout@zaclys.net>
;;; Copyright © 2021 LibreMiami <packaging-guix@libremiami.org>


@@ 823,6 823,52 @@ on @command{git}, and use any regular Git hosting service.")
to GitHub contributions calendar.")
    (license license:expat)))

(define-public xdiff
  (let ((revision "0")
        (commit "a137bc7ee6c76618ed1737c257548eaa10ac0089"))
    (package
      (name "xdiff")
      ;; The base version is taken from the CMakeLists.txt file.
      (version (git-version "0.1" revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/libgit2/xdiff")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "1rxzpag2pih64qlgq40xg1z6mz0bzvps4baxw7bmykyhjhc2gx75"))))
      (build-system cmake-build-system)
      (arguments
       (list
        #:modules '((guix build cmake-build-system)
                    (guix build utils)
                    (srfi srfi-26))
        #:tests? #f                     ;no test suite
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'create-shared-library
              (lambda _
                (substitute* "CMakeLists.txt"
                  (("add_library\\(xdiff STATIC")
                   "add_library(xdiff SHARED"))))
            (replace 'install           ;no install target
              (lambda _
                (with-directory-excursion "../source"
                  (for-each (cute install-file <>
                                  (string-append #$output "/include"))
                            (list "xdiff.h"
                                  "git-xdiff.h"))) ;included by xdiff.h
                (install-file "libxdiff.so"
                              (string-append #$output "/lib")))))))
      (home-page "https://github.com/libgit2/xdiff")
      (synopsis "File differential library used by git")
      (description "@code{xdiff} is the file differential library used by git,
which has been extracted into a standalone library for compatibility with
other git-like projects such as @code{libgit2}.")
      (license license:lgpl2.1+))))

(define-public libgit2
  (package
    (name "libgit2")


@@ 1072,115 1118,118 @@ collaboration using typical untrusted file hosts or services.")
   (license license:gpl3+)))

(define-public cgit
  (package
    (name "cgit")
    ;; Update the ‘git-source’ input as well.
    (version "1.2.3")
    (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://git.zx2c4.com/cgit/snapshot/cgit-"
                    version ".tar.xz"))
              (sha256
               (base32
                "193d990ym10qlslk0p8mjwp2j6rhqa7fq0y1iff65lvbyv914pss"))))
    (build-system gnu-build-system)
    (arguments
     (list
      #:tests? #f ; XXX: fail to build the in-source git.
      #:test-target "test"
      #:make-flags #~(list (string-append "CC=" #$(cc-for-target))
                           "SHELL_PATH=sh")
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'unpack-git
            (lambda* (#:key inputs #:allow-other-keys)
              ;; Unpack the source of git into the 'git' directory.
              (invoke "tar" "--strip-components=1" "-C" "git" "-xf"
                      (assoc-ref inputs "git-source"))))
          (add-after 'unpack 'patch-absolute-file-names
            (lambda* (#:key inputs #:allow-other-keys)
              (define (quoted-file-name input path)
                (string-append "\"" input path "\""))
              (substitute* "ui-snapshot.c"
                (("\"gzip\"")
                 (quoted-file-name (assoc-ref inputs "gzip") "/bin/gzip"))
                (("\"bzip2\"")
                 (quoted-file-name (assoc-ref inputs "bzip2") "/bin/bzip2"))
                (("\"xz\"")
                 (quoted-file-name (assoc-ref inputs "xz") "/bin/xz")))

              (substitute* "filters/about-formatting.sh"
                (("$\\(dirname $0\\)") (string-append (assoc-ref outputs "out")
                                                      "/lib/cgit/filters"))
                (("\\| tr") (string-append "| " (which "tr"))))

              (substitute* "filters/html-converters/txt2html"
                (("sed") (which "sed")))

              (substitute* "filters/html-converters/man2html"
                (("groff") (which "groff")))

              (substitute* "filters/html-converters/rst2html"
                (("rst2html\\.py") (which "rst2html.py")))))
          (delete 'configure) ; no configure script
          (add-after 'build 'build-man
            (lambda* (#:key make-flags #:allow-other-keys)
              (apply invoke "make" "doc-man" make-flags)))
          (replace 'install
            (lambda* (#:key make-flags outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
                (apply invoke
                       "make" "install" "install-man"
                       (string-append "prefix=" out)
                       (string-append "CGIT_SCRIPT_PATH=" out "/share/cgit")
                       make-flags)
                ;; Move the platform-dependent 'cgit.cgi' into lib to get it
                ;; stripped.
                (rename-file (string-append out "/share/cgit/cgit.cgi")
                             (string-append out "/lib/cgit/cgit.cgi")))))
          (add-after 'install 'wrap-python-scripts
            (lambda* (#:key outputs #:allow-other-keys)
              (for-each
               (lambda (file)
                 (wrap-program (string-append (assoc-ref outputs "out")
                                              "/lib/cgit/filters/" file)
                   `("GUIX_PYTHONPATH" ":" prefix (,(getenv "GUIX_PYTHONPATH")))))
               '("syntax-highlighting.py"
                 "html-converters/md2html")))))))
    (native-inputs
     ;; For building manpage.
     (list asciidoc))
    (inputs
     `(;; Building cgit requires a Git source tree.
       ("git-source"
        ,(origin
           (method url-fetch)
           ;; cgit is tightly bound to git.  Use GIT_VER from the Makefile,
           ;; which may not match the current (package-version git).
           (uri "mirror://kernel.org/software/scm/git/git-2.25.4.tar.xz")
           (sha256
            (base32 "11am6s46wmn1yll5614smjhzlghbqq6gysgcs64igjr9y5wzpdxq"))))
       ("bash-minimal" ,bash-minimal)
       ("openssl" ,openssl)
       ("python" ,python)
       ("python-docutils" ,python-docutils)
       ("python-markdown" ,python-markdown)
       ("python-pygments" ,python-pygments)
       ("zlib" ,zlib)
       ;; bzip2, groff, gzip and xz are inputs (not native inputs)
       ;; since they are actually substituted into cgit source and
       ;; referenced by the built package output.
       ("bzip2" ,bzip2)
       ("groff" ,groff)
       ("gzip" ,gzip)
       ("xz" ,xz)))
    (home-page "https://git.zx2c4.com/cgit/")
    (synopsis "Web frontend for git repositories")
    (description
     "CGit is an attempt to create a fast web interface for the Git SCM, using
  (let ((commit "793c420897e18eb3474c751d54cf4e0983f85433")
        (rev "1"))
    (package
      (name "cgit")
      ;; Update the ‘git-source’ input as well.
      (version (git-version "1.2.3" rev commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://git.zx2c4.com/cgit")
                      (commit commit)))
                (sha256
                 (base32
                  "1mhrm14wpqvralf9j33ih5ai6naiq3g2jg2z91gnw9dhh8f9ilwz"))
                (file-name (git-file-name name version))))
      (build-system gnu-build-system)
      (arguments
       (list
        #:tests? #f                    ; XXX: fail to build the in-source git.
        #:test-target "test"
        #:make-flags #~(list (string-append "CC=" #$(cc-for-target))
                             "SHELL_PATH=sh")
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'unpack-git
              (lambda* (#:key inputs #:allow-other-keys)
                ;; Unpack the source of git into the 'git' directory.
                (invoke "tar" "--strip-components=1" "-C" "git" "-xf"
                        (assoc-ref inputs "git-source"))))
            (add-after 'unpack 'patch-absolute-file-names
              (lambda* (#:key inputs #:allow-other-keys)
                (define (quoted-file-name input path)
                  (string-append "\"" input path "\""))
                (substitute* "ui-snapshot.c"
                  (("\"gzip\"")
                   (quoted-file-name (assoc-ref inputs "gzip") "/bin/gzip"))
                  (("\"bzip2\"")
                   (quoted-file-name (assoc-ref inputs "bzip2") "/bin/bzip2"))
                  (("\"xz\"")
                   (quoted-file-name (assoc-ref inputs "xz") "/bin/xz")))

                (substitute* "filters/about-formatting.sh"
                  (("$\\(dirname $0\\)") (string-append (assoc-ref outputs "out")
                                                        "/lib/cgit/filters"))
                  (("\\| tr") (string-append "| " (which "tr"))))

                (substitute* "filters/html-converters/txt2html"
                  (("sed") (which "sed")))

                (substitute* "filters/html-converters/man2html"
                  (("groff") (which "groff")))

                (substitute* "filters/html-converters/rst2html"
                  (("rst2html\\.py") (which "rst2html.py")))))
            (delete 'configure)         ; no configure script
            (add-after 'build 'build-man
              (lambda* (#:key make-flags #:allow-other-keys)
                (apply invoke "make" "doc-man" make-flags)))
            (replace 'install
              (lambda* (#:key make-flags outputs #:allow-other-keys)
                (let ((out (assoc-ref outputs "out")))
                  (apply invoke
                         "make" "install" "install-man"
                         (string-append "prefix=" out)
                         (string-append "CGIT_SCRIPT_PATH=" out "/share/cgit")
                         make-flags)
                  ;; Move the platform-dependent 'cgit.cgi' into lib to get it
                  ;; stripped.
                  (rename-file (string-append out "/share/cgit/cgit.cgi")
                               (string-append out "/lib/cgit/cgit.cgi")))))
            (add-after 'install 'wrap-python-scripts
              (lambda* (#:key outputs #:allow-other-keys)
                (for-each
                 (lambda (file)
                   (wrap-program (string-append (assoc-ref outputs "out")
                                                "/lib/cgit/filters/" file)
                     `("GUIX_PYTHONPATH" ":" prefix (,(getenv "GUIX_PYTHONPATH")))))
                 '("syntax-highlighting.py"
                   "html-converters/md2html")))))))
      (native-inputs
       ;; For building manpage.
       (list asciidoc))
      (inputs
       `( ;; Building cgit requires a Git source tree.
         ("git-source"
          ,(origin
             (method url-fetch)
             ;; cgit is tightly bound to git.  Use GIT_VER from the Makefile,
             ;; which may not match the current (package-version git).
             (uri "mirror://kernel.org/software/scm/git/git-2.43.0.tar.xz")
             (sha256
              (base32 "1v3nkfm3gw8wr7595qy86qla8xyjvi85fmly4lfph4frfcz60ijl"))))
         ("bash-minimal" ,bash-minimal)
         ("openssl" ,openssl)
         ("python" ,python)
         ("python-docutils" ,python-docutils)
         ("python-markdown" ,python-markdown)
         ("python-pygments" ,python-pygments)
         ("zlib" ,zlib)
         ;; bzip2, groff, gzip and xz are inputs (not native inputs)
         ;; since they are actually substituted into cgit source and
         ;; referenced by the built package output.
         ("bzip2" ,bzip2)
         ("groff" ,groff)
         ("gzip" ,gzip)
         ("xz" ,xz)))
      (home-page "https://git.zx2c4.com/cgit/")
      (synopsis "Web frontend for git repositories")
      (description
       "CGit is an attempt to create a fast web interface for the Git SCM, using
a built-in cache to decrease server I/O pressure.")
    (license license:gpl2)))
      (license license:gpl2))))

(define-public cgit-pink
  (package

M gnu/packages/video.scm => gnu/packages/video.scm +344 -84
@@ 50,7 50,7 @@
;;; Copyright © 2021 Alexey Abramov <levenson@mmer.org>
;;; Copyright © 2021, 2022, 2023 Andrew Tropin <andrew@trop.in>
;;; Copyright © 2021 David Wilson <david@daviwil.com>
;;; Copyright © 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2021 Raghav Gururajan <rg@raghavgururajan.name>
;;; Copyright © 2021 Thiago Jung Bauermann <bauermann@kolabnow.com>


@@ 1047,14 1047,14 @@ H.264 (MPEG-4 AVC) video streams.")
(define-public mkvtoolnix
  (package
    (name "mkvtoolnix")
    (version "52.0.0")
    (version "80.0")
    (source
     (origin
       (method url-fetch)
       (uri (string-append "https://mkvtoolnix.download/sources/"
                           "mkvtoolnix-" version ".tar.xz"))
       (sha256
        (base32 "15y7ahlifsclnkl70wn5w34dil8nwcwcjnw3k2ydqc6dz4vb0j5s"))
        (base32 "1x9k9pmw7mzm2amvm251a45dlj9p9iqfank5p4w2fizxkapws25v"))
       (modules '((guix build utils)))
       (snippet '(begin
                   ;; Delete bundled libraries.


@@ 1070,6 1070,7 @@ H.264 (MPEG-4 AVC) video streams.")
    (outputs '("out" "gui")) ; "mkvtoolnix-gui" brings the closure size from ~300 MB to 1.5+ GB.
    (inputs
     (list boost
           gmp
           bzip2
           cmark
           libebml


@@ 1083,86 1084,96 @@ H.264 (MPEG-4 AVC) video streams.")
           lzo
           pcre2
           pugixml
           qtbase-5
           qtmultimedia-5
           qtbase
           qtmultimedia
           qtsvg
           utfcpp
           zlib))
    (native-inputs
     `(("docbook-xsl" ,docbook-xsl)
       ("gettext" ,gettext-minimal)
       ("googletest" ,googletest)
       ("libxslt" ,libxslt)
       ("nlohmann-json" ,nlohmann-json)
       ("perl" ,perl)
       ("pkg-config" ,pkg-config)
       ("po4a" ,po4a)
       ("qttools-5" ,qttools-5)
       ("ruby" ,ruby-2.7)))
     (list docbook-xsl
           gettext-minimal
           googletest
           libxslt
           nlohmann-json
           perl
           pkg-config
           po4a
           qttools
           ruby-3.2))
    (arguments
     `(#:configure-flags
       (list (string-append "--with-boost="
                            (assoc-ref %build-inputs "boost"))
             (string-append "--with-docbook-xsl-root="
                            (assoc-ref %build-inputs "docbook-xsl")
                            "/xml/xsl/docbook-xsl-"
                            ,(package-version docbook-xsl))
             "--enable-update-check=no"
             "--enable-precompiled-headers=no")
        #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'fix-utfcpp-include
           (lambda _
             (substitute* "src/common/strings/utf8.cpp"
               (("<utf8.h>")
                "<utf8cpp/utf8.h>"))))
         (add-after 'unpack 'patch-relative-file-names
           (lambda* (#:key outputs #:allow-other-keys)
             (let ((out (assoc-ref outputs "out")))
             (substitute* "src/mkvtoolnix-gui/util/settings.cpp"
               (("mkvmerge" match)
                (string-append out "/bin/" match)))
             #t)))
         (add-before 'configure 'add-googletest
           (lambda* (#:key inputs #:allow-other-keys)
             (symlink (search-input-directory inputs "/include/gtest")
                      "lib/gtest")))
         (replace 'build
           (lambda _
             (let ((-j (list "-j" (number->string (parallel-job-count)))))
               (apply invoke "rake" -j))))
         (replace 'check
           (lambda _
             (invoke "rake" "tests/unit")))
         (replace 'install
           (lambda _
             (invoke "rake" "install")))
         (add-after 'install 'post-install
           (lambda* (#:key outputs #:allow-other-keys)
             ;; Move the Qt interface to "gui".
             (let* ((out (assoc-ref outputs "out"))
                    (gui (assoc-ref outputs "gui"))
                    (strip-store-dir (lambda (path)
                                       (substring path (string-prefix-length out path)))))
               (for-each
                (lambda (file)
                  (mkdir-p (string-append gui (dirname file)))
                  (rename-file (string-append out file)
                               (string-append gui file)))
                (append '("/bin/mkvtoolnix-gui"
                          "/share/applications/org.bunkus.mkvtoolnix-gui.desktop"
                          "/share/metainfo/org.bunkus.mkvtoolnix-gui.appdata.xml"
                          "/share/mime/packages/org.bunkus.mkvtoolnix-gui.xml")
                        (map strip-store-dir (find-files out "\\.ogg$"))
                        (map strip-store-dir (find-files out "mkvtoolnix-gui\\.png$"))
                        (map strip-store-dir (find-files out "mkvtoolnix-gui\\.1"))))
               (for-each
                (lambda (file)
                  (delete-file-recursively (string-append out file)))
                '("/share/applications"
                  "/share/metainfo"
                  "/share/mime"
                  "/share/mkvtoolnix")))
             #t)))))
     (list
      #:configure-flags
      #~(list (string-append "--with-boost="
                             #$(this-package-input "boost"))
              (string-append "--with-docbook-xsl-root="
                             #$(this-package-native-input "docbook-xsl")
                             "/xml/xsl/docbook-xsl-"
                             #$(package-version
                                (this-package-native-input "docbook-xsl")))
              "--enable-update-check=no"
              "--enable-precompiled-headers=no")
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'fix-utfcpp-include
            (lambda _
              (substitute* "src/common/strings/utf8.cpp"
                (("<utf8.h>")
                 "<utf8cpp/utf8.h>"))))
          (add-after 'unpack 'patch-relative-file-names
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
                (substitute* "src/mkvtoolnix-gui/util/settings.cpp"
                  (("mkvmerge" match)
                   (string-append out "/bin/" match))) #t)))
          (add-before 'configure 'add-googletest
            (lambda* (#:key inputs #:allow-other-keys)
              (symlink (search-input-directory inputs
                                               "/include/gtest")
                       "lib/gtest")))
          (replace 'build
            (lambda _
              (let ((-j (list "-j"
                              (number->string (parallel-job-count)))))
                (apply invoke "rake" -j))))
          (replace 'check
            (lambda _
              (invoke "rake" "tests/unit")))
          (replace 'install
            (lambda _
              (invoke "rake" "install")))
          (add-after 'install 'post-install
            (lambda* (#:key outputs #:allow-other-keys)
              ;; Move the Qt interface to "gui".
              (let* ((out (assoc-ref outputs "out"))
                     (gui (assoc-ref outputs "gui"))
                     (strip-store-dir (lambda (path)
                                        (substring path
                                                   (string-prefix-length
                                                    out path)))))
                (for-each (lambda (file)
                            (mkdir-p (string-append gui
                                                    (dirname
                                                     file)))
                            (rename-file (string-append out file)
                                         (string-append gui file)))
                          (append '("/bin/mkvtoolnix-gui"
                                    "/share/applications/org.bunkus.mkvtoolnix-gui.desktop"
                                    "/share/metainfo/org.bunkus.mkvtoolnix-gui.appdata.xml"
                                    "/share/mime/packages/org.bunkus.mkvtoolnix-gui.xml")
                                  (map strip-store-dir
                                       (find-files out "\\.ogg$"))
                                  (map strip-store-dir
                                       (find-files out
                                                   "mkvtoolnix-gui\\.png$"))
                                  (map strip-store-dir
                                       (find-files out
                                                   "mkvtoolnix-gui\\.1"))))
                (for-each (lambda (file)
                            (delete-file-recursively
                             (string-append out file)))
                          '("/share/applications"
                            "/share/metainfo" "/share/mime"
                            "/share/mkvtoolnix"))))))))
    (home-page "https://mkvtoolnix.download")
    (synopsis "Tools to create, alter and inspect Matroska files")
    (description


@@ 1505,14 1516,14 @@ SMPTE 314M.")
(define-public libmatroska
  (package
    (name "libmatroska")
    (version "1.6.3")
    (version "1.7.1")
    (source
     (origin
       (method url-fetch)
       (uri (string-append "https://dl.matroska.org/downloads/"
                           "libmatroska/libmatroska-" version ".tar.xz"))
       (sha256
        (base32 "06h81sxyz2riic0gpzik6ffcnq32wrqphi8c6k55glcdymiimyfs"))))
        (base32 "1cqq61qgv6x3xjzjrw71dya7lbsbrsmi9raqm2k4hgfrp0rk0ajp"))))
    (build-system cmake-build-system)
    (inputs
     (list libebml))


@@ 1657,14 1668,14 @@ operate properly.")
(define-public ffmpeg
  (package
    (name "ffmpeg")
    (version "6.0")
    (version "6.1.1")
    (source (origin
              (method url-fetch)
              (uri (string-append "https://ffmpeg.org/releases/ffmpeg-"
                                  version ".tar.xz"))
              (sha256
               (base32
                "10kh2f4y4isfqj4xpcqqnzk611jh89ywcjyjnq9c2jcv5p18ggjp"))))
                "0s7r2qv8gh2a3w568n9xxgcz0q8j5ww1jdsci1hm9f4l1yqg9146"))))
    (outputs '("out" "debug"))
    (build-system gnu-build-system)
    (inputs


@@ 1989,6 2000,252 @@ audio/video codec library.")
                 "--enable-static"))))
     (inputs '()))))

;;; Custom ffmpeg package used by Jami, which incorporates custom patches.
(define-public ffmpeg-jami
  (package
    (inherit ffmpeg)
    (name "ffmpeg-jami")
    (source (let ((ffmpeg-origin (package-source ffmpeg)))
              (origin
                (inherit ffmpeg-origin)
                ;; These patches originate come from
                ;; <https://review.jami.net/plugins/gitiles/jami-daemon/+/refs/heads/master/contrib/src/ffmpeg/>.
                ;; Make sure to keep them update and/or register any new ones
                ;; here.
                (patches
                 (append
                  (origin-patches ffmpeg-origin)
                  (search-patches
                   "ffmpeg-jami-remove-mjpeg-log.patch"
                   "ffmpeg-jami-change-RTCP-ratio.patch"
                   "ffmpeg-jami-rtp_ext_abs_send_time.patch"
                   "ffmpeg-jami-libopusdec-enable-FEC.patch"
                   "ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch"
                   "ffmpeg-jami-screen-sharing-x11-fix.patch"))))))
    (arguments
     (substitute-keyword-arguments (package-arguments ffmpeg)
       ((#:configure-flags _ '())
        #~(list "--disable-static"
                "--enable-shared"
                "--disable-stripping"
                ;; The following variables are configure flags used by
                ;; ffmpeg-jami.  They're from the
                ;; jami/daemon/contrib/src/ffmpeg/rules.mak file.  We try to
                ;; keep it as close to the official Jami package as possible,
                ;; to provide all the codecs and extra features that are
                ;; expected (see:
                ;; https://review.jami.net/plugins/gitiles/jami-daemon/+/
                ;; refs/heads/master/contrib/src/ffmpeg/rules.mak).
                ;; An exception are the ffnvcodec-related switches, which is
                ;; not packaged in Guix and would not work with Mesa.
                #$@(if (string-contains (%current-system) "linux")
                       '("--enable-pic"
                         "--extra-cxxflags=-fPIC"
                         "--extra-cflags=-fPIC"
                         "--target-os=linux"
                         "--enable-indev=v4l2"
                         "--enable-indev=xcbgrab"
                         "--enable-vdpau"
                         "--enable-hwaccel=h264_vdpau"
                         "--enable-hwaccel=mpeg4_vdpau"
                         "--enable-vaapi"
                         "--enable-hwaccel=h264_vaapi"
                         "--enable-hwaccel=mpeg4_vaapi"
                         "--enable-hwaccel=h263_vaapi"
                         "--enable-hwaccel=vp8_vaapi"
                         "--enable-hwaccel=mjpeg_vaapi"
                         "--enable-hwaccel=hevc_vaapi"
                         "--enable-encoder=h264_vaapi"
                         "--enable-encoder=vp8_vaapi"
                         "--enable-encoder=mjpeg_vaapi"
                         "--enable-encoder=hevc_vaapi")
                       '())
                "--disable-everything"
                "--enable-zlib"
                "--enable-gpl"
                "--enable-swscale"
                "--enable-bsfs"
                "--disable-filters"
                "--disable-programs"
                "--disable-postproc"
                "--disable-protocols"
                "--enable-protocol=crypto"
                "--enable-protocol=file"
                "--enable-protocol=rtp"
                "--enable-protocol=srtp"
                "--enable-protocol=tcp"
                "--enable-protocol=udp"
                "--enable-protocol=unix"
                "--enable-protocol=pipe"

                ;; Enable muxers/demuxers.
                "--disable-demuxers"
                "--disable-muxers"
                "--enable-muxer=rtp"
                "--enable-muxer=g722"
                "--enable-muxer=g726"
                "--enable-muxer=g726le"
                "--enable-muxer=h263"
                "--enable-muxer=h264"
                "--enable-muxer=hevc"
                "--enable-muxer=matroska"
                "--enable-muxer=wav"
                "--enable-muxer=webm"
                "--enable-muxer=ogg"
                "--enable-muxer=pcm_s16be"
                "--enable-muxer=pcm_s16le"
                "--enable-demuxer=rtp"
                "--enable-demuxer=mjpeg"
                "--enable-demuxer=mjpeg_2000"
                "--enable-demuxer=mpegvideo"
                "--enable-demuxer=gif"
                "--enable-demuxer=image_jpeg_pipe"
                "--enable-demuxer=image_png_pipe"
                "--enable-demuxer=image_webp_pipe"
                "--enable-demuxer=matroska"
                "--enable-demuxer=m4v"
                "--enable-demuxer=mp3"
                "--enable-demuxer=ogg"
                "--enable-demuxer=flac"
                "--enable-demuxer=wav"
                "--enable-demuxer=ac3"
                "--enable-demuxer=g722"
                "--enable-demuxer=g723_1"
                "--enable-demuxer=g726"
                "--enable-demuxer=g726le"
                "--enable-demuxer=pcm_mulaw"
                "--enable-demuxer=pcm_alaw"
                "--enable-demuxer=pcm_s16be"
                "--enable-demuxer=pcm_s16le"
                "--enable-demuxer=h263"
                "--enable-demuxer=h264"
                "--enable-demuxer=hevc"

                ;; Enable parsers.
                "--enable-parser=h263"
                "--enable-parser=h264"
                "--enable-parser=hevc"
                "--enable-parser=mpeg4video"
                "--enable-parser=vp8"
                "--enable-parser=vp9"
                "--enable-parser=opus"

                ;; Encoders/decoders.
                "--enable-encoder=adpcm_g722"
                "--enable-decoder=adpcm_g722"
                "--enable-encoder=adpcm_g726"
                "--enable-decoder=adpcm_g726"
                "--enable-encoder=adpcm_g726le"
                "--enable-decoder=adpcm_g726le"
                "--enable-decoder=g729"
                "--enable-encoder=g723_1"
                "--enable-decoder=g723_1"
                "--enable-encoder=rawvideo"
                "--enable-decoder=rawvideo"
                "--enable-encoder=libx264"
                "--enable-decoder=h264"
                "--enable-encoder=pcm_alaw"
                "--enable-decoder=pcm_alaw"
                "--enable-encoder=pcm_mulaw"
                "--enable-decoder=pcm_mulaw"
                "--enable-encoder=mpeg4"
                "--enable-decoder=mpeg4"
                "--enable-encoder=libvpx_vp8"
                "--enable-decoder=vp8"
                "--enable-decoder=vp9"
                "--enable-encoder=h263"
                "--enable-encoder=h263p"
                "--enable-decoder=h263"
                "--enable-encoder=mjpeg"
                "--enable-decoder=mjpeg"
                "--enable-decoder=mjpegb"
                "--enable-libspeex"
                "--enable-libopus"
                "--enable-libvpx"
                "--enable-libx264"
                "--enable-encoder=libspeex"
                "--enable-decoder=libspeex"
                "--enable-encoder=libopus"
                "--enable-decoder=libopus"

                ;; Encoders/decoders for ringtones and audio streaming.
                "--enable-decoder=flac"
                "--enable-decoder=vorbis"
                "--enable-decoder=aac"
                "--enable-decoder=ac3"
                "--enable-decoder=eac3"
                "--enable-decoder=mp3"
                "--enable-decoder=pcm_u24le"
                "--enable-decoder=pcm_u32le"
                "--enable-decoder=pcm_u8"
                "--enable-decoder=pcm_f16le"
                "--enable-decoder=pcm_f32le"
                "--enable-decoder=pcm_f64le"
                "--enable-decoder=pcm_s16le"
                "--enable-decoder=pcm_s24le"
                "--enable-decoder=pcm_s32le"
                "--enable-decoder=pcm_s64le"
                "--enable-decoder=pcm_u16le"
                "--enable-encoder=pcm_u8"
                "--enable-encoder=pcm_f32le"
                "--enable-encoder=pcm_f64le"
                "--enable-encoder=pcm_s16le"
                "--enable-encoder=pcm_s32le"
                "--enable-encoder=pcm_s64le"

                "--enable-decoder=pcm_s16be"
                "--enable-decoder=pcm_s16be_planar"
                "--enable-decoder=pcm_s16le_planar"
                "--enable-decoder=pcm_s24be"
                "--enable-decoder=pcm_s24le_planar"
                "--enable-decoder=pcm_s32be"
                "--enable-decoder=pcm_s32le_planar"
                "--enable-decoder=pcm_s64be"
                "--enable-decoder=pcm_s8"
                "--enable-decoder=pcm_s8_planar"
                "--enable-decoder=pcm_u16be"

                ;; Encoders/decoders for images.
                "--enable-encoder=gif"
                "--enable-decoder=gif"
                "--enable-encoder=jpegls"
                "--enable-decoder=jpegls"
                "--enable-encoder=ljpeg"
                "--enable-decoder=jpeg2000"
                "--enable-encoder=png"
                "--enable-decoder=png"
                "--enable-encoder=bmp"
                "--enable-decoder=bmp"
                "--enable-encoder=tiff"
                "--enable-decoder=tiff"

                ;; Filters.
                "--enable-filter=scale"
                "--enable-filter=overlay"
                "--enable-filter=amix"
                "--enable-filter=amerge"
                "--enable-filter=aresample"
                "--enable-filter=format"
                "--enable-filter=aformat"
                "--enable-filter=fps"
                "--enable-filter=transpose"
                "--enable-filter=pad"

                "--enable-filter=afir"
                "--enable-filter=split"
                "--enable-filter=drawbox"
                "--enable-filter=drawtext"
                "--enable-filter=rotate"
                "--enable-filter=loop"
                "--enable-filter=setpts"
                "--enable-filter=movie"
                "--enable-filter=alphamerge"
                "--enable-filter=boxblur"
                "--enable-filter=lut"
                "--enable-filter=negate"
                "--enable-filter=colorkey"
                "--enable-filter=transpose"))))))

(define-public ffmpegthumbnailer
  (package
    (name "ffmpegthumbnailer")


@@ 3631,7 3888,10 @@ be used for realtime video capture via Linux-specific APIs.")
             (lambda* _
               (let ((plugin-path (getenv "QT_PLUGIN_PATH")))
                 (wrap-program (string-append #$output "/bin/obs")
                   `("QT_PLUGIN_PATH" ":" prefix (,plugin-path)))))))))
                   `("QT_PLUGIN_PATH" ":" prefix (,plugin-path))
                   `("LD_LIBRARY_PATH" ":" prefix
                     (,(string-append #$(this-package-input "vlc")
                                      "/lib"))))))))))
    (native-search-paths
     (list (search-path-specification
            (variable "OBS_PLUGINS_DIRECTORY")

M gnu/packages/vim.scm => gnu/packages/vim.scm +10 -4
@@ 884,6 884,14 @@ refactor Vim in order to:
     '(#:tests? #false ;no tests
       #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'help-cmake-find-msgpack-c
           (lambda _
             ;; Patch the build system so that it can find the modern
             ;; 'msgpack-c' named pkg-config file (see:
             ;; https://github.com/jeanguyomarch/eovim/issues/73).
             (substitute* "cmake/Modules/FindMsgPack.cmake"
               (("MSGPACK QUIET msgpack")
                "MSGPACK QUIET msgpack-c msgpack"))))
         (add-after 'configure 'reference-nvim
           (lambda* (#:key inputs #:allow-other-keys)
             (let ((nvim (search-input-file inputs "/bin/nvim")))


@@ 894,10 902,8 @@ refactor Vim in order to:
                  (string-append start nvim))))))
         (add-before 'build 'set-home
           (lambda _ (setenv "HOME" "/tmp"))))))
    (native-inputs
     (list pkg-config))
    (inputs
     (list efl msgpack neovim))
    (native-inputs (list pkg-config))
    (inputs (list efl msgpack-c neovim))
    (home-page "https://github.com/jeanguyomarch/eovim/")
    (synopsis "EFL GUI for Neovim")
    (description "Graphical Neovim interface based on the @acronym{EFL, Enlightenment

M gnu/packages/web-browsers.scm => gnu/packages/web-browsers.scm +2 -2
@@ 587,7 587,7 @@ driven and does not detract you from your daily work.")
(define-public nyxt
  (package
    (name "nyxt")
    (version "3.10.0")
    (version "3.11.0")
    (source
     (origin
       (method git-fetch)


@@ 596,7 596,7 @@ driven and does not detract you from your daily work.")
             (commit version)))
       (sha256
        (base32
         "1rz2082kk3fdvszqmi3fgndrq205vbxl3i0x4qyli0jy3lpvjin8"))
         "0hzkpk8kshw7afz3pryi99xz2vg3v676day0mgji3hvaazfan39p"))
       (file-name (git-file-name name version))))
    (build-system gnu-build-system)
    (arguments

M gnu/packages/web.scm => gnu/packages/web.scm +23 -1
@@ 46,7 46,7 @@
;;; Copyright © 2020, 2022 Michael Rohleder <mike@rohleder.de>
;;; Copyright © 2020, 2021 Ryan Prior <rprior@protonmail.com>
;;; Copyright © 2020 Alexandru-Sergiu Marton <brown121407@posteo.ro>
;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021 Stefan Reichör <stefan@xsteve.at>
;;; Copyright © 2021 la snesne <lasnesne@lagunposprasihopre.org>
;;; Copyright © 2021 Matthew James Kraai <kraai@ftbfs.org>


@@ 6621,6 6621,28 @@ Depending on your architecture, it only requires about 40 bytes of data per
message stream (in a web server that is per connection).")
      (license license:expat))))

(define-public llhttp
  (package
    (name "llhttp")
    (version "9.1.3")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/nodejs/llhttp")
                    (commit (string-append "release/v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "1nkv64c5fs8x6n5f9f6g28w5hvg776p55cwa0f82ni548nx279s1"))))
    (build-system cmake-build-system)
    (arguments (list #:tests? #f))      ;FIXME: tests depend on node-mocha
    (home-page "https://github.com/nodejs/llhttp")
    (synopsis "Port of http_parser to llparse")
    (description "@code{llparse} is a port of @code{http_parser} to
@code{llparse} which aims making it more maintainable, verifiable and
efficient where possible.")
    (license license:expat)))

(define-public python-httpretty
  (package
    (name "python-httpretty")

M gnu/packages/wm.scm => gnu/packages/wm.scm +2 -2
@@ 787,7 787,7 @@ desktop environment.")
(define-public icewm
  (package
    (name "icewm")
    (version "3.4.4")
    (version "3.4.5")
    (source (origin
              (method url-fetch)
              (uri (string-append


@@ 795,7 795,7 @@ desktop environment.")
                    version "/icewm-" version ".tar.lz"))
              (sha256
               (base32
                "0cdsb2d45dwcr2dm4jfh0z5g6pkb0ghd4jaybxqiz74mbw5rmjhv"))))
                "1wd5k0whh2b43a72223cy19pwc29fhrhd2dnc61fha2y5ndgw6ld"))))
    (build-system gnu-build-system)
    (native-inputs (list pkg-config))
    (inputs (list fontconfig

M gnu/packages/xfce.scm => gnu/packages/xfce.scm +4 -4
@@ 216,7 216,7 @@ to share commonly used Xfce widgets among the Xfce applications.")
(define-public catfish
  (package
    (name "catfish")
    (version "4.16.4")
    (version "4.18.0")
    (source (origin
              (method url-fetch)
              (uri (string-append "https://archive.xfce.org/src/apps/"


@@ 224,7 224,7 @@ to share commonly used Xfce widgets among the Xfce applications.")
                                  "/catfish-" version ".tar.bz2"))
              (sha256
               (base32
                "1z5m9f4cj473n68rrhhbkq3x5df5k394qp4n27lqqyny6k2h2p3f"))))
                "16cbsnki7qragwhbfs3h0ja7xg8xlf59ajxhddqm0jkmrirrpbpx"))))
    (build-system python-build-system)
    (arguments
     '(#:phases


@@ 270,7 270,7 @@ it to your needs by using several command line options.")
(define-public elementary-xfce-icon-theme
  (package
    (name "elementary-xfce-icon-theme")
    (version "0.17")
    (version "0.18")
    (source (origin
              (method git-fetch)
              (uri


@@ 280,7 280,7 @@ it to your needs by using several command line options.")
              (file-name (git-file-name name version))
              (sha256
               (base32
                "0jlawp6rg55w5cm4d7836r660i2pnc5gkzpdjsq7w5875i85arzm"))))
                "124bdgghkjkpcsfn9a2ad6zqy233pi9jqmv8w8a3ha6q3al2s11s"))))
    (build-system gnu-build-system)
    (arguments
     '(#:tests? #f                      ; no check target

M gnu/packages/xorg.scm => gnu/packages/xorg.scm +6 -4
@@ 245,14 245,14 @@ which can be read by any architecture.")
(define-public xorgproto
  (package
    (name "xorgproto")
    (version "2022.2")
    (version "2023.2")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://xorg/individual/proto"
                                  "/xorgproto-" version ".tar.xz"))
              (sha256
               (base32
                "17kbq1x68jl9mz69ays5c0w72lpkqi937raxk0im7y88pvrdn4sx"))))
                "0b4c27aq25w1fccks49p020avf9jzh75kaq5qwnww51bp1yvq7xn"))))
    (build-system gnu-build-system)
    (propagated-inputs
     ;; To get util-macros in (almost?) all package inputs.


@@ 5250,7 5250,7 @@ EGLStream families of extensions.")
(define-public xorg-server-xwayland
  (package
    (name "xorg-server-xwayland")
    (version "21.1.3")
    (version "23.2.3")
    (source
     (origin
       (method url-fetch)


@@ 5258,7 5258,7 @@ EGLStream families of extensions.")
                           "/xserver/xwayland-" version ".tar.xz"))
       (sha256
        (base32
         "18pqvg76grbsyxa3mm3j06i1l8cwb28nbn2gcnqpsk7x75zpbhpb"))))
         "00p30yyikh7h9xsqgir66xb06pspgjlibv1mi0n42irc4fkrm7gb"))))
    (inputs (list font-dejavu
                  dbus
                  egl-wayland


@@ 5268,6 5268,7 @@ EGLStream families of extensions.")
                  libepoxy
                  libgcrypt
                  libtirpc
                  libxcvt
                  libxfont2
                  libxkbfile
                  pixman


@@ 5283,6 5284,7 @@ EGLStream families of extensions.")
                                 wayland
                                 wayland-protocols)
                           '())))
    (properties '((upstream-name . "xwayland")))
    (build-system meson-build-system)
    (arguments
     `(#:configure-flags

M gnu/services/base.scm => gnu/services/base.scm +2 -2
@@ 1798,9 1798,9 @@ archive' public keys, with GUIX."
  (chroot-directories guix-configuration-chroot-directories ;list of file-like/strings
                      (default '()))
  (max-silent-time  guix-configuration-max-silent-time ;integer
                    (default 0))
                    (default 3600))
  (timeout          guix-configuration-timeout    ;integer
                    (default 0))
                    (default (* 3600 24)))
  (log-compression  guix-configuration-log-compression
                    (default 'gzip))
  (discover?        guix-configuration-discover?

M gnu/services/messaging.scm => gnu/services/messaging.scm +19 -34
@@ 1,7 1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017, 2018 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2015, 2017-2020, 2022, 2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015, 2017-2020, 2022-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2018 Pierre-Antoine Rouby <contact@parouby.fr>
;;;
;;; This file is part of GNU Guix.


@@ 857,39 857,24 @@ string, you could instantiate a prosody service like this:
              ;; on 'networking'.
              (requirement '(user-processes networking))

              (start #~(if (defined? 'make-inetd-constructor)

                           (make-inetd-constructor
                            (list #$bitlbee* "-I" "-c" #$conf)
                            (list (endpoint
                                   (addrinfo:addr
                                    (car (getaddrinfo #$interface
                                                      #$(number->string port)
                                                      (logior AI_NUMERICHOST
                                                              AI_NUMERICSERV))))))
                            #:requirements '#$requirement
                            #:service-name-stem "bitlbee"
                            #:user "bitlbee" #:group "bitlbee"

                            ;; Allow 'bitlbee-purple' to use libpurple plugins.
                            #:environment-variables
                            (list (string-append "PURPLE_PLUGIN_PATH="
                                                 #$plugins "/lib/purple-2")
                                  "GUIX_LOCPATH=/run/current-system/locale"))

                           (make-forkexec-constructor
                            (list #$(file-append bitlbee "/sbin/bitlbee")
                                  "-n" "-F" "-u" "bitlbee" "-c" #$conf)

                            ;; Allow 'bitlbee-purple' to use libpurple plugins.
                            #:environment-variables
                            (list (string-append "PURPLE_PLUGIN_PATH="
                                                 #$plugins "/lib/purple-2"))

                            #:pid-file "/var/run/bitlbee.pid")))
              (stop  #~(if (defined? 'make-inetd-destructor)
                           (make-inetd-destructor)
                           (make-kill-destructor)))))))))
              (start #~(make-inetd-constructor
                        (list #$bitlbee* "-I" "-c" #$conf)
                        (list (endpoint
                               (addrinfo:addr
                                (car (getaddrinfo #$interface
                                                  #$(number->string port)
                                                  (logior AI_NUMERICHOST
                                                          AI_NUMERICSERV))))))
                        #:requirements '#$requirement
                        #:service-name-stem "bitlbee"
                        #:user "bitlbee" #:group "bitlbee"

                        ;; Allow 'bitlbee-purple' to use libpurple plugins.
                        #:environment-variables
                        (list (string-append "PURPLE_PLUGIN_PATH="
                                             #$plugins "/lib/purple-2")
                              "GUIX_LOCPATH=/run/current-system/locale")))
              (stop  #~(make-inetd-destructor))))))))

(define %bitlbee-accounts
  ;; User group and account to run BitlBee.

M gnu/services/shepherd.scm => gnu/services/shepherd.scm +15 -36
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013-2016, 2018-2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013-2016, 2018-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2018 Carlo Zancanaro <carlo@zancanaro.id.au>
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>


@@ 183,7 183,6 @@ DEFAULT is given, use it as the service's default value."
(define %default-modules
  ;; Default set of modules visible in a service's file.
  `((shepherd service)
    (oop goops)
    ((guix build utils) #:hide (delete))
    (guix build syscalls)))



@@ 300,10 299,10 @@ stored."
                 #~(begin
                     (use-modules #$@(shepherd-service-modules service))

                     (make <service>
                       #:docstring '#$(shepherd-service-documentation service)
                       #:provides '#$(shepherd-service-provision service)
                       #:requires '#$(shepherd-service-requirement service)
                     (service
                      '#$(shepherd-service-provision service)
                       #:documentation '#$(shepherd-service-documentation service)
                       #:requirement '#$(shepherd-service-requirement service)

                       ;; The 'one-shot?' slot is new in Shepherd 0.6.0.
                       ;; Older versions ignore it.


@@ 313,7 312,7 @@ stored."
                       #:start #$(shepherd-service-start service)
                       #:stop #$(shepherd-service-stop service)
                       #:actions
                       (make-actions
                       (actions
                        #$@(map (match-lambda
                                  (($ <shepherd-action> name proc doc)
                                   #~(#$name #$doc #$proc)))


@@ 338,7 337,6 @@ and return the resulting '.go' file. SHEPHERD is used as shepherd package."

                         ;; Do the same as the Shepherd's 'load-in-user-module'.
                         (let ((env (make-fresh-user-module)))
                           (module-use! env (resolve-interface '(oop goops)))
                           (module-use! env (resolve-interface '(shepherd service)))
                           (with-target #$(or target #~%host-type)
                             (lambda _


@@ 371,17 369,6 @@ as shepherd package."
          (use-modules (srfi srfi-34)
                       (system repl error-handling))

          (define (call-with-file file flags proc)
            (let ((port #f))
              (dynamic-wind
                (lambda ()
                  (set! port (open file flags)))
                (lambda ()
                  (proc port))
                (lambda ()
                  (close-port port)
                  (set! port #f)))))

          ;; There's code run from shepherd that uses 'call-with-input-file' &
          ;; co.--e.g., the 'urandom-seed' service.  Starting from Shepherd
          ;; 0.9.2, users need to make sure not to leak non-close-on-exec file


@@ 389,12 376,12 @@ as shepherd package."
          ;; standard bindings with O_CLOEXEC variants.
          (set! call-with-input-file
                (lambda (file proc)
                  (call-with-file file (logior O_RDONLY O_CLOEXEC)
                                  proc)))
                  (call-with-port (open file (logior O_RDONLY O_CLOEXEC))
                    proc)))
          (set! call-with-output-file
                (lambda (file proc)
                  (call-with-file file (logior O_WRONLY O_CREAT O_CLOEXEC)
                                  proc)))
                  (call-with-port (open file (logior O_WRONLY O_CREAT O_CLOEXEC))
                    proc)))

          ;; Specify the default environment visible to all the services.
          ;; Without this statement, all the environment variables of PID 1


@@ 412,25 399,17 @@ as shepherd package."
          ;; than a kernel panic.
          (call-with-error-handling
            (lambda ()
              (apply register-services
                     (parameterize ((current-warning-port
                                     (%make-void-port "w")))
                       (map load-compiled '#$(map scm->go files))))))
              (register-services
               (parameterize ((current-warning-port
                               (%make-void-port "w")))
                 (map load-compiled '#$(map scm->go files))))))

          (format #t "starting services...~%")
          (let ((services-to-start
                 '#$(append-map shepherd-service-provision
                                (filter shepherd-service-auto-start?
                                        services))))
            (if (defined? 'start-in-the-background)
                (start-in-the-background services-to-start)
                (for-each (lambda (service)       ;pre-0.9.0 compatibility
                            (guard (c ((service-error? c)
                                       (format (current-error-port)
                                               "failed to start service '~a'~%"
                                               service)))
                              (start service)))
                          services-to-start))
            (start-in-the-background services-to-start)

            ;; Hang up stdin.  At this point, we assume that 'start' methods
            ;; that required user interaction on the console (e.g.,

M gnu/services/ssh.scm => gnu/services/ssh.scm +5 -2
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014-2019, 2022, 2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014-2019, 2022-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2016 David Craven <david@craven.ch>
;;; Copyright © 2016 Julien Lepiller <julien@lepiller.eu>
;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>


@@ 592,7 592,10 @@ of user-name/file-like tuples."

  (list (shepherd-service
         (documentation "OpenSSH server.")
         (requirement '(pam syslogd loopback))

         ;; On the Hurd, this can only be started after pfinet is up, hence
         ;; the dependency on 'networking'.
         (requirement '(pam syslogd loopback networking))
         (provision '(ssh-daemon ssh sshd))

         (start #~(if #$inetd-style?

M gnu/services/xorg.scm => gnu/services/xorg.scm +12 -3
@@ 981,6 981,11 @@ argument.")))
                (lambda (pw)
                  (string-append (passwd:dir pw) "/.guix-profile"))))

       (define home-profile
         (and=> (getpw (getuid))
                (lambda (pw)
                  (string-append (passwd:dir pw) "/.guix-home/profile"))))

       ;; If we are able to find the user's profile, we can add it to
       ;; the search paths set below.  We need to do this so that D-Bus
       ;; can start services installed by the user.  This allows


@@ 988,9 993,13 @@ argument.")))
       ;; 'evolution') to work even if those services are only available
       ;; in the user's profile.  See <https://bugs.gnu.org/35267>.
       (define profiles
         (if user-profile
             (list user-profile system-profile)
             (list system-profile)))
         (append (if home-profile
                     (list home-profile)
                     '())
                 (if user-profile
                     (list user-profile)
                     '())
                 (list system-profile)))

       (setenv "XDG_CONFIG_DIRS"
               (string-join (map (cut string-append <> "/etc/xdg") profiles)

M gnu/system.scm => gnu/system.scm +1 -3
@@ 803,9 803,7 @@ bookkeeping."
          %boot-service
          %hurd-startup-service
          %activation-service
          (service shepherd-root-service-type
                   (shepherd-configuration
                    (shepherd shepherd-0.8)))     ;no Fibers
          (service shepherd-root-service-type)

          (service user-processes-service-type)
          (account-service (append (operating-system-accounts os)

M gnu/system/hurd.scm => gnu/system/hurd.scm +2 -2
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2020-2022 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2020-2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2020, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of GNU Guix.


@@ 70,7 70,7 @@
  ;; Note: the Shepherd comes before the Hurd, not just because its duty is to
  ;; shepherd the herd, but also because we want its 'halt' and 'reboot'
  ;; commands to take precedence.
  (list shepherd-0.8 hurd netdde bash coreutils file findutils grep sed
  (list shepherd-0.10 hurd netdde bash coreutils file findutils grep sed
        diffutils patch gawk tar gzip bzip2 xz lzip
        guile-3.0-latest guile-colorized guile-readline
        net-base nss-certs inetutils less procps shadow sudo which

M gnu/system/image.scm => gnu/system/image.scm +28 -13
@@ 5,6 5,7 @@
;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
;;; Copyright © 2022 Alex Griffin <a@ajgrf.com>
;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 686,7 687,8 @@ returns an image record where the first partition's label is set to <label>."

(define* (system-docker-image image
                              #:key
                              (name "docker-image"))
                              (name "docker-image")
                              (archiver tar))
  "Build a docker image for IMAGE.  NAME is the base name to use for the
output file."
  (define boot-program


@@ 731,6 733,7 @@ output file."
              (use-modules (guix docker)
                           (guix build utils)
                           (gnu build image)
                           (srfi srfi-1)
                           (srfi srfi-19)
                           (guix build store-copy)
                           (guix store database))


@@ 754,18 757,30 @@ output file."
                                           #:register-closures? #$register-closures?
                                           #:deduplicate? #f
                                           #:system-directory #$os)
                (build-docker-image
                 #$output
                 (cons* image-root
                        (map store-info-item
                             (call-with-input-file #$graph
                               read-reference-graph)))
                 #$os
                 #:entry-point '(#$boot-program #$os)
                 #:compressor '(#+(file-append gzip "/bin/gzip") "-9n")
                 #:creation-time (make-time time-utc 0 1)
                 #:system #$image-target
                 #:transformations `((,image-root -> ""))))))))
                (when #$(image-max-layers image)
                  (setenv "PATH"
                          (string-join (list #+(file-append archiver "/bin")
                                             #+(file-append gzip "/bin"))
                                       ":")))
                (apply build-docker-image
                       (append (list #$output
                                     (append (if #$(image-max-layers image)
                                                 '()
                                                 (list image-root))
                                             (map store-info-item
                                                  (call-with-input-file #$graph
                                                    read-reference-graph)))
                                     #$os
                                     #:entry-point '(#$boot-program #$os)
                                     #:compressor
                                     '(#+(file-append gzip "/bin/gzip") "-9n")
                                     #:creation-time (make-time time-utc 0 1)
                                     #:system #$image-target
                                     #:transformations `((,image-root -> "")))
                               (if #$(image-max-layers image)
                                   (list #:root-system image-root
                                         #:max-layers #$(image-max-layers image))
                                   '()))))))))

    (computed-file name builder
                   ;; Allow offloading so that this I/O-intensive process

M gnu/tests/data/jami-dummy-account.dat => gnu/tests/data/jami-dummy-account.dat +63 -64
@@ 1,8 1,7 @@
;;; -*- mode: scheme; -*-
;;; JSON extracted from an actual Jami account and processed with
;;; Emacs/guile-json.
(define %jami-account-content-sexp
  '(("RINGCAKEY" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3F\
(("RINGCAKEY" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3F\
oa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRQzBxWUozSkYvTzhQRGEKRnUwRnpRcHBCaD\
gybGJMdURrNTlVU0I0MUJSaS9kdDZGV1BRN29YOVpsY25vNGZzM2dmUHQ0dU1hRVBkVFBGKwowbGN2Q\
jc2cytQTEFlcjlOZGpVQzQ2ZXp0UnNiNE9aQXc4ZUk1M3EwSU04QWJFd0o0ZjllLzBmQUFueHgrK3Qw\


@@ 58,7 57,7 @@ TUNPaHdxN21xYXRUVnNrawpTRDNySmkrTFR6a2Y4OEx1bjZZNjdiaFNOTWpKZkFaUXNQc0FTRkJBUTJ\
rQnE5alRLZGVuaU4yYTJIbm0xNCtrCnJDeU9ZVE14Q2hQbWNpS25pVy9MWnFUL0U1dlNRUGdBVzc0dT\
VLazJoSjRBajNjRW9NVEwxSytZbStWYWh2U0cKTi8xOFdYQ1JRQkg1d0p2eXJYczBtT29GQlRnTWg4d\
z0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=")
    ("ringAccountKey" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRUUlCQURBTk\
 ("ringAccountKey" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRUUlCQURBTk\
Jna3Foa2lHOXcwQkFRRUZBQVNDQ1Nzd2dna25BZ0VBQW9JQ0FRRDNCdDRnOUVUdk9EVnYKM3hWV0ZlS\
1Nnbk5uVEF3S2dYa3IrQ1FhdU8vTGZWM01RenNSNHliL3hoaWhhb1Z2c2FtZ3ZRU1haL0M1R3I5QQpE\
YlAxbHNHclRCK1pXMC9uMXVEb3hmVWdZRWY3SGtVanJtdVFjUGlFWGlUVkNiY002U0NzdVNrMnRxdE1\


@@ 114,7 113,7 @@ KMTlPd09oZ1lGcjFheGQvNXd2VgpURjNoVlQwbFZGN2RyRC9iMHZOcmxnbUNjbEk4UDg1a2dkRUhZbG\
ZtTFoxeXJIMkNXVy9SS0lsWk9ZdFVuNFNpCkp5a2VlNDROWElXU3ovalRBdFRta3VQTzRvUjF5d3dRc\
jdhUTF5a3hRVm9rVm5vY2xqU0tyQlk4R294a0I0eDIKUDNrb3F1UnkvcUd3QzBnN1o4ZjBTQjNQZVZt\
eQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==")
    ("ringAccountCert" . "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXakNDQTBLZ\
 ("ringAccountCert" . "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXakNDQTBLZ\
0F3SUJBZ0lJRm1tNmZuaWRndEl3RFFZSktvWklodmNOQVFFTUJRQXdUREVRTUE0R0ExVUUKQXhNSFNt\
RnRhU0JEUVRFNE1EWUdDZ21TSm9tVDhpeGtBUUVUS0RjNVpqSTJaVFZpWTJNeU9EWXlPREppT0dFMwp\
PRFF6TUdOak1EWXpNakV4T1RFNFkyWm1PVGd3SGhjTk1qRXdOREUyTVRjek1qRXdXaGNOTXpFd05ERT\


@@ 180,17 179,17 @@ OFY2cWM2bXZTbUFXa25nL3QwaStXVmdGVkZuZFQrQ0oyNTJsa0ZacGljdAp6ekdETW44VUNDRUp4TDR\
KTklTM2lLOUhlRys2MlZuay9QOEM3YVpLSXpVdjFud25rcVdUUUFYWDBKckJGdDdICjI5ZDk1RElmRT\
RuT0FyS0JFNHc2Z1R4SU1uZzVzWi9ZbDFjcG5wUHlsR3VICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tL\
S0K")
    ("ethKey" . "fN8cOT1lYNziaW0+pjBIgZ8r6+zMMhHsukkWBNPDsFo=")
    ("TURN.username" . "ring")
    ("TURN.server" . "turn.jami.net")
    ("TURN.realm" . "ring")
    ("TURN.password" . "ring")
    ("TURN.enable" . "true")
    ("TLS.verifyServer" . "true")
    ("TLS.verifyClient" . "true")
    ("TLS.serverName" . "")
    ("TLS.requireClientCertificate" . "true")
    ("TLS.privateKeyFile" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQU\
 ("ethKey" . "fN8cOT1lYNziaW0+pjBIgZ8r6+zMMhHsukkWBNPDsFo=")
 ("TURN.username" . "ring")
 ("TURN.server" . "turn.jami.net")
 ("TURN.realm" . "ring")
 ("TURN.password" . "ring")
 ("TURN.enable" . "true")
 ("TLS.verifyServer" . "true")
 ("TLS.verifyClient" . "true")
 ("TLS.serverName" . "")
 ("TLS.requireClientCertificate" . "true")
 ("TLS.privateKeyFile" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQU\
RBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRQzM5b1Z0cXNtUGdaSUgKcHpTV\
GtlT3BlWC9CSEx2KzFTYnJPSFpVRHEwNFZCUU5BNmJmSFNSWTJpbHE1WEVheXNVSmwzQmsvM0txZEhS\
cQpEV01wQ1dpcE1Vc2FwSGxJR0tSWHEwbXhQZ29WODZSUVBub1dCRTdhWVVEZTlJZXlxMmllZXpDK1l\


@@ 246,11 245,11 @@ mNUloSWU0RUtZUE5VUXNua0tSVTlxUApzWi9idXBXc2w4bWVFcko3bllJQ05ucHpnSHRpNXdSMlliVF\
VXT01odmRFUldxMnhTV3BBYmtNMElhZDBUc05kCmUrYVRQVmJOMXFibFZLMm1qUTl2YS9JSkVuSE51V\
E9TREtJeUpvcVArQkxiRTVjQU5acXQ2OFFadWdOc2RxNHkKV2FoeStydU5LS1F3Mk5MYzQzZUtsNmxv\
bXdtRlFZOD0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=")
    ("TLS.password" . "")
    ("TLS.negotiationTimeoutSec" . "-1")
    ("TLS.method" . "Automatic")
    ("TLS.ciphers" . "")
    ("TLS.certificateFile" . "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZHVENDQ\
 ("TLS.password" . "")
 ("TLS.negotiationTimeoutSec" . "-1")
 ("TLS.method" . "Automatic")
 ("TLS.ciphers" . "")
 ("TLS.certificateFile" . "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZHVENDQ\
XdHZ0F3SUJBZ0lJU1pUdlZPQnh3akF3RFFZSktvWklodmNOQVFFTUJRQXdTVEVOTUFzR0ExVUUKQXhN\
RVNtRnRhVEU0TURZR0NnbVNKb21UOGl4a0FRRVRLR1l6TXpRMVpqSTNOelZrWkdabE1EZGhOR0l3WkR\
rMQpaR0ZsWVRFeE1XUXhOV1ppWXpFeE9Ua3dIaGNOTWpFd05ERTJNVGN6TWpFd1doY05NekV3TkRFME\


@@ 346,47 345,47 @@ lzVXFsVHVncXhtM2xDOUhzaDM2UFJLNURDUG93eHVUNlgKcXo1M1ZiN2h6TkxLelpiRlJzbUdFOFY2c\
WM2bXZTbUFXa25nL3QwaStXVmdGVkZuZFQrQ0oyNTJsa0ZacGljdAp6ekdETW44VUNDRUp4TDRKTklT\
M2lLOUhlRys2MlZuay9QOEM3YVpLSXpVdjFud25rcVdUUUFYWDBKckJGdDdICjI5ZDk1RElmRTRuT0F\
yS0JFNHc2Z1R4SU1uZzVzWi9ZbDFjcG5wUHlsR3VICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K")
    ("STUN.server" . "")
    ("STUN.enable" . "false")
    ("SRTP.rtpFallback" . "false")
    ("SRTP.keyExchange" . "sdes")
    ("SRTP.enable" . "true")
    ("RingNS.uri" . "")
    ("RingNS.account" . "0790738ce15fa05933b49dd77034312787da86c3")
    ("DHT.PublicInCalls" . "true")
    ("Account.videoPortMin" . "49152")
    ("Account.videoPortMax" . "65534")
    ("Account.videoEnabled" . "true")
    ("Account.username" . "f3345f2775ddfe07a4b0d95daea111d15fbc1199")
    ("Account.useragent" . "")
    ("Account.upnpEnabled" . "true")
    ("Account.type" . "RING")
    ("Account.ringtoneEnabled" . "true")
    ("Account.rendezVous" . "true")
    ("Account.publishedSameAsLocal" . "true")
    ("Account.publishedPort" . "5060")
    ("Account.publishedAddress" . "")
    ("Account.presenceSubscribeSupported" . "true")
    ("Account.peerDiscovery" . "false")
    ("Account.managerUsername" . "")
    ("Account.managerUri" . "")
    ("Account.mailbox" . "")
    ("Account.localModeratorsEnabled" . "true")
    ("Account.localInterface" . "default")
    ("Account.hostname" . "bootstrap.jami.net")
    ("Account.hasCustomUserAgent" . "false")
    ("Account.enable" . "true")
    ("Account.dtmfType" . "overrtp")
    ("Account.displayName" . "dummy")
    ("Account.defaultModerators" . "")
    ("Account.audioPortMin" . "16384")
    ("Account.audioPortMax" . "32766")
    ("Account.archiveHasPassword" . "false")
    ("Account.allowCertFromTrusted" . "true")
    ("Account.allowCertFromHistory" . "true")
    ("Account.allowCertFromContact" . "true")
    ("Account.allModeratorEnabled" . "true")
    ("Account.alias" . "dummy")
    ("Account.activeCallLimit" . "-1")
    ("Account.accountPublish" . "false")
    ("Account.accountDiscovery" . "false")))
 ("STUN.server" . "")
 ("STUN.enable" . "false")
 ("SRTP.rtpFallback" . "false")
 ("SRTP.keyExchange" . "sdes")
 ("SRTP.enable" . "true")
 ("RingNS.uri" . "")
 ("RingNS.account" . "0790738ce15fa05933b49dd77034312787da86c3")
 ("DHT.PublicInCalls" . "true")
 ("Account.videoPortMin" . "49152")
 ("Account.videoPortMax" . "65534")
 ("Account.videoEnabled" . "true")
 ("Account.username" . "f3345f2775ddfe07a4b0d95daea111d15fbc1199")
 ("Account.useragent" . "")
 ("Account.upnpEnabled" . "true")
 ("Account.type" . "RING")
 ("Account.ringtoneEnabled" . "true")
 ("Account.rendezVous" . "true")
 ("Account.publishedSameAsLocal" . "true")
 ("Account.publishedPort" . "5060")
 ("Account.publishedAddress" . "")
 ("Account.presenceSubscribeSupported" . "true")
 ("Account.peerDiscovery" . "false")
 ("Account.managerUsername" . "")
 ("Account.managerUri" . "")
 ("Account.mailbox" . "")
 ("Account.localModeratorsEnabled" . "true")
 ("Account.localInterface" . "default")
 ("Account.hostname" . "bootstrap.jami.net")
 ("Account.hasCustomUserAgent" . "false")
 ("Account.enable" . "true")
 ("Account.dtmfType" . "overrtp")
 ("Account.displayName" . "dummy")
 ("Account.defaultModerators" . "")
 ("Account.audioPortMin" . "16384")
 ("Account.audioPortMax" . "32766")
 ("Account.archiveHasPassword" . "false")
 ("Account.allowCertFromTrusted" . "true")
 ("Account.allowCertFromHistory" . "true")
 ("Account.allowCertFromContact" . "true")
 ("Account.allModeratorEnabled" . "true")
 ("Account.alias" . "dummy")
 ("Account.activeCallLimit" . "-1")
 ("Account.accountPublish" . "false")
 ("Account.accountDiscovery" . "false"))

M gnu/tests/docker.scm => gnu/tests/docker.scm +1 -1
@@ 212,7 212,7 @@ inside %DOCKER-OS."
    (virtual-machine
     (operating-system os)
     (volatile? #f)
     (disk-image-size (* 5500 (expt 2 20)))
     (disk-image-size (* 6000 (expt 2 20)))
     (memory-size 2048)
     (port-forwardings '())))


M gnu/tests/telephony.scm => gnu/tests/telephony.scm +5 -2
@@ 38,7 38,10 @@
;;; Jami daemon.
;;;

(include "data/jami-dummy-account.dat") ;defines %jami-account-content-sexp
(define %jami-account-content-sexp
  (call-with-input-file
      (search-path %load-path "gnu/tests/data/jami-dummy-account.dat")
    read))

(define %dummy-jami-account-archive
  ;; A Jami account archive is a gzipped JSON file.


@@ 391,7 394,7 @@ jami account used as part of the jami configuration are left *unspecified*."
   (description "Provisioning test for the jami service.")
   (value (run-jami-test #:provisioning? #t))))

;;; Thi test verifies that <jami-account> values can be left unspecified
;;; This test verifies that <jami-account> values can be left unspecified
;;; without causing any issue (see: https://issues.guix.gnu.org/56799).
(define %test-jami-provisioning-partial
  (system-test

M gnu/tests/virtualization.scm => gnu/tests/virtualization.scm +2 -1
@@ 1,6 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
;;; Copyright © 2020-2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2020-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2021 Pierre Langlois <pierre.langlois@gmx.com>
;;; Copyright © 2022 Marius Bakke <marius@gnu.org>


@@ 277,6 277,7 @@
              (let ((session (make-session #:user "test"
                                           #:port 10022
                                           #:host "localhost"
                                           #:timeout 120
                                           #:log-verbosity 'rare)))
                (match (connect! session)
                  ('ok

M guix/build-system/zig.scm => guix/build-system/zig.scm +97 -21
@@ 83,6 83,79 @@
                      #:system system
                      #:guile-for-build guile)))

(define* (zig-cross-build name
                          #:key
                          source target
                          build-inputs target-inputs host-inputs
                          (phases '%standard-phases)
                          (outputs '("out"))
                          (search-paths '())
                          (native-search-paths '())
                          (tests? #t)
                          (test-target #f)
                          (zig-build-flags ''())
                          (zig-test-flags ''())
                          (zig-destdir "out")
                          (zig-test-destdir "test-out")
                          (zig-release-type #f)
                          (system (%current-system))
                          (guile #f)
                          (imported-modules %zig-build-system-modules)
                          (modules '((guix build zig-build-system)
                                     (guix build utils))))
  "Build SOURCE using Zig, and with INPUTS."
  (define builder
    (with-imported-modules imported-modules
      #~(begin
          (use-modules #$@(sexp->gexp modules))

          (define %build-host-inputs
            #+(input-tuples->gexp build-inputs))

          (define %build-target-inputs
            (append #$(input-tuples->gexp host-inputs)
              #+(input-tuples->gexp target-inputs)))

          (define %build-inputs
            (append %build-host-inputs %build-target-inputs))

          (define %outputs
            #$(outputs->gexp outputs))

          (zig-build #:name #$name
                     #:source #+source
                     #:system #$system
                     #:phases #$phases
                     #:outputs %outputs
                     #:target #$target
                     #:test-target #$test-target
                     #:inputs %build-target-inputs
                     #:native-inputs %build-host-inputs
                     #:search-paths '#$(map search-path-specification->sexp
                                            search-paths)
                     #:native-search-paths '#$(map
                                                search-path-specification->sexp
                                                native-search-paths)
                     #:zig-build-flags #$zig-build-flags
                     #:zig-test-flags #$zig-test-flags
                     #:zig-release-type #$zig-release-type
                     #:zig-destdir #$zig-destdir
                     #:zig-test-destdir #$zig-test-destdir
                     #:tests? #$tests?
                     #:search-paths '#$(sexp->gexp
                                        (map search-path-specification->sexp
                                             search-paths))))))

  (mlet %store-monad ((guile (package->derivation (or guile (default-guile))
                                                  system #:graft? #f)))
        (gexp->derivation name builder
                          #:system system
                          #:target target
                          #:graft? #f
                          #:substitutable? substitutable?
                          #:guile-for-build guile)))


(define* (lower name
                #:key source inputs native-inputs outputs system target
                (zig (default-zig))


@@ 93,27 166,30 @@
  (define private-keywords
    '(#:target #:zig #:inputs #:native-inputs #:outputs))

  ;; TODO: support cross-compilation
  ;; It's as simple as adding some build flags to `zig-build-flags`
  ;; -Dtarget=aarch64-linux-musl, for example.
  (and (not target)
       (bag
         (name name)
         (system system)
         (target target)
         (host-inputs `(,@(if source
                              `(("source" ,source))
                              '())
                        ,@inputs

                        ;; Keep the standard inputs of 'gnu-build-system'
                        ;; TODO: do we need this?
                        ,@(standard-packages)))
         (build-inputs `(("zig" ,zig)
                         ,@native-inputs))
         (outputs outputs)
         (build zig-build)
         (arguments (strip-keyword-arguments private-keywords arguments)))))
  (bag
    (name name)
    (system system)
    (target target)
    (build-inputs `(,@(if source
                        `(("source" ,source))
                        '())
                    ,@`(("zig" ,zig))
                    ,@native-inputs
                    ,@(if target '() inputs)
                    ,@(if target
                        ;; Use the standard cross inputs of
                        ;; 'gnu-build-system'.
                        (standard-cross-packages target 'host)
                        '())
                    ;; Keep the standard inputs of 'gnu-build-system'.
                    ,@(standard-packages)))
    (host-inputs (if target inputs '()))
    (target-inputs (if target
                     (standard-cross-packages target 'target)
                     '()))
    (outputs outputs)
    (build (if target zig-cross-build zig-build))
    (arguments (strip-keyword-arguments private-keywords arguments))))

(define zig-build-system
  (build-system

M guix/build/zig-build-system.scm => guix/build/zig-build-system.scm +6 -1
@@ 47,6 47,7 @@
                zig-build-flags
                zig-release-type       ;; "safe", "fast" or "small" empty for a
                                       ;; debug build"
                target
                #:allow-other-keys)
  "Build a given Zig package."



@@ 56,6 57,9 @@
                     "--prefix-lib-dir"     "lib"
                     "--prefix-exe-dir"     "bin"
                     "--prefix-include-dir" "include"
                     ,@(if target
                         (list (string-append "-Dtarget=" target))
                         '())
                     ,@(if zig-release-type
                         (list (string-append "-Drelease-" zig-release-type))
                         '())


@@ 65,9 69,10 @@

(define* (check #:key tests?
                zig-test-flags
                target
                #:allow-other-keys)
  "Run all the tests"
  (when tests?
  (when (and tests? (not target))
    (let ((old-destdir (getenv "DESTDIR")))
      (setenv "DESTDIR" "test-out") ;; Avoid colisions with the build output
      (let ((call `("zig" "build" "test"

M guix/docker.scm => guix/docker.scm +166 -46
@@ 3,6 3,7 @@
;;; Copyright © 2017, 2018, 2019, 2021 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 29,16 30,27 @@
                          with-directory-excursion
                          invoke))
  #:use-module (gnu build install)
  #:use-module ((guix build store-copy)
                #:select (file-size))
  #:use-module (json)                             ;guile-json
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-19)
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-71)
  #:use-module ((texinfo string-utils)
                #:select (escape-special-chars))
  #:use-module (rnrs bytevectors)
  #:use-module (ice-9 ftw)
  #:use-module (ice-9 match)
  #:export (build-docker-image))
  #:export (%docker-image-max-layers
            build-docker-image))

;; The maximum number of layers allowed in a Docker image is typically around
;; 128, although it may vary depending on the Docker daemon. However, we
;; recommend setting the limit to 100 to ensure sufficient room for future
;; extensions.
(define %docker-image-max-layers
  #f)

;; Generate a 256-bit identifier in hexadecimal encoding for the Docker image.
(define docker-id


@@ 92,12 104,12 @@ Return a version of TAG that follows these rules."
                      (make-string (- min-length l) padding-character)))
      (_ normalized-name))))

(define* (manifest path id #:optional (tag "guix"))
(define* (manifest path layers #:optional (tag "guix"))
  "Generate a simple image manifest."
  (let ((tag (canonicalize-repository-name tag)))
    `#(((Config . "config.json")
        (RepoTags . #(,(string-append tag ":latest")))
        (Layers . #(,(string-append id "/layer.tar")))))))
        (Layers . ,(list->vector layers))))))

;; According to the specifications this is required for backwards
;; compatibility.  It duplicates information provided by the manifest.


@@ 106,8 118,8 @@ Return a version of TAG that follows these rules."
  `((,(canonicalize-repository-name tag) . ((latest . ,id)))))

;; See https://github.com/opencontainers/image-spec/blob/master/config.md
(define* (config layer time arch #:key entry-point (environment '()))
  "Generate a minimal image configuration for the given LAYER file."
(define* (config layers-diff-ids time arch #:key entry-point (environment '()))
  "Generate a minimal image configuration for the given LAYERS files."
  ;; "architecture" must be values matching "platform.arch" in the
  ;; runtime-spec at
  ;; https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc2/config.md#platform


@@ 125,7 137,7 @@ Return a version of TAG that follows these rules."
    (container_config . #nil)
    (os . "linux")
    (rootfs . ((type . "layers")
               (diff_ids . #(,(layer-diff-id layer)))))))
               (diff_ids . ,(list->vector layers-diff-ids))))))

(define directive-file
  ;; Return the file or directory created by a 'evaluate-populate-directive'


@@ 136,6 148,26 @@ Return a version of TAG that follows these rules."
    (('directory name _ ...)
     (string-trim name #\/))))

(define (size-sorted-store-items items max-layers)
  "Split list of ITEMS at %MAX-LAYERS and sort by disk usage."
  (let* ((items-length (length items))
         (head tail
               (split-at
                (map (match-lambda ((size . item) item))
                     (sort (map (lambda (item)
                                  (cons (file-size item) item))
                                items)
                           (lambda (item1 item2)
                             (< (match item2 ((size . _) size))
                                (match item1 ((size . _) size))))))
                (if (>= items-length max-layers)
                    (- max-layers 2)
                    (1- items-length)))))
    (list head tail)))

(define (create-empty-tar file)
  (invoke "tar" "-cf" file "--files-from" "/dev/null"))

(define* (build-docker-image image paths prefix
                             #:key
                             (repository "guix")


@@ 146,11 178,13 @@ Return a version of TAG that follows these rules."
                             entry-point
                             (environment '())
                             compressor
                             (creation-time (current-time time-utc)))
  "Write to IMAGE a Docker image archive containing the given PATHS.  PREFIX
must be a store path that is a prefix of any store paths in PATHS.  REPOSITORY
is a descriptive name that will show up in \"REPOSITORY\" column of the output
of \"docker images\".
                             (creation-time (current-time time-utc))
                             max-layers
                             root-system)
  "Write to IMAGE a layerer Docker image archive containing the given PATHS.
PREFIX must be a store path that is a prefix of any store paths in PATHS.
REPOSITORY is a descriptive name that will show up in \"REPOSITORY\" column of
the output of \"docker images\".

When DATABASE is true, copy it to /var/guix/db in the image and create
/var/guix/gcroots and friends.


@@ 172,7 206,14 @@ non-empty directory, then its contents will be recursively added, as well.
SYSTEM is a GNU triplet (or prefix thereof) of the system the binaries in
PATHS are for; it is used to produce metadata in the image.  Use COMPRESSOR, a
command such as '(\"gzip\" \"-9n\"), to compress IMAGE.  Use CREATION-TIME, a
SRFI-19 time-utc object, as the creation time in metadata."
SRFI-19 time-utc object, as the creation time in metadata.

When MAX-LAYERS is not false build layered image, providing a Docker
image with store paths splitted in their own layers to improve sharing
between images.

ROOT-SYSTEM is a directory with a provisioned root file system, which will be
added to image as a layer."
  (define (sanitize path-fragment)
    (escape-special-chars
     ;; GNU tar strips the leading slash off of absolute paths before applying


@@ 203,6 244,59 @@ SRFI-19 time-utc object, as the creation time in metadata."
    (if (eq? '() transformations)
        '()
        `("--transform" ,(transformations->expression transformations))))
  (define (seal-layer)
    ;; Add 'layer.tar' to 'image.tar' under the right name.  Return its hash.
    (let* ((file-hash (layer-diff-id "layer.tar"))
           (file-name (string-append file-hash "/layer.tar")))
      (mkdir file-hash)
      (rename-file "layer.tar" file-name)
      (invoke "tar" "-rf" "image.tar" file-name)
      (delete-file file-name)
      file-hash))
  (define layers-hashes
    ;; Generate a tarball that includes container image layers as tarballs,
    ;; along with a manifest.json file describing the layer and config file
    ;; locations.
    (match-lambda
      (((head ...) (tail ...) id)
       (create-empty-tar "image.tar")
       (let* ((head-layers
               (map
                (lambda (file)
                  (invoke "tar" "cf" "layer.tar" file)
                  (seal-layer))
                head))
              (tail-layer
               (begin
                 (create-empty-tar "layer.tar")
                 (for-each (lambda (file)
                             (invoke "tar" "-rf" "layer.tar" file))
                           tail)
                 (let* ((file-hash (layer-diff-id "layer.tar"))
                        (file-name (string-append file-hash "/layer.tar")))
                   (mkdir file-hash)
                   (rename-file "layer.tar" file-name)
                   (invoke "tar" "-rf" "image.tar" file-name)
                   (delete-file file-name)
                   file-hash)))
              (customization-layer
               (let* ((file-id (string-append id "/layer.tar"))
                      (file-hash (layer-diff-id file-id))
                      (file-name (string-append file-hash "/layer.tar")))
                 (mkdir file-hash)
                 (rename-file file-id file-name)
                 (invoke "tar" "-rf" "image.tar" file-name)
                 file-hash))
              (all-layers
               (append head-layers (list tail-layer customization-layer))))
         (with-output-to-file "manifest.json"
           (lambda ()
             (scm->json (manifest prefix
                                  (map (cut string-append <> "/layer.tar")
                                       all-layers)
                                  repository))))
         (invoke "tar" "-rf" "image.tar" "manifest.json")
         all-layers))))
  (let* ((directory "/tmp/docker-image") ;temporary working directory
         (id (docker-id prefix))
         (time (date->string (time-utc->date creation-time) "~4"))


@@ 229,26 323,39 @@ SRFI-19 time-utc object, as the creation time in metadata."
        (with-output-to-file "json"
          (lambda () (scm->json (image-description id time))))

        ;; Create a directory for the non-store files that need to go into the
        ;; archive.
        (mkdir "extra")
        (if root-system
            (let ((directory (getcwd)))
              (with-directory-excursion root-system
                (apply invoke "tar"
                       "-cf" (string-append directory "/layer.tar")
                       `(,@transformation-options
                         ,@(tar-base-options)
                         ,@(scandir "."
                                    (lambda (file)
                                      (not (member file '("." "..")))))))))
            (begin
              ;; Create a directory for the non-store files that need to go
              ;; into the archive.
              (mkdir "extra")

        (with-directory-excursion "extra"
          ;; Create non-store files.
          (for-each (cut evaluate-populate-directive <> "./")
                    extra-files)
              (with-directory-excursion "extra"
                ;; Create non-store files.
                (for-each (cut evaluate-populate-directive <> "./")
                          extra-files)

          (when database
            ;; Initialize /var/guix, assuming PREFIX points to a profile.
            (install-database-and-gc-roots "." database prefix))
                (when database
                  ;; Initialize /var/guix, assuming PREFIX points to a
                  ;; profile.
                  (install-database-and-gc-roots "." database prefix))

          (apply invoke "tar" "-cf" "../layer.tar"
                 `(,@transformation-options
                   ,@(tar-base-options)
                   ,@paths
                   ,@(scandir "."
                              (lambda (file)
                                (not (member file '("." ".."))))))))
                (apply invoke "tar" "-cf" "../layer.tar"
                       `(,@transformation-options
                         ,@(tar-base-options)
                         ,@(if max-layers '() paths)
                         ,@(scandir "."
                                    (lambda (file)
                                      (not (member file '("." ".."))))))))
              (delete-file-recursively "extra")))

        ;; It is possible for "/" to show up in the archive, especially when
        ;; applying transformations.  For example, the transformation


@@ 261,24 368,37 @@ SRFI-19 time-utc object, as the creation time in metadata."
        ;; error messages.
        (with-error-to-port (%make-void-port "w")
          (lambda ()
            (system* "tar" "--delete" "/" "-f" "layer.tar")))

        (delete-file-recursively "extra"))
            (system* "tar" "--delete" "/" "-f" "layer.tar"))))

      (with-output-to-file "config.json"
        (lambda ()
          (scm->json (config (string-append id "/layer.tar")
                             time arch
                             #:environment environment
                             #:entry-point entry-point))))
      (with-output-to-file "manifest.json"
        (lambda ()
          (scm->json (manifest prefix id repository))))
      (with-output-to-file "repositories"
        (lambda ()
          (scm->json (repositories prefix id repository)))))

    (apply invoke "tar" "-cf" image "-C" directory
           `(,@(tar-base-options #:compressor compressor)
             "."))
          (scm->json
           (config (if max-layers
                       (layers-hashes
                        (append (size-sorted-store-items paths max-layers)
                                (list id)))
                       (list (layer-diff-id (string-append id "/layer.tar"))))
                   time arch
                   #:environment environment
                   #:entry-point entry-point))))
      (if max-layers
          (begin
            (invoke "tar" "-rf" "image.tar" "config.json")
            (if compressor
                (begin
                  (apply invoke `(,@compressor "image.tar"))
                  (copy-file "image.tar.gz" image))
                (copy-file "image.tar" image)))
          (begin
            (with-output-to-file "manifest.json"
              (lambda ()
                (scm->json (manifest prefix
                                     (list (string-append id "/layer.tar"))
                                     repository))))
            (with-output-to-file "repositories"
              (lambda ()
                (scm->json (repositories prefix id repository))))
            (apply invoke "tar" "-cf" image
                   `(,@(tar-base-options #:compressor compressor)
                     ".")))))
    (delete-file-recursively directory)))

M guix/import/crate.scm => guix/import/crate.scm +118 -43
@@ 6,6 6,7 @@
;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com>
;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 25,12 26,15 @@
(define-module (guix import crate)
  #:use-module (guix base32)
  #:use-module (guix build-system cargo)
  #:use-module (guix diagnostics)
  #:use-module (gcrypt hash)
  #:use-module (guix http-client)
  #:use-module (guix i18n)
  #:use-module (guix import json)
  #:use-module (guix import utils)
  #:use-module (guix memoization)
  #:use-module (guix packages)
  #:use-module (guix read-print)
  #:use-module (guix upstream)
  #:use-module (guix utils)
  #:use-module (gnu packages)


@@ 40,6 44,7 @@
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-2)
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-69)
  #:use-module (srfi srfi-71)
  #:export (crate->guix-package
            guix-package->crate-name


@@ 99,7 104,7 @@

;; Autoload Guile-Semver so we only have a soft dependency.
(module-autoload! (current-module)
		  '(semver) '(string->semver semver->string semver<?))
		  '(semver) '(string->semver semver->string semver<? semver=?))
(module-autoload! (current-module)
		  '(semver ranges) '(string->semver-range semver-range-contains?))



@@ 164,16 169,18 @@ record or #f if it was not found."
        (list-matches "^(0+\\.){,2}[0-9]+" version))))

(define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs
                          home-page synopsis description license build?)
                          home-page synopsis description license build? yanked?)
  "Return the `package' s-expression for a rust package with the given NAME,
VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION,
and LICENSE."
  (define (format-inputs inputs)
    (map
     (match-lambda
      ((name version)
      ((name version yanked)
       (list (crate-name->package-name name)
             (version->semver-prefix version))))
             (if yanked
                 (string-append version "-yanked")
                 (version->semver-prefix version)))))
     inputs))

  (let* ((port (http-fetch (crate-uri name version)))


@@ 183,6 190,9 @@ and LICENSE."
         (pkg `(package
                   (name ,guix-name)
                   (version ,version)
                   ,@(if yanked?
                         `(,(comment "; This version was yanked!\n" #t))
                         '())
                   (source (origin
                             (method url-fetch)
                             (uri (crate-uri ,name version))


@@ 190,6 200,9 @@ and LICENSE."
                             (sha256
                              (base32
                               ,(bytevector->nix-base32-string (port-sha256 port))))))
                   ,@(if yanked?
                         `((properties '((crate-version-yanked? . #t))))
                         '())
                   (build-system cargo-build-system)
                   ,@(maybe-arguments (append (if build?
                                                 '()


@@ 206,7 219,10 @@ and LICENSE."
                               ((license) license)
                               (_ `(list ,@license)))))))
         (close-port port)
         (package->definition pkg (version->semver-prefix version))))
         (package->definition pkg
                              (if yanked?
                                  (string-append version "-yanked")
                                  (version->semver-prefix version)))))

(define (string->license string)
  (filter-map (lambda (license)


@@ 217,13 233,14 @@ and LICENSE."
                         'unknown-license!)))
              (string-split string (string->char-set " /"))))

(define* (crate->guix-package crate-name #:key version include-dev-deps?
                              #:allow-other-keys)
(define* (crate->guix-package
          crate-name
          #:key version include-dev-deps? allow-yanked? #:allow-other-keys)
  "Fetch the metadata for CRATE-NAME from crates.io, and return the
`package' s-expression corresponding to that package, or #f on failure.
When VERSION is specified, convert it into a semver range and attempt to fetch
the latest version matching this semver range; otherwise fetch the latest
version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this will also
version of CRATE-NAME.  If INCLUDE-DEV-DEPS is true then this will also
look up the development dependencs for the given crate."

  (define (semver-range-contains-string? range version)


@@ 242,63 259,112 @@ look up the development dependencs for the given crate."
         (or version
             (crate-latest-version crate))))

  ;; find the highest existing package that fulfills the semver <range>
  ;; Find the highest existing package that fulfills the semver <range>.
  ;; Packages previously marked as yanked take lower priority.
  (define (find-package-version name range)
    (let* ((semver-range (string->semver-range range))
           (versions
           (package-versions
            (sort
             (filter (lambda (version)
                       (semver-range-contains? semver-range version))
             (filter (match-lambda ((semver yanked)
                                    (and
                                     (or allow-yanked? (not yanked))
                                     (semver-range-contains? semver-range semver))))
                     (map (lambda (pkg)
                            (string->semver (package-version pkg)))
                            (let ((version (package-version pkg)))
                              (list
                                (string->semver version)
                                (assoc-ref (package-properties pkg)
                                           'crate-version-yanked?))))
                          (find-packages-by-name
                           (crate-name->package-name name))))
             semver<?)))
      (and (not (null-list? versions))
           (semver->string (last versions)))))

  ;; Find the highest version of a crate that fulfills the semver <range>
  ;; and hasn't been yanked.
             (match-lambda* (((semver1 yanked1) (semver2 yanked2))
                             (or (and yanked1 (not yanked2))
                                 (and (eq? yanked1 yanked2)
                                      (semver<? semver1 semver2))))))))
      (and (not (null-list? package-versions))
           (match-let (((semver yanked) (last package-versions)))
             (list (semver->string semver) yanked)))))

  ;; Find the highest version of a crate that fulfills the semver <range>.
  ;; If no matching non-yanked version has been found and allow-yanked? is #t,
  ;; also consider yanked packages.
  (define (find-crate-version crate range)
    (let* ((semver-range (string->semver-range range))
           (versions
            (sort
             (filter (lambda (entry)
                       (and
                         (not (crate-version-yanked? (second entry)))
                         (or allow-yanked?
                             (not (crate-version-yanked? (second entry))))
                         (semver-range-contains? semver-range (first entry))))
                     (map (lambda (ver)
                            (list (string->semver (crate-version-number ver))
                                  ver))
                          (crate-versions crate)))
             (match-lambda* (((semver _) ...)
                             (apply semver<? semver))))))
             (match-lambda* (((semver ver) ...)
                             (match-let (((yanked1 yanked2)
                                          (map crate-version-yanked? ver)))
                               (or (and yanked1 (not yanked2))
                                   (and (eq? yanked1 yanked2)
                                        (apply semver<? semver)))))))))
      (and (not (null-list? versions))
           (second (last versions)))))

  (define (dependency-name+version dep)
  ;; If no non-yanked existing package version was found, check the upstream
  ;; versions.  If a non-yanked upsteam version exists, use it instead,
  ;; otherwise use the existing package version, provided it exists.
  (define (dependency-name+version+yanked dep)
    (let* ((name (crate-dependency-id dep))
           (req (crate-dependency-requirement dep))
           (existing-version (find-package-version name req)))
      (if existing-version
          (list name existing-version)
                 (req (crate-dependency-requirement dep))
                 (existing-version (find-package-version name req)))
      (if (and existing-version (not (second existing-version)))
          (cons name existing-version)
          (let* ((crate (lookup-crate* name))
                 (ver (find-crate-version crate req)))
            (list name
                  (crate-version-number ver))))))
            (if existing-version
                (if (and ver (not (crate-version-yanked? ver)))
                    (if (semver=? (string->semver (first existing-version))
                                  (string->semver (crate-version-number ver)))
                        (begin
                          (warning (G_ "~A: version ~a is no longer yanked~%")
                                   name (first existing-version))
                          (cons name existing-version))
                        (list name
                              (crate-version-number ver)
                              (crate-version-yanked? ver)))
                    (begin
                      (warning (G_ "~A: using existing version ~a, which was yanked~%")
                               name (first existing-version))
                      (cons name existing-version)))
                (begin
                  (unless ver
                    (leave (G_ "~A: no version found for requirement ~a~%") name req))
                  (if (crate-version-yanked? ver)
                      (warning (G_ "~A: imported version ~a was yanked~%")
                               name (crate-version-number ver)))
                  (list name
                        (crate-version-number ver)
                        (crate-version-yanked? ver))))))))

  (define version*
    (and crate
         (find-crate-version crate version-number)))
         (or (find-crate-version crate version-number)
             (leave (G_ "~A: version ~a not found~%") crate-name version-number))))

  ;; sort and map the dependencies to a list containing
  ;; pairs of (name version)
  (define (sort-map-dependencies deps)
    (sort (map dependency-name+version
    (sort (map dependency-name+version+yanked
               deps)
          (match-lambda* (((name _) ...)
          (match-lambda* (((name _ _) ...)
                          (apply string-ci<? name)))))

  (define (remove-yanked-info deps)
    (map
     (match-lambda ((name version yanked)
                    (list name version)))
     deps))

  (if (and crate version*)
      (let* ((dependencies (crate-version-dependencies version*))
             (dep-crates dev-dep-crates (partition normal-dependency? dependencies))


@@ 308,6 374,7 @@ look up the development dependencs for the given crate."
                                           '())))
        (values
         (make-crate-sexp #:build? include-dev-deps?
                          #:yanked? (crate-version-yanked? version*)
                          #:name crate-name
                          #:version (crate-version-number version*)
                          #:cargo-inputs cargo-inputs


@@ 324,19 391,27 @@ look up the development dependencs for the given crate."
                          #:description (crate-description crate)
                          #:license (and=> (crate-version-license version*)
                                           string->license))
         (append cargo-inputs cargo-development-inputs)))
         (append
          (remove-yanked-info cargo-inputs)
          (remove-yanked-info cargo-development-inputs))))
      (values #f '())))

(define* (crate-recursive-import crate-name #:key version)
  (recursive-import crate-name
                    #:repo->guix-package (lambda* params
                      ;; download development dependencies only for the top level package
                      (let ((include-dev-deps? (equal? (car params) crate-name))
                            (crate->guix-package* (memoize crate->guix-package)))
                        (apply crate->guix-package*
                               (append params `(#:include-dev-deps? ,include-dev-deps?)))))
                    #:version version
                    #:guix-name crate-name->package-name))
(define* (crate-recursive-import
          crate-name #:key version recursive-dev-dependencies? allow-yanked?)
  (recursive-import
   crate-name
   #:repo->guix-package
   (let ((crate->guix-package* (memoize crate->guix-package)))
     (lambda* params
       ;; download development dependencies only for the top level package
       (let ((include-dev-deps?
              (or (equal? (car params) crate-name)
                  recursive-dev-dependencies?)))
         (apply crate->guix-package*
                (append params `(#:include-dev-deps? ,include-dev-deps?
                                 #:allow-yanked? ,allow-yanked?))))))
   #:version version
   #:guix-name crate-name->package-name))

(define (guix-package->crate-name package)
  "Return the crate name of PACKAGE."

M guix/platforms/x86.scm => guix/platforms/x86.scm +10 -0
@@ 1,5 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2022 Mathieu Othacehe <othacehe@gnu.org>
;;; Copyright © 2023, 2024 Efraim Flashner <efraim@flashner.co.il>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 21,6 22,7 @@
  #:use-module (guix records)
  #:export (i686-linux
            x86_64-linux
            x86_64-linux-x32
            i686-mingw
            x86_64-mingw
            i586-gnu))


@@ 41,6 43,14 @@
   (rust-target "x86_64-unknown-linux-gnu")
   (glibc-dynamic-linker "/lib/ld-linux-x86-64.so.2")))

(define x86_64-linux-x32
  (platform
   (target "x86_64-linux-gnux32")
   (system #f)
   (linux-architecture "x86_64")
   (rust-target "x86_64-unknown-linux-gnux32")
   (glibc-dynamic-linker "/lib/ld-linux-x32.so.2")))

(define i686-mingw
  (platform
   (target "i686-w64-mingw32")

M guix/read-print.scm => guix/read-print.scm +1 -0
@@ 46,6 46,7 @@
            page-break
            page-break?

            <comment>
            comment
            comment?
            comment->string

M guix/scripts/import/crate.scm => guix/scripts/import/crate.scm +22 -2
@@ 5,6 5,7 @@
;;; Copyright © 2019, 2020 Martin Becze <mjbecze@riseup.net>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com>
;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 47,6 48,13 @@
Import and convert the crates.io package for PACKAGE-NAME.\n"))
  (display (G_ "
  -r, --recursive        import packages recursively"))
  (display (G_ "
      --recursive-dev-dependencies
                         include dev-dependencies recursively"))
  (display (G_ "
      --allow-yanked
                         allow importing yanked crates if no alternative
                         satisfying the version requirement exists"))
  (newline)
  (display (G_ "
  -h, --help             display this help and exit"))


@@ 67,6 75,12 @@ Import and convert the crates.io package for PACKAGE-NAME.\n"))
         (option '(#\r "recursive") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'recursive #t result)))
         (option '("recursive-dev-dependencies") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'recursive-dev-dependencies #t result)))
         (option '("allow-yanked") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'allow-yanked #t result)))
         %standard-import-options))




@@ 92,8 106,14 @@ Import and convert the crates.io package for PACKAGE-NAME.\n"))
         (package-name->name+version spec))

       (match (if (assoc-ref opts 'recursive)
                  (crate-recursive-import name #:version version)
                  (crate->guix-package name #:version version #:include-dev-deps? #t))
                  (crate-recursive-import
                   name #:version version
                   #:recursive-dev-dependencies?
                   (assoc-ref opts 'recursive-dev-dependencies)
                   #:allow-yanked? (assoc-ref opts 'allow-yanked))
                  (crate->guix-package
                   name #:version version #:include-dev-deps? #t
                   #:allow-yanked? (assoc-ref opts 'allow-yanked)))
         ((or #f '())
          (leave (G_ "failed to download meta-data for package '~a'~%")
                 (if version

M guix/scripts/pack.scm => guix/scripts/pack.scm +71 -17
@@ 8,6 8,8 @@
;;; Copyright © 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020 Eric Bavier <bavier@posteo.net>
;;; Copyright © 2022 Alex Griffin <a@ajgrf.com>
;;; Copyright © 2023 Graham James Addis <graham@addis.org.uk>
;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 47,6 49,7 @@
  #:use-module (guix scripts build)
  #:use-module (guix transformations)
  #:use-module ((guix self) #:select (make-config.scm))
  #:use-module ((guix docker) #:select (%docker-image-max-layers))
  #:use-module (gnu compression)
  #:use-module (gnu packages)
  #:use-module (gnu packages bootstrap)


@@ 202,6 205,16 @@ target the profile's @file{bin/env} file:
     (leave (G_ "~a: invalid symlink specification~%")
            arg))))

(define (entry-point-argument-spec-option-parser opt name arg result)
  "A SRFI-37 option parser for the --entry-point-argument option. The spec
takes multiple occurrences. The entries are used in the exec form for the
docker entry-point. The values are used as parameters in conjunction with the
--entry-point option which is used as the first value in the exec form."
  (let ((entry-point-argument (assoc-ref result 'entry-point-argument)))
    (alist-cons 'entry-point-argument
                (append entry-point-argument (list arg))
                (alist-delete 'entry-point-argument result eq?))))

(define (set-utf8-locale profile)
  "Configure the environment to use the \"en_US.utf8\" locale provided by the
GLIBC-UT8-LOCALES package."


@@ 506,12 519,15 @@ added to the pack."
                       localstatedir?
                       (symlinks '())
                       (archiver tar)
                       (extra-options '()))
  "Return a derivation to construct a Docker image of PROFILE.  The
image is a tarball conforming to the Docker Image Specification, compressed
with COMPRESSOR.  It can be passed to 'docker load'.  If TARGET is true, it
must a be a GNU triplet and it is used to derive the architecture metadata in
the image.  EXTRA-OPTIONS may contain the IMAGE-TAG keyword argument."
                       (extra-options '())
                       max-layers)
  "Return a derivation to construct a Docker image of PROFILE.  The image is a
tarball conforming to the Docker Image Specification, compressed with
COMPRESSOR.  It can be passed to 'docker load'.  If TARGET is true, it must a
be a GNU triplet and it is used to derive the architecture metadata in the
image.  EXTRA-OPTIONS may contain the IMAGE-TAG keyword argument.  If
MAX-LAYERS is not false, the image will be splitted in up to MAX-LAYERS
layers."
  (define database
    (and localstatedir?
         (file-append (store-database (list profile))


@@ 562,10 578,28 @@ the image.  EXTRA-OPTIONS may contain the IMAGE-TAG keyword argument."
              `((directory "/tmp" ,(getuid) ,(getgid) #o1777)
                ,@(append-map symlink->directives '#$symlinks)))

            (setenv "PATH" #+(file-append archiver "/bin"))
            (define (form-entry-point prefix entry-point entry-point-argument)
              ;; Construct entry-point parameter for build-docker-image.  The
              ;; first entry is constructed by prefixing the entry-point with
              ;; the supplied index, subsequent entries are taken from the
              ;; --entry-point-argument options.
              (and=> entry-point
                     (lambda (entry-point)
                       (cons* (string-append prefix "/" entry-point)
                              entry-point-argument))))

            (setenv "PATH"
                    (string-join `(#+(file-append archiver "/bin")
                                   #+@(if max-layers
                                          (list (file-append gzip "/bin"))
                                          '()))
                                 ":"))

            (let-keywords '#$extra-options #f
                          ((image-tag #f))
                          ((image-tag #f)
                           (entry-point-argument #f)
                           (max-layers #f))

              (build-docker-image #$output
                                  (map store-info-item
                                       (call-with-input-file "profile"


@@ 578,16 612,16 @@ the image.  EXTRA-OPTIONS may contain the IMAGE-TAG keyword argument."
                                  #:database #+database
                                  #:system (or #$target %host-type)
                                  #:environment environment
                                  #:entry-point
                                  #$(and entry-point
                                         #~(list
                                            (string-append #$profile "/"
                                                           #$entry-point)))
                                  #:entry-point (form-entry-point
                                                 #$profile
                                                 #$entry-point
                                                 entry-point-argument)
                                  #:extra-files directives
                                  #:compressor
                                  #+(compressor-command compressor)
                                  #:creation-time
                                  (make-time time-utc 0 1)))))))
                                  (make-time time-utc 0 1)
                                  #:max-layers max-layers))))))

  (gexp->derivation (string-append name ".tar"
                                   (compressor-extension compressor))


@@ 1264,6 1298,8 @@ last resort for relocation."
    (debug . 0)
    (verbosity . 1)
    (symlinks . ())
    (entry-point-argument . ())
    (max-layers . ,%docker-image-max-layers)
    (compressor . ,(first %compressors))))

(define %formats


@@ 1299,7 1335,13 @@ last resort for relocation."
                   rest))))

(define %docker-format-options
  (list (required-option 'image-tag)))
  (list (required-option 'image-tag)
        (option '(#\A "entry-point-argument") #t #f
                entry-point-argument-spec-option-parser)
        (option '("max-layers") #t #f
                (lambda (opt name arg result)
                  (alist-cons 'max-layers (string->number* arg)
                              result)))))

(define (show-docker-format-options)
  (display (G_ "


@@ 1308,7 1350,15 @@ last resort for relocation."
(define (show-docker-format-options/detailed)
  (display (G_ "
      --image-tag=NAME
                         Use the given NAME for the Docker image repository"))
                         Use the given NAME for the Docker image repository

      -A, --entry-point-argument=COMMAND/PARAMETER
                         Value(s) to use for the Docker ENTRYPOINT arguments.
                         Multiple instances are accepted. This is only valid
                         in conjunction with the --entry-point option

      --max-layers=N
                         Number of image layers"))
  (newline)
  (exit 0))



@@ 1619,7 1669,11 @@ Create a bundle of PACKAGE.\n"))
                   (extra-options (match pack-format
                                    ('docker
                                     (list #:image-tag
                                           (assoc-ref opts 'image-tag)))
                                           (assoc-ref opts 'image-tag)
                                           #:entry-point-argument
                                           (assoc-ref opts 'entry-point-argument)
                                           #:max-layers
                                           (assoc-ref opts 'max-layers)))
                                    ('deb
                                     (list #:control-file
                                           (process-file-arg opts 'control-file)

M guix/scripts/system.scm => guix/scripts/system.scm +29 -2
@@ 58,6 58,7 @@
  #:use-module (guix scripts system reconfigure)
  #:use-module (guix build utils)
  #:use-module (guix progress)
  #:use-module ((guix docker) #:select (%docker-image-max-layers))
  #:use-module (gnu build image)
  #:use-module (gnu build install)
  #:autoload   (gnu build file-systems)


@@ 1053,6 1054,8 @@ Some ACTIONS support additional ARGS.\n"))
  (newline)
  (show-native-build-options-help)
  (newline)
  (show-docker-format-options)
  (newline)
  (display (G_ "
  -h, --help             display this help and exit"))
  (display (G_ "


@@ 1060,12 1063,21 @@ Some ACTIONS support additional ARGS.\n"))
  (newline)
  (show-bug-report-information))

(define %docker-format-options
  (list (option '("max-layers") #t #f
                 (lambda (opt name arg result)
                   (alist-cons 'max-layers (string->number* arg)
                               result)))))

(define %options
  ;; Specifications of the command-line options.
  (cons* (option '(#\h "help") #f #f
                 (lambda args
                   (leave-on-EPIPE (show-help))
                   (exit 0)))
         (option '("help-docker-format") #f #f
                 (lambda args
                   (show-docker-format-options/detailed)))
         (option '(#\V "version") #f #f
                 (lambda args
                   (show-version-and-exit "guix system")))


@@ 1154,7 1166,8 @@ Some ACTIONS support additional ARGS.\n"))
                   (alist-cons 'list-installed (or arg "") result)))
         (append %standard-build-options
                 %standard-cross-build-options
                 %standard-native-build-options)))
                 %standard-native-build-options
                 %docker-format-options)))

(define %default-options
  ;; Alist of default option values.


@@ 1175,7 1188,8 @@ Some ACTIONS support additional ARGS.\n"))
    (label . #f)
    (volatile-image-root? . #f)
    (volatile-vm-root? . #t)
    (graph-backend . "graphviz")))
    (graph-backend . "graphviz")
    (max-layers . ,%docker-image-max-layers)))

(define (verbosity-level opts)
  "Return the verbosity level based on OPTS, the alist of parsed options."


@@ 1183,6 1197,17 @@ Some ACTIONS support additional ARGS.\n"))
      (if (eq? (assoc-ref opts 'action) 'build)
          3 1)))

(define (show-docker-format-options)
  (display (G_ "
      --help-docker-format list options specific to the docker image type.")))

(define (show-docker-format-options/detailed)
  (display (G_ "
      --max-layers=N
                         Number of image layers"))
  (newline)
  (exit 0))


;;;
;;; Entry point.


@@ 1245,6 1270,7 @@ resulting from command-line parsing."
                                           ((docker-image) docker-image-type)
                                           (else image-type)))
                            (image-size (assoc-ref opts 'image-size))
                            (image-max-layers (assoc-ref opts 'max-layers))
                            (volatile?
                             (assoc-ref opts 'volatile-image-root?))
                            (shared-network?


@@ 1258,6 1284,7 @@ resulting from command-line parsing."
                                      (image-with-label base-image label)
                                      base-image))
                         (size image-size)
                         (max-layers image-max-layers)
                         (volatile-root? volatile?)
                         (shared-network? shared-network?))))
         (os          (or (image-operating-system image)

M guix/ui.scm => guix/ui.scm +2 -2
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2012-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013, 2018 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2014 Cyril Roelandt <tipecaml@gmail.com>


@@ 555,7 555,7 @@ See the \"Application Setup\" section in the manual, for more info.\n"))
  (leave-on-EPIPE
   (simple-format #t "~a (~a) ~a~%"
                  command %guix-package-name %guix-version)
   (format #t "Copyright ~a 2023 ~a"
   (format #t "Copyright ~a 2024 ~a"
           ;; TRANSLATORS: Translate "(C)" to the copyright symbol
           ;; (C-in-a-circle), if this symbol is available in the user's
           ;; locale.  Otherwise, do not translate "(C)"; leave it as-is.  */

M guix/utils.scm => guix/utils.scm +11 -1
@@ 7,7 7,7 @@
;;; Copyright © 2015 David Thompson <davet@gnu.org>
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2018, 2020 Marius Bakke <marius@gnu.org>
;;; Copyright © 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2020, 2021, 2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2020, 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>


@@ 97,6 97,7 @@
            target-x86-32?
            target-x86-64?
            target-x86?
            target-x32?
            target-arm32?
            target-aarch64?
            target-arm?


@@ 634,6 635,8 @@ returned by `config.guess'."
                       (else triplet))))
    (cond ((string-match "^arm[^-]*-([^-]+-)?linux-gnueabihf" triplet)
           "armhf-linux")
          ;; Otherwise it will show up as x86_64-linux... which isn't wrong.
          ((string-match "x86_64-linux-gnux32" triplet) "x86_64-linux-gnux32")
          ((string-match "^([^-]+)-([^-]+-)?linux-gnu.*" triplet)
           =>
           (lambda (m)


@@ 710,6 713,13 @@ a character other than '@'."
architecture (x86_64)?"
  (string-prefix? "x86_64-" target))

(define* (target-x32? #:optional (target (or (%current-target-system)
                                             (%current-system))))
  "Is the architecture of TARGET a variant of Intel/AMD's 64-bit
architecture (x86_64) using 32-bit data types?"
  (and (target-x86-64? target)
       (string-suffix? "gnux32" target)))

(define* (target-x86? #:optional (target (or (%current-target-system)
                                             (%current-system))))
  (or (target-x86-32? target) (target-x86-64? target)))

M nix/libstore/globals.cc => nix/libstore/globals.cc +2 -2
@@ 32,8 32,8 @@ Settings::Settings()
    buildCores = 1;
    readOnlyMode = false;
    thisSystem = SYSTEM;
    maxSilentTime = 0;
    buildTimeout = 0;
    maxSilentTime = 3600;
    buildTimeout = 3600 * 24;
    useBuildHook = true;
    printBuildTrace = false;
    multiplexedBuildOutput = false;

M tests/crate.scm => tests/crate.scm +505 -71
@@ 4,6 4,7 @@
;;; Copyright © 2019, 2020, 2022 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 24,7 25,10 @@
  #:use-module (guix import crate)
  #:use-module (guix base32)
  #:use-module (guix build-system cargo)
  #:use-module (gcrypt hash)
  #:use-module ((gcrypt hash)
                #:select ((sha256 . gcrypt-sha256)))
  #:use-module (guix packages)
  #:use-module (guix read-print)
  #:use-module (guix tests)
  #:use-module (gnu packages)
  #:use-module (ice-9 iconv)


@@ 37,13 41,18 @@
;; foo-1.0.0
;; foo-1.0.3
;; 	leaf-alice 0.7.5
;; bar-1.0.0
;;      leaf-bob   3.0.1
;;      leaf-bob   3.0.2 (dev-dependency)
;;      leaf-bob   4.0.0 (dev-dependency)
;;
;; root-1.0.0
;; root-1.0.4
;; 	intermediate-a  1.0.42
;; 	intermeidate-b ^1.0.0
;; 	intermediate-a 1.0.42
;; 	intermediate-b ^1.0.0
;; 	leaf-alice     ^0.7
;; 	leaf-bob     ^3
;; 	leaf-bob       ^3
;; 	intermediate-c 1 (dev-dependency)
;;
;; intermediate-a-1.0.40
;; intermediate-a-1.0.42


@@ 55,10 64,15 @@
;; intermediate-b-1.2.3
;; 	leaf-bob	3.0.1
;;
;; intermediate-c-1.0.1
;;      leaf-alice      0.7.5 (dev-dependency)
;;
;; leaf-alice-0.7.3
;; leaf-alice-0.7.5
;;
;; leaf-bob-3.0.1
;; leaf-bob-3.0.2 (yanked)
;; leaf-bob-4.0.0 (yanked)


(define test-foo-crate


@@ 111,6 125,50 @@
  ]
}")

(define test-bar-crate
  "{
  \"crate\": {
    \"max_version\": \"1.0.0\",
    \"name\": \"bar\",
    \"description\": \"summary\",
    \"homepage\": \"http://example.com\",
    \"repository\": \"http://example.com\",
    \"keywords\": [\"dummy\", \"test\"],
    \"categories\": [\"test\"],
    \"actual_versions\": [
      { \"id\": 234100,
        \"num\": \"1.0.0\",
        \"license\": \"MIT OR Apache-2.0\",
        \"links\": {
          \"dependencies\": \"/api/v1/crates/bar/1.0.0/dependencies\"
        },
        \"yanked\": false
      }
    ]
  }
}")

(define test-bar-dependencies
  "{
  \"dependencies\": [
     {
       \"crate_id\": \"leaf-bob\",
       \"kind\": \"normal\",
       \"req\": \"3.0.1\"
     },
     {
       \"crate_id\": \"leaf-bob\",
       \"kind\": \"dev\",
       \"req\": \"^3.0.2\"
     },
     {
       \"crate_id\": \"leaf-bob\",
       \"kind\": \"dev\",
       \"req\": \"^4.0.0\"
     }
  ]
}")

(define test-root-crate
  "{
  \"crate\": {


@@ 164,6 222,11 @@
       \"crate_id\": \"leaf-bob\",
       \"kind\": \"normal\",
       \"req\": \"^3\"
     },
     {
       \"crate_id\": \"intermediate-c\",
       \"kind\": \"dev\",
       \"req\": \"1\"
     }
  ]
}")


@@ 262,6 325,40 @@
  ]
}")

(define test-intermediate-c-crate
  "{
  \"crate\": {
    \"max_version\": \"1.0.1\",
    \"name\": \"intermediate-c\",
    \"description\": \"summary\",
    \"homepage\": \"http://example.com\",
    \"repository\": \"http://example.com\",
    \"keywords\": [\"dummy\", \"test\"],
    \"categories\": [\"test\"],
    \"actual_versions\": [
      { \"id\": 234290,
        \"num\": \"1.0.1\",
        \"license\": \"MIT OR Apache-2.0\",
        \"links\": {
          \"dependencies\": \"/api/v1/crates/intermediate-c/1.0.1/dependencies\"
        },
        \"yanked\": false
      }
    ]
  }
}")

(define test-intermediate-c-dependencies
  "{
  \"dependencies\": [
     {
       \"crate_id\": \"leaf-alice\",
       \"kind\": \"dev\",
       \"req\": \"0.7.5\"
     }
  ]
}")

(define test-leaf-alice-crate
  "{
  \"crate\": {


@@ 316,6 413,22 @@
          \"dependencies\": \"/api/v1/crates/leaf-bob/3.0.1/dependencies\"
        },
        \"yanked\": false
      },
      { \"id\": 234281,
        \"num\": \"3.0.2\",
        \"license\": \"MIT OR Apache-2.0\",
        \"links\": {
          \"dependencies\": \"/api/v1/crates/leaf-bob/3.0.2/dependencies\"
        },
        \"yanked\": true
      },
      { \"id\": 234282,
        \"num\": \"4.0.0\",
        \"license\": \"MIT OR Apache-2.0\",
        \"links\": {
          \"dependencies\": \"/api/v1/crates/leaf-bob/4.0.0/dependencies\"
        },
        \"yanked\": true
      }
    ]
  }


@@ 355,7 468,7 @@
             ("https://crates.io/api/v1/crates/foo/1.0.3/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/foo/1.0.3/dependencies"
              (open-input-string test-foo-dependencies))


@@ 364,7 477,7 @@
             ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/dependencies"
              (open-input-string test-leaf-alice-dependencies))


@@ 398,7 511,7 @@
           (pk 'fail x #f)))))

(unless have-guile-semver? (test-skip 1))
(test-assert "cargo-recursive-import"
(test-assert "crate-recursive-import"
  ;; Replace network resources with sample data.
  (mock ((guix http-client) http-fetch
         (lambda (url . rest)


@@ 408,7 521,7 @@
             ("https://crates.io/api/v1/crates/root/1.0.4/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/root/1.0.4/dependencies"
              (open-input-string test-root-dependencies))


@@ 417,7 530,7 @@
             ("https://crates.io/api/v1/crates/intermediate-a/1.0.42/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/intermediate-a/1.0.42/dependencies"
              (open-input-string test-intermediate-a-dependencies))


@@ 426,16 539,25 @@
             ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/dependencies"
              (open-input-string test-intermediate-b-dependencies))
             ("https://crates.io/api/v1/crates/intermediate-c"
              (open-input-string test-intermediate-c-crate))
             ("https://crates.io/api/v1/crates/intermediate-c/1.0.1/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/intermediate-c/1.0.1/dependencies"
              (open-input-string test-intermediate-c-dependencies))
             ("https://crates.io/api/v1/crates/leaf-alice"
              (open-input-string test-leaf-alice-crate))
             ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/dependencies"
              (open-input-string test-leaf-alice-dependencies))


@@ 444,7 566,7 @@
             ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/dependencies"
              (open-input-string test-leaf-bob-dependencies))


@@ 452,7 574,27 @@
        (match (crate-recursive-import "root")
          ;; rust-intermediate-b has no dependency on the rust-leaf-alice
          ;; package, so this is a valid ordering
          (((define-public 'rust-leaf-alice-0.7
          (((define-public 'rust-intermediate-c-1
              (package
                (name "rust-intermediate-c")
                (version "1.0.1")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "intermediate-c" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (build-system cargo-build-system)
                (arguments
                 ('quasiquote (#:skip-build? #t)))
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-leaf-alice-0.7
              (package
                (name "rust-leaf-alice")
                (version "0.7.5")


@@ 563,10 705,157 @@
                                ("rust-leaf-alice"
                                 ('unquote 'rust-leaf-alice-0.7))
                                ("rust-leaf-bob"
                                 ('unquote rust-leaf-bob-3)))
                               #:cargo-development-inputs
                               (("rust-intermediate-c"
                                 ('unquote rust-intermediate-c-1))))))
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0)))))
           #t)
          (x
           (pk 'fail x #f)))
        (match (crate-recursive-import "root"
                                       #:recursive-dev-dependencies? #t)
          ;; rust-intermediate-b has no dependency on the rust-leaf-alice
          ;; package, so this is a valid ordering
          (((define-public 'rust-intermediate-c-1
              (package
                (name "rust-intermediate-c")
                (version "1.0.1")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "intermediate-c" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (build-system cargo-build-system)
                (arguments
                 ('quasiquote (#:cargo-development-inputs
                               (("rust-leaf-alice"
                                 ('unquote rust-leaf-alice-0.7))))))
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-leaf-alice-0.7
              (package
                (name "rust-leaf-alice")
                (version "0.7.5")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "leaf-alice" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (build-system cargo-build-system)
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-leaf-bob-3
              (package
                (name "rust-leaf-bob")
                (version "3.0.1")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "leaf-bob" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (build-system cargo-build-system)
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-intermediate-b-1
              (package
                (name "rust-intermediate-b")
                (version "1.2.3")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "intermediate-b" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (build-system cargo-build-system)
                (arguments
                 ('quasiquote (#:cargo-inputs
                               (("rust-leaf-bob"
                                 ('unquote rust-leaf-bob-3))))))
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-intermediate-a-1
              (package
                (name "rust-intermediate-a")
                (version "1.0.42")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "intermediate-a" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (build-system cargo-build-system)
                (arguments
                 ('quasiquote (#:cargo-inputs
                               (("rust-intermediate-b"
                                 ('unquote rust-intermediate-b-1))
                                ("rust-leaf-alice"
                                 ('unquote 'rust-leaf-alice-0.7))
                                ("rust-leaf-bob"
                                 ('unquote rust-leaf-bob-3))))))
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-root-1
              (package
                (name "rust-root")
                (version "1.0.4")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "root" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (build-system cargo-build-system)
                (arguments
                 ('quasiquote (#:cargo-inputs
                               (("rust-intermediate-a"
                                 ('unquote rust-intermediate-a-1))
                                ("rust-intermediate-b"
                                 ('unquote rust-intermediate-b-1))
                                ("rust-leaf-alice"
                                 ('unquote 'rust-leaf-alice-0.7))
                                ("rust-leaf-bob"
                                 ('unquote rust-leaf-bob-3)))
                               #:cargo-development-inputs
                               (("rust-intermediate-c"
                                 ('unquote rust-intermediate-c-1))))))
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0)))))
           #t)
          (x


@@ 594,69 883,209 @@



(define test-doctool-crate
  "{
  \"crate\": {
    \"max_version\": \"2.2.2\",
    \"name\": \"leaf-bob\",
    \"description\": \"summary\",
    \"homepage\": \"http://example.com\",
    \"repository\": \"http://example.com\",
    \"keywords\": [\"dummy\", \"test\"],
    \"categories\": [\"test\"]
    \"actual_versions\": [
      { \"id\": 234280,
        \"num\": \"2.2.2\",
        \"license\": \"MIT OR Apache-2.0\",
        \"links\": {
          \"dependencies\": \"/api/v1/crates/doctool/2.2.2/dependencies\"
        },
        \"yanked\": false
      }
    ]
  }
}")
(define rust-leaf-bob-3
  (package
    (name "rust-leaf-bob")
    (version "3.0.1")
    (source #f)
    (build-system #f)
    (home-page #f)
    (synopsis #f)
    (description #f)
    (license #f)))

;; FIXME: This test depends on some existing packages
(define test-doctool-dependencies
  "{
  \"dependencies\": [
     {
       \"crate_id\": \"docopt\",
       \"kind\": \"normal\",
       \"req\": \"^0.8.1\"
     }
  ]
}")
(define rust-leaf-bob-3.0.2-yanked
  (package
    (name "rust-leaf-bob")
    (version "3.0.2")
    (source #f)
    (properties '((crate-version-yanked? . #t)))
    (build-system #f)
    (home-page #f)
    (synopsis #f)
    (description #f)
    (license #f)))


(test-assert "self-test: rust-docopt 0.8.x is gone, please adjust the test case"
  (not (null? (find-packages-by-name "rust-docopt" "0.8"))))
(unless have-guile-semver? (test-skip 1))
(test-assert "crate-recursive-import-honors-existing-packages"
  (mock
   ((gnu packages) find-packages-by-name
    (lambda* (name #:optional version)
      (match name
        ("rust-leaf-bob"
         (list rust-leaf-bob-3 rust-leaf-bob-3.0.2-yanked))
        (_ '()))))
   (mock
    ((guix http-client) http-fetch
     (lambda (url . rest)
       (match url
         ("https://crates.io/api/v1/crates/bar"
          (open-input-string test-bar-crate))
         ("https://crates.io/api/v1/crates/bar/1.0.0/download"
          (set! test-source-hash
                (bytevector->nix-base32-string
                 (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
          (open-input-string "empty file\n"))
         ("https://crates.io/api/v1/crates/bar/1.0.0/dependencies"
          (open-input-string test-bar-dependencies))
         ("https://crates.io/api/v1/crates/leaf-bob"
          (open-input-string test-leaf-bob-crate))
         ("https://crates.io/api/v1/crates/leaf-bob/3.0.2/download"
          (set! test-source-hash
                (bytevector->nix-base32-string
                 (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
          (open-input-string "empty file\n"))
         ("https://crates.io/api/v1/crates/leaf-bob/3.0.2/dependencies"
          (open-input-string test-leaf-bob-dependencies))
         ("https://crates.io/api/v1/crates/leaf-bob/4.0.0/download"
          (set! test-source-hash
                (bytevector->nix-base32-string
                 (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
          (open-input-string "empty file\n"))
         ("https://crates.io/api/v1/crates/leaf-bob/4.0.0/dependencies"
          (open-input-string test-leaf-bob-dependencies))
         (_ (error "Unexpected URL: " url)))))
    (match (crate-recursive-import "bar"
                                   #:allow-yanked? #t)
      (((define-public 'rust-bar-1
          (package
            (name "rust-bar")
            (version "1.0.0")
            (source
             (origin
               (method url-fetch)
               (uri (crate-uri "bar" version))
               (file-name
                (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
                 (?  string? hash)))))
            (build-system cargo-build-system)
            (arguments
             ('quasiquote (#:cargo-inputs
                           (("rust-leaf-bob"
                             ('unquote 'rust-leaf-bob-3)))
                           #:cargo-development-inputs
                           (("rust-leaf-bob"
                             ('unquote 'rust-leaf-bob-3.0.2-yanked))
                            ("rust-leaf-bob"
                             ('unquote 'rust-leaf-bob-4.0.0-yanked))))))
            (home-page "http://example.com")
            (synopsis "summary")
            (description "summary")
            (license (list license:expat license:asl2.0)))))
       #t)
      (x
       (pk 'fail x #f))))))

(unless have-guile-semver? (test-skip 1))
(test-assert "cargo-recursive-import-hoors-existing-packages"
  (mock ((guix http-client) http-fetch
         (lambda (url . rest)
           (match url
             ("https://crates.io/api/v1/crates/doctool"
              (open-input-string test-doctool-crate))
             ("https://crates.io/api/v1/crates/doctool/2.2.2/download"
              (set! test-source-hash
                    (bytevector->nix-base32-string
                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
              (open-input-string "empty file\n"))
             ("https://crates.io/api/v1/crates/doctool/2.2.2/dependencies"
              (open-input-string test-doctool-dependencies))
             (_ (error "Unexpected URL: " url)))))
        (match (crate-recursive-import "doctool")
          (((define-public 'rust-doctool-2
(test-assert "crate-import-only-yanked-available"
  (mock
   ((guix http-client) http-fetch
    (lambda (url . rest)
      (match url
        ("https://crates.io/api/v1/crates/bar"
         (open-input-string test-bar-crate))
        ("https://crates.io/api/v1/crates/bar/1.0.0/download"
         (set! test-source-hash
               (bytevector->nix-base32-string
                (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
         (open-input-string "empty file\n"))
        ("https://crates.io/api/v1/crates/bar/1.0.0/dependencies"
         (open-input-string test-bar-dependencies))
        ("https://crates.io/api/v1/crates/leaf-bob"
         (open-input-string test-leaf-bob-crate))
        ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/download"
         (set! test-source-hash
               (bytevector->nix-base32-string
                (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
         (open-input-string "empty file\n"))
        ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/dependencies"
         (open-input-string test-leaf-bob-dependencies))
        ("https://crates.io/api/v1/crates/leaf-bob/3.0.2/download"
         (set! test-source-hash
               (bytevector->nix-base32-string
                (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
         (open-input-string "empty file\n"))
        ("https://crates.io/api/v1/crates/leaf-bob/3.0.2/dependencies"
         (open-input-string test-leaf-bob-dependencies))
        ("https://crates.io/api/v1/crates/leaf-bob/4.0.0/download"
         (set! test-source-hash
               (bytevector->nix-base32-string
                (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
         (open-input-string "empty file\n"))
        ("https://crates.io/api/v1/crates/leaf-bob/4.0.0/dependencies"
         (open-input-string test-leaf-bob-dependencies))
        (_ (error "Unexpected URL: " url)))))
        (match (crate-recursive-import "bar"
                                       #:recursive-dev-dependencies? #t
                                       #:allow-yanked? #t)
          (((define-public 'rust-leaf-bob-4.0.0-yanked
              (package
                (name "rust-leaf-bob")
                (version "4.0.0")
                ($ <comment> "; This version was yanked!\n" #t)
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "leaf-bob" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (properties ('quote (('crate-version-yanked? . #t))))
                (build-system cargo-build-system)
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-leaf-bob-3.0.2-yanked
              (package
                (name "rust-doctool")
                (version "2.2.2")
                (name "rust-leaf-bob")
                (version "3.0.2")
                ($ <comment> "; This version was yanked!\n" #t)
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "leaf-bob" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (properties ('quote (('crate-version-yanked? . #t))))
                (build-system cargo-build-system)
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-leaf-bob-3
              (package
                (name "rust-leaf-bob")
                (version "3.0.1")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "doctool" version))
                   (uri (crate-uri "leaf-bob" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256
                    (base32
                     (?  string? hash)))))
                (build-system cargo-build-system)
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0))))
            (define-public 'rust-bar-1
              (package
                (name "rust-bar")
                (version "1.0.0")
                (source
                 (origin
                   (method url-fetch)
                   (uri (crate-uri "bar" version))
                   (file-name
                    (string-append name "-" version ".tar.gz"))
                   (sha256


@@ 665,14 1094,19 @@
                (build-system cargo-build-system)
                (arguments
                 ('quasiquote (#:cargo-inputs
                               (("rust-docopt"
                                 ('unquote 'rust-docopt-0.8))))))
                               (("rust-leaf-bob"
                                 ('unquote 'rust-leaf-bob-3)))
                               #:cargo-development-inputs
                               (("rust-leaf-bob"
                                 ('unquote 'rust-leaf-bob-3.0.2-yanked))
                                ("rust-leaf-bob"
                                 ('unquote 'rust-leaf-bob-4.0.0-yanked))))))
                (home-page "http://example.com")
                (synopsis "summary")
                (description "summary")
                (license (list license:expat license:asl2.0)))))
            #t)
          (x
           (pk 'fail x #f)))))
           (pk 'fail (pretty-print-with-comments (current-output-port) x) #f)))))

(test-end "crate")

M tests/pack.scm => tests/pack.scm +50 -0
@@ 2,6 2,7 @@
;;; Copyright © 2017-2021, 2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2021, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 29,6 30,7 @@
  #:use-module (guix gexp)
  #:use-module (guix modules)
  #:use-module (guix utils)
  #:use-module ((guix build utils) #:select (%store-directory))
  #:use-module (gnu packages)
  #:use-module ((gnu packages base) #:select (libc-utf8-locales-for-target))
  #:use-module (gnu packages bootstrap)


@@ 251,6 253,54 @@
      (built-derivations (list check))))

  (unless store (test-skip 1))
  (test-assertm "docker-layered-image + localstatedir"
    (mlet* %store-monad
        ((guile (set-guile-for-build (default-guile)))
         (profile -> (profile
                      (content (packages->manifest (list %bootstrap-guile)))
                      (hooks '())
                      (locales? #f)))
         (tarball (docker-image "docker-pack" profile
                                #:symlinks '(("/bin/Guile" -> "bin/guile"))
                                #:localstatedir? #t
                                #:max-layers 100))
         (check (gexp->derivation
                 "check-tarball"
                 (with-imported-modules '((guix build utils))
                   #~(begin
                       (use-modules (guix build utils)
                                    (ice-9 match))

                       (define bin
                         (string-append "." #$profile "/bin"))

                       (define store
                         (string-append "." #$(%store-directory)))

                       (setenv "PATH" (string-append #$%tar-bootstrap "/bin"))
                       (mkdir "base")
                       (with-directory-excursion "base"
                         (invoke "tar" "xvf" #$tarball))

                       (match (find-files "base" "layer.tar")
                         ((layers ...)
                          (for-each (lambda (layer)
                                      (invoke "tar" "xvf" layer)
                                      (invoke "chmod" "--recursive" "u+w" store))
                                    layers)))

                       (when
                           (and (file-exists? (string-append bin "/guile"))
                                (file-exists? "var/guix/db/db.sqlite")
                                (file-is-directory? "tmp")
                                (string=? (string-append #$%bootstrap-guile "/bin")
                                          (readlink bin))
                                (string=? (string-append #$profile "/bin/guile")
                                          (readlink "bin/Guile")))
                         (mkdir #$output)))))))
      (built-derivations (list check))))

  (unless store (test-skip 1))
  (test-assertm "squashfs-image + localstatedir"
    (mlet* %store-monad
        ((guile   (set-guile-for-build (default-guile)))