weather: Exit with non-zero when coverage is below 100%.
authorLudovic Courtès <ludo@gnu.org>
Fri, 13 Mar 2020 09:53:49 +0000 (10:53 +0100)
committerLudovic Courtès <ludo@gnu.org>
Fri, 13 Mar 2020 16:33:37 +0000 (17:33 +0100)
* guix/scripts/weather.scm (report-server-coverage): Return the coverage ratio.
(guix-weather): Exit if and only if each server's coverage is 1.

doc/guix.texi
guix/scripts/weather.scm

index 9a5b5f7..8acae26 100644 (file)
@@ -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}
index 733986b..913c849 100644 (file)
@@ -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)))))
 
 \f
 ;;;
@@ -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)