3f54dfa475
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.
80 lines
1.8 KiB
Bash
Executable file
80 lines
1.8 KiB
Bash
Executable file
#! /bin/sh -e
|
|
|
|
cvsRoot=$1
|
|
module=$2
|
|
tag=$3
|
|
expHash=$4
|
|
|
|
hashType=$NIX_HASH_ALGO
|
|
if test -z "$hashType"; then
|
|
hashType=sha256
|
|
fi
|
|
|
|
if test -z "$cvsRoot"; then
|
|
echo "syntax: nix-prefetch-cvs CVSROOT MODULE [TAG [HASH]]" >&2
|
|
exit 1
|
|
elif test -z "$module"; then
|
|
echo "syntax: nix-prefetch-cvs CVSROOT MODULE [TAG [HASH]]" >&2
|
|
exit 1
|
|
fi
|
|
|
|
|
|
mkTempDir() {
|
|
tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/nix-prefetch-cvs-XXXXXXXX")"
|
|
trap removeTempDir EXIT
|
|
}
|
|
|
|
removeTempDir() {
|
|
rm -rf "$tmpPath"
|
|
}
|
|
|
|
|
|
# If the hash was given, a file with that hash may already be in the
|
|
# store.
|
|
if test -n "$expHash"; then
|
|
finalPath=$(nix-store --print-fixed-path --recursive "$hashType" "$expHash" cvs-export)
|
|
if ! nix-store --check-validity "$finalPath" 2> /dev/null; then
|
|
finalPath=
|
|
fi
|
|
hash=$expHash
|
|
fi
|
|
|
|
|
|
# If we don't know the hash or a path with that hash doesn't exist,
|
|
# download the file and add it to the store.
|
|
if test -z "$finalPath"; then
|
|
|
|
mkTempDir
|
|
tmpFile=$tmpPath/cvs-export
|
|
#mkdir $tmpPath
|
|
|
|
# Perform the checkout.
|
|
if test -z "$tag"; then
|
|
args=(-D "now")
|
|
elif test "$USE_DATE" = "1"; then
|
|
args=(-D "$tag")
|
|
else
|
|
args=(-r "$tag")
|
|
fi
|
|
(cd "$tmpPath" && cvs -f -z0 -d $cvsRoot export "${args[*]}" -d cvs-export $module >&2)
|
|
|
|
# Compute the hash.
|
|
hash=$(nix-hash --type $hashType $hashFormat $tmpFile)
|
|
if ! test -n "$QUIET"; then echo "hash is $hash" >&2; fi
|
|
|
|
# Add the downloaded file to the Nix store.
|
|
finalPath=$(nix-store --add-fixed --recursive "$hashType" $tmpFile)
|
|
|
|
if test -n "$expHash" -a "$expHash" != "$hash"; then
|
|
echo "hash mismatch for CVS root \`$cvsRoot'"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if ! test -n "$QUIET"; then echo "path is $finalPath" >&2; fi
|
|
|
|
echo $hash
|
|
|
|
if test -n "$PRINT_PATH"; then
|
|
echo $finalPath
|
|
fi
|