summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-09-03 23:37:33 +0200
committerLudovic Courtès <ludo@gnu.org>2015-09-04 00:13:05 +0200
commit9d2f48df024fab5b99f1243cdf912a926c0e1e3d (patch)
treedaa1ceec81a6625917219ba4d7cefa7b70f3960e
parent6fc92598ac7f76568545f4218173b529a3df9fdc (diff)
downloadguix-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.
-rw-r--r--guix/scripts/publish.scm23
-rwxr-xr-xguix/scripts/substitute.scm2
2 files changed, 17 insertions, 8 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)))
diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm
index 95aae2a372..e908bc997e 100755
--- a/guix/scripts/substitute.scm
+++ b/guix/scripts/substitute.scm
@@ -703,7 +703,7 @@ Internal tool to substitute a pre-built binary to a local build.\n"))
 ;;;
 
 (define (display-narinfo-data narinfo)
-  "Write to the current output port the contents of NARINFO is the format
+  "Write to the current output port the contents of NARINFO in the format
 expected by the daemon."
   (format #t "~a\n~a\n~a\n"
           (narinfo-path narinfo)