diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-09-03 23:37:33 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-09-04 00:13:05 +0200 |
commit | 9d2f48df024fab5b99f1243cdf912a926c0e1e3d (patch) | |
tree | daa1ceec81a6625917219ba4d7cefa7b70f3960e /guix/scripts/publish.scm | |
parent | 6fc92598ac7f76568545f4218173b529a3df9fdc (diff) | |
download | gnu-guix-9d2f48df024fab5b99f1243cdf912a926c0e1e3d.tar gnu-guix-9d2f48df024fab5b99f1243cdf912a926c0e1e3d.tar.gz |
publish: Gracefully handle the lack of a deriver.
* guix/scripts/publish.scm (narinfo-string): Catch 'system-error' around
'load-derivation' call; return BASE-INFO upon ENOENT. This allows us
to return the narinfo even if DERIVER is missing. Before that, the
exception would be uncaught, leading to 500 Internal Error on the
client side.
Diffstat (limited to 'guix/scripts/publish.scm')
-rw-r--r-- | guix/scripts/publish.scm | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm index e3bcac8047..cc96355947 100644 --- a/guix/scripts/publish.scm +++ b/guix/scripts/publish.scm @@ -151,7 +151,7 @@ PATH-INFO. The narinfo is signed with KEY." (references (string-join (map basename (path-info-references path-info)) " ")) - (deriver (path-info-deriver path-info)) + (deriver (path-info-deriver path-info)) (base-info (format #f "StorePath: ~a URL: ~a @@ -162,12 +162,21 @@ References: ~a~%" store-path url hash size references)) ;; Do not render a "Deriver" or "System" line if we are rendering ;; info for a derivation. - (info (if (string-null? deriver) - base-info - (let ((drv (load-derivation deriver))) - (format #f "~aSystem: ~a~%Deriver: ~a~%" - base-info (derivation-system drv) - (basename deriver))))) + (info (if (string-null? deriver) + base-info + (catch 'system-error + (lambda () + (let ((drv (load-derivation deriver))) + (format #f "~aSystem: ~a~%Deriver: ~a~%" + base-info (derivation-system drv) + (basename deriver)))) + (lambda args + ;; DERIVER might be missing, but that's fine: + ;; it's only used for <substitutable> where it's + ;; optional. 'System' is currently unused. + (if (= ENOENT (system-error-errno args)) + base-info + (apply throw args)))))) (signature (base64-encode-string (canonical-sexp->string (signed-string info))))) (format #f "~aSignature: 1;~a;~a~%" info (gethostname) signature))) |