diff --git a/go/packages/external.go b/go/packages/external.go index 53cc080d..9d369a30 100644 --- a/go/packages/external.go +++ b/go/packages/external.go @@ -16,6 +16,17 @@ import ( "strings" ) +// Driver +type driverRequest struct { + // TODO(matloob): Add a "command" option, so the "list" argument + // to the command is instead supplied in the driverRequest? + Mode LoadMode `json:"mode"` + Env []string `json:"env"` + BuildFlags []string `json:"build_flags"` + Tests bool `json:"tests"` + Overlay map[string][]byte `json:"overlay"` +} + // findExternalTool returns the file path of a tool that supplies // the build system package structure, or "" if not found." // If GOPACKAGESDRIVER is set in the environment findExternalTool returns its @@ -39,21 +50,22 @@ func findExternalDriver(cfg *Config) driver { } } return func(cfg *Config, words ...string) (*driverResponse, error) { + req, err := json.Marshal(driverRequest{ + Mode: cfg.Mode, + Env: cfg.Env, + BuildFlags: cfg.BuildFlags, + Tests: cfg.Tests, + Overlay: cfg.Overlay, + }) + if err != nil { + return nil, fmt.Errorf("failed to encode message to driver tool: %v", err) + } + buf := new(bytes.Buffer) - fullargs := []string{ - "list", - fmt.Sprintf("-test=%t", cfg.Tests), - fmt.Sprintf("-export=%t", usesExportData(cfg)), - fmt.Sprintf("-deps=%t", cfg.Mode >= LoadImports), - } - for _, f := range cfg.BuildFlags { - fullargs = append(fullargs, fmt.Sprintf("-buildflag=%v", f)) - } - fullargs = append(fullargs, "--") - fullargs = append(fullargs, words...) - cmd := exec.CommandContext(cfg.Context, tool, fullargs...) - cmd.Env = cfg.Env + cmd := exec.CommandContext(cfg.Context, tool, words...) cmd.Dir = cfg.Dir + cmd.Env = cfg.Env + cmd.Stdin = bytes.NewReader(req) cmd.Stdout = buf cmd.Stderr = new(bytes.Buffer) if err := cmd.Run(); err != nil {