summary refs log tree commit diff
path: root/pkgs/development/tools/build-managers/bazel/shebang-test.nix
blob: fd94f97a76592d5931a1c39699a6e377c41c6ca5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
  bazel
, bazelTest
, distDir
, extracted
, 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"
        { grep -Re '#!/usr/bin' $dir && FAIL=1; } || true
        { grep -Re '#![^[:space:]]*/bin/env' $dir && FAIL=1; } || true
      }
      BAZEL_EXTRACTED=${extracted bazel}/install
      check_shebangs $BAZEL_EXTRACTED
      while IFS= read -r -d "" zip; do
        unzipped="./$zip/UNPACKED"
        mkdir -p "$unzipped"
        unzip -qq $zip -d "$unzipped"
        check_shebangs "$unzipped"
        rm -rf unzipped
      done < <(find $BAZEL_EXTRACTED -type f -name '*.zip' -or -name '*.jar' -print0)
      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 ];
  };

in testBazel