diff options
author | Ludovic Courtès <ludo@gnu.org> | 2013-05-15 23:40:09 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2013-05-15 23:40:09 +0200 |
commit | 101d9f3fd43b436d5dc7ef13e644c7fbbc7f62d5 (patch) | |
tree | e3a4eed4c2e50b932d333fa5344d343125c42cfd /guix/utils.scm | |
parent | 3d6b71e87eca505262f9756644d72e545c7e48f8 (diff) |
substitute-binary: Pass `filtered-port' an unbuffered port.
This fixes a bug whereby `read-response' would read more than just the
response, with the extra data going into the port's buffer; the
"bzip2 -dc" process spawned by `filtered-port' would not see the those
buffered data, which are definitely lost, and would bail out with
"bzip2: (stdin) is not a bzip2 file."
* guix/utils.scm (filtered-port): Document that INPUT must be
unbuffered.
* guix/web.scm (http-fetch): Add `buffered?' parameter. Call
`open-socket-for-uri' explicitly, and call `setvbuf' when BUFFERED? is
false. Pass the port to `http-get'. Close it upon 301/302.
* guix/scripts/substitute-binary.scm (fetch): Add `buffered?'
parameter. Pass it to `http-fetch'; honor it for `file' URIs.
(guix-substitute-binary): Call `fetch' with #:buffered? #f for port RAW.
* tests/utils.scm ("filtered-port, file"): Open FILE as unbuffered.
Diffstat (limited to 'guix/utils.scm')
-rw-r--r-- | guix/utils.scm | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/guix/utils.scm b/guix/utils.scm index c2d2808f76..25a392e6a8 100644 --- a/guix/utils.scm +++ b/guix/utils.scm @@ -163,7 +163,8 @@ evaluate to a simple datum." (define (filtered-port command input) "Return an input port where data drained from INPUT is filtered through COMMAND (a list). In addition, return a list of PIDs that the caller must -wait." +wait. When INPUT is a file port, it must be unbuffered; otherwise, any +buffered data is lost." (let loop ((input input) (pids '())) (if (file-port? input) |