diff options
author | Ludovic Courtès <ludo@gnu.org> | 2025-04-08 18:49:25 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2025-04-14 17:31:49 +0200 |
commit | 5525315092cd9361c52113bb2eb54126d7b13aa5 (patch) | |
tree | 4d3d31375263b31cea54b544ceaad16acd3895ef | |
parent | c44495bb105c0c0d6f931f48046e702b56643593 (diff) | |
download | guix-5525315092cd9361c52113bb2eb54126d7b13aa5.tar.gz guix-5525315092cd9361c52113bb2eb54126d7b13aa5.zip |
utils: Add #:sync? parameter to ‘with-atomic-file-output’.
* guix/utils.scm (with-atomic-file-output): Add #:sync? and honor it.
Add ‘force-output’ call.
Change-Id: I2479778ae55360c0fab3389ac9249045a27b3568
-rw-r--r-- | guix/utils.scm | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/guix/utils.scm b/guix/utils.scm index c7c23d9d5b..7ae98096c2 100644 --- a/guix/utils.scm +++ b/guix/utils.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012-2022, 2024 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2012-2022, 2024-2025 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2014, 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net> @@ -1057,16 +1057,22 @@ delete it when leaving the dynamic extent of this call." (lambda () (false-if-exception (delete-file-recursively tmp-dir)))))) -(define (with-atomic-file-output file proc) +(define* (with-atomic-file-output file proc #:key (sync? #t)) "Call PROC with an output port for the file that is going to replace FILE. Upon success, FILE is atomically replaced by what has been written to the -output port, and PROC's result is returned." +output port, and PROC's result is returned. + +When SYNC? is true, call 'fdatasync' on the temporary file before renaming it +to FILE; set it to #false for caches and temporary files to improve +performance." (let* ((template (string-append file ".XXXXXX")) (out (mkstemp! template))) (with-throw-handler #t (lambda () (let ((result (proc out))) - (fdatasync out) + (when sync? + (force-output out) + (fdatasync out)) (close-port out) (rename-file template file) result)) |