treewide: fix bash exit handlers

Transform exit handlers of the form
trap cleanup EXIT [INT] [TERM] [QUIT] [HUP] [ERR]
(where cleanup is idempotent)
to
trap cleanup EXIT

This fixes a common bash antipattern.

Each of the above signals causes the script to exit. For each signal,
bash first handles the signal by running `cleanup` and then runs
`cleanup` again when handling EXIT.
(Exception: `vscode/*` prevents the second run of `cleanup` by removing
the trap in cleanup`).

Simplify the cleanup logic by just trapping exit, which is always run
when the script exits due to any of the above signals.

Note: In case of borgbackup, the exit handler is not idempotent, but just
trapping EXIT guarantees that it's only run once.

Changed files
+7 -13
maintainers
nixos
modules
services
backup
web-apps
pkgs
applications
editors
vscode
extensions
build-support
fetchcvs
+1 -1
maintainers/scripts/rebuild-amount.sh
···
cleanup() {
rm -rf "${toRemove[@]}"
}
-
trap cleanup EXIT SIGINT SIGQUIT ERR
MKTEMP='mktemp --tmpdir nix-rebuild-amount-XXXXXXXX'
···
cleanup() {
rm -rf "${toRemove[@]}"
}
+
trap cleanup EXIT
MKTEMP='mktemp --tmpdir nix-rebuild-amount-XXXXXXXX'
+1 -3
nixos/modules/services/backup/borgbackup.nix
···
on_exit()
{
exitStatus=$?
-
# Reset the EXIT handler, or else we're called again on 'exit' below
-
trap - EXIT
${cfg.postHook}
exit $exitStatus
}
-
trap 'on_exit' INT TERM QUIT EXIT
archiveName="${if cfg.archiveBaseName == null then "" else cfg.archiveBaseName + "-"}$(date ${cfg.dateFormat})"
archiveSuffix="${optionalString cfg.appendFailedSuffix ".failed"}"
···
on_exit()
{
exitStatus=$?
${cfg.postHook}
exit $exitStatus
}
+
trap on_exit EXIT
archiveName="${if cfg.archiveBaseName == null then "" else cfg.archiveBaseName + "-"}$(date ${cfg.dateFormat})"
archiveSuffix="${optionalString cfg.appendFailedSuffix ".failed"}"
+1 -1
nixos/modules/services/web-apps/keycloak.nix
···
shopt -s inherit_errexit
create_role="$(mktemp)"
-
trap 'rm -f "$create_role"' ERR EXIT
db_password="$(<"$CREDENTIALS_DIRECTORY/db_password")"
echo "CREATE ROLE keycloak WITH LOGIN PASSWORD '$db_password' CREATEDB" > "$create_role"
···
shopt -s inherit_errexit
create_role="$(mktemp)"
+
trap 'rm -f "$create_role"' EXIT
db_password="$(<"$CREDENTIALS_DIRECTORY/db_password")"
echo "CREATE ROLE keycloak WITH LOGIN PASSWORD '$db_password' CREATEDB" > "$create_role"
+1 -2
pkgs/applications/editors/vscode/extensions/_maintainers/update-bin-srcs-lib.sh
···
function rm_tmpdir() {
1>&2 printf "rm -rf %q\n" "$tmpDir"
rm -rf "$tmpDir"
-
trap - INT TERM HUP EXIT
}
function make_trapped_tmpdir() {
tmpDir=$(mktemp -d)
-
trap rm_tmpdir INT TERM HUP EXIT
}
1>&2 echo
···
function rm_tmpdir() {
1>&2 printf "rm -rf %q\n" "$tmpDir"
rm -rf "$tmpDir"
}
function make_trapped_tmpdir() {
tmpDir=$(mktemp -d)
+
trap rm_tmpdir EXIT
}
1>&2 echo
+1 -2
pkgs/applications/editors/vscode/extensions/cpptools/update_helper.sh
···
function rm_tmpdir() {
rm -rf "$tmpDir"
-
trap - INT TERM HUP EXIT
}
function make_trapped_tmpdir() {
tmpDir=$(mktemp -d)
-
trap rm_tmpdir INT TERM HUP EXIT
}
echo
···
function rm_tmpdir() {
rm -rf "$tmpDir"
}
function make_trapped_tmpdir() {
tmpDir=$(mktemp -d)
+
trap rm_tmpdir EXIT
}
echo
+2 -4
pkgs/build-support/fetchcvs/nix-prefetch-cvs
···
mkTempDir() {
tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/nix-prefetch-cvs-XXXXXXXX")"
-
trap removeTempDir EXIT SIGINT SIGQUIT
}
removeTempDir() {
-
if test -n "$tmpPath"; then
-
rm -rf "$tmpPath" || true
-
fi
}
···
mkTempDir() {
tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/nix-prefetch-cvs-XXXXXXXX")"
+
trap removeTempDir EXIT
}
removeTempDir() {
+
rm -rf "$tmpPath"
}