nixpkgs/pkgs/development/tools/build-managers/bazel/shebang-test.nix
2023-12-13 22:48:25 +01:00

60 lines
1.6 KiB
Nix

{
bazel
, bazelTest
, extracted
, ripgrep
, runLocal
, unzip
, ...
}:
# Tests that all shebangs are patched appropriately.
# #!/usr/bin/... should be replaced by Nix store references.
# #!.../bin/env python should be replaced by Nix store reference to the python interpreter.
let
workspaceDir = runLocal "our_workspace" {} "mkdir $out";
testBazel = bazelTest {
name = "bazel-test-shebangs";
inherit workspaceDir;
bazelPkg = bazel;
bazelScript = ''
set -ueo pipefail
FAIL=
check_shebangs() {
local dir="$1"
{ rg -e '#!/usr/bin' -e '#![^[:space:]]*/bin/env' $dir -e && echo && FAIL=1; } || true
}
extract() {
local dir="$1"
find "$dir" -type f '(' -name '*.zip' -or -name '*.jar' ')' -print0 \
| while IFS="" read -r -d "" zip ; do
echo "Extracting $zip"
local unzipped="$zip-UNPACKED"
mkdir -p "$unzipped"
unzip -qq $zip -d "$unzipped"
extract "$unzipped"
rm -rf "$unzipped" "$zip" || true
done
check_shebangs "$dir"
}
mkdir install_root
cp --no-preserve=all -r ${extracted bazel}/install/*/* install_root/
extract ./install_root
if [[ $FAIL = 1 ]]; then
echo "Found files in the bazel distribution with illegal shebangs." >&2
echo "Replace those by explicit Nix store paths." >&2
echo "Python scripts should not use \`bin/env python' but the Python interpreter's store path." >&2
exit 1
fi
'';
buildInputs = [ unzip ripgrep ];
};
in testBazel