aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2025-04-08 18:49:25 +0200
committerLudovic Courtès <ludo@gnu.org>2025-04-14 17:31:49 +0200
commit5525315092cd9361c52113bb2eb54126d7b13aa5 (patch)
tree4d3d31375263b31cea54b544ceaad16acd3895ef
parentc44495bb105c0c0d6f931f48046e702b56643593 (diff)
downloadguix-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.scm14
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))