Generate fish shell completion at build time

Fish shell completion for bazel previously relied on parsing bazel help
text at run time, leading to latency of multiple seconds for first-time
completion. This change adds a script that instead parses bazel help
text and generates an appropriate fish completion script at build time,
greatly reducing completion latency for the user.

Fixes #12206
Fixes #12207
Fixes #12208
Fixes #12209
Fixes #12210

Closes #12249.

PiperOrigin-RevId: 337468387
diff --git a/scripts/BUILD b/scripts/BUILD
index 83e778c..c477439 100644
--- a/scripts/BUILD
+++ b/scripts/BUILD
@@ -40,10 +40,30 @@
     name = "srcs",
     srcs = glob(["**"]) + [
         "//scripts/docs:srcs",
-        "//scripts/fish:srcs",
         "//scripts/packages:srcs",
         "//scripts/release:srcs",
         "//scripts/zsh_completion:srcs",
     ],
     visibility = ["//:__pkg__"],
 )
+
+py_binary(
+    name = "generate_fish_completion",
+    srcs = ["generate_fish_completion.py"],
+    deps = ["//third_party/py/abseil"],
+)
+
+genrule(
+    name = "fish_completion",
+    outs = ["bazel.fish"],
+    cmd = " ".join([
+        "$(location :generate_fish_completion)",
+        "--bazel=$(location //src:bazel)",
+        "--output=$@",
+    ]),
+    tools = [
+        ":generate_fish_completion",
+        "//src:bazel",
+    ],
+    visibility = ["//scripts/packages:__subpackages__"],
+)