store: Raise error conditions upon protocol errors.

* guix/store.scm (&nix-error, &nix-protocol-error): New SRFI-35
  condition types.
  (process-stderr): Raise an error condition upon protocol errors
  instead of returning to the caller.  This allows the connection to be
  reused for further interactions.
This commit is contained in:
Ludovic Courtès 2012-06-01 23:29:55 +02:00
parent e3deeebb27
commit e87088c9d5
1 changed files with 21 additions and 4 deletions

View File

@ -22,6 +22,8 @@
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-9) #:use-module (srfi srfi-9)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (ice-9 rdelim) #:use-module (ice-9 rdelim)
#:export (nix-server? #:export (nix-server?
@ -29,6 +31,11 @@
nix-server-minor-version nix-server-minor-version
nix-server-socket nix-server-socket
&nix-error nix-error?
&nix-protocol-error nix-protocol-error?
nix-protocol-error-message
nix-protocol-error-status
open-connection open-connection
set-build-options set-build-options
add-text-to-store add-text-to-store
@ -218,6 +225,14 @@
(major nix-server-major-version) (major nix-server-major-version)
(minor nix-server-minor-version)) (minor nix-server-minor-version))
(define-condition-type &nix-error &error
nix-error?)
(define-condition-type &nix-protocol-error &nix-error
nix-protocol-error?
(message nix-protocol-error-message)
(status nix-protocol-error-status))
(define* (open-connection #:optional (file %default-socket-path)) (define* (open-connection #:optional (file %default-socket-path))
(let ((s (with-fluids ((%default-port-encoding #f)) (let ((s (with-fluids ((%default-port-encoding #f))
;; This trick allows use of the `scm_c_read' optimization. ;; This trick allows use of the `scm_c_read' optimization.
@ -265,13 +280,15 @@
(status (if (>= (nix-server-minor-version server) 8) (status (if (>= (nix-server-minor-version server) 8)
(read-int p) (read-int p)
1))) 1)))
(format (current-error-port) "error: ~a (status: ~a)~%" (raise (condition (&nix-protocol-error
error status) (message error)
error)) (status status))))))
((= k %stderr-last) ((= k %stderr-last)
#t) #t)
(else (else
(error "invalid standard error code" k))))) (raise (condition (&nix-protocol-error
(message "invalid error code")
(status k))))))))
(define* (set-build-options server (define* (set-build-options server
#:key keep-failed? keep-going? try-fallback? #:key keep-failed? keep-going? try-fallback?