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.

+7 -13
+1 -1
maintainers/scripts/rebuild-amount.sh
··· 35 cleanup() { 36 rm -rf "${toRemove[@]}" 37 } 38 - trap cleanup EXIT SIGINT SIGQUIT ERR 39 40 MKTEMP='mktemp --tmpdir nix-rebuild-amount-XXXXXXXX' 41
··· 35 cleanup() { 36 rm -rf "${toRemove[@]}" 37 } 38 + trap cleanup EXIT 39 40 MKTEMP='mktemp --tmpdir nix-rebuild-amount-XXXXXXXX' 41
+1 -3
nixos/modules/services/backup/borgbackup.nix
··· 23 on_exit() 24 { 25 exitStatus=$? 26 - # Reset the EXIT handler, or else we're called again on 'exit' below 27 - trap - EXIT 28 ${cfg.postHook} 29 exit $exitStatus 30 } 31 - trap 'on_exit' INT TERM QUIT EXIT 32 33 archiveName="${if cfg.archiveBaseName == null then "" else cfg.archiveBaseName + "-"}$(date ${cfg.dateFormat})" 34 archiveSuffix="${optionalString cfg.appendFailedSuffix ".failed"}"
··· 23 on_exit() 24 { 25 exitStatus=$? 26 ${cfg.postHook} 27 exit $exitStatus 28 } 29 + trap on_exit EXIT 30 31 archiveName="${if cfg.archiveBaseName == null then "" else cfg.archiveBaseName + "-"}$(date ${cfg.dateFormat})" 32 archiveSuffix="${optionalString cfg.appendFailedSuffix ".failed"}"
+1 -1
nixos/modules/services/web-apps/keycloak.nix
··· 569 shopt -s inherit_errexit 570 571 create_role="$(mktemp)" 572 - trap 'rm -f "$create_role"' ERR EXIT 573 574 db_password="$(<"$CREDENTIALS_DIRECTORY/db_password")" 575 echo "CREATE ROLE keycloak WITH LOGIN PASSWORD '$db_password' CREATEDB" > "$create_role"
··· 569 shopt -s inherit_errexit 570 571 create_role="$(mktemp)" 572 + trap 'rm -f "$create_role"' EXIT 573 574 db_password="$(<"$CREDENTIALS_DIRECTORY/db_password")" 575 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
··· 39 function rm_tmpdir() { 40 1>&2 printf "rm -rf %q\n" "$tmpDir" 41 rm -rf "$tmpDir" 42 - trap - INT TERM HUP EXIT 43 } 44 function make_trapped_tmpdir() { 45 tmpDir=$(mktemp -d) 46 - trap rm_tmpdir INT TERM HUP EXIT 47 } 48 49 1>&2 echo
··· 39 function rm_tmpdir() { 40 1>&2 printf "rm -rf %q\n" "$tmpDir" 41 rm -rf "$tmpDir" 42 } 43 function make_trapped_tmpdir() { 44 tmpDir=$(mktemp -d) 45 + trap rm_tmpdir EXIT 46 } 47 48 1>&2 echo
+1 -2
pkgs/applications/editors/vscode/extensions/cpptools/update_helper.sh
··· 45 46 function rm_tmpdir() { 47 rm -rf "$tmpDir" 48 - trap - INT TERM HUP EXIT 49 } 50 function make_trapped_tmpdir() { 51 tmpDir=$(mktemp -d) 52 - trap rm_tmpdir INT TERM HUP EXIT 53 } 54 55 echo
··· 45 46 function rm_tmpdir() { 47 rm -rf "$tmpDir" 48 } 49 function make_trapped_tmpdir() { 50 tmpDir=$(mktemp -d) 51 + trap rm_tmpdir EXIT 52 } 53 54 echo
+2 -4
pkgs/build-support/fetchcvs/nix-prefetch-cvs
··· 21 22 mkTempDir() { 23 tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/nix-prefetch-cvs-XXXXXXXX")" 24 - trap removeTempDir EXIT SIGINT SIGQUIT 25 } 26 27 removeTempDir() { 28 - if test -n "$tmpPath"; then 29 - rm -rf "$tmpPath" || true 30 - fi 31 } 32 33
··· 21 22 mkTempDir() { 23 tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/nix-prefetch-cvs-XXXXXXXX")" 24 + trap removeTempDir EXIT 25 } 26 27 removeTempDir() { 28 + rm -rf "$tmpPath" 29 } 30 31