guix: substitute: Report the last progress in the child process.

Fixes <https://bugs.gnu.org/28756>.

* guix/utils.scm (filtered-port): Close the 'input' port for the current
process, and close it upon exit in the child process.
* guix/scripts/substitute.scm (progress-substitution): Display "\n\n" after
the reporter has finished.
This commit is contained in:
宋文武 2017-10-14 22:45:55 +08:00
parent bb4b9f7bf3
commit 5efa0e4d4f
No known key found for this signature in database
GPG Key ID: 26525665AE727D37
2 changed files with 9 additions and 4 deletions

View File

@ -956,19 +956,22 @@ DESTINATION as a nar file. Verify the substitute against ACL."
#:abbreviation nar-uri-abbreviation))) #:abbreviation nar-uri-abbreviation)))
(progress-report-port reporter raw))) (progress-report-port reporter raw)))
((input pids) ((input pids)
;; NOTE: This 'progress' port of current process will be
;; closed here, while the child process doing the
;; reporting will close it upon exit.
(decompressed-port (and=> (narinfo-compression narinfo) (decompressed-port (and=> (narinfo-compression narinfo)
string->symbol) string->symbol)
progress))) progress)))
;; Unpack the Nar at INPUT into DESTINATION. ;; Unpack the Nar at INPUT into DESTINATION.
(restore-file input destination) (restore-file input destination)
(close-port input) (close-port input)
(close-port progress)
;; Wait for the reporter to finish.
(every (compose zero? cdr waitpid) pids)
;; Skip a line after what 'progress-reporter/file' printed, and another ;; Skip a line after what 'progress-reporter/file' printed, and another
;; one to visually separate substitutions. ;; one to visually separate substitutions.
(display "\n\n" (current-error-port)) (display "\n\n" (current-error-port)))))
(every (compose zero? cdr waitpid) pids))))
;;; ;;;

View File

@ -153,9 +153,11 @@ buffered data is lost."
(close-port in) (close-port in)
(dump-port input out)) (dump-port input out))
(lambda () (lambda ()
(close-port input)
(false-if-exception (close out)) (false-if-exception (close out))
(primitive-_exit 0)))) (primitive-_exit 0))))
(child (child
(close-port input)
(close-port out) (close-port out)
(loop in (cons child pids))))))))) (loop in (cons child pids)))))))))