diff options
author | Marius Bakke <mbakke@fastmail.com> | 2018-07-28 18:34:59 +0200 |
---|---|---|
committer | Marius Bakke <mbakke@fastmail.com> | 2018-07-28 18:34:59 +0200 |
commit | 1af575f04df6cfb6e5e3f3273271383b6ee355a8 (patch) | |
tree | 0f1dfaed352dcdb9c827ed32db267bc7ed3d8203 /guix/store/deduplication.scm | |
parent | 3b6f8a45d725dd7592634a34e8ffbc14a3bd31cc (diff) | |
parent | 48d7ac175f69fea587eaa0358eddb5c76205e8ad (diff) | |
download | guix-patches-1af575f04df6cfb6e5e3f3273271383b6ee355a8.tar guix-patches-1af575f04df6cfb6e5e3f3273271383b6ee355a8.tar.gz |
Merge branch 'master' into staging
Diffstat (limited to 'guix/store/deduplication.scm')
-rw-r--r-- | guix/store/deduplication.scm | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/guix/store/deduplication.scm b/guix/store/deduplication.scm index 6ff4a50de5..8c19d7309e 100644 --- a/guix/store/deduplication.scm +++ b/guix/store/deduplication.scm @@ -31,37 +31,39 @@ #:export (nar-sha256 deduplicate)) -;; Would it be better to just make WRITE-FILE give size as well? I question -;; the general utility of this approach. +;; XXX: This port is used as a workaround on Guile <= 2.2.4 where +;; 'port-position' throws to 'out-of-range' when the offset is great than or +;; equal to 2^32: <https://bugs.gnu.org/32161>. (define (counting-wrapper-port output-port) - "Some custom ports don't implement GET-POSITION at all. But if we want to -figure out how many bytes are being written, we will want to use that. So this -makes a wrapper around a port which implements GET-POSITION." + "Return two values: an output port that wraps OUTPUT-PORT, and a thunk to +retrieve the number of bytes written to OUTPUT-PORT." (let ((byte-count 0)) - (make-custom-binary-output-port "counting-wrapper" - (lambda (bytes offset count) - (set! byte-count - (+ byte-count count)) - (put-bytevector output-port bytes - offset count) - count) - (lambda () - byte-count) - #f - (lambda () - (close-port output-port))))) + (values (make-custom-binary-output-port "counting-wrapper" + (lambda (bytes offset count) + (put-bytevector output-port bytes + offset count) + (set! byte-count + (+ byte-count count)) + count) + (lambda () + byte-count) + #f + (lambda () + (close-port output-port))) + (lambda () + byte-count)))) (define (nar-sha256 file) "Gives the sha256 hash of a file and the size of the file in nar form." - (let-values (((port get-hash) (open-sha256-port))) - (let ((wrapper (counting-wrapper-port port))) - (write-file file wrapper) - (force-output wrapper) - (force-output port) - (let ((hash (get-hash)) - (size (port-position wrapper))) - (close-port wrapper) - (values hash size))))) + (let*-values (((port get-hash) (open-sha256-port)) + ((wrapper get-size) (counting-wrapper-port port))) + (write-file file wrapper) + (force-output wrapper) + (force-output port) + (let ((hash (get-hash)) + (size (get-size))) + (close-port wrapper) + (values hash size)))) (define (tempname-in directory) "Gives an unused temporary name under DIRECTORY. Not guaranteed to still be |