Import gazelle

This patch imports gazelle as a linter. It automatically generates
BUILD file entries for Go code and at the same time keeps BUILD files
formatted.

The `tools/lint:run-ci` target is set up to automatically add new Go
repositories as well.

I added a tool at `//tools/go:mirror_go_repos` that needs to be run
before anyone can merge code that uses third-party Go libraries.

Change-Id: I1fbf6761439d45893f5be88d294ccc3c567840ca
Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
diff --git a/tools/go/tweak_gazelle_go_deps.py b/tools/go/tweak_gazelle_go_deps.py
new file mode 100644
index 0000000..7189d43
--- /dev/null
+++ b/tools/go/tweak_gazelle_go_deps.py
@@ -0,0 +1,42 @@
+"""Tweaks the gazelle-generated go_deps.bzl to work with our mirrors.
+
+This script changes all invocations of go_repository() in go_deps.bzl to use
+maybe_override_go_dep(). That lets us more easily switch between upstream
+sources and our mirrored versions of the code.
+
+The motivation is to let folks use upstream sources during local development.
+For CI runs, however, we have to restrict ourselves to mirrored dependencies.
+"""
+
+import argparse
+import sys
+import textwrap
+
+import tools.go.mirror_lib
+
+def main(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument("go_deps_bzl", type=str)
+    args = parser.parse_args(argv[1:])
+
+    repos = tools.go.mirror_lib.parse_go_repositories(args.go_deps_bzl)
+
+    with open(args.go_deps_bzl, "w") as file:
+        file.write(textwrap.dedent("""\
+            # This file is auto-generated. Do not edit.
+            load("//tools/go:mirrored_go_deps.bzl", "maybe_override_go_dep")
+
+            def go_dependencies():
+            """))
+        for repo in repos:
+            file.write(textwrap.indent(textwrap.dedent(f"""\
+                maybe_override_go_dep(
+                    name = "{repo['name']}",
+                    importpath = "{repo['importpath']}",
+                    sum = "{repo['sum']}",
+                    version = "{repo['version']}",
+                )
+                """), " " * 4))
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))