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)