diff options
author | Profpatsch <mail@profpatsch.de> | 2021-08-01T16·41+0200 |
---|---|---|
committer | Profpatsch <mail@profpatsch.de> | 2021-11-13T00·57+0000 |
commit | 28bed07694d16685ecf8d2e179222b3d4920611d (patch) | |
tree | 8007f1e560a7e370c01933739d7c6722be9bb3be /users/Profpatsch | |
parent | 1fbb960acf2c8520a5099486ecef67049fb9b13e (diff) |
feat(users/Profpatsch): add atomically-write r/3039
A little shell script to atomically write stdout to a file. Change-Id: Icca58909c9ad3f92d69af2f5e20c08d69878a77c Reviewed-on: https://cl.tvl.fyi/c/depot/+/3264 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
Diffstat (limited to 'users/Profpatsch')
-rw-r--r-- | users/Profpatsch/atomically-write.nix | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/users/Profpatsch/atomically-write.nix b/users/Profpatsch/atomically-write.nix new file mode 100644 index 000000000000..d5039d3e46b9 --- /dev/null +++ b/users/Profpatsch/atomically-write.nix @@ -0,0 +1,28 @@ +{ depot, pkgs, ... }: +# Atomically write a file (just `>` redirection in bash +# empties a file even if the command crashes). +# +# Maybe there is an existing tool for that? +# But it’s easy enough to implement. +# +# Example: +# atomically-write +# ./to +# echo "foo" +# +# will atomically write the string "foo" into ./to +let + atomically-write = pkgs.writers.writeDash "atomically-write" '' + set -e + to=$1 + shift + # assumes that the tempfile is on the same file system, (or in memory) + # for the `mv` at the end to be more-or-less atomic. + tmp=$(${pkgs.coreutils}/bin/mktemp -d) + trap 'rm -r "$tmp"' EXIT + "$@" \ + > "$tmp/out" + mv "$tmp/out" "$to" + ''; + +in atomically-write |