1
+ #! /usr/bin/env bash
2
+ # Both bazelisk and bazel's native wrapper scripts will attempt to use the well-known executable
3
+ # named "tools/bazel" to run Bazel. The path of the original executable is stored in BAZEL_REAL.
4
+ set -euo pipefail
5
+ shopt -s nullglob
6
+
7
+ DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " > /dev/null 2>&1 && pwd ) "
8
+
9
+ # Jump into nix-shell if BAZEL_REAL is set to a /nix/store path and we aren't
10
+ # inside our shell yet.
11
+ if [[ " ${BAZEL_REAL:- } " == /nix/store/* && -z " ${MONOGON_NIXOS:- } " ]]; then
12
+ echo " Detected Nix based bazel installation and we are not in a nix-shell, overriding to nix-shell." >&2
13
+ USE_NIX_SHELL=yes
14
+ fi
15
+
16
+ # If the wrapper is called directly we check if nix-shell is available
17
+ # to automagically switch into the nix-shell. Otherwise complain and
18
+ # exit.
19
+ if [[ -z " ${BAZEL_REAL:- } " ]]; then
20
+ if [[ -x $( command -v nix-shell) ]]; then
21
+ echo " BAZEL_REAL is not set and nix-shell is available, overriding to nix-shell" >&2
22
+ USE_NIX_SHELL=yes
23
+ else
24
+ echo " BAZEL_REAL is not set and nix-shell not available. Please check the setup guide." >&2
25
+ exit 1
26
+ fi
27
+ fi
28
+
29
+ if [[ -n " ${USE_NIX_SHELL:- } " ]]; then
30
+ # Jump to project root since bwrap hangs if we aren't there
31
+ cd " ${DIR} /../"
32
+
33
+ export COMMAND=" bazel $* "
34
+ export PWD=" $OLDPWD "
35
+ exec nix-shell
36
+ fi
37
+
38
+
39
+ prechecks () {
40
+ # Recommend using Bazelisk instead of Bazel's "bazel.sh" wrapper.
41
+ # Skip if we're inside the Nix shell (which uses a customized Bazel build).
42
+ if [[ -z " ${BAZELISK_SKIP_WRAPPER:- } " && -z " ${MONOGON_NIXOS:- } " ]]; then
43
+ echo " ############################################################" >&2
44
+ echo " # Please use Bazelisk to build NetMeta. Using Bazel #" >&2
45
+ echo " # directly may work, but is not recommended or supported. #" >&2
46
+ echo " ############################################################" >&2
47
+ fi
48
+ }
49
+
50
+ intellij_patch () {
51
+ # When IntelliJ's Bazel plugin uses //scripts/bin/bazel to either build targets
52
+ # or run syncs, it adds a --override_repository flag to the bazel command
53
+ # line that points @intellij_aspect into a path on the filesystem. This
54
+ # external repository contains a Bazel Aspect definition which Bazel
55
+ # executes to provide the IntelliJ Bazel plugin with information about the
56
+ # workspace / build targets / etc...
57
+ #
58
+ # We need to patch the aspect definition to fix a number of bugs
59
+ # to make it work with the Monogon monorepo.
60
+ # Find all IntelliJ installation/config directories.
61
+ local ij_home_paths=(" ${HOME} /.local/share/JetBrains/IntelliJIdea" * )
62
+ # Get the newest one, if any.
63
+ local ij_home=" "
64
+ if ! [[ ${# ij_home_paths[@]} -eq 0 ]]; then
65
+ # Reverse sort paths by name, with the first being the newest IntelliJ
66
+ # installation.
67
+ IFS=$' \n '
68
+ local sorted=($( sort -r <<< " ${ij_home_paths[*]}" ) )
69
+ unset IFS
70
+ ij_home=" ${sorted[0]} "
71
+ fi
72
+ # If we don't have or can't find ij_home, don't bother with attempting to patch anything.
73
+ if [[ -d " ${ij_home} " ]]; then
74
+ # aspect_path is the path to the aspect external repository that IntelliJ will
75
+ # inject into bazel via --override_repository.
76
+ local aspect_path=" ${ij_home} /ijwb/aspect"
77
+ # Our copy of it.
78
+ local patched_path=" ${ij_home} /ijwb/aspect-monogon"
79
+ # Checksum of the patch that was used to create patched_path.
80
+ local checksum_file=" ${patched_path} /checksum"
81
+ # The patch
82
+ local patch_file=" ${DIR} /../intellij/patches/bazel_intellij_aspect_filter.patch"
83
+ # The checksum of the patch we're about to apply.
84
+ local checksum
85
+ checksum=$( sha256sum " $patch_file " | cut -d' ' -f1)
86
+ # If the patched aspect repository doesn't exist, or the checksum of the patch
87
+ # we're about to apply doesn't match the checksum of the patch that was used
88
+ # to create the patched aspect repository, apply the patch.
89
+ if ! [[ -d " ${patched_path} " ]] || ! [[ " $( cat " ${checksum_file} " ) " == " ${checksum} " ]]; then
90
+ echo " IntelliJ found at ${ij_home} , patching aspect repository." >&2
91
+ # Copy the aspect repository to the patched path.
92
+ rm -rf " ${patched_path} "
93
+ cp -r " ${aspect_path} " " ${patched_path} "
94
+ # Apply the patch.
95
+ patch -d " ${patched_path} " -p1 < " ${patch_file} "
96
+ # Write the checksum of the patch to the checksum file.
97
+ echo " ${checksum} " > " ${checksum_file} "
98
+ else
99
+ echo " IntelliJ found at ${ij_home} , aspect repository already patched." >&2
100
+ fi
101
+ fi
102
+ }
103
+
104
+ prechecks
105
+ intellij_patch
106
+
107
+ # Find the --override_repository=intellij_aspect=[path]
108
+ # argument in $@ and replace the path with the patched version.
109
+ # This is surprisingly tricky - bash special-cases "$@" to expand
110
+ # as "$1" "$2" ... "$n" so that argv is preserved, so we need to
111
+ # modify the real $@ array.
112
+ for i in $( seq 1 $# ) ; do
113
+ if [[ " ${! i} " == " --override_repository=intellij_aspect=" * ]]; then
114
+ new_arg=" ${! i/ \/ aspect/ \/ aspect-monogon} "
115
+ set -- " ${@: 1: $((i-1))} " " ${new_arg} " " ${@: $((i+1))} "
116
+ fi
117
+ done
118
+
119
+ exec -a " $0 " " ${BAZEL_REAL} " " $@ "
0 commit comments