imports: fix reading from stdin on Windows
Don't panic when reading from stdin on Windows. This is a regression
from https://golang.org/cl/43454
Also fix some weird behavior with stdin processing I noticed during
reviewing the code: don't allow the -w (write) flag, and adust the
filename shown with the -d (diff) flag.
Fixes golang/go#20941
Change-Id: I73d0a1dc74c919238a3bb72823585bbf1b7daba1
Reviewed-on: https://go-review.googlesource.com/47810
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Jones <rbjones@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/cmd/goimports/goimports.go b/cmd/goimports/goimports.go
index b722c6a..16e3083 100644
--- a/cmd/goimports/goimports.go
+++ b/cmd/goimports/goimports.go
@@ -144,12 +144,19 @@
fmt.Fprintln(out, filename)
}
if *write {
+ if argType == fromStdin {
+ // filename is "<standard input>"
+ return errors.New("can't use -w on stdin")
+ }
err = ioutil.WriteFile(filename, res, 0)
if err != nil {
return err
}
}
if *doDiff {
+ if argType == fromStdin {
+ filename = "stdin.go" // because <standard input>.orig looks silly
+ }
data, err := diff(src, res, filename)
if err != nil {
return fmt.Errorf("computing diff: %s", err)
diff --git a/imports/fix.go b/imports/fix.go
index f26414a..ac7f4b0 100644
--- a/imports/fix.go
+++ b/imports/fix.go
@@ -254,10 +254,12 @@
results := make(chan result)
for pkgName, symbols := range refs {
go func(pkgName string, symbols map[string]bool) {
- sibling := packageInfo.Imports[pkgName]
- if sibling.Path != "" {
- results <- result{ipath: sibling.Path, name: sibling.Alias}
- return
+ if packageInfo != nil {
+ sibling := packageInfo.Imports[pkgName]
+ if sibling.Path != "" {
+ results <- result{ipath: sibling.Path, name: sibling.Alias}
+ return
+ }
}
ipath, rename, err := findImport(pkgName, symbols, filename)
r := result{ipath: ipath, err: err}
diff --git a/imports/fix_test.go b/imports/fix_test.go
index 2026d5c..ffab390 100644
--- a/imports/fix_test.go
+++ b/imports/fix_test.go
@@ -1803,3 +1803,14 @@
}
}
}
+
+// Issue 20941: this used to panic on Windows.
+func TestProcessStdin(t *testing.T) {
+ got, err := Process("<standard input>", []byte("package main\nfunc main() {\n\tfmt.Println(123)\n}\n"), nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !strings.Contains(string(got), `"fmt"`) {
+ t.Errorf("expected fmt import; got: %s", got)
+ }
+}