depot/third_party/tvl/users/Profpatsch/atomically-write.nix

30 lines
711 B
Nix
Raw Normal View History

{ 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 its 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