diff options
| author | Russ Cox <rsc@golang.org> | 2015-07-23 11:41:35 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2015-07-27 17:44:02 +0000 |
| commit | ea085414ef3bee6f9a7d5f4daed5d24a744c1ab9 (patch) | |
| tree | 41d374523b9d51ccd3b9bed4b2f4b0fb2baec4e7 /src | |
| parent | 00cf88e2c60076b5e5e2e07272cd1d188c183ea1 (diff) | |
| download | go-ea085414ef3bee6f9a7d5f4daed5d24a744c1ab9.tar.xz | |
cmd/go: do not panic on template I/O error
Fixes #11839.
Change-Id: Ie092a3a512a2d35967364b41081a066ab3a6aab4
Reviewed-on: https://go-review.googlesource.com/12571
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/go/main.go | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index e07651bb02..88a94417d7 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -235,12 +235,35 @@ var documentationTemplate = `// Copyright 2011 The Go Authors. All rights reser package main ` +// An errWriter wraps a writer, recording whether a write error occurred. +type errWriter struct { + w io.Writer + err error +} + +func (w *errWriter) Write(b []byte) (int, error) { + n, err := w.w.Write(b) + if err != nil { + w.err = err + } + return n, err +} + // tmpl executes the given template text on data, writing the result to w. func tmpl(w io.Writer, text string, data interface{}) { t := template.New("top") t.Funcs(template.FuncMap{"trim": strings.TrimSpace, "capitalize": capitalize}) template.Must(t.Parse(text)) - if err := t.Execute(w, data); err != nil { + ew := &errWriter{w: w} + err := t.Execute(ew, data) + if ew.err != nil { + // I/O error writing. Ignore write on closed pipe. + if strings.Contains(ew.err.Error(), "pipe") { + os.Exit(1) + } + fatalf("writing output: %v", ew.err) + } + if err != nil { panic(err) } } |
