Skip to content

Commit ae5b881

Browse files
committed
go/packages: suppress go list errors when ad-hoc package doesn't exist
Updates golang/go#29280 Change-Id: Ie5a5dc1fef8f3d989b3a5fffb6c2ca66e97c143a Reviewed-on: https://go-review.googlesource.com/c/154517 Reviewed-by: Ian Cottrell <[email protected]>
1 parent 57eff0d commit ae5b881

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

go/packages/golist.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,10 @@ func invokeGo(cfg *Config, args ...string) (*bytes.Buffer, error) {
741741
// If that build fails, errors appear on stderr
742742
// (despite the -e flag) and the Export field is blank.
743743
// Do not fail in that case.
744-
if !usesExportData(cfg) {
744+
// The same is true if an ad-hoc package given to go list doesn't exist.
745+
// TODO(matloob): Remove these once we can depend on go list to exit with a zero status with -e even when
746+
// packages don't exist or a build fails.
747+
if !usesExportData(cfg) && !containsGoFile(args) {
745748
return nil, fmt.Errorf("go %v: %s: %s", args, exitErr, stderr)
746749
}
747750
}
@@ -764,6 +767,15 @@ func invokeGo(cfg *Config, args ...string) (*bytes.Buffer, error) {
764767
return stdout, nil
765768
}
766769

770+
func containsGoFile(s []string) bool {
771+
for _, f := range s {
772+
if strings.HasSuffix(f, ".go") {
773+
return true
774+
}
775+
}
776+
return false
777+
}
778+
767779
func cmdDebugStr(cfg *Config, args ...string) string {
768780
env := make(map[string]string)
769781
for _, kv := range cfg.Env {

go/packages/packages_test.go

+18
Original file line numberDiff line numberDiff line change
@@ -1570,6 +1570,24 @@ func testBasicXTest(t *testing.T, exporter packagestest.Exporter) {
15701570
}
15711571
}
15721572

1573+
func TestErrorMissingFile(t *testing.T) { packagestest.TestAll(t, testErrorMissingFile) }
1574+
func testErrorMissingFile(t *testing.T, exporter packagestest.Exporter) {
1575+
exported := packagestest.Export(t, exporter, []packagestest.Module{{
1576+
Name: "golang.org/fake",
1577+
Files: map[string]interface{}{
1578+
"a/a_test.go": `package a;`,
1579+
}}})
1580+
defer exported.Cleanup()
1581+
1582+
exported.Config.Mode = packages.LoadSyntax
1583+
exported.Config.Tests = false
1584+
pkgs, err := packages.Load(exported.Config, "missing.go")
1585+
if err != nil {
1586+
t.Fatal(err)
1587+
}
1588+
t.Log(pkgs)
1589+
}
1590+
15731591
func errorMessages(errors []packages.Error) []string {
15741592
var msgs []string
15751593
for _, err := range errors {

0 commit comments

Comments
 (0)