From cf7ee78499a8195d1be1132764bfcaa68b1eb117 Mon Sep 17 00:00:00 2001 From: Michael Podtserkovskii Date: Fri, 24 Jul 2026 15:03:02 +0100 Subject: [PATCH] mockgen: format generated code without invoking `go` mockgen formats its output with goimports, whose default import insert/delete pass shells out to `go` (unconditionally since x/tools v0.27.0). That means the `go` toolchain must be in $PATH just to format, breaking hermetic builds (Buck, Bazel): Failed to format generated source code: exec: "go": executable file not found in $PATH mockgen already emits a complete import set, so set FormatOnly to skip that pass. Output is byte-for-byte unchanged. --- mockgen/mockgen.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mockgen/mockgen.go b/mockgen/mockgen.go index baf5fbd..35d41e6 100644 --- a/mockgen/mockgen.go +++ b/mockgen/mockgen.go @@ -874,7 +874,15 @@ func (o identifierAllocator) allocateIdentifier(want string) string { // Output returns the generator's output, formatted in the standard Go style. func (g *generator) Output() []byte { - src, err := toolsimports.Process(g.destination, g.buf.Bytes(), nil) + // FormatOnly keeps formatting hermetic: mockgen already emits a complete, + // self-consistent import set, so goimports' add/remove pass (which shells + // out to `go` and breaks in Buck/Bazel) is unnecessary. + src, err := toolsimports.Process(g.destination, g.buf.Bytes(), &toolsimports.Options{ + Comments: true, + TabIndent: true, + TabWidth: 8, + FormatOnly: true, + }) if err != nil { log.Fatalf("Failed to format generated source code: %s\n%s", err, g.buf.String()) }