2021-08-01 18:41:18 +02:00
|
|
|
|
{ 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"
|
|
|
|
|
'';
|
|
|
|
|
|
2022-01-30 17:06:58 +01:00
|
|
|
|
in
|
|
|
|
|
atomically-write
|