summary refs log tree commit diff
diff options
context:
space:
mode:
authorLiliana Marie Prikler <liliana.prikler@gmail.com>2024-03-09 22:31:25 +0100
committerLiliana Marie Prikler <liliana.prikler@gmail.com>2024-03-10 00:05:58 +0100
commit2ee54513196bad8e663e78ac695b6ffa0da49051 (patch)
tree4686b32c86fd484da0acfa35da69454659504cf7
parentfe2b2f860e1fd7dfdc333f65893e65f131e290c7 (diff)
parent7b9a23ea315d2b4efde755c3bd0b1db3cacba9c2 (diff)
downloadguix-2ee54513196bad8e663e78ac695b6ffa0da49051.tar.gz
Merge branch 'master' into gnome-team
-rw-r--r--doc/guix.texi459
-rwxr-xr-xetc/teams.scm9
-rw-r--r--gnu/home/services/dotfiles.scm115
-rw-r--r--gnu/local.mk14
-rw-r--r--gnu/packages/admin.scm2
-rw-r--r--gnu/packages/bioconductor.scm27
-rw-r--r--gnu/packages/bioinformatics.scm2
-rw-r--r--gnu/packages/bittorrent.scm17
-rw-r--r--gnu/packages/check.scm14
-rw-r--r--gnu/packages/containers.scm64
-rw-r--r--gnu/packages/cran.scm227
-rw-r--r--gnu/packages/crates-io.scm81
-rw-r--r--gnu/packages/crates-web.scm339
-rw-r--r--gnu/packages/databases.scm78
-rw-r--r--gnu/packages/dezyne.scm6
-rw-r--r--gnu/packages/emacs-xyz.scm49
-rw-r--r--gnu/packages/fonts.scm34
-rw-r--r--gnu/packages/games.scm6
-rw-r--r--gnu/packages/gcc.scm10
-rw-r--r--gnu/packages/gimp.scm94
-rw-r--r--gnu/packages/gnome.scm3
-rw-r--r--gnu/packages/golang-compression.scm52
-rw-r--r--gnu/packages/golang-web.scm60
-rw-r--r--gnu/packages/golang-xyz.scm549
-rw-r--r--gnu/packages/golang.scm282
-rw-r--r--gnu/packages/gtk.scm2
-rw-r--r--gnu/packages/guile-xyz.scm78
-rw-r--r--gnu/packages/haskell-apps.scm4
-rw-r--r--gnu/packages/image-viewers.scm8
-rw-r--r--gnu/packages/ipfs.scm4
-rw-r--r--gnu/packages/java.scm5
-rw-r--r--gnu/packages/kde-plasma.scm4
-rw-r--r--gnu/packages/lisp-xyz.scm66
-rw-r--r--gnu/packages/llvm.scm127
-rw-r--r--gnu/packages/lua.scm4
-rw-r--r--gnu/packages/machine-learning.scm36
-rw-r--r--gnu/packages/markup.scm4
-rw-r--r--gnu/packages/maths.scm10
-rw-r--r--gnu/packages/mc.scm5
-rw-r--r--gnu/packages/messaging.scm88
-rw-r--r--gnu/packages/multiprecision.scm57
-rw-r--r--gnu/packages/package-management.scm43
-rw-r--r--gnu/packages/patches/hubbub-maybe-uninitialized.patch40
-rw-r--r--gnu/packages/patches/libcss-check-format.patch13
-rw-r--r--gnu/packages/patches/libtommath-fix-linkage.patch55
-rw-r--r--gnu/packages/patches/libtommath-integer-overflow.patch140
-rw-r--r--gnu/packages/patches/netsurf-message-timestamp.patch4
-rw-r--r--gnu/packages/patches/podman-program-lookup.patch120
-rw-r--r--gnu/packages/patches/python-3.12-fix-tests.patch334
-rw-r--r--gnu/packages/patches/scribus-1.5.8-poppler-22.03.0.patch52
-rw-r--r--gnu/packages/patches/scribus-1.5.8-poppler-22.04.0.patch291
-rw-r--r--gnu/packages/patches/scribus-1.5.8-poppler-22.09.0.patch20
-rw-r--r--gnu/packages/patches/scribus-1.5.8-poppler-22.2.0-1.patch129
-rw-r--r--gnu/packages/patches/scribus-1.5.8-poppler-22.2.0-2.patch28
-rw-r--r--gnu/packages/patches/sioyek-fix-build.patch82
-rw-r--r--gnu/packages/patchutils.scm4
-rw-r--r--gnu/packages/pdf.scm60
-rw-r--r--gnu/packages/perl6.scm916
-rw-r--r--gnu/packages/photo.scm4
-rw-r--r--gnu/packages/python-compression.scm80
-rw-r--r--gnu/packages/python-xyz.scm73
-rw-r--r--gnu/packages/python.scm387
-rw-r--r--gnu/packages/radio.scm5
-rw-r--r--gnu/packages/rust-apps.scm73
-rw-r--r--gnu/packages/scribus.scm14
-rw-r--r--gnu/packages/shells.scm8
-rw-r--r--gnu/packages/statistics.scm41
-rw-r--r--gnu/packages/telegram.scm107
-rw-r--r--gnu/packages/text-editors.scm4
-rw-r--r--gnu/packages/time.scm25
-rw-r--r--gnu/packages/tor-browsers.scm18
-rw-r--r--gnu/packages/version-control.scm14
-rw-r--r--gnu/packages/video.scm73
-rw-r--r--gnu/packages/vim.scm7
-rw-r--r--gnu/packages/web.scm131
-rw-r--r--gnu/packages/webkit.scm11
-rw-r--r--gnu/packages/wm.scm38
-rw-r--r--gnu/packages/xdisorg.scm4
-rw-r--r--gnu/packages/xiph.scm30
-rw-r--r--gnu/services/virtualization.scm5
-rw-r--r--gnu/system/linux-initrd.scm14
-rw-r--r--guix/build/bzr.scm3
-rw-r--r--guix/build/download-nar.scm12
-rw-r--r--guix/build/download.scm50
-rw-r--r--guix/build/git.scm27
-rw-r--r--guix/build/guile-build-system.scm43
-rw-r--r--guix/build/rakudo-build-system.scm8
-rw-r--r--guix/bzr-download.scm57
-rw-r--r--guix/cpu.scm80
-rw-r--r--guix/cvs-download.scm24
-rw-r--r--guix/download.scm53
-rw-r--r--guix/git-download.scm20
-rw-r--r--guix/hg-download.scm36
-rw-r--r--guix/import/cran.scm1
-rw-r--r--guix/lint.scm151
-rw-r--r--guix/scripts/import/elpa.scm2
-rw-r--r--guix/scripts/perform-download.scm69
-rw-r--r--guix/svn-download.scm88
-rw-r--r--guix/swh.scm71
-rw-r--r--tests/lint.scm20
-rw-r--r--tests/swh.scm74
101 files changed, 4992 insertions, 2489 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index f12f421602..5d7906f57b 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -111,7 +111,7 @@ Copyright @copyright{} 2022 (@*
 Copyright @copyright{} 2022 John Kehayias@*
 Copyright @copyright{} 2022⁠–⁠2023 Bruno Victal@*
 Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@*
-Copyright @copyright{} 2023 Giacomo Leidi@*
+Copyright @copyright{} 2023-2024 Giacomo Leidi@*
 Copyright @copyright{} 2022 Antero Mejr@*
 Copyright @copyright{} 2023 Karl Hallsby@*
 Copyright @copyright{} 2023 Nathaniel Nicandro@*
@@ -358,6 +358,7 @@ Foreign Architectures
 
 System Configuration
 
+* Getting Started with the System:: Your first steps.
 * Using the Configuration System::  Customizing your GNU system.
 * operating-system Reference::  Detail of operating-system declarations.
 * File Systems::                Configuring file system mounts.
@@ -2879,8 +2880,8 @@ unless your configuration specifies otherwise
 @node After System Installation
 @section After System Installation
 
-Success, you've now booted into Guix System!  From then on, you can update the
-system whenever you want by running, say:
+Success, you've now booted into Guix System!  You can upgrade the system
+whenever you want by running:
 
 @example
 guix pull
@@ -2888,24 +2889,10 @@ sudo guix system reconfigure /etc/config.scm
 @end example
 
 @noindent
-This builds a new system generation with the latest packages and services
-(@pxref{Invoking guix system}).  We recommend doing that regularly so that
-your system includes the latest security updates (@pxref{Security Updates}).
-
-@c See <https://lists.gnu.org/archive/html/guix-devel/2019-01/msg00268.html>.
-@quotation Note
-@cindex sudo vs. @command{guix pull}
-Note that @command{sudo guix} runs your user's @command{guix} command and
-@emph{not} root's, because @command{sudo} leaves @env{PATH} unchanged.  To
-explicitly run root's @command{guix}, type @command{sudo -i guix @dots{}}.
-
-The difference matters here, because @command{guix pull} updates
-the @command{guix} command and package definitions only for the user it is run
-as.  This means that if you choose to use @command{guix system reconfigure} in
-root's login shell, you'll need to @command{guix pull} separately.
-@end quotation
+This builds a new system @dfn{generation} with the latest packages and
+services.
 
-Now, @pxref{Getting Started}, and
+Now, @pxref{Getting Started with the System}, and
 join us on @code{#guix} on the Libera Chat IRC network or on
 @email{guix-devel@@gnu.org} to share your experience!
 
@@ -3159,22 +3146,9 @@ sudo guix system reconfigure /etc/config.scm
 @end example
 
 Upon completion, the system runs the latest versions of its software
-packages.  When you eventually reboot, you'll notice a sub-menu in the
-bootloader that reads ``Old system generations'': it's what allows you
-to boot @emph{an older generation of your system}, should the latest
-generation be ``broken'' or otherwise unsatisfying.  Just like for
-packages, you can always @emph{roll back} to a previous generation
-@emph{of the whole system}:
-
-@example
-sudo guix system roll-back
-@end example
-
-There are many things you'll probably want to tweak on your system:
-adding new user accounts, adding new system services, fiddling with the
-configuration of those services, etc.  The system configuration is
-@emph{entirely} described in the @file{/etc/config.scm} file.
-@xref{Using the Configuration System}, to learn how to change it.
+packages.  Just like for packages, you can always @emph{roll back} to a
+previous generation @emph{of the whole system}.  @xref{Getting Started
+with the System}, to learn how to manage your system.
 
 Now you know enough to get started!
 
@@ -3283,7 +3257,7 @@ out to have a serious bug, users may roll back to the previous instance
 of their profile, which was known to work well.  Similarly, the global
 system configuration on Guix is subject to
 transactional upgrades and roll-back
-(@pxref{Using the Configuration System}).
+(@pxref{Getting Started with the System}).
 
 All packages in the package store may be @emph{garbage-collected}.
 Guix can determine which packages are still referenced by user
@@ -17101,6 +17075,7 @@ instantiated.  Then we show how this mechanism can be extended, for
 instance to support new system services.
 
 @menu
+* Getting Started with the System:: Your first steps.
 * Using the Configuration System::  Customizing your GNU system.
 * operating-system Reference::  Detail of operating-system declarations.
 * File Systems::                Configuring file system mounts.
@@ -17121,14 +17096,222 @@ instance to support new system services.
 * Defining Services::           Adding new service definitions.
 @end menu
 
+@node Getting Started with the System
+@section Getting Started
+
+@cindex system configuration file
+@cindex configuration file, of the system
+You're reading this section probably because you have just installed
+Guix System (@pxref{System Installation}) and would like to know where
+to go from here.  If you're already familiar with GNU/Linux system
+administration, the way Guix System is configured is very different from
+what you're used to: you won't install a system service by running
+@command{guix install}, you won't configure services by modifying files
+under @file{/etc}, and you won't create user accounts by invoking
+@command{useradd}; instead, all these aspects are spelled out in a
+@dfn{system configuration file}.
+
+The first step with Guix System is thus to write the @dfn{system
+configuration file}; luckily, system installation already generated one
+for you and stored it under @file{/etc/config.scm}.
+
+@quotation Note
+You can store your system configuration file anywhere you like---it
+doesn't have to be at @file{/etc/config.scm}.  It's a good idea to keep
+it under version control, for instance in a
+@uref{https://git-scm.com/book/en/, Git repository}.
+@end quotation
+
+The @emph{entire} configuration of the system---user accounts, system
+services, timezone, locale settings---is declared in this file, which
+follows this template:
+
+@lisp
+(use-modules (gnu))
+(use-package-modules @dots{})
+(use-service-modules @dots{})
+
+(operating-system
+  (host-name @dots{})
+  (timezone @dots{})
+  (locale @dots{})
+  (bootloader @dots{})
+  (file-systems @dots{})
+  (users @dots{})
+  (packages @dots{})
+  (services @dots{}))
+@end lisp
+
+This configuration file is in fact a Scheme program; the first lines
+pull in modules providing variables you might need in the rest of the
+file---e.g., packages, services, etc.  The @code{operating-system} form
+declares the system configuration as a @dfn{record} with a number of
+@dfn{fields}.  @xref{Using the Configuration System}, to view complete
+examples and learn what to put in there.
+
+The second step, once you have this configuration file, is to test it.
+Of course, you can skip this step if you're feeling lucky---you choose!
+To do that, pass your configuration file to @command{guix system vm} (no
+need to be root, you can do that as a regular user):
+
+@example
+guix system vm /etc/config.scm
+@end example
+
+@noindent
+This command returns the name of a shell script that starts a virtual
+machine (VM) running the system @emph{as described in the configuration
+file}:
+
+@example
+/gnu/store/@dots{}-run-vm.sh
+@end example
+
+@noindent
+In this VM, you can log in as @code{root} with no password.  That's a
+good way to check that your configuration file is correct and that it
+gives the expected result, without touching your system.  @xref{Invoking
+guix system}, for more information.
+
+@quotation Note
+When using @command{guix system vm}, aspects tied to your hardware such
+as file systems and mapped devices are overridden because they cannot be
+meaningfully tested in the VM@.  Other aspects such as static network
+configuration (@pxref{Networking Setup,
+@code{static-networking-service-type}}) are @emph{not} overridden but
+they may not work inside the VM@.
+@end quotation
+
+@cindex system instantiation
+@cindex reconfiguring the system
+The third step, once you're happy with your configuration, is to
+@dfn{instantiate} it---make this configuration effective on your system.
+To do that, run:
+
+@example
+sudo guix system reconfigure /etc/config.scm
+@end example
+
+@cindex upgrading system services
+@cindex system services, upgrading
+@noindent
+This operation is @dfn{transactional}: either it succeeds and you end up
+with an upgraded system, or it fails and nothing has changed.  Note that
+it does @emph{not} restart system services that were already running.
+Thus, to upgrade those services, you have to reboot or to explicitly
+restart them; for example, to restart the secure shell (SSH) daemon, you
+would run:
+
+@example
+sudo herd restart sshd
+@end example
+
+@quotation Note
+System services are managed by the Shepherd (@pxref{Jump Start,,,
+shepherd, The GNU Shepherd Manual}).  The @code{herd} command lets you
+inspect, start, and stop services.  To view the status of services, run:
+
+@example
+sudo herd status
+@end example
+
+To view detailed information about a given service, add its name to the
+command:
+
+@example
+sudo herd status sshd
+@end example
+
+@xref{Services}, for more information.
+@end quotation
+
+@cindex provenance, of the system
+The system records its @dfn{provenance}---the configuration file and
+channels that were used to deploy it.  You can view it like so:
+
+@example
+guix system describe
+@end example
+
+Additionally, @command{guix system reconfigure} preserves previous
+system generations, which you can list:
+
+@example
+guix system list-generations
+@end example
+
+@noindent
+@cindex roll back, for the system
+Crucially, that means that you can always @emph{roll back} to an earlier
+generation should something go wrong!  When you eventually reboot,
+you'll notice a sub-menu in the bootloader that reads ``Old system
+generations'': it's what allows you to boot @emph{an older generation of
+your system}, should the latest generation be ``broken'' or otherwise
+unsatisfying.  You can also ``permanently'' roll back, like so:
+
+@example
+sudo guix system roll-back
+@end example
+
+@noindent
+Alternatively, you can use @command{guix system switch-generation} to
+switch to a specific generation.
+
+Once in a while, you'll want to delete old generations that you do not
+need anymore to allow @dfn{garbage collection} to free space
+(@pxref{Invoking guix gc}).  For example, to remove generations older
+than 4 months, run:
+
+@example
+sudo guix system delete-generations 4m
+@end example
+
+From there on, anytime you want to change something in the system
+configuration, be it adding a user account or changing parameters of a
+service, you will first update your configuration file and then run
+@command{guix system reconfigure} as shown above.
+@cindex upgrade, of the system
+Likewise, to @emph{upgrade} system software, you first fetch an
+up-to-date Guix and then reconfigure your system with that new Guix:
+
+@example
+guix pull
+sudo guix system reconfigure /etc/config.scm
+@end example
+
+@noindent
+We recommend doing that regularly so that your system includes the
+latest security updates (@pxref{Security Updates}).
+
+@c See <https://lists.gnu.org/archive/html/guix-devel/2019-01/msg00268.html>.
+@quotation Note
+@cindex sudo vs. @command{guix pull}
+@command{sudo guix} runs your user's @command{guix} command and
+@emph{not} root's, because @command{sudo} leaves @env{PATH} unchanged.
+
+The difference matters here, because @command{guix pull} updates
+the @command{guix} command and package definitions only for the user it is run
+as.  This means that if you choose to use @command{guix system reconfigure} in
+root's login shell, you'll need to @command{guix pull} separately.
+@end quotation
+
+That's it!  If you're getting started with Guix entirely,
+@pxref{Getting Started}.  The next sections dive in more detail into the
+crux of the matter: system configuration.
+
 @node Using the Configuration System
 @section Using the Configuration System
 
+The previous section showed the overall workflow you would follow when
+administering a Guix System machine (@pxref{Getting Started with the
+System}).  Let's now see in more detail what goes into the system
+configuration file.
+
 The operating system is configured by providing an
 @code{operating-system} declaration in a file that can then be passed to
-the @command{guix system} command (@pxref{Invoking guix system}).  A
-simple setup, with the default Linux-Libre
-kernel, initial RAM disk, and a couple of system services added to those
+the @command{guix system} command (@pxref{Invoking guix system}), as
+we've seen before.  A simple setup, with the default Linux-Libre kernel,
+initial RAM disk, and a couple of system services added to those
 provided by default looks like this:
 
 @findex operating-system
@@ -17136,8 +17319,8 @@ provided by default looks like this:
 @include os-config-bare-bones.texi
 @end lisp
 
-The configuration is declarative and hopefully mostly self-describing.
-It is actually code in the Scheme programming language; the whole
+The configuration is declarative.
+It is code in the Scheme programming language; the whole
 @code{(operating-system @dots{})} expression produces a @dfn{record}
 with a number of @dfn{fields}.
 Some of the fields defined
@@ -17146,16 +17329,21 @@ Others, such as @code{packages} and @code{services}, can be omitted, in
 which case they get a default value.  @xref{operating-system Reference},
 for details about all the available fields.
 
-Below we discuss the effect of some of the most important fields,
-and how to @dfn{instantiate} the operating system using
-@command{guix system}.
+Below we discuss the meaning of some of the most important fields.
 
-@quotation Do not panic
-@cindex Scheme programming language, getting started
-Intimidated by the Scheme language or curious about it?  The Cookbook
-has a short section to get started that explains the fundamentals, which
-you will find helpful when hacking your configuration.  @xref{A Scheme
-Crash Course,,, guix-cookbook, GNU Guix Cookbook}.
+@quotation Troubleshooting
+The configuration file is a Scheme program and you might get the syntax
+or semantics wrong as you get started.  Syntactic issues such as
+misplaced parentheses can often be identified by reformatting your file:
+
+@example
+guix style -f config.scm
+@end example
+
+The Cookbook has a short section to get started with the Scheme
+programming language that explains the fundamentals, which you will find
+helpful when hacking your configuration.  @xref{A Scheme Crash Course,,,
+guix-cookbook, GNU Guix Cookbook}.
 @end quotation
 
 @unnumberedsubsec Bootloader
@@ -17348,18 +17536,70 @@ Alternatively, the @code{modify-services} macro can be used:
   (delete avahi-service-type))
 @end lisp
 
+@unnumberedsubsec Inspecting Services
+
+@cindex troubleshooting, for system services
+@cindex inspecting system services
+@cindex system services, inspecting
+As you work on your system configuration, you might wonder why some
+system service doesn't show up or why the system is not as you expected.
+There are several ways to inspect and troubleshoot problems.
+
+@cindex dependency graph, of Shepherd services
+First, you can inspect the dependency graph of Shepherd services like
+so:
+
+@example
+guix system shepherd-graph /etc/config.scm | \
+  guix shell xdot -- xdot -
+@end example
+
+This lets you visualize the Shepherd services as defined in
+@file{/etc/config.scm}.  Each box is a service as would be shown by
+@command{sudo herd status} on the running system, and each arrow denotes
+a dependency (in the sense that if service @var{A} depends on @var{B},
+then @var{B} must be started before @var{A}).
+
+@cindex extension graph, of services
+Not all ``services'' are Shepherd services though, since Guix System
+uses a broader definition of the term (@pxref{Services}).  To visualize
+system services and their relations at a higher level, run:
+
+@example
+guix system extension-graph /etc/config.scm | \
+  guix shell xdot -- xdot -
+@end example
+
+This lets you view the @dfn{service extension graph}: how services
+``extend'' each other, for instance by contributing to their
+configuration.  @xref{Service Composition}, to understand the meaning of
+this graph.
+
+Last, you may also find it useful to inspect your system configuration
+at the REPL (@pxref{Using Guix Interactively}).  Here is an example
+session:
+
+@example
+$ guix repl
+scheme@@(guix-user)> ,use (gnu)
+scheme@@(guix-user)> (define os (load "config.scm"))
+scheme@@(guix-user)> ,pp (map service-kind (operating-system-services os))
+$1 = (#<service-type localed cabba93>
+      @dots{})
+@end example
+
+@xref{Service Reference}, to learn about the Scheme interface to
+manipulate and inspect services.
+
 @unnumberedsubsec Instantiating the System
 
+@cindex system instantiation
+@cindex reconfiguring the system
 Assuming the @code{operating-system} declaration
-is stored in the @file{my-system-config.scm}
-file, the @command{guix system reconfigure my-system-config.scm} command
-instantiates that configuration, and makes it the default GRUB boot
-entry (@pxref{Invoking guix system}).
-
-@quotation Note
-We recommend that you keep this @file{my-system-config.scm} file safe
-and under version control to easily track changes to your configuration.
-@end quotation
+is stored in the @file{config.scm}
+file, the @command{sudo guix system reconfigure config.scm} command
+instantiates that configuration, and makes it the default boot
+entry.  @xref{Getting Started with the System}, for an overview.
 
 The normal way to change the system configuration is by updating this
 file and re-running @command{guix system reconfigure}.  One should never
@@ -17369,23 +17609,6 @@ fact, you must avoid that since that would not only void your warranty
 but also prevent you from rolling back to previous versions of your
 system, should you ever need to.
 
-@cindex roll-back, of the operating system
-Speaking of roll-back, each time you run @command{guix system
-reconfigure}, a new @dfn{generation} of the system is created---without
-modifying or deleting previous generations.  Old system generations get
-an entry in the bootloader boot menu, allowing you to boot them in case
-something went wrong with the latest generation.  Reassuring, no?  The
-@command{guix system list-generations} command lists the system
-generations available on disk.  It is also possible to roll back the
-system via the commands @command{guix system roll-back} and
-@command{guix system switch-generation}.
-
-Although the @command{guix system reconfigure} command will not modify
-previous generations, you must take care when the current generation is not
-the latest (e.g., after invoking @command{guix system roll-back}), since
-the operation might overwrite a later generation (@pxref{Invoking guix
-system}).
-
 @unnumberedsubsec The Programming Interface
 
 At the Scheme level, the bulk of an @code{operating-system} declaration
@@ -44479,17 +44702,42 @@ directory, and some way of automatically deploy changes to their user home.
 @cindex Stow-like dot file management
 The @code{home-dotfiles-service-type} from @code{(gnu home services dotfiles)}
 is designed to ease the way into using Guix Home for this kind of users,
-allowing them to point the service to their dotfiles directory, which must
-follow the layout suggested by
-@uref{https://www.gnu.org/software/stow/, GNU Stow},
-and have their dotfiles automatically deployed to their user home, without
+allowing them to point the service to their dotfiles directory without
 migrating them to Guix native configurations.
 
-The dotfiles directory layout is expected to be structured as follows. Please
-keep in mind that it is advisable to keep your dotfiles directories under
+Please keep in mind that it is advisable to keep your dotfiles directories under
 version control, for example in the same repository where you'd track your
 Guix Home configuration.
 
+There are two supported dotfiles directory layouts, for now. The
+@code{'plain} layout, which is structured as follows:
+
+@example
+~$ tree -a ./dotfiles/
+dotfiles/
+├── .gitconfig
+├── .gnupg
+│   ├── gpg-agent.conf
+│   └── gpg.conf
+├── .guile
+├── .config
+│   ├── guix
+│   │   └── channels.scm
+│   └── nixpkgs
+│       └── config.nix
+├── .nix-channels
+├── .tmux.conf
+└── .vimrc
+@end example
+
+This tree structure is installed as is to the
+home directory upon @command{guix home reconfigure}.
+
+The @code{'stow} layout, which must
+follow the layout suggested by
+@uref{https://www.gnu.org/software/stow/, GNU Stow} presents an additional
+application specific directory layer, just like:
+
 @example
 ~$ tree -a ./dotfiles/
 dotfiles/
@@ -44519,8 +44767,10 @@ dotfiles/
 @end example
 
 For an informal specification please refer to the Stow manual
-(@pxref{Top,,, stow, Introduction}). A suitable configuration would then
-be:
+(@pxref{Top,,, stow, Introduction}). This tree structure is installed following
+GNU Stow's logic to the home directory upon @command{guix home reconfigure}.
+
+A suitable configuration with a @code{'plain} layout could be:
 
 @lisp
 (home-environment
@@ -44528,7 +44778,7 @@ be:
   (services
     (service home-dotfiles-service-type
              (home-dotfiles-configuration
-               (directories (list "./dotfiles"))))))
+               (directories '("./dotfiles"))))))
 @end lisp
 
 The expected home directory state would then be:
@@ -44555,32 +44805,47 @@ Return a service which is very similiar to @code{home-files-service-type}
 (and actually extends it), but designed to ease the way into using Guix
 Home for users that already track their dotfiles under some kind of version
 control.  This service allows users to point Guix Home to their dotfiles
-directory and have their files automatically deployed to their home directory
-just like Stow would, without migrating all of their dotfiles to Guix native
+directory and have their files automatically provisioned to their home
+directory, without migrating all of their dotfiles to Guix native
 configurations.
 @end defvar
 
+@c %start of fragment
+
 @deftp {Data Type} home-dotfiles-configuration
 Available @code{home-dotfiles-configuration} fields are:
 
 @table @asis
-@item @code{source-directory} (default: @code{(current-source-directory)})
-The path where dotfile directories are resolved. By default dotfile directories
-are resolved relative the source location where
+@item @code{source-directory} (default: @code{(current-source-directory)}) (type: string)
+The path where dotfile directories are resolved.  By default dotfile
+directories are resolved relative the source location where
 @code{home-dotfiles-configuration} appears.
 
-@item @code{directories} (type: list-of-strings)
-The list of dotfiles directories where @code{home-dotfiles-service-type} will
-look for application dotfiles.
+@item @code{layout} (default: @code{'plain}) (type: symbol)
+The intended layout of the specified @code{directory}.  It can be either
+@code{'stow} or @code{'plain}.
 
-@item @code{exclude} (default: @code{'(".*~" ".*\\.swp" "\\.git" "\\.gitignore")})
-The list of file patterns @code{home-dotfiles-service-type} will exclude while
-visiting each one of the @code{directories}.
+@item @code{directories} (default: @code{'()}) (type: list-of-strings)
+The list of dotfiles directories where @code{home-dotfiles-service-type}
+will look for application dotfiles.
+
+@item @code{packages} (type: maybe-list-of-strings)
+The names of a subset of the GNU Stow package layer directories.  When provided
+the @code{home-dotfiles-service-type} will only provision dotfiles from this
+subset of applications.  This field will be ignored if @code{layout} is set
+to @code{'plain}.
+
+@item @code{excluded} (default: @code{'(".*~" ".*\\.swp" "\\.git" "\\.gitignore")}) (type: list-of-strings)
+The list of file patterns @code{home-dotfiles-service-type} will exclude
+while visiting each one of the @code{directories}.
 
 @end table
 
 @end deftp
 
+
+@c %end of fragment
+
 @defvar home-xdg-configuration-files-service-type
 The service is very similar to @code{home-files-service-type} (and
 actually extends it), but used for defining files, which will go to
diff --git a/etc/teams.scm b/etc/teams.scm
index e2da31a2b4..ac2886a6eb 100755
--- a/etc/teams.scm
+++ b/etc/teams.scm
@@ -549,8 +549,7 @@ GLib/GIO, GTK, GStreamer and Webkit."
   (team 'lxqt
         #:name "LXQt team"
         #:description "LXQt desktop environment."
-        #:scope (list "gnu/packages/lxqt.scm"
-                      "gnu/packages/qt.scm")))
+        #:scope (list "gnu/packages/lxqt.scm")))
 
 (define-team audio
   (team 'audio
@@ -666,7 +665,7 @@ GLib/GIO, GTK, GStreamer and Webkit."
 
 (define-member (person "宋文武"
                        "iyzsong@envs.net")
-  games localization lxqt xfce)
+  games localization lxqt qt xfce)
 
 (define-member (person "Vagrant Cascadian"
                        "vagrant@debian.org")
@@ -724,6 +723,10 @@ GLib/GIO, GTK, GStreamer and Webkit."
                        "mhw@netris.org")
   mozilla)
 
+(define-member (person "Adam Faiz"
+                       "adam.faiz@disroot.org")
+  games)
+
 
 (define (find-team name)
   (or (hash-ref %teams (string->symbol name))
diff --git a/gnu/home/services/dotfiles.scm b/gnu/home/services/dotfiles.scm
index 6a740c42ce..823bdb03fb 100644
--- a/gnu/home/services/dotfiles.scm
+++ b/gnu/home/services/dotfiles.scm
@@ -20,17 +20,25 @@
 (define-module (gnu home services dotfiles)
   #:use-module (gnu home services)
   #:use-module (gnu services)
+  #:use-module (gnu services configuration)
   #:autoload   (guix build utils) (find-files)
+  #:use-module (guix diagnostics)
   #:use-module (guix gexp)
-  #:use-module (guix records)
+  #:use-module (guix i18n)
   #:use-module ((guix utils) #:select (current-source-directory))
   #:use-module (srfi srfi-1)
   #:use-module (ice-9 ftw)
+  #:use-module (ice-9 match)
   #:use-module (ice-9 regex)
   #:export (home-dotfiles-service-type
+            home-dotfiles-configuration->files
+
             home-dotfiles-configuration
             home-dotfiles-configuration?
+            home-dotfiles-configuration-fields
+            home-dotfiles-configuration-layout
             home-dotfiles-configuration-source-directory
+            home-dotfiles-configuration-packages
             home-dotfiles-configuration-directories
             home-dotfiles-configuration-excluded))
 
@@ -40,26 +48,64 @@
     "\\.git"
     "\\.gitignore"))
 
-(define-record-type* <home-dotfiles-configuration>
-  home-dotfiles-configuration make-home-dotfiles-configuration
-  home-dotfiles-configuration?
-  (source-directory  home-dotfiles-configuration-source-directory
-                     (default (current-source-directory))
-                     (innate))
-  (directories       home-dotfiles-configuration-directories       ;list of strings
-                     (default '()))
-  (excluded          home-dotfiles-configuration-excluded       ;list of strings
-                     (default %home-dotfiles-excluded)))
-
-(define (import-dotfiles directory files)
+(define %home-dotfiles-layouts
+  '(plain stow))
+
+(define (sanitize-layout value)
+  (if (member value %home-dotfiles-layouts)
+      value
+      (raise
+       (formatted-message
+        (G_ "layout field of home-dotfiles-configuration should be either 'plain
+or 'stow, but ~a was found.")
+        value))))
+
+(define list-of-strings?
+  (list-of string?))
+
+(define-maybe list-of-strings)
+
+(define-configuration/no-serialization home-dotfiles-configuration
+  (source-directory
+   (string (current-source-directory))
+   "The path where dotfile directories are resolved.  By default dotfile
+directories are resolved relative the source location where
+@code{home-dotfiles-configuration} appears.")
+  (layout
+   (symbol 'plain)
+   "The intended layout of the specified @code{directory}.  It can be either
+@code{'stow} or @code{'plain}."
+   (sanitizer sanitize-layout))
+  (directories
+   (list-of-strings '())
+   "The list of dotfiles directories where @code{home-dotfiles-service-type}
+will look for application dotfiles.")
+  (packages
+   (maybe-list-of-strings)
+   "The names of a subset of the GNU Stow package layer directories.  When provided
+the @code{home-dotfiles-service-type} will only provision dotfiles from this
+subset of applications.  This field will be ignored if @code{layout} is set
+to @code{'plain}.")
+  (excluded
+   (list-of-strings %home-dotfiles-excluded)
+   "The list of file patterns @code{home-dotfiles-service-type} will exclude
+while visiting @code{directory}."))
+
+(define (strip-stow-dotfile file-name directory)
+  (let ((dotfile-name (string-drop file-name (1+ (string-length directory)))))
+    (match (string-split dotfile-name #\/)
+      ((package parts ...)
+       (string-join parts "/")))))
+
+(define (strip-plain-dotfile file-name directory)
+  (string-drop file-name (+ 1 (string-length directory))))
+
+(define (import-dotfiles directory files strip)
   "Return a list of objects compatible with @code{home-files-service-type}'s
 value.  Each object is a pair where the first element is the relative path
 of a file and the second is a gexp representing the file content.  Objects are
 generated by recursively visiting DIRECTORY and mapping its contents to the
 user's home directory, excluding files that match any of the patterns in EXCLUDED."
-  (define (strip file)
-    (string-drop file (+ 1 (string-length directory))))
-
   (define (format file)
     ;; Remove from FILE characters that cannot be used in the store.
     (string-append
@@ -73,7 +119,7 @@ user's home directory, excluding files that match any of the patterns in EXCLUDE
                  file)))
 
   (map (lambda (file)
-         (let ((stripped (strip file)))
+         (let ((stripped (strip file directory)))
            (list stripped
                  (local-file file (format stripped)
                              #:recursive? #t))))
@@ -81,18 +127,25 @@ user's home directory, excluding files that match any of the patterns in EXCLUDE
 
 (define (home-dotfiles-configuration->files config)
   "Return a list of objects compatible with @code{home-files-service-type}'s
-value, generated following GNU Stow's algorithm for each of the
-directories in CONFIG, excluding files that match any of the patterns configured."
+value, excluding files that match any of the patterns configured."
+  (define stow? (eq? (home-dotfiles-configuration-layout config) 'stow))
   (define excluded
     (home-dotfiles-configuration-excluded config))
   (define exclusion-rx
     (make-regexp (string-append "^.*(" (string-join excluded "|") ")$")))
 
-  (define (directory-contents directory)
-    (find-files directory
-                (lambda (file stat)
-                  (not (regexp-exec exclusion-rx
-                                    (basename file))))))
+  (define* (directory-contents directory #:key (packages #f))
+    (define (filter-files directory)
+      (find-files directory
+                  (lambda (file stat)
+                    (not (regexp-exec exclusion-rx
+                                      (basename file))))))
+    (if (and stow? packages (maybe-value-set? packages))
+        (append-map filter-files
+                    (map (lambda (pkg)
+                           (string-append directory "/" pkg))
+                         packages))
+        (filter-files directory)))
 
   (define (resolve directory)
     ;; Resolve DIRECTORY relative to the 'source-directory' field of CONFIG.
@@ -103,15 +156,23 @@ directories in CONFIG, excluding files that match any of the patterns configured
 
   (append-map (lambda (directory)
                 (let* ((directory (resolve directory))
-                       (contents  (directory-contents directory)))
-                  (import-dotfiles directory contents)))
+                       (packages
+                        (home-dotfiles-configuration-packages config))
+                       (contents
+                        (directory-contents directory
+                                            #:packages packages))
+                       (strip
+                        (if stow? strip-stow-dotfile strip-plain-dotfile)))
+                  (import-dotfiles directory contents strip)))
               (home-dotfiles-configuration-directories config)))
 
 (define-public home-dotfiles-service-type
   (service-type (name 'home-dotfiles)
                 (extensions
                  (list (service-extension home-files-service-type
-                                          home-dotfiles-configuration->files)))
+                                          (lambda (config)
+                                            (when config
+                                              (home-dotfiles-configuration->files config))))))
                 (default-value (home-dotfiles-configuration))
                 (description "Files that will be put in the user's home directory
 following GNU Stow's algorithm, and further processed during activation.")))
diff --git a/gnu/local.mk b/gnu/local.mk
index 9fbfc754a0..5546e33465 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1295,7 +1295,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/gdm-remove-hardcoded-xwayland-path.patch	\
   %D%/packages/patches/gdm-wayland-session-wrapper-from-env.patch	\
   %D%/packages/patches/gdm-pass-gdk-pixbuf-loader-env.patch	\
-  %D%/packages/patches/gegl-compatibility-old-librsvg.patch	\
   %D%/packages/patches/gemmi-fix-pegtl-usage.patch		\
   %D%/packages/patches/gemmi-fix-sajson-types.patch		\
   %D%/packages/patches/genimage-mke2fs-test.patch		\
@@ -1450,7 +1449,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/http-parser-CVE-2020-8287.patch		\
   %D%/packages/patches/htslib-for-stringtie.patch		\
   %D%/packages/patches/hubbub-sort-entities.patch		\
-  %D%/packages/patches/hubbub-maybe-uninitialized.patch         \
   %D%/packages/patches/hueplusplus-mbedtls.patch		\
   %D%/packages/patches/hurd-add-without-rump-configure-option.patch \
   %D%/packages/patches/hurd-fix-rumpdisk-build.patch		\
@@ -1521,6 +1519,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/julia-SOURCE_DATE_EPOCH-mtime.patch	\
   %D%/packages/patches/julia-Use-MPFR-4.2.patch	                \
   %D%/packages/patches/libcall-ui-make-it-installable.patch	\
+  %D%/packages/patches/libcss-check-format.patch		\
   %D%/packages/patches/libftdi-fix-paths-when-FTDIPP-set.patch	\
   %D%/packages/patches/libgeotiff-fix-tests-with-proj-9.1.1.patch	\
   %D%/packages/patches/libgeotiff-fix-tests-with-proj-9.3.0.patch	\
@@ -1617,8 +1616,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/libtiff-CVE-2022-34526.patch		\
   %D%/packages/patches/libtirpc-CVE-2021-46828.patch		\
   %D%/packages/patches/libtirpc-hurd.patch			\
-  %D%/packages/patches/libtommath-fix-linkage.patch		\
-  %D%/packages/patches/libtommath-integer-overflow.patch	\
   %D%/packages/patches/libtool-grep-compat.patch		\
   %D%/packages/patches/libtool-skip-tests2.patch		\
   %D%/packages/patches/libtree-fix-check-non-x86.patch		\
@@ -1798,6 +1795,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/plasp-fix-normalization.patch \
   %D%/packages/patches/plasp-include-iostream.patch \
   %D%/packages/patches/pocketfft-cpp-prefer-preprocessor-if.patch			\
+  %D%/packages/patches/podman-program-lookup.patch 		\
   %D%/packages/patches/pokerth-boost.patch			\
   %D%/packages/patches/ppsspp-disable-upgrade-and-gold.patch		\
   %D%/packages/patches/procps-strtod-test.patch                 \
@@ -1805,6 +1803,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/prusa-slicer-fix-tests.patch		\
   %D%/packages/patches/prusa-slicer-with-cereal-1.3.1.patch	\
   %D%/packages/patches/pthreadpool-system-libraries.patch	\
+  %D%/packages/patches/python-3.12-fix-tests.patch		\
   %D%/packages/patches/python-accupy-use-matplotx.patch		\
   %D%/packages/patches/python-accupy-fix-use-of-perfplot.patch	\
   %D%/packages/patches/python-chai-drop-python2.patch		\
@@ -1828,11 +1827,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/quodlibet-fix-invalid-glob.patch	\
   %D%/packages/patches/quodlibet-fix-mtime-tests.patch		\
   %D%/packages/patches/qxlsx-fix-include-directory.patch	\
-  %D%/packages/patches/scribus-1.5.8-poppler-22.03.0.patch	\
-  %D%/packages/patches/scribus-1.5.8-poppler-22.04.0.patch	\
-  %D%/packages/patches/scribus-1.5.8-poppler-22.09.0.patch	\
-  %D%/packages/patches/scribus-1.5.8-poppler-22.2.0-1.patch	\
-  %D%/packages/patches/scribus-1.5.8-poppler-22.2.0-2.patch	\
   %D%/packages/patches/sdcc-disable-non-free-code.patch		\
   %D%/packages/patches/sdl-pango-api_additions.patch		\
   %D%/packages/patches/sdl-pango-blit_overflow.patch		\
@@ -1840,6 +1834,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/sdl-pango-header-guard.patch		\
   %D%/packages/patches/sdl-pango-matrix_declarations.patch	\
   %D%/packages/patches/sdl-pango-sans-serif.patch		\
+  %D%/packages/patches/sioyek-fix-build.patch			\
   %D%/packages/patches/smalltalk-multiplication-overflow.patch	\
   %D%/packages/patches/sqlite-hurd.patch			\
   %D%/packages/patches/strace-readlink-tests.patch		\
@@ -2026,6 +2021,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/rxvt-unicode-fix-cursor-position.patch	\
   %D%/packages/patches/s7-flint-3.patch                      	\
   %D%/packages/patches/sajson-for-gemmi-numbers-as-strings.patch	\
+  %D%/packages/patches/sajson-build-with-gcc10.patch		\
   %D%/packages/patches/sbc-fix-build-non-x86.patch		\
   %D%/packages/patches/sbcl-aserve-add-HTML-5-elements.patch	\
   %D%/packages/patches/sbcl-aserve-fix-rfe12668.patch	\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 023a85f136..c12d47da4b 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -5188,7 +5188,7 @@ disk utilization, priority, username, state, and exit code.")
      `())
     (inputs
      `(("go-golang-org-x-text" ,go-golang-org-x-text)
-       ("go-github.com-ulikunitz-xz" ,go-github.com-ulikunitz-xz)))
+       ("go-github-com-ulikunitz-xz" ,go-github-com-ulikunitz-xz)))
     (synopsis "UEFI image editor")
     (description "This package provides a command-line UEFI image editor.")
     (home-page "https://github.com/linuxboot/fiano")
diff --git a/gnu/packages/bioconductor.scm b/gnu/packages/bioconductor.scm
index f38b787bdf..4dc7000250 100644
--- a/gnu/packages/bioconductor.scm
+++ b/gnu/packages/bioconductor.scm
@@ -6198,20 +6198,21 @@ mapping.")
 (define-public r-nebulosa
   (package
     (name "r-nebulosa")
-    (version "1.12.0")
+    (version "1.12.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "Nebulosa" version))
               (sha256
                (base32
-                "0kzkdwxrhl7plbcbqr58gnadhhbhx2811ian0s4kds14y4mxl26c"))))
+                "11wn6l27cshhb1djsgqaqr8d33j4bipy0w0gafp3fkvg7mnpnhps"))))
     (properties `((upstream-name . "Nebulosa")))
     (build-system r-build-system)
     (propagated-inputs (list r-ggplot2
+                             r-ggrastr
                              r-ks
                              r-matrix
                              r-patchwork
-                             r-seurat
+                             r-seuratobject
                              r-singlecellexperiment
                              r-summarizedexperiment))
     (native-inputs (list r-knitr))
@@ -7211,13 +7212,13 @@ self-defined annotation graphics.")
 (define-public r-conos
   (package
     (name "r-conos")
-    (version "1.5.1")
+    (version "1.5.2")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "conos" version))
        (sha256
-        (base32 "01d2knwyf0g2pvqq3dy5vhf0i7mc5f7rzg3a7cbglsw3l9irsixv"))))
+        (base32 "0p66gb308w2zfsppm0k1vsvgr33kzzhql0vh7l39vlsgayi00skk"))))
     (properties `((upstream-name . "conos")))
     (build-system r-build-system)
     (propagated-inputs
@@ -13866,14 +13867,14 @@ data.")
 (define-public r-ggtree
   (package
     (name "r-ggtree")
-    (version "3.10.0")
+    (version "3.10.1")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "ggtree" version))
        (sha256
         (base32
-         "12w2l1q0c5aznd5fls04wvgsmjidqhr1kkqj4gajz1abj9f49cqf"))))
+         "1p475vh567q4szb8hy2qk72pvqh5rlbyqfjcdd0i83fa2y4bi31d"))))
     (properties `((upstream-name . "ggtree")))
     (build-system r-build-system)
     (propagated-inputs
@@ -18395,14 +18396,14 @@ manipulation of flow cytometry data.")
 (define-public r-ggcyto
   (package
     (name "r-ggcyto")
-    (version "1.30.0")
+    (version "1.30.2")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "ggcyto" version))
        (sha256
         (base32
-         "13zc5952drl187fl07v1nh6gv0g6ba11vxpxl4ghvavnknvi5phd"))))
+         "0ig23b6apyp35rxxiqd5nw46yjm2784njlafsgw98akhl8ck0g7n"))))
     (properties `((upstream-name . "ggcyto")))
     (build-system r-build-system)
     (propagated-inputs
@@ -21299,13 +21300,13 @@ routines.")
 (define-public r-s4arrays
   (package
     (name "r-s4arrays")
-    (version "1.2.0")
+    (version "1.2.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "S4Arrays" version))
               (sha256
                (base32
-                "0x420l98f6b10r3qrdjq5ijs2p0msdcg6d6aghr3yvj1f9g06h8y"))))
+                "1z6kcgjb5fzslr02vmsvchbilrhwpgh1ghk1zmlq0h0lyzncaapd"))))
     (properties `((upstream-name . "S4Arrays")))
     (build-system r-build-system)
     (propagated-inputs
@@ -23015,13 +23016,13 @@ segmented data for individual and multiple arrays.")
 (define-public r-snprelate
   (package
     (name "r-snprelate")
-    (version "1.36.0")
+    (version "1.36.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "SNPRelate" version))
               (sha256
                (base32
-                "0jw9ziz0a472mnnvmqwas5w646xfgx8dn1bdpwz8c99m663d8ayp"))))
+                "0d15r7qwwrr6m9saikx4x6hj56kb3p2w3v1awkgm3wfqfgdf1pin"))))
     (properties `((upstream-name . "SNPRelate")))
     (build-system r-build-system)
     (propagated-inputs (list r-gdsfmt))
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index e7816eb1d1..b8ecea013c 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -22484,7 +22484,7 @@ useful for bioinformatic analysis.")
        #:tests? #false)) ;require network access
     (propagated-inputs
      (list go-gopkg-in-check-v1
-           go-github.com-ulikunitz-xz
+           go-github-com-ulikunitz-xz
            go-github-com-kortschak-utter))
     (synopsis "HTS CRAM module for biogo")
     (description "This package provides tools for handling CRAM files.")))
diff --git a/gnu/packages/bittorrent.scm b/gnu/packages/bittorrent.scm
index 264e9e9724..d53f717f0d 100644
--- a/gnu/packages/bittorrent.scm
+++ b/gnu/packages/bittorrent.scm
@@ -574,7 +574,7 @@ features.")
           #~(cons "-DGUI=OFF" #$configure-flags))))
       (inputs
        (modify-inputs (package-inputs base)
-         (delete "qtsvg-5"))))))
+         (delete "qtsvg"))))))
 
 (define-public qbittorrent-nox
   (deprecated-package "qbittorrent-nox" qbittorrent-no-x))
@@ -583,7 +583,7 @@ features.")
   (package
     (inherit qbittorrent)
     (name "qbittorrent-enhanced")
-    (version "4.6.1.10")
+    (version "4.6.3.10")
     (source
      (origin
        (method git-fetch)
@@ -593,7 +593,7 @@ features.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "101a9n2vk9d6b4vc3schkmpc56l0i0i60fcjh8hwadc6amc2ymvy"))))
+         "09b8237h0gn6y3s0a7qg247hsdra5f5kg6xhirnhhfvjd8k6qviv"))))
     (home-page "https://github.com/c0re100/qBittorrent-Enhanced-Edition")
     (description
      "qBittorrent Enhanced is a bittorrent client based on qBittorrent with
@@ -607,12 +607,15 @@ the following features:
 @item Peer whitelist/blacklist
 @end itemize")))
 
-(define-public qbittorrent-enhanced-nox
+(define-public qbittorrent-enhanced-no-x
   (package
     (inherit qbittorrent-enhanced)
-    (name "qbittorrent-enhanced-nox")
-    (arguments (package-arguments qbittorrent-nox))
-    (inputs (package-inputs qbittorrent-nox))))
+    (name "qbittorrent-enhanced-no-x")
+    (arguments (package-arguments qbittorrent-no-x))
+    (inputs (package-inputs qbittorrent-no-x))))
+
+(define-public qbittorrent-enhanced-nox
+  (deprecated-package "qbittorrent-enhanced-nox" qbittorrent-enhanced-no-x))
 
 (define-public deluge
   (package
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index 2dcf33a460..49a026bd20 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -49,6 +49,7 @@
 ;;; Copyright © 2023 Hilton Chain <hako@ultrarare.space>
 ;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
 ;;; Copyright © 2024 Giacomo Leidi <goodoldpaul@autistici.org>
+;;; Copyright © 2024 Zheng Junjie <873216071@qq.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -609,7 +610,7 @@ pattern.")
 (define-public catch2-3
   (package
     (name "catch2")
-    (version "3.5.1")
+    (version "3.5.3")
     (home-page "https://github.com/catchorg/Catch2")
     (source (origin
               (method git-fetch)
@@ -619,19 +620,12 @@ pattern.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0p7rk01n4qfnnm1bgakllyqi83n1kbpz11gh65z1vspfz58hs9iv"))))
+                "11yla93vm2896fzhm3fz8lk3y3iz5iy7vd6wa7wnwvhsfd2dbfq3"))))
     (build-system cmake-build-system)
     (arguments
      (list
       #:configure-flags
-      #~(list #$@(match (%current-system)
-                   ((or "x86_64-linux" "i686-linux")
-                    ;; Tests fail on i686-linux without SSE2 for floats, see
-                    ;; upstream report
-                    ;; <https://github.com/catchorg/Catch2/issues/2796>.
-                    '("-DCMAKE_CXX_FLAGS=-msse2 -mfpmath=sse"))
-                   (_ '()))
-              "-DCATCH_DEVELOPMENT_BUILD=ON"
+      #~(list "-DCATCH_DEVELOPMENT_BUILD=ON"
               "-DCATCH_ENABLE_WERROR=OFF"
               "-DBUILD_SHARED_LIBS=ON")))
     (inputs (list python-wrapper))
diff --git a/gnu/packages/containers.scm b/gnu/packages/containers.scm
index 2b5acdc3bc..aa270a25f3 100644
--- a/gnu/packages/containers.scm
+++ b/gnu/packages/containers.scm
@@ -248,6 +248,46 @@ containers or various tools.")
 network namespaces.")
     (license license:gpl2+)))
 
+(define-public passt
+  (package
+    (name "passt")
+    (version "2023_12_30.f091893")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://passt.top/passt/snapshot/passt-" version
+                           ".tar.gz"))
+       (sha256
+        (base32 "1nyd4h93qlxn1r01ffijpsd7r7ny62phki5j58in8gz021jj4f3d"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:make-flags
+      #~(list (string-append "CC=" #$(cc-for-target))
+              "RLIMIT_STACK_VAL=1024"   ; ¯\_ (ツ)_/¯
+              (string-append "VERSION=" #$version)
+              (string-append "prefix=" #$output))
+      #:tests? #f
+      #:phases
+      #~(modify-phases %standard-phases
+          (delete 'configure))))
+    (home-page "https://passt.top")
+    (synopsis "Plug A Simple Socket Transport")
+    (description
+     "passt implements a thin layer between guest and host, that only
+implements what's strictly needed to pretend processes are running locally.
+The TCP adaptation doesn't keep per-connection packet buffers, and reflects
+observed sending windows and acknowledgements between the two sides.  This TCP
+adaptation is needed as passt runs without the CAP_NET_RAW capability: it
+can't create raw IP sockets on the pod, and therefore needs to map packets at
+Layer-2 to Layer-4 sockets offered by the host kernel.
+
+Also provides pasta, which similarly to slirp4netns, provides networking to
+containers by creating a tap interface available to processes in the
+namespace, and mapping network traffic outside the namespace using native
+Layer-4 sockets.")
+    (license (list license:gpl2+ license:bsd-3))))
+
 (define-public cni-plugins
   (package
     (name "cni-plugins")
@@ -302,7 +342,7 @@ configure network interfaces in Linux containers.")
 (define-public podman
   (package
     (name "podman")
-    (version "4.4.1")
+    (version "4.9.3")
     (source
      (origin
        (method git-fetch)
@@ -313,8 +353,11 @@ configure network interfaces in Linux containers.")
        ;; FIXME: Btrfs libraries not detected by these scripts.
        (snippet '(substitute* "Makefile"
                    ((".*hack/btrfs.*") "")))
+       (patches
+        (search-patches
+         "podman-program-lookup.patch"))
        (sha256
-        (base32 "0qbr6rbyig3c2hvdvmd94jjkg820hpdz6j7dgyv62dl6wfwvj5jj"))
+        (base32 "17g7n09ndxhpjr39s9qwxdcv08wavjj0g5nmnrvrkz2wgdqigl1x"))
        (file-name (git-file-name name version))))
 
     (build-system gnu-build-system)
@@ -341,10 +384,11 @@ configure network interfaces in Linux containers.")
                 (invoke "make" "remotesystem"))))
           (add-after 'unpack 'fix-hardcoded-paths
             (lambda _
-              (substitute* (find-files "libpod" "\\.go")
-                (("exec.LookPath[(][\"]slirp4netns[\"][)]")
-                 (string-append "exec.LookPath(\""
-                                (which "slirp4netns") "\")")))
+              (substitute* "vendor/github.com/containers/common/pkg/config/config.go"
+                (("@SLIRP4NETNS_DIR@")
+                 (string-append #$slirp4netns "/bin"))
+                (("@PASST_DIR@")
+                 (string-append #$passt "/bin")))
               (substitute* "hack/install_catatonit.sh"
                 (("CATATONIT_PATH=\"[^\"]+\"")
                  (string-append "CATATONIT_PATH=" (which "true"))))
@@ -374,11 +418,12 @@ configure network interfaces in Linux containers.")
            libassuan
            libseccomp
            libselinux
+           passt
            slirp4netns))
     (native-inputs
      (list bats
            git
-           go-1.19
+           go-1.21
            ; strace ; XXX debug
            pkg-config
            python))
@@ -387,7 +432,10 @@ configure network interfaces in Linux containers.")
     (description
      "Podman (the POD MANager) is a tool for managing containers and images,
 volumes mounted into those containers, and pods made from groups of
-containers.")
+containers.
+
+The @code{machine} subcommand is not supported due to gvproxy not being
+packaged.")
     (license license:asl2.0)))
 
 (define-public buildah
diff --git a/gnu/packages/cran.scm b/gnu/packages/cran.scm
index 8d7425e4c1..dbbf30c551 100644
--- a/gnu/packages/cran.scm
+++ b/gnu/packages/cran.scm
@@ -1026,27 +1026,26 @@ axis breaks of a ggplot.")
 (define-public r-ggdist
   (package
     (name "r-ggdist")
-    (version "3.3.1")
+    (version "3.3.2")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ggdist" version))
        (sha256
-        (base32 "0agr1l65s7vimdb88a7n3ahr6pp9ng5zf9mypdic26vhaaifh1b7"))))
+        (base32 "1wc3pqnf2r0324jm0vv1872smriv25h0lx0mni7qp93wrf8k0mpn"))))
     (properties `((upstream-name . "ggdist")))
     (build-system r-build-system)
     (propagated-inputs (list r-cli
                              r-distributional
-                             r-dplyr
                              r-ggplot2
                              r-glue
+                             r-gtable
                              r-numderiv
                              r-quadprog
                              r-rcpp
                              r-rlang
                              r-scales
                              r-tibble
-                             r-tidyselect
                              r-vctrs
                              r-withr))
     (native-inputs (list r-knitr))
@@ -2710,13 +2709,13 @@ respecting the grammar of its graphics paradigm.")
 (define-public r-ggside
   (package
     (name "r-ggside")
-    (version "0.3.0")
+    (version "0.3.1")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "ggside" version))
               (sha256
                (base32
-                "0mx6j9wi54inklmyydcqm0ahbx0b6c6y4sfh2awqsbgwigc3056p"))))
+                "1r36hsnha9bqzfb3rhpj11zg307wzacnkn4i6hi627xrx4knj5cl"))))
     (properties `((upstream-name . "ggside")))
     (build-system r-build-system)
     (propagated-inputs
@@ -2977,13 +2976,13 @@ functions which can speed up workflow.")
 (define-public r-pagoda2
   (package
     (name "r-pagoda2")
-    (version "1.0.11")
+    (version "1.0.12")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "pagoda2" version))
        (sha256
-        (base32 "13x2l7hcvd6975921c5hba8hm2qijkslviszfizah8wxynhbayy1"))))
+        (base32 "1kck12ri52nwsrxhjs8ghjji3rv1dxxjy8bxn1kk1hbg30265fsw"))))
     (properties `((upstream-name . "pagoda2")))
     (build-system r-build-system)
     (propagated-inputs
@@ -3973,13 +3972,13 @@ scraping tasks, inspired by libraries like @code{BeautifulSoup}.")
 (define-public r-secretbase
   (package
     (name "r-secretbase")
-    (version "0.3.0")
+    (version "0.3.0.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "secretbase" version))
        (sha256
-        (base32 "1wgbk16by9w933cff5ybb2sa0ndgj3sv9ahr2r1843vgqiyvx2xi"))))
+        (base32 "0mhfkkl35g10lgz4llm017f2jbgp7vmgi0g301r4agx1iqj5g51w"))))
     (properties `((upstream-name . "secretbase")))
     (build-system r-build-system)
     (home-page "https://shikokuchuo.net/secretbase/")
@@ -4704,13 +4703,13 @@ LaTeX.")
 (define-public r-curl
   (package
     (name "r-curl")
-    (version "5.2.0")
+    (version "5.2.1")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "curl" version))
               (sha256
                (base32
-                "12gldddkfkdwm6h0lb1pjrcpqc9kmqwfwz18wn9brilzbw8s9nxz"))))
+                "147smp4am6z23c3j21bd0zcjxsmhnkkssn4wrlpwl6xa1264syja"))))
     (properties
      `((upstream-name . "curl")
        (updater-extra-inputs . ("curl"))))
@@ -5824,14 +5823,14 @@ contained in the navigation bar.")
 (define-public r-spelling
   (package
     (name "r-spelling")
-    (version "2.2.1")
+    (version "2.3.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "spelling" version))
        (sha256
         (base32
-         "0vr5mgw9grnsnzsc29al72p05z786hnd6b9c6wq0c0dabk5szm2g"))))
+         "0fxa0wpmmx7bal7xb4yy3134s2bskj98kwhqn25bqga3inzqdm6d"))))
     (properties `((upstream-name . "spelling")))
     (build-system r-build-system)
     (propagated-inputs
@@ -7642,13 +7641,13 @@ provides an interactive R manager and worker environment.")
 (define-public r-rmumps
   (package
     (name "r-rmumps")
-    (version "5.2.1-27")
+    (version "5.2.1-28")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "rmumps" version))
        (sha256
-        (base32 "08zvmbhjgcrlgdhfn8ssajy8vnwcyaw90zgc0v1ncn95z310gpl3"))))
+        (base32 "1cq7zrq730lj1z5xirzk5fvvlvdq101ppg47n0z7c0v17rvs80n6"))))
     (properties `((upstream-name . "rmumps")))
     (build-system r-build-system)
     (inputs (list zlib))
@@ -7996,14 +7995,14 @@ those for the gamma distribution in the @code{stats} package.")
 (define-public r-bdsmatrix
   (package
     (name "r-bdsmatrix")
-    (version "1.3-6")
+    (version "1.3-7")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "bdsmatrix" version))
        (sha256
         (base32
-         "1g300x11rv56f826mbv7mbb67a5xz3dv74hpjc18jh3q8gap3j7r"))))
+         "08krrd7454ixqv4nq55hgf3djp1pz1vl3ndslsrh2pkdq1d5wl63"))))
     (properties `((upstream-name . "bdsmatrix")))
     (build-system r-build-system)
     (home-page "https://cran.r-project.org/web/packages/bdsmatrix/")
@@ -8462,17 +8461,22 @@ these progress updates.")
 (define-public r-lava
   (package
     (name "r-lava")
-    (version "1.7.3")
+    (version "1.8.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "lava" version))
        (sha256
         (base32
-         "023av1mz4hr1lqv8cpbx0j1y3c7ljyns35rm838c618b6pqps22f"))))
+         "0zz8hzmqd4qa14y52c8gw9hr6gn0d7srffrddxrmhb01rbp9dfcd"))))
     (build-system r-build-system)
     (propagated-inputs
-     (list r-future-apply r-numderiv r-progressr r-squarem r-survival))
+     (list r-cli
+           r-future-apply
+           r-numderiv
+           r-progressr
+           r-squarem
+           r-survival))
     (native-inputs
      (list r-knitr))
     (home-page "https://github.com/kkholst/lava")
@@ -9549,6 +9553,34 @@ imputations.")
     ;; Any of these two versions.
     (license (list license:gpl2 license:gpl3))))
 
+(define-public r-transformr
+  (package
+    (name "r-transformr")
+    (version "0.1.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "transformr" version))
+       (sha256
+        (base32 "125y99wpgvp92qsg7934nzjqy6irjzaj21c0dcq7apqd2hqamfxw"))))
+    (properties `((upstream-name . "transformr")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-cpp11
+                             r-lpsolve
+                             r-rlang
+                             r-sf
+                             r-tweenr
+                             r-vctrs))
+    (home-page "https://github.com/thomasp85/transformr")
+    (synopsis "Polygon and path transformations")
+    (description
+     "In order to smoothly animate the transformation of polygons and paths,
+many aspects needs to be taken into account, such as differing number of
+control points, changing center of rotation, etc.  The transformr package
+provides an extensive framework for manipulating the shapes of polygons and
+paths and can be seen as the spatial brother to the tweenr package.")
+    (license license:expat)))
+
 (define-public r-truncnorm
   (package
     (name "r-truncnorm")
@@ -10739,13 +10771,13 @@ features:
 (define-public r-n2r
   (package
     (name "r-n2r")
-    (version "1.0.1")
+    (version "1.0.3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "N2R" version))
        (sha256
-        (base32 "12bv7xx6j6222qgpv6g61i68017fz0x6fjg9a9k5yhgw3zk05hpk"))))
+        (base32 "0bbxl0y36bmsxwi4rs4f6jwhf9bhag2rkvvzcg5669vgm2p4scjr"))))
     (properties `((upstream-name . "N2R")))
     (build-system r-build-system)
     (propagated-inputs
@@ -13408,14 +13440,14 @@ those searches and pull data into their R sessions.")
 (define-public r-renv
   (package
     (name "r-renv")
-    (version "1.0.4")
+    (version "1.0.5")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "renv" version))
        (sha256
         (base32
-         "0jfrkxslx1bw4b2akkp12bgvpfc58dh2vrm91hgb1xa5xydai7j6"))))
+         "07y1xqnx5jkgk0cqgf8c4p5vm3qy87zjl31zv6s0jssy3v7amq4p"))))
     (properties `((upstream-name . "renv")))
     (build-system r-build-system)
     (native-inputs
@@ -13677,14 +13709,14 @@ Sequence logos can easily be combined with other ggplot2 plots.")
 (define-public r-ggsci
   (package
     (name "r-ggsci")
-    (version "3.0.0")
+    (version "3.0.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ggsci" version))
        (sha256
         (base32
-         "0ag1cj4ycl5xmll8mqmmikyvq94l8yx96pb8m2i853yp2rjk20c9"))))
+         "030rkjx64mlhy19d74p3blsi92nyjq9vbn33323dvm1rihb8avgi"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-ggplot2 r-scales))
@@ -13847,14 +13879,14 @@ clustering.")
 (define-public r-factominer
   (package
     (name "r-factominer")
-    (version "2.9")
+    (version "2.10")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "FactoMineR" version))
        (sha256
         (base32
-         "0c2j3xid85qffsdjwndqiwihclzw6k1nkbpzcc7whhd6k79rh9l8"))))
+         "1kjb0hk7zck8702inw9ayxrpbi8raq3rldxsq848lk15z3wg9r6w"))))
     (properties `((upstream-name . "FactoMineR")))
     (build-system r-build-system)
     (propagated-inputs
@@ -13989,21 +14021,21 @@ results to the user.")
 (define-public r-hdf5r
   (package
     (name "r-hdf5r")
-    (version "1.3.9")
+    (version "1.3.10")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "hdf5r" version))
        (sha256
         (base32
-         "1av3pafbfff4wanw9s1iqgwkcdmc5f8c8h3z0byqll9i661kz3pg"))))
+         "0khj94z6ls6dnc6fpxwf1w93mk6f3z2p39mbihf0lz52jc36wjcj"))))
     (build-system r-build-system)
     (inputs
      (list hdf5 zlib))
     (propagated-inputs
      (list r-bit64 r-r6))
     (native-inputs
-     (list r-knitr))
+     (list pkg-config r-knitr))
     (home-page "https://hhoeflin.github.io/hdf5r")
     (synopsis "Interface to the HDF5 binary data format")
     (description
@@ -14540,13 +14572,13 @@ tidyverse workflow.")
 (define-public r-nodbi
   (package
     (name "r-nodbi")
-    (version "0.10.2")
+    (version "0.10.3")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "nodbi" version))
               (sha256
                (base32
-                "1pznlnln0p55qqwy22h9m79ddf3wgnx3vaxx2q39wvgqwj0kk1b0"))))
+                "17ghgp6sabj4dlmx3cdn9rrhci7050a73cd17fymjksgvy1jbwf6"))))
     (properties `((upstream-name . "nodbi")))
     (build-system r-build-system)
     (propagated-inputs
@@ -16173,13 +16205,13 @@ for the reconstruction of gene regulatory networks.")
 (define-public r-partr2
   (package
     (name "r-partr2")
-    (version "0.9.1")
+    (version "0.9.2")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "partR2" version))
               (sha256
                (base32
-                "06ky0hhrq0mcsn9rwrzvwn0rrjj0l8rxs0hqp10668gdq5hjk8bn"))))
+                "09x8ykg90y4xq0sqm6zvx41sccgdbglmhpqm9sp3m74a87j4bjly"))))
     (properties `((upstream-name . "partR2")))
     (build-system r-build-system)
     (propagated-inputs (list r-dplyr
@@ -19295,14 +19327,14 @@ over-plotting in scatter plots with text.")
 (define-public r-colorramps
   (package
     (name "r-colorramps")
-    (version "2.3.1")
+    (version "2.3.2")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "colorRamps" version))
        (sha256
         (base32
-         "12jnkj50yh2hc5l7j56lrrrmn58akrj9dwj98vzf42iq4h42kwb1"))))
+         "0cq8l6ybhff2q2dj2i73b4cnw6v2c6ql24jbrkh0xrpc9wjsarxj"))))
     (properties `((upstream-name . "colorRamps")))
     (build-system r-build-system)
     (home-page "https://cran.r-project.org/web/packages/colorRamps")
@@ -19985,14 +20017,14 @@ conditional reporting based on the current \"output level\".")
 (define-public r-tractor-base
   (package
     (name "r-tractor-base")
-    (version "3.3.5.1")
+    (version "3.4.2")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "tractor.base" version))
        (sha256
         (base32
-         "0fxbzbhpi6l55m14nmww8y3kdxgchzj4mw1yf4xkm2y6s68phvgc"))))
+         "12mp5x6c7c82a4z7p39cb478kwwf6lkrgbis6ak00yibsd3n6na3"))))
     (properties `((upstream-name . "tractor.base")))
     (build-system r-build-system)
     (propagated-inputs
@@ -20342,14 +20374,14 @@ library.")
 (define-public r-ontologyindex
   (package
     (name "r-ontologyindex")
-    (version "2.11")
+    (version "2.12")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ontologyIndex" version))
        (sha256
         (base32
-         "17ndvqvb74b980gpb3hpg9bd68bb5f52k9s1i2kd1f9cdrdjvw97"))))
+         "0gf0z0vgc1f4f70f2zpwz9bka0gbgbj4w3fcxncv1b7lbrxddrd8"))))
     (properties `((upstream-name . "ontologyIndex")))
     (build-system r-build-system)
     (native-inputs
@@ -21634,14 +21666,14 @@ them in distributed compute environments.")
 (define-public r-parallelly
   (package
     (name "r-parallelly")
-    (version "1.37.0")
+    (version "1.37.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "parallelly" version))
        (sha256
         (base32
-         "19zrfiakg5xg51r9va4r976b4lnnsj5nsk6i6srxsl227q45xra1"))))
+         "189ngbh9i6mqmfn4z6446in7687ddlpdq6v5rj3hr8zqinqlwznz"))))
     (properties `((upstream-name . "parallelly")))
     (build-system r-build-system)
     (home-page "https://github.com/HenrikBengtsson/parallelly")
@@ -23366,14 +23398,14 @@ sampling.")
 (define-public r-deldir
   (package
     (name "r-deldir")
-    (version "2.0-2")
+    (version "2.0-4")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "deldir" version))
        (sha256
         (base32
-         "1qzfq47fs3pr0946m53z6cq93pbpkgwwhqkcdgfahxsq1izpigz9"))))
+         "0ls69b9yynvsiy6madvzafcb0jdvxw66sin7cinpnw63israq66l"))))
     (build-system r-build-system)
     (native-inputs (list gfortran))
     (home-page "https://cran.r-project.org/web/packages/deldir")
@@ -23942,13 +23974,13 @@ SELECT or UPDATE queries to an end-point.")
 (define-public r-bookdown
   (package
     (name "r-bookdown")
-    (version "0.37")
+    (version "0.38")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "bookdown" version))
               (sha256
                (base32
-                "18j8ylaq5wnw1c0lif9a002kbymv04pd0i43ahmqkskkv1b13hdk"))
+                "1i0z75sxvy3cb582siz544az6b9bs3vk2kyij9zx5jdpc1247fgd"))
               ;; TODO: there is one more file to replace:
               ;; inst/resources/gitbook/js/app.min.js
               (snippet
@@ -24587,14 +24619,14 @@ packages with Rcpp.")
 (define-public r-tweenr
   (package
     (name "r-tweenr")
-    (version "2.0.2")
+    (version "2.0.3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "tweenr" version))
        (sha256
         (base32
-         "1wqzcsxlz1isb1j0v5g6dgvd40q3q9qlahvgcgiq0j4d87nzvfv4"))))
+         "1glc7ks5yymcm4pi0fjpi1zh7m5d4cz7zy20pa3kfraxlh9fbazg"))))
     (build-system r-build-system)
     (arguments
      (list
@@ -24797,28 +24829,27 @@ databases, including ENA, PDB or ChEMBL are also accessible.")
 (define-public r-ggraph
   (package
     (name "r-ggraph")
-    (version "2.1.0")
+    (version "2.2.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ggraph" version))
        (sha256
         (base32
-         "07sw4h94dzbs44dcvvj80g8v8252k4iw8pkmzdrk4qagvhidnvv8"))))
+         "0zs02xyzvimk8hj1z465zxp1hlca3gfirdcwb3gqriwsmnfhg661"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-cli
-           r-digest
+           r-cpp11
            r-dplyr
            r-ggforce
            r-ggplot2
            r-ggrepel
            r-graphlayouts
-           r-gtable
            r-igraph
            r-lifecycle
            r-mass
-           r-rcpp
+           r-memoise
            r-rlang
            r-scales
            r-tidygraph
@@ -26956,13 +26987,13 @@ guaranteeing well-connected communities.\" <arXiv:1810.08473>.")
 (define-public r-leidenalg
   (package
     (name "r-leidenalg")
-    (version "1.1.2")
+    (version "1.1.3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "leidenAlg" version))
        (sha256
-        (base32 "0wqay0rf28pgaf88bsvmrwgggzbma93rv9nqbydhjf1lc96ay1lz"))))
+        (base32 "0g4gs6rrz3wn97ag7wsfr6qa4zgb75i0k9jc1siii4pf6h689d1x"))))
     (properties
      `((upstream-name . "leidenAlg")
        (updater-extra-inputs . ("gmp"))))
@@ -28072,14 +28103,14 @@ server-side.")
 (define-public r-sysfonts
   (package
     (name "r-sysfonts")
-    (version "0.8.8")
+    (version "0.8.9")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "sysfonts" version))
        (sha256
         (base32
-         "1fq5dn4l09sgrbznfz9cakf4vgc3761zwicvqaazh0s8mzbaicpn"))))
+         "124zcnw88xnlhx27qjm07mw59f98jiwspmm65v94k815lqs9qiaj"))))
     (properties `((upstream-name . "sysfonts")))
     (build-system r-build-system)
     (inputs
@@ -28118,14 +28149,14 @@ package.")
 (define-public r-showtext
   (package
     (name "r-showtext")
-    (version "0.9-6")
+    (version "0.9-7")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "showtext" version))
        (sha256
         (base32
-         "0c4cssqk4s27pxfyb7fii97zhy4awzapj7bx9zkbki4va75mkjhf"))))
+         "12a8j87ca39fd8vn9ixzfgkbffz8ajyslhsx2hqjry1gzbk864i5"))))
     (properties `((upstream-name . "showtext")))
     (build-system r-build-system)
     (inputs
@@ -29825,14 +29856,14 @@ variable observed over time.")
 (define-public r-fda
   (package
     (name "r-fda")
-    (version "6.1.4")
+    (version "6.1.7")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "fda" version))
        (sha256
         (base32
-         "0595887hv80blx9aq63qnmc9vr022p21zqhgp2wmdjvq1g68x0g2"))))
+         "00hiz15v31zs5l0bqdkim1fpfd3bjvssv77iczq0si724s4fqxiq"))))
     (properties `((upstream-name . "fda")))
     (build-system r-build-system)
     (propagated-inputs
@@ -31332,14 +31363,14 @@ Raftery, Appl.Statistics, 1989); it includes inference and basic methods.")
 (define-public r-forecast
   (package
     (name "r-forecast")
-    (version "8.21.1")
+    (version "8.22.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "forecast" version))
        (sha256
         (base32
-         "09w1vh96cf9wz071why5f4265cvvwqi2b3wb0khrjvkzgkiaq7l1"))))
+         "09s5fdyzc6f5l8dy7ynjmd6l5fk3wvz59q0kfv2fd9da5c1mqd8w"))))
     (properties `((upstream-name . "forecast")))
     (build-system r-build-system)
     (propagated-inputs
@@ -31925,14 +31956,14 @@ perform @dfn{exploratory mediation} (XMed).")
 (define-public r-stanheaders
   (package
     (name "r-stanheaders")
-    (version "2.32.5")
+    (version "2.32.6")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "StanHeaders" version))
        (sha256
         (base32
-         "0wqps6xy2xypxsg3p3grdiw67a0xla3vh9x9hcf2ln03yhgkn4jl"))))
+         "18p1rch5ipj0f4jdvr8mnlk8pg1l4njjj4cgbp7ni7kcngsn3049"))))
     (properties `((upstream-name . "StanHeaders")))
     (build-system r-build-system)
     (inputs (list pandoc))
@@ -32329,14 +32360,14 @@ Latent regression models and plausible value imputation are also supported.")
 (define-public r-erm
   (package
     (name "r-erm")
-    (version "1.0-4")
+    (version "1.0-5")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "eRm" version))
        (sha256
         (base32
-         "0rp2lxkwkh09zmv101rzk7x1v1pmscp71qpf8f4chxp3idg6rpid"))))
+         "0bkivhiy02pibdcvb9z0i0yvc3wz3v33n6slhkkik61gcw1idmf0"))))
     (properties `((upstream-name . "eRm")))
     (build-system r-build-system)
     (propagated-inputs
@@ -33047,26 +33078,17 @@ statistics and p-values of the correlation coefficients.")
 (define-public r-hrbrthemes
   (package
     (name "r-hrbrthemes")
-    (version "0.8.0")
+    (version "0.8.7")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "hrbrthemes" version))
        (sha256
-        (base32 "057h60b5p53dcyjyfwlgjc1ry968s9s64dw78p443w8717zk7zpc"))))
+        (base32 "0vwrwcx3yp5yi1fw45zb5b3rhhbhrmzkl935s5apvf9lwjz2wjas"))))
     (properties `((upstream-name . "hrbrthemes")))
     (build-system r-build-system)
     (propagated-inputs
-     (list r-extrafont
-           r-gdtools
-           r-ggplot2
-           r-htmltools
-           r-knitr
-           r-magrittr
-           r-rmarkdown
-           r-scales))
-    (native-inputs
-     (list r-knitr))
+     (list r-extrafont r-gdtools r-ggplot2 r-magrittr r-scales))
     (home-page "https://github.com/hrbrmstr/hrbrthemes/")
     (synopsis "Additional themes, theme components and utilities for @code{ggplot2}")
     (description
@@ -34669,14 +34691,14 @@ package.")
 (define-public r-spatstat-geom
   (package
     (name "r-spatstat-geom")
-    (version "3.2-8")
+    (version "3.2-9")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "spatstat.geom" version))
        (sha256
         (base32
-         "08q9k7065gpjmwja4xac9q8jv2hdkgmwvdncrnhdk9xkzc0z9mjb"))))
+         "05ymr4h6g5kp6kinm8qi6mcwi51d2rp671cm3hqgyrhk91k72cx7"))))
     (properties `((upstream-name . "spatstat.geom")))
     (build-system r-build-system)
     (propagated-inputs
@@ -34755,13 +34777,13 @@ for spatial data on a linear network.")
 (define-public r-spatstat-random
   (package
     (name "r-spatstat-random")
-    (version "3.2-2")
+    (version "3.2-3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "spatstat.random" version))
        (sha256
-        (base32 "01rsh7z9prsdrqlbc2761sf54w24z7jzj64ijfzy8l5ca56fxij8"))))
+        (base32 "19rl757lccr169fj00zmhb1a20bxw4kljzb81hbbr5xhj0za6lp0"))))
     (properties `((upstream-name . "spatstat.random")))
     (build-system r-build-system)
     (propagated-inputs (list r-spatstat-data r-spatstat-geom r-spatstat-utils))
@@ -36870,13 +36892,13 @@ other R users.")
 (define-public r-seurat
   (package
     (name "r-seurat")
-    (version "5.0.1")
+    (version "5.0.2")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "Seurat" version))
               (sha256
                (base32
-                "038mqnavn3gxxx41yzq0q7gfnnx15dizryv8l374zwavpqsb84q7"))))
+                "1d49a9mhip81lvnkr8i4dznkmzyskdzrpi485w7yw2sr0qbyzg5c"))))
     (properties `((upstream-name . "Seurat")))
     (build-system r-build-system)
     (propagated-inputs
@@ -37053,11 +37075,11 @@ goal of enhancing interoperability between Seurat and Scanpy.")
       (license license:gpl3))))
 
 (define-public r-seuratdata
-  (let ((commit "b59556b24d7d6728a5744c9c715dd5f7f32ed7a5")
+  (let ((commit "4dc08e022f51c324bc7bf785b1b5771d2742701d")
         (revision "1"))
     (package
       (name "r-seuratdata")
-      (version (git-version "0.2.1" revision commit))
+      (version (git-version "0.2.2.9001" revision commit))
       (source
        (origin
          (method git-fetch)
@@ -37066,7 +37088,7 @@ goal of enhancing interoperability between Seurat and Scanpy.")
                (commit commit)))
          (file-name (git-file-name name version))
          (sha256
-          (base32 "1xfdmdmgn4r0z6w4cxa98ic6xk8i6qz054r215dvqbjs1vydsbf9"))))
+          (base32 "1wac1jqh42nbaikkd8v3apr1lwqcn1ppprfkwqfnqs6mvavgqavp"))))
       (properties `((upstream-name . "SeuratData")))
       (build-system r-build-system)
       (arguments
@@ -37076,8 +37098,7 @@ goal of enhancing interoperability between Seurat and Scanpy.")
            ;; the included list of packages.
            (add-after 'unpack 'set-HOME
              (lambda _ (setenv "HOME" "/tmp"))))))
-      (propagated-inputs
-       (list r-cli r-crayon r-rappdirs))
+      (propagated-inputs (list r-cli r-crayon r-rappdirs r-seurat r-seuratobject))
       (home-page "https://github.com/satijalab/seurat-data")
       (synopsis "Install and manage Seurat datasets")
       (description
@@ -37609,13 +37630,13 @@ implemented as @code{R6} classes.")
 (define-public r-mlr3
   (package
     (name "r-mlr3")
-    (version "0.17.2")
+    (version "0.18.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "mlr3" version))
               (sha256
                (base32
-                "0kcny3wxc7qc2538hxxdzs9bw4pq55s4abhlnpf1r13b2gkns323"))))
+                "0v83lwigpm227dqr8hz5x1khcjqf3q0glqvz812sckbcf74ibhdz"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-backports
@@ -37674,14 +37695,14 @@ vector machines, and gradient boosting.")
 (define-public r-bbotk
   (package
     (name "r-bbotk")
-    (version "0.7.3")
+    (version "0.8.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "bbotk" version))
        (sha256
         (base32
-         "1ddr5w7n68d3imcrm0ipgk1waml8zj4szi566dmmiqvlpzpgdr3p"))))
+         "1ggfl1lhvjnnkxib4svqd82agrvjcg1101cbf4g2c0kzgzm1jaj6"))))
     (properties `((upstream-name . "bbotk")))
     (build-system r-build-system)
     (propagated-inputs
@@ -37704,13 +37725,13 @@ annealing.")
 (define-public r-mlr3tuning
   (package
     (name "r-mlr3tuning")
-    (version "0.19.2")
+    (version "0.20.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "mlr3tuning" version))
               (sha256
                (base32
-                "1d27m6yzwr7chpf19q6mwpj2fyz9vv8k6nbg8z9615hmbp96lan5"))))
+                "1y1cqfqdx9v0lfb4619y2hw6clhhjzi7hjwrpwzdpd7ymcx3dgi3"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-bbotk
@@ -39190,14 +39211,14 @@ complex functions.")
 (define-public r-gganimate
   (package
     (name "r-gganimate")
-    (version "1.0.8")
+    (version "1.0.9")
     (source
       (origin
         (method url-fetch)
         (uri (cran-uri "gganimate" version))
         (sha256
           (base32
-            "1jabs9qr0319w508kdsk5nmzfhl6nzykpp1by7l639yfvrfqcbd1"))))
+            "016nky797h4093qrpynq5rr1p7h4chpv1hyngpcs2csr1064rjmz"))))
     (properties `((upstream-name . "gganimate")))
     (build-system r-build-system)
     (arguments
@@ -39212,13 +39233,17 @@ complex functions.")
       ;; For video output.
       (list ffmpeg))
     (propagated-inputs
-      (list r-ggplot2
+      (list r-cli
+            r-ggplot2
             r-glue
+            r-lifecycle
             r-progress
             r-rlang
             r-scales
             r-stringi
+            r-transformr
             r-tweenr
+            r-vctrs
             ;; For GIF/SVG output. gifski is faster, but depends on Rust.
             r-magick
             ;; For HTML output.
diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index aaf2157661..1a08748392 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -41,6 +41,7 @@
 ;;; Copyright © 2023, 2024 Troy Figiel <troy@troyfigiel.com>
 ;;; Copyright © 2024 Herman Rimm <herman@rimm.ee>
 ;;; Copyright © 2024 Tomas Volf <~@wolfsden.cz>
+;;; Copyright © 2024 Suhail Singh <suhail@bayesians.ca>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -3909,8 +3910,36 @@ capacity and random or least recently used (LRU) replacement.")
 Rust.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-async-broadcast-0.6
+  (package
+    (name "rust-async-broadcast")
+    (version "0.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "async-broadcast" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0d1xk2pr5khk1radkbaf7pp7pbjkb18m43n2rgkfsfxk177pak9k"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-event-listener" ,rust-event-listener-3)
+        ("rust-event-listener-strategy" ,rust-event-listener-strategy-0.1)
+        ("rust-futures-core" ,rust-futures-core-0.3))
+       #:cargo-development-inputs (("rust-criterion" ,rust-criterion-0.3)
+                                   ("rust-doc-comment" ,rust-doc-comment-0.3)
+                                   ("rust-easy-parallel" ,rust-easy-parallel-3)
+                                   ("rust-futures-lite" ,rust-futures-lite-1)
+                                   ("rust-futures-util" ,rust-futures-util-0.3))))
+    (home-page "https://github.com/smol-rs/async-broadcast")
+    (synopsis "Async broadcast channels")
+    (description "This package provides async broadcast channels in Rust.")
+    (license (list license:expat license:asl2.0))))
+
 (define-public rust-async-broadcast-0.5
   (package
+    (inherit rust-async-broadcast-0.6)
     (name "rust-async-broadcast")
     (version "0.5.1")
     (source (origin
@@ -3920,7 +3949,6 @@ Rust.")
               (sha256
                (base32
                 "0avdqbci1qdlfc4glc3wqrb0wi5ffc7bqv2q1wg14syayvdwqj3w"))))
-    (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
        (("rust-event-listener" ,rust-event-listener-2)
@@ -3930,11 +3958,7 @@ Rust.")
         ("rust-doc-comment" ,rust-doc-comment-0.3)
         ("rust-easy-parallel" ,rust-easy-parallel-3)
         ("rust-futures-lite" ,rust-futures-lite-1)
-        ("rust-futures-util" ,rust-futures-util-0.3))))
-    (home-page "https://github.com/smol-rs/async-broadcast")
-    (synopsis "Async broadcast channels")
-    (description "This package provides async broadcast channels in Rust.")
-    (license (list license:expat license:asl2.0))))
+        ("rust-futures-util" ,rust-futures-util-0.3))))))
 
 (define-public rust-async-channel-2
   (package
@@ -11700,6 +11724,34 @@ stream of tokens.")
        (("rust-clap" ,rust-clap-3)
         ("rust-snapbox" ,rust-snapbox-0.2))))))
 
+(define-public rust-clap-verbosity-flag-2
+  (package
+    (name "rust-clap-verbosity-flag")
+    (version "2.1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "clap-verbosity-flag" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "15f419hg1xskf7pwzk5n27cpn05n0ccbd6sbji906ymi47576zxm"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs (("rust-clap" ,rust-clap-4)
+                       ("rust-log" ,rust-log-0.4))
+       #:cargo-development-inputs
+       (("rust-clap" ,rust-clap-4)
+        ("rust-env-logger" ,rust-env-logger-0.10)
+        ("rust-tracing" ,rust-tracing-0.1)
+        ("rust-tracing-log" ,rust-tracing-log-0.2)
+        ("rust-tracing-subscriber" ,rust-tracing-subscriber-0.3))))
+    (home-page "https://github.com/clap-rs/clap-verbosity-flag")
+    (synopsis "Easily add a `--verbose` flag to CLIs using Clap")
+    (description
+     "This package provides a way to add a `--verbose` flag to CLIs using
+Clap.")
+    (license (list license:expat license:asl2.0))))
+
 (define-public rust-clearscreen-1
   (package
     (name "rust-clearscreen")
@@ -22343,6 +22395,23 @@ blocking data structures.")
     (description "This package provides block and poll on event_listener.")
     (license (list license:asl2.0 license:expat))))
 
+(define-public rust-event-listener-strategy-0.1
+  (package
+    (inherit rust-event-listener-strategy-0.4)
+    (name "rust-event-listener-strategy")
+    (version "0.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "event-listener-strategy" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1z99km9lwya36bxhvrz4rsl3nhqhhlnnx7a2gdz4nzpa6177pj8m"))))
+    (arguments
+     `(#:cargo-inputs (("rust-event-listener" ,rust-event-listener-3)
+                       ("rust-pin-project-lite" ,rust-pin-project-lite-0.2))
+       #:cargo-development-inputs (("rust-futures-lite" ,rust-futures-lite-1))))))
+
 (define-public rust-executable-path-1
   (package
     (name "rust-executable-path")
diff --git a/gnu/packages/crates-web.scm b/gnu/packages/crates-web.scm
index 6650c26913..60c735efa7 100644
--- a/gnu/packages/crates-web.scm
+++ b/gnu/packages/crates-web.scm
@@ -2045,6 +2045,27 @@ transfer coding.")
     (description "This package provides an async HTTP/3 implementation.")
     (license license:expat)))
 
+(define-public rust-h3-0.0.2
+  (package
+    (inherit rust-h3-0.0.3)
+    (name "rust-h3")
+    (version "0.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "h3" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "17nbmkz6xs848257xv7gdhrnhyhagfb0dbqla82zv1nixr1wmrkd"))))
+    (arguments
+     `(#:skip-build? #t
+       #:cargo-inputs (("rust-bytes" ,rust-bytes-1)
+                       ("rust-fastrand" ,rust-fastrand-1)
+                       ("rust-futures-util" ,rust-futures-util-0.3)
+                       ("rust-http" ,rust-http-0.2)
+                       ("rust-tokio" ,rust-tokio-1)
+                       ("rust-tracing" ,rust-tracing-0.1))))))
+
 (define-public rust-h3-quinn-0.0.4
   (package
     (name "rust-h3-quinn")
@@ -2071,6 +2092,26 @@ transfer coding.")
      "This package provides QUIC transport implementation based on Quinn.")
     (license license:expat)))
 
+(define-public rust-h3-quinn-0.0.3
+  (package
+    (inherit rust-h3-quinn-0.0.4)
+    (name "rust-h3-quinn")
+    (version "0.0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "h3-quinn" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0kf6bqmm751gwj24dqgb2rrwq8ibhv7z5v7ix4pfiwz4ccbiljid"))))
+    (arguments
+     `(#:cargo-inputs (("rust-bytes" ,rust-bytes-1)
+                       ("rust-futures" ,rust-futures-0.3)
+                       ("rust-h3" ,rust-h3-0.0.2)
+                       ("rust-quinn" ,rust-quinn-0.10)
+                       ("rust-quinn-proto" ,rust-quinn-proto-0.10)
+                       ("rust-tokio-util" ,rust-tokio-util-0.7))))))
+
 (define-public rust-headers-0.3
   (package
     (name "rust-headers")
@@ -2158,6 +2199,304 @@ transfer coding.")
        (("rust-bytes" ,rust-bytes-0.4)
         ("rust-http" ,rust-http-0.1))))))
 
+(define-public rust-hickory-client-0.24
+  (package
+    (name "rust-hickory-client")
+    (version "0.24.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "hickory-client" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0bj6g69h86d7mbclrwaj7cgl1plr6pvllv8qn69xmpgh9h90hgkz"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-test-flags
+       '("--release" "--lib" "--bins" "--tests" "--"
+         ;; Some tests require network access.
+         "--skip=client::async_client::tests::async_client")
+       #:cargo-inputs (("rust-cfg-if" ,rust-cfg-if-1)
+                       ("rust-data-encoding" ,rust-data-encoding-2)
+                       ("rust-futures-channel" ,rust-futures-channel-0.3)
+                       ("rust-futures-util" ,rust-futures-util-0.3)
+                       ("rust-hickory-proto" ,rust-hickory-proto-0.24)
+                       ("rust-once-cell" ,rust-once-cell-1)
+                       ("rust-radix-trie" ,rust-radix-trie-0.2)
+                       ("rust-rand" ,rust-rand-0.8)
+                       ("rust-rustls" ,rust-rustls-0.21)
+                       ("rust-serde" ,rust-serde-1)
+                       ("rust-thiserror" ,rust-thiserror-1)
+                       ("rust-tokio" ,rust-tokio-1)
+                       ("rust-tracing" ,rust-tracing-0.1))
+       #:cargo-development-inputs
+       (("rust-futures" ,rust-futures-0.3)
+        ("rust-openssl" ,rust-openssl-0.10)
+        ("rust-tokio" ,rust-tokio-1)
+        ("rust-tracing-subscriber" ,rust-tracing-subscriber-0.3))))
+    (native-inputs
+     (list openssl pkg-config))
+    (home-page "https://hickory-dns.org/")
+    (synopsis "Client library for Hickory DNS, with DNSSEC support")
+    (description
+     "Hickory DNS is a safe and secure DNS library.  This is the Client
+library with DNSSEC support.  DNSSEC with NSEC validation for negative
+records, is complete.  The client supports dynamic DNS with SIG0 authenticated
+requests, implementing easy to use high level funtions.  Hickory DNS is based
+on the Tokio and Futures libraries, which means it should be easily integrated
+into other software that also use those libraries.")
+    (license (list license:expat license:asl2.0))))
+
+(define-public rust-hickory-proto-0.24
+  (package
+    (name "rust-hickory-proto")
+    (version "0.24.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "hickory-proto" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1kxvdzmwwi1d6wsp9bcs91ipmwxcyhpwbvz3an9h0q28ryy6y6h9"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs (("rust-async-trait" ,rust-async-trait-0.1)
+                       ("rust-backtrace" ,rust-backtrace-0.3)
+                       ("rust-bytes" ,rust-bytes-1)
+                       ("rust-cfg-if" ,rust-cfg-if-1)
+                       ("rust-data-encoding" ,rust-data-encoding-2)
+                       ("rust-enum-as-inner" ,rust-enum-as-inner-0.6)
+                       ("rust-futures-channel" ,rust-futures-channel-0.3)
+                       ("rust-futures-io" ,rust-futures-io-0.3)
+                       ("rust-futures-util" ,rust-futures-util-0.3)
+                       ("rust-h2" ,rust-h2-0.3)
+                       ("rust-h3" ,rust-h3-0.0.2)
+                       ("rust-h3-quinn" ,rust-h3-quinn-0.0.3)
+                       ("rust-http" ,rust-http-0.2)
+                       ("rust-idna" ,rust-idna-0.4)
+                       ("rust-ipnet" ,rust-ipnet-2)
+                       ("rust-js-sys" ,rust-js-sys-0.3)
+                       ("rust-native-tls" ,rust-native-tls-0.2)
+                       ("rust-once-cell" ,rust-once-cell-1)
+                       ("rust-openssl" ,rust-openssl-0.10)
+                       ("rust-quinn" ,rust-quinn-0.10)
+                       ("rust-rand" ,rust-rand-0.8)
+                       ("rust-ring" ,rust-ring-0.16)
+                       ("rust-rustls" ,rust-rustls-0.21)
+                       ("rust-rustls-native-certs" ,rust-rustls-native-certs-0.6)
+                       ("rust-rustls-pemfile" ,rust-rustls-pemfile-1)
+                       ("rust-serde" ,rust-serde-1)
+                       ("rust-socket2" ,rust-socket2-0.5)
+                       ("rust-thiserror" ,rust-thiserror-1)
+                       ("rust-tinyvec" ,rust-tinyvec-1)
+                       ("rust-tokio" ,rust-tokio-1)
+                       ("rust-tokio-native-tls" ,rust-tokio-native-tls-0.3)
+                       ("rust-tokio-openssl" ,rust-tokio-openssl-0.6)
+                       ("rust-tokio-rustls" ,rust-tokio-rustls-0.24)
+                       ("rust-tracing" ,rust-tracing-0.1)
+                       ("rust-url" ,rust-url-2)
+                       ("rust-wasm-bindgen" ,rust-wasm-bindgen-0.2)
+                       ("rust-webpki-roots" ,rust-webpki-roots-0.25))
+       #:cargo-development-inputs
+       (("rust-futures-executor" ,rust-futures-executor-0.3)
+        ("rust-openssl" ,rust-openssl-0.10)
+        ("rust-tokio" ,rust-tokio-1)
+        ("rust-tracing-subscriber" ,rust-tracing-subscriber-0.3))))
+    (native-inputs
+     (list openssl pkg-config))
+    (home-page "https://hickory-dns.org/")
+    (synopsis
+     "Foundational DNS protocol library for all Hickory DNS projects")
+    (description
+     "Hickory DNS is a safe and secure DNS library.  This is the foundational
+DNS protocol library for all Hickory DNS projects.")
+    (license (list license:expat license:asl2.0))))
+
+(define-public rust-hickory-recursor-0.24
+  (package
+    (name "rust-hickory-recursor")
+    (version "0.24.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "hickory-recursor" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "146ifrml22hjydrw16qgfw32kv3v9wvvl4dqh45pg6fymxvw8xgi"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs (("rust-async-recursion" ,rust-async-recursion-1)
+                       ("rust-async-trait" ,rust-async-trait-0.1)
+                       ("rust-bytes" ,rust-bytes-1)
+                       ("rust-cfg-if" ,rust-cfg-if-1)
+                       ("rust-enum-as-inner" ,rust-enum-as-inner-0.6)
+                       ("rust-futures-util" ,rust-futures-util-0.3)
+                       ("rust-hickory-proto" ,rust-hickory-proto-0.24)
+                       ("rust-hickory-resolver" ,rust-hickory-resolver-0.24)
+                       ("rust-lru-cache" ,rust-lru-cache-0.1)
+                       ("rust-parking-lot" ,rust-parking-lot-0.12)
+                       ("rust-serde" ,rust-serde-1)
+                       ("rust-thiserror" ,rust-thiserror-1)
+                       ("rust-tokio" ,rust-tokio-1)
+                       ("rust-tracing" ,rust-tracing-0.1))
+       #:cargo-development-inputs
+       (("rust-tokio" ,rust-tokio-1)
+        ("rust-tracing-subscriber" ,rust-tracing-subscriber-0.3))))
+    (home-page "https://hickory-dns.org/")
+    (synopsis
+     "Hickory DNS Recursor is a DNS recursive resolver with DNSSEC support")
+    (description
+     "*WARNING* This library is experimental
+
+Hickory DNS Recursor is a safe and secure DNS recursive resolver with DNSSEC
+support.  Hickory DNS is based on the Tokio and Futures libraries, which means
+it should be easily integrated into other software that also use those
+libraries.  This library can be used as in the server and binary for
+performing recursive lookups.")
+    (license (list license:expat license:asl2.0))))
+
+(define-public rust-hickory-resolver-0.24
+  (package
+    (name "rust-hickory-resolver")
+    (version "0.24.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "hickory-resolver" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1s3486qczv9gaw8dap06c0bwb2bpqm23a0ihj169hsjf2qhz1f1m"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-test-flags
+       '("--release" "--lib" "--bins" "--tests" "--"
+         ;; Some tests require network access.
+         "--skip=async_resolver::tests::test_domain_search"
+         "--skip=async_resolver::tests::test_fqdn"
+         "--skip=async_resolver::tests::test_idna"
+         "--skip=async_resolver::tests::test_large_ndots"
+         "--skip=async_resolver::tests::test_lookup_cloudflare"
+         "--skip=async_resolver::tests::test_lookup_google"
+         "--skip=async_resolver::tests::test_lookup_quad9"
+         "--skip=async_resolver::tests::test_ndots"
+         "--skip=async_resolver::tests::test_search_list"
+         "--skip=hosts::tests::test_read_hosts_conf"
+         "--skip=name_server::name_server::tests::test_name_server"
+         "--skip=name_server::name_server_pool::tests::test_multi_use_conns"
+         "--skip=resolver::tests::test_lookup"
+         "--skip=system_conf::unix::tests::test_read_resolv_conf")
+         #:cargo-inputs (("rust-cfg-if" ,rust-cfg-if-1)
+                       ("rust-futures-util" ,rust-futures-util-0.3)
+                       ("rust-hickory-proto" ,rust-hickory-proto-0.24)
+                       ("rust-ipconfig" ,rust-ipconfig-0.3)
+                       ("rust-lru-cache" ,rust-lru-cache-0.1)
+                       ("rust-once-cell" ,rust-once-cell-1)
+                       ("rust-parking-lot" ,rust-parking-lot-0.12)
+                       ("rust-rand" ,rust-rand-0.8)
+                       ("rust-resolv-conf" ,rust-resolv-conf-0.7)
+                       ("rust-rustls" ,rust-rustls-0.21)
+                       ("rust-rustls-native-certs" ,rust-rustls-native-certs-0.6)
+                       ("rust-serde" ,rust-serde-1)
+                       ("rust-smallvec" ,rust-smallvec-1)
+                       ("rust-thiserror" ,rust-thiserror-1)
+                       ("rust-tokio" ,rust-tokio-1)
+                       ("rust-tokio-native-tls" ,rust-tokio-native-tls-0.3)
+                       ("rust-tokio-openssl" ,rust-tokio-openssl-0.6)
+                       ("rust-tokio-rustls" ,rust-tokio-rustls-0.24)
+                       ("rust-tracing" ,rust-tracing-0.1)
+                       ("rust-webpki-roots" ,rust-webpki-roots-0.25))
+       #:cargo-development-inputs
+       (("rust-futures-executor" ,rust-futures-executor-0.3)
+        ("rust-tokio" ,rust-tokio-1)
+        ("rust-tracing-subscriber" ,rust-tracing-subscriber-0.3))))
+    (home-page "https://hickory-dns.org/")
+    (synopsis
+     "Hickory DNS Resolver library built on top of tokio's @code{async-io}")
+    (description
+     "Hickory DNS Resolver is a safe and secure DNS library.  The Resolver is
+intended to be a high-level library for any DNS record resolution, see
+@code{Resolver} and @code{AsyncResolver} for supported resolution types.  The
+@code{Client} can be used for other queries.")
+    (license (list license:expat license:asl2.0))))
+
+(define-public rust-hickory-server-0.24
+  (package
+    (name "rust-hickory-server")
+    (version "0.24.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "hickory-server" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1dbwsrmxgf9nxkn3cp5fpjw96wywrzihbirjax25dd6wqidv9fsg"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-test-flags
+       '("--release" "--"
+         ;; Not all files included.
+         "--skip=store::file::authority::tests::test_load_zone"
+         "--skip=basic::file::test_a_lookup"
+         "--skip=basic::file::test_aname"
+         "--skip=basic::file::test_aname_a_lookup"
+         "--skip=basic::file::test_aname_chain"
+         "--skip=basic::file::test_cname"
+         "--skip=basic::file::test_cname_alias"
+         "--skip=basic::file::test_cname_chain"
+         "--skip=basic::file::test_dots_in_name"
+         "--skip=basic::file::test_invalid_lookup"
+         "--skip=basic::file::test_mx"
+         "--skip=basic::file::test_mx_to_null"
+         "--skip=basic::file::test_ns"
+         "--skip=basic::file::test_ns_lookup"
+         "--skip=basic::file::test_soa"
+         "--skip=basic::file::test_srv"
+         "--skip=basic::file::test_update_errors"
+         "--skip=basic::file::test_wildcard"
+         "--skip=basic::file::test_wildcard_chain"
+         "--skip=test_all_lines_are_loaded"
+         "--skip=test_implicit_in_class"
+         "--skip=test_ttl_wilcard")
+       #:cargo-inputs (("rust-async-trait" ,rust-async-trait-0.1)
+                       ("rust-basic-toml" ,rust-basic-toml-0.1)
+                       ("rust-bytes" ,rust-bytes-1)
+                       ("rust-cfg-if" ,rust-cfg-if-1)
+                       ("rust-enum-as-inner" ,rust-enum-as-inner-0.6)
+                       ("rust-futures-util" ,rust-futures-util-0.3)
+                       ("rust-h2" ,rust-h2-0.3)
+                       ("rust-h3" ,rust-h3-0.0.2)
+                       ("rust-h3-quinn" ,rust-h3-quinn-0.0.3)
+                       ("rust-hickory-proto" ,rust-hickory-proto-0.24)
+                       ("rust-hickory-recursor" ,rust-hickory-recursor-0.24)
+                       ("rust-hickory-resolver" ,rust-hickory-resolver-0.24)
+                       ("rust-http" ,rust-http-0.2)
+                       ("rust-openssl" ,rust-openssl-0.10)
+                       ("rust-rusqlite" ,rust-rusqlite-0.29)
+                       ("rust-rustls" ,rust-rustls-0.21)
+                       ("rust-serde" ,rust-serde-1)
+                       ("rust-thiserror" ,rust-thiserror-1)
+                       ("rust-time" ,rust-time-0.3)
+                       ("rust-tokio" ,rust-tokio-1)
+                       ("rust-tokio-openssl" ,rust-tokio-openssl-0.6)
+                       ("rust-tokio-rustls" ,rust-tokio-rustls-0.24)
+                       ("rust-tokio-util" ,rust-tokio-util-0.7)
+                       ("rust-tracing" ,rust-tracing-0.1))
+       #:cargo-development-inputs
+       (("rust-futures-executor" ,rust-futures-executor-0.3)
+        ("rust-tokio" ,rust-tokio-1)
+        ("rust-tracing-subscriber" ,rust-tracing-subscriber-0.3))))
+    (home-page "https://hickory-dns.org/")
+    (synopsis "Hickory DNS Server is a DNS server with DNSSEC support")
+    (description
+     "Hickory DNS Server is a safe and secure DNS server with DNSSEC support.
+Eventually this could be a replacement for BIND9.  The DNSSEC support allows
+for live signing of all records, in it does not currently support records
+signed offline.  The server supports dynamic DNS with SIG0 authenticated
+requests.  Hickory DNS is based on the Tokio and Futures libraries, which
+means it should be easily integrated into other software that also use those
+libraries.")
+    (license (list license:expat license:asl2.0))))
+
 (define-public rust-http-1
   (package
     (name "rust-http")
diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index db4fe0b447..62739fa1c0 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -45,7 +45,7 @@
 ;;; Copyright © 2020 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2020 Vinicius Monego <monego@posteo.net>
 ;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
-;;; Copyright © 2021 Sharlatan Hellseher <sharlatanus@gmail.com>
+;;; Copyright © 2021, 2024 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2021, 2024 Greg Hogan <code@greghogan.com>
 ;;; Copyright © 2021 David Larsson <david.larsson@selfhosted.xyz>
 ;;; Copyright © 2021 Pjotr Prins <pjotr.guix@thebird.nl>
@@ -62,6 +62,7 @@
 ;;; Copyright © 2023 Felix Gruber <felgru@posteo.ne
 ;;; Copyright © 2023 Munyoki Kilyungi <me@bonfacemunyoki.com>
 ;;; Copyright © 2023 Giacomo Leidi <goodoldpaul@autistici.org>
+;;; Copyright © 2024 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -110,6 +111,7 @@
   #:use-module (gnu packages golang-build)
   #:use-module (gnu packages golang-check)
   #:use-module (gnu packages golang-web)
+  #:use-module (gnu packages golang-xyz)
   #:use-module (gnu packages gperf)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
@@ -143,6 +145,7 @@
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-check)
+  #:use-module (gnu packages python-compression)
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages python-science)
   #:use-module (gnu packages python-web)
@@ -4984,6 +4987,77 @@ implementation, along with tools for interoperability with pandas, NumPy, and
 other traditional Python scientific computing packages.")
     (license license:asl2.0)))
 
+(define-public python-fastparquet
+  (package
+    (name "python-fastparquet")
+    (version "2024.2.0")
+    (source
+     (origin
+       ;; Fastparquet uses setuptools-scm to find the current version. This
+       ;; only works when we use the PyPI tarball, which does not contain
+       ;; tests. Instead, we use the git-fetch method and set the version via
+       ;; envar.
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/dask/fastparquet")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0f32dj1xvd11l0siznqd33dpjlhg9siylcjcfkcdlqfcy45jfj3v"))))
+    (build-system pyproject-build-system)
+    (arguments
+     (list
+      #:test-flags
+      #~(list "-n" "auto")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'relax-requirements
+            (lambda _
+              (substitute* "setup.py"
+                ;; Remove dependencies on git.
+                (("^.*\"git\", \"status\".*$") "")
+                ;; Guix is only compatible with a single version of numpy
+                ;; at a time. We can safely remove this dependency.
+                (("'oldest-supported-numpy'") ""))))
+          (add-before 'build 'pretend-version
+            ;; The version string is usually derived via setuptools-scm, but
+            ;; without the git metadata available, the version string is set
+            ;; to '0.0.0'.
+            (lambda _
+              (setenv "SETUPTOOLS_SCM_PRETEND_VERSION" #$version)))
+          (add-before 'check 'build-cython-extensions
+            ;; Cython extensions need to be built for the check phase.
+            (lambda _
+              (invoke "python" "setup.py" "build_ext" "--inplace"))))))
+    (propagated-inputs
+     (list python-cramjam
+           python-fsspec
+           python-lzo
+           python-numpy
+           python-packaging
+           python-pandas))
+    (native-inputs
+     (list python-cython
+           python-pytest-runner
+           python-pytest-xdist
+           python-setuptools-scm))
+    (home-page "https://github.com/dask/fastparquet")
+    (synopsis "Python implementation of the Parquet file format")
+    (description
+     "@code{fastparquet} is a Python implementation of the Parquet file
+format.  @code{fastparquet} is used implicitly by @code{dask}, @code{pandas}
+and @code{intake-parquet}.  It supports the following compression algorithms:
+
+@itemize
+@item Gzip
+@item Snappy
+@item Brotli
+@item LZ4
+@item Zstd
+@item LZO (optionally)
+@end itemize")
+    (license license:asl2.0)))
+
 (define-public python-crate
   (package
     (name "python-crate")
@@ -5302,6 +5376,8 @@ compatible with SQLite using a graphical user interface.")
                   go-github-com-mattn-go-runewidth
                   go-golang-org-x-xerrors
                   go-gopkg-in-yaml-v2))
+    (native-inputs (list go-github-com-google-go-cmp-cmp
+                         go-github-com-k0kubun-pp))
     (synopsis "SQL language server written in Go")
     (description
      "This package implements the @acronym{LSP, Language Server Protocol} for SQL.")
diff --git a/gnu/packages/dezyne.scm b/gnu/packages/dezyne.scm
index a5732f75bf..7ea2c155aa 100644
--- a/gnu/packages/dezyne.scm
+++ b/gnu/packages/dezyne.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2022, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2022, 2023, 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -34,14 +34,14 @@
 (define-public dezyne
   (package
     (name "dezyne")
-    (version "2.18.0")
+    (version "2.18.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://dezyne.org/download/dezyne/"
                            name "-" version ".tar.gz"))
        (sha256
-        (base32 "1lbrxycpvwmvif3gpjnz8iskvlxp7f8bl71k44j7acwqrp8j2szi"))))
+        (base32 "0i8a8bzsh58mpgrgb0sg0qfszmf144grdmr741qwxwww5b2nsmbj"))))
     (propagated-inputs (list boost
                              guile-json-4
                              guile-readline
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index a93165404e..7fa5df9202 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -137,6 +137,7 @@
 ;;; Copyright © 2023 Thanos Apollo <public@thanosapollo.com>
 ;;; Copyright © 2023 Ian Eure <ian@retrospec.tv>
 ;;; Copyright © 2024 Suhail Singh <suhail@bayesians.ca>
+;;; Copyright © 2024 dan <i@dan.games>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -371,14 +372,14 @@
 (define-public emacs-activities
   (package
     (name "emacs-activities")
-    (version "0.5.1")
+    (version "0.6")
     (source
      (origin
        (method url-fetch)
        (uri (string-append
              "https://elpa.gnu.org/packages/activities-" version ".tar"))
        (sha256
-        (base32 "0ng9sgajcpal881s3kavkmz0fc38f2h207hpqj62cf14z7bsk0zk"))))
+        (base32 "03dc2d9w40qp0qacv5vk49498qyb9y9n6ppd79jbglkpr0a60y21"))))
     (build-system emacs-build-system)
     (propagated-inputs (list emacs-persist))
     (home-page "https://github.com/alphapapa/activities.el")
@@ -23494,7 +23495,7 @@ according to a parsing expression grammar.")
 (define-public emacs-eldev
   (package
     (name "emacs-eldev")
-    (version "1.8.2")
+    (version "1.9")
     (source
      (origin
        (method git-fetch)
@@ -23503,7 +23504,7 @@ according to a parsing expression grammar.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "108px7lnf39ngvb8rcqb9qh2amcbs1h22dbwd1q7js2np2nd132y"))))
+        (base32 "0mhp3m4d5na844nnv107j706552h0q6xs93jkp4rmqiig73kq17w"))))
     (build-system emacs-build-system)
     (arguments
      (list
@@ -23841,6 +23842,29 @@ Citar note support:
 @end itemize")
     (license license:gpl3+)))
 
+(define-public emacs-citar-denote
+  (package
+    (name "emacs-citar-denote")
+    (version "2.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/pprevos/citar-denote")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0g476awbrdws7k7smk1qasz15df20zilx3wqbi3wj0i1q2dbsi8z"))))
+    (build-system emacs-build-system)
+    (propagated-inputs (list emacs-citar emacs-denote))
+    (home-page "https://github.com/pprevos/citar-denote")
+    (synopsis "Emacs package to create and retrieve bibliography notes with
+Citar and Denote")
+    (description
+     "@code{citar-denote} is a minor-mode integrating the Emacs Citar and
+Denote packages to enable create managing bibliographic notes and citations.")
+    (license license:gpl3+)))
+
 (define-public emacs-helm-bibtex
   (let ((commit "8ebf50d5bd368082d0b7ab79d26a52f372cdef98")
         (revision "1"))
@@ -33667,22 +33691,7 @@ simple but powerful Org contents.")
      (list
       #:include #~(cons "^src/" %default-include)
       #:tests? #t
-      ;; <https://github.com/emacs-eldev/eldev/issues/99#issuecomment-1912637609>
-      #:test-command #~(list "eldev" "-X" "-dtTC" "test")
-      #:phases
-      #~(modify-phases %standard-phases
-          (add-after 'unpack 'configure-eldev
-            (lambda _
-              (setenv "HOME"
-                      (string-append (getcwd) "/.eldev"))
-              (with-output-to-file "Eldev-local"
-                (lambda _
-                  (format #t "~s"
-                          '(dolist (d (split-string (getenv
-                                                     "EMACSLOADPATH")
-                                                    ":" t))
-                                   (ignore-errors
-                                    (eldev-use-local-dependency d)))))))))))
+      #:test-command #~(list "eldev" "--use-emacsloadpath" "-dtTC" "test")))
     (native-inputs (list emacs-buttercup emacs-eldev))
     (propagated-inputs (list emacs-org))
     (home-page "https://github.com/ox-tufte/ox-tufte")
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index 2cc420f7ba..368d4c331d 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -1013,7 +1013,7 @@ for use at smaller text sizes")))
 (define-public font-gnu-unifont
   (package
     (name "font-gnu-unifont")
-    (version "15.1.01")
+    (version "15.1.05")
     (source
      (origin
        (method url-fetch)
@@ -1023,7 +1023,7 @@ for use at smaller text sizes")))
              (string-append "mirror://gnu/unifont/unifont-"
                             version "/unifont-" version ".tar.gz")))
        (sha256
-        (base32 "1dydcqa2nvmnij5jzj10carrzssd3ar24i8zd18pk4zpl84l4pz1"))
+        (base32 "1yi33kxlgw7ds99za5bclh537sw8ggl94nrhhq7hwxaq8dgzaxfj"))
        (snippet
         '(begin
            (use-modules (guix build utils))
@@ -3280,7 +3280,7 @@ and readability.  This package bundles those icons into a font.")
 (define-public font-lxgw-wenkai
   (package
     (name "font-lxgw-wenkai")
-    (version "1.315")
+    (version "1.320")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3288,7 +3288,7 @@ and readability.  This package bundles those icons into a font.")
                     version "/lxgw-wenkai-v" version ".tar.gz"))
               (sha256
                (base32
-                "0isb7rbg8yb6hv8xk1ngngkgzpyb3papkl19jczwrwm373m8bn3f"))))
+                "1wvab2g2hcy8wqi23zva17rymqfrrfwd7yh0wbhfb67mz18wbjpm"))))
     (build-system font-build-system)
     (home-page "https://lxgw.github.io/2021/01/28/Klee-Simpchin/")
     (synopsis "Simplified Chinese Imitation Song typeface")
@@ -3302,7 +3302,7 @@ within GB 2312, standard glyphs for Mainland China is used.")
   (package
     (inherit font-lxgw-wenkai)
     (name "font-lxgw-wenkai-tc")
-    (version "1.011")
+    (version "1.320")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3310,7 +3310,7 @@ within GB 2312, standard glyphs for Mainland China is used.")
                     version "/lxgw-wenkai-tc-v" version ".tar.gz"))
               (sha256
                (base32
-                "0x83a7zg1w82bpilk84ajlisccf90kl01gz89fipgqji9nii71bv"))))
+                "0lzfci4zpia62vbnyv22ajlrd8gvwj1ff7iaa0mxs66dbb0p6pq8"))))
     (home-page "https://github.com/lxgw/LxgwWenKaitc")
     (synopsis "Traditional Chinese Imitation Song typeface")
     (description
@@ -3321,7 +3321,7 @@ dialects in Hong Kong and Taiwan.")))
 (define-public font-chiron-sung-hk
   (package
     (name "font-chiron-sung-hk")
-    (version "1.010")
+    (version "1.011")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -3330,8 +3330,22 @@ dialects in Hong Kong and Taiwan.")))
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "065p1gc5xjwc4kfw8bqpsbhaf1p4w0k4l0j04vjsjhcl4k9vyvfz"))))
+                "1916bb834y4r4312g14zid7w3pbx1i70jcgkkfbf4z20grrj891m"))))
     (build-system font-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (replace 'install
+                 (lambda _
+                   (let ((install (assoc-ref %standard-phases 'install)))
+                     (with-directory-excursion "VAR"
+                       (for-each delete-file (find-files "." "\\.ttf$"))
+                       (install #:outputs `(("out" . ,#$output))))
+                     (with-directory-excursion "OTF"
+                       (install #:outputs `(("out" . ,#$output:otf))))
+                     (with-directory-excursion "TTF"
+                       (install #:outputs `(("out" . ,#$output:ttf))))))))))
+    (outputs '("out" "otf" "ttf"))
     (home-page "https://chiron-fonts.github.io/")
     (synopsis "Traditional Chinese Song typeface")
     (description
@@ -3345,7 +3359,7 @@ prevalent typefaces in Traditional Chinese regions.")
   (package
     (inherit font-chiron-sung-hk)
     (name "font-chiron-hei-hk")
-    (version "2.508")
+    (version "2.509")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -3354,7 +3368,7 @@ prevalent typefaces in Traditional Chinese regions.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0drvkqk629z63k62v3ds559phl82dmkyvpx2r8mi99nnsz22a8ps"))))
+                "0bwx909sijpnc474355hlfjwgxin0m9yxd5k9qwmgxkp2rzqiwnk"))))
     (synopsis "Traditional Chinese Gothic typeface")
     (description
      "Chiron Hei HK is a Traditional Chinese Gothic typeface based on the Hong
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 41bfe40dff..9ff08e5e74 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -30,7 +30,7 @@
 ;;; Copyright © 2017, 2019, 2020 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017, 2018 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2017 Roel Janssen <roel@gnu.org>
-;;; Copyright © 2017-2023 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2017-2024 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2018 okapi <okapi@firemail.cc>
 ;;; Copyright © 2018 Tim Gesthuizen <tim.gesthuizen@yahoo.de>
 ;;; Copyright © 2018 Madalin Ionel-Patrascu <madalinionel.patrascu@mdc-berlin.de>
@@ -7089,7 +7089,7 @@ fish.  The whole game is accompanied by quiet, comforting music.")
 (define-public crawl
   (package
     (name "crawl")
-    (version "0.30.1")
+    (version "0.31.0")
     (source
      (origin
        (method git-fetch)
@@ -7098,7 +7098,7 @@ fish.  The whole game is accompanied by quiet, comforting music.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1rlp8z1n7ziv7aaa3fb4h4nnq24pfz1m23a99c1ra582fh0yx1pl"))
+        (base32 "0igrl0a9qd2g27q3wr86xjkpqcqs4y7bh3na1saqvpd4vc8mbayk"))
        (patches (search-patches "crawl-upgrade-saves.patch"))))
     (build-system gnu-build-system)
     (inputs
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
index ff830f8b35..c8902de6a0 100644
--- a/gnu/packages/gcc.scm
+++ b/gnu/packages/gcc.scm
@@ -13,6 +13,7 @@
 ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
 ;;; Copyright © 2022 Greg Hogan <code@greghogan.com>
+;;; Copyright © 2024 Zheng Junjie <873216071@qq.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -618,12 +619,12 @@ Go.  It also includes runtime support libraries for these languages.")
 (define %gcc-11-x86_64-micro-architectures
   ;; Suitable '-march' values for GCC 11.
   (append %gcc-10-x86_64-micro-architectures
-          '("sapphirerapids" "alterlake" "rocketlake" ;Intel
+          '("sapphirerapids" "alderlake" "rocketlake" ;Intel
 
             "btver1" "btver2"                     ;AMD
 
             ;; psABI micro-architecture levels
-            "x86-64-v1" "x86-64-v2" "x86-64-v3" "x86-64-v4")))
+            "x86-64" "x86-64-v2" "x86-64-v3" "x86-64-v4")))
 
 ;; Suitable '-march' values for GCC 12.
 (define %gcc-12-aarch64-micro-architectures
@@ -672,6 +673,7 @@ It also includes runtime support libraries for these languages.")
      `((compiler-cpu-architectures
         ("aarch64" ,@%gcc-7.5-aarch64-micro-architectures)
         ("armhf" ,@%gcc-7.5-armhf-micro-architectures)
+        ("i686" ,@%gcc-7.5-x86_64-micro-architectures)
         ("x86_64" ,@%gcc-7.5-x86_64-micro-architectures))
        ,@(package-properties gcc-6)))))
 
@@ -728,6 +730,7 @@ It also includes runtime support libraries for these languages.")
     `((compiler-cpu-architectures
        ("aarch64" ,@%gcc-10-aarch64-micro-architectures)
        ("armhf" ,@%gcc-10-armhf-micro-architectures)
+       ("i686" ,@%gcc-10-x86_64-micro-architectures)
        ("x86_64" ,@%gcc-10-x86_64-micro-architectures))
       ,@(package-properties gcc-8)))))
 
@@ -763,6 +766,7 @@ It also includes runtime support libraries for these languages.")
     `((compiler-cpu-architectures
        ("aarch64" ,@%gcc-11-aarch64-micro-architectures)
        ("armhf" ,@%gcc-11-armhf-micro-architectures)
+       ("i686" ,@%gcc-11-x86_64-micro-architectures)
        ("x86_64" ,@%gcc-11-x86_64-micro-architectures))
       ,@(package-properties gcc-8)))))
 
@@ -785,6 +789,7 @@ It also includes runtime support libraries for these languages.")
     `((compiler-cpu-architectures
        ("aarch64" ,@%gcc-12-aarch64-micro-architectures)
        ("armhf" ,@%gcc-12-armhf-micro-architectures)
+       ("i686" ,@%gcc-12-x86_64-micro-architectures)
        ("x86_64" ,@%gcc-12-x86_64-micro-architectures))
       ,@(package-properties gcc-11)))))
 
@@ -807,6 +812,7 @@ It also includes runtime support libraries for these languages.")
      `((compiler-cpu-architectures
         ("aarch64" ,@%gcc-13-aarch64-micro-architectures)
         ("armhf" ,@%gcc-13-armhf-micro-architectures)
+        ("i686" ,@%gcc-13-x86_64-micro-architectures)
         ("x86_64" ,@%gcc-13-x86_64-micro-architectures))
        ,@(package-properties gcc-11)))))
 
diff --git a/gnu/packages/gimp.scm b/gnu/packages/gimp.scm
index 9c8100dc7b..b458a6397c 100644
--- a/gnu/packages/gimp.scm
+++ b/gnu/packages/gimp.scm
@@ -38,6 +38,7 @@
   #:use-module (gnu packages)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages autotools)
+  #:use-module (gnu packages backup)
   #:use-module (gnu packages base)
   #:use-module (gnu packages build-tools)
   #:use-module (gnu packages documentation)
@@ -175,7 +176,7 @@ of a larger interface.")
 (define-public babl
   (package
     (name "babl")
-    (version "0.1.96")
+    (version "0.1.108")
     (source (origin
               (method url-fetch)
               (uri (list (string-append "https://download.gimp.org/pub/babl/"
@@ -189,12 +190,11 @@ of a larger interface.")
                                         "/babl-" version ".tar.xz")))
               (sha256
                (base32
-                "1xj5hlmm834lb84rpjlfxbqnm5piswgzhjas4h8z90x9b7j3yrrk"))))
+                "0x8lxvnhfpssj84x47y3y06vsvhd5afb9jknw38c8ymbxafzxpi6"))))
     (build-system meson-build-system)
     (arguments
      `(#:configure-flags
-       (list "-Denable-gir=false"
-             "-Dwith-docs=false")))
+       (list "-Dwith-docs=false")))
     (native-inputs
      (list gobject-introspection pkg-config vala))
     (propagated-inputs
@@ -215,7 +215,7 @@ provided, as well as a framework to add new color models and data types.")
 (define-public gegl
   (package
     (name "gegl")
-    (version "0.4.46")
+    (version "0.4.48")
     (source
      (origin
        (method url-fetch)
@@ -228,15 +228,11 @@ provided, as well as a framework to add new color models and data types.")
                   (string-append "ftp://ftp.gtk.org/pub/gegl/"
                                  (version-major+minor version)
                                  "/gegl-" version ".tar.xz")))
-       (patches
-        (search-patches "gegl-compatibility-old-librsvg.patch"))
        (sha256
-        (base32 "14p8n6vily0yp6gqafl2xy7d2rh1j48pcj0a7mglqxy83d4b5cyh"))))
+        (base32 "0iw2wag3sls7va4c3dmczisbs9na4ml0rppnk1ymv0789gcjd321"))))
     (build-system meson-build-system)
     (arguments
-     `(#:configure-flags
-       (list "-Dintrospection=false")
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'extend-test-time-outs
            (lambda _
@@ -287,8 +283,27 @@ buffers.")
     ;; application and GUI binary gegl is licensed under GPL.
     (license (list license:lgpl3+ license:gpl3+))))
 
-;; gnome-photos does not build against gegl 0.4.46 yet.
+;; gnome-photos does not build against gegl 0.4.46 or newer yet.
 ;; See also <https://gitlab.gnome.org/GNOME/gnome-photos/-/issues/214>.
+(define-public babl-0.1.96
+  (package
+    (inherit babl)
+    (version "0.1.96")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (list (string-append "https://download.gimp.org/pub/babl/"
+                                 (version-major+minor version)
+                                 "/babl-" version ".tar.xz")
+                  (string-append "https://ftp.gtk.org/pub/babl/"
+                                 (version-major+minor version)
+                                 "/babl-" version ".tar.xz")
+                  (string-append "ftp://ftp.gtk.org/pub/babl/"
+                                 (version-major+minor version)
+                                 "/babl-" version ".tar.xz")))
+       (sha256
+        (base32 "1xj5hlmm834lb84rpjlfxbqnm5piswgzhjas4h8z90x9b7j3yrrk"))))))
+
 (define-public gegl-0.4.44
   (package
     (inherit gegl)
@@ -306,12 +321,15 @@ buffers.")
                                  (version-major+minor version)
                                  "/gegl-" version ".tar.xz")))
        (sha256
-        (base32 "09k1sn4h0bakgmq2hgd1iamprngpr81ky3fd9446lh2ycd0xnk0a"))))))
+        (base32 "09k1sn4h0bakgmq2hgd1iamprngpr81ky3fd9446lh2ycd0xnk0a"))))
+    (propagated-inputs
+     (modify-inputs (package-propagated-inputs gegl)
+       (replace "babl" babl-0.1.96)))))
 
 (define-public gimp
   (package
     (name "gimp")
-    (version "2.10.34")
+    (version "2.10.36")
     (source
      (origin
        (method url-fetch)
@@ -319,7 +337,7 @@ buffers.")
                            (version-major+minor version)
                            "/gimp-" version ".tar.bz2"))
        (sha256
-        (base32 "18vscmy293q6wq78almv0m7r8jh4j8szvmrw56j9icsisd14c044"))))
+        (base32 "1cnvgkni2q4psv8syyl5yd9kk84fv5g3imd2kgm3mnsbkb3c6frx"))))
     (build-system gnu-build-system)
     (outputs '("out"
                "doc"))                  ; 9 MiB of gtk-doc HTML
@@ -393,6 +411,52 @@ as well as specialized ones.  It features a highly customizable interface
 that is extensible via a plugin system.")
     (license license:gpl3+))) ; some files are lgplv3
 
+(define-public gimp-next
+  (package
+    (inherit gimp)
+    (name "gimp-next")
+    (version "2.99.18")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://download.gimp.org/pub/gimp/v"
+                           (version-major+minor version)
+                           "/gimp-" version ".tar.xz"))
+       (sha256
+        (base32 "0vnvdl7x88njyyxkbgdbhz6jwz1qasrxh0fpwk6x1m609alvf6wc"))))
+    (build-system meson-build-system)
+    (arguments
+     (list #:modules `((ice-9 popen)
+                       (ice-9 rdelim)
+                       (guix build meson-build-system)
+                       (guix build utils))
+           #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'unpack 'remove-gcc-reference
+                 ;; Avoid reference to GCC.
+                 (lambda _
+                   (let* ((port (open-input-pipe "gcc -v 2>&1 | tail -n 1"))
+                          (cc-version (read-line port)))
+                     (close-pipe port)
+                     (substitute* "app/gimp-version.c"
+                       (("CC_VERSION") (string-append "\"" cc-version "\""))))))
+               (add-after 'install 'move-doc
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let ((out (assoc-ref outputs "out"))
+                         (doc (assoc-ref outputs "doc")))
+                     (mkdir-p (string-append doc "/share"))
+                     (rename-file (string-append out "/share/doc")
+                                  (string-append doc "/share/doc"))))))))
+    (inputs (modify-inputs (package-inputs gimp)
+              (replace "gtk+" gtk+)
+              (prepend libxmu libxt)
+              (prepend python gjs)
+              (prepend libxslt)))
+    (native-inputs (modify-inputs (package-native-inputs gimp)
+                     (prepend appstream-glib
+                              gi-docgen
+                              libarchive)))))
+
 (define-public gimp-fourier
   (package
     (name "gimp-fourier")
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 103065141e..97e7f25532 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -5602,6 +5602,9 @@ file.")
                                 "-Dlocalstatedir=/var"
                                 "-Dman=false"
                                 "-Dsystemd=false") ;no systemd
+      ;; Apparently the tests are known to fail on big-endian systems.
+      #:tests? (not (or (%current-target-system)
+                        (not (target-little-endian?))))
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'disable-problematic-tests
diff --git a/gnu/packages/golang-compression.scm b/gnu/packages/golang-compression.scm
index 568fdd12b9..b999c063ee 100644
--- a/gnu/packages/golang-compression.scm
+++ b/gnu/packages/golang-compression.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2022 Sharlatan Hellseher <sharlatanus@gmail.com>
+;;; Copyright © 2024 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -84,6 +85,30 @@ the @code{c2go} tool at
 compression format.")
     (license license:bsd-3)))
 
+(define-public go-github-com-hhrutter-lzw
+  (package
+    (name "go-github-com-hhrutter-lzw")
+    (version "1.0.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hhrutter/lzw")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1n13qhf8ih08jzm10wprdvjy56ylmy6fhakyqrddm6nszf397wch"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/hhrutter/lzw"))
+    (home-page "https://github.com/hhrutter/lzw")
+    (synopsis "Extended version of @code{compress/lzw}")
+    (description
+     "This package provides an enhanced version of the @code{compress/lzw}
+library included in the stdlib, and supports GIF, TIFF and PDF.")
+    (license license:bsd-3)))
+
 (define-public go-github-com-klauspost-compress
   (package
     (name "go-github-com-klauspost-compress")
@@ -115,9 +140,32 @@ compression format.")
     (description "@code{compress} provides various compression algorithms.")
     (license license:bsd-3)))
 
-(define-public go-github.com-ulikunitz-xz
+(define-public go-github-com-nwaples-rardecode-v2
+  (package
+    (name "go-github-com-nwaples-rardecode-v2")
+    (version "2.0.0-beta.2")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/nwaples/rardecode")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1344mxfdgs5fps6mqxk6352arrfszi33kmq394rgmqpf4394f1y7"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/nwaples/rardecode"))
+    (home-page "https://github.com/nwaples/rardecode")
+    (synopsis "Reading RAR archives in Go")
+    (description
+     "This package provides a library for reading RAR archives with Golang.")
+    (license license:bsd-2)))
+
+(define-public go-github-com-ulikunitz-xz
   (package
-    (name "go-github.com-ulikunitz-xz")
+    (name "go-github-com-ulikunitz-xz")
     (version "0.5.8")
     (source
      (origin
diff --git a/gnu/packages/golang-web.scm b/gnu/packages/golang-web.scm
index 4f2c6f8c1a..1d7ad01af2 100644
--- a/gnu/packages/golang-web.scm
+++ b/gnu/packages/golang-web.scm
@@ -1216,6 +1216,34 @@ which produce colorized output using github.com/fatih/color.")
     (description "OpenTracing-Go is a Go implementation of the OpenTracing API.")
     (license license:asl2.0)))
 
+(define-public go-github-com-pkg-sftp
+  (package
+    (name "go-github-com-pkg-sftp")
+    (version "1.13.6")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/pkg/sftp")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0n35lzfrnrffjqy34ny6gxs27kq81s67ply6q8s1g19mhfzm6my7"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/pkg/sftp"))
+    (propagated-inputs (list go-golang-org-x-crypto go-github-com-kr-fs))
+    (native-inputs (list go-github-com-stretchr-testify))
+    (home-page "https://github.com/pkg/sftp")
+    (synopsis "SFTP implementation for Go")
+    (description
+     "This package provides an @acronym{SFTP, SSH File Transfer Protocol}
+implementation, as described in
+@url{https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt},
+for Go.")
+    (license license:bsd-2)))
+
 (define-public go-github-com-pquerna-cachecontrol
   (package
     (name "go-github-com-pquerna-cachecontrol")
@@ -1394,6 +1422,38 @@ an interface to implement any other minifier.")
 sockets.")
       (license license:expat))))
 
+(define-public go-github-com-ugorji-go-codec
+  (package
+    (name "go-github-com-ugorji-go-codec")
+    (version "1.2.12")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/ugorji/go")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "11j0sd7kli2bh2npfr2znnvdjsk118rs8khqzfdp6pb5jm0l20ib"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/ugorji/go/codec"
+      #:unpack-path "github.com/ugorji/go"
+      #:phases #~(modify-phases %standard-phases
+                   (add-after 'unpack 'remove-benchmarks
+                     (lambda* (#:key import-path #:allow-other-keys)
+                       (delete-file-recursively (string-append "src/"
+                                                               import-path
+                                                               "/bench")))))))
+    (propagated-inputs (list go-golang-org-x-tools))
+    (home-page "https://github.com/ugorji/go")
+    (synopsis "Codec and encoding library for various serialization formats")
+    (description
+     "This package provides a high performance and feature rich codec and
+encoding library for the MessagePack, CBOR, JSON and the Binc formats.")
+    (license license:expat)))
+
 (define-public go-github-com-valyala-fasthttp
   (package
     (name "go-github-com-valyala-fasthttp")
diff --git a/gnu/packages/golang-xyz.scm b/gnu/packages/golang-xyz.scm
index e68948e495..0b3db6e379 100644
--- a/gnu/packages/golang-xyz.scm
+++ b/gnu/packages/golang-xyz.scm
@@ -1,20 +1,26 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017, 2018, 2019 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2018 Christopher Baines <mail@cbaines.net>
 ;;; Copyright © 2018 Pierre-Antoine Rouby <pierre-antoine.rouby@inria.fr>
 ;;; Copyright © 2019 Brian Leung <bkleung89@gmail.com>
-;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2019 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2020 Joseph LaFreniere <joseph@lafreniere.xyz>
 ;;; Copyright © 2020 Oleg Pykhalov <go.wigust@gmail.com>
+;;; Copyright © 2020, 2021 raingloom <raingloom@riseup.net>
+;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>
 ;;; Copyright © 2021 Raghav Gururajan <rg@raghavgururajan.name>
 ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
+;;; Copyright © 2021, 2023, 2024 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2022 Dominic Martinez <dom@dominicm.dev>
 ;;; Copyright © 2023 Benjamin <benjamin@uvy.fr>
 ;;; 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 Thomas Ieong <th.ieong@free.fr>
 ;;; Copyright © 2023 Timo Wilken <guix@twilken.net>
-;;; Copyright © 2023, 2024 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2024 Artyom V. Poptsov <poptsov.artyom@gmail.com>
+;;; Copyright © 2024 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -44,7 +50,8 @@
   #:use-module (gnu packages golang-build)
   #:use-module (gnu packages golang-check)
   #:use-module (gnu packages golang-compression)
-  #:use-module (gnu packages golang-crypto))
+  #:use-module (gnu packages golang-crypto)
+  #:use-module (gnu packages linux))
 
 ;;; Commentary:
 ;;;
@@ -348,6 +355,35 @@ quantiles over an unbounded data stream within low memory and CPU bounds.")
 similar to Go's standard library @code{json} and @code{xml} package.")
     (license license:expat)))
 
+(define-public go-github-com-cheggaaa-pb-v3
+  (package
+    (name "go-github-com-cheggaaa-pb-v3")
+    (version "3.0.8")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/cheggaaa/pb/")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0d701s2niy39r650d1phjw19h4l27b1yfc2ih6s31f56b3zzqspx"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:import-path "github.com/cheggaaa/pb/v3"
+       #:unpack-path "github.com/cheggaaa/pb"))
+    (propagated-inputs
+     (list go-github-com-fatih-color
+           go-github-com-mattn-go-colorable
+           go-github-com-mattn-go-isatty
+           go-github-com-mattn-go-runewidth
+           go-github-com-vividcortex-ewma))
+    (home-page "https://github.com/cheggaaa/pb/")
+    (synopsis "Console progress bar for Go")
+    (description
+     "This package is a Go library that draws progress bars on the terminal.")
+    (license license:bsd-3)))
+
 (define-public go-github-com-coocood-freecache
   (package
     (name "go-github-com-coocood-freecache")
@@ -503,6 +539,31 @@ its C API.")))
     (description "Go bindings to systemd for (de)serialization and comparison
 of unit files.")))
 
+(define-public go-github-com-cskr-pubsub
+  (package
+    (name "go-github-com-cskr-pubsub")
+    (version "2.0.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/cskr/pubsub")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "18kqfdzkfs7z8266a5q5wldwkcvnhc7yw09b9vr8r0s7svy8d5s6"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:tests? #t ; Tests require network interface access
+      #:go go-1.18
+      #:import-path "github.com/cskr/pubsub"))
+    (home-page "https://github.com/cskr/pubsub")
+    (synopsis "Simple pubsub package for go")
+    (description
+     "Package @code{pubsub} implements a simple multi-topic pub-sub library.")
+    (license license:bsd-2)))
+
 (define-public go-github-com-cyberdelia-go-metrics-graphite
   (package
     (name "go-github-com-cyberdelia-go-metrics-graphite")
@@ -529,6 +590,29 @@ of unit files.")))
 metrics to Graphite.")
     (license license:bsd-2)))
 
+(define-public go-github-com-dave-jennifer
+  (package
+    (name "go-github-com-dave-jennifer")
+    (version "1.7.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/dave/jennifer")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "01sgafbds8n5zs61qf057whn06yj6avz30xgxk6pllf22528558m"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:go go-1.20
+      #:import-path "github.com/dave/jennifer"))
+    (home-page "https://github.com/dave/jennifer")
+    (synopsis "Code generator for Go")
+    (description "This package provides functionality to generate Go code.")
+    (license license:expat)))
+
 (define-public go-github-com-dimchansky-utfbom
   (package
     (name "go-github-com-dimchansky-utfbom")
@@ -686,6 +770,223 @@ Differentiation between text and binary files}.
 @end itemize")
     (license license:expat)))
 
+(define-public go-github-com-hashicorp-errwrap
+  (package
+    (name "go-github-com-hashicorp-errwrap")
+    (version "1.1.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hashicorp/errwrap")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0p5wdz8p7dmwphmb33gwhy3iwci5k9wkfqmmfa6ay1lz0cqjwp7a"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/hashicorp/errwrap"))
+    (home-page "https://github.com/hashicorp/errwrap")
+    (synopsis "Wrapping and querying errors for Golang")
+    (description
+     "@code{errwrap} is a package for Go that formalizes the pattern of
+wrapping errors and checking if an error contains another error.")
+    (license license:mpl2.0)))
+
+(define-public go-github-com-hashicorp-hcl
+  (package
+    (name "go-github-com-hashicorp-hcl")
+    (version "1.0.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hashicorp/hcl")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0q6ml0qqs0yil76mpn4mdx4lp94id8vbv575qm60jzl1ijcl5i66"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/hashicorp/hcl"))
+    (native-inputs
+     (list go-github-com-davecgh-go-spew))
+    (synopsis "Go implementation of HashiCorp Configuration Language V1")
+    (description
+     "This package contains the main implementation of the @acronym{HCL,
+HashiCorp Configuration Language}.  HCL is designed to be a language for
+expressing configuration which is easy for both humans and machines to read.")
+    (home-page "https://github.com/hashicorp/hcl")
+    (license license:mpl2.0)))
+
+(define-public go-github-com-hashicorp-hcl-v2
+  (package
+    (name "go-github-com-hashicorp-hcl-v2")
+    (version "2.11.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hashicorp/hcl")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0f9flmmkj7fr1337fc56cqy73faq87ix375hnz3id4wc023przv1"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/hashicorp/hcl/v2"))
+    (native-inputs
+     (list go-github-com-davecgh-go-spew))
+    (inputs
+     (list go-github-com-agext-levenshtein
+           go-github-com-apparentlymart-go-textseg-v13
+           go-github-com-mitchellh-go-wordwrap
+           go-github-com-zclconf-go-cty))
+    (synopsis "Go implementation of HashiCorp Configuration Language V2")
+    (description
+     "This package contains the main implementation of the @acronym{HCL,
+HashiCorp Configuration Language}.  HCL is designed to be a language for
+expressing configuration which is easy for both humans and machines to read.")
+    (home-page "https://github.com/hashicorp/hcl")
+    (license license:mpl2.0)))
+
+(define-public go-github-com-hashicorp-go-multierror
+  (package
+    (name "go-github-com-hashicorp-go-multierror")
+    (version "1.1.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hashicorp/go-multierror")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0l4s41skdpifndn9s8y6s9vzgghdzg4z8z0lld9qjr28888wzp00"))))
+    (build-system go-build-system)
+    (inputs (list go-github-com-hashicorp-errwrap))
+    (arguments
+     (list
+      #:import-path "github.com/hashicorp/go-multierror"))
+    (home-page "https://github.com/hashicorp/go-multierror")
+    (synopsis "Representing a errors list as a single error for Golang")
+    (description
+     "@code{go-multierror} is Golang module providing a mechanism for
+representing a list of @code{error} values as a single @code{error}.  It is
+fully compatible with the standard @code{errors} package, including
+the functions @code{As}, @code{Is}, and @code{Unwrap}.  This provides a
+standardized approach for introspecting on error values.")
+    (license license:mpl2.0)))
+
+(define-public go-github-com-hashicorp-go-syslog
+  (package
+    (name "go-github-com-hashicorp-go-syslog")
+    (version "1.0.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hashicorp/go-syslog")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "09vccqggz212cg0jir6vv708d6mx0f9w5bxrcdah3h6chgmal6v1"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/hashicorp/go-syslog"))
+    (home-page "https://github.com/hashicorp/go-syslog")
+    (synopsis "Golang syslog wrapper, cross-compile friendly")
+    (description
+     "This package is a very simple wrapper around log/syslog")
+    (license license:expat)))
+
+(define-public go-github-com-hashicorp-go-uuid
+  (package
+    (name "go-github-com-hashicorp-go-uuid")
+    (version "1.0.3")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hashicorp/go-uuid")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0wd4maaq20alxwcvfhr52rzfnwwpmc2a698ihyr0vfns2sl7gkzk"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/hashicorp/go-uuid"))
+    (home-page "https://github.com/hashicorp/go-uuid")
+    (synopsis "Generate UUID-format strings")
+    (description
+     "This package generates UUID-format strings using high quality bytes.
+It is not intended to be RFC compliant, merely to use a well-understood string
+representation of a 128-bit value.  It can also parse UUID-format strings into
+their component bytes.")
+    (license license:mpl2.0)))
+
+(define-public go-github-com-hashicorp-go-version
+  (package
+    (name "go-github-com-hashicorp-go-version")
+    (version "1.6.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hashicorp/go-version")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0fw6hwvjadpbfj10yk7f64ypw8lmv5s5ny3s4ria0nv6xam1wpai"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:import-path "github.com/hashicorp/go-version"))
+    (home-page "https://github.com/hashicorp/go-version")
+    (synopsis "Go library for parsing and verifying versions and version
+constraints")
+    (description
+     "This package is a library for parsing versions and version
+constraints, and verifying versions against a set of constraints.  It can sort
+a collection of versions properly, handles prerelease/beta versions, can
+increment versions.")
+    (license license:mpl2.0)))
+
+(define-public go-github-com-hhrutter-tiff
+  (package
+    (name "go-github-com-hhrutter-tiff")
+    (version "1.0.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hhrutter/tiff")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "09fzgvxwkd34izbfd26ln8vdbhc4j9gxpar3s7h9h125psrjvg0k"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/hhrutter/tiff"))
+    (propagated-inputs (list go-golang-org-x-image go-github-com-hhrutter-lzw))
+    (home-page "https://github.com/hhrutter/tiff")
+    (synopsis "Extended version of @code{golang.org/x/image/tiff}")
+    (description "This package is an enhanced version of the
+@code{golang.org/x/image/tiff} library featuring:
+
+@itemize
+@item Read support for CCITT Group3/4 compressed images.
+@item Read/write support for LZW compressed images.
+@item Read/write support for the CMYK color model.
+@end itemize")
+    (license license:bsd-3)))
+
 (define-public go-github-com-jinzhu-copier
   (package
     (name "go-github-com-jinzhu-copier")
@@ -709,6 +1010,33 @@ Differentiation between text and binary files}.
 struct to another.")
     (license license:expat)))
 
+(define-public go-github-com-k0kubun-pp
+  (package
+    (name "go-github-com-k0kubun-pp")
+    (version "3.2.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/k0kubun/pp")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1vpp5n3kdazk4s1ljhwbrhz3kilzvdvx5hya922bg0q9vnjqqvvc"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:import-path "github.com/k0kubun/pp"))
+    (propagated-inputs (list go-github-com-mattn-go-colorable
+                             go-golang-org-x-text))
+    (home-page "https://github.com/k0kubun/pp")
+    (synopsis "Colored pretty-printer for Go")
+    (description
+     "This package provides a pretty-printer for Go.  The functions defined by
+@code{pp} follow an API similar to @code{fmt} and its configuration can be
+customized globally.")
+    (license license:expat)))
+
 (define-public go-github-com-matryer-try
   (package
     (name "go-github-com-matryer-try")
@@ -1092,6 +1420,78 @@ Metrics library.")
       (home-page "https://github.com/rcrowley/go-metrics")
       (license license:bsd-2))))
 
+(define-public go-github-com-shirou-gopsutil
+  (package
+    (name "go-github-com-shirou-gopsutil")
+    (version "2.21.11")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/shirou/gopsutil")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0gpb10xkdwfimn1sp4jhrvzz4p3zgmdb78q8v23nap3yi6v4bff5"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:go go-1.18
+      #:import-path "github.com/shirou/gopsutil"
+      #:phases #~(modify-phases %standard-phases
+                   (add-after 'unpack 'remove-v3
+                     (lambda* (#:key import-path #:allow-other-keys)
+                       ;; We remove the separately included v3 module.
+                       (delete-file-recursively (string-append "src/"
+                                                               import-path
+                                                               "/v3"))))
+                   (add-before 'check 'remove-failing-tests
+                     (lambda* (#:key import-path #:allow-other-keys)
+                       (delete-file-recursively
+                        ;; host_test.go tries to access files such as
+                        ;; /var/run/utmp that do not exist in the build
+                        ;; environment.
+                        (string-append "src/" import-path "/host/host_test.go")))))))
+    (propagated-inputs
+     (list go-github-com-tklauser-go-sysconf go-golang-org-x-sys))
+    (native-inputs
+     (list go-github-com-stretchr-testify procps))
+    (synopsis "Process and system monitoring in Go")
+    (description
+     "This package provides a library for retrieving information
+on running processes and system utilization (CPU, memory, disks, network,
+sensors).")
+    (home-page "https://github.com/shirou/gopsutil")
+    (license license:bsd-3)))
+
+(define-public go-github-com-shirou-gopsutil-v3
+  (package
+    (inherit go-github-com-shirou-gopsutil)
+    (name "go-github-com-shirou-gopsutil-v3")
+    (version "3.24.2")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/shirou/gopsutil")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1xlfcx6giqaxdah2m02q2i8ynwlzar953wr8wqx1j3004xdgaivd"))))
+    (arguments
+     (list
+      #:go go-1.18
+      #:import-path "github.com/shirou/gopsutil"
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'check 'remove-failing-tests
+            (lambda* (#:key import-path #:allow-other-keys)
+              (delete-file-recursively
+               ;; host_test.go tries to access files such as
+               ;; /var/run/utmp that do not exist in the build
+               ;; environment.
+               (string-append "src/" import-path "/host/host_test.go")))))))))
+
 (define-public go-github-com-skip2-go-qrcode
   (package
     (name "go-github-com-skip2-go-qrcode")
@@ -1189,6 +1589,102 @@ Use waterutil with it to work with TUN/TAP packets/frames.")
       (home-page "https://github.com/stathat/go")
       (license license:expat))))
 
+(define-public go-github-com-tklauser-go-sysconf
+  (package
+    (name "go-github-com-tklauser-go-sysconf")
+    (version "0.3.13")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/tklauser/go-sysconf")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "07vkimncnmh89706s49599h2w9gwa6jyrv70f8ifw90nsh766km9"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:go go-1.18
+      #:import-path "github.com/tklauser/go-sysconf"
+      #:phases #~(modify-phases %standard-phases
+                   (add-before 'check 'remove-failing-tests
+                     (lambda* (#:key import-path #:allow-other-keys)
+                       (delete-file-recursively
+                        ;; sysconf_test.go (among others) tries to read the
+                        ;; number of online CPUs using /proc/stat and
+                        ;; /sys/devices/system/cpu/online. These files are not
+                        ;; accessible in the test environment.
+                        (string-append "src/" import-path
+                                       "/cgotest/sysconf_test.go")))))))
+    (propagated-inputs (list go-golang-org-x-sys
+                             go-github-com-tklauser-numcpus))
+    (home-page "https://github.com/tklauser/go-sysconf")
+    (synopsis "Go implementation of @code{sysconf}")
+    (description
+     "This package implements @code{sysconf} and provides the associated
+@code{SC_*} constants to query system configuration values at run time.")
+    (license license:bsd-3)))
+
+(define-public go-github-com-tklauser-numcpus
+  (package
+    (name "go-github-com-tklauser-numcpus")
+    (version "0.7.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/tklauser/numcpus")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1xcwk42zr6q72zvkqdd9nbyhvq11rmwm2164mr2rvbb9z7alkff8"))))
+    (build-system go-build-system)
+    (arguments
+     (list
+      #:go go-1.18
+      #:import-path "github.com/tklauser/numcpus"
+      #:phases #~(modify-phases %standard-phases
+                   (add-before 'check 'remove-failing-tests
+                     (lambda* (#:key import-path #:allow-other-keys)
+                       (with-directory-excursion (string-append "src/"
+                                                                import-path)
+                         (for-each delete-file-recursively
+                                   ;; These tests try to access
+                                   ;; /sys/devices/system/cpu, which is not
+                                   ;; available in the test environment.
+                                   '("numcpus_test.go" "numcpus_linux_test.go"))))))))
+    (propagated-inputs (list go-golang-org-x-sys))
+    (home-page "https://github.com/tklauser/numcpus")
+    (synopsis "Provides information about the number of CPUs in the system")
+    (description
+     "This package provides both library functions and a command-line tool to
+query information regarding the number of CPUs available to the system.")
+    (license license:asl2.0)))
+
+(define-public go-github-com-vividcortex-ewma
+  (package
+    (name "go-github-com-vividcortex-ewma")
+    (version "1.2.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/VividCortex/ewma")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0whx516l9nm4n41spagb605ry7kfnz1qha96mcshnfjlahhnnylq"))))
+    (build-system go-build-system)
+    (arguments '(#:import-path "github.com/VividCortex/ewma"))
+    (home-page "https://github.com/VividCortex/ewma")
+    (synopsis "Exponentially Weighted Moving Average algorithms for Go")
+    (description
+     "This package implements algorithms for
+@url{https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average,exponentially
+weighted moving averages}.")
+    (license license:expat)))
+
 (define-public go-go-uber-org-automaxprocs
   (package
     (name "go-go-uber-org-automaxprocs")
@@ -1214,6 +1710,39 @@ Use waterutil with it to work with TUN/TAP packets/frames.")
 CPU quota.")
     (license license:expat)))
 
+(define-public go-go-uber-org-zap
+  (package
+    (name "go-go-uber-org-zap")
+    (version "1.24.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/uber-go/zap")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0lzbbs87fvixzbyv4wpl3s70vm2m0jz2jgdvrviiksc2al451qgs"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:import-path "go.uber.org/zap"
+       #:tests? #f)) ; TODO: Fix tests
+    (native-inputs
+     (list go-github-com-stretchr-testify
+           go-golang-org-x-lint
+           go-honnef-co-go-tools))
+    (propagated-inputs
+     (list go-github-com-pkg-errors
+           go-go-uber-org-atomic
+           go-go-uber-org-multierr
+           go-gopkg-in-yaml-v2))
+    (home-page "https://go.uber.org/zap")
+    (synopsis "Logging library for Go")
+    (description
+     "This package provides a library for fast, structured, leveled logging in
+Go.")
+    (license license:expat)))
+
 (define-public go-gopkg-in-op-go-logging-v1
   (package
     (inherit go-github-com-op-go-logging)
@@ -1227,6 +1756,20 @@ CPU quota.")
 ;;; Executables:
 ;;;
 
+(define-public go-numcpus
+  (package
+    (inherit go-github-com-tklauser-numcpus)
+    (name "go-numcpus")
+    (arguments
+     (list
+      #:go go-1.18
+      #:import-path "github.com/tklauser/numcpus/cmd/numcpus"
+      #:unpack-path "github.com/tklauser/numcpus"
+      #:install-source? #f))
+    (description
+     "This package provides a CLI build from the
+go-github-com-tklauser-numcpus source.")))
+
 (define-public go-pixelmatch
   (package
     (inherit go-github-com-orisano-pixelmatch)
diff --git a/gnu/packages/golang.scm b/gnu/packages/golang.scm
index 0bcd231a93..49e25320fa 100644
--- a/gnu/packages/golang.scm
+++ b/gnu/packages/golang.scm
@@ -870,7 +870,8 @@ in the style of communicating sequential processes (@dfn{CSP}).")
          ("powerpc64le" ,@%go-1.17-powerpc64le-micro-architectures))))))
 
 (define %go-1.18-x86_64-micro-architectures
-  (list "x86_64-v1" "x86_64-v2" "x86_64-v3" "x86_64-v4"))
+  ;; GOAMD defaults to 'v1' so we match the default elsewhere.
+  (list "x86-64" "x86-64-v2" "x86-64-v3" "x86-64-v4"))
 
 (define-public go-1.18
   (package
@@ -3304,64 +3305,6 @@ command-line parsers.")
     (home-page "https://github.com/tj/docopt")
     (license license:expat)))
 
-(define-public go-github-com-hashicorp-hcl
-  (package
-    (name "go-github-com-hashicorp-hcl")
-    (version "1.0.0")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/hashicorp/hcl")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32
-         "0q6ml0qqs0yil76mpn4mdx4lp94id8vbv575qm60jzl1ijcl5i66"))))
-    (build-system go-build-system)
-    (arguments
-     '(#:import-path "github.com/hashicorp/hcl"))
-    (native-inputs
-     (list go-github-com-davecgh-go-spew))
-    (synopsis "Go implementation of HashiCorp Configuration Language V1")
-    (description
-     "This package contains the main implementation of the @acronym{HCL,
-HashiCorp Configuration Language}.  HCL is designed to be a language for
-expressing configuration which is easy for both humans and machines to read.")
-    (home-page "https://github.com/hashicorp/hcl")
-    (license license:mpl2.0)))
-
-(define-public go-github-com-hashicorp-hcl-v2
-  (package
-    (name "go-github-com-hashicorp-hcl-v2")
-    (version "2.11.1")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/hashicorp/hcl")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32
-         "0f9flmmkj7fr1337fc56cqy73faq87ix375hnz3id4wc023przv1"))))
-    (build-system go-build-system)
-    (arguments
-     '(#:import-path "github.com/hashicorp/hcl/v2"))
-    (native-inputs
-     (list go-github-com-davecgh-go-spew))
-    (inputs
-     (list go-github-com-agext-levenshtein go-github-com-mitchellh-go-wordwrap
-           go-github-com-zclconf-go-cty
-           go-github-com-apparentlymart-go-textseg-v13))
-    (synopsis "Go implementation of HashiCorp Configuration Language V2")
-    (description
-     "This package contains the main implementation of the @acronym{HCL,
-HashiCorp Configuration Language}.  HCL is designed to be a language for
-expressing configuration which is easy for both humans and machines to read.")
-    (home-page "https://github.com/hashicorp/hcl")
-    (license license:mpl2.0)))
-
 (define-public govulncheck
   (package
     (name "govulncheck")
@@ -3500,61 +3443,6 @@ editor.")
  spec in Go.")
       (license license:bsd-3))))
 
-(define-public go-github-com-hashicorp-go-uuid
-  (package
-    (name "go-github-com-hashicorp-go-uuid")
-    (version "1.0.3")
-    (source (origin
-              (method git-fetch)
-              (uri (git-reference
-                    (url "https://github.com/hashicorp/go-uuid")
-                    (commit (string-append "v" version))))
-              (file-name (git-file-name name version))
-              (sha256
-               (base32
-                "0wd4maaq20alxwcvfhr52rzfnwwpmc2a698ihyr0vfns2sl7gkzk"))))
-    (build-system go-build-system)
-    (arguments
-     '(#:import-path "github.com/hashicorp/go-uuid"))
-    (home-page "https://github.com/hashicorp/go-uuid")
-    (synopsis "Generate UUID-format strings")
-    (description
-     "This package generates UUID-format strings using high quality bytes.
-It is not intended to be RFC compliant, merely to use a well-understood string
-representation of a 128-bit value.  It can also parse UUID-format strings into
-their component bytes.")
-    (license license:mpl2.0)))
-
-(define-public go-github-com-hashicorp-go-version
-  (let ((commit
-         "03c5bf6be031b6dd45afec16b1cf94fc8938bc77")
-        (revision "0"))
-    (package
-      (name "go-github-com-hashicorp-go-version")
-      (version (git-version "0.0.0" revision commit))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/hashicorp/go-version")
-               (commit commit)))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32
-           "0sjq57gpfznaqdrbyb2p0bn90g9h661cvr0jrk6ngags4pbw14ik"))))
-      (build-system go-build-system)
-      (arguments
-       '(#:import-path "github.com/hashicorp/go-version"))
-      (home-page
-       "https://github.com/hashicorp/go-version")
-      (synopsis "Go library for parsing and verifying versions and version
-constraints")
-      (description "This package is a library for parsing versions and version
-constraints, and verifying versions against a set of constraints.  It can sort
-a collection of versions properly, handles prerelease/beta versions, can
-increment versions.")
-      (license license:mpl2.0))))
-
 (define-public go-github-com-jpillora-backoff
   (let ((commit
          "06c7a16c845dc8e0bf575fafeeca0f5462f5eb4d")
@@ -3781,8 +3669,7 @@ containers.")
     (build-system go-build-system)
     (arguments
      `(#:import-path "github.com/spf13/afero"))
-    (propagated-inputs
-     `(("golang.org/x/text" ,go-golang-org-x-text)))
+    (propagated-inputs (list go-github-com-pkg-sftp go-golang-org-x-text))
     (home-page "https://github.com/spf13/afero")
     (synopsis "File system abstraction for Go")
     (description
@@ -3914,21 +3801,21 @@ GNU extensions} to the POSIX recommendations for command-line options.")
          "099n2g7fg6r8hqyszqw2axr775qyhyvwhsykvgw0f0s16ql48h5c"))))
     (build-system go-build-system)
     (arguments
-     '(#:import-path "github.com/spf13/viper"))
+     (list
+      #:import-path "github.com/spf13/viper"))
     (propagated-inputs
-     `(("github.com/spf13/afero" ,go-github-com-spf13-afero)
-       ("github.com/spf13/cast" ,go-github-com-spf13-cast)
-       ("github.com/spf13/pflag" ,go-github-com-spf13-pflag)
-       ("github.com/spf13/jwalterweatherman" ,go-github-com-spf13-jwalterweatherman)
-       ("github.com/fsnotify/fsnotify" ,go-github-com-fsnotify-fsnotify)
-       ("github.com/hashicorp/hcl" ,go-github-com-hashicorp-hcl)
-       ("github.com/magiconair/properties" ,go-github-com-magiconair-properties)
-       ("github.com/mitchellh/mapstructure" ,go-github-com-mitchellh-mapstructure)
-       ("github.com/pelletier/go-toml" ,go-github-com-pelletier-go-toml)
-       ("github.com/subosito/gotenv" ,go-github-com-subosito-gotenv)
-
-       ("gopkg.in/ini.v1" ,go-gopkg-in-ini-v1)
-       ("gopkg.in/yaml.v2" ,go-gopkg-in-yaml-v2)))
+     (list go-github-com-fsnotify-fsnotify
+           go-github-com-hashicorp-hcl
+           go-github-com-magiconair-properties
+           go-github-com-mitchellh-mapstructure
+           go-github-com-pelletier-go-toml
+           go-github-com-spf13-afero
+           go-github-com-spf13-cast
+           go-github-com-spf13-jwalterweatherman
+           go-github-com-spf13-pflag
+           go-github-com-subosito-gotenv
+           go-gopkg-in-ini-v1
+           go-gopkg-in-yaml-v2))
     (native-inputs
      (list go-github-com-stretchr-testify))
     (home-page "https://github.com/spf13/viper")
@@ -6337,31 +6224,6 @@ and aid debugging.")
 a cron spec parser and job runner.")
     (license license:expat)))
 
-(define-public go-github-com-shirou-gopsutil
-  (let ((commit "47ef3260b6bf6ead847e7c8fc4101b33c365e399")
-        (revision "0"))
-    (package
-      (name "go-github-com-shirou-gopsutil")
-      (version (git-version "v2.19.7" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                       (url "https://github.com/shirou/gopsutil")
-                       (commit commit))) ; XXX
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32
-                  "0x1g4r32q4201nr2b754xnrrndmwsrhfr7zg37spya86qrmijnws"))))
-      (build-system go-build-system)
-      (arguments
-       '(#:import-path "github.com/shirou/gopsutil"))
-      (synopsis "Process and system monitoring in Go")
-      (description "This package provides a library for retrieving information
-on running processes and system utilization (CPU, memory, disks, network,
-sensors).")
-      (home-page "https://github.com/shirou/gopsutil")
-      (license license:bsd-3))))
-
 (define-public go-github-com-danwakefield-fnmatch
   (let ((commit "cbb64ac3d964b81592e64f957ad53df015803288")
         (revision "0"))
@@ -8779,42 +8641,6 @@ error messages.")
 inspired by the causal messaging system in the Pony programming language.")
       (license license:expat))))
 
-(define-public go-github-com-cheggaaa-pb-v3
-  (package
-    (name "go-github-com-cheggaaa-pb-v3")
-    (version "3.0.8")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/cheggaaa/pb/")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32 "0d701s2niy39r650d1phjw19h4l27b1yfc2ih6s31f56b3zzqspx"))))
-    (build-system go-build-system)
-    (arguments
-     '(#:import-path "github.com/cheggaaa/pb/v3"
-       ;; XXX: it does have tests but I'm not sure how to run them.
-       ;; go-build-system is looking in the wrong directory.
-       #:tests? #f))
-    (propagated-inputs
-     (list go-golang-org-x-sys
-           go-github-com-rivo-uniseg
-           go-github-com-mattn-go-runewidth
-           go-github-com-mattn-go-isatty
-           go-github-com-mattn-go-colorable
-           go-github-com-fatih-color
-           go-github-com-vividcortex-ewma))
-    (home-page "https://github.com/cheggaaa/pb/")
-    (synopsis "Console progress bar for Go")
-    (description "This package is a Go library that draws progress bars on
-the terminal.")
-    (license license:bsd-3)))
-
-(define-public go-github-com-cheggaaa-pb
-  (deprecated-package "go-github-com-cheggaaa-pb" go-github-com-cheggaaa-pb-v3))
-
 (define-public go-github-com-gologme-log
   ;; this is the same as v1.2.0, only the LICENSE file changed
   (let ((commit "720ba0b3ccf0a91bc6018c9967a2479f93f56a55"))
@@ -8843,28 +8669,6 @@ is unchanged.  This package contains a series of small enhancements and
 additions.")
       (license license:bsd-3))))
 
-(define-public go-github-com-hashicorp-go-syslog
-  (package
-    (name "go-github-com-hashicorp-go-syslog")
-    (version "1.0.0")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/hashicorp/go-syslog")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32
-         "09vccqggz212cg0jir6vv708d6mx0f9w5bxrcdah3h6chgmal6v1"))))
-    (build-system go-build-system)
-    (arguments
-     '(#:import-path "github.com/hashicorp/go-syslog"))
-    (home-page "https://github.com/hashicorp/go-syslog")
-    (synopsis "Golang syslog wrapper, cross-compile friendly")
-    (description "This package is a very simple wrapper around log/syslog")
-    (license license:expat)))
-
 (define-public go-golang-zx2c4-com-wireguard
   (package
     (name "go-golang-zx2c4-com-wireguard")
@@ -9381,36 +9185,6 @@ be used as both a binary and a library.")
     (native-inputs '())
     (inputs '())))
 
-(define-public go-go-uber-org-zap
-  (package
-    (name "go-go-uber-org-zap")
-    (version "1.16.0")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/uber-go/zap")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32 "05ix5wg1r8pgi7fb6084lg4x7mrkvzkh1nxa7zj337w5b9xj0myr"))))
-    (build-system go-build-system)
-    (arguments
-     '(#:import-path "go.uber.org/zap"
-       #:tests? #f)) ; TODO: Fix tests
-    (native-inputs
-     (list go-github-com-stretchr-testify go-golang-org-x-lint
-           go-honnef-co-go-tools))
-    (propagated-inputs
-     (list go-github-com-pkg-errors go-go-uber-org-atomic
-           go-go-uber-org-multierr go-gopkg-in-yaml-v2))
-    (home-page "https://go.uber.org/zap")
-    (synopsis "Logging library for Go")
-    (description
-     "This package provides a library for fast, structured, leveled logging in
-Go.")
-    (license license:expat)))
-
 (define-public go-github-com-davecgh-go-xdr
   (package
     (name "go-github-com-davecgh-go-xdr")
@@ -9617,28 +9391,6 @@ programming language.")
 parser.")
     (license license:bsd-2)))
 
-(define-public go-github-com-vividcortex-ewma
-  (package
-    (name "go-github-com-vividcortex-ewma")
-    (version "1.2.0")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/VividCortex/ewma")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32 "0whx516l9nm4n41spagb605ry7kfnz1qha96mcshnfjlahhnnylq"))))
-    (build-system go-build-system)
-    (arguments '(#:import-path "github.com/vividcortex/ewma"))
-    (home-page "https://github.com/VividCortex/ewma")
-    (synopsis "Exponentially Weighted Moving Average algorithms for Go")
-    (description
-     "This package implements algorithms for exponentially weighted moving
-averages.")
-    (license license:expat)))
-
 (define-public go-github-com-rivo-uniseg
   (package
     (name "go-github-com-rivo-uniseg")
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index 950476815f..b9d6ed2893 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -9,7 +9,7 @@
 ;;; Copyright © 2015 Andy Wingo <wingo@igalia.com>
 ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com>
 ;;; Copyright © 2015, 2016, 2017, 2018, 2020, 2021 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2016, 2017, 2020-2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017, 2020-2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Fabian Harfert <fhmgufs@web.de>
 ;;; Copyright © 2016 Kei Kebreau <kkebreau@posteo.net>
 ;;; Copyright © 2016 Patrick Hetu <patrick.hetu@auf.org>
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index a2ac9a6cba..d0c443d38c 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -2895,7 +2895,7 @@ See http://minikanren.org/ for more on miniKanren generally.")
 (define-public guile-irregex
   (package
     (name "guile-irregex")
-    (version "0.9.6")
+    (version "0.9.11")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2903,25 +2903,46 @@ See http://minikanren.org/ for more on miniKanren generally.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "1ia3m7dp3lcxa048q0gqbiwwsyvn99baw6xkhb4bhhzn4k7bwyqq"))))
+                "026kzl96pmwbjqdc7kh8rdh8ng813sjvdsik0dag5acza20sjm19"))))
     (build-system guile-build-system)
     (arguments
-     '(#:phases (modify-phases %standard-phases
-                  (add-after 'unpack 'move-files-around
-                    (lambda _
-                      ;; Move the relevant source files to src/ and create the
-                      ;; rx/ directory to match the expected module hierarchy.
-                      (mkdir-p "src/rx/source")
-                      (rename-file "irregex-guile.scm"
-                                   "src/rx/irregex.scm")
-                      (rename-file "irregex.scm"
-                                   "src/rx/source/irregex.scm")
-                      ;; Not really reachable via guile's packaging system,
-                      ;; but nice to have around.
-                      (rename-file "irregex-utils.scm"
-                                   "src/rx/source/irregex-utils.scm")
-                      #t)))
-       #:source-directory "src"))
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'move-files-around
+            (lambda _
+              ;; Copy the relevant source files to src/ and create the
+              ;; rx/ directory to match the expected module hierarchy.
+              (mkdir-p "src/rx/source")
+              (copy-file "irregex-guile.scm"
+                         "src/rx/irregex.scm")
+              (copy-file "irregex.scm"
+                         "src/rx/source/irregex.scm")
+
+              (mkdir-p "src/rx/irregex")
+              (copy-file "irregex-utils-guile.scm"
+                         "src/rx/irregex/utils.scm")
+              (copy-file "irregex-utils.scm"
+                         "src/rx/source/irregex-utils.scm")))
+          (add-after 'build 'check
+            (lambda _
+              (for-each (lambda (f)
+                          (invoke "guile" "--no-auto-compile" "-L" "." "-s" f))
+                        (find-files "tests" "^guile-.*\\.scm"))))
+          (add-after 'install 'check-installed
+            (lambda _
+              (define-values (scm go) (target-guile-scm+go #$output))
+              (for-each
+               (lambda (f)
+                 (substitute* f
+                   (("\\(load-from-path \"irregex\"\\)")
+                    "(use-modules (rx irregex))")
+                   (("\\(load-from-path \"irregex-utils\"\\)")
+                    "(use-modules (rx irregex utils))"))
+                 (invoke "guile" "-L" scm "-C" go "-L" "tests" f))
+               (delete "tests/guile-cset.scm" ; Tests non-exported API
+                       (find-files "tests" "^guile-.*\\.scm"))))))
+      #:source-directory "src"))
     (native-inputs
      (list guile-3.0))
     (home-page "https://synthcode.com/scheme/irregex")
@@ -2936,6 +2957,27 @@ inspired by the SCSH regular expression system.")
   (package
     (inherit guile-irregex)
     (name "guile2.0-irregex")
+    (arguments
+     (substitute-keyword-arguments (package-arguments guile-irregex)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            ;; For some reason guile 2.0 cannot load foo.scm using
+            ;; (load-from-path "foo").  So create symlinks to work around it.
+            (add-before 'check 'create-symlinks
+              (lambda _
+                (use-modules (ice-9 regex))
+                (for-each
+                 (lambda (f)
+                   (symlink (regexp-substitute #f (string-match "/([^/]+)$" f)
+                                               1 ".scm")
+                            f))
+                 '("tests/guile/test-support"
+                   "tests/test-cset"
+                   "tests/test-irregex"
+                   "tests/test-irregex-from-gauche"
+                   "tests/test-irregex-pcre"
+                   "tests/test-irregex-scsh"
+                   "tests/test-irregex-utf8"))))))))
     (native-inputs (list guile-2.0))))
 
 (define-public guile2.2-irregex
diff --git a/gnu/packages/haskell-apps.scm b/gnu/packages/haskell-apps.scm
index 3288b0d0a9..3fce4f803c 100644
--- a/gnu/packages/haskell-apps.scm
+++ b/gnu/packages/haskell-apps.scm
@@ -294,7 +294,7 @@ to @code{cabal repl}).")
 (define-public git-annex
   (package
     (name "git-annex")
-    (version "10.20230926")
+    (version "10.20240227")
     (source
      (origin
        ;; hackage release doesn't include everything needed for extra bits.
@@ -304,7 +304,7 @@ to @code{cabal repl}).")
               (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0zsq686b0q7mlkybm1xrc0kpl32ymvf0ybar01p68wx800031b2b"))))
+        (base32 "023gk1v01ks367h4zz67ksn2xaw6pgcfhmniay6ipkncfqv8rsra"))))
     (build-system haskell-build-system)
     (properties '((upstream-name . "git-annex")))
     (arguments
diff --git a/gnu/packages/image-viewers.scm b/gnu/packages/image-viewers.scm
index 4769f136e0..dab7d9d1f2 100644
--- a/gnu/packages/image-viewers.scm
+++ b/gnu/packages/image-viewers.scm
@@ -767,7 +767,7 @@ displayed in a terminal.")
 (define-public imv
   (package
     (name "imv")
-    (version "4.4.0")
+    (version "4.5.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -775,7 +775,7 @@ displayed in a terminal.")
                     (commit (string-append "v" version))))
               (sha256
                (base32
-                "1zlds43z17jrnsrfz3rf3sb3pa5gkmxaibq87509ikc7p1p09c9c"))
+                "0988rpgzyhb27sbhrh5f2zqccqirmq7xb0naqh9nbl8j1dg897b8"))
               (file-name (git-file-name name version))))
     (build-system meson-build-system)
     (arguments
@@ -792,13 +792,15 @@ displayed in a terminal.")
                        (("imv") (string-append bin "/imv")))))))))
     (native-inputs
      (list asciidoc
+           cmocka
            pkg-config))
     (inputs
      (list freeimage
            glu
            libheif
-           libjpeg-turbo
            libinih
+           libjpeg-turbo
+           libjxl
            libnsgif
            (librsvg-for-system)
            libtiff
diff --git a/gnu/packages/ipfs.scm b/gnu/packages/ipfs.scm
index 830e2ccd32..36eed11802 100644
--- a/gnu/packages/ipfs.scm
+++ b/gnu/packages/ipfs.scm
@@ -227,7 +227,7 @@ written in Go.")
 (define-public kubo
   (package
     (name "kubo")
-    (version "0.19.0")
+    (version "0.22.0")
     (source
      (origin
        (method url-fetch/tarbomb)
@@ -235,7 +235,7 @@ written in Go.")
              "https://dist.ipfs.io/kubo/v" version
              "/kubo-source.tar.gz"))
        (sha256
-        (base32 "0k0mw44fq6306pmfp6v4wawgigry9plnl2ij8i5f46606j55c31w"))
+        (base32 "0p8iaa56lnac1lxnbzp4fbjqzps50z5yqs34szcp53xjq8rmjzjd"))
        (file-name (string-append name "-" version "-source"))
        (modules '((guix build utils)))
        (snippet '(for-each delete-file-recursively
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index 8be5d98a77..151fc8aa89 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -19,6 +19,7 @@
 ;;; Copyright © 2021 Pierre Langlois <pierre.langlois@gmx.com>
 ;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>
 ;;; Copyright © 2022 Artyom V. Poptsov <poptsov.artyom@gmail.com>
+;;; Copyright © 2024 Paul A. Patience <paul@apatience.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -13578,14 +13579,14 @@ network protocols, and core version control algorithms.")
                                      ":"
                                      share "abcl-contrib.jar")))
                      (display (string-append
-                               "#!" (which "sh") "\n"
+                               "#!" (which "bash") "\n"
                                "if [[ -z $CLASSPATH ]]; then\n"
                                "  cp=\"" classpath "\"\n"
                                "else\n"
                                "  cp=\"" classpath ":$CLASSPATH\"\n"
                                "fi\n"
                                "exec " (which "java")
-                               " -cp $cp org.armedbear.lisp.Main $@\n")))))
+                               " -cp \"$cp\" org.armedbear.lisp.Main \"$@\"\n")))))
                (chmod (string-append bin "abcl") #o755)
                #t))))))
     (home-page "https://abcl.org/")
diff --git a/gnu/packages/kde-plasma.scm b/gnu/packages/kde-plasma.scm
index 331ab28cd1..cf45fa59f7 100644
--- a/gnu/packages/kde-plasma.scm
+++ b/gnu/packages/kde-plasma.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2019 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017, 2019, 2020 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2020, 2023 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2020, 2023, 2024 Zheng Junjie <873216071@qq.com>
 ;;; Copyright © 2022 Brendan Tildesley <mail@brendan.scot>
 ;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;;
@@ -1787,7 +1787,7 @@ the KDE Plasma 5 desktop.")
                   qtdeclarative-5
                   qtquickcontrols-5
                   qtquickcontrols2-5
-                  qtwayland
+                  qtwayland-5
                   qtx11extras
                   wayland
                   wayland-protocols
diff --git a/gnu/packages/lisp-xyz.scm b/gnu/packages/lisp-xyz.scm
index 6ee8ef22d2..435f588ab3 100644
--- a/gnu/packages/lisp-xyz.scm
+++ b/gnu/packages/lisp-xyz.scm
@@ -43,6 +43,7 @@
 ;;; Copyright © 2023 Raven Hallsby <karl@hallsby.com>
 ;;; Copyright © 2024 Michal Atlas <michal_atlas+git@posteo.net>
 ;;; Copyright © 2024 Carlo Zancanaro <carlo@zancanaro.id.au>
+;;; Copyright © 2024 Nik Gaffney <nik@fo.am>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1221,6 +1222,43 @@ Features:
 (define-public ecl-coleslaw
   (sbcl-package->ecl-package sbcl-coleslaw))
 
+(define-public sbcl-cl-all
+  (let ((commit "4ce1ea9d9f33c0dd6212044e7952a0c854757ace")
+        (revision "0"))
+    (package
+      (name "sbcl-cl-all")
+      (version (git-version "1.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/Shinmera/cl-all")
+               (commit commit)))
+         (file-name (git-file-name "cl-all" version))
+         (sha256
+          (base32 "0n4sjarj373zpxn78m32rmhxnsnr8qahdslrd9vrkkwjpzar2bwp"))))
+      (build-system asdf-build-system/sbcl)
+      (outputs '("out" "bin"))
+      (arguments
+       (list
+        #:phases
+        #~(modify-phases %standard-phases
+            (add-after 'create-asdf-configuration 'build-program
+              (lambda* (#:key outputs #:allow-other-keys)
+                (build-program
+                 (string-append (assoc-ref outputs "bin") "/bin/cl-all")
+                 outputs
+                 #:entry-program '((cl-all:toplevel arguments))
+                 #:compress? #t))))))
+      (home-page "https://github.com/Shinmera/cl-all")
+      (synopsis "Evaluate Common Lisp expressions in multiple implementations")
+      (description "@samp{cl-all} is a library and script for evaluating Common
+Lisp expressions in multiple implementations.")
+      (license license:zlib))))
+
+(define-public cl-all
+  (sbcl-package->cl-source-package sbcl-cl-all))
+
 (define-public sbcl-tripod
   (let ((commit "b019a27cd7eb895870f84b0eb6c3edc5d7b05928")
         (revision "1"))
@@ -17839,8 +17877,8 @@ compression/decompression using bindings to the libzstd C library.")
   (sbcl-package->ecl-package sbcl-zstd))
 
 (define-public sbcl-agnostic-lizard
-  (let ((commit "fe3a73719f05901c8819f8995a3ebae738257952")
-        (revision "1"))
+  (let ((commit "fe1a1d7d80c8b56163754e0e5b3653fd750ad298")
+        (revision "2"))
     (package
       (name "sbcl-agnostic-lizard")
       (version (git-version "0.0.0" revision commit))
@@ -17850,9 +17888,9 @@ compression/decompression using bindings to the libzstd C library.")
          (uri (git-reference
                (url "https://gitlab.common-lisp.net/mraskin/agnostic-lizard")
                (commit commit)))
-         (file-name (git-file-name name version))
+         (file-name (git-file-name "cl-agnostic-lizard" version))
          (sha256
-          (base32 "0ax78y8w4zlp5dcwyhz2nq7j3shi49qn31dkfg8lv2jlg7mkwh2d"))))
+          (base32 "0amzshh6v3mp24j0h2cinv4zvdlg4kih04md5biakwhnmcw4j4pr"))))
       (build-system asdf-build-system/sbcl)
       (synopsis "Almost correct portable code walker for Common Lisp")
       (description
@@ -25694,11 +25732,11 @@ Common Lisp.")
   (sbcl-package->ecl-package sbcl-cl-collider))
 
 (define-public sbcl-osc
-  (let ((commit "9f0a9d3da310a3a0f654f48af0203816f3f371ad")
+  (let ((commit "f647738ccc22925ed740a8ca9132fda76a05baeb")
         (revision "0"))
     (package
      (name "sbcl-osc")
-     (version (git-version "0.7" revision commit))
+     (version (git-version "0.9" revision commit))
      (source
        (origin
          (method git-fetch)
@@ -25707,16 +25745,18 @@ Common Lisp.")
                (commit commit)))
          (file-name (git-file-name "cl-osc" version))
          (sha256
-          (base32 "0gh29zcl9pmy3xlmwzpf9www2z06ah6b4jk06sj2cvxbc15nblqa"))))
+          (base32 "1x4cavspaxcr604g0hwak1ncy4m9cqq03ji4v56g2h1443n7h48a"))))
      (build-system asdf-build-system/sbcl)
-     (inputs (list sbcl-usocket))
+     (native-inputs (list sbcl-fiveam))
+     (inputs (list sbcl-ieee-floats))
      (synopsis "Implementation of the Open Sound Control protocol")
-     (description "This package provides a common lisp implementation
-of the Open Sound Control Protocol aka OSC.  The code should be close
-to the ansi standard, and does not rely on any external code/ffi/etc+
-to do the basic encoding and decoding of packets.")
+     (description "This is a lisp implementation of the Open Sound Control
+protocol (or more accurately “data transport specification” or
+“encoding”).  The code should be close to ANSI standard common lisp and
+provides self contained code for encoding and decoding of OSC data, messages,
+and bundles.")
      (home-page "https://github.com/zzkt/osc/")
-     (license (list license:gpl3 license:llgpl)))))
+     (license license:gpl3+))))
 
 (define-public cl-osc
   (sbcl-package->cl-source-package sbcl-osc))
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 2778d0ec38..c002f62cac 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -482,67 +482,72 @@ code analysis tools.")
 (define (clang-properties version)
   "Return package properties for Clang VERSION."
   `((compiler-cpu-architectures
-     ("x86_64"
-      ;; This list was obtained by running:
-      ;;
-      ;;   guix shell clang -- llc -march=x86-64 -mattr=help
-      ;;
-      ;; filtered from uninteresting entries such as "i686" and "pentium".
-      ,@(if (version>=? version "10.0")           ;TODO: refine
-            '("atom"
-              "barcelona"
-              "bdver1"
-              "bdver2"
-              "bdver3"
-              "bdver4"
-              "bonnell"
-              "broadwell"
-              "btver1"
-              "btver2"
-              "c3"
-              "c3-2"
-              "cannonlake"
-              "cascadelake"
-              "cooperlake"
-              "core-avx-i"
-              "core-avx2"
-              "core2"
-              "corei7"
-              "corei7-avx"
-              "generic"
-              "geode"
-              "goldmont"
-              "goldmont-plus"
-              "haswell"
-              "icelake-client"
-              "icelake-server"
-              "ivybridge"
-              "k8"
-              "k8-sse3"
-              "knl"
-              "knm"
-              "lakemont"
-              "nehalem"
-              "nocona"
-              "opteron"
-              "opteron-sse3"
-              "sandybridge"
-              "silvermont"
-              "skx"
-              "skylake"
-              "skylake-avx512"
-              "slm"
-              "tigerlake"
-              "tremont"
-              "westmere"
-              "x86-64"
-              "x86-64-v2"
-              "x86-64-v3"
-              "x86-64-v4"
-              "znver1"
-              "znver2"
-              "znver3")
-            '())))))
+      ("powerpc64le"
+       ;; This list was obtained from clang/test/Misc/target-invalid-cpu-note.c
+       ;; and then trimmed down.
+       ,@(if (version>=? version "11.0")
+             '("power8" "power9" "power10" "powerpc64le")))
+      ("x86_64"
+       ;; This list was obtained from clang/test/Misc/target-invalid-cpu-note.c
+       ,@(cond
+           ((version>=? version "17.0")
+            '("nocona" "core2" "penryn" "bonnell" "atom" "silvermont" "slm"
+              "goldmont" "goldmont-plus" "tremont" "nehalem" "corei7" "westmere"
+              "sandybridge" "corei7-avx" "ivybridge" "core-avx-i" "haswell"
+              "core-avx2" "broadwell" "skylake" "skylake-avx512" "skx"
+              "cascadelake" "cooperlake" "cannonlake" "icelake-client"
+              "rocketlake" "icelake-server" "tigerlake" "sapphirerapids"
+              "alderlake" "raptorlake" "meteorlake" "sierraforest" "grandridge"
+              "graniterapids" "graniterapids-d" "emeraldrapids" "knl" "knm" "k8"
+              "athlon64" "athlon-fx" "opteron" "k8-sse3" "athlon64-sse3"
+              "opteron-sse3" "amdfam10" "barcelona" "btver1" "btver2" "bdver1"
+              "bdver2" "bdver3" "bdver4" "znver1" "znver2" "znver3" "znver4"
+              "x86-64" "x86-64-v2" "x86-64-v3" "x86-64-v4"))
+           ((version>=? version "16.0")
+            '("nocona" "core2" "penryn" "bonnell" "atom" "silvermont" "slm"
+              "goldmont" "goldmont-plus" "tremont" "nehalem" "corei7" "westmere"
+              "sandybridge" "corei7-avx" "ivybridge" "core-avx-i" "haswell"
+              "core-avx2" "broadwell" "skylake" "skylake-avx512" "skx"
+              "cascadelake" "cooperlake" "cannonlake" "icelake-client"
+              "rocketlake" "icelake-server" "tigerlake" "sapphirerapids"
+              "alderlake" "raptorlake" "meteorlake" "sierraforest" "grandridge"
+              "graniterapids" "emeraldrapids" "knl" "knm" "k8" "athlon64"
+              "athlon-fx" "opteron" "k8-sse3" "athlon64-sse3" "opteron-sse3"
+              "amdfam10" "barcelona" "btver1" "btver2" "bdver1" "bdver2"
+              "bdver3" "bdver4" "znver1" "znver2" "znver3" "znver4" "x86-64"
+              "x86-64-v2" "x86-64-v3" "x86-64-v4"))
+           ((version>=? version "15.0")
+            '("nocona" "core2" "penryn" "bonnell" "atom" "silvermont" "slm"
+              "goldmont" "goldmont-plus" "tremont" "nehalem" "corei7" "westmere"
+              "sandybridge" "corei7-avx" "ivybridge" "core-avx-i" "haswell"
+              "core-avx2" "broadwell" "skylake" "skylake-avx512" "skx"
+              "cascadelake" "cooperlake" "cannonlake" "icelake-client"
+              "rocketlake" "icelake-server" "tigerlake" "sapphirerapids"
+              "alderlake" "knl" "knm" "k8" "athlon64" "athlon-fx" "opteron"
+              "k8-sse3" "athlon64-sse3" "opteron-sse3" "amdfam10" "barcelona"
+              "btver1" "btver2" "bdver1" "bdver2" "bdver3" "bdver4" "znver1"
+              "znver2" "znver3" "x86-64" "x86-64-v2" "x86-64-v3" "x86-64-v4"))
+           ((version>=? version "13.0")
+            '("nocona" "core2" "penryn" "bonnell" "atom" "silvermont" "slm"
+              "goldmont" "goldmont-plus" "tremont" "nehalem" "corei7" "westmere"
+              "sandybridge" "corei7-avx" "ivybridge" "core-avx-i" "haswell"
+              "core-avx2" "broadwell" "skylake" "skylake-avx512" "skx"
+              "cascadelake" "cooperlake" "cannonlake" "icelake-client"
+              "rocketlake" "icelake-server" "tigerlake" "sapphirerapids"
+              "alderlake" "knl" "knm" "k8" "athlon64" "athlon-fx" "opteron"
+              "k8-sse3" "athlon64-sse3" "opteron-sse3" "amdfam10" "barcelona"
+              "btver1" "btver2" "bdver1" "bdver2" "bdver3" "bdver4" "znver1"
+              "znver2" "znver3" "x86-64" "x86-64-v2" "x86-64-v3" "x86-64-v4"))
+           ((version>=? version "9.0")
+            '("atom" "silvermont" "slm" "goldmont" "goldmont-plus" "tremont"
+              "nehalem" "corei7" "westmere" "sandybridge" "corei7-avx"
+              "ivybridge" "core-avx-i" "haswell" "core-avx2" "broadwell"
+              "skylake" "skylake-avx512" "skx" "cascadelake" "cooperlake"
+              "cannonlake" "icelake-client" "icelake-server" "knl" "knm" "k8"
+              "athlon64" "athlon-fx" "opteron" "k8-sse3" "athlon64-sse3"
+              "opteron-sse3" "amdfam10" "barcelona" "btver1" "btver2" "bdver1"
+              "bdver2" "bdver3" "bdver4" "znver1" "znver2" "x86-64"))
+           (else '()))))))
 
 (define-public (make-clang-toolchain clang libomp)
   (package
diff --git a/gnu/packages/lua.scm b/gnu/packages/lua.scm
index 1cde6bd66c..c35bbe8bcd 100644
--- a/gnu/packages/lua.scm
+++ b/gnu/packages/lua.scm
@@ -1233,7 +1233,7 @@ enabled.")
 (define-public fennel
   (package
     (name "fennel")
-    (version "1.3.1")
+    (version "1.4.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1242,7 +1242,7 @@ enabled.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "12zm3rd0vvkqazv1cv5bhwk6igsj18im2qakqw7cf4a20rc9wpmx"))))
+                "1h1i87jx889n1wczw5jvqmkx0jmlrq83pjspyd9v27j360d9fcik"))))
     (build-system gnu-build-system)
     (arguments
      (list #:make-flags #~(list (string-append "PREFIX="
diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index 6e94e21f3e..5c18a2e9d5 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -26,6 +26,7 @@
 ;;; Copyright © 2024 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2024 David Pflug <david@pflug.io>
 ;;; Copyright © 2024 Timothee Mathieu <timothee.mathieu@inria.fr>
+;;; Copyright © 2024 Spencer King <spencer.king@geneoscopy.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -523,8 +524,8 @@ Performance is achieved by using the LLVM JIT compiler.")
   (deprecated-package "guile-aiscm-next" guile-aiscm))
 
 (define-public llama-cpp
-  (let ((commit "f31b5397143009d682db90fd2a6cde83f1ef00eb")
-        (revision "0"))
+  (let ((commit "03bf161eb6dea6400ee49c6dc6b69bdcfa9fd3fc")
+        (revision "1"))
     (package
       (name "llama-cpp")
       (version (git-version "0.0.0" revision commit))
@@ -533,10 +534,10 @@ Performance is achieved by using the LLVM JIT compiler.")
          (method git-fetch)
          (uri (git-reference
                (url "https://github.com/ggerganov/llama.cpp")
-               (commit (string-append "master-" (string-take commit 7)))))
+               (commit commit)))
          (file-name (git-file-name name version))
          (sha256
-          (base32 "0ys6n53n032zq1ll9f3vgxk8sw0qq7x3fi7awsyy13adzp3hn08p"))))
+          (base32 "1ag1jash84hasz10h0piw72a8ginm8kzvhihbzzljz96gq2kjm88"))))
       (build-system cmake-build-system)
       (arguments
        (list
@@ -563,8 +564,10 @@ Performance is achieved by using the LLVM JIT compiler.")
                                       (get-string-all input))))))
                       (chmod (string-append bin script) #o555)))
                   (mkdir-p bin)
-                  (make-script "convert-pth-to-ggml")
+                  (make-script "convert-hf-to-gguf")
+                  (make-script "convert-llama-ggml-to-gguf")
                   (make-script "convert-lora-to-ggml")
+                  (make-script "convert-persimmon-to-gguf")
                   (make-script "convert"))))
             (add-after 'install-python-scripts 'wrap-python-scripts
               (assoc-ref python:%standard-phases 'wrap))
@@ -1782,6 +1785,29 @@ scikit-learn inclusion criteria, for instance due to their novelty or lower
 citation number.")
       (license license:bsd-3))))
 
+(define-public python-mord
+  (package
+    (name "python-mord")
+    (version "0.7")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "mord" version))
+       (sha256
+        (base32 "1cvv9b9w69v0inq0zgcw0vmkiq3zn9q9r6clkynpzjik9rrh405n"))))
+    (build-system pyproject-build-system)
+    ;; v0.7 does not provide any test cases
+    ;; v0.6 relies on deprecated scikit-learn functionality
+    (arguments `(#:tests? #f))
+    (inputs (list python-numpy python-scipy python-scikit-learn))
+    (home-page "https://pypi.org/project/mord/")
+    (synopsis "Ordinal regression models for scikit-learn")
+    (description
+     "This package provides a collection of ordinal regression models for
+machine learning in Python.  They are intended to be used with scikit-learn
+and are compatible with its API.")
+    (license license:bsd-3)))
+
 (define-public python-thinc
   (package
     (name "python-thinc")
diff --git a/gnu/packages/markup.scm b/gnu/packages/markup.scm
index 4a9a382104..375367d395 100644
--- a/gnu/packages/markup.scm
+++ b/gnu/packages/markup.scm
@@ -333,7 +333,7 @@ convert HTML to Markdown.")
 (define-public cmark
   (package
     (name "cmark")
-    (version "0.30.3")
+    (version "0.31.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -342,7 +342,7 @@ convert HTML to Markdown.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "07d30s5v893nb1m7qbam5c3x9b3d84m80kzlj7fmkwhgjrlz7d7z"))))
+                "0llj68l9rxdhral0zyv0bz6yzqsxgq8d3730082sl3kx78lsq5qq"))))
     (build-system cmake-build-system)
     (arguments
      '(#:test-target "test"))
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index f797e18fdd..7398175837 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -30,7 +30,7 @@
 ;;; Copyright © 2018 Eric Brown <brown@fastmail.com>
 ;;; Copyright © 2018, 2021, 2024 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2018 Amin Bandali <bandali@gnu.org>
-;;; Copyright © 2019, 2021-2023 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2019, 2021-2024 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2019 Steve Sprang <scs@stevesprang.com>
 ;;; Copyright © 2019 Robert Smith <robertsmith@posteo.net>
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
@@ -426,13 +426,13 @@ programming language.")
 (define-public units
   (package
    (name "units")
-   (version "2.22")
+   (version "2.23")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://gnu/units/units-" version
                                 ".tar.gz"))
             (sha256 (base32
-                     "0j2q2a9sgldqwcifsnb7qagsmp8fvj91vfh6v4k7gzi1fwhf24sx"))))
+                     "0w3kl58y7fq9paaq8ayn5gwylc4n8jbk6lf42kkcj9ar4i8v8myr"))))
    (build-system gnu-build-system)
    (inputs
     `(("readline" ,readline)
@@ -8736,7 +8736,7 @@ management via the GIMPS project's Primenet server.")
 (define-public nauty
   (package
     (name "nauty")
-    (version "2.8.6")
+    (version "2.8.8")
     (source
      (origin
        (method url-fetch)
@@ -8744,7 +8744,7 @@ management via the GIMPS project's Primenet server.")
              "https://pallini.di.uniroma1.it/"
              "nauty" (string-join (string-split version #\.) "_") ".tar.gz"))
        (sha256
-        (base32 "1yp6wpz2drq0viww8px1vl4pw919nq3xgxrmrrdhycx8bhi9ikpj"))))
+        (base32 "1ki9z60qcyx3va68hp7iv6451n5d86v1xmhc850b4sqah5b2378m"))))
     (build-system gnu-build-system)
     (outputs '("out" "lib"))
     (arguments
diff --git a/gnu/packages/mc.scm b/gnu/packages/mc.scm
index 994f89f524..8cf760ac53 100644
--- a/gnu/packages/mc.scm
+++ b/gnu/packages/mc.scm
@@ -40,14 +40,14 @@
 (define-public mc
   (package
     (name "mc")
-    (version "4.8.30")
+    (version "4.8.31")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "https://ftp.osuosl.org/pub/midnightcommander/mc-"
                           version ".tar.xz"))
       (sha256
-       (base32 "1py7jm620lsas7rcv5j69608gdshmp25d9gx958hr5sb2jr3rg2y"))))
+       (base32 "06mbnhxd2k29jah4wp1ciicw1gb51a5d3af43zivhxbncvw1q694"))))
     (build-system gnu-build-system)
     (arguments
      (list
@@ -68,7 +68,6 @@
                   (list "lib/utilunix.c"
                         "src/filemanager/ext.c"
                         "src/usermenu.c"
-                        "src/vfs/fish/fish.c"
                         ;; This file hard-codes other shells, but they're never
                         ;; tried after mc's first choice (bash) is found.
                         "lib/shell.c")
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 98c1c9bf67..03b7368ae0 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -40,6 +40,7 @@
 ;;; Copyright © 2023 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2023 Yovan Naumovski <yovan@gorski.stream>
 ;;; Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
+;;; Copyright © 2024 Carlo Zancanaro <carlo@zancanaro.id.au>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -143,6 +144,7 @@
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg)
   #:use-module (guix build-system cmake)
+  #:use-module (guix build-system copy)
   #:use-module (guix build-system go)
   #:use-module (guix build-system glib-or-gtk)
   #:use-module (guix build-system gnu)
@@ -1577,11 +1579,18 @@ system on which to rapidly develop added functionality, or prototype new
 protocols.")
     (license license:x11)))
 
-(define-public prosody-http-upload
-  (let ((changeset "765735bb590b")
-        (revision "1"))
+(define (prosody-module module-name)
+  (let ((changeset "fba64b043c52")
+        (revision "2")
+        (package-name (string-append
+                       "prosody-"
+                       (string-replace-substring
+                        (if (string-prefix? "mod_" module-name)
+                            (substring module-name 4)
+                            module-name)
+                        "_" "-"))))
     (package
-      (name "prosody-http-upload")
+      (name package-name)
       (version (string-append "0-" revision "." (string-take changeset 7)))
       (source (origin
                 (method hg-fetch)
@@ -1591,56 +1600,37 @@ protocols.")
                 (file-name (string-append name "-" version "-checkout"))
                 (sha256
                  (base32
-                  "142wrcism70nf8ffahhd961cqg2pi1h7ic8adfs3zwh0j3pnf41f"))))
-      (build-system trivial-build-system)
+                  "1nvka8s3zqs97jqsknhp2q956rrdga1qaxa1y3i0h8zx3g9vgdch"))))
+      (build-system copy-build-system)
       (arguments
-       '(#:modules ((guix build utils))
-         #:builder
-         (begin
-           (use-modules (guix build utils))
-           (let ((out (assoc-ref %outputs "out"))
-                 (source (assoc-ref %build-inputs "source")))
-             (with-directory-excursion (in-vicinity source "mod_http_upload")
-               (install-file "mod_http_upload.lua" out))
-             #t))))
-      (home-page "https://modules.prosody.im/mod_http_upload.html")
-      (synopsis "XEP-0363: Allow clients to upload files over HTTP")
-      (description "This module implements XEP-0363: it allows clients to
-upload files over HTTP.")
+       `(#:install-plan '((,(string-append module-name "/") "."))))
+      (home-page (string-append "https://modules.prosody.im/"
+                                module-name ".html"))
+      (synopsis #f)
+      (description #f)
       (license (package-license prosody)))))
 
+(define-public prosody-http-upload
+  (package
+    (inherit (prosody-module "mod_http_upload"))
+    (synopsis "XEP-0363: Allow clients to upload files over HTTP")
+    (description "This module implements XEP-0363: it allows clients to
+upload files over HTTP.")))
+
 (define-public prosody-smacks
-  (let ((changeset "67f1d1f22625")
-        (revision "1"))
-    (package
-      (name "prosody-smacks")
-      (version (string-append "0-" revision "." (string-take changeset 7)))
-      (source (origin
-                (method hg-fetch)
-                (uri (hg-reference
-                      (url "https://hg.prosody.im/prosody-modules/")
-                      (changeset changeset)))
-                (file-name (string-append name "-" version "-checkout"))
-                (sha256
-                 (base32
-                  "020ngpax30fgarah98yvlj0ni8rcdwq60if03a9hqdw8mic0nxxs"))))
-      (build-system trivial-build-system)
-      (arguments
-       '(#:modules ((guix build utils))
-         #:builder
-         (begin
-           (use-modules (guix build utils))
-           (let ((out (assoc-ref %outputs "out"))
-                 (source (assoc-ref %build-inputs "source")))
-             (with-directory-excursion (in-vicinity source "mod_smacks")
-               (install-file "mod_smacks.lua" out))
-             #t))))
-      (home-page "https://modules.prosody.im/mod_smacks.html")
-      (synopsis "XEP-0198: Reliability and fast reconnects for XMPP")
-      (description "This module implements XEP-0198: when supported by both
+  (package
+    (inherit (prosody-module "mod_smacks"))
+    (synopsis "XEP-0198: Reliability and fast reconnects for XMPP")
+    (description "This module implements XEP-0198: when supported by both
 the client and server, it can allow clients to resume a disconnected session,
-and prevent message loss.")
-      (license (package-license prosody)))))
+and prevent message loss.")))
+
+(define-public prosody-vcard-muc
+  (package
+    (inherit (prosody-module "mod_vcard_muc"))
+    (synopsis "Support for MUC vCards and avatars")
+    (description "This module adds the ability to set vCard for MUC rooms. One
+of the most common use cases is to define avatars for MUC rooms.")))
 
 (define-public libtoxcore
   (let ((revision "2")
diff --git a/gnu/packages/multiprecision.scm b/gnu/packages/multiprecision.scm
index 591170b508..daa3144bd3 100644
--- a/gnu/packages/multiprecision.scm
+++ b/gnu/packages/multiprecision.scm
@@ -455,7 +455,7 @@ number generators, public key cryptography and a plethora of other routines.")
 (define-public libtommath
   (package
     (name "libtommath")
-    (version "1.2.0")
+    (version "1.2.1")
     (outputs '("out" "static"))
     (source
       (origin
@@ -464,8 +464,7 @@ number generators, public key cryptography and a plethora of other routines.")
                             "download/v" version "/ltm-" version ".tar.xz"))
         (sha256
          (base32
-          "1c8q1qy88cjhdjlk3g24mra94h34c1ldvkjz0n2988c0yvn5xixp"))
-        (patches (search-patches "libtommath-integer-overflow.patch"))))
+          "07qdxnmp5bhfw5za6mr2l2w0vb7494v9zs9h5vp6y9vlngbjaq4q"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
@@ -476,13 +475,11 @@ number generators, public key cryptography and a plethora of other routines.")
              ;; We want the shared library by default so force it to be the
              ;; default makefile target.
              (delete-file "makefile")
-             (symlink "makefile.shared" "makefile")
-             #t))
+             (symlink "makefile.shared" "makefile")))
          (add-after 'install 'remove-static-library
            (lambda* (#:key outputs #:allow-other-keys)
              (delete-file (string-append (assoc-ref outputs "out")
-                                         "/lib/libtommath.a"))
-             #t))
+                                         "/lib/libtommath.a"))))
          (replace 'check
            (lambda* (#:key tests? test-target make-flags #:allow-other-keys)
              (when tests?
@@ -504,48 +501,6 @@ number generators, public key cryptography and a plethora of other routines.")
 integer library written entirely in C.  It's designed to provide an API that is
 simple to work with that provides fairly efficient routines that build out of
 the box without configuration.")
+    (properties `((upstream-name . "ltm")
+                  (lint-hidden-cve . ("CVE-2023-36328"))))
     (license unlicense)))
-
-(define-public libtommath-1.1
-  (package
-    (inherit libtommath)
-    (version "1.1.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (string-append "https://github.com/libtom/libtommath/releases/"
-                            "download/v" version "/ltm-" version ".tar.xz"))
-        (sha256
-         (base32
-          "1bbyagqzfdbg37k1n08nsqzdf44z8zsnjjinqbsyj7rxg246qilh"))
-        (patches (search-patches "libtommath-fix-linkage.patch"))))
-    (arguments
-      (substitute-keyword-arguments (package-arguments libtommath)
-        ((#:phases phases)
-         `(modify-phases ,phases
-            (add-after 'unpack 'patch-coreutils-call
-              (lambda _
-                ;; Don't pull in coreutils.
-                (substitute* "makefile_include.mk"
-                  (("arch") "uname -m"))
-                #t))))
-        ((#:test-target _) "test_standalone")))))
-
-(define-public libtommath-1.0
-  (package
-    (inherit libtommath-1.1)
-    (version "1.0.1")
-    (outputs '("out"))
-    (source
-      (origin
-        (method url-fetch)
-        (uri (string-append "https://github.com/libtom/libtommath/releases/"
-                            "download/v" version "/ltm-" version ".tar.xz"))
-        (sha256
-         (base32
-          "0sbccdwbkfc680id2fi0x067j23biqcjqilwkk7y9339knrjy0s7"))))
-    (arguments
-      (substitute-keyword-arguments (package-arguments libtommath-1.1)
-        ((#:phases phases)
-         `(modify-phases ,phases
-            (delete 'install-static-library)))))))
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index 5d6bc47b8b..f155edaca0 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -9,7 +9,7 @@
 ;;; Copyright © 2018, 2019 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2018 Sou Bunnbu <iyzsong@member.fsf.org>
 ;;; Copyright © 2018, 2019 Eric Bavier <bavier@member.fsf.org>
-;;; Copyright © 2019-2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2019-2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2019 Jonathan Brielmaier <jonathan.brielmaier@web.de>
 ;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2020, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
@@ -120,6 +120,7 @@
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages version-control)
   #:autoload   (guix build-system channel) (channel-build-system)
+  #:use-module (guix build-system copy)
   #:use-module (guix build-system glib-or-gtk)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system guile)
@@ -682,15 +683,12 @@ overridden by setting the 'current-guix-package' parameter."
 
 (define-public guix-icons
   (package
-    (inherit guix)
     (name "guix-icons")
     (version "0.1")
     (source %artwork-repository)
     (build-system trivial-build-system)
     (native-inputs
      (list imagemagick))
-    (inputs
-     '())
     (arguments
      `(#:modules ((guix build utils)
                   (gnu build svg))
@@ -738,10 +736,29 @@ overridden by setting the 'current-guix-package' parameter."
                                #:width size
                                #:height size)))
                  sizes))))))
+    (home-page "https://www.gnu.org/software/guix/")
     (synopsis "GNU Guix icons")
     (description "This package contains GNU Guix icons organized according to
 the Icon Theme Specification.  They can be used by applications querying the
-GTK icon cache for instance.")))
+GTK icon cache for instance.")
+    (license license:cc-by-sa4.0)))
+
+(define-public guix-backgrounds
+  (package
+    (name "guix-backgrounds")
+    (version "0.1")
+    (source %artwork-repository)
+    (build-system copy-build-system)
+    (arguments
+     (list #:install-plan
+           #~'(("backgrounds" "share/backgrounds/guix" #:exclude ("README")))))
+    (home-page "https://www.gnu.org/software/guix/")
+    (synopsis "Background images for GNU Guix")
+    (description "The SVG files in this directory are intended to be used as
+backgrounds for different components of the GNU system like login managers and
+desktop environments.  The backgrounds are available in different aspect ratios
+which are indicated in the file name.")
+    (license (list license:public-domain license:cc-by-sa4.0))))
 
 (define-public guix-modules
   (package
@@ -974,8 +991,8 @@ transactions from C or Python.")
     (license license:gpl2+)))
 
 (define-public bffe
-  (let ((commit "1c12da4e6f3c7d3ab557781769fb848354362748")
-        (revision "3"))
+  (let ((commit "006b96a9ff41f5d8e639f93f81eeab87d204bd89")
+        (revision "4"))
     (package
       (name "bffe")
       (version (git-version "0" revision commit))
@@ -986,7 +1003,7 @@ transactions from C or Python.")
                       (commit commit)))
                 (sha256
                  (base32
-                  "0qa63mssv85g38m3bcblgp3yscywgz0hrg4lc84dxx99b07pmfc3"))
+                  "1ai3dzwp5ddn5i7xzvg0qcj0nbip03jx0d3vhvxqr1vnlr71rzvh"))
                 (file-name (string-append name "-" version "-checkout"))))
       (build-system gnu-build-system)
       (native-inputs
@@ -1001,7 +1018,7 @@ transactions from C or Python.")
              guix
              guix-data-service
              guix-build-coordinator
-             guile-fibers-1.3
+             guile-fibers
              guile-prometheus
              guile-lib))
       (propagated-inputs
@@ -1010,7 +1027,7 @@ transactions from C or Python.")
              guix
              guix-data-service
              guix-build-coordinator
-             guile-fibers-1.3
+             guile-fibers
              guile-prometheus
              guile-lib))
       (home-page "https://git.cbaines.net/guix/bffe")
@@ -1513,8 +1530,8 @@ environments.")
                   "0k9zkdyyzir3fvlbcfcqy17k28b51i20rpbjwlx2i1mwd2pw9cxc")))))))
 
 (define-public guix-build-coordinator
-  (let ((commit "9f1545b15269523eac109b54e1a62f4c0cda837e")
-        (revision "97"))
+  (let ((commit "1c80525d21f183ed2556def6fcd021f6ea9a88a4")
+        (revision "98"))
     (package
       (name "guix-build-coordinator")
       (version (git-version "0" revision commit))
@@ -1525,7 +1542,7 @@ environments.")
                       (commit commit)))
                 (sha256
                  (base32
-                  "1h35jjpvl7lipbys8q7ivx13cffkya6n0jpc91ckag3z2vb09iwp"))
+                  "0krw4v04ynp8v12zgc87cx6d3rldr13b48kix9rzq4z17x7f39yc"))
                 (file-name (string-append name "-" version "-checkout"))))
       (build-system gnu-build-system)
       (arguments
diff --git a/gnu/packages/patches/hubbub-maybe-uninitialized.patch b/gnu/packages/patches/hubbub-maybe-uninitialized.patch
deleted file mode 100644
index 6f289a770e..0000000000
--- a/gnu/packages/patches/hubbub-maybe-uninitialized.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 69d81a8a4d4c223aad67cde0fdf64d64351b9802 Mon Sep 17 00:00:00 2001
-From: Andy Tai <atai@atai.org>
-Date: Sat, 27 May 2023 00:01:34 -0700
-Subject: [PATCH] prevent -Werror=maybe-uninitialized build failure with gcc 11
- when building tests tokeniser2 and tokeniser3
-
----
- test/tokeniser2.c | 2 +-
- test/tokeniser3.c | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/test/tokeniser2.c b/test/tokeniser2.c
-index c8ab9c0..4caae38 100644
---- a/test/tokeniser2.c
-+++ b/test/tokeniser2.c
-@@ -438,7 +438,7 @@ hubbub_error token_handler(const hubbub_token *token, void *pw)
- 			/* Expected token only contained part of the data
- 			 * Calculate how much is left, then try again with
- 			 * the next expected token */
--			hubbub_token t;
-+			hubbub_token t = { 0 };
- 
- 			t.type = HUBBUB_TOKEN_CHARACTER;
- 			t.data.character.ptr += len;
-diff --git a/test/tokeniser3.c b/test/tokeniser3.c
-index e33d018..b3be901 100644
---- a/test/tokeniser3.c
-+++ b/test/tokeniser3.c
-@@ -447,7 +447,7 @@ hubbub_error token_handler(const hubbub_token *token, void *pw)
- 			/* Expected token only contained part of the data
- 			 * Calculate how much is left, then try again with
- 			 * the next expected token */
--			hubbub_token t;
-+			hubbub_token t = { 0 };
- 
- 			t.type = HUBBUB_TOKEN_CHARACTER;
- 			t.data.character.ptr += len;
--- 
-2.40.1
-
diff --git a/gnu/packages/patches/libcss-check-format.patch b/gnu/packages/patches/libcss-check-format.patch
new file mode 100644
index 0000000000..b297ac1c92
--- /dev/null
+++ b/gnu/packages/patches/libcss-check-format.patch
@@ -0,0 +1,13 @@
+Submitted upstream at https://bugs.netsurf-browser.org/mantis/view.php?id=2870
+
+--- libcss-0.9.2/test/dump.h.orig
++++ libcss-0.9.2/test/dump.h
+@@ -131,7 +131,7 @@ void dump_rule_media(css_rule_media *s, char **buf, size_t *buflen)
+ 	char *ptr = *buf;
+ 	css_rule *rule;
+ 
+-	ptr += sprintf(ptr, "| @media %s%03lx",
++	ptr += sprintf(ptr, "| @media %s%03" PRIx64,
+ 			s->media->negate_type ? "not " : "",
+ 			s->media->type);
+ 
diff --git a/gnu/packages/patches/libtommath-fix-linkage.patch b/gnu/packages/patches/libtommath-fix-linkage.patch
deleted file mode 100644
index 1a9d46eb7c..0000000000
--- a/gnu/packages/patches/libtommath-fix-linkage.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-https://github.com/libtom/libtommath/commit/93dea3a4162527346cd8856bfda6f17ffe98ab04.patch
-
-From 93dea3a4162527346cd8856bfda6f17ffe98ab04 Mon Sep 17 00:00:00 2001
-From: Steffen Jaeckel <s@jaeckel.eu>
-Date: Thu, 31 Jan 2019 14:12:03 +0100
-Subject: [PATCH] makefile.shared: fix compilation and linkage
-
----
- makefile.shared | 15 ++++++++-------
- 1 file changed, 8 insertions(+), 7 deletions(-)
-
-diff --git a/makefile.shared b/makefile.shared
-index 3955f830..870b18d1 100644
---- a/makefile.shared
-+++ b/makefile.shared
-@@ -18,6 +18,7 @@ ifndef LIBTOOL
-   endif
- endif
- LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC)
-+LTLINK = $(LIBTOOL) --mode=link --tag=CC $(CC)
- 
- LCOV_ARGS=--directory .libs --directory .
- 
-@@ -59,7 +60,7 @@ objs: $(OBJECTS)
- LOBJECTS = $(OBJECTS:.o=.lo)
- 
- $(LIBNAME):  $(OBJECTS)
--	$(LIBTOOL) --mode=link --tag=CC $(CC) $(LDFLAGS) $(LOBJECTS) -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION_SO) $(LIBTOOLFLAGS)
-+	$(LTLINK) $(LDFLAGS) $(LOBJECTS) -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION_SO) $(LIBTOOLFLAGS)
- 
- install: $(LIBNAME)
- 	install -d $(DESTDIR)$(LIBPATH)
-@@ -76,16 +77,16 @@ uninstall:
- 	rm $(DESTDIR)$(LIBPATH)/pkgconfig/libtommath.pc
- 
- test: $(LIBNAME) demo/demo.o
--	$(CC) $(CFLAGS) -c demo/demo.c -o demo/demo.o
--	$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o test demo/demo.o $(LIBNAME)
-+	$(LTCOMPILE) $(CFLAGS) -c demo/demo.c -o demo/demo.o
-+	$(LTLINK) $(LDFLAGS) -o test demo/demo.o $(LIBNAME)
- 
- test_standalone: $(LIBNAME) demo/demo.o
--	$(CC) $(CFLAGS) -c demo/demo.c -o demo/demo.o
--	$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o test demo/demo.o $(LIBNAME)
-+	$(LTCOMPILE) $(CFLAGS) -c demo/demo.c -o demo/demo.o
-+	$(LTLINK) $(LDFLAGS) -o test demo/demo.o $(LIBNAME)
- 
- .PHONY: mtest
- mtest:
--	cd mtest ; $(CC) $(CFLAGS) $(LDFLAGS) mtest.c -o mtest
-+	cd mtest ; $(CC) $(CFLAGS) -O0 mtest.c $(LDFLAGS) -o mtest
- 
- timing: $(LIBNAME) demo/timing.c
--	$(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -DTIMER demo/timing.c $(LIBNAME) -o timing
-+	$(LTLINK) $(CFLAGS) $(LDFLAGS) -DTIMER demo/timing.c $(LIBNAME) -o timing
diff --git a/gnu/packages/patches/libtommath-integer-overflow.patch b/gnu/packages/patches/libtommath-integer-overflow.patch
deleted file mode 100644
index 5241726775..0000000000
--- a/gnu/packages/patches/libtommath-integer-overflow.patch
+++ /dev/null
@@ -1,140 +0,0 @@
-This patch is from upstream:
-https://github.com/libtom/libtommath/pull/546
-
-From beba892bc0d4e4ded4d667ab1d2a94f4d75109a9 Mon Sep 17 00:00:00 2001
-From: czurnieden <czurnieden@gmx.de>
-Date: Tue, 9 May 2023 17:17:12 +0200
-Subject: [PATCH] Fix possible integer overflow
-
----
- bn_mp_2expt.c                | 4 ++++
- bn_mp_grow.c                 | 4 ++++
- bn_mp_init_size.c            | 5 +++++
- bn_mp_mul_2d.c               | 4 ++++
- bn_s_mp_mul_digs.c           | 4 ++++
- bn_s_mp_mul_digs_fast.c      | 4 ++++
- bn_s_mp_mul_high_digs.c      | 4 ++++
- bn_s_mp_mul_high_digs_fast.c | 4 ++++
- 8 files changed, 33 insertions(+)
-
-diff --git a/bn_mp_2expt.c b/bn_mp_2expt.c
-index 0ae3df1bf..23de0c3c5 100644
---- a/bn_mp_2expt.c
-+++ b/bn_mp_2expt.c
-@@ -12,6 +12,10 @@ mp_err mp_2expt(mp_int *a, int b)
- {
-    mp_err    err;
- 
-+   if (b < 0) {
-+      return MP_VAL;
-+   }
-+
-    /* zero a as per default */
-    mp_zero(a);
- 
-diff --git a/bn_mp_grow.c b/bn_mp_grow.c
-index 9e904c547..2b1682651 100644
---- a/bn_mp_grow.c
-+++ b/bn_mp_grow.c
-@@ -9,6 +9,10 @@ mp_err mp_grow(mp_int *a, int size)
-    int     i;
-    mp_digit *tmp;
- 
-+   if (size < 0) {
-+      return MP_VAL;
-+   }
-+
-    /* if the alloc size is smaller alloc more ram */
-    if (a->alloc < size) {
-       /* reallocate the array a->dp
-diff --git a/bn_mp_init_size.c b/bn_mp_init_size.c
-index d62268721..99573833f 100644
---- a/bn_mp_init_size.c
-+++ b/bn_mp_init_size.c
-@@ -6,6 +6,11 @@
- /* init an mp_init for a given size */
- mp_err mp_init_size(mp_int *a, int size)
- {
-+
-+   if (size < 0) {
-+      return MP_VAL;
-+   }
-+
-    size = MP_MAX(MP_MIN_PREC, size);
- 
-    /* alloc mem */
-diff --git a/bn_mp_mul_2d.c b/bn_mp_mul_2d.c
-index 87354de20..bfeaf2eb2 100644
---- a/bn_mp_mul_2d.c
-+++ b/bn_mp_mul_2d.c
-@@ -9,6 +9,10 @@ mp_err mp_mul_2d(const mp_int *a, int b, mp_int *c)
-    mp_digit d;
-    mp_err   err;
- 
-+   if (b < 0) {
-+      return MP_VAL;
-+   }
-+
-    /* copy */
-    if (a != c) {
-       if ((err = mp_copy(a, c)) != MP_OKAY) {
-diff --git a/bn_s_mp_mul_digs.c b/bn_s_mp_mul_digs.c
-index 64509d4cb..3682b4980 100644
---- a/bn_s_mp_mul_digs.c
-+++ b/bn_s_mp_mul_digs.c
-@@ -16,6 +16,10 @@ mp_err s_mp_mul_digs(const mp_int *a, const mp_int *b, mp_int *c, int digs)
-    mp_word r;
-    mp_digit tmpx, *tmpt, *tmpy;
- 
-+   if (digs < 0) {
-+      return MP_VAL;
-+   }
-+
-    /* can we use the fast multiplier? */
-    if ((digs < MP_WARRAY) &&
-        (MP_MIN(a->used, b->used) < MP_MAXFAST)) {
-diff --git a/bn_s_mp_mul_digs_fast.c b/bn_s_mp_mul_digs_fast.c
-index b2a287b02..3c4176a87 100644
---- a/bn_s_mp_mul_digs_fast.c
-+++ b/bn_s_mp_mul_digs_fast.c
-@@ -26,6 +26,10 @@ mp_err s_mp_mul_digs_fast(const mp_int *a, const mp_int *b, mp_int *c, int digs)
-    mp_digit W[MP_WARRAY];
-    mp_word  _W;
- 
-+   if (digs < 0) {
-+      return MP_VAL;
-+   }
-+
-    /* grow the destination as required */
-    if (c->alloc < digs) {
-       if ((err = mp_grow(c, digs)) != MP_OKAY) {
-diff --git a/bn_s_mp_mul_high_digs.c b/bn_s_mp_mul_high_digs.c
-index 2bb2a5098..c9dd355f8 100644
---- a/bn_s_mp_mul_high_digs.c
-+++ b/bn_s_mp_mul_high_digs.c
-@@ -15,6 +15,10 @@ mp_err s_mp_mul_high_digs(const mp_int *a, const mp_int *b, mp_int *c, int digs)
-    mp_word  r;
-    mp_digit tmpx, *tmpt, *tmpy;
- 
-+   if (digs < 0) {
-+      return MP_VAL;
-+   }
-+
-    /* can we use the fast multiplier? */
-    if (MP_HAS(S_MP_MUL_HIGH_DIGS_FAST)
-        && ((a->used + b->used + 1) < MP_WARRAY)
-diff --git a/bn_s_mp_mul_high_digs_fast.c b/bn_s_mp_mul_high_digs_fast.c
-index a2c4fb692..4ce7f590c 100644
---- a/bn_s_mp_mul_high_digs_fast.c
-+++ b/bn_s_mp_mul_high_digs_fast.c
-@@ -19,6 +19,10 @@ mp_err s_mp_mul_high_digs_fast(const mp_int *a, const mp_int *b, mp_int *c, int
-    mp_digit W[MP_WARRAY];
-    mp_word  _W;
- 
-+   if (digs < 0) {
-+      return MP_VAL;
-+   }
-+
-    /* grow the destination as required */
-    pa = a->used + b->used;
-    if (c->alloc < pa) {
diff --git a/gnu/packages/patches/netsurf-message-timestamp.patch b/gnu/packages/patches/netsurf-message-timestamp.patch
index 8df9dbf8f7..03bfdfde3f 100644
--- a/gnu/packages/patches/netsurf-message-timestamp.patch
+++ b/gnu/packages/patches/netsurf-message-timestamp.patch
@@ -1,5 +1,5 @@
---- netsurf-3.8/utils/split-messages.pl.orig	1969-12-31 18:00:00.000000000 -0600
-+++ netsurf-3.8/utils/split-messages.pl	2018-08-30 00:18:58.158367530 -0500
+--- netsurf-3.11/tools/split-messages.pl.orig
++++ netsurf-3.11/tools/split-messages.pl
 @@ -238,7 +238,7 @@
  
      if( $opt{gzip} )
diff --git a/gnu/packages/patches/podman-program-lookup.patch b/gnu/packages/patches/podman-program-lookup.patch
new file mode 100644
index 0000000000..27a9421285
--- /dev/null
+++ b/gnu/packages/patches/podman-program-lookup.patch
@@ -0,0 +1,120 @@
+From 914aed3e04f71453fbdc30f4287e13ca3ce63a36 Mon Sep 17 00:00:00 2001
+From: Tomas Volf <~@wolfsden.cz>
+Date: Wed, 14 Feb 2024 20:02:03 +0100
+Subject: [PATCH] Modify search for binaries to fit Guix model
+
+Podman basically looked into the $PATH and into its libexec.  That does not fit
+Guix's model very well, to an additional option to specify additional
+directories during compilation was added.
+
+* pkg/rootless/rootless_linux.go
+(tryMappingTool): Also check /run/setuid-programs.
+* vendor/github.com/containers/common/pkg/config/config.go
+(extraGuixDir): New function.
+(FindHelperBinary): Use it.
+* vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go
+(guixLookupSetuidPath): New function.
+(Start): Use it.
+---
+ pkg/rootless/rootless_linux.go                |  3 +++
+ .../containers/common/pkg/config/config.go    | 23 +++++++++++++++++++
+ .../storage/pkg/unshare/unshare_linux.go      | 14 +++++++++--
+ 3 files changed, 38 insertions(+), 2 deletions(-)
+
+diff --git a/pkg/rootless/rootless_linux.go b/pkg/rootless/rootless_linux.go
+index d303c8b..0191d90 100644
+--- a/pkg/rootless/rootless_linux.go
++++ b/pkg/rootless/rootless_linux.go
+@@ -102,6 +102,9 @@ func tryMappingTool(uid bool, pid int, hostID int, mappings []idtools.IDMap) err
+ 		idtype = "setgid"
+ 	}
+ 	path, err := exec.LookPath(tool)
++	if err != nil {
++		path, err = exec.LookPath("/run/setuid-programs/" + tool)
++	}
+ 	if err != nil {
+ 		return fmt.Errorf("command required for rootless mode with multiple IDs: %w", err)
+ 	}
+diff --git a/vendor/github.com/containers/common/pkg/config/config.go b/vendor/github.com/containers/common/pkg/config/config.go
+index 75b917f..ed2f131 100644
+--- a/vendor/github.com/containers/common/pkg/config/config.go
++++ b/vendor/github.com/containers/common/pkg/config/config.go
+@@ -1102,6 +1102,24 @@ func findBindir() string {
+ 	return bindirCached
+ }
+ 
++func extraGuixDir(bin_name string) string {
++	if (bin_name == "slirp4netns") {
++		return "@SLIRP4NETNS_DIR@";
++	} else if (bin_name == "pasta") {
++		return "@PASST_DIR@";
++	} else if (strings.HasPrefix(bin_name, "qemu-")) {
++		return "@QEMU_DIR@";
++	} else if (bin_name == "gvproxy") {
++		return "@GVPROXY_DIR@";
++	} else if (bin_name == "netavark") {
++		return "@NETAVARK_DIR@";
++	} else if (bin_name == "aardvark-dns") {
++		return "@AARDVARK_DNS_DIR@";
++	} else {
++		return "";
++	}
++}
++
+ // FindHelperBinary will search the given binary name in the configured directories.
+ // If searchPATH is set to true it will also search in $PATH.
+ func (c *Config) FindHelperBinary(name string, searchPATH bool) (string, error) {
+@@ -1109,6 +1127,11 @@ func (c *Config) FindHelperBinary(name string, searchPATH bool) (string, error)
+ 	bindirPath := ""
+ 	bindirSearched := false
+ 
++	if dir := extraGuixDir(name); dir != "" {
++		/* If there is a Guix dir, skip the PATH search. */
++		dirList = append([]string{dir}, dirList...)
++	}
++
+ 	// If set, search this directory first. This is used in testing.
+ 	if dir, found := os.LookupEnv("CONTAINERS_HELPER_BINARY_DIR"); found {
+ 		dirList = append([]string{dir}, dirList...)
+diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go
+index a8dc1ba..0b0d755 100644
+--- a/vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go
++++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go
+@@ -26,6 +26,16 @@ import (
+ 	"github.com/syndtr/gocapability/capability"
+ )
+ 
++func guixLookupSetuidPath(prog string) (string, error) {
++	path, err := exec.LookPath(prog)
++	if err != nil {
++		path, err = exec.LookPath("/run/setuid-programs/" + prog)
++	}
++	return path, err
++}
++
++
++
+ // Cmd wraps an exec.Cmd created by the reexec package in unshare(), and
+ // handles setting ID maps and other related settings by triggering
+ // initialization code in the child.
+@@ -237,7 +247,7 @@ func (c *Cmd) Start() error {
+ 			gidmapSet := false
+ 			// Set the GID map.
+ 			if c.UseNewgidmap {
+-				path, err := exec.LookPath("newgidmap")
++				path, err := guixLookupSetuidPath("newgidmap")
+ 				if err != nil {
+ 					return fmt.Errorf("finding newgidmap: %w", err)
+ 				}
+@@ -297,7 +307,7 @@ func (c *Cmd) Start() error {
+ 			uidmapSet := false
+ 			// Set the UID map.
+ 			if c.UseNewuidmap {
+-				path, err := exec.LookPath("newuidmap")
++				path, err := guixLookupSetuidPath("newuidmap")
+ 				if err != nil {
+ 					return fmt.Errorf("finding newuidmap: %w", err)
+ 				}
+-- 
+2.41.0
+
diff --git a/gnu/packages/patches/python-3.12-fix-tests.patch b/gnu/packages/patches/python-3.12-fix-tests.patch
new file mode 100644
index 0000000000..fa5c8027ce
--- /dev/null
+++ b/gnu/packages/patches/python-3.12-fix-tests.patch
@@ -0,0 +1,334 @@
+From f0698133e7d6c353a3e6ae0fc62e57ba558a9bc0 Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
+Date: Wed, 28 Oct 2020 22:55:05 -0400
+Subject: [PATCH] Skip problematic Python 3 tests in Guix.
+
+A subset of the hunks in this patch is tracked upstream at
+https://bugs.python.org/issue38845, which was contributed by Tanguy Le
+Carrour <tanguy@bioneland.org>.
+
+diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
+index e42c7ab4bd..8087c84dab 100644
+--- a/Lib/test/_test_multiprocessing.py
++++ b/Lib/test/_test_multiprocessing.py
+@@ -1695,6 +1695,7 @@ def _test_wait_result(cls, c, pid):
+         if pid is not None:
+             os.kill(pid, signal.SIGINT)
+
++    @unittest.skipIf(True, "This fails for unknown reasons on Guix")
+     def test_wait_result(self):
+         if isinstance(self, ProcessesMixin) and sys.platform != 'win32':
+             pid = os.getpid()
+@@ -4150,6 +4151,7 @@ def test_shared_memory_across_processes(self):
+         sms.close()
+
+     @unittest.skipIf(os.name != "posix", "not feasible in non-posix platforms")
++    @unittest.skipUnless(sys.stdin.isatty(), "KeyboardInterrupts require a TTY device")
+     def test_shared_memory_SharedMemoryServer_ignores_sigint(self):
+         # bpo-36368: protect SharedMemoryManager server process from
+         # KeyboardInterrupt signals.
+diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
+index 85c8152d49..e35cfffe84 100644
+--- a/Lib/test/test_asyncio/test_base_events.py
++++ b/Lib/test/test_asyncio/test_base_events.py
+@@ -1377,6 +1377,8 @@ def test_create_connection_no_inet_pton(self, m_socket):
+         self._test_create_connection_ip_addr(m_socket, False)
+
+     @patch_socket
++    @unittest.skipUnless(support.is_resource_enabled('network'),
++                         'network is not enabled')
+     def test_create_connection_service_name(self, m_socket):
+         m_socket.getaddrinfo = socket.getaddrinfo
+         sock = m_socket.socket.return_value
+diff --git a/Lib/test/test_ctypes/test_find.py b/Lib/test/test_ctypes/test_find.py
+index a41e94971d..1291af3057 100644
+--- a/Lib/test/test_ctypes/test_find.py
++++ b/Lib/test/test_ctypes/test_find.py
+@@ -117,6 +117,7 @@ def test_find_library_with_gcc(self):
+         with unittest.mock.patch("ctypes.util._findSoname_ldconfig", lambda *args: None):
+             self.assertNotEqual(find_library('c'), None)
+
++    @unittest.skipIf(True, 'Fails on Guix.')
+     def test_find_library_with_ld(self):
+         with unittest.mock.patch("ctypes.util._findSoname_ldconfig", lambda *args: None), \
+              unittest.mock.patch("ctypes.util._findLib_gcc", lambda *args: None):
+diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py
+index 1ee9958445..ab6b41befe 100644
+--- a/Lib/test/test_generators.py
++++ b/Lib/test/test_generators.py
+@@ -34,6 +34,7 @@ def generator2(self):
+         else:
+             return "FAILED"
+
++    @unittest.skipIf(True, 'Keyboard interrupts do not work in the Guix build environment')
+     def test_raise_and_yield_from(self):
+         gen = self.generator1()
+         gen.send(None)
+diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
+index ec105ae1a0..ae4c5b672e 100644
+--- a/Lib/test/test_pathlib.py
++++ b/Lib/test/test_pathlib.py
+@@ -3069,6 +3069,7 @@ def test_rglob(self):
+                          'pwd module does not expose getpwall()')
+     @unittest.skipIf(sys.platform == "vxworks",
+                      "no home directory on VxWorks")
++    @unittest.skipIf(True, "Guix builder home is '/' which causes trouble for these tests")
+     def test_expanduser(self):
+         P = self.cls
+         import_helper.import_module('pwd')
+diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
+index 51b844262e..004d3133cf 100644
+--- a/Lib/test/test_pdb.py
++++ b/Lib/test/test_pdb.py
+@@ -1580,6 +1580,7 @@ def test_pdb_next_command_subiterator():
+     (Pdb) continue
+     """
+
++@unittest.skipIf(True, 'Fails on Guix… but skipIf not taken into account?!')
+ def test_pdb_issue_20766():
+     """Test for reference leaks when the SIGINT handler is set.
+
+@@ -1598,11 +1599,11 @@ def test_pdb_issue_20766():
+     > <doctest test.test_pdb.test_pdb_issue_20766[0]>(6)test_function()
+     -> print('pdb %d: %s' % (i, sess._previous_sigint_handler))
+     (Pdb) continue
+-    pdb 1: <built-in function default_int_handler>
++    pdb 1: 1
+     > <doctest test.test_pdb.test_pdb_issue_20766[0]>(6)test_function()
+     -> print('pdb %d: %s' % (i, sess._previous_sigint_handler))
+     (Pdb) continue
+-    pdb 2: <built-in function default_int_handler>
++    pdb 2: 1
+     """
+
+ def test_pdb_issue_43318():
+diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
+index 2ab6f6a986..8cf6b4d1c8 100644
+--- a/Lib/test/test_regrtest.py
++++ b/Lib/test/test_regrtest.py
+@@ -1049,6 +1049,7 @@ def test_fromfile(self):
+         output = self.run_tests('--fromfile', filename)
+         self.check_executed_tests(output, tests, stats=stats)
+
++    @unittest.skipIf(True, 'Keyboard interrupts do not work in the Guix build environment.')
+     def test_interrupted(self):
+         code = TEST_INTERRUPTED
+         test = self.create_test('sigint', code=code)
+@@ -1066,6 +1067,7 @@ def test_slowest(self):
+                  % (self.TESTNAME_REGEX, len(tests)))
+         self.check_line(output, regex)
+
++    @unittest.skipIf(True, 'Keyboard interrupts do not work in the Guix build environment.')
+     def test_slowest_interrupted(self):
+         # Issue #25373: test --slowest with an interrupted test
+         code = TEST_INTERRUPTED
+diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py
+index 317e7ca8f8..7f272daf24 100644
+--- a/Lib/test/test_resource.py
++++ b/Lib/test/test_resource.py
+@@ -151,6 +151,7 @@ def test_freebsd_contants(self):
+
+     @unittest.skipUnless(hasattr(resource, 'prlimit'), 'no prlimit')
+     @support.requires_linux_version(2, 6, 36)
++    @unittest.skipIf(True, "Bug: the PermissionError is not raised")
+     def test_prlimit(self):
+         self.assertRaises(TypeError, resource.prlimit)
+         self.assertRaises(ProcessLookupError, resource.prlimit,
+diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
+index bf60f37934..5e3a96380a 100644
+--- a/Lib/test/test_shutil.py
++++ b/Lib/test/test_shutil.py
+@@ -1743,6 +1743,7 @@ def test_make_archive(self):
+         base_name = os.path.join(tmpdir, 'archive')
+         self.assertRaises(ValueError, make_archive, base_name, 'xxx')
+
++    @unittest.skipIf(True, "The Guix build container has no root user")
+     @support.requires_zlib()
+     def test_make_archive_owner_group(self):
+         # testing make_archive with owner and group, with various combinations
+@@ -1771,6 +1772,7 @@ def test_make_archive_owner_group(self):
+         self.assertTrue(os.path.isfile(res))
+
+
++    @unittest.skipIf(True, "The Guix build container has no root user")
+     @support.requires_zlib()
+     @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
+     def test_tarfile_root_owner(self):
+diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
+index 637a0ca3b3..2fb804e340 100644
+--- a/Lib/test/test_signal.py
++++ b/Lib/test/test_signal.py
+@@ -160,6 +160,7 @@ def test_valid_signals(self):
+                 self.assertLess(signum, signal.NSIG)
+
+     @unittest.skipUnless(sys.executable, "sys.executable required.")
++    @unittest.skipUnless(sys.stdin.isatty(), "KeyboardInterrupts require a TTY device")
+     @support.requires_subprocess()
+     def test_keyboard_interrupt_exit_code(self):
+         """KeyboardInterrupt triggers exit via SIGINT."""
+@@ -211,6 +212,7 @@ def test_issue9324(self):
+             signal.signal(7, handler)
+
+     @unittest.skipUnless(sys.executable, "sys.executable required.")
++    @unittest.skipUnless(sys.stdin.isatty(), "KeyboardInterrupts require a TTY device")
+     @support.requires_subprocess()
+     def test_keyboard_interrupt_exit_code(self):
+         """KeyboardInterrupt triggers an exit using STATUS_CONTROL_C_EXIT."""
+@@ -1407,6 +1409,7 @@ def cycle_handlers():
+
+ class RaiseSignalTest(unittest.TestCase):
+
++    @unittest.skipUnless(sys.stdin.isatty(), "KeyboardInterrupts require a TTY device")
+     def test_sigint(self):
+         with self.assertRaises(KeyboardInterrupt):
+             signal.raise_signal(signal.SIGINT)
+@@ -1452,6 +1455,7 @@ def __del__(self):
+
+ class PidfdSignalTest(unittest.TestCase):
+
++    @unittest.skipUnless(sys.stdin.isatty(), "KeyboardInterrupts require a TTY device")
+     @unittest.skipUnless(
+         hasattr(signal, "pidfd_send_signal"),
+         "pidfd support not built in",
+diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
+index 4eb5af99d6..9c7b8f6dbc 100644
+--- a/Lib/test/test_socket.py
++++ b/Lib/test/test_socket.py
+@@ -1016,6 +1016,8 @@ def testHostnameRes(self):
+         if not fqhn in all_host_names:
+             self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
+
++    @unittest.skipUnless(support.is_resource_enabled('network'),
++                         'network is not enabled')
+     def test_host_resolution(self):
+         for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
+             self.assertEqual(socket.gethostbyname(addr), addr)
+@@ -1161,6 +1163,8 @@ def testNtoHErrors(self):
+             self.assertRaises(OverflowError, socket.ntohl, k)
+             self.assertRaises(OverflowError, socket.htonl, k)
+
++    @unittest.skipUnless(os.path.exists("/etc/services"),
++                         "getservbyname uses /etc/services, which is not in the chroot")
+     def testGetServBy(self):
+         eq = self.assertEqual
+         # Find one service that exists, then check all the related interfaces.
+@@ -1521,6 +1525,8 @@ def test_sio_loopback_fast_path(self):
+             raise
+         self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
+
++    @unittest.skipUnless(os.path.exists("/etc/gai.conf"),
++                         "getaddrinfo() will fail")
+     def testGetaddrinfo(self):
+         try:
+             socket.getaddrinfo('localhost', 80)
+@@ -1653,6 +1659,8 @@ def test_getnameinfo(self):
+         # only IP addresses are allowed
+         self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
+
++    @unittest.skipUnless(os.path.exists("/etc/gai.conf"),
++                         "getaddrinfo() will fail")
+     @unittest.skipUnless(support.is_resource_enabled('network'),
+                          'network is not enabled')
+     def test_idna(self):
+diff --git a/Lib/test/test_spwd.py b/Lib/test/test_spwd.py
+index 50766c2548..0c7eb7a83a 100644
+--- a/Lib/test/test_spwd.py
++++ b/Lib/test/test_spwd.py
+@@ -9,8 +9,7 @@
+     spwd = import_helper.import_module('spwd')
+
+
+-@unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0,
+-                     'root privileges required')
++@unittest.skipUnless(os.path.exists("/etc/shadow"), 'spwd tests require /etc/shadow')
+ class TestSpwdRoot(unittest.TestCase):
+
+     def test_getspall(self):
+@@ -60,8 +59,7 @@ def test_getspnam(self):
+             self.assertRaises(TypeError, spwd.getspnam, bytes_name)
+
+
+-@unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() != 0,
+-                     'non-root user required')
++@unittest.skipUnless(os.path.exists("/etc/shadow"), 'spwd tests require /etc/shadow')
+ class TestSpwdNonRoot(unittest.TestCase):
+
+     def test_getspnam_exception(self):
+diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
+index 71489ea493..33351919fe 100644
+--- a/Lib/test/test_tarfile.py
++++ b/Lib/test/test_tarfile.py
+@@ -2911,9 +2911,12 @@ def root_is_uid_gid_0():
+         import pwd, grp
+     except ImportError:
+         return False
+-    if pwd.getpwuid(0)[0] != 'root':
+-        return False
+-    if grp.getgrgid(0)[0] != 'root':
++    try:
++        if pwd.getpwuid(0)[0] != 'root':
++            return False
++        if grp.getgrgid(0)[0] != 'root':
++            return False
++    except KeyError:
+         return False
+     return True
+
+diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
+index 00d9e591c7..2515603715 100644
+--- a/Lib/test/test_threading.py
++++ b/Lib/test/test_threading.py
+@@ -1962,6 +1962,7 @@ def check_interrupt_main_noerror(self, signum):
+             # Restore original handler
+             signal.signal(signum, handler)
+
++    @unittest.skipIf(True, 'Keyboard interrupts do not work in the Guix build container.')
+     def test_interrupt_main_subthread(self):
+         # Calling start_new_thread with a function that executes interrupt_main
+         # should raise KeyboardInterrupt upon completion.
+@@ -1973,6 +1974,8 @@ def call_interrupt():
+             t.join()
+         t.join()
+
++
++    @unittest.skipIf(True, 'Keyboard interrupts do not work in the Guix build container.')
+     def test_interrupt_main_mainthread(self):
+         # Make sure that if interrupt_main is called in main thread that
+         # KeyboardInterrupt is raised instantly.
+diff --git a/Lib/test/test_tools/test_freeze.py b/Lib/test/test_tools/test_freeze.py
+index 0e7ed67de7..6539a2983b 100644
+--- a/Lib/test/test_tools/test_freeze.py
++++ b/Lib/test/test_tools/test_freeze.py
+@@ -23,6 +23,7 @@
+                  'test is too slow with PGO')
+ class TestFreeze(unittest.TestCase):
+
++    @unittest.skipIf(True, 'Fails on Guix.')
+     @support.requires_resource('cpu') # Building Python is slow
+     def test_freeze_simple_script(self):
+         script = textwrap.dedent("""
+diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py
+index 515c3840cb..a96dfad0fe 100644
+--- a/Lib/test/test_unicodedata.py
++++ b/Lib/test/test_unicodedata.py
+@@ -342,6 +342,7 @@ def test_linebreak_7643(self):
+                 self.assertEqual(len(lines), 1,
+                                  r"\u%.4x should not be a linebreak" % i)
+
++@requires_resource('network')
+ class NormalizationTest(unittest.TestCase):
+     @staticmethod
+     def check_version(testfile):
+diff --git a/Tools/scripts/run_tests.py b/Tools/scripts/run_tests.py
+index 445a34ae3e..8f750537c3 100644
+--- a/Tools/scripts/run_tests.py
++++ b/Tools/scripts/run_tests.py
+@@ -69,7 +69,7 @@ def main(regrtest_args):
+         else:
+             args.extend(['-j', '0'])  # Use all CPU cores
+     if not any(is_resource_use_flag(arg) for arg in regrtest_args):
+-        args.extend(['-u', 'all,-largefile,-audio,-gui'])
++        args.extend(['-u', 'all,-largefile,-audio,-gui,-network'])
+
+     if cross_compile and hostrunner:
+         # If HOSTRUNNER is set and -p/--python option is not given, then
diff --git a/gnu/packages/patches/scribus-1.5.8-poppler-22.03.0.patch b/gnu/packages/patches/scribus-1.5.8-poppler-22.03.0.patch
deleted file mode 100644
index f7a0c03fdd..0000000000
--- a/gnu/packages/patches/scribus-1.5.8-poppler-22.03.0.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From f19410ac3b27e33dd62105746784e61e85b90a1d Mon Sep 17 00:00:00 2001
-From: Jean Ghali <jghali@libertysurf.fr>
-Date: Wed, 2 Mar 2022 22:22:53 +0000
-Subject: [PATCH] #16764: Build break with poppler 22.03.0
-
-git-svn-id: svn://scribus.net/trunk/Scribus@24982 11d20701-8431-0410-a711-e3c959e3b870
----
- scribus/plugins/import/pdf/importpdf.cpp | 13 +++++++++++++
- 1 file changed, 13 insertions(+)
-
-diff --git a/scribus/plugins/import/pdf/importpdf.cpp b/scribus/plugins/import/pdf/importpdf.cpp
-index 154e58a3f0..392dcd9e64 100644
---- a/scribus/plugins/import/pdf/importpdf.cpp
-+++ b/scribus/plugins/import/pdf/importpdf.cpp
-@@ -89,7 +89,11 @@ QImage PdfPlug::readThumbnail(const QString& fName)
- #endif

- 	globalParams->setErrQuiet(gTrue);

- 

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 3, 0)

-+	PDFDoc pdfDoc{ std::make_unique<GooString>(fname) };

-+#else

- 	PDFDoc pdfDoc{fname, nullptr, nullptr, nullptr};

-+#endif

- 	if (!pdfDoc.isOk() || pdfDoc.getErrorCode() == errEncrypted)

- 		return QImage();

- 

-@@ -342,7 +346,11 @@ bool PdfPlug::convert(const QString& fn)
- 	globalParams->setErrQuiet(gTrue);

- //	globalParams->setPrintCommands(gTrue);

- 	QList<OptionalContentGroup*> ocgGroups;

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 3, 0)

-+	auto pdfDoc = std::make_unique<PDFDoc>(std::make_unique<GooString>(fname));

-+#else

- 	auto pdfDoc = std::unique_ptr<PDFDoc>(new PDFDoc(fname, nullptr, nullptr, nullptr));

-+#endif

- 	if (pdfDoc)

- 	{

- 		if (pdfDoc->getErrorCode() == errEncrypted)

-@@ -361,8 +369,13 @@ bool PdfPlug::convert(const QString& fn)
- #else

- 				auto fname = new GooString(QFile::encodeName(fn).data());

- #endif

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 3, 0)

-+				std::optional<GooString> userPW(std::in_place, text.toLocal8Bit().data());

-+				pdfDoc.reset(new PDFDoc(std::make_unique<GooString>(fname), userPW, userPW, nullptr));

-+#else

- 				auto userPW = new GooString(text.toLocal8Bit().data());

- 				pdfDoc.reset(new PDFDoc(fname, userPW, userPW, nullptr));

-+#endif

- 				qApp->changeOverrideCursor(QCursor(Qt::WaitCursor));

- 			}

- 			if ((!pdfDoc) || (pdfDoc->getErrorCode() != errNone))

diff --git a/gnu/packages/patches/scribus-1.5.8-poppler-22.04.0.patch b/gnu/packages/patches/scribus-1.5.8-poppler-22.04.0.patch
deleted file mode 100644
index 290484e7e8..0000000000
--- a/gnu/packages/patches/scribus-1.5.8-poppler-22.04.0.patch
+++ /dev/null
@@ -1,291 +0,0 @@
-https://bugs.gentoo.org/843287
-https://github.com/scribusproject/scribus/commit/f2237b8f0b5cf7690e864a22ef7a63a6d769fa36.patch
-
-From f2237b8f0b5cf7690e864a22ef7a63a6d769fa36 Mon Sep 17 00:00:00 2001
-From: Jean Ghali <jghali@libertysurf.fr>
-Date: Fri, 1 Apr 2022 23:52:32 +0000
-Subject: [PATCH] Fix build with poppler 22.04.0
-
-git-svn-id: svn://scribus.net/trunk/Scribus@25074 11d20701-8431-0410-a711-e3c959e3b870
----
- scribus/plugins/import/pdf/slaoutput.cpp | 123 ++++++++++++++---------
- 1 file changed, 78 insertions(+), 45 deletions(-)
-
-diff --git a/scribus/plugins/import/pdf/slaoutput.cpp b/scribus/plugins/import/pdf/slaoutput.cpp
-index e20a81f99e..5626fe3477 100644
---- a/scribus/plugins/import/pdf/slaoutput.cpp
-+++ b/scribus/plugins/import/pdf/slaoutput.cpp
-@@ -174,8 +174,13 @@ void AnoOutputDev::drawString(GfxState *state, POPPLER_CONST GooString *s)
- 	int shade = 100;

- 	currColorText = getColor(state->getFillColorSpace(), state->getFillColor(), &shade);

- 	fontSize = state->getFontSize();

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+	if (state->getFont() && state->getFont()->getName())

-+		fontName = new GooString(state->getFont()->getName().value());

-+#else

- 	if (state->getFont())

- 		fontName = state->getFont()->getName()->copy();

-+#endif

- 	itemText = s->copy();

- }

- 

-@@ -357,7 +362,12 @@ std::unique_ptr<LinkAction> SlaOutputDev::SC_getAdditionalAction(const char *key
- GBool SlaOutputDev::annotations_callback(Annot *annota, void *user_data)

- {

- 	SlaOutputDev *dev = (SlaOutputDev*)user_data;

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+	const PDFRectangle& annotRect = annota->getRect();;

-+	const PDFRectangle* box = &annotRect;

-+#else

- 	PDFRectangle *box = annota->getRect();

-+#endif

- 	double xCoor = dev->m_doc->currentPage()->xOffset() + box->x1 - dev->cropOffsetX;

- 	double yCoor = dev->m_doc->currentPage()->yOffset() + dev->m_doc->currentPage()->height() - box->y2 + dev->cropOffsetY;

- 	double width = box->x2 - box->x1;

-@@ -684,7 +694,12 @@ bool SlaOutputDev::handleWidgetAnnot(Annot* annota, double xCoor, double yCoor,
- 			if (apa || !achar)

- 			{

- 				AnoOutputDev *annotOutDev = new AnoOutputDev(m_doc, m_importedColors);

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+				const PDFRectangle& annotaRect = annota->getRect();

-+				Gfx* gfx = new Gfx(pdfDoc, annotOutDev, pdfDoc->getPage(m_actPage)->getResourceDict(), &annotaRect, nullptr);

-+#else

- 				Gfx *gfx = new Gfx(pdfDoc, annotOutDev, pdfDoc->getPage(m_actPage)->getResourceDict(), annota->getRect(), nullptr);

-+#endif

- 				ano->draw(gfx, false);

- 				if (!bgFound)

- 					m_currColorFill = annotOutDev->currColorFill;

-@@ -2916,22 +2931,27 @@ void SlaOutputDev::markPoint(POPPLER_CONST char *name, Dict *properties)
- 

- void SlaOutputDev::updateFont(GfxState *state)

- {

--	GfxFont *gfxFont;

--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+	std::optional<GfxFontLoc> fontLoc;

-+	std::string fileName;

-+	std::unique_ptr<FoFiTrueType> ff;

-+	std::optional<std::vector<unsigned char>> tmpBuf;

-+#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

- 	std::optional<GfxFontLoc> fontLoc;

- 	const GooString * fileName = nullptr;

- 	std::unique_ptr<FoFiTrueType> ff;

-+	char* tmpBuf = nullptr;

- #else

- 	GfxFontLoc * fontLoc = nullptr;

- 	GooString * fileName = nullptr;

- 	FoFiTrueType * ff = nullptr;

-+	char* tmpBuf = nullptr;

- #endif

- 	GfxFontType fontType;

- 	SlaOutFontFileID *id;

- 	SplashFontFile *fontFile;

- 	SplashFontSrc *fontsrc = nullptr;

- 	Object refObj, strObj;

--	char *tmpBuf = nullptr;

- 	int tmpBufLen = 0;

- 	int *codeToGID = nullptr;

- 	const double *textMat = nullptr;

-@@ -2943,7 +2963,11 @@ void SlaOutputDev::updateFont(GfxState *state)
- 

- 	m_font = nullptr;

- 

--	gfxFont = state->getFont();

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+	GfxFont* gfxFont = state->getFont().get();

-+#else

-+	GfxFont* gfxFont = state->getFont();

-+#endif

- 	if (!gfxFont)

- 		goto err1;

- 

-@@ -2968,15 +2992,23 @@ void SlaOutputDev::updateFont(GfxState *state)
- 		if (fontLoc->locType == gfxFontLocEmbedded)

- 		{

- 			// if there is an embedded font, read it to memory

--			tmpBuf = gfxFont->readEmbFontFile(xref, &tmpBufLen);

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+			tmpBuf = gfxFont->readEmbFontFile((xref) ? xref : pdfDoc->getXRef());

- 			if (! tmpBuf)

- 				goto err2;

-+#else

-+			tmpBuf = gfxFont->readEmbFontFile(xref, &tmpBufLen);

-+			if (!tmpBuf)

-+				goto err2;

-+#endif

- 

- 			// external font

- 		}

- 		else

- 		{ // gfxFontLocExternal

--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+			fileName = fontLoc->path;

-+#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

- 			fileName = fontLoc->pathAsGooString();

- #else

- 			fileName = fontLoc->path;

-@@ -2985,52 +3017,54 @@ void SlaOutputDev::updateFont(GfxState *state)
- 		}

- 

- 		fontsrc = new SplashFontSrc;

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+		if (!fileName.empty())

-+			fontsrc->setFile(fileName);

-+		else

-+			fontsrc->setBuf(std::move(tmpBuf.value()));

-+#else

- 		if (fileName)

- 			fontsrc->setFile(fileName, gFalse);

- 		else

- 			fontsrc->setBuf(tmpBuf, tmpBufLen, gTrue);

-+#endif

- 

- 		// load the font file

- 		switch (fontType) {

- 		case fontType1:

--			if (!(fontFile = m_fontEngine->loadType1Font(

--				id,

--				fontsrc,

--				(const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))

-+			if (!(fontFile = m_fontEngine->loadType1Font(id, fontsrc, (const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))

- 			{

--				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",

--				gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

-+				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

- 				goto err2;

- 			}

- 			break;

- 		case fontType1C:

--			if (!(fontFile = m_fontEngine->loadType1CFont(

--							id,

--							fontsrc,

--							(const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))

-+			if (!(fontFile = m_fontEngine->loadType1CFont(id, fontsrc, (const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))

- 			{

--				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",

--				gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

-+				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

- 				goto err2;

- 			}

- 			break;

- 		case fontType1COT:

--			if (!(fontFile = m_fontEngine->loadOpenTypeT1CFont(

--							id,

--							fontsrc,

--							(const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))

-+			if (!(fontFile = m_fontEngine->loadOpenTypeT1CFont(id, fontsrc, (const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))

- 			{

--				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",

--				gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

-+				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

- 				goto err2;

- 			}

- 			break;

- 		case fontTrueType:

- 		case fontTrueTypeOT:

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+			if (!fileName.empty())

-+				ff = FoFiTrueType::load(fileName.c_str());

-+			else

-+				ff = FoFiTrueType::make(fontsrc->buf.data(), fontsrc->buf.size());

-+#else

- 			if (fileName)

- 				ff = FoFiTrueType::load(fileName->getCString());

- 			else

- 				ff = FoFiTrueType::make(tmpBuf, tmpBufLen);

-+#endif

- 			if (ff)

- 			{

- #if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-@@ -3047,24 +3081,17 @@ void SlaOutputDev::updateFont(GfxState *state)
- 				codeToGID = nullptr;

- 				n = 0;

- 			}

--			if (!(fontFile = m_fontEngine->loadTrueTypeFont(

--							id,

--							fontsrc,

--							codeToGID, n)))

-+			if (!(fontFile = m_fontEngine->loadTrueTypeFont(id, fontsrc, codeToGID, n)))

- 			{

--				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",

--				gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

-+				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

- 				goto err2;

- 			}

- 			break;

- 		case fontCIDType0:

- 		case fontCIDType0C:

--			if (!(fontFile = m_fontEngine->loadCIDFont(

--							id,

--							fontsrc)))

-+			if (!(fontFile = m_fontEngine->loadCIDFont(id, fontsrc)))

- 			{

--				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",

--				gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

-+				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

- 				goto err2;

- 			}

- 			break;

-@@ -3080,10 +3107,7 @@ void SlaOutputDev::updateFont(GfxState *state)
- 				codeToGID = nullptr;

- 				n = 0;

- 			}

--			if (!(fontFile = m_fontEngine->loadOpenTypeCFFFont(

--							id,

--							fontsrc,

--							codeToGID, n)))

-+			if (!(fontFile = m_fontEngine->loadOpenTypeCFFFont(id, fontsrc, codeToGID, n)))

- 			{

- 				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",

- 				gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

-@@ -3105,10 +3129,17 @@ void SlaOutputDev::updateFont(GfxState *state)
- 			}

- 			else

- 			{

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

-+				if (!fileName.empty())

-+					ff = FoFiTrueType::load(fileName.c_str());

-+				else

-+					ff = FoFiTrueType::make(fontsrc->buf.data(), fontsrc->buf.size());

-+#else

- 				if (fileName)

- 					ff = FoFiTrueType::load(fileName->getCString());

- 				else

- 					ff = FoFiTrueType::make(tmpBuf, tmpBufLen);

-+#endif

- 				if (! ff)

- 					goto err2;

- #if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-@@ -3119,13 +3150,9 @@ void SlaOutputDev::updateFont(GfxState *state)
- 				delete ff;

- #endif

- 			}

--			if (!(fontFile = m_fontEngine->loadTrueTypeFont(

--							id,

--							fontsrc,

--							codeToGID, n, faceIndex)))

-+			if (!(fontFile = m_fontEngine->loadTrueTypeFont(id, fontsrc, codeToGID, n, faceIndex)))

- 			{

--				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",

--				gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

-+				error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

- 				goto err2;

- 			}

- 			break;

-@@ -3269,9 +3296,15 @@ void SlaOutputDev::drawChar(GfxState* state, double x, double y, double dx, doub
- GBool SlaOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, POPPLER_CONST_082 Unicode *u, int uLen)

- {

- //	qDebug() << "beginType3Char";

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)

- 	GfxFont *gfxFont;

-+	if (!(gfxFont = state->getFont().get()))

-+		return gTrue;

-+#else

-+	GfxFont* gfxFont;

- 	if (!(gfxFont = state->getFont()))

- 		return gTrue;

-+#endif

- 	if (gfxFont->getType() != fontType3)

- 		return gTrue;

- 	F3Entry f3e;

diff --git a/gnu/packages/patches/scribus-1.5.8-poppler-22.09.0.patch b/gnu/packages/patches/scribus-1.5.8-poppler-22.09.0.patch
deleted file mode 100644
index 106a6f5162..0000000000
--- a/gnu/packages/patches/scribus-1.5.8-poppler-22.09.0.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/scribus/plugins/import/pdf/slaoutput.cpp
-+++ b/scribus/plugins/import/pdf/slaoutput.cpp
-@@ -3741,9 +3741,16 @@ void SlaOutputDev::getPenState(GfxState *state)
- 			break;

- 	}

- 	double lw = state->getLineWidth();

--	double *dashPattern;

- 	int dashLength;

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 9, 0)

-+	const double *dashPattern;

-+	const std::vector<double> &dash = state->getLineDash(&DashOffset);

-+	dashPattern = dash.data();

-+	dashLength = dash.size();

-+#else

-+	double *dashPattern;

- 	state->getLineDash(&dashPattern, &dashLength, &DashOffset);

-+#endif

- 	QVector<double> pattern(dashLength);

- 	for (int i = 0; i < dashLength; ++i)

- 	{

diff --git a/gnu/packages/patches/scribus-1.5.8-poppler-22.2.0-1.patch b/gnu/packages/patches/scribus-1.5.8-poppler-22.2.0-1.patch
deleted file mode 100644
index 4e0f607c6a..0000000000
--- a/gnu/packages/patches/scribus-1.5.8-poppler-22.2.0-1.patch
+++ /dev/null
@@ -1,129 +0,0 @@
-From 85c0dff3422fa3c26fbc2e8d8561f597ec24bd92 Mon Sep 17 00:00:00 2001
-From: Jean Ghali <jghali@libertysurf.fr>
-Date: Wed, 2 Feb 2022 23:12:52 +0000
-Subject: [PATCH] #16734: Build break with poppler 22.2.0
-
-git-svn-id: svn://scribus.net/trunk/Scribus@24884 11d20701-8431-0410-a711-e3c959e3b870
----
- scribus/plugins/import/pdf/slaoutput.cpp | 47 +++++++++++++++++++-----
- 1 file changed, 37 insertions(+), 10 deletions(-)
-
-diff --git a/scribus/plugins/import/pdf/slaoutput.cpp b/scribus/plugins/import/pdf/slaoutput.cpp
-index 5894bf2ad6..3650c96f52 100644
---- a/scribus/plugins/import/pdf/slaoutput.cpp
-+++ b/scribus/plugins/import/pdf/slaoutput.cpp
-@@ -7,6 +7,11 @@ for which a new license (GPL+exception) is in place.
- 

- #include "slaoutput.h"

- 

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-+#include <memory>

-+#include <optional>

-+#endif

-+

- #include <poppler/GlobalParams.h>

- #include <poppler/poppler-config.h>

- #include <poppler/FileSpec.h>

-@@ -3027,18 +3032,24 @@ void SlaOutputDev::markPoint(POPPLER_CONST char *name, Dict *properties)
- void SlaOutputDev::updateFont(GfxState *state)

- {

- 	GfxFont *gfxFont;

--	GfxFontLoc *fontLoc;

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-+	std::optional<GfxFontLoc> fontLoc;

-+	const GooString * fileName = nullptr;

-+	std::unique_ptr<FoFiTrueType> ff;

-+#else

-+	GfxFontLoc * fontLoc = nullptr;

-+	GooString * fileName = nullptr;

-+	FoFiTrueType * ff = nullptr;

-+#endif

- 	GfxFontType fontType;

- 	SlaOutFontFileID *id;

- 	SplashFontFile *fontFile;

- 	SplashFontSrc *fontsrc = nullptr;

--	FoFiTrueType *ff;

- 	Object refObj, strObj;

--	GooString *fileName;

--	char *tmpBuf;

-+	char *tmpBuf = nullptr;

- 	int tmpBufLen = 0;

--	int *codeToGID;

--	const double *textMat;

-+	int *codeToGID = nullptr;

-+	const double *textMat = nullptr;

- 	double m11, m12, m21, m22, fontSize;

- 	SplashCoord mat[4];

- 	int n = 0;

-@@ -3046,9 +3057,6 @@ void SlaOutputDev::updateFont(GfxState *state)
- 	SplashCoord matrix[6];

- 

- 	m_font = nullptr;

--	fileName = nullptr;

--	tmpBuf = nullptr;

--	fontLoc = nullptr;

- 

- 	gfxFont = state->getFont();

- 	if (!gfxFont)

-@@ -3083,7 +3091,11 @@ void SlaOutputDev::updateFont(GfxState *state)
- 		}

- 		else

- 		{ // gfxFontLocExternal

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-+			fileName = fontLoc->pathAsGooString();

-+#else

- 			fileName = fontLoc->path;

-+#endif

- 			fontType = fontLoc->fontType;

- 		}

- 

-@@ -3136,9 +3148,14 @@ void SlaOutputDev::updateFont(GfxState *state)
- 				ff = FoFiTrueType::make(tmpBuf, tmpBufLen);

- 			if (ff)

- 			{

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-+				codeToGID = ((Gfx8BitFont*) gfxFont)->getCodeToGIDMap(ff.get());

-+				ff.reset();

-+#else

- 				codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff);

--				n = 256;

- 				delete ff;

-+#endif

-+				n = 256;

- 			}

- 			else

- 			{

-@@ -3209,8 +3226,13 @@ void SlaOutputDev::updateFont(GfxState *state)
- 					ff = FoFiTrueType::make(tmpBuf, tmpBufLen);

- 				if (! ff)

- 					goto err2;

-+#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)

-+				codeToGID = ((GfxCIDFont*) gfxFont)->getCodeToGIDMap(ff.get(), &n);

-+				ff.reset();

-+#else

- 				codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n);

- 				delete ff;

-+#endif

- 			}

- 			if (!(fontFile = m_fontEngine->loadTrueTypeFont(

- 							id,

-@@ -3247,14 +3269,19 @@ void SlaOutputDev::updateFont(GfxState *state)
- 	mat[3] = -m22;

- 	m_font = m_fontEngine->getFont(fontFile, mat, matrix);

- 

-+#if POPPLER_ENCODED_VERSION < POPPLER_VERSION_ENCODE(22, 2, 0)

- 	delete fontLoc;

-+#endif

- 	if (fontsrc && !fontsrc->isFile)

- 		fontsrc->unref();

- 	return;

- 

- err2:

- 	delete id;

-+#if POPPLER_ENCODED_VERSION < POPPLER_VERSION_ENCODE(22, 2, 0)

- 	delete fontLoc;

-+#endif

-+

- err1:

- 	if (fontsrc && !fontsrc->isFile)

- 		fontsrc->unref();

diff --git a/gnu/packages/patches/scribus-1.5.8-poppler-22.2.0-2.patch b/gnu/packages/patches/scribus-1.5.8-poppler-22.2.0-2.patch
deleted file mode 100644
index 73beac2d70..0000000000
--- a/gnu/packages/patches/scribus-1.5.8-poppler-22.2.0-2.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From f75c1613db67f4067643d0218a2db3235e42ec9f Mon Sep 17 00:00:00 2001
-From: Jean Ghali <jghali@libertysurf.fr>
-Date: Thu, 3 Feb 2022 19:46:13 +0000
-Subject: [PATCH] Small update vs latest code in poppler
-
-git-svn-id: svn://scribus.net/trunk/Scribus@24885 11d20701-8431-0410-a711-e3c959e3b870
----
- scribus/plugins/import/pdf/slaoutput.cpp | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/scribus/plugins/import/pdf/slaoutput.cpp b/scribus/plugins/import/pdf/slaoutput.cpp
-index 3650c96f52..a6f4e00fa9 100644
---- a/scribus/plugins/import/pdf/slaoutput.cpp
-+++ b/scribus/plugins/import/pdf/slaoutput.cpp
-@@ -3072,10 +3072,10 @@ void SlaOutputDev::updateFont(GfxState *state)
- 		delete id;

- 	else

- 	{

--		if (!(fontLoc = gfxFont->locateFont(xref, nullptr)))

-+		fontLoc = gfxFont->locateFont((xref) ? xref : pdfDoc->getXRef(), nullptr);

-+		if (!fontLoc)

- 		{

--			error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'",

--			gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

-+			error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->getCString() : "(unnamed)");

- 			goto err2;

- 		}

- 

diff --git a/gnu/packages/patches/sioyek-fix-build.patch b/gnu/packages/patches/sioyek-fix-build.patch
new file mode 100644
index 0000000000..521b361f2a
--- /dev/null
+++ b/gnu/packages/patches/sioyek-fix-build.patch
@@ -0,0 +1,82 @@
+Patch fetched from https://git.alpinelinux.org/aports/tree/community/sioyek/mupdf-0.23.0.patch
+
+From 86e913eccf19b97a16f25d9b6cdf0f50232f1226 Mon Sep 17 00:00:00 2001
+From: ptrcnull <git@ptrcnull.me>
+Date: Fri, 25 Aug 2023 22:44:26 +0200
+Subject: community/sioyek: fix build with mupdf-0.23.0
+
+---
+
+diff --git a/pdf_viewer/document_view.cpp b/pdf_viewer/document_view.cpp
+index f48d05e..0bc3855 100644
+--- a/pdf_viewer/document_view.cpp
++++ b/pdf_viewer/document_view.cpp
+@@ -1121,7 +1121,7 @@ std::vector<DocumentPos> DocumentView::find_line_definitions() {
+
+ 			std::optional<PdfLink> pdf_link = current_document->get_link_in_page_rect(get_center_page_number(), line_rects[line_index]);
+ 			if (pdf_link.has_value()) {
+-				auto parsed_uri = parse_uri(mupdf_context, pdf_link.value().uri);
++				auto parsed_uri = parse_uri(mupdf_context, current_document->doc, pdf_link.value().uri);
+ 				result.push_back({ parsed_uri.page - 1, parsed_uri.x, parsed_uri.y });
+ 				return result;
+ 			}
+diff --git a/pdf_viewer/main_widget.cpp b/pdf_viewer/main_widget.cpp
+index 19b568b..335a93f 100644
+--- a/pdf_viewer/main_widget.cpp
++++ b/pdf_viewer/main_widget.cpp
+@@ -170,7 +170,7 @@ void MainWidget::set_overview_position(int page, float offset) {
+
+ void MainWidget::set_overview_link(PdfLink link) {
+
+-    auto [page, offset_x, offset_y] = parse_uri(mupdf_context, link.uri);
++    auto [page, offset_x, offset_y] = parse_uri(mupdf_context, doc()->doc, link.uri);
+     if (page >= 1) {
+         set_overview_position(page - 1, offset_y);
+     }
+@@ -3178,7 +3178,7 @@ void MainWidget::handle_pending_text_command(std::wstring text) {
+ 					open_web_url(utf8_decode(selected_link->uri));
+                 }
+                 else{
+-					auto [page, offset_x, offset_y] = parse_uri(mupdf_context, selected_link->uri);
++					auto [page, offset_x, offset_y] = parse_uri(mupdf_context, doc()->doc, selected_link->uri);
+ 					long_jump_to_destination(page-1, offset_y);
+                 }
+             }
+@@ -3863,7 +3863,7 @@ void MainWidget::handle_link_click(const PdfLink& link) {
+ 		return;
+ 	}
+
+-	auto [page, offset_x, offset_y] = parse_uri(mupdf_context, link.uri);
++	auto [page, offset_x, offset_y] = parse_uri(mupdf_context, doc()->doc, link.uri);
+
+ 	// convert one indexed page to zero indexed page
+ 	page--;
+diff --git a/pdf_viewer/utils.cpp b/pdf_viewer/utils.cpp
+index 22d4265..3150e66 100644
+--- a/pdf_viewer/utils.cpp
++++ b/pdf_viewer/utils.cpp
+@@ -116,8 +116,9 @@ bool rects_intersect(fz_rect rect1, fz_rect rect2) {
+ 	return range_intersects(rect1.x0, rect1.x1, rect2.x0, rect2.x1) && range_intersects(rect1.y0, rect1.y1, rect2.y0, rect2.y1);
+ }
+
+-ParsedUri parse_uri(fz_context* mupdf_context, std::string uri) {
+-	fz_link_dest dest = pdf_parse_link_uri(mupdf_context, uri.c_str());
++ParsedUri parse_uri(fz_context* mupdf_context, fz_document* fz_doc, std::string uri) {
++	pdf_document* doc = pdf_document_from_fz_document(mupdf_context, fz_doc);
++	fz_link_dest dest = pdf_resolve_link_dest(mupdf_context, doc, uri.c_str());
+ 	return { dest.loc.page + 1, dest.x, dest.y };
+ }
+
+diff --git a/pdf_viewer/utils.h b/pdf_viewer/utils.h
+index 2a12211..643b030 100644
+--- a/pdf_viewer/utils.h
++++ b/pdf_viewer/utils.h
+@@ -55,7 +55,7 @@ void get_flat_toc(const std::vector<TocNode*>& roots, std::vector<std::wstring>&
+ int mod(int a, int b);
+ bool range_intersects(float range1_start, float range1_end, float range2_start, float range2_end);
+ bool rects_intersect(fz_rect rect1, fz_rect rect2);
+-ParsedUri parse_uri(fz_context* mupdf_context, std::string uri);
++ParsedUri parse_uri(fz_context* mupdf_context, fz_document* fz_doc, std::string uri);
+ char get_symbol(int key, bool is_shift_pressed, const std::vector<char>&special_symbols);
+
+ template<typename T>
diff --git a/gnu/packages/patchutils.scm b/gnu/packages/patchutils.scm
index 3d7ffdcd88..afe4af3eb3 100644
--- a/gnu/packages/patchutils.scm
+++ b/gnu/packages/patchutils.scm
@@ -301,7 +301,7 @@ GiB).")
 (define-public meld
   (package
     (name "meld")
-    (version "3.22.0")
+    (version "3.22.1")
     (source
      (origin
        (method url-fetch)
@@ -309,7 +309,7 @@ GiB).")
                            (version-major+minor version)
                            "/meld-" version ".tar.xz"))
        (sha256
-        (base32 "03f4j27amyi28flkks8i9bhqzd6xhm6d3c6jzxc57rzniv4hgh9z"))))
+        (base32 "0dk8j27jlqhxcjrkc8pa3rl7fz7pfwvrbyrhfsx1ld6lvcrbvlvd"))))
     (build-system meson-build-system)
     (native-inputs
      (list desktop-file-utils
diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm
index 0d796f65bb..f32403b954 100644
--- a/gnu/packages/pdf.scm
+++ b/gnu/packages/pdf.scm
@@ -25,6 +25,7 @@
 ;;; Copyright © 2022 Paul A. Patience <paul@apatience.com>
 ;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;; Copyright © 2023 Felix Gruber <felgru@posteo.net>
+;;; Copyright © 2024 dan <i@dan.games>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1710,3 +1711,62 @@ python library.
 
 Keywords: html2pdf, htmltopdf")
     (license license:bsd-3)))
+
+(define-public sioyek
+  (package
+    (name "sioyek")
+    (version "2.0.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/ahrm/sioyek")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1vmmp2s032ygh1byz77pg9aljmp8hx745fr7mmz11831f96mlmhq"))
+       (modules '((guix build utils)))
+       ;; libmupdf-third.so no longer available since mupdf 1.18.0.
+       (snippet '(substitute* "pdf_viewer_build_config.pro"
+                   (("-lmupdf-third") "")))
+       ;; XXX: Fix build with mupdf-0.23.0+.
+       ;; See also: https://github.com/ahrm/sioyek/issues/804
+       (patches (search-patches "sioyek-fix-build.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:configure-flags
+      #~(list (string-append "PREFIX=" #$output))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'patch-paths
+            (lambda _
+              (substitute* "pdf_viewer/main.cpp"
+                (("/usr/share")
+                 (string-append #$output "/share"))
+                (("/etc")
+                 (string-append #$output "/etc")))))
+          (replace 'configure
+            (lambda* (#:key configure-flags #:allow-other-keys)
+              (apply invoke "qmake" configure-flags)))
+          (add-after 'install 'instal-man-page
+            (lambda _
+              (install-file "resources/sioyek.1"
+                            (string-append #$output "/share/man/man1")))))))
+    (inputs
+     (list freetype
+           gumbo-parser
+           harfbuzz
+           jbig2dec
+           libjpeg-turbo
+           mujs
+           mupdf
+           openjpeg
+           qt3d-5
+           qtbase-5
+           zlib))
+    (home-page "https://sioyek.info/")
+    (synopsis "PDF viewer with a focus on technical books and research papers")
+    (description
+     "Sioyek is a PDF viewer with a focus on textbooks and research papers.")
+    (license license:gpl3+)))
diff --git a/gnu/packages/perl6.scm b/gnu/packages/perl6.scm
index dab9dd477b..10eb33be25 100644
--- a/gnu/packages/perl6.scm
+++ b/gnu/packages/perl6.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2019 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2019, 2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2022 Paul A. Patience <paul@apatience.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,48 +23,55 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix packages)
+  #:use-module (guix utils)
   #:use-module (guix build-system perl)
   #:use-module (guix build-system rakudo)
   #:use-module (gnu packages bdw-gc)
   #:use-module (gnu packages libevent)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages multiprecision)
+  #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages tls))
 
 (define-public moarvm
   (package
     (name "moarvm")
-    (version "2019.03")
+    (version "2022.04")
     (source
-      (origin
-        (method url-fetch)
-        (uri (string-append "https://moarvm.org/releases/MoarVM-"
-                            version ".tar.gz"))
-        (sha256
-         (base32
-          "017w1zvr6yl0cgjfc1b3ddlc6vjw9q8p7alw1vvsckw95190xc14"))
-        (modules '((guix build utils)))
-        (snippet
-         '(begin
-            ;(delete-file-recursively "3rdparty/dynasm") ; JIT
-            (delete-file-recursively "3rdparty/dyncall")
-            (delete-file-recursively "3rdparty/freebsd")
-            (delete-file-recursively "3rdparty/libatomicops")
-            (delete-file-recursively "3rdparty/libuv")
-            (delete-file-recursively "3rdparty/libtommath")
-            (delete-file-recursively "3rdparty/msinttypes")
-            #t))))
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://moarvm.org/releases/MoarVM-"
+                           version ".tar.gz"))
+       (sha256
+        (base32 "0128fxqaz7cwjf6amaz2cgd7xl52zvi5fr7bwnj229snll5za1mf"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           ;(delete-file-recursively "3rdparty/dynasm") ; JIT
+           (delete-file-recursively "3rdparty/dyncall")
+           (delete-file-recursively "3rdparty/freebsd")
+           (delete-file-recursively "3rdparty/libatomicops")
+           (delete-file-recursively "3rdparty/libuv")
+           (delete-file-recursively "3rdparty/libtommath")
+           (delete-file-recursively "3rdparty/msinttypes")))))
     (build-system perl-build-system)
     (arguments
-     '(#:phases
+     `(#:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'fix-build
+           (lambda _
+             (substitute* "build/Makefile.in"
+               (("^ +3rdparty/freebsd/.*") ""))))
          (replace 'configure
            (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out        (assoc-ref outputs "out"))
+             (let ((out (assoc-ref outputs "out"))
                    (pkg-config (assoc-ref inputs "pkg-config")))
                (setenv "CFLAGS" "-fcommon")
-               (setenv "LDFLAGS" (string-append "-Wl,-rpath=" out "/lib"))
+               (setenv "LDFLAGS"
+                       ,@(if (target-ppc32?)
+                           `((string-append "-Wl,-rpath=" out "/lib" " -latomic"))
+                           `((string-append "-Wl,-rpath=" out "/lib"))))
                (invoke "perl" "Configure.pl"
                        "--prefix" out
                        "--pkgconfig" (string-append pkg-config "/bin/pkg-config")
@@ -72,11 +80,11 @@
                        "--has-libffi"
                        "--has-libuv")))))))
     (home-page "https://moarvm.org/")
-    ;; These should be inputs but moar.h can't find them when building rakudo
-    (propagated-inputs
-     (list libatomic-ops libffi libtommath-1.0 libuv))
     (native-inputs
      (list pkg-config))
+    ;; These should be inputs but moar.h can't find them when building Rakudo.
+    (propagated-inputs
+     (list libatomic-ops libffi libtommath libuv))
     (synopsis "VM for NQP And Rakudo Perl 6")
     (description
      "Short for \"Metamodel On A Runtime\", MoarVM is a modern virtual machine
@@ -96,156 +104,254 @@ with native libraries.
 @end itemize")
     (license license:artistic2.0)))
 
+(define-public nqp-configure
+  (let ((commit "9b98931e0bfb8c4aac61590edf5074e63aa8ea4b"))
+    (package
+      (name "nqp-configure")
+      ;; NQP and Rakudo use the same version of nqp-configure.
+      ;; We may as well set nqp-configure's version to the same as theirs.
+      (version "2022.04")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/Raku/nqp-configure")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1vc1q11kjb964jal9dhgf5vwp371a3rfw7gj987n33kzli7a10n0"))))
+      (build-system perl-build-system)
+      (arguments
+       '(#:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'create-makefile-and-manifest
+             (lambda _
+               (call-with-output-file "Makefile.PL"
+                 (lambda (port)
+                   (format port "
+use ExtUtils::MakeMaker;
+WriteMakefile(NAME => 'NQP::Config');\n")))
+               (call-with-output-file "MANIFEST"
+                 (lambda (port)
+                   (format port "
+LICENSE
+MANIFEST
+Makefile.PL
+README.md
+bin/make.nqp
+doc/Macros.md
+doc/NQP-Config.md
+lib/NQP/Config.pm
+lib/NQP/Config/Test.pm
+lib/NQP/Macros.pm
+t/10-config.t
+t/20-macros.t
+t/30-if-macro.t\n")))))
+           (add-after 'patch-source-shebangs 'patch-more-shebangs
+             (lambda _
+               (substitute* '("bin/make.nqp"
+                              "lib/NQP/Config.pm")
+                 (("/bin/sh") (which "sh"))))))))
+      (home-page "https://github.com/Raku/nqp-configure")
+      (synopsis "Configuration and build modules for NQP")
+      (description "This library provides support modules for NQP and Rakudo
+@file{Configure.pl} scripts.")
+      (license license:artistic2.0))))
+
 (define-public nqp
   (package
     (name "nqp")
-    (version "2019.03")
+    (version "2022.04")
     (source
-      (origin
-        (method url-fetch)
-        (uri (string-append "https://rakudo.perl6.org/downloads/nqp/nqp-"
-                            version ".tar.gz"))
-        (sha256
-         (base32
-          "183zhll13fx416s3hkg4bkvib77kyr857h0nydgrl643fpacxp83"))
-        (modules '((guix build utils)))
-        (snippet
-         '(begin
-            (delete-file-recursively "3rdparty") #t))))
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/Raku/nqp/releases/download/"
+                           version "/nqp-" version ".tar.gz"))
+       (sha256
+        (base32 "1777shxr8qw6m2492ckb0r301qdx5gls6kphz554dh6k4n74avam"))
+       (modules '((guix build utils)))
+       (snippet
+        '(delete-file-recursively "3rdparty"))))
     (build-system perl-build-system)
     (arguments
      '(#:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'remove-calls-to-git
+           (lambda _
+             (invoke "perl" "-ni" "-e"
+                     "print if not /^BEGIN {/ .. /^}/"
+                     "Configure.pl")))
+         (add-after 'remove-calls-to-git 'fix-paths
+           (lambda _
+             (substitute* "tools/build/gen-version.pl"
+               (("catfile\\(\\$libdir, 'MAST', \\$_\\)")
+                (string-append "catfile('"
+                               (assoc-ref %build-inputs "moarvm")
+                               "/share/nqp/lib"
+                               "', 'MAST', $_)")))))
          (add-after 'patch-source-shebangs 'patch-more-shebangs
            (lambda _
-             (substitute* '("tools/build/install-jvm-runner.pl.in"
+             (substitute* '("t/nqp/111-spawnprocasync.t"
+                            "t/nqp/113-run-command.t"
                             "tools/build/gen-js-cross-runner.pl"
                             "tools/build/gen-js-runner.pl"
                             "tools/build/install-js-runner.pl"
-                            "tools/build/install-moar-runner.pl"
-                            "tools/build/gen-moar-runner.pl"
-                            "t/nqp/111-spawnprocasync.t"
-                            "t/nqp/113-run-command.t")
-               (("/bin/sh") (which "sh")))
-             #t))
-         (add-after 'unpack 'patch-source-date
-           (lambda _
-             (substitute* "tools/build/gen-version.pl"
-               (("gmtime") "gmtime(0)"))
-             #t))
-         (add-after 'unpack 'remove-failing-test
-           ;; One subtest fails for unknown reasons
-           (lambda _
-             (delete-file "t/nqp/019-file-ops.t")
-             #t))
+                            "tools/build/install-jvm-runner.pl.in")
+               (("/bin/sh") (which "sh")))))
          (replace 'configure
            (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out  (assoc-ref outputs "out"))
+             (let ((out (assoc-ref outputs "out"))
                    (moar (assoc-ref inputs "moarvm")))
                (invoke "perl" "Configure.pl"
                        "--backends=moar"
                        "--with-moar" (string-append moar "/bin/moar")
                        "--prefix" out)))))))
+    (native-inputs
+     (list nqp-configure))
     (inputs
      (list moarvm))
-    (home-page "https://github.com/perl6/nqp")
+    (home-page "https://github.com/Raku/nqp")
     (synopsis "Not Quite Perl")
-    (description "This is \"Not Quite Perl\" -- a lightweight Perl 6-like
-environment for virtual machines.  The key feature of NQP is that it's designed
-to be a very small environment (as compared with, say, perl6 or Rakudo) and is
-focused on being a high-level way to create compilers and libraries for virtual
-machines like MoarVM, the JVM, and others.
-
-Unlike a full-fledged implementation of Perl 6, NQP strives to have as small a
-runtime footprint as it can, while still providing a Perl 6 object model and
+    (description "This is \"Not Quite Perl\" -- a lightweight Raku-like
+environment for virtual machines.  The key feature of NQP is that it's
+designed to be a very small environment (as compared with, say, Rakudo) and is
+focused on being a high-level way to create compilers and libraries for
+virtual machines like MoarVM, the JVM, and others.
+
+Unlike a full-fledged implementation of Raku, NQP strives to have as small a
+runtime footprint as it can, while still providing a Raku object model and
 regular expression engine for the virtual machine.")
     (license license:artistic2.0)))
 
 (define-public rakudo
   (package
     (name "rakudo")
-    (version "2019.03.1")
+    (version "2022.04")
     (source
-      (origin
-        (method url-fetch)
-        (uri (string-append "https://rakudo.perl6.org/downloads/rakudo/rakudo-"
-                            version ".tar.gz"))
-        (sha256
-         (base32
-          "1nllf69v8xr6v3kkj7pmryg11n5m3ajfkr7j72pvhrgnjy8lv3r1"))))
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/rakudo/rakudo/releases/download/"
+                           version "/rakudo-" version ".tar.gz"))
+       (sha256
+        (base32 "0x0w5b8g5kna1mlvsli9dqmnwvqalrar3cgpixmyiyvyjb6ah4vy"))
+       (modules '((guix build utils)))
+       (snippet
+        '(delete-file-recursively "3rdparty"))))
     (build-system perl-build-system)
     (arguments
-     '(#:phases
+     `(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source-date
+         (add-after 'unpack 'remove-calls-to-git
            (lambda _
-             (substitute* "tools/build/gen-version.pl"
-               (("gmtime") "gmtime(0)"))
-             #t))
+             (invoke "perl" "-ni" "-e" "print if not /^BEGIN {/ .. /^}/"
+                     "Configure.pl")))
+         (add-after 'remove-calls-to-git 'fix-paths
+           (lambda _
+             (substitute* "tools/templates/Makefile-common-macros.in"
+               (("NQP_CONFIG_DIR = .*")
+                (string-append "NQP_CONFIG_DIR = "
+                               (assoc-ref %build-inputs "nqp-configure")
+                               "/lib/perl5/site_perl/"
+                               ,(package-version perl)
+                               "\n")))))
+         ;; These tests pass when run manually.
+         (add-after 'fix-paths 'disable-failing-tests
+           (lambda _
+             (substitute* "t/02-rakudo/repl.t"
+               (("^plan 47;\n") "plan 46;\n"))
+             (invoke "perl" "-ni" "-e"
+                     "printf if not /^    \\(temp %\\*ENV\\)/ .. /^    }/"
+                     "t/02-rakudo/repl.t")
+             (substitute* "t/09-moar/01-profilers.t"
+               (("^plan 12;\n") "plan 10;\n")
+               (("^ok \\$htmlpath\\.IO\\.f, .*") "")
+               (("^ok \\(try \\$htmlpath\\.IO\\.s .*") ""))))
          (add-after 'patch-source-shebangs 'patch-more-shebangs
            (lambda _
-             (substitute* '("tools/build/create-js-runner.pl"
-                            "tools/build/create-moar-runner.p6"
-                            "tools/build/create-jvm-runner.pl"
-                            "src/core/Proc.pm6")
-               (("/bin/sh") (which "sh")))
-             #t))
+             (substitute* '("src/core.c/Proc.pm6"
+                            "t/spec/S29-os/system.t"
+                            "tools/build/create-js-runner.pl"
+                            "tools/build/create-jvm-runner.pl")
+               (("/bin/sh") (which "sh")))))
          (replace 'configure
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out"))
                    (nqp (assoc-ref inputs "nqp")))
-               (invoke "perl" "./Configure.pl"
+               (invoke "perl" "Configure.pl"
                        "--backend=moar"
                        "--with-nqp" (string-append nqp "/bin/nqp")
                        "--prefix" out))))
-         ;; This is the recommended tool for distro maintainers to install perl6
+         ;; This is the recommended tool for distro maintainers to install Raku
          ;; modules systemwide.  See: https://github.com/ugexe/zef/issues/117
          (add-after 'install 'install-dist-tool
            (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out  (assoc-ref outputs "out"))
+             (let* ((out (assoc-ref outputs "out"))
                     (dest (string-append out "/share/perl6/tools")))
-               (install-file "tools/install-dist.p6" dest)
-               (substitute* (string-append dest "/install-dist.p6")
-                 (("/usr/bin/env perl6")
-                  (string-append out "/bin/perl6"))))
-             #t)))))
+               (install-file "tools/install-dist.raku" dest)
+               (substitute* (string-append dest "/install-dist.raku")
+                 (("/usr/bin/env raku")
+                  (string-append out "/bin/raku")))))))))
+    (native-inputs
+     (list nqp-configure))
     (inputs
      (list moarvm nqp openssl))
     (home-page "https://rakudo.org/")
     (native-search-paths
-      (list (search-path-specification
-              (variable "PERL6LIB")
-              (separator ",")
-              (files '("share/perl6/lib"
-                       "share/perl6/site/lib"
-                       "share/perl6/vendor/lib")))))
-    (synopsis "Perl 6 Compiler")
-    (description "Rakudo Perl is a compiler that implements the Perl 6
-specification and runs on top of several virtual machines.")
+     (list (search-path-specification
+            (variable "PERL6LIB")
+            (separator ",")
+            (files '("share/perl6/lib"
+                     "share/perl6/site/lib"
+                     "share/perl6/vendor/lib")))))
+    (synopsis "Raku Compiler")
+    (description "Rakudo is a compiler that implements the Raku specification
+and runs on top of several virtual machines.")
     (license license:artistic2.0)))
 
+(define-public perl6-format-lisp
+  (let ((commit "1ae31e2a9366b287a83a9d451295fc9e3fb6d36f")
+        (revision "0"))
+    (package
+      (name "perl6-format-lisp")
+      (version (git-version "0.0.2" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/raku-community-modules/Format-Lisp")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1rhkd11xdyw99vl6ickjin0x7nhlgkq3qhpf8zp9jky0k711gxmr"))))
+      (build-system rakudo-build-system)
+      (arguments '(#:with-zef? #f))
+      (home-page "https://github.com/raku-community-modules/Format-Lisp")
+      (synopsis "Common Lisp's format call in Raku")
+      (description "This Raku module implements Common Lisp's @code{format}
+language.")
+      (license license:artistic2.0))))
+
 (define-public perl6-grammar-debugger
-  ;; Last commit was September 2017
+  ;; Last commit was September 2017.
   (let ((commit "0375008027c8caa216bd869476ce59ae09b2a702")
         (revision "1"))
     (package
       (name "perl6-grammar-debugger")
       (version (git-version "1.0.1" revision commit))
       (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/jnthn/grammar-debugger")
-                 (commit commit)))
-          (file-name (git-file-name name version))
-          (sha256
-           (base32
-            "0y826z3m276n7ia810hgcb3div67nxmx125m2fzlc16994zd5vm5"))))
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/jnthn/grammar-debugger")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "0y826z3m276n7ia810hgcb3div67nxmx125m2fzlc16994zd5vm5"))))
       (build-system rakudo-build-system)
       (propagated-inputs
        (list perl6-terminal-ansicolor))
       (home-page "https://github.com/jnthn/grammar-debugger")
-      (synopsis "Simple tracing and debugging support for Perl 6 grammars")
+      (synopsis "Simple tracing and debugging support for Raku grammars")
       (description "This module provides a simple debugger for grammars.  Just
 @code{use} it: use @code{Grammar::Debugger;} and any grammar in the lexical
 scope of the use statement will automatically have debugging enabled. The
@@ -254,82 +360,80 @@ prompt.")
       (license license:artistic2.0))))
 
 (define-public perl6-grammar-profiler-simple
-  ;; Last commit was June 2017
+  ;; Last commit was June 2017.
   (let ((commit "c0aca5fab323b2974821dabd6b89330c609e0b7d")
         (revision "1"))
     (package
       (name "perl6-grammar-profiler-simple")
       (version (git-version "0.02" revision commit))
       (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/perlpilot/Grammar-Profiler-Simple")
-                 (commit commit)))
-          (file-name (git-file-name name version))
-          (sha256
-           (base32
-            "1qcsa4lmcilp3vp0jng0hrgzyzxin9ayg2wjvkcd0k6h7djx9dff"))))
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/perlpilot/Grammar-Profiler-Simple")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1qcsa4lmcilp3vp0jng0hrgzyzxin9ayg2wjvkcd0k6h7djx9dff"))))
       (build-system rakudo-build-system)
       (arguments '(#:with-zef? #f))
       (home-page "https://github.com/perlpilot/Grammar-Profiler-Simple")
-      (synopsis "Simple rule profiling for Perl 6 grammars")
-      (description "This module provides a simple profiler for Perl 6 grammars.
+      (synopsis "Simple rule profiling for Raku grammars")
+      (description "This module provides a simple profiler for Raku grammars.
 To enable profiling simply add use @code{Grammar::Profiler::Simple;} to your
 code.  Any grammar in the lexical scope of the use statement will automatically
 have profiling information collected when the grammar is used.")
       (license license:artistic2.0))))
 
 (define-public perl6-json
-  (package
-    (name "perl6-json")
-    (version "1.0")
-    (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
+  ;; The commit where 1.0 was “tagged”.
+  (let ((commit "a5ef8c179350dae44ce7fb1abb684fc62c1c2b99"))
+    (package
+      (name "perl6-json")
+      (version "1.0")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
                (url "https://github.com/moritz/json")
-               ;; The commit where 1.0 was "tagged"
-               (commit "a5ef8c179350dae44ce7fb1abb684fc62c1c2b99")))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "1kzryxkqyr129rcckd4jh0dfxdgzv71qx8dpkpm1divbfjyknlay"))))
-    (build-system rakudo-build-system)
-    (arguments '(#:with-zef? #f))
-    (home-page "https://github.com/moritz/json")
-    (synopsis "Minimal JSON (de)serializer")
-    (description "This module is a simple Perl 6 module for serializing and
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1kzryxkqyr129rcckd4jh0dfxdgzv71qx8dpkpm1divbfjyknlay"))))
+      (build-system rakudo-build-system)
+      (arguments '(#:with-zef? #f))
+      (home-page "https://github.com/moritz/json")
+      (synopsis "Minimal JSON (de)serializer")
+      (description "This module is a simple Raku module for serializing and
 deserializing JSON.")
-    (license license:artistic2.0)))
+      (license license:artistic2.0))))
 
 (define-public perl6-json-class
   (package
     (name "perl6-json-class")
-    (version "0.0.12")
+    (version "0.0.18")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/jonathanstowe/JSON-Class")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "1zyzajc57j3m8q0nr72h9pw4w2nx92rafywlvysgphc5q9sb8np2"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jonathanstowe/JSON-Class")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0686qpcb6p5isjcsksrgsr1rh926cnhs6r091p5p3lh2fd575g1d"))))
     (build-system rakudo-build-system)
-    (propagated-inputs
-     (list perl6-json-marshal perl6-json-unmarshal))
     (native-inputs
      (list perl6-json-fast))
+    (propagated-inputs
+     (list perl6-json-marshal perl6-json-unmarshal))
     (home-page "https://github.com/jonathanstowe/JSON-Class")
-    (synopsis "Provide simple serialisation/deserialisation of objects to/from JSON")
+    (synopsis "Provide simple serialization/deserialization of objects to/from JSON")
     (description "This is a simple role that provides methods to instantiate a
-class from a JSON string that (hopefully,) represents it, and to serialise an
+class from a JSON string that (hopefully) represents it, and to serialize an
 object of the class to a JSON string.  The JSON created from an instance
 should round trip to a new instance with the same values for the public
 attributes.  Private attributes (that is ones without accessors,) will be
-ignored for both serialisation and de-serialisation.  The exact behaviour
+ignored for both serialization and deserialization.  The exact behaviour
 depends on that of @code{JSON::Marshal} and @code{JSON::Unmarshal}
 respectively.")
     (license license:artistic2.0)))
@@ -337,47 +441,46 @@ respectively.")
 (define-public perl6-json-fast
   (package
     (name "perl6-json-fast")
-    (version "0.10")
+    (version "0.17")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/timo/json_fast")
-               (commit version)))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32 "1g8hr1mdrxwdpzc7hvs9l5r12phvba6y6a5chgkj90ing77ji4b2"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/timo/json_fast")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1gckca9m6jkz6s59rpwf59721q6icfm45jj49sw3vdjr6jh2dgdb"))))
     (build-system rakudo-build-system)
     (arguments '(#:with-zef? #f))
     (home-page "https://github.com/timo/json_fast")
-    (synopsis "Perl6 json parser")
-    (description "A naive imperative json parser in pure perl6 (but with direct
+    (synopsis "Raku JSON parser")
+    (description "A naive imperative JSON parser in pure Raku (but with direct
 access to @code{nqp::} ops), to evaluate performance against @code{JSON::Tiny}.
-It is a drop-in replacement for @code{JSON::Tiny}'s from-json and to-json subs,
-but it offers a few extra features.")
+It is a drop-in replacement for @code{JSON::Tiny}'s @code{from-json} and
+@code{to-json} subs, but it offers a few extra features.")
     (license license:artistic2.0)))
 
 (define-public perl6-json-marshal
   (package
     (name "perl6-json-marshal")
-    (version "0.0.16")
+    (version "0.0.23")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/jonathanstowe/JSON-Marshal")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "0qy7j83h6gjzyyv74ncd92cd9h45rv8diaz3vldiv3b6fqwz4c6i"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jonathanstowe/JSON-Marshal")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "057xmdadhy5wkbhr6w1iybv2j7qf4bf8d4cp8m4qdcgk6pqzpkgc"))))
     (build-system rakudo-build-system)
-    (propagated-inputs
-     (list perl6-json-fast perl6-json-name))
     (native-inputs
      (list perl6-json-fast))
+    (propagated-inputs
+     (list perl6-json-fast perl6-json-name))
     (home-page "https://github.com/jonathanstowe/JSON-Marshal")
-    (synopsis "Simple serialisation of objects to JSON")
+    (synopsis "Simple serialization of objects to JSON")
     (description "This library provides a single exported subroutine to create
 a JSON representation of an object.  It should round trip back into an object
 of the same class using @code{JSON::Unmarshal}.")
@@ -386,46 +489,69 @@ of the same class using @code{JSON::Unmarshal}.")
 (define-public perl6-json-name
   (package
     (name "perl6-json-name")
-    (version "0.0.3")
+    (version "0.0.6")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/jonathanstowe/JSON-Name")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "130qwdpbj5qdlsdz05y0rksd79lzbq79scy47n6lnf21b0hz1qjc"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jonathanstowe/JSON-Name")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0fbwp3av4kh7zlbrmgbka4x6s3d6fsw2qxafi9hyq0y896wsaf94"))))
     (build-system rakudo-build-system)
     (arguments '(#:with-zef? #f))
+    (propagated-inputs
+     (list perl6-json-optin))
     (home-page "https://github.com/jonathanstowe/JSON-Name")
-    (synopsis "Provides a trait to store an alternative JSON Name")
+    (synopsis "Provide a trait to store an alternative JSON name")
     (description "This is released as a dependency of @code{JSON::Marshal} and
 @code{JSON::Unmarshal} in order to save duplication, it is intended to store a
 separate JSON name for an attribute where the name of the JSON attribute might be
 changed, either for aesthetic reasons or the name is not a valid Perl identifier.
 It will of course also be needed in classes thar are going to use
-@code{JSON::Marshal} or @code{JSON::Unmarshal} for serialisation/de-serialisation.")
+@code{JSON::Marshal} or @code{JSON::Unmarshal} for serialization/deserialization.")
+    (license license:artistic2.0)))
+
+(define-public perl6-json-optin
+  (package
+    (name "perl6-json-optin")
+    (version "0.0.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jonathanstowe/JSON-OptIn")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0iz1wd3rfcb3kdc8cylwfxr8p02bpivk7kcf3dmm2l4mmdhyk7np"))))
+    (build-system rakudo-build-system)
+    (arguments '(#:with-zef? #f))
+    (home-page "https://github.com/jonathanstowe/JSON-OptIn")
+    (synopsis "Provide a trait and role to identify opt-in JSON serialization")
+    (description "This provides a trait and a role for the identification of
+`opt in' serializable attributes in, e.g., @code{JSON::Marshal}.  It's
+probably not necessary to use this directly as it will be required by, e.g.,
+@code{JSON::Name}, but it's just more convenient to package it separately.")
     (license license:artistic2.0)))
 
 (define-public perl6-json-unmarshal
-  ;; Last commit was May 2017
+  ;; Last commit was May 2017.
   (let ((commit "e1b6288c5f3165058f36c0f4e171cdf2dfd640da")
         (revision "1"))
     (package
       (name "perl6-json-unmarshal")
       (version (git-version "0.0.0" revision commit))
       (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/tadzik/JSON-Unmarshal")
-                 (commit commit)))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "14azsmzmwdn8k0gqcpvballharcvzylmlyrx2wmv4kpqfnz29fjc"))))
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/tadzik/JSON-Unmarshal")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "14azsmzmwdn8k0gqcpvballharcvzylmlyrx2wmv4kpqfnz29fjc"))))
       (build-system rakudo-build-system)
       (propagated-inputs
        (list perl6-json-fast perl6-json-name))
@@ -438,17 +564,16 @@ create an object from a JSON representation of an object.")
 (define-public perl6-license-spdx
   (package
     (name "perl6-license-spdx")
-    (version "3.4.0")
+    (version "3.16.0")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/jonathanstowe/License-SPDX")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "0dl263c3fbxk001gm5fisrzqz1dx182ipaa0x2qva2gxvl075xm8"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jonathanstowe/License-SPDX")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0sv9rrrfn437crynmbs3aks5xcqchjkbr1k31fq0dphfaw88k5v3"))))
     (build-system rakudo-build-system)
     (propagated-inputs
      (list perl6-json-class))
@@ -463,78 +588,74 @@ licences therein.")
 (define-public perl6-meta6
   (package
     (name "perl6-meta6")
-    (version "0.0.23")
+    (version "0.0.26")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/jonathanstowe/META6")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "1xnlaamfbdlfb2zidim3bbc4mawsrg6qxhxi6gbld46z1cyry1cw"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jonathanstowe/META6")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1jg8z0y29df9sy6za285jy38c3v6dl54ar54dp6marzcih02payx"))))
     (build-system rakudo-build-system)
-    (propagated-inputs
-     (list perl6-json-class))
     (native-inputs
      (list perl6-json-fast))
+    (propagated-inputs
+     (list perl6-json-class))
     (home-page "https://github.com/jonathanstowe/META6")
-    (synopsis "Do things with Perl 6 [META files]")
-    (description "This provides a representation of the Perl 6 META files
-specification - the META file data can be read, created, parsed and written in a
-manner that is conformant with the specification.
-
-Where they are known about it also makes allowance for customary usage in
-existing software (such as installers and so forth.)
-
-The intent of this is allow the generation and testing of META files for
-module authors, so it can provide meta-information whether the attributes are
-mandatory as per the spec and where known the places that customary attributes
-are used.")
+    (synopsis "Do things with Raku META files")
+    (description "This provides a representation of the Raku META files
+specification -- the META file data can be read, created, parsed and written
+in a manner that is conformant with the specification.
+
+Where they are known about, it also makes allowance for customary usage in
+existing software (such as installers and so forth).
+
+The intent of this is to allow the generation and testing of META files for
+module authors, so it can provide meta-information about whether the
+attributes are mandatory as per the spec and, where known, the places that
+customary attributes are used.")
     (license license:artistic2.0)))
 
 (define-public perl6-mime-base64
   (package
     (name "perl6-mime-base64")
-    (version "1.2.1")
+    (version "1.2.3")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/perl6/Perl6-MIME-Base64")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "0l67m8mvz3gxml425sd1ggfnhzh4lf754k7w8fngfr453s6lsza1"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/raku-community-modules/MIME-Base64")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "19bndwbjr05gg8rrq2msmw1ik8xw2r3gbd77vxrp8l6c674zgy95"))))
     (build-system rakudo-build-system)
     (arguments '(#:with-zef? #f))
-    (home-page "https://github.com/perl6/Perl6-MIME-Base64")
+    (home-page "https://github.com/raku-community-modules/MIME-Base64")
     (synopsis "Encoding and decoding Base64 ASCII strings")
-    (description "This Perl 6 module implements encoding and decoding to and
+    (description "This Raku module implements encoding and decoding to and
 from base64.")
     (license license:artistic2.0)))
 
 (define-public perl6-oo-monitors
   (package
     (name "perl6-oo-monitors")
-    (version "1.1")
+    (version "1.1.1")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/jnthn/oo-monitors")
-               ;; The commit where 1.1 was "tagged"
-               (commit "494db3a3852854f30a80c9bd1489a7d5e429e7c5")))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "1sbw2x54wwjjanghjnc7ipmplaw1srvbrphsdv4ym6cipnbmbj9x"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jnthn/oo-monitors")
+             (commit (string-append "release-" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1aqb0x2vnmpi3knkf5v5aix6h29ln80gpxwa181i8kwfpxs8ir9f"))))
     (build-system rakudo-build-system)
     (arguments '(#:with-zef? #f))
     (home-page "https://github.com/jnthn/oo-monitors")
-    (synopsis "Monitors with condition variables for Perl 6")
+    (synopsis "Monitors with condition variables for Raku")
     (description "A monitor provides per-instance mutual exclusion for objects.
 This means that for a given object instance, only one thread can ever be inside
 its methods at a time.  This is achieved by a lock being associated with each
@@ -543,56 +664,54 @@ monitor.  Condition variables are also supported.")
     (license license:artistic2.0)))
 
 (define-public perl6-svg
-  ;; Latest commit, basically unchanged since August 2015
+  ;; Latest commit, basically unchanged since August 2015.
   (let ((commit "07190c0602aa276e5319f06aa0012452dbff3582")
         (revision "1"))
     (package
       (name "perl6-svg")
       (version (git-version "0.0.0" revision commit))
       (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/moritz/svg")
-                 (commit commit)))
-          (file-name (git-file-name name version))
-          (sha256
-           (base32
-            "0mkjdhg7ajksdn61n8fqhyzfd7ly9myazsvpsm02a5c2q73hdygg"))))
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/moritz/svg")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "0mkjdhg7ajksdn61n8fqhyzfd7ly9myazsvpsm02a5c2q73hdygg"))))
       (build-system rakudo-build-system)
       (propagated-inputs
        (list perl6-xml-writer))
       (home-page "https://github.com/moritz/svg")
-      (synopsis "Perl 6 module to generate SVG")
-      (description "This is a Perl 6 module that makes it easy to write
+      (synopsis "Raku module to generate SVG")
+      (description "This is a Raku module that makes it easy to write
 @dfn{Scalable Vector Graphic files} (SVG).  Right now it is a shallow wrapper
-around @code{XML::Writer}, adding only the xmlns attributes that identifies an
-XML file as SVG.")
+around @code{XML::Writer}, adding only the @samp{xmlns} attributes that
+identify an XML file as SVG.")
       (license license:artistic2.0))))
 
 (define-public perl6-svg-plot
-  ;; Latest commit
+  ;; Latest commit.
   (let ((commit "062570a78fd38c3c6baba29dfe2fbb8ca014f4de")
         (revision "1"))
     (package
       (name "perl6-svg-plot")
       (version (git-version "0.0.0" revision commit))
       (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/moritz/svg-plot")
-                 (commit commit)))
-          (file-name (git-file-name name version))
-          (sha256
-           (base32
-            "095ga5hbg92jnmczxvhk1hjz14yr334zyf8cph4w5w5frcza44my"))))
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/moritz/svg-plot")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "095ga5hbg92jnmczxvhk1hjz14yr334zyf8cph4w5w5frcza44my"))))
       (build-system rakudo-build-system)
       (propagated-inputs
        (list perl6-svg))
       (home-page "https://github.com/moritz/svg-plot")
-      (synopsis "Perl 6 charting and plotting library that produces SVG output")
-      (description "@code{SVG::Plot} is a simple 2D chart plotter for Perl 6.
+      (synopsis "Raku charting and plotting library that produces SVG output")
+      (description "@code{SVG::Plot} is a simple 2D chart plotter for Raku.
 It currently supports bars, stacked bars, lines and points (both equally spaced
 with optional labels, or xy plots).")
       (license license:artistic2.0))))
@@ -600,17 +719,16 @@ with optional labels, or xy plots).")
 (define-public perl6-tap-harness
   (package
     (name "perl6-tap-harness")
-    (version "0.0.7")
+    (version "0.3.5")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/perl6/tap-harness6")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "1lig8i0my3fgqvlay9532xslbf3iis2d7wz89gniwvwqffi2kh6r"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/Raku/tap-harness6")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "162crdy8g6xhnry26pjma2panm0c79n26igmljg79al4bqj9lyc9"))))
     (build-system rakudo-build-system)
     (arguments
      '(#:with-zef? #f
@@ -619,109 +737,109 @@ with optional labels, or xy plots).")
        (modify-phases %standard-phases
          (replace 'check
            (lambda _
-             (invoke "perl6" "-Ilib" "bin/prove6" "-l" "t"))))))
-    (home-page "https://github.com/perl6/tap-harness6/")
-    (synopsis "TAP harness for perl6")
+             (apply invoke "raku" "-MTAP" "-Ilib" (find-files "t" "\\.t$")))))))
+    (home-page "https://github.com/Raku/tap-harness6")
+    (synopsis "TAP harness for Raku")
     (description "This module provides the @command{prove6} command which runs a
 TAP based test suite and prints a report.  The @command{prove6} command is a
 minimal wrapper around an instance of this module.")
     (license license:artistic2.0)))
 
 (define-public perl6-terminal-ansicolor
-  (package
-    (name "perl6-terminal-ansicolor")
-    (version "0.5")
-    (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
+  ;; The commit where 0.5 was “tagged”.
+  (let ((commit "edded4a7116ce11cbc9fb5a83669c7ba119d0212"))
+    (package
+      (name "perl6-terminal-ansicolor")
+      (version "0.5")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
                (url "https://github.com/tadzik/Terminal-ANSIColor")
-               ;; The commit where 0.5 was "tagged"
-               (commit "edded4a7116ce11cbc9fb5a83669c7ba119d0212")))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "1apm999azkyg5s35gid12wq019aqnvzrkz7qjmipd74mdxgr00x7"))))
-    (build-system rakudo-build-system)
-    (arguments '(#:with-zef? #f))
-    (home-page "https://github.com/tadzik/Terminal-ANSIColor")
-    (synopsis "Colorize terminal output")
-    (description "This is a @code{Terminal::ANSIColor} module for Perl 6.")
-    (license license:expat)))
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1apm999azkyg5s35gid12wq019aqnvzrkz7qjmipd74mdxgr00x7"))))
+      (build-system rakudo-build-system)
+      (arguments '(#:with-zef? #f))
+      (home-page "https://github.com/tadzik/Terminal-ANSIColor")
+      (synopsis "Colorize terminal output")
+      (description "This is a @code{Terminal::ANSIColor} module for Raku.")
+      (license license:expat))))
 
 (define-public perl6-test-meta
   (package
     (name "perl6-test-meta")
-    (version "0.0.14")
+    (version "0.0.17")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/jonathanstowe/Test-META")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "1mzrglb7lbiy5h9dlc7dyhvv9gppxmdmpmrv6nzbd695jzr38bri"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jonathanstowe/Test-META")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0kd4yixx6lac240lcx0f5pfswspvpp43034mq2vs65zxghsvvcmf"))))
     (build-system rakudo-build-system)
     (propagated-inputs
-     (list perl6-meta6 perl6-uri))
+     (list perl6-license-spdx perl6-meta6 perl6-uri))
     (home-page "https://github.com/jonathanstowe/Test-META")
-    (synopsis "Test a distributions META file")
+    (synopsis "Test a distribution's META file")
     (description "This provides a simple mechanism for module authors to have
 some confidence that they have a working distribution META description file.")
     (license license:artistic2.0)))
 
 (define-public perl6-test-mock
-  (package
-    (name "perl6-test-mock")
-    (version "1.5")
-    (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
+  (let ((commit "1130427f4d9f3866fa39e113251bb142d7fa5cc8")
+        (revision "0"))
+    (package
+      (name "perl6-test-mock")
+      (version (git-version "1.5" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
                (url "https://github.com/jnthn/test-mock")
-               ;; The commit where 1.5 was "tagged"
-               (commit "6eddb42f73f40b9ac29c14badb41ce4a04d876f2")))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "07yr3qimc8fl29p23562ayj2j9h53madcnf9sgqvgf2kcprh0zd2"))))
-    (build-system rakudo-build-system)
-    (propagated-inputs
-     (list perl6-oo-monitors))
-    (home-page "https://github.com/jnthn/test-mock")
-    (synopsis "Module for simply generating and checking mock objects")
-    (description "@code{Test::Mock} is a module that works alongside the
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "03qq6z9ilw0ak3dx9i24ygr4c21wf4xvli8px02hmshpkhavclj5"))))
+      (build-system rakudo-build-system)
+      (propagated-inputs
+       (list perl6-oo-monitors))
+      (home-page "https://github.com/jnthn/test-mock")
+      (synopsis "Module for simply generating and checking mock objects")
+      (description "@code{Test::Mock} is a module that works alongside the
 standard Test module to help you write tests when you want to verify what
 methods are called on an object, while still having calls to undefined methods
-die.  You get started just as normal with the test file, but also add a use
-statement for @code{Test::Mock}.")
-    (license license:artistic2.0)))
+die.  You get started just as normal with the test file, but also add a
+@code{use} statement for @code{Test::Mock}.")
+      (license license:artistic2.0))))
 
 (define-public perl6-uri
-  (package
-    (name "perl6-uri")
-    (version "0.1.5")
-    (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/perl6-community-modules/uri")
-               (commit version)))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "0h318g75jqn2ckw051g35iqyfxz1mps0jyg5z6pd857y3kacbkpl"))))
-    (build-system rakudo-build-system)
-    (arguments '(#:with-zef? #f))
-    (home-page "https://github.com/perl6-community-modules/uri")
-    (synopsis "URI implementation using Perl 6")
-    (description "A URI implementation using Perl 6 grammars to implement RFC
+  ;; The commit where 0.3.5 was “tagged”.
+  (let ((commit "2e62d0f117c95a43e61ddb018dcacba8036aa3d5"))
+    (package
+      (name "perl6-uri")
+      (version "0.3.5")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/raku-community-modules/URI")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1a03r80zxpvnsjf2z5r8lk434v2ysrpaymqa6xq975l4124gckkx"))))
+      (build-system rakudo-build-system)
+      (arguments '(#:with-zef? #f))
+      (home-page "https://github.com/raku-community-modules/URI")
+      (synopsis "URI implementation using Raku")
+      (description "A URI implementation using Raku grammars to implement RFC
 3986 BNF.  Currently only implements parsing.  Includes @code{URI::Escape} to
 (un?)escape characters that aren't otherwise allowed in a URI with % and a hex
 character numbering.")
-    (license license:artistic2.0)))
+      (license license:artistic2.0))))
 
 (define-public perl6-xml-writer
   ;; Last commit was May 2017
@@ -731,36 +849,34 @@ character numbering.")
       (name "perl6-xml-writer")
       (version (git-version "0.0.0" revision commit))
       (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/masak/xml-writer")
-                 (commit commit)))
-          (file-name (git-file-name name version))
-          (sha256
-           (base32
-            "1kwrf7akp70kyzw1b90khp71a6hpilihwndy2jsjpffcd4hd4m4z"))))
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/masak/xml-writer")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1kwrf7akp70kyzw1b90khp71a6hpilihwndy2jsjpffcd4hd4m4z"))))
       (build-system rakudo-build-system)
       (arguments '(#:with-zef? #f))
       (home-page "https://github.com/masak/xml-writer")
-      (synopsis "Perl 6 module to generate XML")
-      (description "@code{XML::Writer} is a module for creating XML in Perl 6.")
+      (synopsis "Raku module to generate XML")
+      (description "@code{XML::Writer} is a module for creating XML in Raku.")
       (license license:artistic2.0))))
 
 (define-public perl6-zef
   (package
     (name "perl6-zef")
-    (version "0.6.7")
+    (version "0.13.8")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/ugexe/zef")
-               (commit (string-append "v" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32
-          "07n7g1xw2c4g860rs890gx85vyhdq0ysgwbrnzw6q905jph2bkv7"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/ugexe/zef")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0zmx2gavi975811kskv5j4j2zsysnxfklwx0azn8rffraadnhscm"))))
     (build-system rakudo-build-system)
     (arguments
      '(#:with-zef? #f
@@ -769,11 +885,11 @@ character numbering.")
          (replace 'check
            (lambda _
              (setenv "HOME" "/tmp")
-             (invoke "perl6" "-I." "bin/zef" "--debug"
+             (invoke "raku" "-I." "bin/zef" "--debug"
                      "--tap-harness" "test" "."))))))
     (home-page "https://github.com/ugexe/zef")
-    (synopsis "Perl6 Module Management")
-    (description "Zef is a Perl 6 package (module) manager.  It can be used to
-download and install Perl 6 modules in your home directory or as a system-wide
+    (synopsis "Raku Module Management")
+    (description "Zef is a Raku package (module) manager.  It can be used to
+download and install Raku modules in your home directory or as a system-wide
 module.")
     (license license:artistic2.0)))
diff --git a/gnu/packages/photo.scm b/gnu/packages/photo.scm
index 48f1c38695..1018d2e801 100644
--- a/gnu/packages/photo.scm
+++ b/gnu/packages/photo.scm
@@ -530,7 +530,7 @@ photographic equipment.")
 (define-public darktable
   (package
     (name "darktable")
-    (version "4.6.0")
+    (version "4.6.1")
     (source
      (origin
        (method url-fetch)
@@ -538,7 +538,7 @@ photographic equipment.")
              "https://github.com/darktable-org/darktable/releases/"
              "download/release-" version "/darktable-" version ".tar.xz"))
        (sha256
-        (base32 "1hmcib37b5v8893d69i2qgvmbkmils8a0gn5dpg2462d43ijfjvj"))))
+        (base32 "1zbsrx5cfyifzbi657izw8rfkgd9pm4hx8afv8y2sgi9f2hc1v8n"))))
     (build-system cmake-build-system)
     (arguments
      (list
diff --git a/gnu/packages/python-compression.scm b/gnu/packages/python-compression.scm
index 6f249dd3af..691fbd3065 100644
--- a/gnu/packages/python-compression.scm
+++ b/gnu/packages/python-compression.scm
@@ -7,7 +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>
+;;; Copyright © 2023, 2024 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -30,12 +30,14 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix gexp)
+  #:use-module (guix build-system cargo)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system python)
   #:use-module (guix build-system pyproject)
   #:use-module (gnu packages)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages crates-io)
   #:use-module (gnu packages check)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages pkg-config)
@@ -44,6 +46,7 @@
   #:use-module (gnu packages python-check)
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages rust-apps)
   #:use-module (gnu packages sphinx))
 
 (define-public python-multivolumefile
@@ -73,6 +76,81 @@ file-object abstraction, making it possible to use multiple files as if they
 were a single file.")
     (license license:lgpl2.1+)))
 
+(define-public python-cramjam
+  (package
+    (name "python-cramjam")
+    (version "2.7.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "cramjam" version))
+       (sha256
+        (base32 "1b69qlr0q7q3spa7zy55xc1dr5pjgsdavxx8ijhv2j60xqjbg7sp"))))
+    (build-system cargo-build-system)
+    (arguments
+     (list
+      #:imported-modules `(,@%cargo-build-system-modules
+                           ,@%pyproject-build-system-modules)
+      #:modules '((guix build cargo-build-system)
+                  ((guix build pyproject-build-system)
+                   #:prefix py:)
+                  (guix build utils))
+      #:phases #~(modify-phases %standard-phases
+                   ;; We use Maturin to build the project.
+                   (replace 'build
+                     (assoc-ref py:%standard-phases
+                                'build))
+                   ;; Before being able to run Python tests, we need to
+                   ;; install the module and add it to PYTHONPATH.
+                   (delete 'install)
+                   (add-after 'build 'install
+                     (assoc-ref py:%standard-phases
+                                'install))
+                   (add-after 'install 'add-install-to-pythonpath
+                     (assoc-ref py:%standard-phases
+                                'add-install-to-pythonpath))
+                   ;; Finally run the tests. Only Python tests are provided.
+                   (replace 'check
+                     (lambda* (#:key tests? inputs outputs #:allow-other-keys)
+                       (when tests?
+                         ;; Without the CI variable, tests are run in "local"
+                         ;; mode, which sets a deadline for hypothesis.  For a
+                         ;; deterministic build, we need to set CI.
+                         (setenv "CI" "1")
+                         (invoke "pytest" "-vv" "tests")))))
+      #:cargo-inputs `(("rust-brotli" ,rust-brotli-3)
+                       ("rust-bzip2" ,rust-bzip2-0.4)
+                       ("rust-flate2" ,rust-flate2-1)
+                       ("rust-lz4" ,rust-lz4-1)
+                       ("rust-pyo3" ,rust-pyo3-0.18)
+                       ("rust-snap" ,rust-snap-1)
+                       ("rust-zstd" ,rust-zstd-0.11))
+      #:install-source? #f))
+    (native-inputs (list maturin
+                         python-pytest
+                         python-pytest-xdist
+                         python-numpy
+                         python-hypothesis
+                         python-wrapper))
+    (home-page "https://github.com/milesgranger/cramjam")
+    (synopsis "Python bindings to compression algorithms in Rust")
+    (description
+     "This package provides thin Python bindings to compression and
+decomporession algorithms implemented in Rust.  This allows for using
+algorithms such as Snappy without additional system dependencies.  The
+following algorithms are available:
+
+@itemize
+@item Snappy
+@item Brotli
+@item Bzip2
+@item LZ4
+@item Gzip
+@item Deflate
+@item Zstd
+@end itemize")
+    (license license:expat)))
+
 (define-public python-pybcj
   (package
     (name "python-pybcj")
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index ac1a913a6f..870f542019 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -147,6 +147,7 @@
 ;;; Copyright © 2023 Attila Lendvai <attila@lendvai.name>
 ;;; Copyright © 2023, 2024 Troy Figiel <troy@troyfigiel.com>
 ;;; Copyright © 2024 Timothee Mathieu <timothee.mathieu@inria.fr>
+;;; Copyright © 2024 Ian Eure <ian@retrospec.tv>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25956,6 +25957,43 @@ cases, generating additional test cases, testing for your code, and
 submitting it.")
     (license license:expat)))
 
+(define-public python-mpv-jsonipc
+  (package
+    (name "python-mpv-jsonipc")
+    (version "1.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-mpv-jsonipc" version))
+       (sha256
+        (base32 "0ymdwrx544a6gn6wm9dixpgzbfrbpxvcj5ys7m41cgb4lvpvx691"))))
+    (build-system pyproject-build-system)
+    (home-page "https://github.com/iwalton3/python-mpv-jsonipc")
+    (synopsis "Python API to control MPV using JSON IPC")
+    (description "Python MPV JSONIPC implements an interface similar to
+python-mpv, but it uses the JSON IPC protocol instead of the C API.")
+    (license license:asl2.0)))
+
+(define-public python-jellyfin-apiclient
+  (package
+    (name "python-jellyfin-apiclient")
+    (version "1.9.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "jellyfin-apiclient-python" version))
+       (sha256
+        (base32 "0r67cp9nizvn3cbslgi30zpd3mw4a6zal0ygik3jv5lni1xdkk5w"))))
+    (build-system pyproject-build-system)
+    (propagated-inputs (list python-certifi python-requests python-urllib3
+                             python-websocket-client))
+    (home-page "https://github.com/jellyfin/jellyfin-apiclient-python")
+    (synopsis "Python API client for Jellyfin")
+    (description "The Jellyfin ApiClient Python package makes it possible
+to use the Jellyfin API from Python.  It was extracted from the Jellyfin
+Kodi plugin.")
+    (license license:gpl3+)))
+
 (define-public python-parso
   (package
     (name "python-parso")
@@ -31885,6 +31923,41 @@ handling those variations.")
 Qt applications.")
     (license license:expat)))
 
+(define-public python-pystray
+  (package
+    (name "python-pystray")
+    (version "0.19.5")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/moses-palmer/pystray")
+             (commit "1907f8681d6d421517c63d94f425f9cdd74d0034")))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1vj6c8s7rbc7xc4bi5brx5629ls1ri9prcw9290v85hagilmp609"))))
+    (build-system python-build-system)
+    (arguments
+     (list
+      ;; The test suite requires user interaction, there are no automated
+      ;; tests.
+      #:tests? #false
+      #:phases #~(modify-phases %standard-phases
+                   (add-before 'sanity-check 'use-dummy-backend
+                     (lambda _
+                       ;; Without setting this, pystray tries to connect to
+                       ;; X11 on import.
+                       (setenv "PYSTRAY_BACKEND" "dummy"))))))
+    (native-inputs (list python-sphinx))
+    (propagated-inputs (list python-pillow python-six python-xlib))
+    (home-page "https://github.com/moses-palmer/pystray")
+    (synopsis "Create a system tray icon")
+    (description "This library allows you to create a system tray icon.
+It makes it possible to specify an icon, a title and a callback for when
+the icon is activated.  The icon and title can be changed after the icon
+has been created, and the visibility of the icon can be toggled.")
+    (license license:lgpl3+)))
+
 (define-public python-bitstring
   (package
     (name "python-bitstring")
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 51d5f598d7..0ae3709b99 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -55,7 +55,7 @@
 ;;; Copyright © 2018, 2019, 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2018 Luther Thompson <lutheroto@gmail.com>
 ;;; Copyright © 2018 Vagrant Cascadian <vagrant@debian.org>
-;;; Copyright © 2019 Tanguy Le Carrour <tanguy@bioneland.org>
+;;; Copyright © 2019, 2024 Tanguy Le Carrour <tanguy@bioneland.org>
 ;;; Copyright © 2020, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020, 2021 Greg Hogan <code@greghogan.com>
 ;;; Copyright © 2022 Philip McGrath <philip@philipmcgrath.com>
@@ -596,6 +596,391 @@ data types.")
             (variable "PYTHONTZPATH")
             (files (list "share/zoneinfo")))))))
 
+(define-public python-3.12
+  (package
+    (name "python-next")
+    (version "3.12.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://www.python.org/ftp/python/" version
+                           "/Python-" version ".tar.xz"))
+       (sha256
+        (base32 "0w6qyfhc912xxav9x9pifwca40b4l49vy52wai9j0gc1mhni2a5y"))
+       (patches (search-patches "python-3-deterministic-build-info.patch"
+                                "python-3.12-fix-tests.patch"
+                                "python-3-hurd-configure.patch"))
+       (modules '((guix build utils)))
+       (snippet '(begin
+                   ;; Delete the bundled copy of libexpat.
+                   (delete-file-recursively "Modules/expat")
+                   (substitute* "Modules/Setup"
+                     ;; Link Expat instead of embedding the bundled one.
+                     (("^#pyexpat.*")
+                      "pyexpat pyexpat.c -lexpat\n"))
+                   ;; Delete windows binaries
+                   (for-each delete-file
+                             (find-files "Lib/distutils/command" "\\.exe$"))))))
+    (outputs '("out" "tk" ;tkinter; adds 50 MiB to the closure
+               "idle")) ;programming environment; weighs 5MB
+    (build-system gnu-build-system)
+    (arguments
+     `(#:test-target "test"
+       #:configure-flags (list "--enable-shared" ;allow embedding
+                               "--with-system-expat" ;for XML support
+                               "--with-system-ffi" ;build ctypes
+                               "--with-ensurepip=install" ;install pip and setuptools
+                               "--with-computed-gotos" ;main interpreter loop optimization
+                               "--enable-unicode=ucs4"
+                               "--without-static-libpython"
+
+                               ;; FIXME: These flags makes Python significantly faster,
+                               ;; but leads to non-reproducible binaries.
+                               ;; "--with-lto"   ;increase size by 20MB, but 15% speedup
+                               ;; "--enable-optimizations"
+
+                               ;; Prevent the installed _sysconfigdata.py from retaining
+                               ;; a reference to coreutils.
+                               "INSTALL=install -c"
+                               "MKDIR_P=mkdir -p"
+
+                               ;; Disable runtime check failing if cross-compiling, see:
+                               ;; https://lists.yoctoproject.org/pipermail/poky/2013-June/008997.html
+                               ,@(if (%current-target-system)
+                                     '("ac_cv_buggy_getaddrinfo=no"
+                                       "ac_cv_file__dev_ptmx=no"
+                                       "ac_cv_file__dev_ptc=no")
+                                     '())
+                               ;; -fno-semantic-interposition reinstates some
+                               ;; optimizations by gcc leading to around 15% speedup.
+                               ;; This is the default starting from python 3.10.
+                               "CFLAGS=-fno-semantic-interposition"
+                               (string-append "LDFLAGS=-Wl,-rpath="
+                                              (assoc-ref %outputs "out")
+                                              "/lib"
+                                              " -fno-semantic-interposition"))
+       ;; With no -j argument tests use all available cpus, so provide one.
+       #:make-flags (list (string-append (format #f "TESTOPTS=-j~d"
+                                                 (parallel-job-count))
+                           ;; those tests fail on low-memory systems
+                           " --exclude test_mmap test_socket test_threading test_asyncio"
+                           ,@(if (system-hurd?)
+                                 '(" test_posix" ;multiple errors
+                                   " test_time"
+                                   " test_pty"
+                                   " test_shutil"
+                                   " test_tempfile" ;chflags: invalid argument:
+                                   ;; tbv14c9t/dir0/dir0/dir0/test0.txt
+                                   " test_os" ;stty: 'standard input':
+                                   ;; Inappropriate ioctl for device
+                                   " test_openpty" ;No such file or directory
+                                   " test_selectors" ;assertEqual(NUM_FDS // 2, len(fds))
+                                   ;; 32752 != 4
+                                   " test_compileall" ;multiple errors
+                                   " test_poll" ;list index out of range
+                                   " test_subprocess" ;runs over 10min
+                                   " test_asyncore" ;multiple errors
+                                   " test_threadsignals"
+                                   " test_eintr" ;Process return code is -14
+                                   " test_io" ;multiple errors
+                                   " test_logging"
+                                   " test_signal"
+                                   " test_flags" ;ERROR
+                                   " test_bidirectional_pty"
+                                   " test_create_unix_connection"
+                                   " test_unix_sock_client_ops"
+                                   " test_open_unix_connection"
+                                   " test_open_unix_connection_error"
+                                   " test_read_pty_output"
+                                   " test_write_pty"
+                                   " test_concurrent_futures" ;freeze
+                                   " test_venv" ;freeze
+                                   " test_multiprocessing_forkserver" ;runs over 10min
+                                   " test_multiprocessing_spawn" ;runs over 10min
+                                   " test_builtin"
+                                   " test_capi"
+                                   " test_dbm_ndbm"
+                                   " test_exceptions"
+                                   " test_faulthandler"
+                                   " test_getopt"
+                                   " test_importlib"
+                                   " test_json"
+                                   " test_multiprocessing_fork"
+                                   " test_multiprocessing_main_handling"
+                                   " test_pdb "
+                                   " test_regrtest"
+                                   " test_sqlite")
+                                 '())))
+
+       #:modules ((ice-9 ftw)
+                  (ice-9 match)
+                  (guix build utils)
+                  (guix build gnu-build-system))
+
+       #:phases (modify-phases %standard-phases
+                  ,@(if (system-hurd?)
+                        `((add-after 'unpack
+                                     'disable-multi-processing
+                                     (lambda _
+                                       (substitute* "Makefile.pre.in"
+                                         (("-j0")
+                                          "-j1")))))
+                        '())
+                  (add-before 'configure 'patch-lib-shells
+                    (lambda _
+                      ;; This variable is used in setup.py to enable cross compilation
+                      ;; specific switches. As it is not set properly by configure
+                      ;; script, set it manually.
+                      ,@(if (%current-target-system)
+                            '((setenv "_PYTHON_HOST_PLATFORM" ""))
+                            '())
+                      ;; Filter for existing files, since some may not exist in all
+                      ;; versions of python that are built with this recipe.
+                      (substitute* (filter file-exists?
+                                           '("Lib/subprocess.py"
+                                             "Lib/popen2.py"
+                                             "Lib/distutils/tests/test_spawn.py"
+                                             "Lib/test/support/__init__.py"
+                                             "Lib/test/test_subprocess.py"))
+                        (("/bin/sh")
+                         (which "sh")))))
+                  (add-before 'configure 'do-not-record-configure-flags
+                    (lambda* (#:key configure-flags #:allow-other-keys)
+                      ;; Remove configure flags from the installed '_sysconfigdata.py'
+                      ;; and 'Makefile' so we don't end up keeping references to the
+                      ;; build tools.
+                      ;;
+                      ;; Preserve at least '--with-system-ffi' since otherwise the
+                      ;; thing tries to build libffi, fails, and we end up with a
+                      ;; Python that lacks ctypes.
+                      (substitute* "configure"
+                        (("^CONFIG_ARGS=.*$")
+                         (format #f "CONFIG_ARGS='~a'\n"
+                                 (if (member "--with-system-ffi"
+                                             configure-flags)
+                                     "--with-system-ffi" ""))))))
+                  (add-before 'check 'pre-check
+                    (lambda _
+                      ;; 'Lib/test/test_site.py' needs a valid $HOME
+                      (setenv "HOME"
+                              (getcwd))))
+                  (add-after 'unpack 'set-source-file-times-to-1980
+                    ;; XXX One of the tests uses a ZIP library to pack up some of the
+                    ;; source tree, and fails with "ZIP does not support timestamps
+                    ;; before 1980".  Work around this by setting the file times in the
+                    ;; source tree to sometime in early 1980.
+                    (lambda _
+                      (let ((circa-1980 (* 10 366 24 60 60)))
+                        (ftw "."
+                             (lambda (file stat flag)
+                               (utime file circa-1980 circa-1980) #t)))))
+                  (add-after 'unpack 'remove-windows-binaries
+                    (lambda _
+                      ;; Delete .exe from embedded .whl (zip) files
+                      (for-each (lambda (whl)
+                                  (let ((dir "whl-content")
+                                        (circa-1980 (* 10 366 24 60 60)))
+                                    (mkdir-p dir)
+                                    (with-directory-excursion dir
+                                      (let ((whl (string-append "../" whl)))
+                                        (invoke "unzip" whl)
+                                        (for-each delete-file
+                                                  (find-files "." "\\.exe$"))
+                                        (delete-file whl)
+                                        ;; Reset timestamps to prevent them from ending
+                                        ;; up in the Zip archive.
+                                        (ftw "."
+                                             (lambda (file stat flag)
+                                               (utime file circa-1980
+                                                      circa-1980) #t))
+                                        (apply invoke "zip" "-X" whl
+                                               (find-files "."
+                                                           #:directories? #t))))
+                                    (delete-file-recursively dir)))
+                                (find-files "Lib/ensurepip" "\\.whl$"))))
+                  (add-after 'install 'remove-tests
+                    ;; Remove 25 MiB of unneeded unit tests.  Keep test_support.*
+                    ;; because these files are used by some libraries out there.
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let ((out (assoc-ref outputs "out")))
+                        (match (scandir (string-append out "/lib")
+                                        (lambda (name)
+                                          (string-prefix? "python" name)))
+                          ((pythonX.Y)
+                           (let ((testdir (string-append out "/lib/" pythonX.Y
+                                                         "/test")))
+                             (with-directory-excursion testdir
+                               (for-each delete-file-recursively
+                                         (scandir testdir
+                                                  (match-lambda
+                                                    ((or "." "..")
+                                                     #f)
+                                                    ("support" #f)
+                                                    (file (not (string-prefix?
+                                                                "test_support."
+                                                                file))))))
+                               (call-with-output-file "__init__.py"
+                                 (const #t))))
+                           (let ((libdir (string-append out "/lib/" pythonX.Y)))
+                             (for-each (lambda (directory)
+                                         (let ((dir (string-append libdir "/"
+                                                                   directory)))
+                                           (when (file-exists? dir)
+                                             (delete-file-recursively dir))))
+                                       '("email/test" "ctypes/test"
+                                         "unittest/test"
+                                         "tkinter/test"
+                                         "sqlite3/test"
+                                         "bsddb/test"
+                                         "lib-tk/test"
+                                         "json/tests"
+                                         "distutils/tests"))))))))
+                  (add-after 'remove-tests 'move-tk-inter
+                    (lambda* (#:key outputs inputs #:allow-other-keys)
+                      ;; When Tkinter support is built move it to a separate output so
+                      ;; that the main output doesn't contain a reference to Tcl/Tk.
+                      (let ((out (assoc-ref outputs "out"))
+                            (tk (assoc-ref outputs "tk")))
+                        (when tk
+                          (match (find-files out "tkinter.*\\.so")
+                            ((tkinter.so)
+                             ;; The .so is in OUT/lib/pythonX.Y/lib-dynload, but we
+                             ;; want it under TK/lib/pythonX.Y/site-packages.
+                             (let* ((len (string-length out))
+                                    (target (string-append tk "/"
+                                                           (string-drop (dirname
+                                                                         (dirname
+                                                                          tkinter.so))
+                                                                        len)
+                                                           "/site-packages")))
+                               (install-file tkinter.so target)
+                               (delete-file tkinter.so))))
+                          ;; Remove explicit store path references.
+                          (let ((tcl (assoc-ref inputs "tcl"))
+                                (tk (assoc-ref inputs "tk")))
+                            (substitute* (find-files (string-append out "/lib")
+                                          "^(_sysconfigdata_.*\\.py|Makefile)$")
+                              (((string-append "-L" tk "/lib"))
+                               "")
+                              (((string-append "-L" tcl "/lib"))
+                               "")))))))
+                  (add-after 'move-tk-inter 'move-idle
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      ;; when idle is built, move it to a separate output to save some
+                      ;; space (5MB)
+                      (let ((out (assoc-ref outputs "out"))
+                            (idle (assoc-ref outputs "idle")))
+                        (when idle
+                          (for-each (lambda (file)
+                                      (let ((target (string-append idle
+                                                                   "/bin/"
+                                                                   (basename
+                                                                    file))))
+                                        (install-file file
+                                                      (dirname target))
+                                        (delete-file file)))
+                                    (find-files (string-append out "/bin")
+                                                "^idle"))
+                          (match (find-files out "^idlelib$"
+                                             #:directories? #t)
+                            ((idlelib)
+                             (let* ((len (string-length out))
+                                    (target (string-append idle "/"
+                                                           (string-drop
+                                                            idlelib len)
+                                                           "/site-packages")))
+                               (mkdir-p (dirname target))
+                               (rename-file idlelib target))))))))
+                  (add-after 'move-idle 'rebuild-bytecode
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let ((out (assoc-ref outputs "out")))
+                        ;; Disable hash randomization to ensure the generated .pycs
+                        ;; are reproducible.
+                        (setenv "PYTHONHASHSEED" "0")
+
+                        (for-each (lambda (output)
+                                    ;; XXX: Delete existing pycs generated by the build
+                                    ;; system beforehand because the -f argument does
+                                    ;; not necessarily overwrite all files, leading to
+                                    ;; indeterministic results.
+                                    (for-each (lambda (pyc)
+                                                (delete-file pyc))
+                                              (find-files output "\\.pyc$"))
+
+                                    (apply invoke
+                                           `(,,(if (%current-target-system)
+                                                   "python3"
+                                                   '(string-append out
+                                                     "/bin/python3")) "-m"
+                                             "compileall"
+                                             "-o"
+                                             "0"
+                                             "-o"
+                                             "1"
+                                             "-o"
+                                             "2"
+                                             "-f" ;force rebuild
+                                             "--invalidation-mode=unchecked-hash"
+                                             ;; Don't build lib2to3, because it's
+                                             ;; Python 2 code.
+                                             "-x"
+                                             "lib2to3/.*"
+                                             ,output)))
+                                  (map cdr outputs)))))
+                  (add-before 'check 'set-TZDIR
+                    (lambda* (#:key inputs native-inputs #:allow-other-keys)
+                      ;; test_email requires the Olson time zone database.
+                      (setenv "TZDIR"
+                              (string-append (assoc-ref (or native-inputs
+                                                            inputs) "tzdata")
+                                             "/share/zoneinfo"))))
+                  (add-after 'install 'install-sitecustomize.py
+                    ,(customize-site version)))))
+    (inputs (list bzip2
+                  expat
+                  gdbm
+                  libffi ;for ctypes
+                  sqlite ;for sqlite extension
+                  openssl
+                  readline
+                  zlib
+                  tcl
+                  tk)) ;for tkinter
+    (native-inputs `(("tzdata" ,tzdata-for-tests)
+                     ("unzip" ,unzip)
+                     ("zip" ,(@ (gnu packages compression) zip))
+                     ("pkg-config" ,pkg-config)
+                     ("sitecustomize.py" ,(local-file (search-auxiliary-file
+                                                       "python/sitecustomize.py")))
+                     ;; When cross-compiling, a native version of Python itself is needed.
+                     ,@(if (%current-target-system)
+                           `(("python" ,this-package)
+                             ("which" ,which))
+                           '())))
+    (native-search-paths
+     (list (guix-pythonpath-search-path version)
+           ;; Used to locate tzdata by the zoneinfo module introduced in
+           ;; Python 3.9.
+           (search-path-specification
+            (variable "PYTHONTZPATH")
+            (files (list "share/zoneinfo")))))
+    (home-page "https://www.python.org")
+    (synopsis "High-level, dynamically-typed programming language")
+    (description
+     "Python is a remarkably powerful dynamic programming language that
+is used in a wide variety of application domains.  Some of its key
+distinguishing features include: clear, readable syntax; strong
+introspection capabilities; intuitive object orientation; natural
+expression of procedural code; full modularity, supporting hierarchical
+packages; exception-based error handling; and very high level dynamic
+data types.")
+    (properties '((cpe-name . "python")))
+    (license license:psfl)))
+
+
+;; Next 3.x version.
+(define-public python-next python-3.12)
+
 ;; Current 3.x version.
 (define-public python-3 python-3.10)
 
diff --git a/gnu/packages/radio.scm b/gnu/packages/radio.scm
index 2f258b0364..9c8225d22b 100644
--- a/gnu/packages/radio.scm
+++ b/gnu/packages/radio.scm
@@ -63,6 +63,7 @@
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages golang)
+  #:use-module (gnu packages golang-xyz)
   #:use-module (gnu packages gps)
   #:use-module (gnu packages graphviz)
   #:use-module (gnu packages gstreamer)
@@ -790,7 +791,7 @@ used by RDS Spy, and audio files containing @dfn{multiplex} signals (MPX).")
 (define-public gnuradio
   (package
     (name "gnuradio")
-    (version "3.10.3.0")
+    (version "3.10.8.0")
     (source
      (origin
        (method git-fetch)
@@ -799,7 +800,7 @@ used by RDS Spy, and audio files containing @dfn{multiplex} signals (MPX).")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0xdhb2blzajxpi0f2ch23hh6bzdwz5q7syi3bmiqzdjlj2yjfzd4"))))
+        (base32 "11p08qrbfh5dz6l5n4c2g8c2gv1qq8aiydq91ryzfzgp49r0j6p0"))))
     (build-system cmake-build-system)
     (native-inputs
      (list doxygen
diff --git a/gnu/packages/rust-apps.scm b/gnu/packages/rust-apps.scm
index 01e01ecba3..7313cdef77 100644
--- a/gnu/packages/rust-apps.scm
+++ b/gnu/packages/rust-apps.scm
@@ -30,6 +30,7 @@
 ;;; Copyright © 2024 Troy Figiel <troy@troyfigiel.com>
 ;;; Copyright © 2024 Herman Rimm <herman@rimm.ee>
 ;;; Copyright © 2024 Tomas Volf <~@wolfsden.cz>
+;;; Copyright © 2024 Suhail Singh <suhail@bayesians.ca>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -71,6 +72,7 @@
   #:use-module (gnu packages crates-windows)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages documentation)
+  #:use-module (gnu packages emacs)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages haskell-xyz)
@@ -99,6 +101,40 @@
   #:use-module (gnu packages webkit)
   #:use-module (gnu packages xorg))
 
+(define-public aardvark-dns
+  (package
+    (name "aardvark-dns")
+    (version "1.10.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "aardvark-dns" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0ldqv9v3v9a1m2kka660d5v15y2zasy5z7m4fh5hif74r089cx6x"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:install-source? #f
+       #:cargo-inputs (("rust-anyhow" ,rust-anyhow-1)
+                       ("rust-async-broadcast" ,rust-async-broadcast-0.6)
+                       ("rust-chrono" ,rust-chrono-0.4)
+                       ("rust-clap" ,rust-clap-4)
+                       ("rust-futures-util" ,rust-futures-util-0.3)
+                       ("rust-hickory-client" ,rust-hickory-client-0.24)
+                       ("rust-hickory-proto" ,rust-hickory-proto-0.24)
+                       ("rust-hickory-server" ,rust-hickory-server-0.24)
+                       ("rust-libc" ,rust-libc-0.2)
+                       ("rust-log" ,rust-log-0.4)
+                       ("rust-nix" ,rust-nix-0.27)
+                       ("rust-resolv-conf" ,rust-resolv-conf-0.7)
+                       ("rust-signal-hook" ,rust-signal-hook-0.3)
+                       ("rust-syslog" ,rust-syslog-6)
+                       ("rust-tokio" ,rust-tokio-1))))
+    (home-page "https://github.com/containers/aardvark-dns")
+    (synopsis "Container-focused DNS server")
+    (description "This package provides a container-focused DNS server.")
+    (license license:asl2.0)))
+
 (define-public agate
   (package
     (name "agate")
@@ -468,6 +504,43 @@ Features include:
 @end enumerate\n")
     (license license:gpl3)))
 
+(define-public emacs-lsp-booster
+  (package
+    (name "emacs-lsp-booster")
+    (version "0.2.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/blahgeek/emacs-lsp-booster")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1xx32ms3mpi1clxf74mx7nanj0iw9qkmhi0a53fx8fkz0jw2fq8f"))))
+    (build-system cargo-build-system)
+    (arguments
+     (list
+      #:cargo-inputs `(("rust-anyhow" ,rust-anyhow-1)
+                       ("rust-clap" ,rust-clap-4)
+                       ("rust-clap-verbosity-flag" ,rust-clap-verbosity-flag-2)
+                       ("rust-lazy-static" ,rust-lazy-static-1)
+                       ("rust-log" ,rust-log-0.4)
+                       ("rust-serde" ,rust-serde-1)
+                       ("rust-serde-json" ,rust-serde-json-1)
+                       ("rust-smallvec" ,rust-smallvec-1)
+                       ("rust-env-logger" ,rust-env-logger-0.10))
+      #:cargo-development-inputs `(("rust-emacs" ,rust-emacs-0.18)
+                                   ("rust-tempfile" ,rust-tempfile-3))
+      #:install-source? #f))
+    (native-inputs (list emacs))    ; Not emacs-minimal
+    (home-page "https://github.com/blahgeek/emacs-lsp-booster")
+    (synopsis "Emacs LSP performance booster")
+    (description
+     "@code{emacs-lsp-booster} improves the performance of @code{lsp-mode} and
+@code{eglot} Emacs packages using a wrapper executable.  See the home-page for
+configuration instructions.")
+    (license license:expat)))
+
 (define-public eza
   (package
     (name "eza")
diff --git a/gnu/packages/scribus.scm b/gnu/packages/scribus.scm
index ba32361575..02dd0e3c6e 100644
--- a/gnu/packages/scribus.scm
+++ b/gnu/packages/scribus.scm
@@ -50,20 +50,14 @@
 (define-public scribus
   (package
     (name "scribus")
-    (version "1.5.8")
+    (version "1.6.1")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://sourceforge/scribus/scribus-devel/"
-                           version "/scribus-" version ".tar.xz"))
+       (uri (string-append "mirror://sourceforge/scribus/scribus/"
+                           version "/scribus-" version ".tar.gz"))
        (sha256
-        (base32 "0x3bw58v920akca8jxvsfwf468pzjyglk93ay67ph1bdry7nx0a7"))
-       (patches
-        (search-patches "scribus-1.5.8-poppler-22.2.0-1.patch"
-                        "scribus-1.5.8-poppler-22.2.0-2.patch"
-                        "scribus-1.5.8-poppler-22.03.0.patch"
-                        "scribus-1.5.8-poppler-22.04.0.patch"
-                        "scribus-1.5.8-poppler-22.09.0.patch"))))
+        (base32 "1kqqffx5xz35mwd422s4i110794zzx9sc2bn2mg77rz02hrxdhxg"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f                      ;no test target
diff --git a/gnu/packages/shells.scm b/gnu/packages/shells.scm
index 1822380ac8..ae4e73956e 100644
--- a/gnu/packages/shells.scm
+++ b/gnu/packages/shells.scm
@@ -547,14 +547,14 @@ ksh, and tcsh.")
 (define-public xonsh
   (package
     (name "xonsh")
-    (version "0.14.2")
+    (version "0.15.1")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "xonsh" version))
         (sha256
           (base32
-           "0fddxzd45zvfr687mvd90f5s376yz0a8ln7qbpl94q89z7l0y77k"))
+           "0427mimr4k75myg5mnig564kq7xbb5f5hws2ly3gxxl6g8mk79il"))
         (modules '((guix build utils)))
         (snippet
          #~(begin
@@ -861,7 +861,7 @@ Shell (pdksh).")
 (define-public oil
   (package
     (name "oil")
-    (version "0.17.0")
+    (version "0.20.0")
     (source
      ;; oil's sources contain a modified version of CPython 2.7.13.
      ;; According to https://www.oilshell.org/blog/2017/05/05.html
@@ -874,7 +874,7 @@ Shell (pdksh).")
        (uri (string-append "https://www.oilshell.org/download/oil-"
                            version ".tar.gz"))
        (sha256
-        (base32 "01b67dq56iam44d7c81ba9w62jjnjx2z7wm928rkc1ff6bacm37r"))))
+        (base32 "1jpxhixwq29ik01jx372g9acib59wmww8lrdlcypq7jpg5b0b7pi"))))
     (build-system gnu-build-system)
     (arguments
      (list #:strip-binaries? #f         ; strip breaks the binary
diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm
index d17061205f..0d9f593614 100644
--- a/gnu/packages/statistics.scm
+++ b/gnu/packages/statistics.scm
@@ -223,7 +223,7 @@ This package also provides @command{xls2csv} to export Excel files to CSV.")
 (define r-with-tests
   (package
     (name "r-with-tests")
-    (version "4.3.2")
+    (version "4.3.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://cran/src/base/R-"
@@ -231,7 +231,7 @@ This package also provides @command{xls2csv} to export Excel files to CSV.")
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0aj51j34q2b28y28xvlf0dwdj8vpnhjwpvqf7xm05s7fq857dxdk"))))
+                "0c03abq3kqg6d2yhrijy9j3fsl77har3k7pffwwbz19v74qi51c0"))))
     (build-system gnu-build-system)
     (arguments
      (list
@@ -1328,14 +1328,14 @@ agnes cluster diagrams.")
 (define-public r-gdtools
   (package
     (name "r-gdtools")
-    (version "0.3.6")
+    (version "0.3.7")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "gdtools" version))
        (sha256
         (base32
-         "1d1sidm2qi1nrp1hhf010xji66aj8sn833fv4a39gli2c560p4i6"))))
+         "155ky9fdi023b5fjk1gh3607xlgm3hymq232fq03ip2aaywc74nj"))))
     (build-system r-build-system)
     (native-inputs
      (list pkg-config))
@@ -1994,14 +1994,14 @@ side.")
 (define-public r-locfit
   (package
     (name "r-locfit")
-    (version "1.5-9.8")
+    (version "1.5-9.9")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "locfit" version))
        (sha256
         (base32
-         "1qqxw69p42l4szr2fl73bdydpcbxn68iyxyyjy7qy3p56bxrn2hd"))))
+         "1m7ji1ykvffqvs9ly1pzadiwhwxcyv4xivziikmahp0w0sv45lck"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-lattice))
@@ -2033,13 +2033,13 @@ times.")
 (define-public r-data-table
   (package
     (name "r-data-table")
-    (version "1.15.0")
+    (version "1.15.2")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "data.table" version))
               (sha256
                (base32
-                "0qhh4ii10b6rbimhh83160gsax82gbrm3hqbqqddkzknpifxpdrr"))))
+                "04pfcm3pyl997rpyj5zdmbhi4ndaai81vfgv4whjp8rhqzjk7i6j"))))
     (properties `((upstream-name . "data.table")))
     (build-system r-build-system)
     (inputs
@@ -3179,13 +3179,13 @@ well as additional utilities such as panel and axis annotation functions.")
 (define-public r-rcpparmadillo
   (package
     (name "r-rcpparmadillo")
-    (version "0.12.8.0.0")
+    (version "0.12.8.1.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "RcppArmadillo" version))
               (sha256
                (base32
-                "0pkn4334dh4k6hqfx4xln2nfvajyxdbfnfddajb8875il0f7kp0x"))))
+                "0ax4812dm33c67ckd902qabis3dgqmpkchk4s30bshnfv4fxx1z2"))))
     (properties `((upstream-name . "RcppArmadillo")))
     (build-system r-build-system)
     (propagated-inputs
@@ -5861,13 +5861,13 @@ groupings.")
 (define-public r-vgam
   (package
     (name "r-vgam")
-    (version "1.1-9")
+    (version "1.1-10")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "VGAM" version))
        (sha256
-        (base32 "1l5gn6495k8vqp2b4hj4g5ani7j4cli2p7n8fwkw7bmc42q13m6l"))))
+        (base32 "04yy5rxid3fwn42sak9rjbxd1h4d7iigiznpbrvwxl06b1xficyb"))))
     (properties `((upstream-name . "VGAM")))
     (build-system r-build-system)
     (native-inputs
@@ -5928,14 +5928,14 @@ based on an interface to Fortran implementations by M. J. D. Powell.")
 (define-public r-rcppeigen
   (package
     (name "r-rcppeigen")
-    (version "0.3.3.9.4")
+    (version "0.3.4.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "RcppEigen" version))
        (sha256
         (base32
-         "1faz1phvg7g14bchi88vizn5mfhgiwmsjg7jzkyf1yjg0f6vpsj1"))))
+         "0djiyimgka7g3kfakb6mfaq7cxna9kn6kgib59x9p7qj24ha1m18"))))
     (properties `((upstream-name . "RcppEigen")))
     (build-system r-build-system)
     (propagated-inputs
@@ -6891,6 +6891,8 @@ Java package that provides routines for various statistical distributions.")
                                     "ess-eval-line-test"
                                     "ess-eval-region-test"
                                     "ess-mock-remote-process"
+                                    "ess-r-eval-sink-freeze-test"
+                                    "ess-r-eval-ns-env-roxy-tracebug-test"
                                     "ess-r-load-ESSR-github-fetch-no"
                                     "ess-r-load-ESSR-github-fetch-yes"
                                     "ess-set-working-directory-test"
@@ -7291,22 +7293,23 @@ normal model.")
 (define-public r-naniar
   (package
     (name "r-naniar")
-    (version "1.0.0")
+    (version "1.1.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "naniar" version))
               (sha256
                (base32
-                "1x4ljc6yji7312g6cg1shc85jqv5kaf2zlf5q7sdmqh3wryskvf2"))))
+                "0i3gijr1l7hbcp75cyj26pxmm493lnvasl8aba9vv4w8lz1lck59"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-cli
            r-dplyr
-           r-norm
            r-forcats
            r-ggplot2
            r-glue
+           r-lifecycle
            r-magrittr
+           r-norm
            r-purrr
            r-rlang
            r-tibble
@@ -7355,14 +7358,14 @@ Michael Lim & Trevor Hastie (2015)")
 (define-public r-datasaurus
   (package
     (name "r-datasaurus")
-    (version "0.1.6")
+    (version "0.1.8")
     (source
       (origin
         (method url-fetch)
         (uri (cran-uri "datasauRus" version))
         (sha256
           (base32
-            "0vgylf3bab0xcfg08xwvfq9yhxy6w0fxi7wp4kkxfyjb0pw15qxk"))))
+            "08yx87k4kl3i9g3m1j9532whvs4l0l3v5gwj8sk7qlb3m3wajakr"))))
     (properties `((upstream-name . "datasauRus")))
     (build-system r-build-system)
     (native-inputs (list r-knitr))
diff --git a/gnu/packages/telegram.scm b/gnu/packages/telegram.scm
index af90fc35eb..7d02824efa 100644
--- a/gnu/packages/telegram.scm
+++ b/gnu/packages/telegram.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2023 Saku Laesvuori <saku@laesvuori.fi>
 ;;; Copyright © 2023 Lu Hui <luhux76@gmail.com>
 ;;; Copyright © 2023 Camilo Q.S. (Distopico) <distopico@riseup.net>
+;;; Copyright © 2024 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -613,47 +614,50 @@ formerly a part of telegram-cli, but now being maintained separately.")
           (base32 "0cf5s7ygslb5klg1qv9qdc3hivhspmvh3zkacyyhd2yyikb5p0f9"))))
       (build-system gnu-build-system)
       (arguments
-       `(#:tests? #f                    ; No target
+       (list
+        #:tests? #f                    ; No target
          #:imported-modules
-         ((guix build copy-build-system)
-          ,@%gnu-build-system-modules)
+         `((guix build copy-build-system)
+           ,@%gnu-build-system-modules)
          #:modules
-         (((guix build copy-build-system)
-           #:prefix copy:)
-          (guix build gnu-build-system)
-          (guix build utils))
+         '(((guix build copy-build-system)
+            #:prefix copy:)
+           (guix build gnu-build-system)
+           (guix build utils))
          #:configure-flags
-         (list
-          ;; Use gcrypt instead of openssl.
-          "--disable-openssl"
-          ;; Enable extended queries system.
-          "--enable-extf"
-          ;; Include libevent-based net and timers.
-          "--enable-libevent")
+         '(list
+           ;; Use gcrypt instead of openssl.
+           "--disable-openssl"
+           ;; Enable extended queries system.
+           "--enable-extf"
+           ;; Include libevent-based net and timers.
+           "--enable-libevent")
          #:phases
-         (modify-phases %standard-phases
-           (add-after 'unpack 'trigger-bootstrap
-             (lambda _
-               (delete-file "configure")
-               #t))
-           (add-after 'trigger-bootstrap 'patch-tl-parser
-             (lambda _
-               (delete-file "Makefile.tl-parser")
-               (substitute* "Makefile.in"
-                 (("include \\$\\{srcdir\\}/Makefile\\.tl-parser")
-                  "")
-                 (("\\$\\{EXE\\}/tl-parser")
-                  "tl-parser"))
-               #t))
-           (replace 'install
-             (lambda args
-               (apply (assoc-ref copy:%standard-phases 'install)
-                      #:install-plan
-                      '(("bin" "bin")
-                        ("." "include/tgl"
-                         #:include-regexp ("\\.h$"))
-                        ("libs" "lib/tgl"))
-                      args))))))
+         '(modify-phases %standard-phases
+            (add-after 'unpack 'trigger-bootstrap
+              (lambda _
+                (delete-file "configure")))
+            (add-after 'trigger-bootstrap 'patch-tl-parser
+              (lambda _
+                (delete-file "Makefile.tl-parser")
+                (substitute* "Makefile.in"
+                  (("include \\$\\{srcdir\\}/Makefile\\.tl-parser")
+                   "")
+                  (("\\$\\{EXE\\}/tl-parser")
+                   "tl-parser"))))
+            (add-after 'unpack 'remove-Werror
+              (lambda _
+                (substitute* "Makefile.in"
+                  (("-Werror") ""))))
+            (replace 'install
+              (lambda args
+                (apply (assoc-ref copy:%standard-phases 'install)
+                       #:install-plan
+                       '(("bin" "bin")
+                         ("." "include/tgl"
+                          #:include-regexp ("\\.h$"))
+                         ("libs" "lib/tgl"))
+                       args))))))
       (native-inputs
        (list autoconf automake libtool pkg-config))
       (inputs
@@ -683,25 +687,29 @@ formerly a part of telegram-cli, but now being maintained separately.")
           (base32 "0c1w7jgska71jjbvg1y09v52549pwa4zkdjly18yxywn7gayd2p6"))))
       (build-system gnu-build-system)
       (arguments
-       `(#:tests? #f                    ; No target
-         #:imported-modules
-         ((guix build copy-build-system)
+       (list
+        #:tests? #f                     ; No target
+        #:imported-modules
+        `((guix build copy-build-system)
           ,@%gnu-build-system-modules)
-         #:modules
-         (((guix build copy-build-system)
+        #:modules
+        '(((guix build copy-build-system)
            #:prefix copy:)
           (guix build gnu-build-system)
           (guix build utils))
-         #:configure-flags
-         (list
+        #:configure-flags
+        '(list
           ;; Use gcrypt instead of openssl.
           "--disable-openssl")
-         #:phases
-         (modify-phases %standard-phases
+        #:phases
+        '(modify-phases %standard-phases
+           (add-after 'unpack 'remove-Werror
+             (lambda _
+               (substitute* "Makefile.in"
+                 (("-Werror") "-fcommon"))))
            (add-after 'unpack 'trigger-bootstrap
              (lambda _
-               (delete-file "configure")
-               #t))
+               (delete-file "configure")))
            (add-after 'trigger-bootstrap 'patch-tgl-and-tlparser
              (lambda* (#:key inputs #:allow-other-keys)
                (for-each delete-file
@@ -721,8 +729,7 @@ formerly a part of telegram-cli, but now being maintained separately.")
                                  "/include/tgl/auto"))
                  (("LIB=libs")
                   (string-append "LIB=" (assoc-ref inputs "tgl")
-                                 "/lib/tgl")))
-               #t))
+                                 "/lib/tgl")))))
            (replace 'install
              (lambda args
                (apply (assoc-ref copy:%standard-phases 'install)
diff --git a/gnu/packages/text-editors.scm b/gnu/packages/text-editors.scm
index 2c2b39312c..d1ab828eb4 100644
--- a/gnu/packages/text-editors.scm
+++ b/gnu/packages/text-editors.scm
@@ -1555,14 +1555,14 @@ highlighting for dozens of languages.  Jed is very small and fast.")
 (define-public xnedit
   (package
     (name "xnedit")
-    (version "1.5.2")
+    (version "1.5.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/xnedit/" name "-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "09424qj03p7v7ih2gi3jnpm5iilr24ssab8rkijcjh6n9qn7izl0"))))
+                "10pw0yylhfmpcmhs74i3ikgsd8jq4dsy64zp9v14wj5s4qrac4c5"))))
 
     (build-system gnu-build-system)
     (arguments
diff --git a/gnu/packages/time.scm b/gnu/packages/time.scm
index b0d800da94..0bb493c27f 100644
--- a/gnu/packages/time.scm
+++ b/gnu/packages/time.scm
@@ -40,6 +40,7 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages time)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages base)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
@@ -549,6 +550,30 @@ datetime type.")
      "This package contains a library for parsing ISO 8601 datetime strings.")
     (license bsd-3)))
 
+(define-public rdate
+  (let ((commit "91d84610e3695e90a884e2953908e95a856a9b74")
+        (revision "1"))
+    (package
+      (name "rdate")
+      (version (git-version "1.4" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/njh/rdate")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "002ryjq8gj1ml5la4v6dr3bh1zw5kxwy65rpziq8d2ccccarhv59"))))
+      (build-system gnu-build-system)
+      (native-inputs (list autoconf automake))
+      (synopsis "Get date and time based on RFC 868")
+      (description
+       "@code{rdate} connects to an RFC 868 time server over a TCP/IP network,
+printing the returned time and/or setting the system clock.")
+      (home-page "https://www.aelius.com/njh/rdate/")
+      (license gpl2+))))
+
 (define-public datefudge
   (package
     (name "datefudge")
diff --git a/gnu/packages/tor-browsers.scm b/gnu/packages/tor-browsers.scm
index 91b5018caa..da4e77f8c5 100644
--- a/gnu/packages/tor-browsers.scm
+++ b/gnu/packages/tor-browsers.scm
@@ -150,16 +150,16 @@
 
 ;; We copy the official build id, which can be found there:
 ;; https://aus1.torproject.org/torbrowser/update_3/release/.
-(define %torbrowser-build-date "20240213172118")
+(define %torbrowser-build-date "20240305132801")
 
 ;; To find the last version, look at https://www.torproject.org/download/.
-(define %torbrowser-version "13.0.10")
+(define %torbrowser-version "13.0.11")
 
 ;; To find the last Firefox version, browse
 ;; https://archive.torproject.org/tor-package-archive/torbrowser/<%torbrowser-version>
 ;; There should be only one archive that starts with
 ;; "src-firefox-tor-browser-".
-(define %torbrowser-firefox-version "115.8.0esr-13.0-1-build1")
+(define %torbrowser-firefox-version "115.8.0esr-13.0-1-build2")
 
 ;; See tor-browser-build/projects/translation/config.
 ;; If Tor Browser and Mullvad Browser updates are not synchronized, maybe this
@@ -169,11 +169,11 @@
     (method git-fetch)
     (uri (git-reference
           (url "https://gitlab.torproject.org/tpo/translation.git")
-          (commit "cbd9b6c415ec2edb99237ef67ccd4f033a7b9c2a")))
+          (commit "16211a4b8524d71525f0ea73c07771c634132b30")))
     (file-name "translation-base-browser")
     (sha256
      (base32
-      "103dj1zzc68gxzjxwcpc4sbc6qca4zg8kkhdivzpq37ma07sp9sf"))))
+      "1452lpzbx0a049ksw84q7fj93bldfpllpp86aa4kggiv7vb3dqxk"))))
 
 ;; See tor-browser-build/projects/translation/config.
 (define translation-tor-browser
@@ -181,11 +181,11 @@
     (method git-fetch)
     (uri (git-reference
           (url "https://gitlab.torproject.org/tpo/translation.git")
-          (commit "a50fa943d7428ebe6e4e6b09f175e098a97eec63")))
+          (commit "012f643d2d6b04ebf868bf62cdb7ad5b727734f5")))
     (file-name "translation-tor-browser")
     (sha256
      (base32
-      "0kvjdkgfdl0sh413wrli9pn7ygv9idrq5yvsi5q8c4bmnnxfig7c"))))
+      "1253zrpl59bwy6s71ip3f84k46m2wwid7ixgf72pzqrkkh5lcnkn"))))
 
 (define torbrowser-assets
   ;; This is a prebuilt Torbrowser from which we take the assets we need.
@@ -201,7 +201,7 @@
          version "/tor-browser-linux-x86_64-" version ".tar.xz"))
        (sha256
         (base32
-         "1v4jbgzw640lnsyxk275w62xdyqbw0p0fwvkzfawpg4d3pqp7fpw"))))
+         "0qcl9yqndnaqkvgmmb6f5rrzvwdr323l3r4s3hd9mwv9q1x41h3b"))))
     (arguments
      (list
       #:install-plan
@@ -237,7 +237,7 @@ Browser.")
          ".tar.xz"))
        (sha256
         (base32
-         "0lbarj4i21f6jkpk2ji1cmgv625yhqyjksln97zgbbki43bx09v6"))))
+         "0c7jfliznxfdfs5xrwwgib486vgpmpcvq4s54rxxcxfk633kgz67"))))
     (build-system mozilla-build-system)
     (inputs
      (list go-gitlab-torproject-org-tpo-anti-censorship-pluggable-transports-lyrebird
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index cbdd1a89a2..946b1f5aac 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -1131,8 +1131,8 @@ collaboration using typical untrusted file hosts or services.")
    (license license:gpl3+)))
 
 (define-public cgit
-  (let ((commit "793c420897e18eb3474c751d54cf4e0983f85433")
-        (rev "1"))
+  (let ((commit "8905003cba637e5b18069e625cd4f4c05ac30251")
+        (rev "2"))
     (package
       (name "cgit")
       ;; Update the ‘git-source’ input as well.
@@ -1144,7 +1144,7 @@ collaboration using typical untrusted file hosts or services.")
                       (commit commit)))
                 (sha256
                  (base32
-                  "1mhrm14wpqvralf9j33ih5ai6naiq3g2jg2z91gnw9dhh8f9ilwz"))
+                  "1ha8d2n59mv89vv4bqgg3dk82n1rqh8kd8y654vqx7v1v7m645qz"))
                 (file-name (git-file-name name version))))
       (build-system gnu-build-system)
       (arguments
@@ -1220,9 +1220,9 @@ collaboration using typical untrusted file hosts or services.")
              (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")
+             (uri "mirror://kernel.org/software/scm/git/git-2.44.0.tar.xz")
              (sha256
-              (base32 "1v3nkfm3gw8wr7595qy86qla8xyjvi85fmly4lfph4frfcz60ijl"))))
+              (base32 "1qqxd3pdsca6m93lxxkz9s06xs1sq0ah02lhrr0a6pjvrf6p6n73"))))
          ("bash-minimal" ,bash-minimal)
          ("openssl" ,openssl)
          ("python" ,python)
@@ -2900,13 +2900,13 @@ based on a manifest file published by servers.")
 (define-public patatt
   (package
     (name "patatt")
-    (version "0.4.9")
+    (version "0.6.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "patatt" version))
        (sha256
-        (base32 "0fpbkmdlnz9s1lakw11jlrzpz4mb6f4dksdiir9g1ppq0g34sy58"))))
+        (base32 "0a0a5ndlnv7dk2smn8algss6q17gbd6mc7yacz17c9cxabv2c24q"))))
     (build-system python-build-system)
     (arguments '(#:tests? #f))          ; No tests.
     (propagated-inputs
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 925f5ff83b..c4660c8998 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -162,6 +162,7 @@
   #:use-module (gnu packages man)
   #:use-module (gnu packages markup)
   #:use-module (gnu packages maths)
+  #:use-module (gnu packages messaging)
   #:use-module (gnu packages music)
   #:use-module (gnu packages mp3)
   #:use-module (gnu packages multiprecision)
@@ -2751,6 +2752,78 @@ possibility to play Youtube videos, download subtitles, remember
 the last played position, etc.")
     (license license:gpl2+)))
 
+(define-public jellyfin-mpv-shim
+  (package
+    (name "jellyfin-mpv-shim")
+    (version "2.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "jellyfin-mpv-shim" version))
+       (sha256
+        (base32 "1cy2sfv84k5nw8bqy4aa7v0hdawp7gk5s7wq850xizqk0sz7cipp"))))
+    (build-system python-build-system)
+    (arguments
+     (list
+      ;; There is no test suite, but the code is ill-behaved and tries
+      ;; to open network connections at module import time, which makes
+      ;; `python setup.py test' fail.
+      #:tests? #f
+      #:phases
+        #~(modify-phases %standard-phases
+           ;; sanity-check loads console_scripts endpoints, which launches
+           ;; the program, which makes the build hang. Disable it.
+           (delete 'sanity-check)
+           (add-after 'unpack 'disable-updates
+             (lambda _
+               (substitute* "jellyfin_mpv_shim/conf.py"
+                 (("check_updates: bool = True")
+                   "check_updates: bool = False")
+                 (("notify_updates: bool = True")
+                   "notify_updates: bool = False"))))
+           (add-after 'install 'install-desktop-file
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let* ((out (assoc-ref outputs "out"))
+                      (apps (string-append out "/share/applications"))
+                      (desktop-base "jellyfin_mpv_shim/integration/")
+                      (package-id
+                       "com.github.iwalton3.jellyfin-mpv-shim"))
+                 (for-each (lambda (size)
+                             (install-file (format #f
+                                                   "~ajellyfin-~a.png"
+                                                   desktop-base size) apps))
+                           '(256 128 64 48 32 16))
+                 (install-file (string-append desktop-base package-id
+                                              ".appdata.xml") apps)
+                 (install-file (string-append desktop-base package-id
+                                              ".desktop") apps)))))))
+    (inputs (list `(,python "tk")
+                  python-jellyfin-apiclient
+                  python-jinja2
+                  python-mpv
+                  python-mpv-jsonipc
+                  python-pypresence
+                  python-pystray
+                  python-requests))
+    (home-page "https://github.com/jellyfin/jellyfin-mpv-shim")
+    (synopsis "Cast media from Jellyfin Mobile and Web apps to MPV")
+    (description "Jellyfin MPV Shim is a cross-platform cast client for
+Jellyfin.  It has support for various media files without transcoding.")
+    (license (list
+              ;; jellyfin-mpv-shim
+              license:gpl3
+
+              ;; jellyfin-mpv-shim, and Anime4K, FSRCNNX, NVIDIA Image
+              ;; Scaling, AMD FidelityFX Super Resolution, AMD
+              ;; FidelityFX Contrast Adaptive Sharpening shaders.
+              license:expat
+
+              ;; Static Grain shader.
+              license:public-domain
+
+              ;; KrigBilatera, SSimDownscaler, and NNEDI3 shaders.
+              license:lgpl3+))))
+
 (define-public gallery-dl
   (package
     (name "gallery-dl")
diff --git a/gnu/packages/vim.scm b/gnu/packages/vim.scm
index 7cacdd5f06..6b5eaabf8e 100644
--- a/gnu/packages/vim.scm
+++ b/gnu/packages/vim.scm
@@ -86,7 +86,7 @@
 (define-public vim
   (package
     (name "vim")
-    (version "9.1.0059")
+    (version "9.1.0146")
     (source (origin
              (method git-fetch)
              (uri (git-reference
@@ -95,7 +95,7 @@
              (file-name (git-file-name name version))
              (sha256
               (base32
-               "146zhwhagdsbsh3h7f8h7izbzrwh3hgry4cx2lalq9s275qy3hzb"))))
+               "05lz8ai39p9ypk22n7qc7g21868m08pl12sn4028jshx5nxwy2zn"))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
@@ -116,7 +116,8 @@
                (("/bin/sh") (which "sh")))
              (substitute* "src/testdir/test_autocmd.vim"
                (("/bin/kill") (which "kill")))
-             (substitute* "src/if_cscope.c"
+             (substitute* '("runtime/syntax/sh.vim"
+                            "src/if_cscope.c")
                (("/bin/sh") (search-input-file inputs "/bin/sh")))))
          (add-before 'check 'set-environment-variables
            (lambda* (#:key inputs #:allow-other-keys)
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 040be69240..ddc673896b 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -3,10 +3,10 @@
 ;;; Copyright © 2013 Aljosha Papsch <misc@rpapsch.de>
 ;;; Copyright © 2014-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2015-2023 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015-2024 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018 Raoul Jean Pierre Bonnal <ilpuccio.febo@gmail.com>
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
-;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Eric Bavier <bavier@posteo.net>
+;;; Copyright © 2015-2020, 2024 Eric Bavier <bavier@posteo.net>
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
 ;;; Copyright © 2016 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2016 Jelle Licht <jlicht@fsfe.org>
@@ -4893,9 +4893,40 @@ their web site.")
                 "1p5i8wsi8q5fpq63i7n7ri1w1lnh4gpn17f88vhkbh14aah5wxj1"))))
     (properties '(("upstream-name" . "python-lambda-4dn")))
     (build-system pyproject-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'fix-pip-install
+            (lambda _
+              (substitute* "aws_lambda/aws_lambda.py"
+                ;; This package uses pip to install Python packages, wrap them
+                ;; up, and push them to AWS Lambda.  We need to reset
+                ;; GUIX_PYTHONPATH to avoid introducing package conflicts that
+                ;; would cause pip to fail.
+                (("(subprocess.call\\(\\[sys.executable.*'--no-cache-dir'\\])\\)" _ m)
+                 (string-append m ", env={\"GUIX_PYTHONPATH\":\""
+                                #$(this-package-input "python")
+                                "/lib/python"
+                                #$(version-major+minor
+                                   (package-version (this-package-input "python")))
+                                "/site-packages/\"})"))
+                ;; Zipfile uses the mtime of the temporary directory to build
+                ;; a zip file.  But the temp directory has a timestamp of 0,
+                ;; and zipfile refuses to build a zip archive dated before
+                ;; 1980.  So we reset the mtime of all temp files before they
+                ;; are added to the zip archive.
+                (("^( +)arcname = os.path.join" line indent)
+                 (string-append indent
+                                "os.utime(os.path.join(root, file), (315619200, 315619200))\n"
+                                line))))))))
+    (inputs (list python))
     (propagated-inputs
-     (list python-boto3 python-botocore python-docutils
-           python-six))
+     (list python-boto3
+           python-botocore
+           python-docutils
+           python-six
+           python-virtualenv))
     (home-page "https://github.com/4dn-dcic/python-lambda")
     (synopsis
      "Toolkit for developing and deploying Python code in AWS Lambda")
@@ -4967,8 +4998,8 @@ Cloud.")
     (license license:expat)))
 
 (define-public guix-data-service
-  (let ((commit "e13febc81706fbfb7f073bc4e9ce73fbc80d5180")
-        (revision "44"))
+  (let ((commit "5f80856ad1587aea38ee4e7b54db558cdb43f6b7")
+        (revision "45"))
     (package
       (name "guix-data-service")
       (version (string-append "0.0.1-" revision "." (string-take commit 7)))
@@ -4980,7 +5011,7 @@ Cloud.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "0pk86b44zg2yn73sxlcd9pqbz8xwprwzaib2npnq80y3yzc6qc22"))))
+                  "18m002d9pkh0qn4xn4n6lijl541m9z7c3lbapl7m6zi41p3dywww"))))
       (build-system gnu-build-system)
       (arguments
        (list
@@ -5428,7 +5459,7 @@ tools they trust (e.g. wget).")
 (define netsurf-buildsystem
   (package
     (name "netsurf-buildsystem")
-    (version "1.9")
+    (version "1.10")
     (source
      (origin
        (method url-fetch)
@@ -5436,7 +5467,7 @@ tools they trust (e.g. wget).")
                            "buildsystem-" version ".tar.gz"))
        (sha256
         (base32
-         "0alsmaig9ln8dgllb3z63gq90fiz75jz0ic71fi0k0k898qix14k"))))
+         "0yadmrpgvl9r08b56qiy5f77jracc7g9n4krn727fip4d7akjgix"))))
     (build-system gnu-build-system)
     (inputs `(("perl" ,perl)))
     (arguments
@@ -5467,7 +5498,7 @@ libraries.")
 (define-public libparserutils
   (package
     (name "libparserutils")
-    (version "0.2.4")
+    (version "0.2.5")
     (source
      (origin
        (method url-fetch)
@@ -5475,7 +5506,7 @@ libraries.")
                            name "-" version "-src.tar.gz"))
        (sha256
         (base32
-         "1n2794y2l0c8nv8z2pxwfnbn882987ifmxjv60zdxkhcndhswarj"))))
+         "0ffi5q1jlcdl66nk3cax0mnzvhrjvvjvlx0rfasjfygi333xazii"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem pkg-config perl))                 ;for test harness
@@ -5490,7 +5521,7 @@ C.  It is developed as part of the NetSurf project.")
 (define-public hubbub
   (package
     (name "hubbub")
-    (version "0.3.7")
+    (version "0.3.8")
     (source
      (origin
        (method url-fetch)
@@ -5498,15 +5529,14 @@ C.  It is developed as part of the NetSurf project.")
                            "libhubbub-" version "-src.tar.gz"))
        (sha256
         (base32
-         "1dimfyblmym98qa1b80c5jslv2zk8r44xbdrgrsrw1n9wr9y4yly"))
-       (patches (search-patches
-         "hubbub-sort-entities.patch"
-         "hubbub-maybe-uninitialized.patch"))))
+         "19fm5h8arnsgxd4w5vr9s2fcb422acciffar3la0b36lygsydhca"))
+       (patches (search-patches "hubbub-sort-entities.patch"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem
            pkg-config
            doxygen
+           gperf
            json-c-0.12 ; check whether json-c-0.12 can be removed
            perl))
     (propagated-inputs
@@ -5674,7 +5704,7 @@ developed as part of the Netsurf project.")
 (define-public libcss
   (package
     (name "libcss")
-    (version "0.9.1")
+    (version "0.9.2")
     (source
      (origin
        (method url-fetch)
@@ -5682,13 +5712,8 @@ developed as part of the Netsurf project.")
                            "libcss-" version "-src.tar.gz"))
        (sha256
         (base32
-         "1p66sdiiqm7w4jkq23hsf08khsnmq93hshh9f9m8sbirjdpf3p6j"))
-       (modules '((guix build utils)))
-       (snippet
-        '(begin
-           ;; This can be removed with the next release.
-           (substitute* "src/select/computed.c"
-             (("css_unit unit;") "css_unit unit = CSS_UNIT_PX;"))))))
+         "0khmf5bdpkc09fpsgwzi23sihpadvyr02jx0q5h1vm9lxjxibwid"))
+       (patches (search-patches "libcss-check-format.patch"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem pkg-config perl))
@@ -5705,7 +5730,7 @@ written in C.  It is developed as part of the NetSurf project.")
 (define-public libdom
   (package
     (name "libdom")
-    (version "0.4.1")
+    (version "0.4.2")                 ;TODO include patch for additional tags?
     (source
      (origin
        (method url-fetch)
@@ -5713,7 +5738,7 @@ written in C.  It is developed as part of the NetSurf project.")
                            "libdom-" version "-src.tar.gz"))
        (sha256
         (base32
-         "0jpg5hx3y0mdxk5szd47dyijqimd2321brbqk2620pp5f4j0gvlq"))))
+         "0g0gqcglk8f8gbygbcq5ylcx84zsf0vczbm3n3118w2l2splapnh"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem
@@ -5740,7 +5765,7 @@ developed as part of the NetSurf project.")
 (define-public libsvgtiny
   (package
     (name "libsvgtiny")
-    (version "0.1.7")
+    (version "0.1.8")
     (source
      (origin
        (method url-fetch)
@@ -5748,7 +5773,7 @@ developed as part of the NetSurf project.")
                            name "-" version "-src.tar.gz"))
        (sha256
         (base32
-         "10bpkmvfpydj74im3r6kqm9vnvgib6afy0alx71q5n0w5yawy39c"))))
+         "0750q884ax8wygl64wq03zdjj8h838ch3f8jdfkv4gz809zj4my3"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem pkg-config gperf-3.0))
@@ -5769,7 +5794,7 @@ project.")
 (define-public libnsbmp
   (package
     (name "libnsbmp")
-    (version "0.1.6")
+    (version "0.1.7")
     (source
      (origin
        (method url-fetch)
@@ -5777,7 +5802,7 @@ project.")
                            name "-" version "-src.tar.gz"))
        (sha256
         (base32
-         "0krjg69a2amxjsahdgm3wmy9ngnyr3gfs2a1zhdlbvb0z1jr7i3r"))))
+         "14r2v1ich4lxn3sdwpiwq5adydrd1qlhbd8mbamalaqj59laf1sl"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem))
@@ -5825,7 +5850,7 @@ operations.")
 (define-public libnsgif
   (package
     (name "libnsgif")
-    (version "0.2.1")
+    (version "1.0.0")
     (source
      (origin
        (method url-fetch)
@@ -5833,7 +5858,7 @@ operations.")
                            name "-" version "-src.tar.gz"))
        (sha256
         (base32
-         "0jwshypgmx16xlsbx3d8njk8a5khazlplca5mxd3rdbhrlsabbly"))))
+         "06q69hn0nz3c6hnwmzfcldyrppkvimx3s97ql3sx4m0lyr1ch530"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem))
@@ -5876,7 +5901,7 @@ client applications.  It is developed as part of the NetSurf project.")
 (define-public libnsutils
   (package
     (name "libnsutils")
-    (version "0.1.0")
+    (version "0.1.1")
     (source
      (origin
        (method url-fetch)
@@ -5884,7 +5909,7 @@ client applications.  It is developed as part of the NetSurf project.")
                            name "-" version "-src.tar.gz"))
        (sha256
         (base32
-         "1w5fyy2i60a3v3if3iqcn9sy9sycx6966rcx53v85gja6hb6a33r"))))
+         "14pakllwf7a205d0dkvyg8jhmqfbi5sh5riw840d13j5dr9b952n"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem))
@@ -5899,7 +5924,7 @@ developed as part of the NetSurf project.")
 (define-public libnspsl
   (package
     (name "libnspsl")
-    (version "0.1.6")
+    (version "0.1.7")
     (source
      (origin
        (method url-fetch)
@@ -5907,7 +5932,7 @@ developed as part of the NetSurf project.")
                            "libnspsl-" version "-src.tar.gz"))
        (sha256
         (base32
-         "02q28n5i6fwqcz1nn167rb71k1q95mx38mfah6zi1lvqrc2q5ifk"))))
+         "105cjkb622wz11z26il4j1n4ydyrrgv0nglr67aawpam5z1wx11n"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem))
@@ -5922,7 +5947,7 @@ Public Suffix List.  It is developed as part of the NetSurf project.")
 (define-public nsgenbind
   (package
     (name "nsgenbind")
-    (version "0.8")
+    (version "0.9")
     (source
      (origin
        (method url-fetch)
@@ -5930,7 +5955,7 @@ Public Suffix List.  It is developed as part of the NetSurf project.")
                            "nsgenbind-" version "-src.tar.gz"))
        (sha256
         (base32
-         "1cqwgwca49jvmijwiyaab2bwxicgxdrnlpinf8kp3nha02nm73ad"))))
+         "0p9q9ffn9hf1qrphz2qxq2xvyysn5kg2dbl8cbnkwb5wdkvf0b13"))))
     (build-system gnu-build-system)
     (native-inputs
      (list netsurf-buildsystem bison flex))
@@ -5948,7 +5973,7 @@ w3c webidl files and a binding configuration file.")
 (define-public netsurf
   (package
     (name "netsurf")
-    (version "3.10")
+    (version "3.11")
     (source
      (origin
        (method url-fetch)
@@ -5956,7 +5981,7 @@ w3c webidl files and a binding configuration file.")
                            "releases/source/netsurf-" version "-src.tar.gz"))
        (sha256
         (base32
-         "0plra64c5xyiw12yx2q13brxsv8apmany97zqa2lcqckw4ll8j1n"))
+         "1chw40nx7krpy7m14bajfrcj88h98if8py0k7c2qshpfxxm652n2"))
        (patches (search-patches "netsurf-system-utf8proc.patch"
                                 "netsurf-y2038-tests.patch"
                                 "netsurf-longer-test-timeout.patch"
@@ -6007,22 +6032,17 @@ w3c webidl files and a binding configuration file.")
          (add-after 'unpack 'remove-timestamps
            ;; Avoid embedding timestamp for reproducible builds
            (lambda _
-             (substitute* "utils/git-testament.pl"
+             (substitute* "tools/git-testament.pl"
                (("WT_COMPILEDATE ..$compiledate")
                 "WT_COMPILEDATE \\\""))))
          (add-after 'build 'adjust-welcome
            (lambda _
              (substitute* "frontends/gtk/res/welcome.html"
-             ;; Close some XHTML tags.
+               ;; Close some XHTML tags.
                (("<(img|input)([^>]*)>" _ tag contents)
                 (string-append "<" tag contents " />"))
                ;; Increase freedom.
-               ((" open source") ", free software")
-               ;; Prefer a more privacy-respecting default search engine.
-               (("www.google.co.uk") "www.duckduckgo.com/html")
-               (("Google Search") "DuckDuckGo Search")
-               (("name=\"btnG\"") ""))
-             ;; Remove default links so it doesn't seem we're endorsing them.
+               ((" open source") ", free software"))
              (with-atomic-file-replacement "frontends/gtk/res/welcome.html"
                (lambda (in out)
                  ;; Leave the DOCTYPE header as is.
@@ -6037,8 +6057,23 @@ w3c webidl files and a binding configuration file.")
                     ;; We'd like to use sxml-match here, but it can't
                     ;; match against generic tag symbols...
                     (match sxml
+                      ;; Remove default links so it doesn't seem we're
+                      ;; endorsing them.
                       (`(div (@ (class "links")) . ,rest)
                        '())
+                      ;; Prefer a more privacy-respecting default search
+                      ;; engine.
+                      (`(form . ,rest)
+                       `(form (@ (action "https://lite.duckduckgo.com/lite/")
+                                 (method "post"))
+                              (div (@ (class "websearch"))
+                                   (input (@ (type "text")
+                                             (size "42")
+                                             (name "q")
+                                             (autocomplete "off")
+                                             (value "")))
+                                   (input (@ (type "submit")
+                                             (value "DuckDuckGo Search"))))))
                       (`(ENTITY ,ent)
                        `(*ENTITY* ,ent))
                       ((x ...)
diff --git a/gnu/packages/webkit.scm b/gnu/packages/webkit.scm
index d359d01f98..bf24a65e83 100644
--- a/gnu/packages/webkit.scm
+++ b/gnu/packages/webkit.scm
@@ -127,13 +127,20 @@ engine that uses Wayland for graphics output.")
 (define-public webkitgtk
   (package
     (name "webkitgtk")
-    (version "2.42.4")
+    (version "2.42.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://www.webkitgtk.org/releases/"
                                   name "-" version ".tar.xz"))
               (sha256
-               (base32 "11pdcwmdj3i9aarrf7wsfvadi6jnkaf6zf7c5i2768x2plq8na2j"))
+               (base32 "0jg7c7z572afywwrnvdj3m5agaviv0vkqmzznnzzv30byb0phhmn"))
+              (snippet
+               #~(begin
+                   (use-modules (guix build utils))
+                   ;; https://bugs.webkit.org/show_bug.cgi?id=268739
+                   ;; Fix a FTBFS on i686, powerpc64le.
+                   (substitute* "Source/JavaScriptCore/llint/LowLevelInterpreter.cpp"
+                     (("UNUSED_VARIABLE\\(t[67]\\);") ""))))
               (patches (search-patches
                         "webkitgtk-adjust-bubblewrap-paths.patch"))))
     (build-system cmake-build-system)
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index 8ed3ed1107..edbb3096b8 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -1762,7 +1762,7 @@ modules for building a Wayland compositor.")
 (define-public sway
   (package
     (name "sway")
-    (version "1.8.1")
+    (version "1.9")
     (source
      (origin
        (method git-fetch)
@@ -1771,27 +1771,23 @@ modules for building a Wayland compositor.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1y7brfrsjnm9gksijgnr6zxqiqvn06mdiwsk5j87ggmxazxd66av"))))
+        (base32 "1n36vgpi4bg2gkiq4fam4khly1z9bjinmjclzq5vfx0z8h7a5bzz"))))
     (build-system meson-build-system)
     (arguments
-     `(;; elogind is propagated by wlroots -> libseat
-       ;; and would otherwise shadow basu.
-       #:configure-flags '("-Dsd-bus-provider=basu")
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'configure 'hardcode-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             ;; Hardcode path to swaybg.
-             (substitute* "sway/config.c"
-               (("strdup..swaybg..")
-                (string-append "strdup(\"" (assoc-ref inputs "swaybg")
-                               "/bin/swaybg\")")))
-             ;; Hardcode path to scdoc.
-             (substitute* "meson.build"
-               (("scdoc.get_pkgconfig_variable..scdoc..")
-                (string-append "'" (assoc-ref inputs "scdoc")
-                               "/bin/scdoc'")))
-             #t)))))
+     (list
+      ;; elogind is propagated by wlroots -> libseat
+      ;; and would otherwise shadow basu.
+      #:configure-flags
+      #~'("-Dsd-bus-provider=basu")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'configure 'hardcode-paths
+            (lambda* (#:key inputs #:allow-other-keys)
+              ;; Hardcode path to swaybg.
+              (substitute* "sway/config.c"
+                (("strdup..swaybg..")
+                 (format #f "strdup(\"~a\")"
+                         (search-input-file inputs "bin/swaybg")))))))))
     (inputs (list basu
                   cairo
                   gdk-pixbuf
@@ -1803,7 +1799,7 @@ modules for building a Wayland compositor.")
                   pcre2
                   swaybg
                   wayland
-                  wlroots-0.16))
+                  wlroots))
     (native-inputs
      (cons* linux-pam mesa pkg-config scdoc wayland-protocols
             (if (%current-target-system)
diff --git a/gnu/packages/xdisorg.scm b/gnu/packages/xdisorg.scm
index 86e5086867..c81c549736 100644
--- a/gnu/packages/xdisorg.scm
+++ b/gnu/packages/xdisorg.scm
@@ -2032,7 +2032,7 @@ by name.")
     (package
       (inherit rofi)
       (name "rofi-wayland")
-      (version "1.7.5+wayland2")
+      (version "1.7.5+wayland3")
       (source (origin
                 (method url-fetch)
                 (uri (string-append "https://github.com/lbonn/rofi"
@@ -2040,7 +2040,7 @@ by name.")
                                     "/rofi-" version ".tar.xz"))
                 (sha256
                  (base32
-                  "0l6rf8qwvawyh938pinl9fkwzjnq72xpa9a7lwk9jrr5lkk3h8yj"))))
+                  "11xiksh3m7yf3270kqf1jranlfh9q6rr8i99jvx4ak4azn4pwhpw"))))
       (build-system meson-build-system)
       (inputs
        (modify-inputs (package-inputs base)
diff --git a/gnu/packages/xiph.scm b/gnu/packages/xiph.scm
index b47c718fb6..9019029f24 100644
--- a/gnu/packages/xiph.scm
+++ b/gnu/packages/xiph.scm
@@ -13,6 +13,7 @@
 ;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot>
 ;;; Copyright © 2021 Matthew James Kraai <kraai@ftbfs.org>
 ;;; Copyright © 2021 Vinicius Monego <monego@posteo.net>
+;;; Copyright © 2024 Zheng Junjie <873216071@qq.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -45,9 +46,11 @@
   #:use-module (gnu packages xml)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
+  #:use-module (guix utils)
   #:use-module (guix download)
   #:use-module (guix git-download)
-  #:use-module (guix build-system gnu))
+  #:use-module (guix build-system gnu)
+  #:use-module (guix gexp))
 
 (define-public libogg
   (package
@@ -97,6 +100,8 @@ a fully open, non-proprietary, patent-and-royalty-free, general-purpose
 compressed audio format for mid to high quality (8kHz-48.0kHz, 16+ bit,
 polyphonic) audio and music at fixed and variable bitrates from 16 to
 128 kbps/channel.")
+   ;; This package shows a sizable speed increase when tuned.
+   (properties `((tunable? . #t)))
    (license (license:non-copyleft "file://COPYING"
                                "See COPYING in the distribution."))
    (home-page "https://xiph.org/vorbis/")))
@@ -115,7 +120,26 @@ polyphonic) audio and music at fixed and variable bitrates from 16 to
              (patches (search-patches "libtheora-config-guess.patch"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:configure-flags '("--disable-static")))
+     (append
+      (if (and (target-riscv64?)
+               (%current-target-system))
+          (list #:phases
+                #~(modify-phases %standard-phases
+                    (add-after 'unpack 'update-config
+                      (lambda* (#:key native-inputs inputs #:allow-other-keys)
+                        (for-each (lambda (file)
+                                    (install-file
+                                     (search-input-file
+                                      (or native-inputs inputs)
+                                      (string-append "/bin/" file)) "."))
+                                  '("config.guess" "config.sub"))))))
+          '())
+      (list #:configure-flags #~'("--disable-static"))))
+    (native-inputs
+     (if (and (target-riscv64?)
+              (%current-target-system))
+         (list config)
+         '()))
     (inputs (list libvorbis))
     ;; The .pc files refer to libogg.
     (propagated-inputs (list libogg))
@@ -345,6 +369,8 @@ is unmatched for interactive speech and music transmission over the Internet,
 but is also intended for storage and streaming applications.  It is
 standardized by the Internet Engineering Task Force (IETF) as RFC 6716 which
 incorporated technology from Skype's SILK codec and Xiph.Org's CELT codec.")
+    ;; This package shows a sizable speed increase when tuned.
+    (properties `((tunable? . #t)))
     (license license:bsd-3)
     (home-page "https://www.opus-codec.org")))
 
diff --git a/gnu/services/virtualization.scm b/gnu/services/virtualization.scm
index 7b04ddb35e..fc5adb94d0 100644
--- a/gnu/services/virtualization.scm
+++ b/gnu/services/virtualization.scm
@@ -1220,10 +1220,13 @@ authpriv.*;auth.info                    /var/log/secure
                        ;; pre-initialized /etc/guix/acl file in the VM.  Thus,
                        ;; clear 'authorize-key?' so that it's not overridden
                        ;; at activation time.
+                       ;; Since it's used for offloading, disable substitutes
+                       ;; (this avoids network issues).
                        (guix-service-type config =>
                                           (guix-configuration
                                            (inherit config)
-                                           (authorize-key? #f)))
+                                           (authorize-key? #f)
+                                           (use-substitutes? #f)))
                        (syslog-service-type config =>
                                             (syslog-configuration
                                              (config-file
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 58e95a1312..6236d25b9d 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -132,15 +132,27 @@ MODULES and taken from LINUX."
         #~(begin
             (use-modules (gnu build linux-modules)
                          (guix build utils)
+                         (rnrs io ports)
                          (srfi srfi-1)
                          (srfi srfi-26))
 
             (define module-dir
               (string-append #$linux "/lib/modules"))
 
+            (define builtin-modules
+              (call-with-input-file
+                  (first (find-files module-dir "modules.builtin$"))
+                (lambda (port)
+                  (map file-name->module-name
+                       (string-tokenize
+                        (get-string-all port))))))
+
+            (define modules-to-lookup
+              (lset-difference string=? '#$modules builtin-modules))
+
             (define modules
               (let* ((lookup  (cut find-module-file module-dir <>))
-                     (modules (map lookup '#$modules)))
+                     (modules (map lookup modules-to-lookup)))
                 (append modules
                         (recursive-module-dependencies
                          modules
diff --git a/guix/build/bzr.scm b/guix/build/bzr.scm
index a0f5e15880..dede5e031a 100644
--- a/guix/build/bzr.scm
+++ b/guix/build/bzr.scm
@@ -37,6 +37,7 @@ revision identifier.  Return #t on success, else throw an exception."
   (invoke bzr-command "-Ossl.cert_reqs=none" "checkout"
           "--lightweight" "-r" revision url directory)
   (with-directory-excursion directory
-    (delete-file-recursively ".bzr")))
+    (delete-file-recursively ".bzr"))
+  #t)
 
 ;;; bzr.scm ends here
diff --git a/guix/build/download-nar.scm b/guix/build/download-nar.scm
index 3ba121b7fb..f26ad28cd0 100644
--- a/guix/build/download-nar.scm
+++ b/guix/build/download-nar.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2017, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2017, 2019, 2020, 2024 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -57,9 +57,9 @@ ITEM."
       (restore-file decompressed-port
                     item))))
 
-(define (download-nar item)
-  "Download and extract the normalized archive for ITEM.  Return #t on
-success, #f otherwise."
+(define* (download-nar item #:optional (output item))
+  "Download and extract to OUTPUT the normalized archive for ITEM, a store
+item.  Return #t on success, #f otherwise."
   ;; Let progress reports go through.
   (setvbuf (current-error-port) 'none)
   (setvbuf (current-output-port) 'none)
@@ -96,10 +96,10 @@ success, #f otherwise."
                                              #:download-size size)))
                  (if (string-contains url "/lzip")
                      (restore-lzipped-nar port-with-progress
-                                          item
+                                          output
                                           size)
                      (restore-file port-with-progress
-                                   item)))
+                                   output)))
                (newline)
                #t))))
       (()
diff --git a/guix/build/download.scm b/guix/build/download.scm
index db0a39084b..74b7486b7b 100644
--- a/guix/build/download.scm
+++ b/guix/build/download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012-2022 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012-2022, 2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2021 Timothy Sample <samplet@ngyro.com>
@@ -40,7 +40,10 @@
   #:autoload   (guix swh) (swh-download-directory %verify-swh-certificate?)
   #:use-module (ice-9 match)
   #:use-module (ice-9 format)
-  #:export (open-socket-for-uri
+  #:export (%download-methods
+            download-method-enabled?
+
+            open-socket-for-uri
             open-connection-for-uri
             http-fetch
             %x509-certificate-directory
@@ -622,6 +625,20 @@ true, verify HTTPS certificates; otherwise simply ignore them."
     (lambda (key . args)
       (print-exception (current-error-port) #f key args))))
 
+(define %download-methods
+  ;; Either #f (the default) or a list of symbols denoting the sequence of
+  ;; download methods to be used--e.g., '(swh nar upstream).
+  (make-parameter
+   (and=> (getenv "GUIX_DOWNLOAD_METHODS")
+          (lambda (str)
+            (map string->symbol (string-tokenize str))))))
+
+(define (download-method-enabled? method)
+  "Return true if METHOD (a symbol such as 'swh) is enabled as part of the
+download fallback sequence."
+  (or (not (%download-methods))
+      (memq method (%download-methods))))
+
 (define (uri-vicinity dir file)
   "Concatenate DIR, slash, and FILE, keeping only one slash in between.
 This is required by some HTTP servers."
@@ -788,18 +805,28 @@ otherwise simply ignore them."
                          hashes)))
                 disarchive-mirrors))
 
+  (define initial-uris
+    (append (if (download-method-enabled? 'upstream)
+                uri
+                '())
+            (if (download-method-enabled? 'content-addressed-mirrors)
+                content-addressed-uris
+                '())
+            (if (download-method-enabled? 'internet-archive)
+                (match uri
+                  ((first . _)
+                   (or (and=> (internet-archive-uri first) list)
+                       '()))
+                  (() '()))
+                '())))
+
   ;; Make this unbuffered so 'progress-report/file' works as expected.  'line
   ;; means '\n', not '\r', so it's not appropriate here.
   (setvbuf (current-output-port) 'none)
 
   (setvbuf (current-error-port) 'line)
 
-  (let try ((uri (append uri content-addressed-uris
-                   (match uri
-                     ((first . _)
-                      (or (and=> (internet-archive-uri first) list)
-                          '()))
-                     (() '())))))
+  (let try ((uri initial-uris))
     (match uri
       ((uri tail ...)
        (or (fetch uri file)
@@ -807,9 +834,10 @@ otherwise simply ignore them."
       (()
        ;; If we are looking for a software archive, one last thing we
        ;; can try is to use Disarchive to assemble it.
-       (or (disarchive-fetch/any disarchive-uris file
-                                 #:verify-certificate? verify-certificate?
-                                 #:timeout timeout)
+       (or (and (download-method-enabled? 'disarchive)
+                (disarchive-fetch/any disarchive-uris file
+                                      #:verify-certificate? verify-certificate?
+                                      #:timeout timeout))
            (begin
              (format (current-error-port) "failed to download ~s from ~s~%"
                      file url)
diff --git a/guix/build/git.scm b/guix/build/git.scm
index 4c69365a7b..62877394bb 100644
--- a/guix/build/git.scm
+++ b/guix/build/git.scm
@@ -19,6 +19,8 @@
 
 (define-module (guix build git)
   #:use-module (guix build utils)
+  #:use-module ((guix build download)
+                #:select (download-method-enabled?))
   #:autoload   (guix build download-nar) (download-nar)
   #:autoload   (guix swh) (%verify-swh-certificate?
                            swh-download
@@ -92,25 +94,30 @@ fetched, recursively.  Return #t on success, #f otherwise."
 
 
 (define* (git-fetch-with-fallback url commit directory
-                                  #:key (git-command "git")
+                                  #:key (item directory)
+                                  (git-command "git")
                                   hash hash-algorithm
                                   lfs? recursive?)
   "Like 'git-fetch', fetch COMMIT from URL into DIRECTORY, but fall back to
-alternative methods when fetching from URL fails: attempt to download a nar,
-and if that also fails, download from the Software Heritage archive.  When
-HASH and HASH-ALGORITHM are provided, they are interpreted as the nar hash of
-the directory of interested and are used as its content address at SWH."
-  (or (git-fetch url commit directory
-                 #:lfs? lfs?
-                 #:recursive? recursive?
-                 #:git-command git-command)
-      (download-nar directory)
+alternative methods when fetching from URL fails: attempt to download a nar
+for ITEM, and if that also fails, download from the Software Heritage archive.
+When HASH and HASH-ALGORITHM are provided, they are interpreted as the nar
+hash of the directory of interested and are used as its content address at
+SWH."
+  (or (and (download-method-enabled? 'upstream)
+           (git-fetch url commit directory
+                      #:lfs? lfs?
+                      #:recursive? recursive?
+                      #:git-command git-command))
+      (and (download-method-enabled? 'nar)
+           (download-nar item directory))
 
       ;; As a last resort, attempt to download from Software Heritage.
       ;; Disable X.509 certificate verification to avoid depending
       ;; on nss-certs--we're authenticating the checkout anyway.
       ;; XXX: Currently recursive checkouts are not supported.
       (and (not recursive?)
+           (download-method-enabled? 'swh)
            (parameterize ((%verify-swh-certificate? #f))
              (format (current-error-port)
                      "Trying to download from Software Heritage...~%")
diff --git a/guix/build/guile-build-system.scm b/guix/build/guile-build-system.scm
index e7e7f2d0be..8927da224a 100644
--- a/guix/build/guile-build-system.scm
+++ b/guix/build/guile-build-system.scm
@@ -184,39 +184,38 @@ installed; this is useful for files that are meant to be included."
                              (#f "")
                              (path (string-append ":" path)))))
 
-  (let ((source-files
+    (let ((source-files
            (with-directory-excursion source-directory
              (find-files "." scheme-file-regexp))))
-    (invoke-each
-     (filter-map (lambda (file)
-                   (and (or (not not-compiled-file-regexp)
-                            (not (string-match not-compiled-file-regexp
-                                               file)))
-                        (cons* guild
-                               "guild" "compile"
-                               "-L" source-directory
-                               "-o" (string-append go-dir
-                                                   (file-sans-extension file)
-                                                   ".go")
-                               (string-append source-directory "/" file)
-                               flags)))
-                 source-files)
-     #:max-processes (parallel-job-count)
-     #:report-progress report-build-progress)
-
-    (for-each
-     (lambda (file)
+      (for-each
+       (lambda (file)
          (install-file (string-append source-directory "/" file)
                        (string-append module-dir
                                       "/" (dirname file))))
-     source-files))
+       source-files)
+      (invoke-each
+       (filter-map (lambda (file)
+                     (and (or (not not-compiled-file-regexp)
+                              (not (string-match not-compiled-file-regexp
+                                                 file)))
+                          (cons* guild
+                                 "guild" "compile"
+                                 "-L" source-directory
+                                 "-o" (string-append go-dir
+                                                     (file-sans-extension file)
+                                                     ".go")
+                                 (string-append source-directory "/" file)
+                                 flags)))
+                   source-files)
+       #:max-processes (parallel-job-count)
+       #:report-progress report-build-progress))
     #t))
 
 (define* (install-documentation #:key outputs
                                 (documentation-file-regexp
                                  %documentation-file-regexp)
                                 #:allow-other-keys)
-  "Install files that mactch DOCUMENTATION-FILE-REGEXP."
+  "Install files that match DOCUMENTATION-FILE-REGEXP."
   (let* ((out (assoc-ref outputs "out"))
          (doc (string-append out "/share/doc/"
                              (strip-store-file-name out))))
diff --git a/guix/build/rakudo-build-system.scm b/guix/build/rakudo-build-system.scm
index 5cf1cc55bc..8f9a3b11d8 100644
--- a/guix/build/rakudo-build-system.scm
+++ b/guix/build/rakudo-build-system.scm
@@ -36,7 +36,11 @@
 (define* (check #:key tests? inputs with-prove6? #:allow-other-keys)
   (if (and tests? (assoc-ref inputs "perl6-tap-harness"))
   ;(if (and tests? with-prove6?)
-      (invoke "prove6" "-I=lib" "t/")
+      (let ((test-files (find-files "t/" "\\.(rakutest|t|t6)$")))
+        (invoke "raku" "-MTAP" "-e"
+                (string-append
+                 "my @tests = <" (string-join test-files " ") ">; "
+                 "TAP::Harness.new().run(@tests);")))
       (format #t "test suite not run~%"))
   #t)
 
@@ -59,7 +63,7 @@
           #t)
         (begin
           (let ((inst (string-append (assoc-ref inputs "rakudo")
-                                     "/share/perl6/tools/install-dist.p6")))
+                                     "/share/perl6/tools/install-dist.raku")))
             (setenv "RAKUDO_RERESOLVE_DEPENDENCIES" "0")
             (setenv "RAKUDO_MODULE_DEBUG" "1") ; be verbose while building
             (invoke inst (string-append "--to=" perl6) "--for=site"))))))
diff --git a/guix/bzr-download.scm b/guix/bzr-download.scm
index d97f84838e..a22c9bee99 100644
--- a/guix/bzr-download.scm
+++ b/guix/bzr-download.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2024 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -23,7 +24,7 @@
   #:use-module (guix packages)
   #:use-module (guix records)
   #:use-module (guix store)
-
+  #:use-module (ice-9 match)
   #:export (bzr-reference
             bzr-reference?
             bzr-reference-url
@@ -51,20 +52,46 @@
     (module-ref distro 'breezy)))
 
 (define* (bzr-fetch ref hash-algo hash
-                       #:optional name
-                       #:key (system (%current-system)) (guile (default-guile))
-                       (bzr (bzr-package)))
+                    #:optional name
+                    #:key (system (%current-system)) (guile (default-guile))
+                    (bzr (bzr-package)))
   "Return a fixed-output derivation that fetches REF, a <bzr-reference>
 object.  The output is expected to have recursive hash HASH of type
 HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
+  (define guile-json
+    (module-ref (resolve-interface '(gnu packages guile)) 'guile-json-4))
+
+  (define guile-lzlib
+    (module-ref (resolve-interface '(gnu packages guile)) 'guile-lzlib))
+
+  (define guile-gnutls
+    (module-ref (resolve-interface '(gnu packages tls)) 'guile-gnutls))
+
   (define build
-    (with-imported-modules (source-module-closure
-                            '((guix build bzr)))
-      #~(begin
-          (use-modules (guix build bzr))
-          (bzr-fetch
-           (getenv "bzr url") (getenv "bzr reference") #$output
-           #:bzr-command (string-append #+bzr "/bin/brz")))))
+    (with-extensions (list guile-gnutls guile-lzlib guile-json)
+      (with-imported-modules (source-module-closure
+                              '((guix build bzr)
+                                (guix build utils)
+                                (guix build download)
+                                (guix build download-nar)))
+        #~(begin
+            (use-modules (guix build bzr)
+                         (guix build download-nar)
+                         ((guix build download)
+                          #:select (download-method-enabled?))
+                         (guix build utils)
+                         (srfi srfi-34))
+
+            (or (and (download-method-enabled? 'upstream)
+                     (guard (c ((invoke-error? c)
+                                (report-invoke-error c)
+                                #f))
+                       (bzr-fetch (getenv "bzr url") (getenv "bzr reference")
+                                  #$output
+                                  #:bzr-command
+                                  (string-append #+bzr "/bin/brz"))))
+                (and (download-method-enabled? 'nar)
+                     (download-nar #$output)))))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "bzr-branch") build
@@ -74,12 +101,16 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                       #:script-name "bzr-download"
                       #:env-vars
                       `(("bzr url" . ,(bzr-reference-url ref))
-                        ("bzr reference" . ,(bzr-reference-revision ref)))
+                        ("bzr reference" . ,(bzr-reference-revision ref))
+                        ,@(match (getenv "GUIX_DOWNLOAD_METHODS")
+                            (#f '())
+                            (value
+                             `(("GUIX_DOWNLOAD_METHODS" . ,value)))))
                       #:leaked-env-vars '("http_proxy" "https_proxy"
                                           "LC_ALL" "LC_MESSAGES" "LANG"
                                           "COLUMNS")
                       #:system system
-                      #:local-build? #t  ;don't offload repo branching
+                      #:local-build? #t          ;don't offload repo branching
                       #:hash-algo hash-algo
                       #:hash hash
                       #:recursive? #t
diff --git a/guix/cpu.scm b/guix/cpu.scm
index 29ad883584..840215cff0 100644
--- a/guix/cpu.scm
+++ b/guix/cpu.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2021 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2022, 2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2022-2024 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -113,7 +113,7 @@
   "Return the architecture name, suitable for GCC's '-march' flag, that
 corresponds to CPU, a record as returned by 'current-cpu'."
   (match (cpu-architecture cpu)
-    ("x86_64"
+    ((or "x86_64" "i686")
      ;; Transcribed from GCC's 'host_detect_local_cpu' in driver-i386.cc.
      (letrec-syntax ((if-flags (syntax-rules (=>)
                                  ((_)
@@ -128,18 +128,21 @@ corresponds to CPU, a record as returned by 'current-cpu'."
 
        (or (and (equal? "GenuineIntel" (cpu-vendor cpu))
                 (= 6 (cpu-family cpu))              ;the "Pentium Pro" family
-                (if-flags ("avx" "raoint" => "grandridge")
-                          ("avx" "amx_fp16" => "graniterapids")
+                (if-flags ("avx512f" "amx_complex" => "graniterapids-d")
+                          ("avx512f" "amx_fp16" => "graniterapids")
+                          ("avx512f" "avx512vp2intersect" => "tigerlake")
+                          ("avx512f" "tsxldtrk" => "sapphirerapids")
+                          ("avx512f" "avx512bf16" => "cooperlake")
+                          ("avx512f" "wbnoinvd" => "icelake-server")
+                          ("avx512f" "avx512bitalg" => "icelake-client")
+                          ("avx512f" "avx512vbmi" => "cannonlake")
+                          ("avx512f" "avx5124vnniw" => "knm")
+                          ("avx512f" "avx512er" => "knl")
+                          ("avx512f" => "skylake-avx512")
+                          ("avx" "prefetchi" => "pantherlake")
+                          ("avx" "user_msr" => "clearwaterforest")
+                          ("avx" "sm3" => "arrowlake-s")
                           ("avx" "avxvnniint8" => "sierraforest")
-                          ("avx" "avx512vp2intersect" => "tigerlake")
-                          ("avx" "tsxldtrk" => "sapphirerapids")
-                          ("avx" "avx512bf16" => "cooperlake")
-                          ("avx" "wbnoinvd" => "icelake-server")
-                          ("avx" "avx512bitalg" => "icelake-client")
-                          ("avx" "avx512vbmi" => "cannonlake")
-                          ("avx" "avx5124vnniw" => "knm")
-                          ("avx" "avx512er" => "knl")
-                          ("avx" "avx512f" => "skylake-avx512")
                           ("avx" "serialize" => "alderlake")
                           ("avx" "clflushopt" => "skylake")
                           ("avx" "adx" => "broadwell")
@@ -190,10 +193,16 @@ corresponds to CPU, a record as returned by 'current-cpu'."
                     (= #x3b (cpu-model cpu)))
              "lujiazui"
              (cpu->micro-architecture-level cpu))
+           (if (and (= 7 (cpu-family cpu))
+                    (>= #x5b (cpu-model cpu)))
+             "yongfeng"
+             (cpu->micro-architecture-level cpu))
 
          ;; TODO: Recognize CENTAUR/CYRIX/NSC?
 
-         "x86_64")))
+         (match (cpu-architecture cpu)
+           ("x86_64" "x86-64")
+           (_ "generic")))))
     ("aarch64"
      ;; Transcribed from GCC's list of aarch64 processors in aarch64-cores.def
      ;; What to do with big.LITTLE cores?
@@ -210,7 +219,9 @@ corresponds to CPU, a record as returned by 'current-cpu'."
           (#xd15
            "armv8-r")
           ((or #xd46 #xd47 #xd4d #xd48 #xd4e #xd49 #xd4f)
-           "armv9-a")))
+           "armv9-a")
+          ((or #xd80 #xd81)
+           "armv9.2-a")))
        ("0x42"
         "armv8.1-a")
        ("0x43"
@@ -241,8 +252,14 @@ corresponds to CPU, a record as returned by 'current-cpu'."
         "armv8-a")
        ("0x68"
         "armv8-a")
+       ("0x6d"
+        "armv9-a")
        ("0xC0"
-        "armv8.6-a")
+        (match (cpu-model cpu)
+          ((or #xac3 #xac4)
+           "armv8.6-a")
+          (#xac5
+           "armv8.7-a")))
        ("0xC00"
         "armv8-a")
        (_
@@ -275,12 +292,12 @@ correspond roughly to CPU, a record as returned by 'current-cpu'."
              ;; v2: CMPXCHG16B, LAHF, SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3
              ("avx512f" "avx512bw" "abx512cd" "abx512dq" "avx512vl"
               "avx" "avx2" "bmi1" "bmi2" "f16c" "fma" "movbe"
-              "popcnt" "sse3" "sse4_1" "sse4_2" "ssse3" => "x86_64-v4")
+              "popcnt" "sse3" "sse4_1" "sse4_2" "ssse3" => "x86-64-v4")
              ("avx" "avx2" "bmi1" "bmi2" "f16c" "fma" "movbe"
-              "popcnt" "sse3" "sse4_1" "sse4_2" "ssse3" => "x86_64-v3")
-             ("popcnt" "sse3" "sse4_1" "sse4_2" "ssse3" => "x86_64-v2")
-             (_ => "x86_64-v1")))
-         "x86_64-v1"))
+              "popcnt" "sse3" "sse4_1" "sse4_2" "ssse3" => "x86-64-v3")
+             ("popcnt" "sse3" "sse4_1" "sse4_2" "ssse3" => "x86-64-v2")
+             (_ => "x86-64")))
+         "x86-64"))
     (architecture
      ;; TODO: More architectures
      architecture)))
@@ -289,19 +306,22 @@ correspond roughly to CPU, a record as returned by 'current-cpu'."
   "Return a matching psABI micro-architecture, allowing optimizations for x86_64
 CPUs for compilers which don't allow for more focused optimizing."
   ;; Matching gcc-architectures isn't an easy task, with the rule-of-thumb being
-  ;; 'Haswell and higher' qualify for x86_64-v3.
+  ;; AVX512F+ for x86-64-v4, AVX+ for x86-64-v3.
   ;; https://gitlab.com/x86-psABIs/x86-64-ABI/-/blob/master/x86-64-ABI/low-level-sys-info.tex
   (match gcc-architecture
-    ((or "grandridge" "graniterapids" "sierraforest" "tigerlake"
-         "sapphirerapids" "cooperlake" "icelake-server" "icelake-client"
-         "cannonlake" "knm" "knl" "skylake-avx512" "alderlake" "skylake"
-         "broadwell" "haswell"
-         "znver4" "znver3" "znver2" "znver1" "bdver4")
-     "x86_64-v3")
+    ((or "graniterapids-d" "graniterapids" "tigerlake" "sapphirerapids"
+         "cooperlake" "icelake-server" "icelake-client" "cannonlake" "knm"
+         "knl" "skylake-avx512"
+         "znver4")
+     "x86-64-v4")
+    ((or "pantherlake" "clearwaterforest" "arrowlake-s" "sierraforest"
+         "alderlake" "skylake" "broadwell" "haswell"
+         "znver3" "znver2" "znver1" "bdver4")
+     "x86-64-v3")
     ((or "sandybridge" "tremont" "goldmont-plus" "goldmont" "silvermont"
          "nehalem" "bonnell" "core2"
          "btver2" "athalon" "k8-sse3" "k8" "bdver3" "bdver2" "bdver1" "btver1"
          "amdfam10"
-         "lujiazui" "x86-64")
-     "x86_64-v1")
+         "lujiazui" "yongfeng" "x86-64")
+     "x86-64")
     (_ gcc-architecture)))
diff --git a/guix/cvs-download.scm b/guix/cvs-download.scm
index c0c526b9db..023054941b 100644
--- a/guix/cvs-download.scm
+++ b/guix/cvs-download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014-2017, 2019, 2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;;
@@ -73,6 +73,7 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
   (define modules
     (delete '(guix config)
             (source-module-closure '((guix build cvs)
+                                     (guix build download)
                                      (guix build download-nar)))))
   (define build
     (with-imported-modules modules
@@ -80,20 +81,29 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                              guile-lzlib)
         #~(begin
             (use-modules (guix build cvs)
+                         ((guix build download)
+                          #:select (download-method-enabled?))
                          (guix build download-nar))
 
-            (or (cvs-fetch '#$(cvs-reference-root-directory ref)
-                           '#$(cvs-reference-module ref)
-                           '#$(cvs-reference-revision ref)
-                           #$output
-                           #:cvs-command (string-append #+cvs "/bin/cvs"))
-                (download-nar #$output))))))
+            (or (and (download-method-enabled? 'upstream)
+                     (cvs-fetch '#$(cvs-reference-root-directory ref)
+                                '#$(cvs-reference-module ref)
+                                '#$(cvs-reference-revision ref)
+                                #$output
+                                #:cvs-command
+                                #+(file-append cvs "/bin/cvs")))
+                (and (download-method-enabled? 'nar)
+                     (download-nar #$output)))))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "cvs-checkout") build
                       #:leaked-env-vars '("http_proxy" "https_proxy"
                                           "LC_ALL" "LC_MESSAGES" "LANG"
                                           "COLUMNS")
+                      #:env-vars (match (getenv "GUIX_DOWNLOAD_METHODS")
+                                   (#f '())
+                                   (value
+                                    `(("GUIX_DOWNLOAD_METHODS" . ,value))))
                       #:system system
                       #:hash-algo hash-algo
                       #:hash hash
diff --git a/guix/download.scm b/guix/download.scm
index 21d02ab203..3dfe143e9f 100644
--- a/guix/download.scm
+++ b/guix/download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012-2021, 2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
@@ -35,9 +35,9 @@
   #:use-module (web uri)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
-  #:export (%mirrors
+  #:export (%download-methods
+            %mirrors
             %disarchive-mirrors
-            %download-fallback-test
             (url-fetch* . url-fetch)
             url-fetch/executable
             url-fetch/tarbomb
@@ -434,10 +434,19 @@
 (define built-in-builders*
   (store-lift built-in-builders))
 
+(define %download-methods
+  ;; Either #f (the default) or a list of symbols denoting the sequence of
+  ;; download methods to be used--e.g., '(swh nar upstream).
+  (make-parameter
+   (and=> (getenv "GUIX_DOWNLOAD_METHODS")
+          (lambda (str)
+            (map string->symbol (string-tokenize str))))))
+
 (define* (built-in-download file-name url
                             #:key system hash-algo hash
                             mirrors content-addressed-mirrors
                             disarchive-mirrors
+                            (download-methods (%download-methods))
                             executable?
                             (guile 'unused))
   "Download FILE-NAME from URL using the built-in 'download' builder.  When
@@ -471,6 +480,11 @@ download by itself using its own dependencies."
                                  ("disarchive-mirrors" . ,disarchive-mirrors)
                                  ,@(if executable?
                                        '(("executable" . "1"))
+                                       '())
+                                 ,@(if download-methods
+                                       `(("download-methods"
+                                          . ,(object->string
+                                              download-methods)))
                                        '()))
 
                     ;; Do not offload this derivation because we cannot be
@@ -479,24 +493,6 @@ download by itself using its own dependencies."
                     ;; for that built-in is widespread.
                     #:local-build? #t)))
 
-(define %download-fallback-test
-  ;; Define whether to test one of the download fallback mechanism.  Possible
-  ;; values are:
-  ;;
-  ;;   - #f, to use the normal download methods, not trying to exercise the
-  ;;     fallback mechanism;
-  ;;
-  ;;   - 'none, to disable all the fallback mechanisms;
-  ;;
-  ;;   - 'content-addressed-mirrors, to purposefully attempt to download from
-  ;;     a content-addressed mirror;
-  ;;
-  ;;   - 'disarchive-mirrors, to download from Disarchive + Software Heritage.
-  ;;
-  ;; This is meant to be used for testing purposes.
-  (make-parameter (and=> (getenv "GUIX_DOWNLOAD_FALLBACK_TEST")
-                         string->symbol)))
-
 (define* (url-fetch* url hash-algo hash
                      #:optional name
                      #:key (system (%current-system))
@@ -532,10 +528,7 @@ name in the store."
           (unless (member "download" builtins)
             (error "'guix-daemon' is too old, please upgrade" builtins))
 
-          (built-in-download (or name file-name)
-                             (match (%download-fallback-test)
-                               ((or #f 'none) url)
-                               (_ "https://example.org/does-not-exist"))
+          (built-in-download (or name file-name) url
                              #:guile guile
                              #:system system
                              #:hash-algo hash-algo
@@ -543,15 +536,9 @@ name in the store."
                              #:executable? executable?
                              #:mirrors %mirror-file
                              #:content-addressed-mirrors
-                             (match (%download-fallback-test)
-                               ((or #f 'content-addressed-mirrors)
-                                %content-addressed-mirror-file)
-                               (_ %no-mirrors-file))
+                             %content-addressed-mirror-file
                              #:disarchive-mirrors
-                             (match (%download-fallback-test)
-                               ((or #f 'disarchive-mirrors)
-                                %disarchive-mirror-file)
-                               (_ %no-disarchive-mirrors-file)))))))
+                             %disarchive-mirror-file)))))
 
 (define* (url-fetch/executable url hash-algo hash
                                #:optional name
diff --git a/guix/git-download.scm b/guix/git-download.scm
index aadcbd234c..d26a814e07 100644
--- a/guix/git-download.scm
+++ b/guix/git-download.scm
@@ -29,8 +29,8 @@
   #:use-module (guix packages)
   #:use-module (guix modules)
   #:use-module ((guix derivations) #:select (raw-derivation))
+  #:autoload   (guix download) (%download-methods)
   #:autoload   (guix build-system gnu) (standard-packages)
-  #:autoload   (guix download) (%download-fallback-test)
   #:autoload   (git bindings)   (libgit2-init!)
   #:autoload   (git repository) (repository-open
                                  repository-close!
@@ -180,11 +180,7 @@ respective documentation."
                       ;; downloads.
                       #:script-name "git-download"
                       #:env-vars
-                      `(("git url" . ,(match (%download-fallback-test)
-                                        ('content-addressed-mirrors
-                                         "https://example.org/does-not-exist")
-                                        (_
-                                         (git-reference-url ref))))
+                      `(("git url" . ,(git-reference-url ref))
                         ("git commit" . ,(git-reference-commit ref))
                         ("git recursive?" . ,(object->string
                                               (git-reference-recursive? ref)))
@@ -246,14 +242,14 @@ download by itself using its own dependencies."
                   #:recursive? #t
                   #:env-vars
                   `(("url" . ,(object->string
-                               (match (%download-fallback-test)
-                                 ('content-addressed-mirrors
-                                  "https://example.org/does-not-exist")
-                                 (_
-                                  (git-reference-url ref)))))
+                               (git-reference-url ref)))
                     ("commit" . ,(git-reference-commit ref))
                     ("recursive?" . ,(object->string
-                                      (git-reference-recursive? ref))))
+                                      (git-reference-recursive? ref)))
+                    ,@(if (%download-methods)
+                          `(("download-methods"
+                             . ,(object->string (%download-methods))))
+                          '()))
                   #:leaked-env-vars '("http_proxy" "https_proxy"
                                       "LC_ALL" "LC_MESSAGES" "LANG"
                                       "COLUMNS")
diff --git a/guix/hg-download.scm b/guix/hg-download.scm
index 6d02de47e4..55d908817f 100644
--- a/guix/hg-download.scm
+++ b/guix/hg-download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014-2017, 2019, 2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
 ;;;
@@ -84,6 +84,7 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
   (define modules
     (delete '(guix config)
             (source-module-closure '((guix build hg)
+                                     (guix build download)
                                      (guix build download-nar)
                                      (guix swh)))))
 
@@ -94,6 +95,8 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
         #~(begin
             (use-modules (guix build hg)
                          (guix build utils) ;for `set-path-environment-variable'
+                         ((guix build download)
+                          #:select (download-method-enabled?))
                          (guix build download-nar)
                          (guix swh)
                          (ice-9 match))
@@ -106,26 +109,35 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
             (setvbuf (current-output-port) 'line)
             (setvbuf (current-error-port) 'line)
 
-            (or (hg-fetch '#$(hg-reference-url ref)
-                          '#$(hg-reference-changeset ref)
-                          #$output
-                          #:hg-command (string-append #+hg "/bin/hg"))
-                (download-nar #$output)
+            (or (and (download-method-enabled? 'upstream)
+                     (hg-fetch '#$(hg-reference-url ref)
+                               '#$(hg-reference-changeset ref)
+                               #$output
+                               #:hg-command (string-append #+hg "/bin/hg")))
+                (and (download-method-enabled? 'nar)
+                     (download-nar #$output))
                 ;; As a last resort, attempt to download from Software Heritage.
                 ;; Disable X.509 certificate verification to avoid depending
                 ;; on nss-certs--we're authenticating the checkout anyway.
-                (parameterize ((%verify-swh-certificate? #f))
-                  (format (current-error-port)
-                          "Trying to download from Software Heritage...~%")
-                  (swh-download #$(hg-reference-url ref)
-                                #$(hg-reference-changeset ref)
-                                #$output)))))))
+                (and (download-method-enabled? 'swh)
+                     (parameterize ((%verify-swh-certificate? #f))
+                       (format (current-error-port)
+                               "Trying to download from Software Heritage...~%")
+                       (or (swh-download-directory-by-nar-hash
+                            #$hash '#$hash-algo #$output)
+                           (swh-download #$(hg-reference-url ref)
+                                         #$(hg-reference-changeset ref)
+                                         #$output)))))))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "hg-checkout") build
                       #:leaked-env-vars '("http_proxy" "https_proxy"
                                           "LC_ALL" "LC_MESSAGES" "LANG"
                                           "COLUMNS")
+                      #:env-vars (match (getenv "GUIX_DOWNLOAD_METHODS")
+                                   (#f '())
+                                   (value
+                                    `(("GUIX_DOWNLOAD_METHODS" . ,value))))
                       #:system system
                       #:local-build? #t           ;don't offload repo cloning
                       #:hash-algo hash-algo
diff --git a/guix/import/cran.scm b/guix/import/cran.scm
index 9b30dc30e0..c4c42836ee 100644
--- a/guix/import/cran.scm
+++ b/guix/import/cran.scm
@@ -418,6 +418,7 @@ empty list when the FIELD cannot be found."
         "none"
         "rtools"
         "unix"
+        "use_c17"
         "windows"
         "xcode"
         "xquartz"))
diff --git a/guix/lint.scm b/guix/lint.scm
index c95de85e69..68d532968d 100644
--- a/guix/lint.scm
+++ b/guix/lint.scm
@@ -67,6 +67,10 @@
                                     svn-multi-reference-url
                                     svn-multi-reference-user-name
                                     svn-multi-reference-password)
+  #:autoload   (guix hg-download)  (hg-reference?
+                                    hg-reference-url)
+  #:autoload   (guix bzr-download) (bzr-reference?
+                                    bzr-reference-url)
   #:use-module (guix import stackage)
   #:use-module (ice-9 match)
   #:use-module (ice-9 regex)
@@ -84,10 +88,10 @@
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-6)                      ;Unicode string ports
   #:use-module (srfi srfi-9)
-  #:use-module (srfi srfi-11)
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-34)
   #:use-module (srfi srfi-35)
+  #:use-module (srfi srfi-71)
   #:use-module (ice-9 rdelim)
   #:export (check-description-style
             check-inputs-should-be-native
@@ -823,8 +827,8 @@ for connections to complete; when TIMEOUT is #f, wait as long as needed."
                   ;; Return RESPONSE, unless the final response as we follow
                   ;; redirects is not 200.
                   (if location
-                      (let-values (((status response2)
-                                    (loop location (cons location visited))))
+                      (let ((status response2 (loop location
+                                                    (cons location visited))))
                         (case status
                           ((http-response)
                            (values 'http-response
@@ -926,8 +930,7 @@ display a message including MESSAGE and return ERROR-VALUE."
 (define (validate-uri uri package field)
   "Return #t if the given URI can be reached, otherwise return a warning for
 PACKAGE mentioning the FIELD."
-  (let-values (((status argument)
-                (probe-uri uri #:timeout 3)))     ;wait at most 3 seconds
+  (let ((status argument (probe-uri uri #:timeout 3))) ;wait at most 3 seconds
     (case status
       ((http-response)
        (cond ((= 200 (response-code argument))
@@ -1633,6 +1636,69 @@ directory identifiers the spec refers to.  Otherwise return #f."
               (extract-swh-id spec)))))
        %disarchive-mirrors))
 
+(define (swh-response->warning package url method response)
+  "Given RESPONSE, the response of METHOD on URL, return a suitable warning
+list for PACKAGE."
+  (if (request-rate-limit-reached? url method)
+      (list (make-warning package
+                          (G_ "Software Heritage rate limit reached; \
+try again later")
+                          #:field 'source))
+      (list (make-warning package
+                          (G_ "'~a' returned ~a")
+                          (list url (response-code response))
+                          #:field 'source))))
+
+(define (vcs-origin origin)
+  "Return two values: the URL and type (a string) of the version-control used
+for ORIGIN.  Return #f and #f if ORIGIN is not a version-control checkout."
+  (match (and=> origin origin-uri)
+    ((? git-reference? ref)
+     (values (git-reference-url ref) "git"))
+    ((? svn-reference? ref)
+     (values (svn-reference-url ref) "svn"))
+    ((? svn-multi-reference? ref)
+     (values (svn-multi-reference-url ref) "svn"))
+    ((? hg-reference? ref)
+     (values (hg-reference-url ref) "hg"))
+    ((? bzr-reference? ref)
+     (values (bzr-reference-url ref) "bzr"))
+    ;; XXX: Not sure what to do with the weird CVS URIs (:pserver: etc.).
+    (_
+     (values #f #f))))
+
+(define (save-package-source package)
+  "Attempt to save the source of PACKAGE on SWH.  Return a list of warnings."
+  (let* ((origin (package-source package))
+         (url type (if origin (vcs-origin origin) (values #f #f))))
+    (cond ((and url type)
+           (catch 'swh-error
+             (lambda ()
+               (save-origin url type)
+               (list (make-warning
+                      package
+                      ;; TRANSLATORS: "Software Heritage" is a proper noun that
+                      ;; must remain untranslated.  See
+                      ;; <https://www.softwareheritage.org>.
+                      (G_ "scheduled Software Heritage archival")
+                      #:field 'source)))
+             (lambda (key url method response . _)
+               (cond ((= 429 (response-code response))
+                      (list (make-warning
+                             package
+                             (G_ "archival rate limit exceeded; \
+try again later")
+                             #:field 'source)))
+                     (else
+                      (swh-response->warning package url method response))))))
+          ((not origin)
+           '())
+          (else
+           (list (make-warning
+                  package
+                  (G_ "source code cannot be archived")
+                  #:field 'source))))))
+
 (define (check-archival package)
   "Check whether PACKAGE's source code is archived on Software Heritage.  If
 it's not, and if its source code is a VCS snapshot, then send a \"save\"
@@ -1641,17 +1707,6 @@ request to Software Heritage.
 Software Heritage imposes limits on the request rate per client IP address.
 This checker prints a notice and stops doing anything once that limit has been
 reached."
-  (define (response->warning url method response)
-    (if (request-rate-limit-reached? url method)
-        (list (make-warning package
-                            (G_ "Software Heritage rate limit reached; \
-try again later")
-                            #:field 'source))
-        (list (make-warning package
-                            (G_ "'~a' returned ~a")
-                            (list url (response-code response))
-                            #:field 'source))))
-
   (define skip-key (gensym "skip-archival-check"))
 
   (define (skip-when-limit-reached url method)
@@ -1686,28 +1741,8 @@ try again later")
               '())
              (#f
               ;; Revision is missing from the archive, attempt to save it.
-              (catch 'swh-error
-                (lambda ()
-                  (save-origin (git-reference-url reference) "git")
-                  (list (make-warning
-                         package
-                         ;; TRANSLATORS: "Software Heritage" is a proper noun
-                         ;; that must remain untranslated.  See
-                         ;; <https://www.softwareheritage.org>.
-                         (G_ "scheduled Software Heritage archival")
-                         #:field 'source)))
-                (lambda (key url method response . _)
-                  (cond ((= 429 (response-code response))
-                         (list (make-warning
-                                package
-                                (G_ "archival rate limit exceeded; \
-try again later")
-                                #:field 'source)))
-                        (else
-                         (response->warning url method response))))))))
+              (save-package-source package))))
           ((? origin? origin)
-           ;; Since "save" origins are not supported for non-VCS source, all
-           ;; we can do is tell whether a given tarball is available or not.
            (if (and=> (origin-hash origin)          ;XXX: for ungoogled-chromium
                       content-hash-value)           ;& icecat
                (let ((hash (origin-hash origin)))
@@ -1716,27 +1751,31 @@ try again later")
                                             (symbol->string
                                              (content-hash-algorithm hash))))
                    (#f
-                    ;; If SWH doesn't have HASH as is, it may be because it's
-                    ;; a hand-crafted tarball.  In that case, check whether
-                    ;; the Disarchive database has an entry for that tarball.
-                    (match (lookup-disarchive-spec hash)
-                      (#f
-                       (list (make-warning package
-                                           (G_ "source not archived on Software \
+                    ;; If ORIGIN is a version-control checkout, save it now.
+                    ;; If not, check whether HASH is in the Disarchive
+                    ;; database ("Save Code Now" does not accept tarballs).
+                    (if (vcs-origin origin)
+                        (save-package-source package)
+                        (match (lookup-disarchive-spec hash)
+                          (#f
+                           (list (make-warning package
+                                               (G_ "source not archived on Software \
 Heritage and missing from the Disarchive database")
-                                           #:field 'source)))
-                      (directory-ids
-                       (match (find (lambda (id)
-                                      (not (lookup-directory id)))
-                                    directory-ids)
-                         (#f '())
-                         (id
-                          (list (make-warning package
-                                              (G_ "\
+                                               #:field 'source)))
+                          (directory-ids
+                           (match (find (lambda (id)
+                                          (not (lookup-directory id)))
+                                        directory-ids)
+                             (#f '())
+                             (id
+                              (list (make-warning package
+                                                  (G_ "\
 Disarchive entry refers to non-existent SWH directory '~a'")
-                                              (list id)
-                                              #:field 'source)))))))
+                                                  (list id)
+                                                  #:field 'source))))))))
                    ((? content?)
+                    '())
+                   ((? string? swhid)
                     '())))
                '()))
           ((? local-file?)
@@ -1748,7 +1787,7 @@ source is not an origin, it cannot be archived")
                                #:field 'source)))))
       (match-lambda*
         (('swh-error url method response)
-         (response->warning url method response))
+         (swh-response->warning package url method response))
         ((key . args)
          (if (eq? key skip-key)
              '()
diff --git a/guix/scripts/import/elpa.scm b/guix/scripts/import/elpa.scm
index f587eeb243..7f77beaac0 100644
--- a/guix/scripts/import/elpa.scm
+++ b/guix/scripts/import/elpa.scm
@@ -104,7 +104,7 @@ Import the latest package named PACKAGE-NAME from an ELPA repository.\n"))
                                       #:repo (assoc-ref opts 'repo)))
          ((or #f '())
           (leave (G_ "failed to download meta-data for package '~a'~%") package-name))
-         (('package etc ...) `(package ,etc))
+         (('package etc ...) `(package ,@etc))
          ((? list? sexps) (map
                            (match-lambda
                              ((and ('package ('name name) . rest) pkg)
diff --git a/guix/scripts/perform-download.scm b/guix/scripts/perform-download.scm
index e7eb3b2a1f..5079d0ea71 100644
--- a/guix/scripts/perform-download.scm
+++ b/guix/scripts/perform-download.scm
@@ -21,7 +21,7 @@
   #:use-module (guix scripts)
   #:use-module (guix derivations)
   #:use-module ((guix store) #:select (derivation-path? store-path?))
-  #:autoload   (guix build download) (url-fetch)
+  #:autoload   (guix build download) (%download-methods url-fetch)
   #:autoload   (guix build git) (git-fetch-with-fallback)
   #:autoload   (guix config) (%git)
   #:use-module (ice-9 match)
@@ -55,7 +55,8 @@ Note: OUTPUT may differ from the 'out' value of DRV, notably for 'bmCheck' or
                        (executable "executable")
                        (mirrors "mirrors")
                        (content-addressed-mirrors "content-addressed-mirrors")
-                       (disarchive-mirrors "disarchive-mirrors"))
+                       (disarchive-mirrors "disarchive-mirrors")
+                       (download-methods "download-methods"))
     (unless url
       (leave (G_ "~a: missing URL~%") (derivation-file-name drv)))
 
@@ -64,26 +65,30 @@ Note: OUTPUT may differ from the 'out' value of DRV, notably for 'bmCheck' or
            (algo       (derivation-output-hash-algo drv-output))
            (hash       (derivation-output-hash drv-output)))
       ;; We're invoked by the daemon, which gives us write access to OUTPUT.
-      (when (url-fetch url output
-                       #:print-build-trace? print-build-trace?
-                       #:mirrors (if mirrors
-                                     (call-with-input-file mirrors read)
-                                     '())
-                       #:content-addressed-mirrors
-                       (if content-addressed-mirrors
-                           (call-with-input-file content-addressed-mirrors
-                             (lambda (port)
-                               (eval (read port) %user-module)))
-                           '())
-                       #:disarchive-mirrors
-                       (if disarchive-mirrors
-                           (call-with-input-file disarchive-mirrors read)
-                           '())
-                       #:hashes `((,algo . ,hash))
-
-                       ;; Since DRV's output hash is known, X.509 certificate
-                       ;; validation is pointless.
-                       #:verify-certificate? #f)
+      (when (parameterize ((%download-methods
+                            (and download-methods
+                                 (call-with-input-string download-methods
+                                   read))))
+              (url-fetch url output
+                         #:print-build-trace? print-build-trace?
+                         #:mirrors (if mirrors
+                                       (call-with-input-file mirrors read)
+                                       '())
+                         #:content-addressed-mirrors
+                         (if content-addressed-mirrors
+                             (call-with-input-file content-addressed-mirrors
+                               (lambda (port)
+                                 (eval (read port) %user-module)))
+                             '())
+                         #:disarchive-mirrors
+                         (if disarchive-mirrors
+                             (call-with-input-file disarchive-mirrors read)
+                             '())
+                         #:hashes `((,algo . ,hash))
+
+                         ;; Since DRV's output hash is known, X.509 certificate
+                         ;; validation is pointless.
+                         #:verify-certificate? #f))
         (when (and executable (string=? executable "1"))
           (chmod output #o755))))))
 
@@ -96,7 +101,8 @@ Note: OUTPUT may differ from the 'out' value of DRV, notably for 'bmCheck' or
 'bmRepair' builds."
   (derivation-let drv ((url "url")
                        (commit "commit")
-                       (recursive? "recursive?"))
+                       (recursive? "recursive?")
+                       (download-methods "download-methods"))
     (unless url
       (leave (G_ "~a: missing Git URL~%") (derivation-file-name drv)))
     (unless commit
@@ -114,11 +120,18 @@ Note: OUTPUT may differ from the 'out' value of DRV, notably for 'bmCheck' or
       ;; on ambient authority, hence the PATH value below.
       (setenv "PATH" "/run/current-system/profile/bin:/bin:/usr/bin")
 
-      (git-fetch-with-fallback url commit output
-                               #:hash hash
-                               #:hash-algorithm algo
-                               #:recursive? recursive?
-                               #:git-command %git))))
+      (parameterize ((%download-methods
+                      (and download-methods
+                           (call-with-input-string download-methods
+                             read))))
+        ;; Note: When doing a '--check' build, DRV-OUTPUT and OUTPUT are
+        ;; different, hence the #:item argument below.
+        (git-fetch-with-fallback url commit output
+                                 #:hash hash
+                                 #:hash-algorithm algo
+                                 #:recursive? recursive?
+                                 #:item (derivation-output-path drv-output)
+                                 #:git-command %git)))))
 
 (define (assert-low-privileges)
   (when (zero? (getuid))
diff --git a/guix/svn-download.scm b/guix/svn-download.scm
index c6688908de..17a7f4f957 100644
--- a/guix/svn-download.scm
+++ b/guix/svn-download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014-2016, 2019, 2021-2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014-2016, 2019, 2021-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in>
 ;;; Copyright © 2017, 2019, 2021 Ricardo Wurmus <rekado@elephly.net>
 ;;;
@@ -93,25 +93,36 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
   (define build
     (with-imported-modules
         (source-module-closure '((guix build svn)
+                                 (guix build download)
                                  (guix build download-nar)
-                                 (guix build utils)))
+                                 (guix build utils)
+                                 (guix swh)))
       (with-extensions (list guile-json guile-gnutls   ;for (guix swh)
                              guile-lzlib)
         #~(begin
             (use-modules (guix build svn)
+                         ((guix build download)
+                          #:select (download-method-enabled?))
                          (guix build download-nar)
+                         (guix swh)
                          (ice-9 match))
 
-            (or (svn-fetch (getenv "svn url")
-                           (string->number (getenv "svn revision"))
-                           #$output
-                           #:svn-command #+(file-append svn "/bin/svn")
-                           #:recursive? (match (getenv "svn recursive?")
-                                          ("yes" #t)
-                                          (_ #f))
-                           #:user-name (getenv "svn user name")
-                           #:password (getenv "svn password"))
-                (download-nar #$output))))))
+            (or (and (download-method-enabled? 'upstream)
+                     (svn-fetch (getenv "svn url")
+                                (string->number (getenv "svn revision"))
+                                #$output
+                                #:svn-command #+(file-append svn "/bin/svn")
+                                #:recursive? (match (getenv "svn recursive?")
+                                               ("yes" #t)
+                                               (_ #f))
+                                #:user-name (getenv "svn user name")
+                                #:password (getenv "svn password")))
+                (and (download-method-enabled? 'nar)
+                     (download-nar #$output))
+                (and (download-method-enabled? 'swh)
+                     (parameterize ((%verify-swh-certificate? #f))
+                       (swh-download-directory-by-nar-hash #$hash '#$hash-algo
+                                                           #$output))))))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "svn-checkout") build
@@ -134,7 +145,11 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                         ,@(if (svn-reference-password ref)
                               `(("svn password"
                                  . ,(svn-reference-password ref)))
-                              '()))
+                              '())
+                        ,@(match (getenv "GUIX_DOWNLOAD_METHODS")
+                            (#f '())
+                            (value
+                             `(("GUIX_DOWNLOAD_METHODS" . ,value)))))
 
                       #:system system
                       #:hash-algo hash-algo
@@ -173,14 +188,19 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
   (define build
     (with-imported-modules
         (source-module-closure '((guix build svn)
+                                 (guix build download)
                                  (guix build download-nar)
-                                 (guix build utils)))
+                                 (guix build utils)
+                                 (guix swh)))
       (with-extensions (list guile-json guile-gnutls   ;for (guix swh)
                              guile-lzlib)
         #~(begin
             (use-modules (guix build svn)
                          (guix build utils)
+                         ((guix build download)
+                          #:select (download-method-enabled?))
                          (guix build download-nar)
+                         (guix swh)
                          (srfi srfi-1)
                          (ice-9 match))
 
@@ -190,23 +210,33 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                    ;; single file.
                    (unless (string-suffix? "/" location)
                      (mkdir-p (string-append #$output "/" (dirname location))))
-                   (svn-fetch (string-append (getenv "svn url") "/" location)
-                              (string->number (getenv "svn revision"))
-                              (if (string-suffix? "/" location)
-                                  (string-append #$output "/" location)
-                                  (string-append #$output "/" (dirname location)))
-                              #:svn-command #+(file-append svn "/bin/svn")
-                              #:recursive? (match (getenv "svn recursive?")
-                                             ("yes" #t)
-                                             (_ #f))
-                              #:user-name (getenv "svn user name")
-                              #:password (getenv "svn password")))
+                   (and (download-method-enabled? 'upstream)
+                        (svn-fetch (string-append (getenv "svn url") "/" location)
+                                   (string->number (getenv "svn revision"))
+                                   (if (string-suffix? "/" location)
+                                       (string-append #$output "/" location)
+                                       (string-append #$output "/" (dirname location)))
+                                   #:svn-command #+(file-append svn "/bin/svn")
+                                   #:recursive? (match (getenv "svn recursive?")
+                                                  ("yes" #t)
+                                                  (_ #f))
+                                   #:user-name (getenv "svn user name")
+                                   #:password (getenv "svn password"))))
                  (call-with-input-string (getenv "svn locations")
                    read))
                 (begin
                   (when (file-exists? #$output)
                     (delete-file-recursively #$output))
-                  (download-nar #$output)))))))
+                  (or (and (download-method-enabled? 'nar)
+                           (download-nar #$output))
+                      (and (download-method-enabled? 'swh)
+                           ;; SWH keeps HASH as an ExtID for the combination
+                           ;; of files/directories, which allows us to
+                           ;; retrieve the entire combination at once:
+                           ;; <https://gitlab.softwareheritage.org/swh/infra/sysadm-environment/-/issues/5263>.
+                           (parameterize ((%verify-swh-certificate? #f))
+                             (swh-download-directory-by-nar-hash
+                              #$hash '#$hash-algo #$output))))))))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "svn-checkout") build
@@ -231,7 +261,11 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                         ,@(if (svn-multi-reference-password ref)
                               `(("svn password"
                                  . ,(svn-multi-reference-password ref)))
-                              '()))
+                              '())
+                        ,@(match (getenv "GUIX_DOWNLOAD_METHODS")
+                            (#f '())
+                            (value
+                             `(("GUIX_DOWNLOAD_METHODS" . ,value)))))
 
                       #:leaked-env-vars '("http_proxy" "https_proxy"
                                           "LC_ALL" "LC_MESSAGES" "LANG"
diff --git a/guix/swh.scm b/guix/swh.scm
index 04cecd854c..f602cd89d1 100644
--- a/guix/swh.scm
+++ b/guix/swh.scm
@@ -54,6 +54,7 @@
             visit-snapshot-url
             visit-status
             visit-number
+            visit-type
             visit-snapshot
 
             snapshot?
@@ -312,6 +313,7 @@ FALSE-IF-404? is true, return #f upon 404 responses."
   (url visit-url "origin_visit_url")
   (snapshot-url visit-snapshot-url "snapshot_url" string*) ;string | #f
   (status visit-status "status" string->symbol)   ;'full | 'partial | 'ongoing
+  (type   visit-type "type" string->symbol)       ;'git | 'git-checkout | ...
   (number visit-number "visit"))
 
 ;; <https://archive.softwareheritage.org/api/1/snapshot/4334c3ed4bb208604ed780d8687fe523837f1bd1/>
@@ -472,10 +474,11 @@ and use of ALGORITHM."
                              hash)
          external-id-target))
 
-(define (origin-visits origin)
-  "Return the list of visits of ORIGIN, a record as returned by
-'lookup-origin'."
-  (call (swh-url (origin-visits-url origin))
+(define* (origin-visits origin #:optional (max 10))
+  "Return the list of the up to MAX latest visits of ORIGIN, a record as
+returned by 'lookup-origin'."
+  (call (string-append (swh-url (origin-visits-url origin))
+                       "?per_page=" (number->string max))
         (lambda (port)
           (map json->visit (vector->list (json->scm port))))))
 
@@ -513,14 +516,20 @@ could not be found."
           (_ #f)))))
 
 (define (branch-target branch)
-  "Return the target of BRANCH, either a <revision> or a <release>."
+  "Return the target of BRANCH: a <revision>, a <release>, or the SWHID of a
+directory."
   (match (branch-target-type branch)
     ('release
      (call (swh-url (branch-target-url branch))
            json->release))
     ('revision
      (call (swh-url (branch-target-url branch))
-           json->revision))))
+           json->revision))
+    ((or 'directory 'alias)
+     (match (string-tokenize (branch-target-url branch)
+                             (char-set-complement (char-set #\/)))
+       ((_ ... "directory" id)
+        (string-append "swh:1:dir:" id))))))
 
 (define (lookup-origin-revision url tag)
   "Return a <revision> corresponding to the given TAG for the repository
@@ -534,31 +543,31 @@ URL could not be found."
   (match (lookup-origin url)
     (#f #f)
     (origin
-      (match (filter (lambda (visit)
-                       ;; Return #f if (visit-snapshot VISIT) would return #f.
-                       (and (visit-snapshot-url visit)
-                            (eq? 'full (visit-status visit))))
-                     (origin-visits origin))
-        ((visit . _)
-         (let ((snapshot (visit-snapshot visit)))
-           (match (and=> (find (lambda (branch)
-                                 (or
-                                  ;; Git specific.
-                                  (string=? (string-append "refs/tags/" tag)
-                                            (branch-name branch))
-                                  ;; Hg specific.
-                                  (string=? tag
-                                            (branch-name branch))))
-                               (snapshot-branches snapshot))
-                         branch-target)
-             ((? release? release)
-              (release-target release))
-             ((? revision? revision)
-              revision)
-             (#f                                  ;tag not found
-              #f))))
-        (()
-         #f)))))
+      (any (lambda (visit)
+             (and (visit-snapshot-url visit)
+                  (eq? 'full (visit-status visit))
+                  (let ((snapshot (visit-snapshot visit)))
+                    (match (and=> (find (lambda (branch)
+                                          (or
+                                           ;; Git specific.
+                                           (string=? (string-append "refs/tags/" tag)
+                                                     (branch-name branch))
+                                           ;; Hg specific.
+                                           (string=? tag
+                                                     (branch-name branch))))
+                                        (snapshot-branches snapshot))
+                                  branch-target)
+                      ((? release? release)
+                       (release-target release))
+                      ((? revision? revision)
+                       revision)
+                      (_
+                       ;; Either the branch points to a directory rather than
+                       ;; a revision (this is the case for visits of type
+                       ;; 'git-checkout, 'hg-checkout, 'tarball-directory,
+                       ;; etc.), or TAG was not found.
+                       #f)))))
+           (origin-visits origin 30)))))
 
 (define (release-target release)
   "Return the revision that is the target of RELEASE."
diff --git a/tests/lint.scm b/tests/lint.scm
index 87213fcc78..95d82d7490 100644
--- a/tests/lint.scm
+++ b/tests/lint.scm
@@ -1407,6 +1407,26 @@
                        (check-archival (dummy-package "x" (source origin)))))))
     (warning-contains? "scheduled" warnings)))
 
+(test-assert "archival: missing svn revision"
+  (let* ((origin   (origin
+                     (method svn-fetch)
+                     (uri (svn-reference
+                           (url "http://example.org/svn/foo")
+                           (revision "1234")))
+                     (sha256 (make-bytevector 32))))
+         ;; https://archive.softwareheritage.org/api/1/origin/save/
+         (save     "{ \"origin_url\": \"http://example.org/svn/foo\",
+                      \"save_request_date\": \"2014-11-17T22:09:38+01:00\",
+                      \"save_request_status\": \"accepted\",
+                      \"save_task_status\": \"scheduled\" }")
+         (warnings (with-http-server `((404 "No extid.") ;lookup-directory-by-nar-hash
+                                       (404 "No revision.") ;lookup-revision
+                                       (404 "No origin.")   ;lookup-origin
+                                       (200 ,save))         ;save-origin
+                     (parameterize ((%swh-base-url (%local-url)))
+                       (check-archival (dummy-package "x" (source origin)))))))
+    (warning-contains? "scheduled" warnings)))
+
 (test-equal "archival: revision available"
   '()
   (let* ((origin   (origin
diff --git a/tests/swh.scm b/tests/swh.scm
index e7ced6b50c..11dcbdddd8 100644
--- a/tests/swh.scm
+++ b/tests/swh.scm
@@ -109,6 +109,80 @@
                  (directory-entry-length entry)))
          (lookup-directory "123"))))
 
+(test-equal "lookup-origin-revision"
+  '("cd86c72084993d9ef26fc9e24b73cea612b8c97b"
+    "d173c707ee88e3c89401ad77fafa65fcd9e9f5be")
+  (let ()
+    ;; Make sure that 'lookup-origin-revision' does the job, and in particular
+    ;; that it doesn't stop until it has found an actual revision:
+    ;; 'git-checkout visits point to directories instead of revisions.
+    ;; See <https://issues.guix.gnu.org/69070>.
+    (define visits
+      ;; Two visits of differing types: the first visit (type 'git-checkout')
+      ;; points to a directory, the second one (type 'git') points to a
+      ;; revision.
+      "[ {
+    \"origin\": \"https://example.org/repo.git\",
+    \"visit\": 1,
+    \"type\": \"git-checkout\",
+    \"date\": \"2020-05-17T21:43:45.422977+00:00\",
+    \"status\": \"full\",
+    \"metadata\": {},
+    \"type\": \"git-checkout\",
+    \"origin_visit_url\": \"/visit/42\",
+    \"snapshot_url\": \"/snapshot/1\"
+  }, {
+    \"origin\": \"https://example.org/repo.git\",
+    \"visit\": 2,
+    \"type\": \"git\",
+    \"date\": \"2020-05-17T21:43:49.422977+00:00\",
+    \"status\": \"full\",
+    \"metadata\": {},
+    \"type\": \"git\",
+    \"origin_visit_url\": \"/visit/41\",
+    \"snapshot_url\": \"/snapshot/2\"
+  } ]")
+    (define snapshot-for-git-checkout
+      "{ \"id\": 42,
+         \"branches\": { \"1.3.2\": {
+           \"target\": \"e4a4be18fae8d9c6528abff3bc9088feb19a76c7\",
+           \"target_type\": \"directory\",
+           \"target_url\": \"/directory/e4a4be18fae8d9c6528abff3bc9088feb19a76c7\"
+         }}
+       }")
+    (define snapshot-for-git
+      "{ \"id\": 42,
+         \"branches\": { \"1.3.2\": {
+           \"target\": \"e4a4be18fae8d9c6528abff3bc9088feb19a76c7\",
+           \"target_type\": \"revision\",
+           \"target_url\": \"/revision/e4a4be18fae8d9c6528abff3bc9088feb19a76c7\"
+         }}
+       }")
+    (define revision
+      "{ \"author\": {},
+         \"committer\": {},
+         \"committer_date\": \"2018-05-17T21:43:49.422977+00:00\",
+         \"date\": \"2018-05-17T21:43:49.422977+00:00\",
+         \"directory\": \"d173c707ee88e3c89401ad77fafa65fcd9e9f5be\",
+         \"directory_url\": \"/directory/d173c707ee88e3c89401ad77fafa65fcd9e9f5be\",
+         \"id\": \"cd86c72084993d9ef26fc9e24b73cea612b8c97b\",
+         \"merge\": false,
+         \"message\": \"Fix.\",
+         \"parents\": [],
+         \"type\": \"what type?\"
+       }")
+
+    (with-http-server `((200 ,%origin)
+                        (200 ,visits)
+                        (200 ,snapshot-for-git-checkout)
+                        (200 ,snapshot-for-git)
+                        (200 ,revision))
+      (parameterize ((%swh-base-url (%local-url)))
+        (let ((revision (lookup-origin-revision "https://example.org/repo.git"
+                                                "1.3.2")))
+          (list (revision-id revision)
+                (revision-directory revision)))))))
+
 (test-equal "lookup-directory-by-nar-hash"
   "swh:1:dir:84a8b34591712c0a90bab0af604188bcd1fe3153"
   (with-json-result %external-id