From 4112509618ee88519f899be20efc6882496b57c8 Mon Sep 17 00:00:00 2001 From: Davis Goodin Date: Mon, 23 Jan 2023 16:51:51 -0800 Subject: [PATCH] windows/mkwinsyscall: write source to temp file if formatting fails This change writes the unformatted Go source code to a temp file if "format.Source" fails. Print the temp file path to the console to make it easy to find. The source code is what causes formatting errors, and it can be difficult to diagnose them without this context. Fixes golang/go#57925 Change-Id: Ifa4d8a6e8bc5006357b0bc88afce5ba1d6fe0a48 Reviewed-on: https://go-review.googlesource.com/c/sys/+/463216 Reviewed-by: Michael Knyszek Reviewed-by: Alex Brainman Auto-Submit: Bryan Mills Reviewed-by: Quim Muntal TryBot-Result: Gopher Robot Run-TryBot: Bryan Mills Reviewed-by: Bryan Mills --- windows/mkwinsyscall/mkwinsyscall.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/windows/mkwinsyscall/mkwinsyscall.go b/windows/mkwinsyscall/mkwinsyscall.go index 7fe4efa9..11f4873b 100644 --- a/windows/mkwinsyscall/mkwinsyscall.go +++ b/windows/mkwinsyscall/mkwinsyscall.go @@ -871,6 +871,22 @@ func (src *Source) Generate(w io.Writer) error { return nil } +func writeTempSourceFile(data []byte) (string, error) { + f, err := os.CreateTemp("", "mkwinsyscall-generated-*.go") + if err != nil { + return "", err + } + _, err = f.Write(data) + if closeErr := f.Close(); err == nil { + err = closeErr + } + if err != nil { + os.Remove(f.Name()) // best effort + return "", err + } + return f.Name(), nil +} + func usage() { fmt.Fprintf(os.Stderr, "usage: mkwinsyscall [flags] [path ...]\n") flag.PrintDefaults() @@ -897,7 +913,12 @@ func main() { data, err := format.Source(buf.Bytes()) if err != nil { - log.Fatal(err) + log.Printf("failed to format source: %v", err) + f, err := writeTempSourceFile(buf.Bytes()) + if err != nil { + log.Fatalf("failed to write unformatted source to file: %v", err) + } + log.Fatalf("for diagnosis, wrote unformatted source to %v", f) } if *filename == "" { _, err = os.Stdout.Write(data)