tvl-depot/users/Profpatsch/atomically-write.nix
Profpatsch 28bed07694 feat(users/Profpatsch): add atomically-write
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>
2021-11-13 00:57:28 +00:00

28 lines
711 B
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ 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