summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarius Bakke <mbakke@fastmail.com>2018-12-12 22:00:52 +0100
committerMarius Bakke <mbakke@fastmail.com>2018-12-12 22:00:52 +0100
commit12878d12acccf83ef3258a53a01f851088f0aa9e (patch)
tree47f875b50bd7714251256475317e96f4e6d73f55
parent17c3e0d85d9c1a6b4c09d09dd9238297b6165a2f (diff)
parent7b046b1bdc0b1cbc50428d4e08136a110f0a12af (diff)
downloadguix-12878d12acccf83ef3258a53a01f851088f0aa9e.tar.gz
Merge branch 'master' into staging
-rw-r--r--Makefile.am1
-rw-r--r--build-aux/hydra/gnu-system.scm4
-rw-r--r--doc/guix.texi33
-rw-r--r--gnu/local.mk4
-rw-r--r--gnu/packages/audio.scm10
-rw-r--r--gnu/packages/backup.scm5
-rw-r--r--gnu/packages/bootloaders.scm2
-rw-r--r--gnu/packages/busybox.scm40
-rw-r--r--gnu/packages/check.scm24
-rw-r--r--gnu/packages/easyrpg.scm121
-rw-r--r--gnu/packages/emacs.scm54
-rw-r--r--gnu/packages/fonts.scm16
-rw-r--r--gnu/packages/game-development.scm2
-rw-r--r--gnu/packages/games.scm6
-rw-r--r--gnu/packages/gnuzilla.scm75
-rw-r--r--gnu/packages/ham-radio.scm35
-rw-r--r--gnu/packages/ipfs.scm27
-rw-r--r--gnu/packages/java.scm2
-rw-r--r--gnu/packages/linux.scm12
-rw-r--r--gnu/packages/lisp.scm6
-rw-r--r--gnu/packages/mail.scm4
-rw-r--r--gnu/packages/maths.scm2
-rw-r--r--gnu/packages/messaging.scm55
-rw-r--r--gnu/packages/mtools.scm4
-rw-r--r--gnu/packages/music.scm6
-rw-r--r--gnu/packages/patches/allegro-fix-compilation-mesa-18.2.5-and-later.patch41
-rw-r--r--gnu/packages/patches/borg-respect-storage-quota.patch32
-rw-r--r--gnu/packages/patches/openjdk-10-idlj-reproducibility.patch36
-rw-r--r--gnu/packages/patches/polkit-CVE-2018-19788.patch197
-rw-r--r--gnu/packages/pdf.scm14
-rw-r--r--gnu/packages/polkit.scm1
-rw-r--r--gnu/packages/python.scm179
-rw-r--r--gnu/packages/rust.scm3
-rw-r--r--gnu/packages/security-token.scm34
-rw-r--r--gnu/packages/tls.scm6
-rw-r--r--gnu/packages/tor.scm49
-rw-r--r--gnu/packages/version-control.scm6
-rw-r--r--gnu/packages/video.scm24
-rw-r--r--gnu/services/base.scm10
-rw-r--r--guix/channels.scm122
-rw-r--r--guix/scripts/refresh.scm16
-rw-r--r--tests/channels.scm139
42 files changed, 1249 insertions, 210 deletions
diff --git a/Makefile.am b/Makefile.am
index a7a67e81cf..4a190c4095 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -329,6 +329,7 @@ SCM_TESTS =					\
   tests/base16.scm				\
   tests/base32.scm				\
   tests/base64.scm				\
+  tests/channels.scm				\
   tests/cpan.scm				\
   tests/cpio.scm				\
   tests/crate.scm				\
diff --git a/build-aux/hydra/gnu-system.scm b/build-aux/hydra/gnu-system.scm
index d6b0132807..05d430df0a 100644
--- a/build-aux/hydra/gnu-system.scm
+++ b/build-aux/hydra/gnu-system.scm
@@ -187,14 +187,14 @@ system.")
                                           (bootloader u-boot-bootloader)
                                           (target #f))))
                             #:disk-image-size
-                            (* 1024 MiB))))))
+                            (* 1500 MiB))))))
           (list (->job 'usb-image
                        (run-with-store store
                          (mbegin %store-monad
                            (set-guile-for-build (default-guile))
                            (system-disk-image installation-os
                                               #:disk-image-size
-                                              (* 1024 MiB)))))
+                                              (* 1500 MiB)))))
                 (->job 'iso9660-image
                        (run-with-store store
                          (mbegin %store-monad
diff --git a/doc/guix.texi b/doc/guix.texi
index 1529d888ed..c47ba4e3f6 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -3037,6 +3037,39 @@ the new and upgraded packages that are listed, some like @code{my-gimp} and
 @code{my-emacs-with-cool-features} might come from
 @code{my-personal-packages}, while others come from the Guix default channel.
 
+@cindex dependencies, channels
+@cindex meta-data, channels
+@subsection Declaring Channel Dependencies
+
+Channel authors may decide to augment a package collection provided by other
+channels.  They can declare their channel to be dependent on other channels in
+a meta-data file @file{.guix-channel}, which is to be placed in the root of
+the channel repository.
+
+The meta-data file should contain a simple S-expression like this:
+
+@lisp
+(channel
+ (version 0)
+ (dependencies
+  (channel
+   (name 'some-collection)
+   (url "https://example.org/first-collection.git"))
+  (channel
+   (name 'some-other-collection)
+   (url "https://example.org/second-collection.git")
+   (branch "testing"))))
+@end lisp
+
+In the above example this channel is declared to depend on two other channels,
+which will both be fetched automatically.  The modules provided by the channel
+will be compiled in an environment where the modules of all these declared
+channels are available.
+
+For the sake of reliability and maintainability, you should avoid dependencies
+on channels that you don't control, and you should aim to keep the number of
+dependencies to a minimum.
+
 @subsection Replicating Guix
 
 @cindex pinning, channels
diff --git a/gnu/local.mk b/gnu/local.mk
index fe5224c7de..41c94235a7 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -146,6 +146,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/documentation.scm		\
   %D%/packages/dunst.scm			\
   %D%/packages/dvtm.scm				\
+  %D%/packages/easyrpg.scm			\
   %D%/packages/ebook.scm			\
   %D%/packages/ed.scm				\
   %D%/packages/education.scm			\
@@ -606,7 +607,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/blast+-fix-makefile.patch		\
   %D%/packages/patches/blender-newer-ffmpeg.patch		\
   %D%/packages/patches/boost-fix-icu-build.patch		\
-  %D%/packages/patches/borg-respect-storage-quota.patch		\
   %D%/packages/patches/byobu-writable-status.patch		\
   %D%/packages/patches/calibre-no-updates-dialog.patch		\
   %D%/packages/patches/calibre-use-packaged-feedparser.patch	\
@@ -1007,6 +1007,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/openbabel-fix-crash-on-nwchem-output.patch	\
   %D%/packages/patches/opencascade-oce-glibc-2.26.patch		\
   %D%/packages/patches/openfoam-4.1-cleanup.patch			\
+  %D%/packages/patches/openjdk-10-idlj-reproducibility.patch	\
   %D%/packages/patches/openldap-CVE-2017-9287.patch		\
   %D%/packages/patches/openocd-nrf52.patch			\
   %D%/packages/patches/opensmtpd-fix-crash.patch		\
@@ -1051,6 +1052,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/plink-endian-detection.patch		\
   %D%/packages/patches/plotutils-libpng-jmpbuf.patch		\
   %D%/packages/patches/podofo-cmake-3.12.patch			\
+  %D%/packages/patches/polkit-CVE-2018-19788.patch		\
   %D%/packages/patches/portaudio-audacity-compat.patch		\
   %D%/packages/patches/portmidi-modular-build.patch		\
   %D%/packages/patches/postgresql-disable-resolve_symlinks.patch	\
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index b732f7c608..7f72531664 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -2183,7 +2183,7 @@ background file post-processing.")
 (define-public supercollider
   (package
     (name "supercollider")
-    (version "3.9.3")
+    (version "3.10.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2192,7 +2192,7 @@ background file post-processing.")
                     "/SuperCollider-" version "-Source-linux.tar.bz2"))
               (sha256
                (base32
-                "1d8ixfl100jvlialxdizp8wqsl1mp5pi2bam25vp97bhjd59cfdr"))))
+                "16j9psa32czx1p1y2vvq0qf2ib0ngrfc604vx35n2b4llyika84v"))))
     (build-system cmake-build-system)
     (arguments
      `(#:configure-flags '("-DSYSTEM_BOOST=on" "-DSYSTEM_YAMLCPP=on"
@@ -2230,13 +2230,13 @@ background file post-processing.")
          ;; https://github.com/supercollider/supercollider/issues/1736
          (add-after 'rm-bundled-libs 'disable-broken-tests
            (lambda _
-             (substitute* "testsuite/supernova/CMakeLists.txt"
+             (substitute* "testsuite/server/supernova/CMakeLists.txt"
                (("server_test.cpp")
                 "")
                (("perf_counter_test.cpp")
                 ""))
-             (delete-file "testsuite/supernova/server_test.cpp")
-             (delete-file "testsuite/supernova/perf_counter_test.cpp")
+             (delete-file "testsuite/server/supernova/server_test.cpp")
+             (delete-file "testsuite/server/supernova/perf_counter_test.cpp")
              (substitute* "testsuite/CMakeLists.txt"
                (("add_subdirectory\\(sclang\\)")
                 ""))
diff --git a/gnu/packages/backup.scm b/gnu/packages/backup.scm
index c927a14673..a9d8286702 100644
--- a/gnu/packages/backup.scm
+++ b/gnu/packages/backup.scm
@@ -491,15 +491,14 @@ detection, and lossless compression.")
 (define-public borg
   (package
     (name "borg")
-    (version "1.1.7")
+    (version "1.1.8")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "borgbackup" version))
-       (patches (search-patches "borg-respect-storage-quota.patch"))
        (sha256
         (base32
-         "1p3zia62vyg9vadkdjzzkzbj4dmgijr7ix5lmhfbxpwy5q9imdgp"))
+         "0qqvcscn1l4y83x4sh3izdpmr8zq38j8chjkpfq4q4d01i470hqb"))
        (modules '((guix build utils)))
        (snippet
         '(begin
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index c155228b4d..2a595fafab 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -317,6 +317,8 @@ menu to select one of the installed operating systems.")
       (home-page "https://www.syslinux.org")
       (synopsis "Lightweight Linux bootloader")
       (description "Syslinux is a lightweight Linux bootloader.")
+      ;; The Makefile specifically targets i386 and x86_64 using nasm.
+      (supported-systems '("i686-linux" "x86_64-linux"))
       (license (list license:gpl2+
                      license:bsd-3 ; gnu-efi/*
                      license:bsd-4 ; gnu-efi/inc/* gnu-efi/lib/*
diff --git a/gnu/packages/busybox.scm b/gnu/packages/busybox.scm
index 5f1613bb4c..09812d4a49 100644
--- a/gnu/packages/busybox.scm
+++ b/gnu/packages/busybox.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,7 @@
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages)
   #:use-module (gnu packages admin)
+  #:use-module (gnu packages algebra)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages perl))
 
@@ -102,3 +104,41 @@ any small or embedded system.")
     (home-page "https://www.busybox.net")
     ;; Some files are gplv2+
     (license gpl2)))
+
+(define-public toybox
+  (package
+    (name "toybox")
+    (version "0.7.8")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://landley.net/toybox/downloads/toybox-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "1mlqv5hsvy8ii6m698hq6rc316klwv44jlr034knwg6bk1lf2qj9"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'set-environment-variables
+           (lambda _
+             (setenv "CC" (which "gcc"))
+             (setenv "HOSTCC" (which "gcc"))
+             #t))
+         (replace 'configure
+           (lambda _ (invoke "make" "defconfig")))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (invoke "make"
+                       (string-append "PREFIX=" out)
+                       "install")))))
+       #:test-target "tests"))
+    (native-inputs `(("bc" ,bc)))
+    (synopsis "Many common UNIX utilities in a single executable")
+    (description "ToyBox combines tiny versions of many common UNIX utilities
+into a single small executable.  It provides a fairly complete environment for
+any small or embedded system.")
+    (home-page "https://landley.net/toybox/")
+    (license bsd-2)))
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index 937e4e094c..5bf849d666 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -1414,6 +1414,30 @@ normally the case.")
 (define-public python2-pytest-subtesthack
   (package-with-python2 python-pytest-subtesthack))
 
+(define-public python-pytest-sugar
+  (package
+    (name "python-pytest-sugar")
+    (version "0.9.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pytest-sugar" version))
+       (sha256
+        (base32
+         "1asq7yc4g8bx2sn7yy974mhc9ywvaihasjab4inkirdwn9s7mn7w"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-packaging" ,python-packaging)
+       ("python-pytest" ,python-pytest)
+       ("python-termcolor" ,python-termcolor)))
+    (home-page "https://pivotfinland.com/pytest-sugar/")
+    (synopsis "Plugin for pytest that changes the default look and feel")
+    (description
+     "@code{pytest-sugar} is a plugin for py.test that changes the default
+look and feel of py.test, using a progress bar and showing failures and errors
+instantly.")
+    (license license:bsd-3)))
+
 (define-public python-hypothesis
   (package
     (name "python-hypothesis")
diff --git a/gnu/packages/easyrpg.scm b/gnu/packages/easyrpg.scm
new file mode 100644
index 0000000000..05fd2b11a0
--- /dev/null
+++ b/gnu/packages/easyrpg.scm
@@ -0,0 +1,121 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2018 Sou Bunnbu <iyzsong@member.fsf.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages easyrpg)
+  #:use-module (guix packages)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages audio)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages icu4c)
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages mp3)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages pulseaudio)
+  #:use-module (gnu packages sdl)
+  #:use-module (gnu packages xdisorg)
+  #:use-module (gnu packages xiph)
+  #:use-module (gnu packages xml))
+
+(define-public liblcf
+  (package
+    (name "liblcf")
+    (version "0.5.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://easyrpg.org/downloads/player/" version
+                    "/liblcf-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1k99bcw5c23801jk3mbz5sj5h18x46w1qxrkknhwhfgqzpvxhwrs"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (propagated-inputs
+     ;; Required by 'liblcf.pc'.
+     `(("expat" ,expat)
+       ("icu" ,icu4c)))
+    (home-page "https://easyrpg.org/")
+    (synopsis "Library to handle RPG Maker 2000 and 2003 game data")
+    (description
+     "@code{liblcf} is a library to handle RPG Maker 2000 and 2003 game data.
+It can read and write LCF and XML files.")
+    ;; It includes a copy of Boost Preprocessor Cat and Stringize (boost-1.0):
+    ;;   src/boost/preprocessor/config.hpp
+    ;;   src/boost/preprocessor/cat.hpp
+    ;;   src/boost/preprocessor/stringize.hpp
+    ;; and a copy of inih (bsd-3):
+    ;;   src/ini.h
+    ;;   src/ini.cpp
+    ;;   src/inireader.h
+    ;;   src/inireader.cpp
+    ;; TODO: Unbundle them.
+    (license license:expat)))
+
+(define-public easyrpg-player
+  (package
+    (name "easyrpg-player")
+    (version "0.5.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://easyrpg.org/downloads/player/" version
+                    "/easyrpg-player-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0w0idr61slg5828j1q31c1kh1h0ryp8psc006y06jph5pp3qgm48"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:configure-flags
+       (list (string-append "--with-bash-completion-dir="
+                            %output "/etc/bash_completion.d/"))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("freetype" ,freetype)
+       ("harfbuzz" ,harfbuzz)
+       ("liblcf" ,liblcf)
+       ("libpng" ,libpng)
+       ("libsndfile" ,libsndfile)
+       ("libvorbis" ,libvorbis)
+       ("libxmp" ,libxmp)
+       ("mpg123" ,mpg123)
+       ("opusfile" ,opusfile)
+       ("pixman" ,pixman)
+       ("sdl2-mixer" ,sdl2-mixer)
+       ("sdl2" ,sdl2)
+       ("speexdsp" ,speexdsp)
+       ;; ("wildmidi" ,wildmidi)      ; TODO: package it
+       ("zlib" ,zlib)))
+    (home-page "https://easyrpg.org/")
+    (synopsis "Play RPG Maker 2000 and 2003 games")
+    (description
+     "EasyRPG Player is a game interpreter to play RPG Maker 2000, 2003 and
+EasyRPG games.  It uses the LCF parser library (liblcf) to read RPG Maker game
+data.")
+    ;; It bundles FMMidi YM2608 FM synthesizer emulator (bsd-3):
+    ;;   src/midisynth.h
+    ;;   src/midisynth.cpp
+    ;; and PicoJSON JSON parser/serializer (bsd-2):
+    ;;   src/picojson.h
+    ;; TODO: Unbundle them.
+    (license license:gpl3+)))
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index 24446bfc9e..be30198ded 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -4807,7 +4807,7 @@ indentation (space indentation only).
 (define-public emacs-elpy
   (package
     (name "emacs-elpy")
-    (version "1.26.0")
+    (version "1.27.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -4816,7 +4816,7 @@ indentation (space indentation only).
               (file-name (string-append name "-" version "-checkout"))
               (sha256
                (base32
-                "0wynzp5xmrgiggmam82n6lfaiqmfl4n3ccpsgnh86r6pbsmssxjk"))))
+                "1b76y0kzk7s9ya8k9bpsgn31i9l0rxs4iz6lg7snhjgh03k0ssgv"))))
     (build-system emacs-build-system)
     (arguments
      `(#:include (cons* "^elpy/[^/]+\\.py$" "^snippets\\/" %default-include)
@@ -5214,26 +5214,28 @@ target will call @code{compile} on it.")
 (define-public emacs-cider
   (package
     (name "emacs-cider")
-    (version "0.15.1")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://github.com/clojure-emacs/cider/archive/v"
-                    version ".tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
-              (sha256
-               (base32
-                "1j5hlmi14ypszv1f9nvq0jjlz7i742flg0ny3055l7i4x089xx6g"))))
+    (version "0.18.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/clojure-emacs/cider.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1m9kc88vga3q5d731qnpngnsa0n57pf21k3hll20rw8rggrx4vdn"))))
     (build-system emacs-build-system)
     (arguments
      '(#:exclude                        ; Don't exclude 'cider-test.el'.
        '("^\\.dir-locals\\.el$" "^test/")))
     (propagated-inputs
      `(("emacs-clojure-mode" ,emacs-clojure-mode)
+       ("emacs-sesman" ,emacs-sesman)
        ("emacs-spinner" ,emacs-spinner)
        ("emacs-pkg-info" ,emacs-pkg-info)
        ("emacs-queue" ,emacs-queue)))
-    (home-page "https://cider.readthedocs.org/")
+    (home-page "https://cider.readthedocs.io/")
     (synopsis "Clojure development environment for Emacs")
     (description
      "CIDER (Clojure Interactive Development Environment that Rocks) aims to
@@ -12737,3 +12739,29 @@ Emacs.")
 rooms.  It also provides an API which allows Emacs to seamlessly create
 RPC channels with users and other software.")
       (license license:gpl3+))))
+
+(define-public emacs-sesman
+  (package
+    (name "emacs-sesman")
+    (version "0.3.3")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/vspinu/sesman.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0r32f8ma9ddczxrrdz0nadp14j3zmk10q1ch02gb82synkx3xdra"))))
+    (build-system emacs-build-system)
+    (arguments
+     `(#:tests? #t
+       #:test-command '("make" "test")))
+    (home-page "https://github.com/vspinu/sesman")
+    (synopsis "Session manager for Emacs based IDEs")
+    (description "Sesman provides facilities for session management and
+interactive session association with the current contexts (project, directory,
+buffers).  While sesman can be used to manage arbitrary sessions, it primary
+targets the Emacs based IDEs (CIDER, ESS, Geiser, Robe, SLIME etc.)")
+    (license license:gpl3+)))
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index f9f8428202..b0cb78c5cb 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -622,7 +622,7 @@ languages, plus Greek and Cyrillic.")
 (define-public font-gnu-unifont
   (package
     (name "font-gnu-unifont")
-    (version "11.0.02")
+    (version "11.0.03")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -630,16 +630,14 @@ languages, plus Greek and Cyrillic.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "1di8i44c163b9l5f08jcrjfijnqz0j7p7hpfvf8dcms6cm6s4wvy"))))
+                "171zhm52c4rzpn19qcq4n9nyfbcjl38v50zslhvgpjdcmc5jvhav"))))
     (build-system gnu-build-system)
-    (outputs '("out" ; TrueType version
-               "pcf" ; PCF (bitmap) version
-               "psf" ; PSF (console) version
-               "bin" ; Utilities to manipulate '.hex' format
-               ))
+    (outputs '("out"   ; TrueType version
+               "pcf"   ; PCF (bitmap) version
+               "psf"   ; PSF (console) version
+               "bin")) ; Utilities to manipulate '.hex' format
     (arguments
-     '(#:parallel-build? #f ; parallel build fails
-       #:tests? #f          ; no check target
+     '(#:tests? #f          ; no check target
        #:phases
        (modify-phases %standard-phases
          (replace
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 34a015bdf7..8a29297805 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -652,6 +652,8 @@ etc.")
               (uri (string-append "https://github.com/liballeg/allegro5/releases"
                                   "/download/" version "/allegro-"
                                   version ".tar.gz"))
+              (patches (search-patches
+                        "allegro-fix-compilation-mesa-18.2.5-and-later.patch"))
               (sha256
                (base32
                 "1w9a5yqi5q03b2qvmx5ff90paz0xbr9cy7i7f0xiqa65ava66q9l"))))
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 7f84e447bb..04521d399a 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -2306,7 +2306,7 @@ world}, @uref{http://evolonline.org, Evol Online} and
 (define openttd-engine
   (package
     (name "openttd-engine")
-    (version "1.7.1")
+    (version "1.8.0")
     (source
      (origin (method url-fetch)
              (uri (string-append "http://binaries.openttd.org/releases/"
@@ -2323,7 +2323,7 @@ world}, @uref{http://evolonline.org, Evol Online} and
                          "02d1xmb75yv4x6rfnvxk3vvq4l3lvvwr2pfsdzn7lzalic51ziqh")))))
              (sha256
               (base32
-               "0dhv5bbbg1dmmq7fi3xss0a9jq2rqgb5sf9fsqzlsjcdm590j6b1"))
+               "0zq8xdg0k92p3s4j9x76591zaqz7k9ra69q008m209vdfffjvly2"))
              (modules '((guix build utils)))
              (snippet
               ;; The DOS port contains proprietary software.
@@ -2353,7 +2353,7 @@ world}, @uref{http://evolonline.org, Evol Online} and
                        configure-flags))))))))
     (native-inputs `(("pkg-config" ,pkg-config)))
     (inputs
-     `(("allegro" ,allegro-4)
+     `(("allegro" ,allegro)
        ("fontconfig" ,fontconfig)
        ("freetype" ,freetype)
        ("icu4c" ,icu4c)
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index 93e470b70d..5582077162 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -62,6 +62,7 @@
   #:use-module (gnu packages gl)
   #:use-module (gnu packages assembly)
   #:use-module (gnu packages rust)
+  #:use-module (gnu packages llvm)
   #:use-module (gnu packages icu4c)
   #:use-module (gnu packages video)
   #:use-module (gnu packages xiph)
@@ -506,16 +507,38 @@ security standards.")
         (search-patch  "icecat-use-system-media-libs.patch")
         (mozilla-patch "icecat-bug-1464061.patch"         "d28761dbff18" "1f58rzwx4s1af66fdwn9lgkcd1ksmq8kn8imvf78p90jqi24h7b4")
         (mozilla-patch "icecat-bug-1479853.patch"         "4faeb696dd06" "12891xx9c15s6kby6d3zk64v5nqgaq7sw597zv1fkd3a6x69hlva")
-        (mozilla-patch "icecat-bug-1488295.patch"         "12ba39f69876" "1piyq44f0xa0a9z2748aqwpaziaxwp61d86gyhalbyag8lcxfb3p")
-        (mozilla-patch "icecat-bug-1500011.patch"         "a0adabeedf26" "0f5wazha3zxzhy2j8f93hx62l9p02b1p40vi07qah3ar67h4ccj9")
-        (mozilla-patch "icecat-bug-1503082.patch"         "19604eb26230" "1wqxgph4z14ijhk2j2m4av5p6gx72d02lzz83q6yy0k065kw8psb")
-        (mozilla-patch "icecat-bug-1499861.patch"         "98737ab09270" "0fyl6wv0jxcxpkfpsff46y93k49n8lrw0k7c1p45g8da015dx27a")
-        (mozilla-patch "icecat-bug-1504452.patch"         "1cf7d80355d5" "19jp4x32vyxam54d1r9fm7jwf6krhhf3xazfqmxb9aw4iwdil7dl")
-        (mozilla-patch "icecat-bug-1494752.patch"         "c264774b8913" "1hxyi131x8jwawrq90cgkph833iv9ixrdrgzl1r978gbzwq10xz2")
+        (mozilla-patch "icecat-CVE-2018-17466.patch"      "12ba39f69876" "1piyq44f0xa0a9z2748aqwpaziaxwp61d86gyhalbyag8lcxfb3p")
+        (mozilla-patch "icecat-CVE-2018-18498.patch"      "a0adabeedf26" "0f5wazha3zxzhy2j8f93hx62l9p02b1p40vi07qah3ar67h4ccj9")
+        (mozilla-patch "icecat-CVE-2018-12405-pt01.patch" "19604eb26230" "1wqxgph4z14ijhk2j2m4av5p6gx72d02lzz83q6yy0k065kw8psb")
+        (mozilla-patch "icecat-CVE-2018-18492.patch"      "98737ab09270" "0fyl6wv0jxcxpkfpsff46y93k49n8lrw0k7c1p45g8da015dx27a")
+        (mozilla-patch "icecat-CVE-2018-18493.patch"      "1cf7d80355d5" "19jp4x32vyxam54d1r9fm7jwf6krhhf3xazfqmxb9aw4iwdil7dl")
+        (mozilla-patch "icecat-CVE-2018-12405-pt02.patch" "c264774b8913" "1hxyi131x8jwawrq90cgkph833iv9ixrdrgzl1r978gbzwq10xz2")
         (mozilla-patch "icecat-bug-1477773.patch"         "ec13fda7c9b0" "0zj7aylgw55g0y7plaafn5gq8jwcsdr1bpdxacs0hq914nm8zy9z")
-        (mozilla-patch "icecat-bug-1500759.patch"         "5e1a9644aeef" "1qimrpgyrd8zkiri7w57j0aymk20y9b34am5w7rvr6qj1lhrbfla")
+        (mozilla-patch "icecat-CVE-2018-12405-pt03.patch" "5e1a9644aeef" "1qimrpgyrd8zkiri7w57j0aymk20y9b34am5w7rvr6qj1lhrbfla")
         (mozilla-patch "icecat-bug-1485655.patch"         "9055726e2d89" "1pppxr94zqh6zmi2mn1ih21qap09vk5ivbhnwxqr8iszvygjg44g")
-        (mozilla-patch "icecat-bug-1410214.patch"         "9e641345e2ef" "0542xss2jdb8drh4g50cfy32l300x69dyywgx3dqs03vgr3qplxy")))
+        (mozilla-patch "icecat-bug-1410214.patch"         "9e641345e2ef" "0542xss2jdb8drh4g50cfy32l300x69dyywgx3dqs03vgr3qplxy")
+
+        (mozilla-patch "icecat-CVE-2018-12405-pt04.patch" "6398541ec302" "1c2yi7mkg3d5afxsgj9fp3zq8yhkmphrll5d60d5xsdv88kqqiyf")
+        (mozilla-patch "icecat-bug-1496736.patch"         "3bed863ee656" "038k7jk3yp16410crwfdvhyb2vis49c6bplrfr83v51885cqldar")
+        (mozilla-patch "icecat-bug-1498765.patch"         "a08c8493ba19" "0bwg4vg03j962lb9q8ihpiy4rmygykf1q9ij8x7h34q7hg43yjya")
+        (mozilla-patch "icecat-CVE-2018-12405-pt05.patch" "ee204e26690e" "1scs45xhlr1mwv6x2q6n22363f42by8cjmifqwzlikggs21f5mcq")
+        (mozilla-patch "icecat-bug-1507035.patch"         "cec8b58ab3fe" "1f131ibpkrhsa44l822hnm5qgvapbs3i9pj25iimdwvr933winz8")
+        (mozilla-patch "icecat-bug-1501680.patch"         "282c6bb81562" "1zgw7l5zmni8468y3f6cip1nlw63cfdd9vv9b00cbrgy96d1q2cp")
+        (mozilla-patch "icecat-bug-1500310.patch"         "b3a439a26186" "0mrjxcmrlv04fyl36dwxk97dw08g2hlikvw2hfa1l0y8zsc4bgw8")
+        (mozilla-patch "icecat-bug-1500366.patch"         "abd59256c4e3" "1jgwh2v4kwb6kf2h7mwf128w1k1jj119bfhlgqpmn9ami35wpzf3")
+        (mozilla-patch "icecat-bug-1493080.patch"         "a7cabf306d05" "1n7wv67rcaz8wj31jc77ssjdj3kb61gdg7pigj828c5z2cgns1k5")
+        (mozilla-patch "icecat-CVE-2018-12405-pt06.patch" "8bbf80948b50" "1nvc69zgz9nvbw1pwxkil1fx4cxxpr6bsjrpp6l2kv7jhgax1bqk")
+        (mozilla-patch "icecat-bug-1507564.patch"         "60619cc47b10" "09fanqr08kqgraw4xp7y2az4jc7ia8nn200rqjfj20vmkyjz97j3")
+        (mozilla-patch "icecat-bug-1507730.patch"         "dd0f01818b9c" "14ziq1bm72n58xrvsgzpjj5z6ifpvi70r5jfhbkbj69mf4y4cx2z")
+        (mozilla-patch "icecat-CVE-2018-12405-pt07.patch" "a73a46ddc848" "1bvvyav3xyn6rgn6haicinxn0dasl9dyc1i37fyb7wr5wcpahybs")
+
+        (mozilla-patch "icecat-CVE-2018-18494.patch"      "a72ec8e21577" "095zghmwdcbaid5426p9vpl757d8sfbsvgn201bjm7nhm03m4z7i")
+        (mozilla-patch "icecat-CVE-2018-12405-pt08.patch" "b6d0fc61fd0b" "0059avawxi4s4747plybjsjq8j2h4z7amw05p28xyg95a2njwnaa")
+        (mozilla-patch "icecat-bug-1499028.patch"         "a62ede2dd3bc" "0ikmnibni8bdvpr9p42wskyyic08vzqdz5qr028bqzyg5119gily")
+        (mozilla-patch "icecat-bug-1426574.patch"         "0db86656655b" "0kmccb4ccdzbzncwklx7w1bg7r61zwl2wnfp67vl27hm9xykbck7")
+        (mozilla-patch "icecat-CVE-2018-12405-pt09.patch" "20e31905de62" "0b5a441645wy3q4asaygvdq0inrxmxrh33cpgdp6ngflq9p2i6h0")
+        (mozilla-patch "icecat-CVE-2018-12405-pt10.patch" "c2832f98fe51" "0b4jfjfdyrihwjdfavd54hn9kdg2f017lmfr7mj2llp71flxwwj7")
+        (mozilla-patch "icecat-bug-1511495.patch"         "d428d2b8f585" "1f9xs0bjhbphvkv60cnvz34sr2rv38jzvi47wh3nablg41yjpdrk")))
       (modules '((guix build utils)))
       (snippet
        '(begin
@@ -620,6 +643,8 @@ security standards.")
       ;; Icecat 60 checkes for rust>=1.24
      `(("rust" ,rust-1.24)
        ("cargo" ,rust-1.24 "cargo")
+       ("llvm" ,llvm-3.9.1)
+       ("clang" ,clang-3.9.1)
        ("perl" ,perl)
        ("python" ,python-2) ; Python 3 not supported
        ("python2-pysqlite" ,python2-pysqlite)
@@ -639,7 +664,7 @@ security standards.")
 
        #:imported-modules ,%cargo-build-system-modules ;for `generate-checksums'
 
-       #:configure-flags '("--enable-default-toolkit=cairo-gtk3"
+       #:configure-flags `("--enable-default-toolkit=cairo-gtk3"
 
                            "--with-distribution-id=org.gnu"
 
@@ -653,14 +678,25 @@ security standards.")
                            "--disable-eme"
                            "--disable-gconf"
 
-                           ;; Stylo requires LLVM/clang.  For now, disable it.
-                           "--disable-stylo"
-
                            ;; Building with debugging symbols takes ~5GiB, so
                            ;; disable it.
                            "--disable-debug"
                            "--disable-debug-symbols"
 
+                           ;; Clang is needed to build Stylo, Mozilla's new
+                           ;; CSS engine.  We must specify the clang paths
+                           ;; manually, because otherwise the Mozilla build
+                           ;; system looks in the directories returned by
+                           ;; llvm-config --bindir and llvm-config --libdir,
+                           ;; which return paths in the llvm package where
+                           ;; clang is not found.
+                           ,(string-append "--with-clang-path="
+                                           (assoc-ref %build-inputs "clang")
+                                           "/bin/clang")
+                           ,(string-append "--with-libclang-path="
+                                           (assoc-ref %build-inputs "clang")
+                                           "/lib")
+
                            ;; Hack to work around missing
                            ;; "unofficial" branding in icecat.
                            "--enable-official-branding"
@@ -754,6 +790,20 @@ security standards.")
                     (generate-checksums dir null-file)))
                 (find-files "third_party/rust" ".cargo-checksum.json")))
              #t))
+         (add-before 'configure 'augment-CPLUS_INCLUDE_PATH
+           (lambda* (#:key build inputs #:allow-other-keys)
+             ;; Here, we add additional entries to CPLUS_INCLUDE_PATH, to work
+             ;; around a problem that otherwise occurs when attempting to
+             ;; build Stylo, which requires Rust and Clang.  Without these
+             ;; additional entries, errors occur during the build indicating
+             ;; that the <cstddef> and "c++config.h" headers cannot be found.
+             ;; Note that the 'build' keyword argument contains the GNU
+             ;; triplet, e.g. "x86_64-unknown-linux-gnu".
+             (let ((gcc (assoc-ref inputs "gcc")))
+               (setenv "CPLUS_INCLUDE_PATH"
+                       (string-append gcc "/include/c++" ":"
+                                      gcc "/include/c++/" build ":"
+                                      (getenv "CPLUS_INCLUDE_PATH"))))))
          (replace
           'configure
           ;; configure does not work followed by both "SHELL=..." and
@@ -770,6 +820,7 @@ security standards.")
               (setenv "SHELL" bash)
               (setenv "CONFIG_SHELL" bash)
               (setenv "AUTOCONF" (which "autoconf")) ; must be autoconf-2.13
+              (setenv "CC" "gcc")  ; apparently needed when Stylo is enabled
               (mkdir "../build")
               (chdir "../build")
               (format #t "build directory: ~s~%" (getcwd))
diff --git a/gnu/packages/ham-radio.scm b/gnu/packages/ham-radio.scm
index 0f96553c65..b73671c8bc 100644
--- a/gnu/packages/ham-radio.scm
+++ b/gnu/packages/ham-radio.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2017, 2018 Arun Isaac <arunisaac@systemreboot.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,9 +20,13 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (gnu packages gtk)
   #:use-module (gnu packages libusb)
   #:use-module (gnu packages pkg-config)
-  #:use-module (guix build-system cmake))
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages xml)
+  #:use-module (guix build-system cmake)
+  #:use-module (guix build-system python))
 
 (define-public rtl-sdr
   (package
@@ -50,3 +54,30 @@
 cheap software defined radio, since the chip allows transferring the raw I/Q
 samples to the host.  @code{rtl-sdr} provides drivers for this purpose.")
     (license license:gpl2+)))
+
+(define-public chirp
+  (package
+    (name "chirp")
+    (version "20181205")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://trac.chirp.danplanet.com/chirp_daily/daily-"
+                           version "/chirp-daily-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1cp280b95j39xaxs50zn55jigg7pyfpm9n098hmsyxrplqn8z43c"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python2-libxml2" ,python2-libxml2)
+       ("python2-pygtk" ,python2-pygtk)
+       ("python2-pyserial" ,python2-pyserial)))
+    (arguments
+     `(#:python ,python-2))
+    (home-page "https://chirp.danplanet.com")
+    (synopsis "Cross-radio programming tool")
+    (description "Chirp is a cross-radio programming tool.  It supports a
+growing list of radios across several manufacturers and allows transferring of
+memory contents between them.")
+    (license (list license:gpl3+
+                   license:lgpl3+)))) ; chirp/elib_intl.py
diff --git a/gnu/packages/ipfs.scm b/gnu/packages/ipfs.scm
index f40c1180ae..82ef0ea028 100644
--- a/gnu/packages/ipfs.scm
+++ b/gnu/packages/ipfs.scm
@@ -20,6 +20,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix git-download)
+  #:use-module (guix download)
   #:use-module (guix build-system go)
   #:use-module (gnu packages golang))
 
@@ -210,3 +211,29 @@ powerful and simple.")
     (description "A subtool for the @command{gx} package manager for packages
 written in Go.")
     (license license:expat)))
+
+(define-public go-ipfs
+  (package
+    (name "go-ipfs")
+    (version "0.4.18")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://dist.ipfs.io/go-ipfs/v" version
+             "/go-ipfs-source.tar.gz"))
+       (sha256
+        (base32
+         "19hfgbyn5sr1bw0cwm3gsjz0w3b3vh3mmkax1906raah30lavj1x"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:unpack-path "github.com/ipfs/go-ipfs"
+       #:import-path "github.com/ipfs/go-ipfs/cmd/ipfs"))
+    (home-page "https://ipfs.io")
+    (synopsis "Go implementation of IPFS, a peer-to-peer hypermedia protocol")
+    (description "IPFS is a global, versioned, peer-to-peer filesystem.  It
+combines good ideas from Git, BitTorrent, Kademlia, SFS, and the Web.  It is
+like a single bittorrent swarm, exchanging git objects.  IPFS provides an
+interface as simple as the HTTP web, but with permanence built in.  You can
+also mount the world at @code{/ipfs}.")
+    (license license:expat)))
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index a09bcfabe5..951c1f4fd3 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -1820,6 +1820,8 @@ new Date();"))
               (sha256
                (base32
                 "0zywq2203b4hx4jms9vbwvjcj1d3k2v3qpx4s33729fkpmid97r4"))
+              (patches (search-patches
+                        "openjdk-10-idlj-reproducibility.patch"))
               (modules '((guix build utils)))
               (snippet
                 `(begin
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 24653dfbe2..18a95eda28 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -400,8 +400,8 @@ It has been modified to remove all non-free binary blobs.")
 ;; supports qemu "virt" machine and possibly a large number of ARM boards.
 ;; See : https://wiki.debian.org/DebianKernel/ARMMP.
 
-(define %linux-libre-version "4.19.7")
-(define %linux-libre-hash "1fj038hz6b7g9gdiw9kggydryf8dvrdsfn81snns9bn5b01yp67n")
+(define %linux-libre-version "4.19.8")
+(define %linux-libre-hash "1rmgf3sbcyb47s3sagac7zrrpznq0vlcbzjzlzir95biy7lbswb3")
 
 (define %linux-libre-4.19-patches
   (list %boot-logo-patch
@@ -423,8 +423,8 @@ It has been modified to remove all non-free binary blobs.")
                     #:patches %linux-libre-4.19-patches
                     #:configuration-file kernel-config))
 
-(define %linux-libre-4.14-version "4.14.86")
-(define %linux-libre-4.14-hash "1w98drq4ns2awwrbbkd6vy9fh219w8bfjfni5zndfycs5yh5hg65")
+(define %linux-libre-4.14-version "4.14.87")
+(define %linux-libre-4.14-hash "1013h3qbsq76vlhrbl3gci25jbwydzm7k0bg08fbq42qrhjq92ak")
 
 (define-public linux-libre-4.14
   (make-linux-libre %linux-libre-4.14-version
@@ -433,8 +433,8 @@ It has been modified to remove all non-free binary blobs.")
                     #:configuration-file kernel-config))
 
 (define-public linux-libre-4.9
-  (make-linux-libre "4.9.143"
-                    "0vg6hs7vc09riyki8lyy73p3ghl6k9q4xfv7dals4s9q61i6b6d6"
+  (make-linux-libre "4.9.144"
+                    "1jckikf1j294gr3sf43bfy3h34q3yqbqgqbj9l0px427h3n2vgkk"
                     %intel-compatible-systems
                     #:configuration-file kernel-config))
 
diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm
index 120d0d5e17..d1c0a2ef37 100644
--- a/gnu/packages/lisp.scm
+++ b/gnu/packages/lisp.scm
@@ -84,8 +84,8 @@
              ,lisp))))
 
 (define-public gcl
-  (let ((commit "5956140b1083e2302a59d7ce2054b0b7c2cbb417")
-        (revision "1")) ;Guix package revision
+  (let ((commit "d3335e2b3deb63f930eb0328e9b05377744c9512")
+        (revision "2")) ;Guix package revision
     (package
       (name "gcl")
       (version (string-append "2.6.12-" revision "."
@@ -98,7 +98,7 @@
                (commit commit)))
          (file-name (string-append "gcl-" version "-checkout"))
          (sha256
-          (base32 "0mwclf2879mh3d9xqkqhghf58lwy7srsnsq9x0f1cc6j302sy4hb"))))
+          (base32 "05v86lhvsby05nzvcd3c4k0wljvgdgd0i6arzd2fx1yd67dl6fgj"))))
       (build-system gnu-build-system)
       (arguments
        `(#:parallel-build? #f  ; The build system seems not to be thread safe.
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index 261d1f013d..794ae7909d 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -1068,7 +1068,7 @@ which can add many functionalities to the base client.")
 (define-public msmtp
   (package
     (name "msmtp")
-    (version "1.8.0")
+    (version "1.8.1")
     (source
      (origin
        (method url-fetch)
@@ -1076,7 +1076,7 @@ which can add many functionalities to the base client.")
                            "/msmtp-" version ".tar.xz"))
        (sha256
         (base32
-         "1k9wwlapkxk9ql3xq05y6vwn6ziqk9b1v8lyhj1866qd02zhqwxx"))))
+         "1nm4vizrnrrnknc4mc8nr7grz9q76m1vraa0hsl5rfm34gnsg8ph"))))
     (build-system gnu-build-system)
     (inputs
      `(("libsecret" ,libsecret)
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 7c0273bad6..8e98f929f7 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -1775,7 +1775,7 @@ scientific applications modeled by partial differential equations.")
        ("mumps" ,mumps-openmpi)
        ("openmpi" ,openmpi)
        ("scalapack" ,scalapack)
-       ("scotch" ,pt-scotch)
+       ("scotch" ,pt-scotch32)
        ,@(package-inputs petsc)))
     (arguments
      (substitute-keyword-arguments (package-arguments petsc)
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index e34f725a40..1500be43b0 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -93,6 +93,7 @@
   #:use-module (guix build-system meson)
   #:use-module (guix build-system perl)
   #:use-module (guix build-system python)
+  #:use-module (guix build-system trivial)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module ((guix licenses) #:prefix license:)
@@ -588,6 +589,12 @@ was initially a fork of xmpppy, but uses non-blocking sockets.")
      `(#:test-target "test_nogui"
        #:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'add-plugin-dirs
+           (lambda _
+             (substitute* "gajim/common/configpaths.py"
+               (("_paths\\['PLUGINS_USER'\\]")
+                "_paths['PLUGINS_USER'],os.getenv('GAJIM_PLUGIN_PATH')"))
+             #t))
          (add-after 'install 'wrap-gi-typelib-path
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
@@ -625,6 +632,18 @@ was initially a fork of xmpppy, but uses non-blocking sockets.")
                  (,(string-append (assoc-ref inputs "gtk+")
                                   "/share/glib-2.0/schemas"))))
              #t)))))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "GAJIM_PLUGIN_PATH")
+            (separator #f)              ;single entry
+            (files '("share/gajim/plugins")))
+           ;; Gajim needs to use the propagated inputs of its plugins.
+           (search-path-specification
+            (variable "PYTHONPATH")
+            (files (list (string-append
+                          "lib/python"
+                          (version-major+minor (package-version python))
+                          "/site-packages"))))))
     (native-inputs
      `(("intltool" ,intltool)
        ("python-docutils" ,python-docutils)
@@ -636,7 +655,6 @@ was initially a fork of xmpppy, but uses non-blocking sockets.")
        ("gtkspell3" ,gtkspell3)
        ("hicolor-icon-theme" ,hicolor-icon-theme)
        ("libsecret" ,libsecret)
-       ("python-axolotl" ,python-axolotl)
        ("python-cssutils" ,python-cssutils)
        ("python-dbus" ,python-dbus)
        ("python-gnupg" ,python-gnupg)
@@ -657,6 +675,41 @@ transformation; audio and video conferences; file transfer; TLS, GPG and
 end-to-end encryption support; XML console.")
     (license license:gpl3)))
 
+(define-public gajim-omemo
+  (package
+    (name "gajim-omemo")
+    (version "2.6.23")
+    (source (origin
+              (method url-fetch/zipbomb)
+              (uri (string-append
+                    "https://ftp.gajim.org/plugins_releases/omemo_"
+                    version ".zip"))
+              (sha256
+               (base32
+                "134zbscbcnhx4smad0ryvx3ngkqlsspafqf0kk8y2d3vcd9bf3pa"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+         (let* ((out (assoc-ref %outputs "out"))
+                (share (in-vicinity out "share/gajim/plugins"))
+                (source (assoc-ref %build-inputs "source")))
+           (mkdir-p share)
+           (copy-recursively source share)
+           #t))))
+    (propagated-inputs
+     `(("python-axolotl" ,python-axolotl)))
+    (home-page
+     "https://dev.gajim.org/gajim/gajim-plugins/wikis/OmemoGajimPlugin")
+    (synopsis "Gajim OMEMO plugin")
+    (description
+     "This package provides the Gajim OMEMO plugin.  OMEMO is an XMPP
+Extension Protocol (XEP) for secure multi-client end-to-end encryption based
+on Axolotl and PEP.")
+    (license license:gpl3+)))
+
 (define-public dino
   ;; The only release tarball is for version 0.0, but it is very old and fails
   ;; to build.
diff --git a/gnu/packages/mtools.scm b/gnu/packages/mtools.scm
index 32eb1dba47..5be3da0137 100644
--- a/gnu/packages/mtools.scm
+++ b/gnu/packages/mtools.scm
@@ -28,7 +28,7 @@
 (define-public mtools
   (package
     (name "mtools")
-    (version "4.0.21")
+    (version "4.0.23")
     (source
      (origin
       (method url-fetch)
@@ -36,7 +36,7 @@
                           version ".tar.bz2"))
       (sha256
        (base32
-        "1kybydx74qgbwpnjvjn49msf8zipchl43d4cq8zzwcyvfkdzw7h2"))))
+        "1qwfxzr964fasxlzhllahk8mzh7c82s808wvly95dsqsflkdp27i"))))
     (build-system gnu-build-system)
     (home-page "https://www.gnu.org/software/mtools/")
     (synopsis "Access MS-DOS disks without mounting")
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 37fcf019bc..e16e64af73 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -3942,9 +3942,9 @@ OSC connections.")
            (lambda* (#:key inputs #:allow-other-keys)
              (with-directory-excursion "faust"
                (delete-file "main.cpp")
-               (zero? (system* "faust" "-i"
-                               "-a" "lv2synth.cpp"
-                               "-o" "main.cpp" "main.dsp"))))))))
+               (invoke "faust" "-i"
+                       "-a" "lv2synth.cpp"
+                       "-o" "main.cpp" "main.dsp")))))))
     (inputs
      `(("boost" ,boost)
        ("lv2" ,lv2)
diff --git a/gnu/packages/patches/allegro-fix-compilation-mesa-18.2.5-and-later.patch b/gnu/packages/patches/allegro-fix-compilation-mesa-18.2.5-and-later.patch
new file mode 100644
index 0000000000..fa273a5dfa
--- /dev/null
+++ b/gnu/packages/patches/allegro-fix-compilation-mesa-18.2.5-and-later.patch
@@ -0,0 +1,41 @@
+Fixes compilation with Mesa >= 18.2.5.
+
+Taken from upstream:
+
+https://github.com/liballeg/allegro5/commit/a40d30e21802ecf5c9382cf34af9b01bd3781e47
+
+diff --git a/include/allegro5/allegro_opengl.h b/include/allegro5/allegro_opengl.h
+index 0f86a6768..652dd024e 100644
+--- a/include/allegro5/allegro_opengl.h
++++ b/include/allegro5/allegro_opengl.h
+@@ -103,10 +103,14 @@
+
+ /* HACK: Prevent both Mesa and SGI's broken headers from screwing us */
+ #define __glext_h_
++#define __gl_glext_h_
+ #define __glxext_h_
++#define __glx_glxext_h_
+ #include <GL/gl.h>
+ #undef  __glext_h_
++#undef  __gl_glext_h_
+ #undef  __glxext_h_
++#undef  __glx_glxext_h_
+
+ #endif /* ALLEGRO_MACOSX */
+
+diff --git a/include/allegro5/opengl/GLext/glx_ext_defs.h b/include/allegro5/opengl/GLext/glx_ext_defs.h
+index 49c502091..fba8aea5d 100644
+--- a/include/allegro5/opengl/GLext/glx_ext_defs.h
++++ b/include/allegro5/opengl/GLext/glx_ext_defs.h
+@@ -1,7 +1,9 @@
+ /* HACK: Prevent both Mesa and SGI's broken headers from screwing us */
+ #define __glxext_h_
++#define __glx_glxext_h_
+ #include <GL/glx.h>
+ #undef __glxext_h_
++#undef __glx_glxext_h_
+
+ #ifndef GLX_VERSION_1_3
+ #define _ALLEGRO_GLX_VERSION_1_3
+--
+2.20.0
diff --git a/gnu/packages/patches/borg-respect-storage-quota.patch b/gnu/packages/patches/borg-respect-storage-quota.patch
deleted file mode 100644
index d23d1ffc01..0000000000
--- a/gnu/packages/patches/borg-respect-storage-quota.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-Make sure the client respects the storage quota set by the server:
-
-https://github.com/borgbackup/borg/issues/4093
-
-Patch copied from upstream source repository:
-
-https://github.com/borgbackup/borg/commit/975cc33206e0e3644626fb7204c34d2157715b61
-
-From 975cc33206e0e3644626fb7204c34d2157715b61 Mon Sep 17 00:00:00 2001
-From: Manu <manu@snapdragon.cc>
-Date: Wed, 3 Oct 2018 23:47:36 +0800
-Subject: [PATCH] Add storage_quota for forced_result if set by serve command.
-
----
- src/borg/archiver.py | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/borg/archiver.py b/src/borg/archiver.py
-index 916725e7..279194c1 100644
---- a/src/borg/archiver.py
-+++ b/src/borg/archiver.py
-@@ -4276,6 +4276,7 @@ def get_args(self, argv, cmd):
-             result.restrict_to_paths = forced_result.restrict_to_paths
-             result.restrict_to_repositories = forced_result.restrict_to_repositories
-             result.append_only = forced_result.append_only
-+            result.storage_quota = forced_result.storage_quota
-         return result
- 
-     def parse_args(self, args=None):
--- 
-2.19.1
-
diff --git a/gnu/packages/patches/openjdk-10-idlj-reproducibility.patch b/gnu/packages/patches/openjdk-10-idlj-reproducibility.patch
new file mode 100644
index 0000000000..b29a06f272
--- /dev/null
+++ b/gnu/packages/patches/openjdk-10-idlj-reproducibility.patch
@@ -0,0 +1,36 @@
+From a0a0c6a43b88d946f2b5484892cf0209bd7c0e68 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?G=C3=A1bor=20Boskovits?= <boskovits@gmail.com>
+Date: Sat, 8 Dec 2018 21:25:31 +0100
+Subject: [PATCH] Make idlj respect SOURCE_DATE_EPOCH.
+
+---
+ .../sun/tools/corba/se/idl/toJavaPortable/Util.java | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/src/java.corba/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Util.java b/src/java.corba/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Util.java
+index 7397619f2..583d6b8e4 100644
+--- a/src/java.corba/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Util.java
++++ b/src/java.corba/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Util.java
+@@ -1146,7 +1146,18 @@ public class Util extends com.sun.tools.corba.se.idl.Util
+     else
+       formatter.setTimeZone (java.util.TimeZone.getDefault ());
+ 
+-    stream.println ("* " + formatter.format (new Date ()));
++    try {
++	String epoch = System.getenv("SOURCE_DATE_EPOCH");
++	if(epoch != null) {
++	    long unixTime = Long.parseLong(epoch);
++	    stream.println ("* " + formatter.format (new Date (unixTime*1000L)));
++	} else {
++	    stream.println ("* " + formatter.format (new Date ()));
++	}
++    } catch (Exception e) {
++	//in case of error fall back to default
++	stream.println ("* " + formatter.format (new Date ()));
++    }
+ 
+     // <daz>
+     ///////////////
+-- 
+2.19.2
+
diff --git a/gnu/packages/patches/polkit-CVE-2018-19788.patch b/gnu/packages/patches/polkit-CVE-2018-19788.patch
new file mode 100644
index 0000000000..58cde6c5dc
--- /dev/null
+++ b/gnu/packages/patches/polkit-CVE-2018-19788.patch
@@ -0,0 +1,197 @@
+Fix CVE-2018-19788:
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-19788
+https://gitlab.freedesktop.org/polkit/polkit/issues/74
+
+Patch copied from upstream source repository:
+
+https://gitlab.freedesktop.org/polkit/polkit/commit/2cb40c4d5feeaa09325522bd7d97910f1b59e379
+
+From 2cb40c4d5feeaa09325522bd7d97910f1b59e379 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
+Date: Mon, 3 Dec 2018 10:28:58 +0100
+Subject: [PATCH] Allow negative uids/gids in PolkitUnixUser and Group objects
+
+(uid_t) -1 is still used as placeholder to mean "unset". This is OK, since
+there should be no users with such number, see
+https://systemd.io/UIDS-GIDS#special-linux-uids.
+
+(uid_t) -1 is used as the default value in class initialization.
+
+When a user or group above INT32_MAX is created, the numeric uid or
+gid wraps around to negative when the value is assigned to gint, and
+polkit gets confused. Let's accept such gids, except for -1.
+
+A nicer fix would be to change the underlying type to e.g. uint32 to
+not have negative values. But this cannot be done without breaking the
+API, so likely new functions will have to be added (a
+polkit_unix_user_new variant that takes a unsigned, and the same for
+_group_new, _set_uid, _get_uid, _set_gid, _get_gid, etc.). This will
+require a bigger patch.
+
+Fixes https://gitlab.freedesktop.org/polkit/polkit/issues/74.
+---
+ src/polkit/polkitunixgroup.c   | 15 +++++++++++----
+ src/polkit/polkitunixprocess.c | 12 ++++++++----
+ src/polkit/polkitunixuser.c    | 13 ++++++++++---
+ 3 files changed, 29 insertions(+), 11 deletions(-)
+
+diff --git a/src/polkit/polkitunixgroup.c b/src/polkit/polkitunixgroup.c
+index c57a1aa..309f689 100644
+--- a/src/polkit/polkitunixgroup.c
++++ b/src/polkit/polkitunixgroup.c
+@@ -71,6 +71,7 @@ G_DEFINE_TYPE_WITH_CODE (PolkitUnixGroup, polkit_unix_group, G_TYPE_OBJECT,
+ static void
+ polkit_unix_group_init (PolkitUnixGroup *unix_group)
+ {
++  unix_group->gid = -1; /* (git_t) -1 is not a valid GID under Linux */
+ }
+ 
+ static void
+@@ -100,11 +101,14 @@ polkit_unix_group_set_property (GObject      *object,
+                                GParamSpec   *pspec)
+ {
+   PolkitUnixGroup *unix_group = POLKIT_UNIX_GROUP (object);
++  gint val;
+ 
+   switch (prop_id)
+     {
+     case PROP_GID:
+-      unix_group->gid = g_value_get_int (value);
++      val = g_value_get_int (value);
++      g_return_if_fail (val != -1);
++      unix_group->gid = val;
+       break;
+ 
+     default:
+@@ -131,9 +135,9 @@ polkit_unix_group_class_init (PolkitUnixGroupClass *klass)
+                                    g_param_spec_int ("gid",
+                                                      "Group ID",
+                                                      "The UNIX group ID",
+-                                                     0,
++                                                     G_MININT,
+                                                      G_MAXINT,
+-                                                     0,
++                                                     -1,
+                                                      G_PARAM_CONSTRUCT |
+                                                      G_PARAM_READWRITE |
+                                                      G_PARAM_STATIC_NAME |
+@@ -166,9 +170,10 @@ polkit_unix_group_get_gid (PolkitUnixGroup *group)
+  */
+ void
+ polkit_unix_group_set_gid (PolkitUnixGroup *group,
+-                          gint gid)
++                           gint gid)
+ {
+   g_return_if_fail (POLKIT_IS_UNIX_GROUP (group));
++  g_return_if_fail (gid != -1);
+   group->gid = gid;
+ }
+ 
+@@ -183,6 +188,8 @@ polkit_unix_group_set_gid (PolkitUnixGroup *group,
+ PolkitIdentity *
+ polkit_unix_group_new (gint gid)
+ {
++  g_return_val_if_fail (gid != -1, NULL);
++
+   return POLKIT_IDENTITY (g_object_new (POLKIT_TYPE_UNIX_GROUP,
+                                        "gid", gid,
+                                        NULL));
+diff --git a/src/polkit/polkitunixprocess.c b/src/polkit/polkitunixprocess.c
+index 972b777..b02b258 100644
+--- a/src/polkit/polkitunixprocess.c
++++ b/src/polkit/polkitunixprocess.c
+@@ -159,9 +159,14 @@ polkit_unix_process_set_property (GObject      *object,
+       polkit_unix_process_set_pid (unix_process, g_value_get_int (value));
+       break;
+ 
+-    case PROP_UID:
+-      polkit_unix_process_set_uid (unix_process, g_value_get_int (value));
++    case PROP_UID: {
++      gint val;
++
++      val = g_value_get_int (value);
++      g_return_if_fail (val != -1);
++      polkit_unix_process_set_uid (unix_process, val);
+       break;
++    }
+ 
+     case PROP_START_TIME:
+       polkit_unix_process_set_start_time (unix_process, g_value_get_uint64 (value));
+@@ -239,7 +244,7 @@ polkit_unix_process_class_init (PolkitUnixProcessClass *klass)
+                                    g_param_spec_int ("uid",
+                                                      "User ID",
+                                                      "The UNIX user ID",
+-                                                     -1,
++                                                     G_MININT,
+                                                      G_MAXINT,
+                                                      -1,
+                                                      G_PARAM_CONSTRUCT |
+@@ -303,7 +308,6 @@ polkit_unix_process_set_uid (PolkitUnixProcess *process,
+                              gint               uid)
+ {
+   g_return_if_fail (POLKIT_IS_UNIX_PROCESS (process));
+-  g_return_if_fail (uid >= -1);
+   process->uid = uid;
+ }
+ 
+diff --git a/src/polkit/polkitunixuser.c b/src/polkit/polkitunixuser.c
+index 8bfd3a1..234a697 100644
+--- a/src/polkit/polkitunixuser.c
++++ b/src/polkit/polkitunixuser.c
+@@ -72,6 +72,7 @@ G_DEFINE_TYPE_WITH_CODE (PolkitUnixUser, polkit_unix_user, G_TYPE_OBJECT,
+ static void
+ polkit_unix_user_init (PolkitUnixUser *unix_user)
+ {
++  unix_user->uid = -1;  /* (uid_t) -1 is not a valid UID under Linux */
+   unix_user->name = NULL;
+ }
+ 
+@@ -112,11 +113,14 @@ polkit_unix_user_set_property (GObject      *object,
+                                GParamSpec   *pspec)
+ {
+   PolkitUnixUser *unix_user = POLKIT_UNIX_USER (object);
++  gint val;
+ 
+   switch (prop_id)
+     {
+     case PROP_UID:
+-      unix_user->uid = g_value_get_int (value);
++      val = g_value_get_int (value);
++      g_return_if_fail (val != -1);
++      unix_user->uid = val;
+       break;
+ 
+     default:
+@@ -144,9 +148,9 @@ polkit_unix_user_class_init (PolkitUnixUserClass *klass)
+                                    g_param_spec_int ("uid",
+                                                      "User ID",
+                                                      "The UNIX user ID",
+-                                                     0,
++                                                     G_MININT,
+                                                      G_MAXINT,
+-                                                     0,
++                                                     -1,
+                                                      G_PARAM_CONSTRUCT |
+                                                      G_PARAM_READWRITE |
+                                                      G_PARAM_STATIC_NAME |
+@@ -182,6 +186,7 @@ polkit_unix_user_set_uid (PolkitUnixUser *user,
+                           gint uid)
+ {
+   g_return_if_fail (POLKIT_IS_UNIX_USER (user));
++  g_return_if_fail (uid != -1);
+   user->uid = uid;
+ }
+ 
+@@ -196,6 +201,8 @@ polkit_unix_user_set_uid (PolkitUnixUser *user,
+ PolkitIdentity *
+ polkit_unix_user_new (gint uid)
+ {
++  g_return_val_if_fail (uid != -1, NULL);
++
+   return POLKIT_IDENTITY (g_object_new (POLKIT_TYPE_UNIX_USER,
+                                         "uid", uid,
+                                         NULL));
+-- 
+2.18.1
+
diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm
index d5e23f6c9e..5a9bc2d64b 100644
--- a/gnu/packages/pdf.scm
+++ b/gnu/packages/pdf.scm
@@ -429,6 +429,7 @@ using the DjVuLibre library.")
     (inputs
      `(("jbig2dec" ,jbig2dec)
        ("libjpeg" ,libjpeg)
+       ("mujs", mujs)
        ("mupdf" ,mupdf)
        ("openjpeg" ,openjpeg)
        ("openssl" ,openssl)
@@ -438,7 +439,18 @@ using the DjVuLibre library.")
      `(#:tests? #f                      ; package does not contain tests
        #:configure-flags (list (string-append "-Dplugindir="
                                               (assoc-ref %outputs "out")
-                                              "/lib/zathura"))))
+                                              "/lib/zathura")
+                               "-Dlink-external=true")
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'add-mujs-to-dependencies
+           (lambda _
+             ;; Add mujs to the 'build_dependencies'.
+             (substitute* "meson.build"
+               (("^  libopenjp2 = dependency.*" x)
+                (string-append x "  mujs = cc.find_library('mujs')\n"))
+               (("^    libopenjp2")
+                "    libopenjp2, mujs")))))))
     (home-page "https://pwmt.org/projects/zathura-pdf-mupdf/")
     (synopsis "PDF support for zathura (mupdf backend)")
     (description "The zathura-pdf-mupdf plugin adds PDF support to zathura
diff --git a/gnu/packages/polkit.scm b/gnu/packages/polkit.scm
index 7cc5205faa..830006d439 100644
--- a/gnu/packages/polkit.scm
+++ b/gnu/packages/polkit.scm
@@ -49,6 +49,7 @@
              (uri (string-append
                    "https://www.freedesktop.org/software/polkit/releases/"
                    name "-" version ".tar.gz"))
+             (patches (search-patches "polkit-CVE-2018-19788.patch"))
              (sha256
               (base32
                "0c91y61y4gy6p91cwbzg32dhavw4b7fflg370rimqhdxpzdfr1rg"))
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 9472a441ef..fd13339ccc 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -908,6 +908,29 @@ version identifier.")
 (define-public python2-semantic-version
   (package-with-python2 python-semantic-version))
 
+(define-public python-serpent
+  (package
+    (name "python-serpent")
+    (version "1.27")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "serpent" version))
+       (sha256
+        (base32
+         "04p9dsrm5pv8vhk3flvih55kgvlzpi38hlaykdiakddmgwqw93bg"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/irmen/Serpent")
+    (synopsis "Serializer for literal Python expressions")
+    (description
+     "Serpent provides ast.literal_eval() compatible object tree
+serialization.  It serializes an object tree into bytes (utf-8 encoded string)
+that can be decoded and then passed as-is to ast.literal_eval() to rebuild it
+as the original object tree.  As such it is safe to send serpent data to other
+machines over the network for instance (because only safe literals are
+encoded).")
+    (license license:expat)))
+
 (define-public python-setuptools
   (package
     (name "python-setuptools")
@@ -1048,6 +1071,32 @@ for additional processing.")
 (define-public python2-capturer
   (package-with-python2 python-capturer))
 
+(define-public python-case
+  (package
+    (name "python-case")
+    (version "1.5.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "case" version))
+       (sha256
+        (base32
+         "1cagg06vfph864s6l5jb0zqliwxh647bki8j6lf4a4qrv40jnhs8"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-mock" ,python-mock)
+       ("python-nose" ,python-nose)
+       ("python-six" ,python-six)
+       ("python-unittest2" ,python-unittest2)))
+    (native-inputs
+     `(("python-coverage" ,python-coverage)))
+    (home-page "https://github.com/celery/case")
+    (synopsis "Unittest utilities and convenience methods")
+    (description
+     "The @code{case} package provides utilities on top of unittest, including
+some helpful Python 2 compatibility convenience methods.")
+    (license license:bsd-3)))
+
 (define-public python-verboselogs
   (package
     (name "python-verboselogs")
@@ -2268,6 +2317,30 @@ object.")
 (define-public python2-pyyaml
   (package-with-python2 python-pyyaml))
 
+(define-public python-vine
+  (package
+    (name "python-vine")
+    (version "1.1.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "vine" version))
+       (sha256
+        (base32
+         "0wkskb2hb494v9gixqnf4bl972p4ibcmxdykzpwjlfa5picns4aj"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-case" ,python-case)))
+    (home-page "https://github.com/celery/vine")
+    (synopsis "Promises for Python")
+    (description
+     "@code{vine} provides a special implementation of promises in that it can
+be used both for \"promise of a value\" and lazy evaluation.  The biggest
+upside for this is that everything in a promise can also be a promise,
+e.g. filters, callbacks and errbacks can all be promises.")
+    (license license:bsd-3)))
+
 (define-public python-virtualenv
   (package
     (name "python-virtualenv")
@@ -8196,18 +8269,21 @@ and provides a uniform API regardless of which JSON implementation is used.")
 (define-public python-amqp
   (package
     (name "python-amqp")
-    (version "1.4.9")
+    (version "2.3.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "amqp" version))
        (sha256
         (base32
-         "06n6q0kxhjnbfz3vn8x9yz09lwmn1xi9d6wxp31h5jbks0b4vsid"))))
+         "1sv600dgqwpimr6i1g59y9hpn50mc236gdqkr7zin13kvlpx0g87"))))
     (build-system python-build-system)
     (native-inputs
-     `(("python-nose" ,python-nose)
+     `(("python-case" ,python-case)
+       ("python-pytest-sugar" ,python-pytest-sugar)
        ("python-mock" ,python-mock)))
+    (propagated-inputs
+     `(("python-vine" ,python-vine)))
     (home-page "https://github.com/celery/py-amqp")
     (synopsis
      "Low-level AMQP client for Python (fork of amqplib)")
@@ -8261,23 +8337,26 @@ applications.")
 (define-public python-kombu
   (package
     (name "python-kombu")
-    (version "3.0.37")
+    (version "4.2.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "kombu" version))
        (sha256
         (base32
-         "0l16chb314gpq2v7fh94a22c30lcv6w3ylmhsa60bldlcq6a0r70"))))
+         "15k8f7mzqr049sg9vi48m19vjykviafk3f0p5xzgw9by0x0kyxjj"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-mock" ,python-mock)
-       ("python-nose" ,python-nose)))
+       ("python-case" ,python-case)
+       ("python-pyro4" ,python-pyro4)
+       ("python-pytest-sugar" ,python-pytest-sugar)
+       ("python-pytz" ,python-pytz)))
     (propagated-inputs
      `(("python-anyjson" ,python-anyjson)
        ("python-amqp" ,python-amqp)
        ("python-redis" ,python-redis)))
-    (home-page "http://kombu.readthedocs.org")
+    (home-page "https://kombu.readthedocs.io")
     (synopsis "Message passing library for Python")
     (description "The aim of Kombu is to make messaging in Python as easy as
 possible by providing an idiomatic high-level interface for the AMQ protocol,
@@ -8303,17 +8382,18 @@ RabbitMQ messaging server is the most popular implementation.")
 (define-public python-billiard
   (package
     (name "python-billiard")
-    (version "3.3.0.23")
+    (version "3.5.0.5")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "billiard" version))
        (sha256
         (base32
-         "02wxsc6bhqvzh8j6w758kvgqbnj14l796mvmrcms8fgfamd2lak9"))))
+         "03msmapj3s5zgqk87d646mafz7a01h5bm2wijalgpi0s80ks5na2"))))
     (build-system python-build-system)
     (native-inputs
-     `(("python-nose" ,python-nose)))
+     `(("python-case" ,python-case)
+       ("python-pytest" ,python-pytest)))
     (home-page "https://github.com/celery/billiard")
     (synopsis
      "Python multiprocessing fork with improvements and bugfixes")
@@ -8337,31 +8417,35 @@ Python 2.4 and 2.5, and will draw its fixes/improvements from python-trunk.")
 (define-public python-celery
   (package
     (name "python-celery")
-    (version "3.1.24")
+    (version "4.2.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "celery" version))
        (sha256
         (base32
-         "0yh2prhdnx2dgkb67a5drj12hh2zvzx5f611p7mqqg01ydghif4r"))))
+         "0y66rz7z8dfcgs3s0qxmdddlaq57bzbgxgfz896nbp14grkv9nkp"))))
     (build-system python-build-system)
     (arguments
-     `(#:phases
+     '(;; TODO The tests fail with Python 3.7
+       ;; https://github.com/celery/celery/issues/4849
+       #:tests? #f
+       #:phases
        (modify-phases %standard-phases
-         ;; These tests break with Python 3.5:
-         ;; https://github.com/celery/celery/issues/2897#issuecomment-253066295
-         (replace 'check
+         (add-after 'unpack 'patch-requirements
            (lambda _
-             (zero?
-               (system* "nosetests" "--exclude=^test_safe_to_remove.*")))))))
+             (substitute* "requirements/test.txt"
+               (("pytest>=3\\.0,<3\\.3")
+                "pytest>=3.0"))
+             #t)))))
     (native-inputs
-     `(("python-nose" ,python-nose)))
+     `(("python-case" ,python-case)
+       ("python-pytest" ,python-pytest)))
     (propagated-inputs
      `(("python-pytz" ,python-pytz)
        ("python-billiard" ,python-billiard)
        ("python-kombu" ,python-kombu)))
-    (home-page "http://celeryproject.org")
+    (home-page "https://celeryproject.org")
     (synopsis "Distributed Task Queue")
     (description "Celery is an asynchronous task queue/job queue based on
 distributed message passing.  It is focused on real-time operation, but
@@ -9226,6 +9310,13 @@ graphviz.")
                            (setenv "CPATH"
                                    (string-append greenlet "/" python)))))
                       #t))
+                  (add-before 'check 'skip-timer-test
+                    (lambda _
+                      ;; XXX: Skip 'TestTimerResolution', which appears to be
+                      ;; unreliable.
+                      (substitute* "src/greentest/test__core_timer.py"
+                                   (("not greentest.RUNNING_ON_CI") "False"))
+                      #t))
                   (replace 'check
                     (lambda _
                       ;; Make sure the build directory is on PYTHONPATH.
@@ -9266,17 +9357,6 @@ to provide a high-level synchronous API on top of the libev event loop.")
                (strip-python2-variant python-gevent))))
     (package
       (inherit base)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-before 'check 'skip-timer-test
-               (lambda _
-                 ;; XXX: Skip 'TestTimerResolution', which appears to be
-                 ;; unreliable.
-                 (substitute* "src/greentest/test__core_timer.py"
-                   (("not greentest.RUNNING_ON_CI") "False"))
-                 #t))))))
       (native-inputs `(,@(package-native-inputs python-gevent)
                        ("python-mock" ,python2-mock))))))
 
@@ -9841,20 +9921,25 @@ characters, mouse support, and auto suggestions.")
 (define-public python-jedi
   (package
     (name "python-jedi")
-    (version "0.12.1")
+    (version "0.13.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "jedi" version))
        (sha256
         (base32
-         "1h8ypnjisn57kiv1zqrkj1im6sbfnhxllqaa8znh39qkd47ys2dl"))))
+         "0j11q42g5vjkyhhjpyy8nb0gdxs78m3rpjai7p1hvgpyl9rkyjdp"))))
     (build-system python-build-system)
     (arguments
-     `(#:phases
+     `( ;; Many tests are failing with Python 3.7.x as of version 0.13.1 (see:
+        ;; https://github.com/davidhalter/jedi/issues/1263)
+       #:tests? #f
+       #:phases
        (modify-phases %standard-phases
-         (replace 'check (lambda _
-                           (invoke "py.test" "-vv"))))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "py.test" "-vv")))))))
     (native-inputs
      `(("python-pytest" ,python-pytest)
        ("python-docopt" ,python-docopt)))
@@ -13258,6 +13343,28 @@ such as figshare or Zenodo.")
 (define-public python2-semver
   (package-with-python2 python-semver))
 
+(define-public python-pyro4
+  (package
+    (name "python-pyro4")
+    (version "4.74")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "Pyro4" version))
+       (sha256
+        (base32
+         "0pzp7c6q3vvkxq0wy9lr6wd5wky40sajz69g697i5rb2q497pvc9"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-serpent" ,python-serpent)))
+    (home-page "https://pyro4.readthedocs.io")
+    (synopsis "Distributed object middleware for Python")
+    (description
+     "Pyro enables you to build applications in which objects can talk to each
+other over the network.  You can just use normal Python method calls to call
+objects on other machines, also known as remote procedure calls (RPC).")
+    (license license:expat)))
+
 (define-public python2-pyro
   (package
     (name "python2-pyro")
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index ef40431733..501736d898 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -191,6 +191,8 @@ safety and thread safety guarantees.")
     (source (rust-source version "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm"
             #:patches '("rust-1.19-mrustc.patch")))
     (outputs '("out" "cargo"))
+    (properties '((timeout . 72000)               ;20 hours
+                  (max-silent-time . 18000)))     ;5 hours (for armel)
     (arguments
      `(#:imported-modules ,%cargo-build-system-modules ;for `generate-checksums'
        #:modules ((guix build utils) (ice-9 match) (guix build gnu-build-system))
@@ -427,6 +429,7 @@ safety and thread safety guarantees.")
     (package
       (inherit base-rust)
       (outputs '("out" "doc" "cargo"))
+      (properties '())
       (arguments
        (substitute-keyword-arguments (package-arguments rust-1.19)
          ((#:phases phases)
diff --git a/gnu/packages/security-token.scm b/gnu/packages/security-token.scm
index 400c053048..fb2526c04a 100644
--- a/gnu/packages/security-token.scm
+++ b/gnu/packages/security-token.scm
@@ -51,6 +51,7 @@
   #:use-module (gnu packages tex)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages web)
   #:use-module (gnu packages xml))
 
 (define-public ccid
@@ -307,3 +308,36 @@ and other operations.  It includes a library and a command-line tool.")
     ;; license for that one file.  Please see it for details.  The vast
     ;; majority of files are licensed under bsd-2.
     (license license:bsd-2)))
+
+(define-public yubikey-personalization
+  (package
+    (name "yubikey-personalization")
+    (version "1.19.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://developers.yubico.com/" name
+                    "/Releases/ykpers-" version ".tar.gz"))
+              (sha256
+               (base32
+                "104lc0nnqdr365fa7c4vrq67rxp1dp8idndsh9jlhnj9dnhszj1b"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:configure-flags (list (string-append "--with-udevrulesdir="
+                                              (assoc-ref %outputs "out")
+                                              "/lib/udev/rules.d"))))
+    (inputs
+     `(("json-c" ,json-c)
+       ("libusb" ,libusb)
+       ;; The library "libyubikey" is also known as "yubico-c".
+       ("libyubikey" ,libyubikey)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("eudev" ,eudev)))
+    (home-page "https://developers.yubico.com/yubikey-personalization/")
+    (synopsis "Library and tools to personalize YubiKeys")
+    (description
+     "The YubiKey Personalization package contains a C library and command
+line tools for personalizing YubiKeys.  You can use these to set an AES key,
+retrieve a YubiKey's serial number, and so forth.")
+    (license license:bsd-2)))
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 73be90d0d3..acd175fe09 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -529,13 +529,13 @@ netcat implementation that supports TLS.")
   (package
     (name "python-acme")
     ;; Remember to update the hash of certbot when updating python-acme.
-    (version "0.28.0")
+    (version "0.29.1")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "acme" version))
               (sha256
                (base32
-                "11dvcbdifn5d02p4k5li8r6r39bl3p5ap9p3zjwvasm24hf2yz5z"))))
+                "0z5l966b1asbcdzl77bmywf22c1q0xill00jj7qyml9wx2nh7qm2"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -586,7 +586,7 @@ netcat implementation that supports TLS.")
               (uri (pypi-uri name version))
               (sha256
                (base32
-                "02h959qkq7z0s13ivgf7jyl3gnc55wcck6n546k0kh155bpf5qri"))))
+                "14i6yrcb9s7ygy99gccfc8jscymi24xb72s5lgg9b2y40z909ikg"))))
     (build-system python-build-system)
     (arguments
      `(,@(substitute-keyword-arguments (package-arguments python-acme)
diff --git a/gnu/packages/tor.scm b/gnu/packages/tor.scm
index a9bbebcd13..764ee52b0a 100644
--- a/gnu/packages/tor.scm
+++ b/gnu/packages/tor.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2016, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017 Nils Gillmann <ng0@n0.is>
 ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2017 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2017, 2018 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2017 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;;
@@ -162,7 +162,7 @@ networks.")
 (define-public onionshare
   (package
     (name "onionshare")
-    (version "0.9.2")
+    (version "1.3.1")
     (source
       (origin
         (method git-fetch)
@@ -172,7 +172,7 @@ networks.")
         (file-name (git-file-name name version))
         (sha256
          (base32
-          "1nzr6m3jp04p1i8b652s27zv0xhybl3zwcn5r6l9h0f7d7x4iglv"))))
+          "02zic4cxwrcfdg22dq9c2rzni3l18wynjxd38scc59s37vlw7w2r"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -181,55 +181,24 @@ networks.")
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out        (assoc-ref outputs "out"))
                     (onionshare (string-append out "/share/onionshare")))
-               (substitute* "onionshare/strings.py"
-                 ;; correct the locale directory
-                 (("helpers.get_resource_path\\('locale'\\)")
-                  (string-append "'" onionshare "/locale'")))
-               (substitute* "onionshare/helpers.py"
-                 ;; correct the location of version.txt
-                 (("get_resource_path\\('version.txt'\\)")
-                  (string-append "'" onionshare "/version.txt'"))
-                 (("get_resource_path\\('wordlist.txt'\\)")
-                  (string-append "'" onionshare "/wordlist.txt'")))
-               (substitute* "onionshare/web.py"
-                 ;; fix the location of the html files
-                 (("helpers.get_resource_path\\('html/denied.html'\\)")
-                  (string-append "'" onionshare "/html/denied.html'"))
-                 (("helpers.get_resource_path\\('html/404.html'\\)")
-                  (string-append "'" onionshare "/html/404.html'"))
-                 (("helpers.get_resource_path\\('html/index.html'\\)")
-                  (string-append "'" onionshare "/html/index.html'")))
-               (substitute* "onionshare_gui/file_selection.py"
-                 ;; fancy box image in the GUI
-                 (("helpers.get_resource_path\\('images/drop_files.png'\\)")
-                  (string-append "'" onionshare "/images/drop_files.png'")))
-               (substitute* "onionshare_gui/server_status.py"
-                 (("helpers.get_resource_path\\('images/server_stopped.png'\\)")
-                  (string-append "'" onionshare "/images/server_stopped.png'"))
-                 (("helpers.get_resource_path\\('images/server_working.png'\\)")
-                  (string-append "'" onionshare "/images/server_working.png'"))
-                 (("helpers.get_resource_path\\('images/server_started.png'\\)")
-                  (string-append "'" onionshare "/images/server_started.png'")))
-               (substitute* "onionshare_gui/onionshare_gui.py"
-                  ;; for the icon on the GUI
-                 (("helpers.get_resource_path\\('images/logo.png'\\)")
-                  (string-append "'" onionshare "/images/logo.png'")))
-               (substitute* '("setup.py" "onionshare/helpers.py")
+               (substitute* '("setup.py" "onionshare/common.py")
                  (("sys.prefix,") (string-append "'" out "',")))
                (substitute* "setup.py"
                  ;; for the nautilus plugin
                  (("/usr/share/nautilus") "share/nautilus"))
-             #t)))
+               (substitute* "install/onionshare.desktop"
+                 (("/usr") out))
+               #t)))
          (delete 'check)
          (add-before 'strip 'tests
            ;; After all the patching we run the tests after installing.
            ;; This is also a known issue:
            ;; https://github.com/micahflee/onionshare/issues/284
            (lambda _
-             (invoke "nosetests" "test")
+             (invoke "pytest" "test")
              #t)))))
     (native-inputs
-     `(("python-nose" ,python-nose)))
+     `(("python-pytest" ,python-pytest)))
     (inputs
      `(("python-flask" ,python-flask)
        ("python-nautilus" ,python-nautilus)
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index d068c30735..f37936ee5e 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -146,14 +146,14 @@ as well as the classic centralized workflow.")
    (name "git")
    ;; XXX When updating Git, check if the special 'git-source' input to cgit
    ;; needs to be updated as well.
-   (version "2.19.2")
+   (version "2.20.0")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://kernel.org/software/scm/git/git-"
                                 version ".tar.xz"))
             (sha256
              (base32
-              "1scbggzghkzzfqg4ky3qh7h9w87c3zya4ls5disz7dbx56is7sgw"))))
+              "07yq186wb3wqvvmzhhsca57m979p7jprkk4h2a516jz1fd87755w"))))
    (build-system gnu-build-system)
    (native-inputs
     `(("native-perl" ,perl)
@@ -166,7 +166,7 @@ as well as the classic centralized workflow.")
                 version ".tar.xz"))
           (sha256
            (base32
-            "1sqhllkabylm46paswg0j54fiar44fmcdmkjkysmjn2gj6hqpz95"))))
+            "141n20migxaazy0vfkivjk6bzazi3ydyq7qkf6wmkg186l4amgbr"))))
       ;; For subtree documentation.
       ("asciidoc" ,asciidoc)
       ("docbook-xsl" ,docbook-xsl)
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 18fdffeb98..d039bfe048 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -1496,7 +1496,7 @@ audio, images) from the Web.  It can use either mpv or vlc for playback.")
 (define-public youtube-viewer
   (package
     (name "youtube-viewer")
-    (version "3.4.1")
+    (version "3.5.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1505,7 +1505,7 @@ audio, images) from the Web.  It can use either mpv or vlc for playback.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0axgb95lx81psgrb2a5rfdd8gl4mhsrzf41jas6l58d1xkaj54ri"))))
+                "1s7hv2a46cx2nbdykrijqfh8hdkf3zqn6q8sg3ajnnc5agaspyrg"))))
     (build-system perl-build-system)
     (native-inputs
      `(("perl-module-build" ,perl-module-build)))
@@ -3264,3 +3264,23 @@ API.  It includes bindings for Python, Ruby, and other languages.")
 helps you create the film you have always dreamed of.  Easily add sub-titles,
 transitions, and effects and then export your film to many common formats.")
     (license license:gpl3+)))
+
+(define-public dav1d
+  (package
+    (name "dav1d")
+    (version "0.1.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "https://downloads.videolan.org/pub/videolan/"
+                            "dav1d/" version "/dav1d-" version ".tar.xz"))
+        (sha256
+         (base32
+          "0dw0liday8cbyrirhm6bgzhxg4cdy66nspfkdlq338gdsfqcvrsc"))))
+    (build-system meson-build-system)
+    (native-inputs `(("nasm" ,nasm)))
+    (home-page "https://code.videolan.org/videolan/dav1d")
+    (synopsis "AV1 decoder")
+    (description "dav1d is a new AV1 cross-platform decoder, and focused on
+speed and correctness.")
+    (license license:bsd-2)))
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 89e39f7690..b10f5cbaf1 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -1604,7 +1604,15 @@ failed to register public key '~a': ~a~%" key status)))))))
                             '())
                      #$@(if tmpdir
                             (list (string-append "TMPDIR=" tmpdir))
-                            '()))
+                            '())
+
+                     ;; Make sure we run in a UTF-8 locale so that 'guix
+                     ;; offload' correctly restores nars that contain UTF-8
+                     ;; file names such as 'nss-certs'.  See
+                     ;; <https://bugs.gnu.org/32942>.
+                     (string-append "GUIX_LOCPATH="
+                                    #$glibc-utf8-locales "/lib/locale")
+                     "LC_ALL=en_US.utf8")
 
                #:log-file #$log-file))
            (stop #~(make-kill-destructor))))))
diff --git a/guix/channels.scm b/guix/channels.scm
index e57da68149..75503bb0ae 100644
--- a/guix/channels.scm
+++ b/guix/channels.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -27,6 +28,7 @@
   #:use-module (guix store)
   #:use-module (guix i18n)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-2)
   #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-11)
   #:autoload   (guix self) (whole-package)
@@ -73,7 +75,6 @@
   (commit    channel-commit (default #f))
   (location  channel-location
              (default (current-source-location)) (innate)))
-;; TODO: Add a way to express dependencies among channels.
 
 (define %default-channels
   ;; Default list of channels.
@@ -93,6 +94,12 @@
   (commit    channel-instance-commit)
   (checkout  channel-instance-checkout))
 
+(define-record-type <channel-metadata>
+  (channel-metadata version dependencies)
+  channel-metadata?
+  (version       channel-metadata-version)
+  (dependencies  channel-metadata-dependencies))
+
 (define (channel-reference channel)
   "Return the \"reference\" for CHANNEL, an sexp suitable for
 'latest-repository-commit'."
@@ -100,20 +107,90 @@
     (#f      `(branch . ,(channel-branch channel)))
     (commit  `(commit . ,(channel-commit channel)))))
 
-(define (latest-channel-instances store channels)
+(define (read-channel-metadata instance)
+  "Return a channel-metadata record read from the channel INSTANCE's
+description file, or return #F if the channel instance does not include the
+file."
+  (let* ((source (channel-instance-checkout instance))
+         (meta-file (string-append source "/.guix-channel")))
+    (and (file-exists? meta-file)
+         (and-let* ((raw (call-with-input-file meta-file read))
+                    (version (and=> (assoc-ref raw 'version) first))
+                    (dependencies (or (assoc-ref raw 'dependencies) '())))
+           (channel-metadata
+            version
+            (map (lambda (item)
+                   (let ((get (lambda* (key #:optional default)
+                                (or (and=> (assoc-ref item key) first) default))))
+                     (and-let* ((name (get 'name))
+                                (url (get 'url))
+                                (branch (get 'branch "master")))
+                       (channel
+                        (name name)
+                        (branch branch)
+                        (url url)
+                        (commit (get 'commit))))))
+                 dependencies))))))
+
+(define (channel-instance-dependencies instance)
+  "Return the list of channels that are declared as dependencies for the given
+channel INSTANCE."
+  (match (read-channel-metadata instance)
+    (#f '())
+    (($ <channel-metadata> version dependencies)
+     dependencies)))
+
+(define* (latest-channel-instances store channels #:optional (previous-channels '()))
   "Return a list of channel instances corresponding to the latest checkouts of
-CHANNELS."
-  (map (lambda (channel)
-         (format (current-error-port)
-                 (G_ "Updating channel '~a' from Git repository at '~a'...~%")
-                 (channel-name channel)
-                 (channel-url channel))
-         (let-values (((checkout commit)
-                       (latest-repository-commit store (channel-url channel)
-                                                 #:ref (channel-reference
-                                                        channel))))
-           (channel-instance channel commit checkout)))
-       channels))
+CHANNELS and the channels on which they depend.  PREVIOUS-CHANNELS is a list
+of previously processed channels."
+  ;; Only process channels that are unique, or that are more specific than a
+  ;; previous channel specification.
+  (define (ignore? channel others)
+    (member channel others
+            (lambda (a b)
+              (and (eq? (channel-name a) (channel-name b))
+                   (or (channel-commit b)
+                       (not (or (channel-commit a)
+                                (channel-commit b))))))))
+  ;; Accumulate a list of instances.  A list of processed channels is also
+  ;; accumulated to decide on duplicate channel specifications.
+  (match (fold (lambda (channel acc)
+                 (match acc
+                   ((#:channels previous-channels #:instances instances)
+                    (if (ignore? channel previous-channels)
+                        acc
+                        (begin
+                          (format (current-error-port)
+                                  (G_ "Updating channel '~a' from Git repository at '~a'...~%")
+                                  (channel-name channel)
+                                  (channel-url channel))
+                          (let-values (((checkout commit)
+                                        (latest-repository-commit store (channel-url channel)
+                                                                  #:ref (channel-reference
+                                                                         channel))))
+                            (let ((instance (channel-instance channel commit checkout)))
+                              (let-values (((new-instances new-channels)
+                                            (latest-channel-instances
+                                             store
+                                             (channel-instance-dependencies instance)
+                                             previous-channels)))
+                                `(#:channels
+                                  ,(append (cons channel new-channels)
+                                           previous-channels)
+                                  #:instances
+                                  ,(append (cons instance new-instances)
+                                           instances))))))))))
+               `(#:channels ,previous-channels #:instances ())
+               channels)
+    ((#:channels channels #:instances instances)
+     (let ((instance-name (compose channel-name channel-instance-channel)))
+       ;; Remove all earlier channel specifications if they are followed by a
+       ;; more specific one.
+       (values (delete-duplicates instances
+                                  (lambda (a b)
+                                    (eq? (instance-name a) (instance-name b))))
+               channels)))))
 
 (define* (checkout->channel-instance checkout
                                      #:key commit
@@ -235,8 +312,21 @@ INSTANCES."
           (lambda (instance)
             (if (eq? instance core-instance)
                 (return core)
-                (build-channel-instance instance
-                                        (cons core dependencies))))
+                (match (channel-instance-dependencies instance)
+                  (()
+                   (build-channel-instance instance
+                                           (cons core dependencies)))
+                  (channels
+                   (mlet %store-monad ((dependencies-derivation
+                                        (latest-channel-derivation
+                                         ;; %default-channels is used here to
+                                         ;; ensure that the core channel is
+                                         ;; available for channels declared as
+                                         ;; dependencies.
+                                         (append channels %default-channels))))
+                     (build-channel-instance instance
+                                             (cons dependencies-derivation
+                                                   (cons core dependencies))))))))
           instances)))
 
 (define (whole-package-for-legacy name modules)
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index 60e822b16b..1d86f949c8 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -179,24 +179,24 @@ specified with `--select'.\n"))
 
   (let* ((packages (fold-packages cons '()))
          (total    (length packages)))
-    (define covered
-      (fold (lambda (updater covered)
-              (let ((matches (count (upstream-updater-predicate updater)
-                                    packages)))
+    (define uncovered
+      (fold (lambda (updater uncovered)
+              (let ((matches (filter (upstream-updater-predicate updater)
+                                     packages)))
                 ;; TRANSLATORS: The parenthetical expression here is rendered
                 ;; like "(42% coverage)" and denotes the fraction of packages
                 ;; covered by the given updater.
                 (format #t (G_ "  - ~a: ~a (~2,1f% coverage)~%")
                         (upstream-updater-name updater)
                         (G_ (upstream-updater-description updater))
-                        (* 100. (/ matches total)))
-                (+ covered matches)))
-            0
+                        (* 100. (/ (length matches) total)))
+                (lset-difference eq? uncovered matches)))
+            packages
             (force %updaters)))
 
     (newline)
     (format #t (G_ "~2,1f% of the packages are covered by these updaters.~%")
-            (* 100. (/ covered total))))
+            (* 100. (/ (- total (length uncovered)) total))))
   (exit 0))
 
 (define (warn-no-updater package)
diff --git a/tests/channels.scm b/tests/channels.scm
new file mode 100644
index 0000000000..f3fc383ac3
--- /dev/null
+++ b/tests/channels.scm
@@ -0,0 +1,139 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (test-channels)
+  #:use-module (guix channels)
+  #:use-module ((guix build syscalls) #:select (mkdtemp!))
+  #:use-module (guix tests)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-64)
+  #:use-module (ice-9 match))
+
+(test-begin "channels")
+
+(define* (make-instance #:key
+                        (name 'fake)
+                        (commit "cafebabe")
+                        (spec #f))
+  (define instance-dir (mkdtemp! "/tmp/checkout.XXXXXX"))
+  (and spec
+       (with-output-to-file (string-append instance-dir "/.guix-channel")
+         (lambda _ (format #t "~a" spec))))
+  ((@@ (guix channels) channel-instance)
+   name commit instance-dir))
+
+(define instance--boring (make-instance))
+(define instance--no-deps
+  (make-instance #:spec
+                 '(channel
+                   (version 0)
+                   (dependencies
+                    (channel
+                     (name test-channel)
+                     (url "https://example.com/test-channel"))))))
+(define instance--simple
+  (make-instance #:spec
+                 '(channel
+                   (version 0)
+                   (dependencies
+                    (channel
+                     (name test-channel)
+                     (url "https://example.com/test-channel"))))))
+(define instance--with-dupes
+  (make-instance #:spec
+                 '(channel
+                   (version 0)
+                   (dependencies
+                    (channel
+                     (name test-channel)
+                     (url "https://example.com/test-channel"))
+                    (channel
+                     (name test-channel)
+                     (url "https://example.com/test-channel")
+                     (commit "abc1234"))
+                    (channel
+                     (name test-channel)
+                     (url "https://example.com/test-channel-elsewhere"))))))
+
+(define read-channel-metadata
+  (@@ (guix channels) read-channel-metadata))
+
+
+(test-equal "read-channel-metadata returns #f if .guix-channel does not exist"
+  #f
+  (read-channel-metadata instance--boring))
+
+(test-assert "read-channel-metadata returns <channel-metadata>"
+  (every (@@ (guix channels) channel-metadata?)
+         (map read-channel-metadata
+              (list instance--no-deps
+                    instance--simple
+                    instance--with-dupes))))
+
+(test-assert "read-channel-metadata dependencies are channels"
+  (let ((deps ((@@ (guix channels) channel-metadata-dependencies)
+               (read-channel-metadata instance--simple))))
+    (match deps
+      (((? channel? dep)) #t)
+      (_ #f))))
+
+(test-assert "latest-channel-instances includes channel dependencies"
+  (let* ((channel (channel
+                   (name 'test)
+                   (url "test")))
+         (test-dir (channel-instance-checkout instance--simple)))
+    (mock ((guix git) latest-repository-commit
+           (lambda* (store url #:key ref)
+             (match url
+               ("test" (values test-dir 'whatever))
+               (_ (values "/not-important" 'not-important)))))
+          (let ((instances (latest-channel-instances #f (list channel))))
+            (and (eq? 2 (length instances))
+                 (lset= eq?
+                        '(test test-channel)
+                        (map (compose channel-name channel-instance-channel)
+                             instances)))))))
+
+(test-assert "latest-channel-instances excludes duplicate channel dependencies"
+  (let* ((channel (channel
+                   (name 'test)
+                   (url "test")))
+         (test-dir (channel-instance-checkout instance--with-dupes)))
+    (mock ((guix git) latest-repository-commit
+           (lambda* (store url #:key ref)
+             (match url
+               ("test" (values test-dir 'whatever))
+               (_ (values "/not-important" 'not-important)))))
+          (let ((instances (latest-channel-instances #f (list channel))))
+            (and (eq? 2 (length instances))
+                 (lset= eq?
+                        '(test test-channel)
+                        (map (compose channel-name channel-instance-channel)
+                             instances))
+                 ;; only the most specific channel dependency should remain,
+                 ;; i.e. the one with a specified commit.
+                 (find (lambda (instance)
+                         (and (eq? (channel-name
+                                    (channel-instance-channel instance))
+                                   'test-channel)
+                              (eq? (channel-commit
+                                    (channel-instance-channel instance))
+                                   'abc1234)))
+                       instances))))))
+
+(test-end "channels")