Subject: `guix substitute --substitute' dies on unreachable substitute server

From: Maxim Cournoyer <[email-masked]>
Date: Mon, 08 May 2017 08:40:25 -0700

Problem: When using multiple substitute servers, if one of the server is
temporarily unreachable, `guix substitute --substitute' will throw an
exception. Example (while bayfront server was down, attempting to build
a package only available locally (emacs-dvc)):

--8<---------------cut here---------------start------------->8---
guix package -i emacs-dvc
;;; note: source file /home/maxim/.config/guix/latest/gnu/packages/emacs.scm
;;;       newer than compiled /home/maxim/.config/guix/latest/gnu/packages/emacs.go
;;; note: source file /home/maxim/.config/guix/latest/gnu/packages/emacs.scm
;;;       newer than compiled /gnu/store/nqy9m6hhnkkfwr5wyq5bac96v9s9hc9i-guix-0.12.0-9.25a4/lib/guile/2.0/site-ccache/gnu/packages/emacs.go
;;; note: source file /home/maxim/.config/guix/latest/gnu/packages/emacs.scm
;;;       newer than compiled /run/current-system/profile/lib/guile/2.0/site-ccache/gnu/packages/emacs.go
;;; note: source file /home/maxim/.config/guix/latest/gnu/packages/emacs.scm
;;;       newer than compiled /home/maxim/.cache/guile/ccache/2.0-LE-8-2.0/home/maxim/src/guix/gnu/packages/emacs.scm.go
The following package will be installed:
   emacs-dvc    trunk-1.591     /gnu/store/sraxmg5qz9i4338s4ks7asgy4v68dgqs-emacs-dvc-trunk-1.591
substitute: updating list of substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
substitute: updating list of substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
Downloading https://bayfront.guixsd.org/nar/gzip/6h7ym07plwxfn4zq53ld8zfpbx3a09al-at-spi2-core-2.22.0 (1.1MiB installed)...
guix substitute: error: connect: No route to host
killing process 13896
killing process 13896: No such process
--8<---------------cut here---------------end--------------->8---

Expected: Since multiple substitute servers are being used, rather than
bombing out on the first unavailable one, `guix substitute --substitute'
(or any other command implicated with substitute servers) should simply
warn about it before attempting the next one.

Bonus point: `guix substitute --query' should also print a warning
message that substitute server X couldn't be reached (it doesn't print
anything about that right now, just skips to the next one).