[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#51307] [PATCH 1/2] scripts: hash: Improve error handling.
From: |
zimoun |
Subject: |
[bug#51307] [PATCH 1/2] scripts: hash: Improve error handling. |
Date: |
Wed, 20 Oct 2021 18:54:34 +0200 |
* guix/scripts/hash.scm (guix-hash): Allow several files.
[directory?]: New procedure.
[file-hash]: Catch system-error.
[hash-to-display]: New procedure.
---
guix/scripts/hash.scm | 56 +++++++++++++++++++++++++++----------------
1 file changed, 36 insertions(+), 20 deletions(-)
diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm
index b8622373cc..f3363549d3 100644
--- a/guix/scripts/hash.scm
+++ b/guix/scripts/hash.scm
@@ -3,6 +3,7 @@
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2018 Tim Gesthuizen <tim.gesthuizen@yahoo.de>
+;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -135,6 +136,11 @@ (define (vcs-file? file stat)
(else
#f)))
+ (define (directory? file)
+ (case (stat:type (stat file))
+ ((directory) #t)
+ (else #f)))
+
(let* ((opts (parse-options))
(args (filter-map (match-lambda
(('argument . value)
@@ -149,27 +155,37 @@ (define (vcs-file? file stat)
(define (file-hash file)
;; Compute the hash of FILE.
;; Catch and gracefully report possible '&nar-error' conditions.
- (with-error-handling
- (if (assoc-ref opts 'recursive?)
+ (if (and (assoc-ref opts 'recursive?)
+ (directory? file))
+ (with-error-handling
(let-values (((port get-hash)
(open-hash-port (assoc-ref opts 'hash-algorithm))))
(write-file file port #:select? select?)
(force-output port)
- (get-hash))
- (match file
- ("-" (port-hash (assoc-ref opts 'hash-algorithm)
- (current-input-port)))
- (_ (call-with-input-file file
- (cute port-hash (assoc-ref opts 'hash-algorithm)
- <>)))))))
-
- (match args
- ((file)
- (catch 'system-error
- (lambda ()
- (format #t "~a~%" (fmt (file-hash file))))
- (lambda args
- (leave (G_ "~a~%")
- (strerror (system-error-errno args))))))
- (x
- (leave (G_ "wrong number of arguments~%"))))))
+ (get-hash)))
+ (catch 'system-error
+ (lambda _
+ (call-with-input-file file
+ (cute port-hash (assoc-ref opts 'hash-algorithm)
+ <>)))
+ (lambda args
+ (when (directory? file)
+ (display-hint (G_ "Try @option{--recursive}.")))
+ (leave (G_ "~a ~a~%")
+ file
+ (strerror (system-error-errno args)))))))
+
+ (define (hash-to-display thing)
+ (match thing
+ ((? file-exists? file)
+ (fmt (file-hash file)))
+ ("-" (with-error-handling
+ (fmt (port-hash (assoc-ref opts 'hash-algorithm)
+ (current-input-port)))))
+ (x
+ (leave (G_ "wrong argument~%")))))
+
+ (for-each
+ (lambda (arg)
+ (format #t "~a~%" (hash-to-display arg)))
+ args)))
--
2.32.0
[bug#51307] [PATCH 0/2] guix hash: eases conversion, Ludovic Courtès, 2021/10/30