summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarius Bakke <mbakke@fastmail.com>2019-07-10 00:55:42 +0200
committerMarius Bakke <mbakke@fastmail.com>2019-07-10 00:55:42 +0200
commit7a05fdd0e1d5e5e26e94014d87bf85575bbec780 (patch)
tree6f68b8832b4465c9aeee734997c168840b7b1ee0
parent36175a3a9eb5bd4096de4e06e1f6b0e8cd895d84 (diff)
parent760d90cc6a5c0f9eb46ad18a30da5520fac2525e (diff)
downloadguix-7a05fdd0e1d5e5e26e94014d87bf85575bbec780.tar.gz
Merge branch 'master' into staging
-rw-r--r--Makefile.am2
-rw-r--r--doc/build.scm563
-rw-r--r--doc/guix.texi8
-rwxr-xr-xetc/guix-install.sh19
-rw-r--r--gnu/local.mk5
-rw-r--r--gnu/packages/algebra.scm16
-rw-r--r--gnu/packages/bioconductor.scm6
-rw-r--r--gnu/packages/bioinformatics.scm27
-rw-r--r--gnu/packages/bootloaders.scm28
-rw-r--r--gnu/packages/chromium.scm6
-rw-r--r--gnu/packages/databases.scm23
-rw-r--r--gnu/packages/disk.scm4
-rw-r--r--gnu/packages/education.scm4
-rw-r--r--gnu/packages/emacs-xyz.scm319
-rw-r--r--gnu/packages/gnome.scm7
-rw-r--r--gnu/packages/gnunet.scm6
-rw-r--r--gnu/packages/gps.scm4
-rw-r--r--gnu/packages/linux.scm4
-rw-r--r--gnu/packages/llvm.scm6
-rw-r--r--gnu/packages/music.scm4
-rw-r--r--gnu/packages/package-management.scm6
-rw-r--r--gnu/packages/patches/csvkit-fix-tests.patch45
-rw-r--r--gnu/packages/patches/grub-binutils-compat.patch53
-rw-r--r--gnu/packages/patches/grub-check-error-efibootmgr.patch197
-rw-r--r--gnu/packages/patches/grub-efi-fat-serial-number.patch17
-rw-r--r--gnu/packages/patches/python-slugify-depend-on-unidecode.patch22
-rw-r--r--gnu/packages/python-web.scm31
-rw-r--r--gnu/packages/python-xyz.scm22
-rw-r--r--gnu/packages/time.scm21
-rw-r--r--gnu/packages/web.scm52
-rw-r--r--gnu/packages/wget.scm13
-rw-r--r--gnu/packages/wine.scm6
-rw-r--r--gnu/packages/wireservice.scm267
-rw-r--r--gnu/packages/wm.scm6
-rw-r--r--guix/channels.scm16
-rw-r--r--guix/discovery.scm4
-rw-r--r--guix/scripts/environment.scm67
-rw-r--r--guix/self.scm3
-rw-r--r--release.nix129
-rw-r--r--tests/guix-environment.sh8
40 files changed, 1420 insertions, 626 deletions
diff --git a/Makefile.am b/Makefile.am
index c5dcf4113e..82eda6042a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -544,7 +544,7 @@ EXTRA_DIST +=						\
   tests/cve-sample.xml					\
   build-aux/config.rpath				\
   bootstrap						\
-  release.nix						\
+  doc/build.scm						\
   $(TESTS)
 
 if !BUILD_DAEMON_OFFLOAD
diff --git a/doc/build.scm b/doc/build.scm
new file mode 100644
index 0000000000..e628a91048
--- /dev/null
+++ b/doc/build.scm
@@ -0,0 +1,563 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.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/>.
+
+
+;; This file contains machinery to build HTML and PDF copies of the manual
+;; that can be readily published on the web site.  To do that, run:
+;;
+;;  guix build -f build.scm
+;;
+;; The result is a directory hierarchy that can be used as the manual/
+;; sub-directory of the web site.
+
+(use-modules (guix)
+             (guix gexp)
+             (guix git)
+             (guix git-download)
+             (git)
+             (gnu packages base)
+             (gnu packages gawk)
+             (gnu packages gettext)
+             (gnu packages guile)
+             (gnu packages texinfo)
+             (gnu packages tex)
+             (srfi srfi-19)
+             (srfi srfi-71))
+
+(define file-append*
+  (@@ (guix self) file-append*))
+
+(define translated-texi-manuals
+  (@@ (guix self) translate-texi-manuals))
+
+(define info-manual
+  (@@ (guix self) info-manual))
+
+(define %languages
+  '("de" "en" "es" "fr" "ru" "zh_CN"))
+
+(define (texinfo-manual-images source)
+  "Return a directory containing all the images used by the user manual, taken
+from SOURCE, the root of the source tree."
+  (define graphviz
+    (module-ref (resolve-interface '(gnu packages graphviz))
+                'graphviz))
+
+  (define images
+    (file-append* source "doc/images"))
+
+  (define build
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (srfi srfi-26))
+
+          (define (dot->image dot-file format)
+            (invoke #+(file-append graphviz "/bin/dot")
+                    "-T" format "-Gratio=.9" "-Gnodesep=.005"
+                    "-Granksep=.00005" "-Nfontsize=9"
+                    "-Nheight=.1" "-Nwidth=.1"
+                    "-o" (string-append #$output "/"
+                                        (basename dot-file ".dot")
+                                        "." format)
+                    dot-file))
+
+          ;; Build graphs.
+          (mkdir-p #$output)
+          (for-each (lambda (dot-file)
+                      (for-each (cut dot->image dot-file <>)
+                                '("png" "pdf")))
+                    (find-files #$images "\\.dot$"))
+
+          ;; Copy other PNGs.
+          (for-each (lambda (png-file)
+                      (install-file png-file #$output))
+                    (find-files #$images "\\.png$")))))
+
+  (computed-file "texinfo-manual-images" build))
+
+(define* (texinfo-manual-source source #:key
+                                (version "0.0")
+                                (languages %languages)
+                                (date 1))
+  "Gather all the source files of the Texinfo manuals from SOURCE--.texi file
+as well as images, OS examples, and translations."
+  (define documentation
+    (file-append* source "doc"))
+
+  (define examples
+    (file-append* source "gnu/system/examples"))
+
+  (define build
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (srfi srfi-19))
+
+          (define (make-version-texi language)
+            ;; Create the 'version.texi' file for LANGUAGE.
+            (let ((file (if (string=? language "en")
+                            "version.texi"
+                            (string-append "version-" language ".texi"))))
+              (call-with-output-file (string-append #$output "/" file)
+                (lambda (port)
+                  (let* ((version #$version)
+                         (time    (make-time time-utc 0 #$date))
+                         (date    (time-utc->date time)))
+                    (format port "
+@set UPDATED ~a
+@set UPDATED-MONTH ~a
+@set EDITION ~a
+@set VERSION ~a\n"
+                            (date->string date "~e ~B ~Y")
+                            (date->string date "~B ~Y")
+                            version version))))))
+
+          (install-file #$(file-append* documentation "/htmlxref.cnf")
+                        #$output)
+
+          (for-each (lambda (texi)
+                      (install-file texi #$output))
+                    (append (find-files #$documentation "\\.(texi|scm)$")
+                            (find-files #$(translated-texi-manuals source)
+                                        "\\.texi$")))
+
+          ;; Create 'version.texi'.
+          (for-each make-version-texi '#$languages)
+
+          ;; Copy configuration templates that the manual includes.
+          (for-each (lambda (template)
+                      (copy-file template
+                                 (string-append
+                                  #$output "/os-config-"
+                                  (basename template ".tmpl")
+                                  ".texi")))
+                    (find-files #$examples "\\.tmpl$"))
+
+          (symlink #$(texinfo-manual-images source)
+                   (string-append #$output "/images")))))
+
+  (computed-file "texinfo-manual-source" build))
+
+(define %web-site-url
+  ;; URL of the web site home page.
+  (or (getenv "GUIX_WEB_SITE_URL")
+      "/software/guix/"))
+
+(define %makeinfo-html-options
+  ;; Options passed to 'makeinfo --html'.
+  '("--css-ref=https://www.gnu.org/software/gnulib/manual.css"))
+
+(define* (html-manual source #:key (languages %languages)
+                      (version "0.0")
+                      (manual "guix")
+                      (date 1)
+                      (options %makeinfo-html-options))
+  "Return the HTML manuals built from SOURCE for all LANGUAGES, with the given
+makeinfo OPTIONS."
+  (define manual-source
+    (texinfo-manual-source source
+                           #:version version
+                           #:languages languages
+                           #:date date))
+
+  (define build
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (ice-9 match))
+
+          (define (normalize language)
+            ;; Normalize LANGUAGE.  For instance, "zh_CN" become "zh-cn".
+            (string-map (match-lambda
+                          (#\_ #\-)
+                          (chr chr))
+                        (string-downcase language)))
+
+          ;; Install a UTF-8 locale so that 'makeinfo' is at ease.
+          (setenv "GUIX_LOCPATH"
+                  #+(file-append glibc-utf8-locales "/lib/locale"))
+          (setenv "LC_ALL" "en_US.utf8")
+
+          (setvbuf (current-output-port) 'line)
+          (setvbuf (current-error-port) 'line)
+
+          (for-each (lambda (language)
+                      (let ((opts `("--html"
+                                    "-c" ,(string-append "TOP_NODE_UP_URL=/manual/"
+                                                         language)
+                                    #$@options
+                                    ,(if (string=? language "en")
+                                         (string-append #$manual-source "/"
+                                                        #$manual ".texi")
+                                         (string-append #$manual-source "/"
+                                                        #$manual "." language ".texi")))))
+                        (format #t "building HTML manual for language '~a'...~%"
+                                language)
+                        (mkdir-p (string-append #$output "/"
+                                                (normalize language)))
+                        (setenv "LANGUAGE" language)
+                        (apply invoke #$(file-append texinfo "/bin/makeinfo")
+                               "-o" (string-append #$output "/"
+                                                   (normalize language)
+                                                   "/html_node")
+                               opts)
+                        (apply invoke #$(file-append texinfo "/bin/makeinfo")
+                               "--no-split"
+                               "-o"
+                               (string-append #$output "/"
+                                              (normalize language)
+                                              "/" #$manual
+                                              (if (string=? language "en")
+                                                  ""
+                                                  (string-append "." language))
+                                              ".html")
+                               opts)))
+                    '#$languages))))
+
+  (computed-file (string-append manual "-html-manual") build))
+
+(define* (pdf-manual source #:key (languages %languages)
+                     (version "0.0")
+                     (manual "guix")
+                     (date 1)
+                     (options '()))
+  "Return the HTML manuals built from SOURCE for all LANGUAGES, with the given
+makeinfo OPTIONS."
+  (define manual-source
+    (texinfo-manual-source source
+                           #:version version
+                           #:languages languages
+                           #:date date))
+
+  ;; FIXME: This union works, except for the table of contents of non-English
+  ;; manuals, which contains escape sequences like "^^ca^^fe" instead of
+  ;; accented letters.
+  ;;
+  ;; (define texlive
+  ;;   (texlive-union (list texlive-tex-texinfo
+  ;;                        texlive-generic-epsf
+  ;;                        texlive-fonts-ec)))
+
+  (define build
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (srfi srfi-34)
+                       (ice-9 match))
+
+          (define (normalize language)            ;XXX: deduplicate
+            ;; Normalize LANGUAGE.  For instance, "zh_CN" becomes "zh-cn".
+            (string-map (match-lambda
+                          (#\_ #\-)
+                          (chr chr))
+                        (string-downcase language)))
+
+          ;; Install a UTF-8 locale so that 'makeinfo' is at ease.
+          (setenv "GUIX_LOCPATH"
+                  #+(file-append glibc-utf8-locales "/lib/locale"))
+          (setenv "LC_ALL" "en_US.utf8")
+          (setenv "PATH"
+                  (string-append #+(file-append texlive "/bin") ":"
+                                 #+(file-append texinfo "/bin") ":"
+
+                                 ;; Below are command-line tools needed by
+                                 ;; 'texi2dvi' and friends.
+                                 #+(file-append sed "/bin") ":"
+                                 #+(file-append grep "/bin") ":"
+                                 #+(file-append coreutils "/bin") ":"
+                                 #+(file-append gawk "/bin") ":"
+                                 #+(file-append tar "/bin") ":"
+                                 #+(file-append diffutils "/bin")))
+
+          (setvbuf (current-output-port) 'line)
+          (setvbuf (current-error-port) 'line)
+
+          (setenv "HOME" (getcwd))                ;for kpathsea/mktextfm
+
+          ;; 'SOURCE_DATE_EPOCH' is honored by pdftex.
+          (setenv "SOURCE_DATE_EPOCH" "1")
+
+          (for-each (lambda (language)
+                      (let ((opts `("--pdf"
+                                    "-I" "."
+                                    #$@options
+                                    ,(if (string=? language "en")
+                                         (string-append #$manual-source "/"
+                                                        #$manual ".texi")
+                                         (string-append #$manual-source "/"
+                                                        #$manual "." language ".texi")))))
+                        (format #t "building PDF manual for language '~a'...~%"
+                                language)
+                        (mkdir-p (string-append #$output "/"
+                                                (normalize language)))
+                        (setenv "LANGUAGE" language)
+
+
+                        ;; FIXME: Unfortunately building PDFs for non-Latin
+                        ;; alphabets doesn't work:
+                        ;; <https://lists.gnu.org/archive/html/help-texinfo/2012-01/msg00014.html>.
+                        (guard (c ((invoke-error? c)
+                                   (format (current-error-port)
+                                           "~%~%Failed to produce \
+PDF for language '~a'!~%~%"
+                                           language)))
+                         (apply invoke #$(file-append texinfo "/bin/makeinfo")
+                                "--pdf" "-o"
+                                (string-append #$output "/"
+                                               (normalize language)
+                                               "/" #$manual
+                                               (if (string=? language "en")
+                                                   ""
+                                                   (string-append "."
+                                                                  language))
+                                               ".pdf")
+                                opts))))
+                    '#$languages))))
+
+  (computed-file (string-append manual "-pdf-manual") build))
+
+(define (guix-manual-text-domain source languages)
+  "Return the PO files for LANGUAGES of the 'guix-manual' text domain taken
+from SOURCE."
+  (define po-directory
+    (file-append* source "/po/doc"))
+
+  (define build
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils))
+
+          (mkdir-p #$output)
+          (for-each (lambda (language)
+                      (define directory
+                        (string-append #$output "/" language
+                                       "/LC_MESSAGES"))
+
+                      (mkdir-p directory)
+                      (invoke #+(file-append gnu-gettext "/bin/msgfmt")
+                              "-c" "-o"
+                              (string-append directory "/guix-manual.mo")
+                              (string-append #$po-directory "/guix-manual."
+                                             language ".po")))
+                    '#$(delete "en" languages)))))
+
+  (computed-file "guix-manual-po" build))
+
+(define* (html-manual-indexes source
+                              #:key (languages %languages)
+                              (version "0.0")
+                              (manual "guix")
+                              (date 1))
+  (define build
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (ice-9 match)
+                       (ice-9 popen)
+                       (sxml simple)
+                       (srfi srfi-19))
+
+          (define (normalize language)            ;XXX: deduplicate
+            ;; Normalize LANGUAGE.  For instance, "zh_CN" become "zh-cn".
+            (string-map (match-lambda
+                          (#\_ #\-)
+                          (chr chr))
+                        (string-downcase language)))
+
+          (define-syntax-rule (with-language language exp ...)
+            (let ((lang (getenv "LANGUAGE")))
+              (dynamic-wind
+                (lambda ()
+                  (setenv "LANGUAGE" language)
+                  (setlocale LC_MESSAGES))
+                (lambda () exp ...)
+                (lambda ()
+                  (if lang
+                      (setenv "LANGUAGE" lang)
+                      (unsetenv "LANGUAGE"))
+                  (setlocale LC_MESSAGES)))))
+
+          ;; (put 'with-language 'scheme-indent-function 1)
+          (define* (translate str language
+                              #:key (domain "guix-manual"))
+            (define exp
+              `(begin
+                 (bindtextdomain "guix-manual"
+                                 #+(guix-manual-text-domain
+                                    source
+                                    languages))
+                 (write (gettext ,str "guix-manual"))))
+
+            (with-language language
+              ;; Since the 'gettext' function caches msgid translations,
+              ;; regardless of $LANGUAGE, we have to spawn a new process each
+              ;; time we want to translate to a different language.  Bah!
+              (let* ((pipe (open-pipe* OPEN_READ
+                                       #+(file-append guile-2.2
+                                                      "/bin/guile")
+                                       "-c" (object->string exp)))
+                     (str  (read pipe)))
+                (close-pipe pipe)
+                str)))
+
+          (define (seconds->string seconds language)
+            (let* ((time (make-time time-utc 0 seconds))
+                   (date (time-utc->date time)))
+              (with-language language (date->string date "~e ~B ~Y"))))
+
+          (define (guix-url path)
+            (string-append #$%web-site-url path))
+
+          (define (sxml-index language)
+            (define title
+              (translate "GNU Guix Reference Manual" language))
+
+            ;; FIXME: Avoid duplicating styling info from guix-artwork.git.
+            `(html (@ (lang ,language))
+                   (head
+                    (title ,(string-append title " — GNU Guix"))
+                    (meta (@ (charset "UTF-8")))
+                    (meta (@ (name "viewport") (content "width=device-width, initial-scale=1.0")))
+                    ;; Menu prefetch.
+                    (link (@ (rel "prefetch") (href ,(guix-url "menu/index.html"))))
+                    ;; Base CSS.
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/elements.css"))))
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/common.css"))))
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/messages.css"))))
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/navbar.css"))))
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/breadcrumbs.css"))))
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/buttons.css"))))
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/footer.css"))))
+
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/page.css"))))
+                    (link (@ (rel "stylesheet") (href ,(guix-url "static/base/css/post.css")))))
+                   (body
+                    (header (@ (class "navbar"))
+                            (h1 (a (@ (class "branding")
+                                      (href #$%web-site-url)))
+                                (span (@ (class "a11y-offset"))
+                                      "Guix"))
+                            (nav (@ (class "menu"))))
+                    (nav (@ (class "breadcrumbs"))
+                         (a (@ (class "crumb")
+                               (href #$%web-site-url))
+                            "Home"))
+                    (main
+                     (article
+                      (@ (class "page centered-block limit-width"))
+                      (h2 ,title)
+                      (p (@ (class "post-metadata centered-text"))
+                         #$version " — "
+                         ,(seconds->string #$date language))
+
+                      (div
+                       (ul
+                        (li (a (@ (href "html_node"))
+                               "HTML, with one page per node"))
+                        (li (a (@ (href
+                                   ,(string-append
+                                     #$manual
+                                     (if (string=? language
+                                                   "en")
+                                         ""
+                                         (string-append "."
+                                                        language))
+                                     ".html")))
+                               "HTML, entirely on one page"))
+                        ,@(if (member language '("ru" "zh_CN"))
+                              '()
+                              `((li (a (@ (href ,(string-append
+                                                  #$manual
+                                                  (if (string=? language "en")
+                                                      ""
+                                                      (string-append "."
+                                                                     language))
+                                                  ".pdf"))))
+                                    "PDF")))))))
+                    (footer))))
+
+          (define (write-index language file)
+            (call-with-output-file file
+              (lambda (port)
+                (display "<!DOCTYPE html>\n" port)
+                (sxml->xml (sxml-index language) port))))
+
+          (setenv "GUIX_LOCPATH"
+                  #+(file-append glibc-utf8-locales "/lib/locale"))
+          (setenv "LC_ALL" "en_US.utf8")
+          (setlocale LC_ALL "en_US.utf8")
+
+          (bindtextdomain "guix-manual"
+                          #+(guix-manual-text-domain source languages))
+
+          (for-each (lambda (language)
+                      (define directory
+                        (string-append #$output "/"
+                                       (normalize language)))
+
+                      (mkdir-p directory)
+                      (write-index language
+                                   (string-append directory
+                                                  "/index.html")))
+                    '#$languages))))
+
+  (computed-file "html-indexes" build))
+
+(define* (pdf+html-manual source
+                          #:key (languages %languages)
+                          (version "0.0")
+                          (date (time-second (current-time time-utc)))
+                          (manual "guix"))
+  "Return the union of the HTML and PDF manuals, as well as the indexes."
+  (directory-union (string-append manual "-manual")
+                   (map (lambda (proc)
+                          (proc source
+                                #:date date
+                                #:languages languages
+                                #:version version
+                                #:manual manual))
+                        (list html-manual-indexes
+                              html-manual pdf-manual))
+                   #:copy? #t))
+
+(define (latest-commit+date directory)
+  "Return two values: the last commit ID (a hex string) for DIRECTORY, and its
+commit date (an integer)."
+  (let* ((repository (repository-open directory))
+         (head       (repository-head repository))
+         (oid        (reference-target head))
+         (commit     (commit-lookup repository oid)))
+    ;; TODO: Use (git describe) when it's widely available.
+    (values (oid->string oid) (commit-time commit))))
+
+
+(let* ((root (canonicalize-path
+              (string-append (current-source-directory) "/..")))
+       (commit date (latest-commit+date root)))
+  (format (current-error-port)
+          "building manual from work tree around commit ~a, ~a~%"
+          commit
+          (let* ((time (make-time time-utc 0 date))
+                 (date (time-utc->date time)))
+            (date->string date "~e ~B ~Y")))
+  (pdf+html-manual (local-file root "guix" #:recursive? #t
+                               #:select? (git-predicate root))
+                   #:version (or (getenv "GUIX_MANUAL_VERSION")
+                                 (string-take commit 7))
+                   #:date date))
diff --git a/doc/guix.texi b/doc/guix.texi
index 0b50482530..3e0788ed3a 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -4657,6 +4657,14 @@ While this will limit the leaking of user identity through home paths
 and each of the user fields, this is only one useful component of a
 broader privacy/anonymity solution---not one in and of itself.
 
+@item --no-cwd
+For containers, the default behavior is to share the current working
+directory with the isolated container and immediately change to that
+directory within the container.  If this is undesirable, @code{--no-cwd}
+will cause the current working directory to @emph{not} be automatically
+shared and will change to the user's home directory within the container
+instead.  See also @code{--user}.
+
 @item --expose=@var{source}[=@var{target}]
 For containers, expose the file system @var{source} from the host system
 as the read-only file system @var{target} within the container.  If
diff --git a/etc/guix-install.sh b/etc/guix-install.sh
index aa95cb4e20..960313d462 100755
--- a/etc/guix-install.sh
+++ b/etc/guix-install.sh
@@ -3,6 +3,7 @@
 # Copyright © 2017 sharlatan <sharlatanus@gmail.com>
 # Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 # Copyright © 2018 Efraim Flashner <efraim@flashner.co.il>
+# Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 #
 # This file is part of GNU Guix.
 #
@@ -85,14 +86,12 @@ _debug()
 
 chk_require()
 { # Check that every required command is available.
-    declare -a cmds
     declare -a warn
-
-    cmds=(${1})
+    local c
 
     _debug "--- [ $FUNCNAME ] ---"
 
-    for c in ${cmds[@]}; do
+    for c in "$@"; do
         command -v "$c" &>/dev/null || warn+=("$c")
     done
 
@@ -101,8 +100,15 @@ chk_require()
           return 1; }
     
     _msg "${PAS}verification of required commands completed"
+}
+
+chk_gpg_keyring()
+{ # Check whether the Guix release signing public key is present.
+    _debug "--- [ $FUNCNAME ] ---"
 
-    gpg --list-keys ${OPENPGP_SIGNING_KEY_ID} >/dev/null 2>&1 || (
+    # Without --dry-run this command will create a ~/.gnupg owned by root on
+    # systems where gpg has never been used, causing errors and confusion.
+    gpg --dry-run --list-keys ${OPENPGP_SIGNING_KEY_ID} >/dev/null 2>&1 || (
         _err "${ERR}Missing OpenPGP public key.  Fetch it with this command:"
         echo "  wget https://sv.gnu.org/people/viewgpg.php?user_id=15145 -qO - | gpg --import -"
         exit 1
@@ -415,7 +421,8 @@ main()
     _msg "Starting installation ($(date))"
 
     chk_term
-    chk_require "${REQUIRE[*]}"
+    chk_require "${REQUIRE[@]}"
+    chk_gpg_keyring
     chk_init_sys
     chk_sys_arch
 
diff --git a/gnu/local.mk b/gnu/local.mk
index 68a43330c4..7dcac4f2bc 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -490,6 +490,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/wget.scm				\
   %D%/packages/wicd.scm				\
   %D%/packages/wine.scm				\
+  %D%/packages/wireservice.scm				\
   %D%/packages/wm.scm				\
   %D%/packages/wordnet.scm			\
   %D%/packages/wv.scm				\
@@ -741,6 +742,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/cpufrequtils-fix-aclocal.patch		\
   %D%/packages/patches/crawl-upgrade-saves.patch		\
   %D%/packages/patches/crda-optional-gcrypt.patch		\
+  %D%/packages/patches/csvkit-fix-tests.patch			\
   %D%/packages/patches/clucene-contribs-lib.patch               \
   %D%/packages/patches/cube-nocheck.patch			\
   %D%/packages/patches/cursynth-wave-rand.patch			\
@@ -891,8 +893,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/grep-timing-sensitive-test.patch		\
   %D%/packages/patches/groff-source-date-epoch.patch		\
   %D%/packages/patches/groovy-add-exceptionutilsgenerator.patch	\
-  %D%/packages/patches/grub-binutils-compat.patch		\
-  %D%/packages/patches/grub-check-error-efibootmgr.patch	\
   %D%/packages/patches/grub-efi-fat-serial-number.patch		\
   %D%/packages/patches/gsl-test-i686.patch			\
   %D%/packages/patches/gspell-dash-test.patch			\
@@ -1231,6 +1231,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \
   %D%/packages/patches/python-pygpgme-fix-pinentry-tests.patch	\
   %D%/packages/patches/python-robotframework-honor-source-date-epoch.patch \
+  %D%/packages/patches/python-slugify-depend-on-unidecode.patch	\
   %D%/packages/patches/python2-subprocess32-disable-input-test.patch	\
   %D%/packages/patches/python-unittest2-python3-compat.patch	\
   %D%/packages/patches/python-unittest2-remove-argparse.patch	\
diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm
index 7e66e42f0a..87eadf0338 100644
--- a/gnu/packages/algebra.scm
+++ b/gnu/packages/algebra.scm
@@ -298,6 +298,20 @@ GP2C, the GP to C compiler, translates GP scripts to PARI programs.")
    (license license:gpl2)
    (home-page "https://pari.math.u-bordeaux.fr/")))
 
+(define fplll-4-cmh
+  (package
+    (inherit fplll)
+    (name "fplll")
+    (version "4.0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "http://perso.ens-lyon.fr/damien.stehle/fplll/libfplll-"
+             version ".tar.gz"))
+       (sha256
+        (base32 "1cbiby7ykis4z84swclpysrljmqhfcllpkcbll1m08rzskgb1a6b"))))))
+
 (define-public cmh
   (package
    (name "cmh")
@@ -316,7 +330,7 @@ GP2C, the GP to C compiler, translates GP scripts to PARI programs.")
        ("mpfr" ,mpfr)
        ("mpc" ,mpc)
        ("mpfrcx" ,mpfrcx)
-       ("fplll" ,fplll)
+       ("fplll" ,fplll-4-cmh)
        ("pari-gp"  ,pari-gp)))
    (synopsis "Igusa class polynomial computations")
    (description
diff --git a/gnu/packages/bioconductor.scm b/gnu/packages/bioconductor.scm
index 29dac5b0f1..e5a2d66b2d 100644
--- a/gnu/packages/bioconductor.scm
+++ b/gnu/packages/bioconductor.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016, 2017, 2018 Roel Janssen <roel@gnu.org>
-;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -652,7 +652,7 @@ database is exposed as a @code{TxDb} object.")
 (define-public r-txdb-mmusculus-ucsc-mm10-knowngene
   (package
     (name "r-txdb-mmusculus-ucsc-mm10-knowngene")
-    (version "3.4.4")
+    (version "3.4.7")
     (source (origin
               (method url-fetch)
               ;; We cannot use bioconductor-uri here because this tarball is
@@ -663,7 +663,7 @@ database is exposed as a @code{TxDb} object.")
                                   version ".tar.gz"))
               (sha256
                (base32
-                "01lgxc1fx5nhlpbwjd5zqghkkbmh6axd98ikx4b0spv0jdg6gf39"))))
+                "04impkl8zh1gpwwrpbf19jqznsjrq2306yyhm6cmx6hr1401bd6b"))))
     (properties
      `((upstream-name . "TxDb.Mmusculus.UCSC.mm10.knownGene")))
     (build-system r-build-system)
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index f8ac41c249..5d7a905f6a 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -7237,25 +7237,6 @@ BLAST, KEGG, GenBank, MEDLINE and GO.")
     ;; (LGPLv2.1+) and scripts in samples (which have GPL2 and GPL2+)
     (license (list license:ruby license:lgpl2.1+ license:gpl2+ ))))
 
-(define-public r-biocinstaller
-  (package
-    (name "r-biocinstaller")
-    (version "1.32.1")
-    (source (origin
-              (method url-fetch)
-              (uri (bioconductor-uri "BiocInstaller" version))
-              (sha256
-               (base32
-                "1s1f9qhyf3mc73ir25x2zlgi9hf45a37lg4z8fbva4i21hqisgsl"))))
-    (properties
-     `((upstream-name . "BiocInstaller")))
-    (build-system r-build-system)
-    (home-page "https://bioconductor.org/packages/BiocInstaller")
-    (synopsis "Install Bioconductor packages")
-    (description "This package is used to install and update R packages from
-Bioconductor, CRAN, and Github.")
-    (license license:artistic2.0)))
-
 (define-public r-biocviews
   (package
     (name "r-biocviews")
@@ -13622,10 +13603,10 @@ sequencing data.")
 
 (define-public r-xbioc
   (let ((revision "1")
-        (commit "f798c187e376fd1ba27abd559f47bbae7e3e466b"))
+        (commit "6ff0670a37ab3036aaf1d94aa4b208310946b0b5"))
     (package
       (name "r-xbioc")
-      (version (git-version "0.1.15" revision commit))
+      (version (git-version "0.1.16" revision commit))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -13634,13 +13615,13 @@ sequencing data.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "03hffh2f6z71y6l6dqpa5cql3hdaw7zigdi8sm2dzgx379k9rgrr"))))
+                  "0w8bsq5myiwkfhh83nm6is5ichiyvwa1axx2szvxnzq39x6knf66"))))
       (build-system r-build-system)
       (propagated-inputs
        `(("r-annotationdbi" ,r-annotationdbi)
          ("r-assertthat" ,r-assertthat)
          ("r-biobase" ,r-biobase)
-         ("r-biocinstaller" ,r-biocinstaller)
+         ("r-biocmanager" ,r-biocmanager)
          ("r-digest" ,r-digest)
          ("r-pkgmaker" ,r-pkgmaker)
          ("r-plyr" ,r-plyr)
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index 6e6e69ff3b..dda258a52e 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -82,19 +82,22 @@
 (define-public grub
   (package
     (name "grub")
-    (version "2.02")
+    (version "2.04")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/grub/grub-" version ".tar.xz"))
              (sha256
               (base32
-               "03vvdfhdmf16121v7xs8is2krwnv15wpkhkf16a4yf8nsfc3f2w1"))
-             (patches (search-patches "grub-check-error-efibootmgr.patch"
-                                      "grub-binutils-compat.patch"
-                                      "grub-efi-fat-serial-number.patch"))))
+               "0zgp5m3hmc9jh8wpjx6czzkh5id2y8n1k823x2mjvm2sk6b28ag5"))
+             (patches (search-patches "grub-efi-fat-serial-number.patch"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:phases (modify-phases %standard-phases
+     `(#:configure-flags
+       ;; Counterintuitively, this *disables* a spurious Python dependency by
+       ;; calling the ‘true’ binary instead.  Python is only needed during
+       ;; bootstrapping (for genptl.py), not when building from a release.
+       (list "PYTHON=true")
+       #:phases (modify-phases %standard-phases
                   (add-after 'unpack 'patch-stuff
                    (lambda* (#:key inputs #:allow-other-keys)
                      (substitute* "grub-core/Makefile.in"
@@ -127,6 +130,14 @@
                       (substitute* "Makefile.in"
                         (("grub_cmd_date grub_cmd_set_date grub_cmd_sleep")
                           "grub_cmd_date grub_cmd_sleep"))
+                      #t))
+                  (add-before 'check 'disable-pixel-perfect-test
+                    (lambda _
+                      ;; This test compares many screenshots rendered with an
+                      ;; older Unifont (9.0.06) than that packaged in Guix.
+                      (substitute* "Makefile.in"
+                        (("test_unset grub_func_test")
+                          "test_unset"))
                       #t)))
        ;; Disable tests on ARM and AARCH64 platforms.
        #:tests? ,(not (any (cute string-prefix? <> (or (%current-target-system)
@@ -147,9 +158,12 @@
        ;; for generating alternative keyboard layouts.
        ("console-setup" ,console-setup)
 
+       ;; Needed for ‘grub-mount’, the only reliable way to tell whether a given
+       ;; file system will be readable by GRUB without rebooting.
+       ("fuse" ,fuse)
+
        ("freetype" ,freetype)
        ;; ("libusb" ,libusb)
-       ;; ("fuse" ,fuse)
        ("ncurses" ,ncurses)))
     (native-inputs
      `(("pkg-config" ,pkg-config)
diff --git a/gnu/packages/chromium.scm b/gnu/packages/chromium.scm
index 79828ef589..3bb8978b08 100644
--- a/gnu/packages/chromium.scm
+++ b/gnu/packages/chromium.scm
@@ -760,9 +760,9 @@ from forcing GEXP-PROMISE."
        ("valgrind" ,valgrind)
        ("vulkan-headers" ,vulkan-headers)))
 
-    ;; Building Chromium with a single core takes around 6 hours on an x86_64
-    ;; system.  Give some leeway for slower or busy machines.
-    (properties '((timeout . 64800)))   ;18 hours
+    ;; Building Chromium takes ... a very long time.  On a single core, a busy
+    ;; mid-end x86 system may need more than 24 hours to complete the build.
+    (properties '((timeout . 144000)))  ;40 hours
 
     (home-page "https://github.com/Eloston/ungoogled-chromium")
     (description
diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index 01ce5f1ae7..b5eb1845a5 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -36,6 +36,7 @@
 ;;; Copyright © 2019 Jack Hill <jackhill@jackhill.us>
 ;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2019 Gábor Boskovits <boskovits@gmail.com>
+;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -92,6 +93,7 @@
   #:use-module (gnu packages popt)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-crypto)
+  #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages rdf)
   #:use-module (gnu packages readline)
@@ -3080,3 +3082,24 @@ NumPy, and other traditional Python scientific computing packages.")
 
 (define-public python2-pyarrow
   (package-with-python2 python-pyarrow))
+
+(define-public python-crate
+  (package
+    (name "python-crate")
+    (version "0.23.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "crate" version))
+              (sha256
+               (base32
+                "0s3s7yg4m2zflg9q96aibwb5hizsn10ql63fsj6h5z624qkavnlp"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-urllib3" ,python-urllib3)))
+    (home-page "https://github.com/crate/crate-python")
+    (synopsis "CrateDB Python client")
+    (description
+     "This package provides a Python client library for CrateDB.
+It implements the Python DB API 2.0 specification and includes support for
+SQLAlchemy.")
+    (license license:asl2.0)))
diff --git a/gnu/packages/disk.scm b/gnu/packages/disk.scm
index 06f4430b2d..187ef74b4e 100644
--- a/gnu/packages/disk.scm
+++ b/gnu/packages/disk.scm
@@ -14,6 +14,7 @@
 ;;; Copyright © 2018 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2018, 2019 Pierre Neidhardt <mail@ambrevar.xyz>
 ;;; Copyright © 2019 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -236,7 +237,8 @@ to recover data more efficiently by only reading the necessary blocks.")
          "0wy13i3i4x2bw1hf5m4fd0myh61f9bcrs035fdlf6gyc1jksrcp6"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:make-flags (list (string-append "PREFIX=" %output)
+     `(#:configure-flags (list "--enable-compat-symlinks")
+       #:make-flags (list (string-append "PREFIX=" %output)
                           "CC=gcc")))
     (native-inputs
      `(("xxd" ,xxd))) ; for tests
diff --git a/gnu/packages/education.scm b/gnu/packages/education.scm
index 2bb61a744a..f3d8907583 100644
--- a/gnu/packages/education.scm
+++ b/gnu/packages/education.scm
@@ -250,7 +250,7 @@ easy.")
 (define-public snap
   (package
     (name "snap")
-    (version "5")
+    (version "5.0.1")
     (source
      (origin
        (method git-fetch)
@@ -260,7 +260,7 @@ easy.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0bh52n7nklaaq02qb56v7bvrslf047my6irl7g8h6xfjgw04yf20"))))
+         "0ic0xgal19yazbd1kffmbjhiicvvlw5clj48lj80mksa2lgvnzna"))))
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index b6051c0ac1..2d9f271cc8 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -2225,18 +2225,20 @@ display and behaviour is easily customisable.")
 (define-public emacs-git-timemachine
   (package
     (name "emacs-git-timemachine")
-    (version "4.5")
+    (version "4.10")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append "https://gitlab.com/pidu/git-timemachine"
-                           "/-/archive/" version
-                           "/git-timemachine-" version ".tar.gz"))
-       (file-name (string-append name "-" version ".tar.gz"))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://gitlab.com/pidu/git-timemachine.git")
+             (commit version)))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0ii40qcincasg7s1yrvqcxkqcqzb4sfs7gcxscn6m4x4ans165zy"))))
+         "08zsn3lsnnf01wkv5ls38jga02s5dnf0j3gigy4qd6im3j3d04m1"))))
     (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-transient" ,emacs-transient)))
     (home-page "https://gitlab.com/pidu/git-timemachine")
     (synopsis "Step through historic versions of Git-controlled files")
     (description "This package enables you to step through historic versions
@@ -2575,7 +2577,7 @@ as horizontal rules.")
 (define-public emacs-simple-httpd
   (package
     (name "emacs-simple-httpd")
-    (version "1.4.6")
+    (version "1.5.1")
     (source
      (origin
        (method git-fetch)
@@ -2584,9 +2586,9 @@ as horizontal rules.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1qmkc0w28l53zzf5yd2grrk1sq222g5qnsm35ph25s1cfvc1qb2g"))))
+        (base32 "0dpn92rg813c4pq7a1vzj3znyxzp2lmvxqz6pzcqi0l2xn5r3wvb"))))
     (build-system emacs-build-system)
-    (home-page "https://github.com/skeeto/emacs-http-server")
+    (home-page "https://github.com/skeeto/emacs-web-server")
     (synopsis "HTTP server in pure Emacs Lisp")
     (description
      "This package provides a simple HTTP server written in Emacs Lisp to
@@ -2596,7 +2598,7 @@ serve files and directory listings.")
 (define-public emacs-skewer-mode
   (package
     (name "emacs-skewer-mode")
-    (version "1.6.2")
+    (version "1.8.0")
     (source
      (origin
        (method git-fetch)
@@ -2605,7 +2607,7 @@ serve files and directory listings.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "05jndz0c26q60s416vqgvr66axdmxb7qsr2g70fvl5iqavnayhpv"))))
+        (base32 "1ha7jl7776pk1bki5zj2q0jy66450mn8xr3aqjc0m9kj3gc9qxgw"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-simple-httpd" ,emacs-simple-httpd)
@@ -4075,6 +4077,30 @@ organizer.")
 It is built on top of the custom theme support in Emacs 24 or later.")
     (license license:gpl3+)))
 
+(define-public emacs-moe-theme-el
+  (let ((commit "6e086d855d6bb446bbd1090742815589a81a915f")
+        (version "1.0")
+        (revision "1"))
+    (package
+      (name "emacs-moe-theme-el")
+      (version (git-version version revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/kuanyui/moe-theme.el")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "0xj4wfd7h4jqnr193pizm9frf6lmwjr0dsdv2l9mqh9k691z1dnc"))))
+      (build-system emacs-build-system)
+      (home-page "https://github.com/kuanyui/moe-theme.el")
+      (synopsis "Anime-inspired color themes")
+      (description
+       "This package provides vibrant color schemes with light and dark
+variants.")
+      (license license:gpl3+))))
+
 (define-public emacs-solarized-theme
   (package
     (name "emacs-solarized-theme")
@@ -4523,7 +4549,7 @@ fully-functional one.")
 (define-public emacs-hydra
   (package
     (name "emacs-hydra")
-    (version "0.14.0")
+    (version "0.15.0")
     (source
      (origin
        (method git-fetch)
@@ -4533,7 +4559,7 @@ fully-functional one.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0ln4z2796ycy33g5jcxkqvm7638qxy4sipsab7d2864hh700cikg"))))
+         "0fapvhmhgc9kppf3bvkgry0cd7gyilg7sfvlscfrfjxpx4xvwsfy"))))
     (build-system emacs-build-system)
     (home-page "https://github.com/abo-abo/hydra")
     (synopsis "Make Emacs bindings that stick around")
@@ -4757,25 +4783,26 @@ a temporary @code{keep-lines} or @code{occur}.")
     (license license:gpl3+)))
 
 (define-public emacs-zoutline
-  (let ((commit "b3ee0f0e0b916838c2d2c249beba74ffdb8d5699")
-        (revision "0"))
-    (package
-      (name "emacs-zoutline")
-      (version (git-version "0.1" revision commit))
-      (home-page "https://github.com/abo-abo/zoutline")
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference (url home-page) (commit commit)))
-                (sha256
-                 (base32
-                  "0sd0017piw0dis6dhpq5dkqd3acisxqgipl7dj8gmc1vnswhdwr8"))
-                (file-name (git-file-name name version))))
-      (build-system emacs-build-system)
-      (synopsis "Simple outline library")
-      (description
-       "This library provides helpers for outlines.  Outlines allow users to
+  (package
+    (name "emacs-zoutline")
+    (version "0.2.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/abo-abo/zoutline")
+             (commit version)))
+       (sha256
+        (base32
+         "1w0zh6vs7klgivq5r030a82mcfg1zwic4x3fimyiqyg5n8p67hyx"))
+       (file-name (git-file-name name version))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/abo-abo/zoutline")
+    (synopsis "Simple outline library")
+    (description
+     "This library provides helpers for outlines.  Outlines allow users to
 navigate code in a tree-like fashion.")
-      (license license:gpl3+))))
+    (license license:gpl3+)))
 
 (define-public emacs-lispy
   (package
@@ -4835,6 +4862,36 @@ keybinding style.  The provided commands allow for editing Lisp in normal
 state and will work even without lispy being enabled.")
       (license license:gpl3+))))
 
+(define-public emacs-lpy
+  (let ((commit "553d28f7b6523ae5d44d34852ab770b871b0b0ad")
+        (version "0.1.0")
+        (revision "1"))
+    (package
+      (name "emacs-lpy")
+      (version (git-version version revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/abo-abo/lpy")
+               (commit commit)))
+         (sha256
+          (base32
+           "0kl9b3gga18cwv5cq4db8i6b7waj6mp3h2l7qjnp7wq6dpvwhn0i"))
+         (file-name (git-file-name name version))))
+      (propagated-inputs
+       `(("emacs-zoutline" ,emacs-zoutline)
+         ("emacs-lispy" ,emacs-lispy)))
+      (build-system emacs-build-system)
+      (home-page "https://github.com/abo-abo/lpy")
+      (synopsis "Modal editing for Python")
+      (description
+       "This package provides a minor mode for Python that binds useful
+commands to unprefixed keys, such as @code{j} or @code{e}, under certain
+circumstances, and leaves the keys untouched outside of those situations,
+allowing unprefixed keys to insert their respective characters as expected.")
+      (license license:gpl3+))))
+
 (define-public emacs-clojure-mode
   (package
     (name "emacs-clojure-mode")
@@ -6103,28 +6160,33 @@ Emacs that Evil does not cover properly by default, such as @code{help-mode},
       (license license:gpl3+))))
 
 (define-public emacs-goto-chg
-  (package
-    (name "emacs-goto-chg")
-    (version "1.6")
-    (source
-     (origin
-       (method url-fetch)
-       ;; There is no versioned source.
-       (uri "https://www.emacswiki.org/emacs/download/goto-chg.el")
-       (file-name (string-append "goto-chg-" version ".el"))
-       (sha256
-        (base32
-         "078d6p4br5vips7b9x4v6cy0wxf6m5ij9gpqd4g33bryn22gnpij"))))
-    (build-system emacs-build-system)
-    ;; There is no other home page.
-    (home-page "https://www.emacswiki.org/emacs/goto-chg.el")
-    (synopsis "Go to the last change in the Emacs buffer")
-    (description
-     "This package provides @code{M-x goto-last-change} command that goes to
+  (let ((commit "1829a13026c597e358f716d2c7793202458120b5")
+        (version "1.7.3")
+        (revision "1"))
+    (package
+      (name "emacs-goto-chg")
+      (version (git-version version revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/emacs-evil/goto-chg")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1y603maw9xwdj3qiarmf1bp13461f9f5ackzicsbynl0i9la3qki"))))
+      (build-system emacs-build-system)
+      (propagated-inputs
+       `(("emacs-undo-tree" ,emacs-undo-tree)))
+      (home-page "https://github.com/emacs-evil/goto-chg")
+      (synopsis "Go to the last change in the Emacs buffer")
+      (description
+       "This package provides @code{M-x goto-last-change} command that goes to
 the point of the most recent edit in the current Emacs buffer.  When repeated,
 go to the second most recent edit, etc.  Negative argument, @kbd{C-u -}, is
 used for reverse direction.")
-    (license license:gpl2+)))
+      (license license:gpl2+))))
 
 (define-public emacs-janpath-evil-numbers
   (let ((commit "d988041c1fe6e941dc8d591390750b237f71f524")
@@ -8321,13 +8383,13 @@ highlighting.")
     (license license:gpl3+)))
 
 (define-public emacs-restclient
-  (let ((commit "07a3888bb36d0e29608142ebe743b4362b800f40")
-        (revision "1"))                 ;Guix package revision,
+  (let ((commit "422ee8d8b077dffe65706a0f027ed700b84746bc")
+        (version "0")
+        (revision "2"))                 ;Guix package revision,
                                         ;upstream doesn't have official releases
     (package
       (name "emacs-restclient")
-      (version (string-append revision "."
-                              (string-take commit 7)))
+      (version (git-version version revision commit))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -8335,7 +8397,7 @@ highlighting.")
                       (commit commit)))
                 (sha256
                  (base32
-                  "00lmjhb5im1kgrp54yipf1h9pshxzgjlg71yf2rq5n973gvb0w0q"))
+                  "067nin7vxkdpffxa0q61ybv7szihhvpdinivmci9qkbb86rs9kkz"))
                 (file-name (git-file-name name version))))
       (build-system emacs-build-system)
       (propagated-inputs
@@ -9168,33 +9230,25 @@ contexts.
 (define-public emacs-polymode
   (package
     (name "emacs-polymode")
-    (version "0.1.5")
+    (version "0.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
-                    (url "https://github.com/vspinu/polymode.git")
+                    (url "https://github.com/polymode/polymode.git")
                     (commit (string-append "v" version))))
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0wwphs54jx48a3ca6x1qaz56j3j9bg4mv8g2akkffrzbdcb8sbc7"))))
+                "04v0gnzfsjb50bgly6kvpryx8cyzwjaq2llw4qv9ijw1l6ixmq3b"))))
     (build-system emacs-build-system)
-    (arguments
-     `(#:include (cons* "^modes/.*\\.el$" %default-include)
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'set-emacs-load-path 'add-modes-subdir-to-load-path
-           (lambda _
-             (setenv "EMACSLOADPATH"
-                     (string-append (getenv "EMACSLOADPATH")
-                                    ":" (getcwd) "/modes" ":")))))))
-    (home-page "https://github.com/vspinu/polymode")
+    (home-page "https://github.com/polymode/polymode")
     (synopsis "Framework for multiple Emacs modes based on indirect buffers")
-    (description "Polymode is an Emacs package that offers generic support
-for multiple major modes inside a single Emacs buffer.  It is lightweight,
-object oriented and highly extensible.  Creating a new polymode typically
-takes only a few lines of code.  Polymode also provides extensible facilities
-for external literate programming tools for exporting, weaving and tangling.")
+    (description
+     "Polymode is an Emacs package that offers generic support for multiple
+major modes inside a single Emacs buffer.  It is lightweight, object oriented
+and highly extensible.  Creating a new polymode typically takes only a few
+lines of code.  Polymode also provides extensible facilities for external
+literate programming tools for exporting, weaving and tangling.")
     (license license:gpl3+)))
 
 (define-public emacs-polymode-ansible
@@ -9226,6 +9280,33 @@ for external literate programming tools for exporting, weaving and tangling.")
        "Edit YAML files for Ansible containing embedded Jinja2 templating.")
       (license license:gpl3+))))
 
+(define-public emacs-polymode-org
+  (package
+    (name "emacs-polymode-org")
+    (version "0.2")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/polymode/poly-org.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "04x6apjad4kg30456z1j4ipp64yjgkcaim6hqr6bb0rmrianqhck"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-polymode" ,emacs-polymode)))
+    (properties '((upstream-name . "poly-org")))
+    (home-page "https://github.com/polymode/poly-org")
+    (synopsis "Polymode definitions for Org mode buffers")
+    (description
+     "Provides definitions for @code{emacs-polymode} to support
+@code{emacs-org} buffers.  Edit source blocks in an Org mode buffer using the
+native modes of the blocks' languages while remaining inside the primary Org
+buffer.")
+    (license license:gpl3+)))
+
 (define-public eless
   (package
     (name "eless")
@@ -10675,33 +10756,30 @@ navigate and display hierarchy structures.")
       (license license:gpl3+))))
 
 (define-public emacs-md4rd
-  (let ((commit "c55512c2f7680db2a1e73db6bdf93adecaf40fec")
-        (revision "1"))
-    (package
-      (name "emacs-md4rd")
-      (version (string-append "0.0.2" "-" revision "."
-                              (string-take commit 7)))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://github.com/ahungry/md4rd.git")
-                      (commit commit)))
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32
-                  "0mvv1mvsrpkrmikcpfqf2zbawnzgq33j6zjdrlv48mcw57xb2ak9"))))
-      (propagated-inputs
-       `(("emacs-hierarchy" ,emacs-hierarchy)
-         ("emacs-request" ,emacs-request)
-         ("emacs-dash" ,emacs-dash)
-         ("emacs-s" ,emacs-s)
-         ("emacs-tree-mode" ,emacs-tree-mode)))
-      (build-system emacs-build-system)
-      (home-page "https://github.com/ahungry/md4rd")
-      (synopsis "Emacs Mode for Reddit")
-      (description
-       "This package allows to read Reddit from within Emacs interactively.")
-      (license license:gpl3+))))
+  (package
+    (name "emacs-md4rd")
+    (version "0.3.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/ahungry/md4rd.git")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1n6g6k4adzkkn1g7z4j27s35xy12c1fg2r08gv345ddr3wplq4ri"))))
+    (propagated-inputs
+     `(("emacs-hierarchy" ,emacs-hierarchy)
+       ("emacs-request" ,emacs-request)
+       ("emacs-dash" ,emacs-dash)
+       ("emacs-s" ,emacs-s)
+       ("emacs-tree-mode" ,emacs-tree-mode)))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/ahungry/md4rd")
+    (synopsis "Emacs Mode for Reddit")
+    (description
+     "This package allows to read Reddit from within Emacs interactively.")
+    (license license:gpl3+)))
 
 (define-public emacs-pulseaudio-control
   (let ((commit "7e1a87068379075a5e9ce36c64c686c03d20d379")
@@ -12265,12 +12343,10 @@ bookmarks and history.")
     (license license:gpl3+)))
 
 (define-public emacs-stumpwm-mode
-  (let ((commit "8fbe071d2c6c040794060a354eb377218dc10b35")
-        (revision "1"))
+  (let ((commit "5328f85fbf6a8b08c758c17b9435368bf7a68f39"))
     (package
       (name "emacs-stumpwm-mode")
-      (version (string-append "0.0.1-" revision "."
-                              (string-take commit 7)))
+      (version (git-version "0.0.1" "1" commit))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -12279,7 +12355,7 @@ bookmarks and history.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "1dfwsvz1c8w6j4jp0kzaz78ml3f5dp0a5pvf090kwpbpg176r7iq"))))
+                  "00kf4k8bqadi5s667wb96sn549v2kvw01zwszjrg7nhd805m1ng6"))))
       (build-system emacs-build-system)
       (arguments
        `(#:phases
@@ -12552,7 +12628,7 @@ the current upstream.")
 (define-public emacs-company-restclient
   (package
     (name "emacs-company-restclient")
-    (version "0.1.0")
+    (version "0.3.0")
     (source
      (origin
        (method git-fetch)
@@ -12561,7 +12637,7 @@ the current upstream.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0i1fh5lvqwlgn3g3fzh0xacxyljx6gkryipn133vfkv4jbns51n4"))))
+        (base32 "0yp0hlrgcr6yy1xkjvfckys2k24x9xg7y6336ma61bdwn5lpv0x0"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-company" ,emacs-company)
@@ -13051,14 +13127,14 @@ cohesion with the Emacs Way.")
     (version "1.1")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append
-             "https://gitlab.com/Ambrevar/emacs-fish-completion/repository/"
-             "archive.tar.gz?ref="
-             version))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://gitlab.com/Ambrevar/emacs-fish-completion.git")
+             (commit version)))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0bpvifv6c2a65nks6kvarw0hhm37fnyy74wikwf9qq1i20va0fpv"))))
+         "1pjqnbyjmj64q5nwq1mrdxcls4fp5y0b6zqs785i0s6wdvrm4021"))))
     (build-system emacs-build-system)
     (inputs `(("fish" ,fish)))
     (arguments
@@ -13069,6 +13145,7 @@ cohesion with the Emacs Way.")
              (let ((fish (assoc-ref inputs "fish")))
                ;; Specify the absolute file names of the various
                ;; programs so that everything works out-of-the-box.
+               (make-file-writable "fish-completion.el")
                (emacs-substitute-variables
                    "fish-completion.el"
                  ("fish-completion-command"
@@ -14912,18 +14989,18 @@ opposed to character-based).")
   (package
     (name "emacs-disk-usage")
     (version "1.3.3")
-    (home-page "https://gitlab.com/Ambrevar/emacs-disk-usage")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append
-             "https://elpa.gnu.org/packages/disk-usage-"
-             version
-             ".el"))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://gitlab.com/Ambrevar/emacs-disk-usage.git")
+             (commit version)))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0h1jwznd41gi0vg830ilfgm01q05zknikzahwasm9cizwm2wyizj"))))
+         "0hv2gsd8k5fbjgckgiyisq4rn1i7y4rchbjy8kmixjv6mx563bll"))))
     (build-system emacs-build-system)
+    (home-page "https://gitlab.com/Ambrevar/emacs-disk-usage")
     (synopsis "Sort and browse disk usage listings with Emacs")
     (description "Disk Usage is a file system analyzer: it offers a tabulated
 view of file listings sorted by size.  Directory sizes are computed
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 88d293ee9f..4b1dbbdb49 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -7594,16 +7594,16 @@ views can be printed as PDF or PostScript files, or exported to HTML.")
 (define-public lollypop
   (package
     (name "lollypop")
-    (version "0.9.521")
+    (version "1.1.3.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://gitlab.gnome.org/World/lollypop/uploads/"
-                           "e4df2ed75c5ed71d64afcc668e579b2a/"
+                           "5a7cd7c72b6d83ae08d0c54c4691f9df/"
                            name "-" version ".tar.xz"))
        (sha256
         (base32
-         "0knsqh24siyw98vmiq6b1hzq4y4cazs9f1hq1js9c96hqqj9rvdx"))))
+         "1r5wn0bja9psz6nr1rcaysdkkwz84rbyzpdfw66cxa6wiy52pkjm"))))
     (build-system meson-build-system)
     (arguments
      `(#:imported-modules ((guix build python-build-system)
@@ -7636,6 +7636,7 @@ views can be printed as PDF or PostScript files, or exported to HTML.")
        ("python" ,python)
        ("python-beautifulsoup4" ,python-beautifulsoup4)
        ("python-gst" ,python-gst)
+       ("python-pil" ,python-pillow)
        ("python-pycairo" ,python-pycairo)
        ("python-pygobject" ,python-pygobject)
        ("python-pylast" ,python-pylast)
diff --git a/gnu/packages/gnunet.scm b/gnu/packages/gnunet.scm
index f2f8647730..2653645c5d 100644
--- a/gnu/packages/gnunet.scm
+++ b/gnu/packages/gnunet.scm
@@ -6,7 +6,7 @@
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016, 2017, 2018, 2019 ng0 <ng0@n0.is>
-;;; Copyright © 2016, 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2016, 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Alex Vong <alexvong1995@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -146,14 +146,14 @@ tool to extract metadata from a file and print the results.")
 (define-public libmicrohttpd
   (package
    (name "libmicrohttpd")
-   (version "0.9.64")
+   (version "0.9.65")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://gnu/libmicrohttpd/libmicrohttpd-"
                                 version ".tar.gz"))
             (sha256
              (base32
-              "03imzkd1hl2mkkpi84vg5xq9x6b58gwsv86ym85km0lhb7nxi4p7"))))
+              "1jdk6wigvnkh5bi9if4rik8i9sbvdql61lm8ipgpypyxqmcpjipj"))))
    (build-system gnu-build-system)
    (inputs
     `(("curl" ,curl)
diff --git a/gnu/packages/gps.scm b/gnu/packages/gps.scm
index 75212ed60e..852d095300 100644
--- a/gnu/packages/gps.scm
+++ b/gnu/packages/gps.scm
@@ -147,7 +147,7 @@ between two other data points.")
 (define-public gama
   (package
     (name "gama")
-    (version "2.03")
+    (version "2.06")
     (source
       (origin
         (method url-fetch)
@@ -155,7 +155,7 @@ between two other data points.")
                             version ".tar.gz"))
         (sha256
          (base32
-          "0d33yyasnx54c6i40rkr9by4qv92rqb8wkmp5r46nz7bbp9kpymv"))))
+          "06xp3kj099b6m2fsmgcbzgj7xk4j0drsps52m4fr8vc6fglsh44p"))))
     (build-system gnu-build-system)
     (arguments '(#:parallel-tests? #f)) ; race condition
     (native-inputs
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 690fd1ad68..653f844b48 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1411,7 +1411,7 @@ that the Ethernet protocol is much simpler than the IP protocol.")
 (define-public iproute
   (package
     (name "iproute2")
-    (version "5.1.0")
+    (version "5.2.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1419,7 +1419,7 @@ that the Ethernet protocol is much simpler than the IP protocol.")
                     version ".tar.xz"))
               (sha256
                (base32
-                "1kvvrz5mlpjxqcm7vl6i8w6l1cb2amp6p5xyq006pgzafc49hnnw"))))
+                "1a2dywa2kam24951byv9pl32mb9z6klh7d4vp8fwfgrm4vn5vfd5"))))
     (build-system gnu-build-system)
     (arguments
      `( ;; There is a test suite, but it wants network namespaces and sudo.
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 0315740bcd..1fe9af38e0 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -6,7 +6,7 @@
 ;;; Copyright © 2016, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2018, 2019 Marius Bakke <mbakke@fastmail.com>
-;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018 Tim Gesthuizen <tim.gesthuizen@yahoo.de>
 ;;; Copyright © 2018 Pierre Neidhardt <mail@ambrevar.xyz>
@@ -332,12 +332,12 @@ requirements according to version 1.1 of the OpenCL specification.")
     (version (package-version llvm))
     (source (origin
               (method url-fetch)
-              (uri (string-append "http://releases.llvm.org/"
+              (uri (string-append "https://releases.llvm.org/"
                                   version  "/openmp-" version
                                   ".src.tar.xz"))
               (sha256
                (base32
-                "030dkg5cypd7j9hq0mcqb5gs31lxwmzfq52j81l7v9ldcy5bf5mz"))
+                "1mf9cpgvix34xlpv0inkgl3qmdvgvp96f7sksqizri0n5xfp1cgp"))
               (file-name (string-append "libomp-" version ".tar.xz"))))
     (build-system cmake-build-system)
     ;; XXX: Note this gets built with GCC because building with Clang itself
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 982a0ce5a9..3dfe88132f 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -3747,7 +3747,7 @@ audio samples and various soft sythesizers.  It can receive input from a MIDI ke
 (define-public musescore
   (package
     (name "musescore")
-    (version "3.2")
+    (version "3.2.3")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -3756,7 +3756,7 @@ audio samples and various soft sythesizers.  It can receive input from a MIDI ke
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0719p4hjlq7skga8q4hvnd5w33vhrd1a1aygvqm9pn4na02zazy6"))
+                "17wx1wl8ns2k31qvrr888dxnrsa13vazg04zh2sn2q4vzd869a7v"))
               (modules '((guix build utils)))
               (snippet
                ;; Un-bundle OpenSSL and remove unused libraries.
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index d0388e5d43..ab11065379 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -563,16 +563,16 @@ transactions from C or Python.")
 (define-public diffoscope
   (package
     (name "diffoscope")
-    (version (git-version "115" "1" "7f3416ffd12572b42c814e43ac15cee44ef48155"))
+    (version "116")
     (source (origin
               (method git-fetch)
               (uri (git-reference
                     (url "https://salsa.debian.org/reproducible-builds/diffoscope.git")
-                    (commit "7f3416ffd12572b42c814e43ac15cee44ef48155")))
+                    (commit "116")))
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1pn2rwlz5shdx7s63798wx2v7029bl5if6dlq3i2r6zsnpp0laki"))))
+                "1anz2c112y0w21mh7xp6bs6z7v10dcy1i25nypkvqy3j929m0g28"))))
     (build-system python-build-system)
     (arguments
      `(#:phases (modify-phases %standard-phases
diff --git a/gnu/packages/patches/csvkit-fix-tests.patch b/gnu/packages/patches/csvkit-fix-tests.patch
new file mode 100644
index 0000000000..cb9ec39cb0
--- /dev/null
+++ b/gnu/packages/patches/csvkit-fix-tests.patch
@@ -0,0 +1,45 @@
+diff --git a/tests/test_utilities/test_csvsql.py b/tests/test_utilities/test_csvsql.py
+index e6ec4af..4f47980 100644
+--- a/tests/test_utilities/test_csvsql.py
++++ b/tests/test_utilities/test_csvsql.py
+@@ -197,7 +197,7 @@ class TestCSVSQL(CSVKitTestCase, EmptyFileTests):
+         utility.run()
+         output = output_file.getvalue()
+         output_file.close()
+-        self.assertEqual(output, 'a,b,c\n1,2,3\n0,5,6\n')
++        self.assertEqual(output, 'a,b,c\n1,2.0,3.0\n0,5.0,6.0\n')
+
+     def test_no_prefix_unique_constraint(self):
+         self.get_output(['--db', 'sqlite:///' + self.db_file, '--insert', 'examples/dummy.csv', '--unique-constraint', 'a'])
+diff --git a/tests/test_utilities/test_sql2csv.py b/tests/test_utilities/test_sql2csv.py
+index a0c3d3e..babcfd6 100644
+--- a/tests/test_utilities/test_sql2csv.py
++++ b/tests/test_utilities/test_sql2csv.py
+@@ -121,23 +121,23 @@ class TestSQL2CSV(CSVKitTestCase, EmptyFileTests):
+         input_file.close()
+
+     def test_unicode(self):
+-        expected = self.csvsql('examples/test_utf8.csv')
++        self.csvsql('examples/test_utf8.csv')
+         csv = self.get_output(['--db', 'sqlite:///' + self.db_file, '--query', 'select * from foo'])
+-        self.assertEqual(csv.strip(), expected)
++        self.assertEqual(csv.strip(), 'foo,bar,baz\n1.0,2.0,3\n4.0,5.0,ʤ')
+
+     def test_no_header_row(self):
+         self.csvsql('examples/dummy.csv')
+         csv = self.get_output(['--db', 'sqlite:///' + self.db_file, '--no-header-row', '--query', 'select * from foo'])
+
+         self.assertTrue('a,b,c' not in csv)
+-        self.assertTrue('1,2,3' in csv)
++        self.assertTrue('1,2.0,3.0' in csv)
+
+     def test_linenumbers(self):
+         self.csvsql('examples/dummy.csv')
+         csv = self.get_output(['--db', 'sqlite:///' + self.db_file, '--linenumbers', '--query', 'select * from foo'])
+
+         self.assertTrue('line_number,a,b,c' in csv)
+-        self.assertTrue('1,1,2,3' in csv)
++        self.assertTrue('1,1,2.0,3.0' in csv)
+
+     def test_wildcard_on_sqlite(self):
+         self.csvsql('examples/iris.csv')
diff --git a/gnu/packages/patches/grub-binutils-compat.patch b/gnu/packages/patches/grub-binutils-compat.patch
deleted file mode 100644
index 2107869314..0000000000
--- a/gnu/packages/patches/grub-binutils-compat.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-Fix a relocation issue that shows up with recent binutils.
-
-Patch taken from upstream:
-https://git.sv.gnu.org/cgit/grub.git/commit/?id=842c390469e2c2e10b5aa36700324cd3bde25875
-
-diff --git a/grub-core/efiemu/i386/loadcore64.c b/grub-core/efiemu/i386/loadcore64.c
-index e49d0b6..18facf4 100644
---- a/grub-core/efiemu/i386/loadcore64.c
-+++ b/grub-core/efiemu/i386/loadcore64.c
-@@ -98,6 +98,7 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
- 		    break;
- 
- 		  case R_X86_64_PC32:
-+		  case R_X86_64_PLT32:
- 		    err = grub_efiemu_write_value (addr,
- 						   *addr32 + rel->r_addend
- 						   + sym.off
-diff --git a/grub-core/kern/x86_64/dl.c b/grub-core/kern/x86_64/dl.c
-index 4406906..3a73e6e 100644
---- a/grub-core/kern/x86_64/dl.c
-+++ b/grub-core/kern/x86_64/dl.c
-@@ -70,6 +70,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
- 	  break;
- 
- 	case R_X86_64_PC32:
-+	case R_X86_64_PLT32:
- 	  {
- 	    grub_int64_t value;
- 	    value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value -
-diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
-index a2bb054..39d7efb 100644
---- a/util/grub-mkimagexx.c
-+++ b/util/grub-mkimagexx.c
-@@ -841,6 +841,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
- 		  break;
- 
- 		case R_X86_64_PC32:
-+		case R_X86_64_PLT32:
- 		  {
- 		    grub_uint32_t *t32 = (grub_uint32_t *) target;
- 		    *t32 = grub_host_to_target64 (grub_target_to_host32 (*t32)
-diff --git a/util/grub-module-verifier.c b/util/grub-module-verifier.c
-index 9179285..a79271f 100644
---- a/util/grub-module-verifier.c
-+++ b/util/grub-module-verifier.c
-@@ -19,6 +19,7 @@ struct grub_module_verifier_arch archs[] = {
-       -1
-     }, (int[]){
-       R_X86_64_PC32,
-+      R_X86_64_PLT32,
-       -1
-     }
-   },
diff --git a/gnu/packages/patches/grub-check-error-efibootmgr.patch b/gnu/packages/patches/grub-check-error-efibootmgr.patch
deleted file mode 100644
index efeb20f213..0000000000
--- a/gnu/packages/patches/grub-check-error-efibootmgr.patch
+++ /dev/null
@@ -1,197 +0,0 @@
-Without this patch, GRUB may proceed to wipe all firmware boot entries
-and report a successful installation, even if efibootmgr hit an error.
-
-Origin URL:
-https://git.sv.gnu.org/cgit/grub.git/commit/?id=6400613ad0b463abc93362086a491cd2a5e99b0d
-
-From 6400613ad0b463abc93362086a491cd2a5e99b0d Mon Sep 17 00:00:00 2001
-From: Steve McIntyre <steve@einval.com>
-Date: Wed, 31 Jan 2018 21:49:36 +0000
-Subject: Make grub-install check for errors from efibootmgr
-
-Code is currently ignoring errors from efibootmgr, giving users
-clearly bogus output like:
-
-        Setting up grub-efi-amd64 (2.02~beta3-4) ...
-        Installing for x86_64-efi platform.
-        Could not delete variable: No space left on device
-        Could not prepare Boot variable: No space left on device
-        Installation finished. No error reported.
-
-and then potentially unbootable systems. If efibootmgr fails, grub-install
-should know that and report it!
-
-We've been using similar patch in Debian now for some time, with no ill effects.
-
-diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
-index a3fcfca..ca448bc 100644
---- a/grub-core/osdep/unix/platform.c
-+++ b/grub-core/osdep/unix/platform.c
-@@ -78,19 +78,20 @@ get_ofpathname (const char *dev)
- 		   dev);
- }
- 
--static void
-+static int
- grub_install_remove_efi_entries_by_distributor (const char *efi_distributor)
- {
-   int fd;
-   pid_t pid = grub_util_exec_pipe ((const char * []){ "efibootmgr", NULL }, &fd);
-   char *line = NULL;
-   size_t len = 0;
-+  int rc;
- 
-   if (!pid)
-     {
-       grub_util_warn (_("Unable to open stream from %s: %s"),
- 		      "efibootmgr", strerror (errno));
--      return;
-+      return errno;
-     }
- 
-   FILE *fp = fdopen (fd, "r");
-@@ -98,7 +99,7 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor)
-     {
-       grub_util_warn (_("Unable to open stream from %s: %s"),
- 		      "efibootmgr", strerror (errno));
--      return;
-+      return errno;
-     }
- 
-   line = xmalloc (80);
-@@ -119,23 +120,25 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor)
-       bootnum = line + sizeof ("Boot") - 1;
-       bootnum[4] = '\0';
-       if (!verbosity)
--	grub_util_exec ((const char * []){ "efibootmgr", "-q",
-+	rc = grub_util_exec ((const char * []){ "efibootmgr", "-q",
- 	      "-b", bootnum,  "-B", NULL });
-       else
--	grub_util_exec ((const char * []){ "efibootmgr",
-+	rc = grub_util_exec ((const char * []){ "efibootmgr",
- 	      "-b", bootnum, "-B", NULL });
-     }
- 
-   free (line);
-+  return rc;
- }
- 
--void
-+int
- grub_install_register_efi (grub_device_t efidir_grub_dev,
- 			   const char *efifile_path,
- 			   const char *efi_distributor)
- {
-   const char * efidir_disk;
-   int efidir_part;
-+  int ret;
-   efidir_disk = grub_util_biosdisk_get_osdev (efidir_grub_dev->disk);
-   efidir_part = efidir_grub_dev->disk->partition ? efidir_grub_dev->disk->partition->number + 1 : 1;
- 
-@@ -151,23 +154,26 @@ grub_install_register_efi (grub_device_t efidir_grub_dev,
-   grub_util_exec ((const char * []){ "modprobe", "-q", "efivars", NULL });
- #endif
-   /* Delete old entries from the same distributor.  */
--  grub_install_remove_efi_entries_by_distributor (efi_distributor);
-+  ret = grub_install_remove_efi_entries_by_distributor (efi_distributor);
-+  if (ret)
-+    return ret;
- 
-   char *efidir_part_str = xasprintf ("%d", efidir_part);
- 
-   if (!verbosity)
--    grub_util_exec ((const char * []){ "efibootmgr", "-q",
-+    ret = grub_util_exec ((const char * []){ "efibootmgr", "-q",
- 	  "-c", "-d", efidir_disk,
- 	  "-p", efidir_part_str, "-w",
- 	  "-L", efi_distributor, "-l", 
- 	  efifile_path, NULL });
-   else
--    grub_util_exec ((const char * []){ "efibootmgr",
-+    ret = grub_util_exec ((const char * []){ "efibootmgr",
- 	  "-c", "-d", efidir_disk,
- 	  "-p", efidir_part_str, "-w",
- 	  "-L", efi_distributor, "-l", 
- 	  efifile_path, NULL });
-   free (efidir_part_str);
-+  return ret;
- }
- 
- void
-diff --git a/include/grub/util/install.h b/include/grub/util/install.h
-index 5910b0c..0dba8b6 100644
---- a/include/grub/util/install.h
-+++ b/include/grub/util/install.h
-@@ -210,7 +210,7 @@ grub_install_create_envblk_file (const char *name);
- const char *
- grub_install_get_default_x86_platform (void);
- 
--void
-+int
- grub_install_register_efi (grub_device_t efidir_grub_dev,
- 			   const char *efifile_path,
- 			   const char *efi_distributor);
-diff --git a/util/grub-install.c b/util/grub-install.c
-index 5e4cdfd..690f180 100644
---- a/util/grub-install.c
-+++ b/util/grub-install.c
-@@ -1848,9 +1848,13 @@ main (int argc, char *argv[])
- 	  if (!removable && update_nvram)
- 	    {
- 	      /* Try to make this image bootable using the EFI Boot Manager, if available.  */
--	      grub_install_register_efi (efidir_grub_dev,
--					 "\\System\\Library\\CoreServices",
--					 efi_distributor);
-+	      int ret;
-+	      ret = grub_install_register_efi (efidir_grub_dev,
-+					       "\\System\\Library\\CoreServices",
-+					       efi_distributor);
-+	      if (ret)
-+	        grub_util_error (_("efibootmgr failed to register the boot entry: %s"),
-+				 strerror (ret));
- 	    }
- 
- 	  grub_device_close (ins_dev);
-@@ -1871,6 +1875,7 @@ main (int argc, char *argv[])
- 	{
- 	  char * efifile_path;
- 	  char * part;
-+	  int ret;
- 
- 	  /* Try to make this image bootable using the EFI Boot Manager, if available.  */
- 	  if (!efi_distributor || efi_distributor[0] == '\0')
-@@ -1887,7 +1892,10 @@ main (int argc, char *argv[])
- 			  efidir_grub_dev->disk->name,
- 			  (part ? ",": ""), (part ? : ""));
- 	  grub_free (part);
--	  grub_install_register_efi (efidir_grub_dev,
--				     efifile_path, efi_distributor);
-+	  ret = grub_install_register_efi (efidir_grub_dev,
-+					   efifile_path, efi_distributor);
-+	  if (ret)
-+	    grub_util_error (_("efibootmgr failed to register the boot entry: %s"),
-+			     strerror (ret));
- 	}
-       break;
-
-
-Below is a followup to the patch above: the uninitialized variable could lead
-‘grub-install’ to error out when it shouldn’t (seen on an AArch64 box where
-‘grub_install_remove_efi_entries_by_distributor’ didn't have any entry to
-remove):
-
-  grub-install: error: efibootmgr failed to register the boot entry: Unknown error 65535.
-
-See <http://lists.gnu.org/archive/html/bug-grub/2018-10/msg00006.html>.
-
---- grub-2.02/grub-core/osdep/unix/platform.c	2018-10-17 22:21:53.015284846 +0200
-+++ grub-2.02/grub-core/osdep/unix/platform.c	2018-10-17 22:21:55.595271222 +0200
-@@ -85,7 +85,7 @@ grub_install_remove_efi_entries_by_distr
-   pid_t pid = grub_util_exec_pipe ((const char * []){ "efibootmgr", NULL }, &fd);
-   char *line = NULL;
-   size_t len = 0;
--  int rc;
-+  int rc = 0;
- 
-   if (!pid)
-     {
diff --git a/gnu/packages/patches/grub-efi-fat-serial-number.patch b/gnu/packages/patches/grub-efi-fat-serial-number.patch
index ad92f9bc9e..aec37d68e2 100644
--- a/gnu/packages/patches/grub-efi-fat-serial-number.patch
+++ b/gnu/packages/patches/grub-efi-fat-serial-number.patch
@@ -4,22 +4,23 @@ serial number (instead of the randomly chosen one) to create EFI
 images (the 'efi.img' file) that are reproducible bit-for-bit.
 
 Patch by Ludovic Courtès <ludo@gnu.org>.
+Mangled (for GRUB 2.04) by Tobias Geerinckx-Rice <me@tobias.gr>.
 
---- grub-2.02/util/grub-mkrescue.c	2019-04-20 19:15:26.180242812 +0200
-+++ grub-2.02/util/grub-mkrescue.c	2019-04-20 21:56:34.672370849 +0200
-@@ -788,8 +788,15 @@ main (int argc, char *argv[])
+--- grub-2.04/util/grub-mkrescue.c	2019-05-20 13:01:11.000000000 +0200
++++ grub-2.04/util/grub-mkrescue.c	2019-07-08 23:57:36.912104652 +0200
+@@ -809,8 +809,15 @@
+       free (efidir_efi_boot);
  
        efiimgfat = grub_util_path_concat (2, iso9660_dir, "efi.img");
-       int rv;
 -      rv = grub_util_exec ((const char * []) { "mformat", "-C", "-f", "2880", "-L", "16", "-i",
 -	    efiimgfat, "::", NULL });
 +
 +      const char *fat_serial_number = getenv ("GRUB_FAT_SERIAL_NUMBER");
 +      const char *mformat_args[] =
-+	{ "mformat", "-C", "-f", "2880", "-L", "16",
-+	  fat_serial_number != NULL ? "-N" : "-C",
-+	  fat_serial_number != NULL ? fat_serial_number : "-C",
-+	  "-i", efiimgfat, "::", NULL };
++       { "mformat", "-C", "-f", "2880", "-L", "16",
++         fat_serial_number != NULL ? "-N" : "-C",
++         fat_serial_number != NULL ? fat_serial_number : "-C",
++         "-i", efiimgfat, "::", NULL };
 +
 +      rv = grub_util_exec (mformat_args);
        if (rv != 0)
diff --git a/gnu/packages/patches/python-slugify-depend-on-unidecode.patch b/gnu/packages/patches/python-slugify-depend-on-unidecode.patch
new file mode 100644
index 0000000000..6038f432f1
--- /dev/null
+++ b/gnu/packages/patches/python-slugify-depend-on-unidecode.patch
@@ -0,0 +1,22 @@
+diff --git a/setup.py b/setup.py
+index 4800173..6bdd77f 100755
+--- a/setup.py
++++ b/setup.py
+@@ -14,8 +14,7 @@ url = 'https://github.com/un33k/python-slugify'
+ author = 'Val Neekman'
+ author_email = 'info@neekware.com'
+ license = 'MIT'
+-install_requires = ['text-unidecode==1.2']
+-extras_require = {'unidecode': ['Unidecode==1.0.23']}
++install_requires = ['Unidecode']
+ 
+ classifiers = [
+     'Development Status :: 5 - Production/Stable',
+@@ -67,7 +66,6 @@ setup(
+     author_email=author_email,
+     packages=find_packages(exclude=EXCLUDE_FROM_PACKAGES),
+     install_requires=install_requires,
+-    extras_require=extras_require,
+     classifiers=classifiers,
+     entry_points={'console_scripts': ['slugify=slugify.slugify:main']},
+ )
diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm
index cbcbe6c867..e441cbaa81 100644
--- a/gnu/packages/python-web.scm
+++ b/gnu/packages/python-web.scm
@@ -29,6 +29,7 @@
 ;;; Copyright © 2018 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2019 Vagrant Cascadian <vagrant@debian.org>
 ;;; Copyright © 2019 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -3165,3 +3166,33 @@ Python.")
     (propagated-inputs
      `(("python-gevent" ,python2-gevent)
        ("python-tornado" ,python2-tornado)))))
+
+(define-public python-slugify
+  (package
+    (name "python-slugify")
+    (version "3.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-slugify" version))
+       (sha256
+        (base32
+         "0n6pfmsq899c54plpvzi46l7zrpa3zfpm8im6h32czjw6kxky5jp"))
+       (patches
+        (search-patches "python-slugify-depend-on-unidecode.patch"))))
+    (native-inputs
+     `(("python-wheel" ,python-wheel)))
+    (propagated-inputs
+     `(("python-unidecode" ,python-unidecode)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (invoke "python" "test.py"))))))
+    (build-system python-build-system)
+    (home-page "https://github.com/un33k/python-slugify")
+    (synopsis "Python Slugify application that handles Unicode")
+    (description "This package provides a @command{slufigy} command and
+library to create slugs from unicode strings while keeping it DRY.")
+    (license license:expat)))
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 2273f1ce74..29aebdf8aa 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -62,6 +62,7 @@
 ;;; Copyright © 2019 Jack Hill <jackhill@jackhill.us>
 ;;; Copyright © 2019 Guillaume Le Vaillant <glv@posteo.net>
 ;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -15932,3 +15933,24 @@ hash, recno, and queue.  Complete support of Berkeley DB distributed
 transactions.  Complete support for Berkeley DB Replication Manager.
 Complete support for Berkeley DB Base Replication.  Support for RPC.")
     (license license:bsd-3)))
+
+(define-public python-dbfread
+  (package
+    (name "python-dbfread")
+    (version "2.0.7")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "dbfread" version))
+              (sha256
+               (base32
+                "0gdpwdzf1fngsi6jrdyj4qdf6cr7gnnr3zp80dpkzbgz0spskj07"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (home-page "https://dbfread.readthedocs.io")
+    (synopsis "Read DBF Files with Python")
+    (description
+     "This library reads DBF files and returns the data as native Python data
+types for further processing.  It is primarily intended for batch jobs and
+one-off scripts.")
+    (license license:expat)))
diff --git a/gnu/packages/time.scm b/gnu/packages/time.scm
index 9bbfe07803..9aad36e587 100644
--- a/gnu/packages/time.scm
+++ b/gnu/packages/time.scm
@@ -15,6 +15,7 @@
 ;;; Copyright © 2017 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2018 Alex Vong <alexvong1995@gmail.com>
 ;;; Copyright © 2019 Kyle Meyer <kyle@kyleam.com>
+;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -65,6 +66,26 @@ program uses.  The display output of the program can be customized or saved
 to a file.")
     (license gpl3+)))
 
+(define-public python-pytimeparse
+  (package
+    (name "python-pytimeparse")
+    (version "1.1.8")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pytimeparse" version))
+       (sha256
+        (base32
+         "02kaambsgpjx3zi42j6l11rwms2p35b9hsk4f3kdf979gd3kcqg8"))))
+    (native-inputs
+     `(("python-nose" ,python-nose)))
+    (build-system python-build-system)
+    (home-page "https://github.com/wroberts/pytimeparse")
+    (synopsis "Time expression parser")
+    (description "This small Python module parses various kinds of time
+expressions.")
+    (license expat)))
+
 (define-public python-pytzdata
   (package
     (name "python-pytzdata")
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 124cc93e68..0a270e14f0 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -33,6 +33,7 @@
 ;;; Copyright © 2019 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2019 Brendan Tildesley <mail@brendan.scot>
 ;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2019 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -5238,16 +5239,28 @@ command-line arguments or read from stdin.")
 (define-public python-internetarchive
   (package
     (name "python-internetarchive")
-    (version "1.7.4")
+    (version "1.8.5")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append "https://github.com/jjjake/internetarchive/archive/"
-                           "v" version ".tar.gz"))
-       (file-name (string-append name "-" version ".tar.gz"))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jjjake/internetarchive")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0sdbb2ag6vmybi8zmbjszi492a587giaaqxyy1p6gy03cb8mc512"))))
+         "0ih7hplv92wbv6cmgc1gs0v35qkajwicalwcq8vcljw30plr24fp"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           ;; Python 3.7 removed `_pattern_type'.
+           (for-each (lambda (file)
+                       (chmod file #o644)
+                       (substitute* file
+                         (("^import re\n" line)
+                          (string-append line "re._pattern_type = re.Pattern\n"))))
+                     (find-files "." "\\.py$"))
+           #t))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -6498,3 +6511,30 @@ update an existing mirrored site, and resume interrupted downloads.
 
 HTTrack is fully configurable, and has an integrated help system.")
     (license license:gpl3+)))
+
+(define-public anonip
+  (package
+    (name "anonip")
+    (version "1.0.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "anonip" version))
+              (sha256
+               (base32
+                "0ckn9nnfhpdnz8b92q8pkysdqj6pdh71ckfqvfj0z01cq0hzbhd2"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/DigitaleGesellschaft/Anonip")
+    (synopsis "Anonymize IP addresses in log files")
+    (description
+     "Anonip masks the last bits of IPv4 and IPv6 addresses in log files.
+That way most of the relevant information is preserved, while the IP address
+does not match a particular individuum anymore.
+
+Depending on your Web server, the log entries may be piped to Anonip directly
+or via a FIFO (named pipe).  Thus the unmasked IP addresses will never be
+written to any file.
+
+It's also possible to rewrite existing log files.
+
+Anonip can also be uses as a Python module in your own Python application.")
+    (license license:bsd-3)))
diff --git a/gnu/packages/wget.scm b/gnu/packages/wget.scm
index 7261137cab..76ceed5ff7 100644
--- a/gnu/packages/wget.scm
+++ b/gnu/packages/wget.scm
@@ -79,7 +79,7 @@ in downloaded documents to relative links.")
 (define-public wgetpaste
   (package
     (name "wgetpaste")
-    (version "2.28")
+    (version "2.29")
     (source
       (origin
         (method url-fetch)
@@ -87,10 +87,10 @@ in downloaded documents to relative links.")
                             version ".tar.bz2"))
         (sha256
          (base32
-          "1hh9svyypqcvdg5mjxyyfzpdzhylhf7s7xq5dzglnm4injx3i3ak"))))
+          "1rp0wxr3zy7y2xp3azaadfghrx7g0m138f9qg6icjxkkz4vj9r22"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:modules ((guix build gnu-build-system)
+     `(#:modules ((guix build gnu-build-system)
                   (guix build utils)
                   (srfi srfi-1))
        #:phases
@@ -102,16 +102,17 @@ in downloaded documents to relative links.")
            ;; https://gitweb.gentoo.org/repo/gentoo.git/tree/app-text/wgetpaste/files/wgetpaste-remove-dead.patch
            (lambda _
              (substitute* "wgetpaste"
-               ((" poundpython\"") "\"")
-               (("-poundpython") "-bpaste")) ; dpaste blocks tor users
+               (("-bpaste") "-dpaste")) ; dpaste blocks tor users
              #t))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
                     (bin (string-append out "/bin"))
-                    (zsh (string-append out "/share/zsh/site-functions")))
+                    (zsh (string-append out "/share/zsh/site-functions"))
+                    (doc (string-append out "/share/doc/" ,name "-" ,version)))
                (install-file "wgetpaste" bin)
                (install-file "_wgetpaste" zsh)
+               (install-file "LICENSE" doc)
                #t)))
          (add-after 'install 'wrap-program
            ;; /bin/wgetpaste prides itself on relying only on the following
diff --git a/gnu/packages/wine.scm b/gnu/packages/wine.scm
index b76c9d18b9..62cf225ceb 100644
--- a/gnu/packages/wine.scm
+++ b/gnu/packages/wine.scm
@@ -310,7 +310,7 @@ integrate Windows applications into your desktop.")
 (define-public wine-staging-patchset-data
   (package
     (name "wine-staging-patchset-data")
-    (version "4.12")
+    (version "4.12.1")
     (source
      (origin
        (method git-fetch)
@@ -320,7 +320,7 @@ integrate Windows applications into your desktop.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1drsrps6bd5gcafzcfrr9pzajhh5s6qg5la7q4qpwzlng9969f3r"))))
+         "1bvpvj6vcw2p6vcjm6mw5maarbs4lfw1ix3pj020w4n3kg4nmmc4"))))
     (build-system trivial-build-system)
     (native-inputs
      `(("bash" ,bash)
@@ -366,7 +366,7 @@ integrate Windows applications into your desktop.")
               (file-name (string-append name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1az5pcczq2zl1cvfdggzf89n0sf77m3fjkc8rnna8qr3n585q4h0"))))
+                "09yjfb2k14y11k19lm8dqmb8qwxyhh67d5q1gqv480y64mljvkx0"))))
     (inputs `(("autoconf" ,autoconf) ; for autoreconf
               ("faudio" ,faudio)
               ("ffmpeg" ,ffmpeg)
diff --git a/gnu/packages/wireservice.scm b/gnu/packages/wireservice.scm
new file mode 100644
index 0000000000..362b69575f
--- /dev/null
+++ b/gnu/packages/wireservice.scm
@@ -0,0 +1,267 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
+;;;
+;;; 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 wireservice)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix build-system python)
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module (guix packages)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages check)
+  #:use-module (gnu packages databases)
+  #:use-module (gnu packages python-web)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages sphinx)
+  #:use-module (gnu packages time))
+
+;; Common package definition for packages from https://github.com/wireservice.
+(define-syntax-rule (wireservice-package extra-fields ...)
+  (package
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (invoke "nosetests" "tests")))
+         (add-after 'install 'install-docs
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (doc (string-append out "/share/doc/"
+                                        ,(package-name this-package)
+                                        "-"
+                                        ,(package-version this-package))))
+               (with-directory-excursion "docs"
+                 (for-each
+                  (lambda (target)
+                    (invoke "make" target)
+                    (copy-recursively (string-append "_build/" target)
+                                      (string-append doc "/" target)))
+                  '("html" "dirhtml" "singlehtml" "text")))
+               #t))))))
+    (license license:expat)
+    extra-fields ...))
+
+(define-public python-leather
+  (wireservice-package
+   (name "python-leather")
+   (version "0.3.3")
+   (source (origin
+             (method git-fetch)
+             (uri (git-reference
+                   (url "https://github.com/wireservice/leather.git")
+                   (commit version)))
+             (file-name (git-file-name name version))
+             (sha256
+              (base32
+               "1ck3dplni99sv4s117cbm07ydwwjsrxkhdy19rnk0iglia1d4s5i"))))
+   (native-inputs
+    `(("python-nose" ,python-nose)
+      ("python-sphinx" ,python-sphinx)
+      ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)
+      ("python-csselect" ,python-cssselect)
+      ("python-lxml" ,python-lxml)))
+   (propagated-inputs
+    `(("python-six" ,python-six)))
+   (home-page "https://leather.rtfd.org")
+   (synopsis "Python charting for 80% of humans")
+   (description "Leather is a Python charting library for those who need
+charts now and don't care if they're perfect.")))
+
+(define-public python-agate
+  (wireservice-package
+   (name "python-agate")
+   (version "1.6.1")
+   (source (origin
+             (method git-fetch)
+             (uri (git-reference
+                   (url "https://github.com/wireservice/agate.git")
+                   (commit version)))
+             (file-name (git-file-name name version))
+             (sha256
+              (base32
+               "077zj8xad8hsa3nqywvf7ircirmx3krxdipl8wr3dynv3l3khcpl"))))
+   (native-inputs
+    `(("python-nose" ,python-nose)
+      ("python-sphinx" ,python-sphinx)
+      ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)
+      ("python-csselect" ,python-cssselect)
+      ("python-lxml" ,python-lxml)))
+   (propagated-inputs
+    `(("python-babel" ,python-babel)
+      ("python-isodate" ,python-isodate)
+      ("python-leather" ,python-leather)
+      ("python-parsedatetime" ,python-parsedatetime)
+      ("python-pytimeparse" ,python-pytimeparse)
+      ("python-six" ,python-six)
+      ("python-slugify" ,python-slugify)))
+   (home-page "https://agate.rtfd.org")
+   (synopsis "Data analysis library")
+   (description "Agate is a Python data analysis library.  It is an
+alternative to numpy and pandas that solves real-world problems with readable
+code.  Agate was previously known as journalism.")))
+
+(define-public python-agate-sql
+  (wireservice-package
+   (name "python-agate-sql")
+   (version "0.5.4")
+   (source (origin
+             (method git-fetch)
+             (uri (git-reference
+                   (url "https://github.com/wireservice/agate-sql.git")
+                   (commit version)))
+             (file-name (git-file-name name version))
+             (sha256
+              (base32
+               "16q0b211n5b1qmhzkfl2jr56lda0rvyh5j1wzw26h2n4pm4wxlx2"))))
+   (native-inputs
+    `(("python-nose" ,python-nose)
+      ("python-sphinx" ,python-sphinx)
+      ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)))
+   (propagated-inputs
+    `(("python-agate" ,python-agate)
+      ("python-crate" ,python-crate)
+      ("python-sqlalchemy" ,python-sqlalchemy)))
+   (home-page "https://agate-sql.rtfd.org")
+   (synopsis "SQL read/write support to agate")
+   (description "@code{agatesql} uses a monkey patching pattern to add SQL
+support to all @code{agate.Table} instances.")))
+
+(define-public python-agate-dbf
+  (wireservice-package
+   (name "python-agate-dbf")
+   (version "0.2.1")
+   (source (origin
+             (method git-fetch)
+             (uri (git-reference
+                   (url "https://github.com/wireservice/agate-dbf.git")
+                   (commit version)))
+             (file-name (git-file-name name version))
+             (sha256
+              (base32
+               "1y49fi6pmm7gzhajvqmfpcca2sqnwj24fqnsvzwk7r1hg2iaa2gi"))))
+   (native-inputs
+    `(("python-nose" ,python-nose)
+      ("python-sphinx" ,python-sphinx)
+      ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)))
+   (propagated-inputs
+    `(("python-agate" ,python-agate)
+      ("python-dbfread" ,python-dbfread)))
+   (home-page "https://agate-dbf.rtfd.org")
+   (synopsis "Add read support for dbf files to agate")
+   (description "@code{agatedbf} uses a monkey patching pattern to add read
+for dbf files support to all @code{agate.Table} instances.")))
+
+(define-public python-agate-excel
+  (wireservice-package
+   (name "python-agate-excel")
+   (version "0.2.3")
+   (source (origin
+             (method git-fetch)
+             (uri (git-reference
+                   (url "https://github.com/wireservice/agate-excel.git")
+                   (commit version)))
+             (file-name (git-file-name name version))
+             (sha256
+              (base32
+               "1k5lv21k19s7kgbj5srd1xgrkqvxqqs49qwj33zncs9l7851afy7"))))
+   (native-inputs
+    `(("python-nose" ,python-nose)
+      ("python-sphinx" ,python-sphinx)
+      ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)))
+   (propagated-inputs
+    `(("python-agate" ,python-agate)
+      ("python-openpyxl" ,python-openpyxl)
+      ("python-xlrd" ,python-xlrd)))
+   (home-page "https://agate-excel.rtfd.org")
+   (synopsis "Add read support for Excel files (xls and xlsx) to agate")
+   (description "@code{agateexcel} uses a monkey patching pattern to add read
+for xls and xlsx files support to all @code{agate.Table} instances.")))
+
+(define-public csvkit
+  (package
+    (name "csvkit")
+    (version "1.0.4")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "csvkit" version))
+              (sha256
+               (base32
+                "1830lb95rh1iyi3drlwxzb6y3pqkii0qiyzd40c1kvhvaf1s6lqk"))
+              (patches (search-patches "csvkit-fix-tests.patch"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-psycopg2" ,python-psycopg2) ;; Used to test PostgreSQL support.
+       ("python-sphinx" ,python-sphinx)
+       ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)))
+    (inputs
+     `(("python-agate-dbf" ,python-agate-dbf)
+       ("python-agate-excel" ,python-agate-excel)
+       ("python-agate-sql" ,python-agate-sql)
+       ("python-six" ,python-six)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'install-docs
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out  (assoc-ref outputs "out"))
+                    (man1 (string-append out "/share/man/man1")))
+               (with-directory-excursion "docs"
+                 (invoke "make" "man")
+                 (copy-recursively "_build/man" man1))
+               #t))))))
+    (home-page "https://csvkit.rtfd.org")
+    (synopsis "Command-line tools for working with CSV")
+    (description "csvkit is a suite of command-line tools for converting to
+and working with CSV.  It provides the following commands:
+@itemize
+@item Input:
+  @itemize
+  @item @command{in2csv}: Convert various formats to CSV.
+  @item @command{sql2csv}: Execute SQL commands on a database and return the
+data as CSV.
+  @end itemize
+@item Processing:
+  @itemize
+  @item @command{csvclean}: Remove common syntax errors.
+  @item @command{csvcut}: Filter and truncate CSV files.
+  @item @command{csvgrep}: Filter tabular data to only those rows where
+certain columns contain a given value or match a regular expression.
+  @item @command{csvjoin}: Merges two or more CSV tables together using a
+method analogous to SQL JOIN operation.
+  @item @command{csvsort}: Sort CSV files.
+  @item @command{csvstack}: Stack up the rows from multiple CSV files,
+optionally adding a grouping value to each row.
+  @end itemize
+@item Output and analysis:
+  @itemize
+  @item @command{csvformat}: Convert a CSV file to a custom output format.
+  @item @command{csvjson}: Converts a CSV file into JSON or GeoJSON.
+  @item @command{csvlook}: Renders a CSV to the command line in a
+Markdown-compatible, fixed-width format.
+  @item @command{csvpy}: Loads a CSV file into a @code{agate.csv.Reader}
+object and then drops into a Python shell so the user can inspect the data
+however they see fit.
+  @item @command{csvsql}: Generate SQL statements for a CSV file or execute
+those statements directly on a database.
+  @item @command{csvstat}: Prints descriptive statistics for all columns in a
+CSV file.
+  @end itemize
+@end itemize")
+    (license license:expat)))
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index 90bc7fc883..d4c750dc66 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -269,8 +269,8 @@ Despite the name it should work with any X11 window manager.")
     (license license:bsd-3)))
 
 (define-public i3blocks
-  (let ((commit "37f23805ff886639163fbef8aedba71c8071eff8")
-        (revision "1"))
+  (let ((commit "ec050e79ad8489a6f8deb37d4c20ab10729c25c3")
+        (revision "2"))
     (package
       (name "i3blocks")
       (version (string-append "1.4-" revision "."
@@ -282,7 +282,7 @@ Despite the name it should work with any X11 window manager.")
                       (commit commit)))
                 (sha256
                  (base32
-                  "15rnrcajzyrmhlz1a21qqsjlj3dkib70806dlb386fliylc2kisb"))
+                  "1fx4230lmqa5rpzph68dwnpcjfaaqv5gfkradcr85hd1z8d1qp1b"))
                 (file-name (git-file-name name version))))
       (build-system gnu-build-system)
       (arguments
diff --git a/guix/channels.scm b/guix/channels.scm
index fcf9fed829..e6bb9b891b 100644
--- a/guix/channels.scm
+++ b/guix/channels.scm
@@ -349,13 +349,15 @@ INSTANCES."
     (resolve-dependencies instances))
 
   (define (instance->derivation instance)
-    (mcached (if (eq? instance core-instance)
-                 (build-channel-instance instance)
-                 (mlet %store-monad ((core (instance->derivation core-instance))
-                                     (deps (mapm %store-monad instance->derivation
-                                                 (edges instance))))
-                   (build-channel-instance instance core deps)))
-             instance))
+    (mlet %store-monad ((system (current-system)))
+      (mcached (if (eq? instance core-instance)
+                   (build-channel-instance instance)
+                   (mlet %store-monad ((core (instance->derivation core-instance))
+                                       (deps (mapm %store-monad instance->derivation
+                                                   (edges instance))))
+                     (build-channel-instance instance core deps)))
+               instance
+               system)))
 
   (unless core-instance
     (let ((loc (and=> (any (compose channel-location channel-instance-channel)
diff --git a/guix/discovery.scm b/guix/discovery.scm
index 5bb494941b..86f20ec344 100644
--- a/guix/discovery.scm
+++ b/guix/discovery.scm
@@ -78,7 +78,9 @@ DIRECTORY is not accessible."
                                  ((= stat:type 'directory)
                                   (append (scheme-files absolute)
                                           result))
-                                 (_ result)))))
+                                 (_ result)))
+                              (else
+                               result)))
                        (else
                         result))))))
               '()
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm
index c1341628a8..cf58768300 100644
--- a/guix/scripts/environment.scm
+++ b/guix/scripts/environment.scm
@@ -162,6 +162,10 @@ COMMAND or an interactive shell in that environment.\n"))
                          user into an isolated container, use the name USER
                          with home directory /home/USER"))
   (display (G_ "
+      --no-cwd           do not share current working directory with an
+                         isolated container"))
+
+  (display (G_ "
       --share=SPEC       for containers, share writable host file system
                          according to SPEC"))
   (display (G_ "
@@ -269,6 +273,9 @@ use '--preserve' instead~%"))
                  (lambda (opt name arg result)
                    (alist-cons 'user arg
                                (alist-delete 'user result eq?))))
+         (option '("no-cwd") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'no-cwd? #t result)))
          (option '("share") #t #f
                  (lambda (opt name arg result)
                    (alist-cons 'file-system-mapping
@@ -444,7 +451,8 @@ regexps in WHITE-LIST."
            ((_ . status) status)))))
 
 (define* (launch-environment/container #:key command bash user user-mappings
-                                       profile manifest link-profile? network?)
+                                       profile manifest link-profile? network?
+                                       map-cwd?)
   "Run COMMAND within a container that features the software in PROFILE.
 Environment variables are set according to the search paths of MANIFEST.
 The global shell is BASH, a file name for a GNU Bash binary in the
@@ -479,26 +487,29 @@ will be used for the passwd entry.  LINK-PROFILE? creates a symbolic link from
             ;; /bin/sh, the current working directory, and possibly networking
             ;; configuration files within the container.
             (mappings
-             (override-user-mappings
-              user home
-              (append user-mappings
-                      ;; Current working directory.
-                      (list (file-system-mapping
-                             (source cwd)
-                             (target cwd)
-                             (writable? #t)))
-                      ;; When in Rome, do as Nix build.cc does: Automagically
-                      ;; map common network configuration files.
-                      (if network?
-                          %network-file-mappings
-                          '())
-                      ;; Mappings for the union closure of all inputs.
-                      (map (lambda (dir)
-                             (file-system-mapping
-                              (source dir)
-                              (target dir)
-                              (writable? #f)))
-                           reqs))))
+             (append
+              (override-user-mappings
+               user home
+               (append user-mappings
+                       ;; Share current working directory, unless asked not to.
+                       (if map-cwd?
+                           (list (file-system-mapping
+                                  (source cwd)
+                                  (target cwd)
+                                  (writable? #t)))
+                           '())))
+              ;; When in Rome, do as Nix build.cc does: Automagically
+              ;; map common network configuration files.
+              (if network?
+                  %network-file-mappings
+                  '())
+              ;; Mappings for the union closure of all inputs.
+              (map (lambda (dir)
+                     (file-system-mapping
+                      (source dir)
+                      (target dir)
+                      (writable? #f)))
+                   reqs)))
             (file-systems (append %container-file-systems
                                   (map file-system-mapping->bind-mount
                                        mappings))))
@@ -536,8 +547,10 @@ will be used for the passwd entry.  LINK-PROFILE? creates a symbolic link from
             (write-group groups)
 
             ;; For convenience, start in the user's current working
-            ;; directory rather than the root directory.
-            (chdir (override-user-dir user home cwd))
+            ;; directory or, if unmapped, the home directory.
+            (chdir (if map-cwd?
+                       (override-user-dir user home cwd)
+                       home-dir))
 
             (primitive-exit/status
              ;; A container's environment is already purified, so no need to
@@ -664,6 +677,7 @@ message if any test fails."
            (container? (assoc-ref opts 'container?))
            (link-prof? (assoc-ref opts 'link-profile?))
            (network?   (assoc-ref opts 'network?))
+           (no-cwd?    (assoc-ref opts 'no-cwd?))
            (user       (assoc-ref opts 'user))
            (bootstrap? (assoc-ref opts 'bootstrap?))
            (system     (assoc-ref opts 'system))
@@ -684,6 +698,9 @@ message if any test fails."
         (leave (G_ "'--link-profile' cannot be used without '--container'~%")))
       (when (and (not container?) user)
         (leave (G_ "'--user' cannot be used without '--container'~%")))
+      (when (and (not container?) no-cwd?)
+        (leave (G_ "--no-cwd cannot be used without --container~%")))
+
 
       (with-store store
         (with-status-verbosity (assoc-ref opts 'verbosity)
@@ -740,7 +757,9 @@ message if any test fails."
                                                     #:profile profile
                                                     #:manifest manifest
                                                     #:link-profile? link-prof?
-                                                    #:network? network?)))
+                                                    #:network? network?
+                                                    #:map-cwd? (not no-cwd?))))
+
                    (else
                     (return
                      (exit/status
diff --git a/guix/self.scm b/guix/self.scm
index be90b60863..b8581d01d5 100644
--- a/guix/self.scm
+++ b/guix/self.scm
@@ -769,7 +769,8 @@ Info manual."
                    (gnu services)
                    ,@(scheme-modules* source "gnu/bootloader")
                    ,@(scheme-modules* source "gnu/system")
-                   ,@(scheme-modules* source "gnu/services"))
+                   ,@(scheme-modules* source "gnu/services")
+                   ,@(scheme-modules* source "gnu/machine"))
                  (list *core-package-modules* *package-modules*
                        *extra-modules* *core-modules*)
                  #:extensions dependencies
diff --git a/release.nix b/release.nix
deleted file mode 100644
index 369d54ed96..0000000000
--- a/release.nix
+++ /dev/null
@@ -1,129 +0,0 @@
-/* GNU Guix --- Functional package management for GNU
-   Copyright (C) 2012  Ludovic Courtès <ludo@gnu.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/>.  */
-
-/* Release file to build Guix with Nix.  Useful to bootstrap Guix on
-   Guix-enabled Hydra instances.  */
-
-let
-  nixpkgs = <nixpkgs>;
-
-  buildOutOfSourceTree = true;
-  succeedOnFailure = true;
-  keepBuildDirectory = true;
-
-  # The Guile used to bootstrap the whole thing.  It's normally
-  # downloaded by the build system, but here we download it via a
-  # fixed-output derivation and stuff it into the build tree.
-  bootstrap_guile =
-    let pkgs = import nixpkgs {}; in {
-      i686 = pkgs.fetchurl {
-        url = http://www.fdn.fr/~lcourtes/software/guix/packages/i686-linux/20121219/guile-2.0.7.tar.xz;
-        sha256 = "45d1f9bfb9e4531a8f1c5a105f7ab094cd481b8a179ccc63cbabb73ce6b8437f";
-      };
-
-      x86_64 = pkgs.fetchurl {
-        url = http://www.fdn.fr/~lcourtes/software/guix/packages/x86_64-linux/20121219/guile-2.0.7.tar.xz;
-        sha256 = "953fbcc8db6e310626be79b67319cf4141dc23b296447952a99d95425b3a4dc1";
-      };
-    };
-
-  jobs = {
-    tarball =
-      let pkgs = import nixpkgs {}; in
-      pkgs.releaseTools.sourceTarball {
-        name = "guix-tarball";
-        src = <guix>;
-        buildInputs = with pkgs; [ guile sqlite bzip2 git libgcrypt ];
-        buildNativeInputs = with pkgs; [ texinfo gettext cvs pkgconfig ];
-        preAutoconf = ''git config submodule.nix.url "${<nix>}"'';
-        configureFlags =
-          [ "--with-libgcrypt-prefix=${pkgs.libgcrypt}"
-            "--localstatedir=/nix/var"
-          ];
-      };
-
-    build =
-      { system ? builtins.currentSystem }:
-
-      let pkgs = import nixpkgs { inherit system; }; in
-      pkgs.releaseTools.nixBuild {
-        name = "guix";
-        buildInputs = with pkgs; [ guile sqlite bzip2 libgcrypt ];
-        buildNativeInputs = [ pkgs.pkgconfig ];
-        src = jobs.tarball;
-        configureFlags =
-          [ "--with-libgcrypt-prefix=${pkgs.libgcrypt}"
-            "--localstatedir=/nix/var"
-          ];
-
-        preBuild =
-          # Use our pre-downloaded bootstrap tarballs instead of letting
-          # the build system download it over and over again.
-          '' mkdir -p distro/packages/bootstrap/{i686,x86_64}-linux
-             cp -v "${bootstrap_guile.i686}" \
-               distro/packages/bootstrap/i686-linux/guile-2.0.7.tar.xz
-             cp -v "${bootstrap_guile.x86_64}" \
-               distro/packages/bootstrap/x86_64-linux/guile-2.0.7.tar.xz
-          '';
-
-        inherit succeedOnFailure keepBuildDirectory
-          buildOutOfSourceTree;
-      };
-
-
-    build_disable_daemon =
-      { system ? builtins.currentSystem }:
-
-      let
-        pkgs = import nixpkgs { inherit system; };
-        build = jobs.build { inherit system; };
-      in
-        pkgs.lib.overrideDerivation build ({ configureFlags, ... }: {
-          configureFlags = configureFlags ++ [ "--disable-daemon" ];
-          buildInputs = with pkgs; [ guile nixUnstable pkgconfig ];
-
-          # Since we need to talk to a running daemon, we need to escape
-          # the chroot.
-          preConfigure = "export NIX_REMOTE=daemon";
-          __noChroot = true;
-        });
-
-    # Jobs to test the distro.
-    distro = {
-      hello =
-        { system ? builtins.currentSystem }:
-
-        let
-          pkgs = import nixpkgs { inherit system; };
-          guix = jobs.build { inherit system; };
-        in
-          # XXX: We have no way to tell the Nix code to swallow the .drv
-          # produced by `guix-build', so we have a pointless indirection
-          # here.  This could be worked around by generating Nix code
-          # from the .drv, and importing that.
-          pkgs.releaseTools.nixBuild {
-            src = null;
-            name = "guix-hello";
-            phases = "buildPhase";
-            buildPhase = "${guix}/bin/guix-build --no-substitutes hello | tee $out";
-            __noChroot = true;
-          };
-    };
-  };
-in
-  jobs
diff --git a/tests/guix-environment.sh b/tests/guix-environment.sh
index a670db36be..5a5a69d58c 100644
--- a/tests/guix-environment.sh
+++ b/tests/guix-environment.sh
@@ -84,6 +84,14 @@ echo "(use-modules (guix profiles) (gnu packages bootstrap))
 guix environment --bootstrap --manifest=$tmpdir/manifest.scm --pure \
      -- "$SHELL" -c 'test -f "$GUIX_ENVIRONMENT/bin/guile"'
 
+# if not sharing CWD, chdir home
+(
+  cd "$tmpdir" \
+    && guix environment --bootstrap --container --no-cwd --user=foo  \
+            --ad-hoc guile-bootstrap --pure \
+            -- /bin/sh -c 'test $(pwd) == "/home/foo" -a ! -d '"$tmpdir"
+)
+
 # Make sure '-r' works as expected.
 rm -f "$gcroot"
 expected="`guix environment --bootstrap --ad-hoc guile-bootstrap \