* [bug#45146] [PATCH] scripts: substitute: Improve fetch-narinfos progress reporting.
@ 2020-12-09 18:57 Christopher Baines
2020-12-11 18:01 ` Ludovic Courtès
2021-02-24 20:34 ` [bug#45146] [PATCH 1/2] guix: substitutes: Make progress reporting configurable Christopher Baines
0 siblings, 2 replies; 7+ messages in thread
From: Christopher Baines @ 2020-12-09 18:57 UTC (permalink / raw)
To: 45146
At least in guix weather, these changes make the progress bar actually appear.
* guix/scripts/substitute.scm (fetch-narinfos): Use (guix progress) for
progress reporting.
---
guix/scripts/substitute.scm | 18 +++++-------------
1 file changed, 5 insertions(+), 13 deletions(-)
diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm
index 25075eedff..5128310439 100755
--- a/guix/scripts/substitute.scm
+++ b/guix/scripts/substitute.scm
@@ -614,16 +614,8 @@ print a warning and return #f."
(define (fetch-narinfos url paths)
"Retrieve all the narinfos for PATHS from the cache at URL and return them."
- (define update-progress!
- (let ((done 0)
- (total (length paths)))
- (lambda ()
- (display "\r\x1b[K" (current-error-port)) ;erase current line
- (force-output (current-error-port))
- (format (current-error-port)
- (G_ "updating substitutes from '~a'... ~5,1f%")
- url (* 100. (/ done total)))
- (set! done (+ 1 done)))))
+ (define fetch-narinfos-progress-reporter
+ (progress-reporter/bar (length paths)))
(define hash-part->path
(let ((mapping (fold (lambda (path result)
@@ -641,7 +633,7 @@ print a warning and return #f."
(len (response-content-length response))
(cache (response-cache-control response))
(ttl (and cache (assoc-ref cache 'max-age))))
- (update-progress!)
+ (progress-reporter-report! fetch-narinfos-progress-reporter)
;; Make sure to read no more than LEN bytes since subsequent bytes may
;; belong to the next response.
@@ -673,7 +665,7 @@ print a warning and return #f."
(#f
'())
(port
- (update-progress!)
+ (start-progress-reporter! fetch-narinfos-progress-reporter)
;; Note: Do not check HTTPS server certificates to avoid depending
;; on the X.509 PKI. We can do it because we authenticate
;; narinfos, which provides a much stronger guarantee.
@@ -683,7 +675,7 @@ print a warning and return #f."
#:verify-certificate? #f
#:port port)))
(close-port port)
- (newline (current-error-port))
+ (stop-progress-reporter! fetch-narinfos-progress-reporter)
result)))))
((file #f)
(let* ((base (string-append (uri-path uri) "/"))
--
2.29.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [bug#45146] [PATCH] scripts: substitute: Improve fetch-narinfos progress reporting.
2020-12-09 18:57 [bug#45146] [PATCH] scripts: substitute: Improve fetch-narinfos progress reporting Christopher Baines
@ 2020-12-11 18:01 ` Ludovic Courtès
2020-12-24 17:26 ` Christopher Baines
2021-02-24 20:34 ` [bug#45146] [PATCH 1/2] guix: substitutes: Make progress reporting configurable Christopher Baines
1 sibling, 1 reply; 7+ messages in thread
From: Ludovic Courtès @ 2020-12-11 18:01 UTC (permalink / raw)
To: Christopher Baines; +Cc: 45146
Hi,
Christopher Baines <mail@cbaines.net> skribis:
> At least in guix weather, these changes make the progress bar actually appear.
>
> * guix/scripts/substitute.scm (fetch-narinfos): Use (guix progress) for
> progress reporting.
Cool. I noticed that something was wrong with ‘guix weather’, but I
suspected it had to do with the order in which the erase-line sequence
and \r are sent.
> - (lambda ()
> - (display "\r\x1b[K" (current-error-port)) ;erase current line
> - (force-output (current-error-port))
> - (format (current-error-port)
> - (G_ "updating substitutes from '~a'... ~5,1f%")
> - url (* 100. (/ done total)))
> - (set! done (+ 1 done)))))
> + (define fetch-narinfos-progress-reporter
> + (progress-reporter/bar (length paths)))
The problem here is that we’d see a progress bar without knowing what it
represents.
Besides, currently output from ‘guix substitute’ is printed as is by
client commands, regardless of whether stdout is a tty. The problem
already exists but it would become a bit more visible as logs get filled
with progress bars.
Ludo’.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#45146] [PATCH] scripts: substitute: Improve fetch-narinfos progress reporting.
2020-12-11 18:01 ` Ludovic Courtès
@ 2020-12-24 17:26 ` Christopher Baines
2021-02-24 20:44 ` Christopher Baines
0 siblings, 1 reply; 7+ messages in thread
From: Christopher Baines @ 2020-12-24 17:26 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: 45146
[-- Attachment #1: Type: text/plain, Size: 1695 bytes --]
Ludovic Courtès <ludo@gnu.org> writes:
> Christopher Baines <mail@cbaines.net> skribis:
>
>> At least in guix weather, these changes make the progress bar actually appear.
>>
>> * guix/scripts/substitute.scm (fetch-narinfos): Use (guix progress) for
>> progress reporting.
>
> Cool. I noticed that something was wrong with ‘guix weather’, but I
> suspected it had to do with the order in which the erase-line sequence
> and \r are sent.
>
>> - (lambda ()
>> - (display "\r\x1b[K" (current-error-port)) ;erase current line
>> - (force-output (current-error-port))
>> - (format (current-error-port)
>> - (G_ "updating substitutes from '~a'... ~5,1f%")
>> - url (* 100. (/ done total)))
>> - (set! done (+ 1 done)))))
>> + (define fetch-narinfos-progress-reporter
>> + (progress-reporter/bar (length paths)))
>
> The problem here is that we’d see a progress bar without knowing what it
> represents.
>
> Besides, currently output from ‘guix substitute’ is printed as is by
> client commands, regardless of whether stdout is a tty. The problem
> already exists but it would become a bit more visible as logs get filled
> with progress bars.
Maybe it's best to circle back to fixing guix weather after trying to
restructure some of the guix substitute code.
I've made an initial attempt at moving things around in [1]. If the
underlying code can live in a module, and then the substitute, weather
and challenge scripts use that code with whatever UI stuff they want,
maybe that will allow for better addressing this weather specific issue.
1: https://issues.guix.info/45409
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 987 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#45146] [PATCH 1/2] guix: substitutes: Make progress reporting configurable.
2020-12-09 18:57 [bug#45146] [PATCH] scripts: substitute: Improve fetch-narinfos progress reporting Christopher Baines
2020-12-11 18:01 ` Ludovic Courtès
@ 2021-02-24 20:34 ` Christopher Baines
2021-02-24 20:34 ` [bug#45146] [PATCH 2/2] weather: Call lookup-narinfos with a custom progress reporter Christopher Baines
1 sibling, 1 reply; 7+ messages in thread
From: Christopher Baines @ 2021-02-24 20:34 UTC (permalink / raw)
To: 45146
Rather than always outputting to (current-error-port) in
lookup-narinfos (which is called from within lookup-narinfos/diverse), take a
procedure which should return a progress reporter, and defer any output to
that.
As this is now general purpose code, make the default behaviour to output
nothing. Maintain the current behaviour of the substitute script by moving the
progress reporter implementation there, and passing it in when calling
lookup-narinfos/diverse.
These changes should be generally useful, but I'm particularly looking at
getting guix weather to do progress reporting differently, with this new
flexibility.
* guix/substitutes.scm (fetch-narinfos): Take a procedure to make a
progress-reporter, and use that rather than the hardcoded behaviour.
(lookup-narinfos): Add #:make-progress-reporter keyword argument, and pass
this through to fetch-narinfos.
(lookup-narinfos/diverse): Add a #:make-progress-reporter keyword argument,
and pass this through to lookup-narinfos.
* guix/scripts/substitute.scm (process-query): Pass a progress-reporter to
lookup-narinfos/diverse.
---
guix/scripts/substitute.scm | 23 +++++++++++++++++++--
guix/substitutes.scm | 40 ++++++++++++++++++++-----------------
2 files changed, 43 insertions(+), 20 deletions(-)
diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm
index ed19e67531..47a723edb2 100755
--- a/guix/scripts/substitute.scm
+++ b/guix/scripts/substitute.scm
@@ -298,12 +298,30 @@ authorized substitutes."
(lambda (obj)
(valid-narinfo? obj acl))))
+ (define* (make-progress-reporter total #:key url)
+ (define done 0)
+
+ (define (report-progress)
+ (erase-current-line (current-error-port)) ;erase current line
+ (force-output (current-error-port))
+ (format (current-error-port)
+ (G_ "updating substitutes from '~a'... ~5,1f%")
+ url (* 100. (/ done total)))
+ (set! done (+ 1 done)))
+
+ (progress-reporter
+ (start report-progress)
+ (report report-progress)
+ (stop (lambda ()
+ (newline (current-error-port))))))
+
(match (string-tokenize command)
(("have" paths ..1)
;; Return the subset of PATHS available in CACHE-URLS.
(let ((substitutable (lookup-narinfos/diverse
cache-urls paths valid?
- #:open-connection open-connection-for-uri/cached)))
+ #:open-connection open-connection-for-uri/cached
+ #:make-progress-reporter make-progress-reporter)))
(for-each (lambda (narinfo)
(format #t "~a~%" (narinfo-path narinfo)))
substitutable)
@@ -312,7 +330,8 @@ authorized substitutes."
;; Reply info about PATHS if it's in CACHE-URLS.
(let ((substitutable (lookup-narinfos/diverse
cache-urls paths valid?
- #:open-connection open-connection-for-uri/cached)))
+ #:open-connection open-connection-for-uri/cached
+ #:make-progress-reporter make-progress-reporter)))
(for-each display-narinfo-data substitutable)
(newline)))
(wtf
diff --git a/guix/substitutes.scm b/guix/substitutes.scm
index dc94ccc8e4..ef78013659 100644
--- a/guix/substitutes.scm
+++ b/guix/substitutes.scm
@@ -173,18 +173,14 @@ if file doesn't exist, and the narinfo otherwise."
(apply throw args)))))
(define* (fetch-narinfos url paths
- #:key (open-connection guix:open-connection-for-uri))
+ #:key
+ (open-connection guix:open-connection-for-uri)
+ (make-progress-reporter
+ (const progress-reporter/silent)))
"Retrieve all the narinfos for PATHS from the cache at URL and return them."
- (define update-progress!
- (let ((done 0)
- (total (length paths)))
- (lambda ()
- (display "\r\x1b[K" (current-error-port)) ;erase current line
- (force-output (current-error-port))
- (format (current-error-port)
- (G_ "updating substitutes from '~a'... ~5,1f%")
- url (* 100. (/ done total)))
- (set! done (+ 1 done)))))
+ (define progress-reporter
+ (make-progress-reporter (length paths)
+ #:url url))
(define hash-part->path
(let ((mapping (fold (lambda (path result)
@@ -206,7 +202,7 @@ if file doesn't exist, and the narinfo otherwise."
(len (response-content-length response))
(cache (response-cache-control response))
(ttl (and cache (assoc-ref cache 'max-age))))
- (update-progress!)
+ (progress-reporter-report! progress-reporter)
;; Make sure to read no more than LEN bytes since subsequent bytes may
;; belong to the next response.
@@ -238,7 +234,7 @@ if file doesn't exist, and the narinfo otherwise."
;; narinfos, which provides a much stronger guarantee.
(let* ((requests (map (cut narinfo-request url <>) paths))
(result (begin
- (update-progress!)
+ (start-progress-reporter! progress-reporter)
(call-with-connection-error-handling
uri
(lambda ()
@@ -247,7 +243,7 @@ if file doesn't exist, and the narinfo otherwise."
requests
#:open-connection open-connection
#:verify-certificate? #f))))))
- (newline (current-error-port))
+ (stop-progress-reporter! progress-reporter)
result))
((file #f)
(let* ((base (string-append (uri-path uri) "/"))
@@ -297,7 +293,9 @@ for PATH."
(values #f #f))))
(define* (lookup-narinfos cache paths
- #:key (open-connection guix:open-connection-for-uri))
+ #:key (open-connection guix:open-connection-for-uri)
+ (make-progress-reporter
+ (const progress-reporter/silent)))
"Return the narinfos for PATHS, invoking the server at CACHE when no
information is available locally."
(let-values (((cached missing)
@@ -315,12 +313,16 @@ information is available locally."
(if (null? missing)
cached
(let ((missing (fetch-narinfos cache missing
- #:open-connection open-connection)))
+ #:open-connection open-connection
+ #:make-progress-reporter
+ make-progress-reporter)))
(append cached (or missing '()))))))
(define* (lookup-narinfos/diverse caches paths authorized?
#:key (open-connection
- guix:open-connection-for-uri))
+ guix:open-connection-for-uri)
+ (make-progress-reporter
+ (const progress-reporter/silent)))
"Look up narinfos for PATHS on all of CACHES, a list of URLS, in that order.
That is, when a cache lacks an AUTHORIZED? narinfo, look it up in the next
cache, and so on.
@@ -353,7 +355,9 @@ AUTHORIZED? narinfo."
(match caches
((cache rest ...)
(let* ((narinfos (lookup-narinfos cache paths
- #:open-connection open-connection))
+ #:open-connection open-connection
+ #:make-progress-reporter
+ make-progress-reporter))
(definite (map narinfo-path (filter authorized? narinfos)))
(missing (lset-difference string=? paths definite))) ;XXX: perf
(loop rest missing
--
2.30.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [bug#45146] [PATCH 2/2] weather: Call lookup-narinfos with a custom progress reporter.
2021-02-24 20:34 ` [bug#45146] [PATCH 1/2] guix: substitutes: Make progress reporting configurable Christopher Baines
@ 2021-02-24 20:34 ` Christopher Baines
0 siblings, 0 replies; 7+ messages in thread
From: Christopher Baines @ 2021-02-24 20:34 UTC (permalink / raw)
To: 45146
This means there's a useful progress bar when running guix weather.
* guix/scripts/weather.scm (report-server-coverage): Pass
#:make-progress-reporter to lookup-narinfos.
---
guix/scripts/weather.scm | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/guix/scripts/weather.scm b/guix/scripts/weather.scm
index 9e94bff5a3..26ec543211 100644
--- a/guix/scripts/weather.scm
+++ b/guix/scripts/weather.scm
@@ -181,7 +181,11 @@ Return the coverage ratio, an exact number between 0 and 1."
(format #t (G_ "looking for ~h store items on ~a...~%")
(length items) server)
- (let/time ((time narinfos (lookup-narinfos server items)))
+ (let/time ((time narinfos (lookup-narinfos
+ server items
+ #:make-progress-reporter
+ (lambda* (total #:key url #:allow-other-keys)
+ (progress-reporter/bar total)))))
(format #t "~a~%" server)
(let ((obtained (length narinfos))
(requested (length items))
--
2.30.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [bug#45146] [PATCH] scripts: substitute: Improve fetch-narinfos progress reporting.
2020-12-24 17:26 ` Christopher Baines
@ 2021-02-24 20:44 ` Christopher Baines
2021-03-09 20:29 ` bug#45146: " Christopher Baines
0 siblings, 1 reply; 7+ messages in thread
From: Christopher Baines @ 2021-02-24 20:44 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: 45146
[-- Attachment #1: Type: text/plain, Size: 2073 bytes --]
Christopher Baines <mail@cbaines.net> writes:
> Ludovic Courtès <ludo@gnu.org> writes:
>
>> Christopher Baines <mail@cbaines.net> skribis:
>>
>>> At least in guix weather, these changes make the progress bar actually appear.
>>>
>>> * guix/scripts/substitute.scm (fetch-narinfos): Use (guix progress) for
>>> progress reporting.
>>
>> Cool. I noticed that something was wrong with ‘guix weather’, but I
>> suspected it had to do with the order in which the erase-line sequence
>> and \r are sent.
>>
>>> - (lambda ()
>>> - (display "\r\x1b[K" (current-error-port)) ;erase current line
>>> - (force-output (current-error-port))
>>> - (format (current-error-port)
>>> - (G_ "updating substitutes from '~a'... ~5,1f%")
>>> - url (* 100. (/ done total)))
>>> - (set! done (+ 1 done)))))
>>> + (define fetch-narinfos-progress-reporter
>>> + (progress-reporter/bar (length paths)))
>>
>> The problem here is that we’d see a progress bar without knowing what it
>> represents.
>>
>> Besides, currently output from ‘guix substitute’ is printed as is by
>> client commands, regardless of whether stdout is a tty. The problem
>> already exists but it would become a bit more visible as logs get filled
>> with progress bars.
>
> Maybe it's best to circle back to fixing guix weather after trying to
> restructure some of the guix substitute code.
>
> I've made an initial attempt at moving things around in [1]. If the
> underlying code can live in a module, and then the substitute, weather
> and challenge scripts use that code with whatever UI stuff they want,
> maybe that will allow for better addressing this weather specific issue.
>
> 1: https://issues.guix.info/45409
I've sent a couple of updated patches for this. They're not particularly
dependent on the above work to create the (guix substitutes) module, but
I based the commits on that.
These commits make more careful changes, the substitute script behaviour
should remain the same.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 987 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* bug#45146: [PATCH] scripts: substitute: Improve fetch-narinfos progress reporting.
2021-02-24 20:44 ` Christopher Baines
@ 2021-03-09 20:29 ` Christopher Baines
0 siblings, 0 replies; 7+ messages in thread
From: Christopher Baines @ 2021-03-09 20:29 UTC (permalink / raw)
To: 45146-done; +Cc: Ludovic Courtès
[-- Attachment #1: Type: text/plain, Size: 2271 bytes --]
Christopher Baines <mail@cbaines.net> writes:
> Christopher Baines <mail@cbaines.net> writes:
>
>> Ludovic Courtès <ludo@gnu.org> writes:
>>
>>> Christopher Baines <mail@cbaines.net> skribis:
>>>
>>>> At least in guix weather, these changes make the progress bar actually appear.
>>>>
>>>> * guix/scripts/substitute.scm (fetch-narinfos): Use (guix progress) for
>>>> progress reporting.
>>>
>>> Cool. I noticed that something was wrong with ‘guix weather’, but I
>>> suspected it had to do with the order in which the erase-line sequence
>>> and \r are sent.
>>>
>>>> - (lambda ()
>>>> - (display "\r\x1b[K" (current-error-port)) ;erase current line
>>>> - (force-output (current-error-port))
>>>> - (format (current-error-port)
>>>> - (G_ "updating substitutes from '~a'... ~5,1f%")
>>>> - url (* 100. (/ done total)))
>>>> - (set! done (+ 1 done)))))
>>>> + (define fetch-narinfos-progress-reporter
>>>> + (progress-reporter/bar (length paths)))
>>>
>>> The problem here is that we’d see a progress bar without knowing what it
>>> represents.
>>>
>>> Besides, currently output from ‘guix substitute’ is printed as is by
>>> client commands, regardless of whether stdout is a tty. The problem
>>> already exists but it would become a bit more visible as logs get filled
>>> with progress bars.
>>
>> Maybe it's best to circle back to fixing guix weather after trying to
>> restructure some of the guix substitute code.
>>
>> I've made an initial attempt at moving things around in [1]. If the
>> underlying code can live in a module, and then the substitute, weather
>> and challenge scripts use that code with whatever UI stuff they want,
>> maybe that will allow for better addressing this weather specific issue.
>>
>> 1: https://issues.guix.info/45409
>
> I've sent a couple of updated patches for this. They're not particularly
> dependent on the above work to create the (guix substitutes) module, but
> I based the commits on that.
>
> These commits make more careful changes, the substitute script behaviour
> should remain the same.
I've gone ahead and pushed these patches now as
f5ffb3bd9cd59cfff5b4625d6d65e8d116d0a25b.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 987 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-03-09 20:57 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-12-09 18:57 [bug#45146] [PATCH] scripts: substitute: Improve fetch-narinfos progress reporting Christopher Baines
2020-12-11 18:01 ` Ludovic Courtès
2020-12-24 17:26 ` Christopher Baines
2021-02-24 20:44 ` Christopher Baines
2021-03-09 20:29 ` bug#45146: " Christopher Baines
2021-02-24 20:34 ` [bug#45146] [PATCH 1/2] guix: substitutes: Make progress reporting configurable Christopher Baines
2021-02-24 20:34 ` [bug#45146] [PATCH 2/2] weather: Call lookup-narinfos with a custom progress reporter Christopher Baines
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.