substitute: Gracefully handle invalid store file names.

Before, something like:

  echo have /gnu/foo | ./test-env guix substitute --query

would lead to an ugly backtrace.

* guix/scripts/substitute.scm (narinfo-cache-file): Call 'leave' when
'store-hash-part' returns #f.
This commit is contained in:
Ludovic Courtès 2016-05-20 17:18:58 +02:00
parent a773c3142d
commit 30d4bc0434
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -440,9 +440,15 @@ (define (obsolete? date now ttl)
(define (narinfo-cache-file cache-url path) (define (narinfo-cache-file cache-url path)
"Return the name of the local file that contains an entry for PATH. The "Return the name of the local file that contains an entry for PATH. The
entry is stored in a sub-directory specific to CACHE-URL." entry is stored in a sub-directory specific to CACHE-URL."
(string-append %narinfo-cache-directory "/" ;; The daemon does not sanitize its input, so PATH could be something like
(bytevector->base32-string (sha256 (string->utf8 cache-url))) ;; "/gnu/store/foo". Gracefully handle that.
"/" (store-path-hash-part path))) (match (store-path-hash-part path)
(#f
(leave (_ "'~a' does not name a store item~%") path))
((? string? hash-part)
(string-append %narinfo-cache-directory "/"
(bytevector->base32-string (sha256 (string->utf8 cache-url)))
"/" hash-part))))
(define (cached-narinfo cache-url path) (define (cached-narinfo cache-url path)
"Check locally if we have valid info about PATH coming from CACHE-URL. "Check locally if we have valid info about PATH coming from CACHE-URL.