mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 07:26:13 -05:00
substitute: Ensure backtraces go to file descriptor 4.
Fixes <https://bugs.gnu.org/46362>. Reported by Zhu Zihao <all_but_last@163.com>. Previously, backtraces due to uncaught exceptions would always to go file descriptor 2; the daemon would read it and error out with something like: error: got unexpected path `Backtrace:' from substituter This patch fixes that by ensuring backtraces are properly displayed on file descriptor 4. * guix/scripts/substitute.scm (with-redirected-error-port): New macro. (guix-substitute): Use 'with-redirected-error-port' instead of 'parameterize'.
This commit is contained in:
parent
e2572aa950
commit
ee3226e9d5
1 changed files with 20 additions and 8 deletions
|
@ -896,6 +896,24 @@ (define %error-to-file-descriptor-4?
|
|||
;; 'guix-daemon' expects.
|
||||
(make-parameter #t))
|
||||
|
||||
;; The daemon's agent code opens file descriptor 4 for us and this is where
|
||||
;; stderr should go.
|
||||
(define-syntax-rule (with-redirected-error-port exp ...)
|
||||
"Evaluate EXP... with the current error port redirected to file descriptor 4
|
||||
if needed, as expected by the daemon's agent."
|
||||
(let ((thunk (lambda () exp ...)))
|
||||
(if (%error-to-file-descriptor-4?)
|
||||
(parameterize ((current-error-port (fdopen 4 "wl")))
|
||||
;; Redirect diagnostics to file descriptor 4 as well.
|
||||
(guix-warning-port (current-error-port))
|
||||
|
||||
;; 'with-continuation-barrier' captures the initial value of
|
||||
;; 'current-error-port' to report backtraces in case of uncaught
|
||||
;; exceptions. Without it, backtraces would be printed to FD 2,
|
||||
;; thereby confusing the daemon.
|
||||
(with-continuation-barrier thunk))
|
||||
(thunk))))
|
||||
|
||||
(define-command (guix-substitute . args)
|
||||
(category internal)
|
||||
(synopsis "implement the build daemon's substituter protocol")
|
||||
|
@ -910,14 +928,7 @@ (define print-build-trace?
|
|||
(define deduplicate?
|
||||
(find-daemon-option "deduplicate"))
|
||||
|
||||
;; The daemon's agent code opens file descriptor 4 for us and this is where
|
||||
;; stderr should go.
|
||||
(parameterize ((current-error-port (if (%error-to-file-descriptor-4?)
|
||||
(fdopen 4 "wl")
|
||||
(current-error-port))))
|
||||
;; Redirect diagnostics to file descriptor 4 as well.
|
||||
(guix-warning-port (current-error-port))
|
||||
|
||||
(with-redirected-error-port
|
||||
(mkdir-p %narinfo-cache-directory)
|
||||
(maybe-remove-expired-cache-entries %narinfo-cache-directory
|
||||
cached-narinfo-files
|
||||
|
@ -982,6 +993,7 @@ (define deduplicate?
|
|||
|
||||
;;; Local Variables:
|
||||
;;; eval: (put 'with-timeout 'scheme-indent-function 1)
|
||||
;;; eval: (put 'with-redirected-error-port 'scheme-indent-function 0)
|
||||
;;; End:
|
||||
|
||||
;;; substitute.scm ends here
|
||||
|
|
Loading…
Reference in a new issue