summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)