From b7db7eb670f9ca86f6cb17bc92523b05f38111dc Mon Sep 17 00:00:00 2001 From: Hana Date: Thu, 24 Mar 2022 16:58:40 -0400 Subject: [PATCH] internal/lsp/cmd: add vulncheck command Usage: gopls vulncheck It prints json-encoded command.VulncheckResult in stdout. Change-Id: I752b3f06d7c6b2c7de68bd1221283205955c383f Reviewed-on: https://go-review.googlesource.com/c/tools/+/395676 Trust: Hyang-Ah Hana Kim Run-TryBot: Hyang-Ah Hana Kim Reviewed-by: Robert Findley gopls-CI: kokoro TryBot-Result: Gopher Robot --- internal/lsp/cmd/cmd.go | 1 + internal/lsp/cmd/usage/usage.hlp | 1 + internal/lsp/cmd/usage/vulncheck.hlp | 9 ++++ internal/lsp/cmd/vulncheck.go | 79 ++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 internal/lsp/cmd/usage/vulncheck.hlp create mode 100644 internal/lsp/cmd/vulncheck.go diff --git a/internal/lsp/cmd/cmd.go b/internal/lsp/cmd/cmd.go index 6007b1f1ef..d48398d0dc 100644 --- a/internal/lsp/cmd/cmd.go +++ b/internal/lsp/cmd/cmd.go @@ -273,6 +273,7 @@ func (app *Application) featureCommands() []tool.Application { &symbols{app: app}, newWorkspace(app), &workspaceSymbol{app: app}, + &vulncheck{app: app}, } } diff --git a/internal/lsp/cmd/usage/usage.hlp b/internal/lsp/cmd/usage/usage.hlp index 4dce00e047..1d0fb8d4c1 100644 --- a/internal/lsp/cmd/usage/usage.hlp +++ b/internal/lsp/cmd/usage/usage.hlp @@ -38,6 +38,7 @@ Features symbols display selected file's symbols workspace manage the gopls workspace (experimental: under development) workspace_symbol search symbols in workspace + vulncheck run experimental vulncheck analysis (experimental: under development) flags: -debug=string diff --git a/internal/lsp/cmd/usage/vulncheck.hlp b/internal/lsp/cmd/usage/vulncheck.hlp new file mode 100644 index 0000000000..4bfdc4b47e --- /dev/null +++ b/internal/lsp/cmd/usage/vulncheck.hlp @@ -0,0 +1,9 @@ +run experimental vulncheck analysis (experimental: under development) + +Usage: + gopls [flags] vulncheck + + WARNING: this command is experimental. + + Example: + $ gopls vulncheck diff --git a/internal/lsp/cmd/vulncheck.go b/internal/lsp/cmd/vulncheck.go new file mode 100644 index 0000000000..adf59cecba --- /dev/null +++ b/internal/lsp/cmd/vulncheck.go @@ -0,0 +1,79 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cmd + +import ( + "context" + "encoding/json" + "flag" + "fmt" + "os" + + "golang.org/x/tools/internal/lsp/command" + "golang.org/x/tools/internal/lsp/protocol" + "golang.org/x/tools/internal/tool" +) + +// vulncheck implements the vulncheck command. +type vulncheck struct { + app *Application +} + +func (v *vulncheck) Name() string { return "vulncheck" } +func (v *vulncheck) Parent() string { return v.app.Name() } +func (v *vulncheck) Usage() string { return "" } +func (v *vulncheck) ShortHelp() string { + return "run experimental vulncheck analysis (experimental: under development)" +} +func (v *vulncheck) DetailedHelp(f *flag.FlagSet) { + fmt.Fprint(f.Output(), ` + WARNING: this command is experimental. + + Example: + $ gopls vulncheck +`) + printFlagDefaults(f) +} + +func (v *vulncheck) Run(ctx context.Context, args ...string) error { + if len(args) > 1 { + return tool.CommandLineErrorf("vulncheck accepts at most one package pattern") + } + pattern := "." + if len(args) == 1 { + pattern = args[0] + } + + conn, err := v.app.connect(ctx) + if err != nil { + return err + } + defer conn.terminate(ctx) + + cwd, err := os.Getwd() + if err != nil { + return err + } + + cmd, err := command.NewRunVulncheckExpCommand("", command.VulncheckArgs{ + Dir: protocol.URIFromPath(cwd), + Pattern: pattern, + }) + if err != nil { + return err + } + + params := &protocol.ExecuteCommandParams{Command: cmd.Command, Arguments: cmd.Arguments} + res, err := conn.ExecuteCommand(ctx, params) + if err != nil { + return fmt.Errorf("executing server command: %v", err) + } + data, err := json.MarshalIndent(res, " ", " ") + if err != nil { + return fmt.Errorf("failed to decode results: %v", err) + } + fmt.Printf("%s\n", data) + return nil +}