summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2020-03-13 10:53:49 +0100
committerLudovic Courtès <ludo@gnu.org>2020-03-13 17:33:37 +0100
commitbe764b47ad1079df531f016c1946cbf98ff48c41 (patch)
tree1194a8da879387b02b4bc65f0beb3ebdda9d0203
parent10b99ddf4596a033eaf348dddf519639e029f9d1 (diff)
downloadguix-be764b47ad1079df531f016c1946cbf98ff48c41.tar.gz
weather: Exit with non-zero when coverage is below 100%.
* guix/scripts/weather.scm (report-server-coverage): Return the coverage ratio.
(guix-weather): Exit if and only if each server's coverage is 1.
-rw-r--r--doc/guix.texi7
-rw-r--r--guix/scripts/weather.scm29
2 files changed, 24 insertions, 12 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index 9a5b5f7fbe..8acae26b9a 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -10809,8 +10809,11 @@ guix weather @var{options}@dots{} [@var{packages}@dots{}]
 When @var{packages} is omitted, @command{guix weather} checks the availability
 of substitutes for @emph{all} the packages, or for those specified with
 @option{--manifest}; otherwise it only considers the specified packages.  It
-is also possible to query specific system types with @option{--system}.  The
-available options are listed below.
+is also possible to query specific system types with @option{--system}.
+@command{guix weather} exits with a non-zero code when the fraction of
+available substitutes is below 100%.
+
+The available options are listed below.
 
 @table @code
 @item --substitute-urls=@var{urls}
diff --git a/guix/scripts/weather.scm b/guix/scripts/weather.scm
index 733986be0c..913c84955e 100644
--- a/guix/scripts/weather.scm
+++ b/guix/scripts/weather.scm
@@ -178,7 +178,8 @@ about the derivations queued, as is the case with Hydra."
 (define* (report-server-coverage server items
                                  #:key display-missing?)
   "Report the subset of ITEMS available as substitutes on SERVER.
-When DISPLAY-MISSING? is true, display the list of missing substitutes."
+When DISPLAY-MISSING? is true, display the list of missing substitutes.
+Return the coverage ratio, an exact number between 0 and 1."
   (define MiB (* (expt 2 20) 1.))
 
   (format #t (G_ "looking for ~h store items on ~a...~%")
@@ -267,7 +268,11 @@ are queued~%")
       (when (and display-missing? (not (null? missing)))
         (newline)
         (format #t (G_ "Substitutes are missing for the following items:~%"))
-        (format #t "~{  ~a~%~}" missing)))))
+        (format #t "~{  ~a~%~}" missing))
+
+      ;; Return the coverage ratio.
+      (let ((total (length items)))
+        (/ (- total (length missing)) total)))))
 
 
 ;;;
@@ -538,16 +543,20 @@ SERVER.  Display information for packages with at least THRESHOLD dependents."
                                   (lambda (system)
                                     (package-outputs packages system))
                                   systems))))))
-        (for-each (lambda (server)
+        (exit
+         (every (lambda (server)
+                  (define coverage
                     (report-server-coverage server items
                                             #:display-missing?
-                                            (assoc-ref opts 'display-missing?))
-                    (match (assoc-ref opts 'coverage)
-                      (#f #f)
-                      (threshold
-                       (report-package-coverage server packages systems
-                                                #:threshold threshold))))
-                  urls)))))
+                                            (assoc-ref opts 'display-missing?)))
+                  (match (assoc-ref opts 'coverage)
+                    (#f #f)
+                    (threshold
+                     (report-package-coverage server packages systems
+                                              #:threshold threshold)))
+
+                  (= 1 coverage))
+                urls))))))
 
 ;;; Local Variables:
 ;;; eval: (put 'let/time 'scheme-indent-function 1)