From f340ed3ae274cf744edc12c671194b31a12fe4ac Mon Sep 17 00:00:00 2001 From: Pontus Leitzler Date: Wed, 28 Aug 2019 20:02:38 +0000 Subject: [PATCH] x/tools/gopls: add fallback to default GOPATH if missing The "Organize imports" code action uses internal/imports that needs a valid GOPATH set. Since Go 1.8 setting GOPATH manually is not required, and if it isn't set gopls will sometimes fail to properly import packages. This CL sets GOPATH to the default if the env var GOPATH isn't set. Fixes golang/go#33918. Change-Id: Ib63a26a801e15af730197999de4d1d4901694a30 Reviewed-on: https://go-review.googlesource.com/c/tools/+/191600 Run-TryBot: Ian Cottrell TryBot-Result: Gobot Gobot Reviewed-by: Ian Cottrell --- internal/lsp/cache/view.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/internal/lsp/cache/view.go b/internal/lsp/cache/view.go index d82d17dcc9..951dad99b7 100644 --- a/internal/lsp/cache/view.go +++ b/internal/lsp/cache/view.go @@ -12,6 +12,7 @@ import ( "go/token" "go/types" "os" + "os/exec" "path/filepath" "strings" "sync" @@ -147,7 +148,10 @@ func (v *view) RunProcessEnvFunc(ctx context.Context, fn func(*imports.Options) v.mu.Lock() defer v.mu.Unlock() if v.processEnv == nil { - v.processEnv = v.buildProcessEnv(ctx) + var err error + if v.processEnv, err = v.buildProcessEnv(ctx); err != nil { + return err + } } // Before running the user provided function, clear caches in the resolver. @@ -176,7 +180,7 @@ func (v *view) RunProcessEnvFunc(ctx context.Context, fn func(*imports.Options) return nil } -func (v *view) buildProcessEnv(ctx context.Context) *imports.ProcessEnv { +func (v *view) buildProcessEnv(ctx context.Context) (*imports.ProcessEnv, error) { cfg := v.Config(ctx) env := &imports.ProcessEnv{ WorkingDir: cfg.Dir, @@ -204,7 +208,17 @@ func (v *view) buildProcessEnv(ctx context.Context) *imports.ProcessEnv { env.GOSUMDB = split[1] } } - return env + + if env.GOPATH == "" { + cmd := exec.CommandContext(ctx, "go", "env", "GOPATH") + cmd.Env = cfg.Env + if out, err := cmd.CombinedOutput(); err != nil { + return nil, err + } else { + env.GOPATH = strings.TrimSpace(string(out)) + } + } + return env, nil } func (v *view) modFilesChanged() bool {