Skip to content

Commit be48a4f

Browse files
fix(tools): make version optional and improve error reporting for install-vscode
- Make version argument optional, defaulting to current Go version - Add auto-detection of current version using GetCurrentVersionResolved - Improve error reporting with stderr capture and detailed messages - Fix gotests package path (github.com/cweill/gotests/gotests) - Capture and display first error for better debugging - Update help text and examples to show new default behavior - Add proper verbose/non-verbose mode output handling
1 parent 09be2c9 commit be48a4f

3 files changed

Lines changed: 58 additions & 13 deletions

File tree

cmd/tools/install_vscode.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
var installVSCodeCmd = &cobra.Command{
14-
Use: "install-vscode <version>",
14+
Use: "install-vscode [version]",
1515
Short: "Install VSCode Go extension tools for a Go version",
1616
Long: `Installs all tools required by the VSCode Go extension for a specific Go version.
1717
@@ -32,15 +32,15 @@ These tools provide the full IntelliSense, debugging, and code editing
3232
capabilities of the VSCode Go extension.
3333
3434
Examples:
35+
# Install VSCode tools for current version
36+
goenv tools install-vscode
37+
3538
# Install VSCode tools for specific version
3639
goenv tools install-vscode 1.25.2
3740
38-
# Install for current version
39-
goenv tools install-vscode $(goenv version-name)
40-
4141
# Show what would be installed
42-
goenv tools install-vscode 1.25.2 --dry-run`,
43-
Args: cobra.ExactArgs(1),
42+
goenv tools install-vscode --dry-run`,
43+
Args: cobra.RangeArgs(0, 1),
4444
RunE: runInstallVSCode,
4545
}
4646

@@ -58,7 +58,19 @@ func runInstallVSCode(cmd *cobra.Command, args []string) error {
5858
ctx := cmdutil.GetContexts(cmd)
5959
cfg := ctx.Config
6060
mgr := ctx.Manager
61-
goVersion := args[0]
61+
62+
// Get version from args or use current version
63+
var goVersion string
64+
if len(args) > 0 {
65+
goVersion = args[0]
66+
} else {
67+
// Use GetCurrentVersionResolved to handle partial versions (e.g., "1.25" → "1.25.10")
68+
var err error
69+
goVersion, _, _, err = mgr.GetCurrentVersionResolved()
70+
if err != nil {
71+
return fmt.Errorf("no Go version specified and no current version set. Use 'goenv global <version>' or specify a version")
72+
}
73+
}
6274

6375
// Validate version is installed
6476
if !mgr.IsVersionInstalled(goVersion) {

internal/tools/tools.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package tools
22

33
import (
4+
"bytes"
45
"fmt"
56
"os"
67
"os/exec"
@@ -199,6 +200,7 @@ func InstallTools(config *Config, goVersion string, goenvRoot string, hostGopath
199200
// Track results
200201
installed := []string{}
201202
failed := []string{}
203+
var firstError error
202204

203205
for _, tool := range config.Tools {
204206
if verbose {
@@ -226,14 +228,37 @@ func InstallTools(config *Config, goVersion string, goenvRoot string, hostGopath
226228
cmd.Env = append(cmd.Env, utils.EnvVarGomodcache+"="+sharedGomodcache)
227229
}
228230

229-
cmd.Stdout = nil // Suppress output unless there's an error
230-
cmd.Stderr = nil
231+
// Capture stderr for error reporting
232+
var stderr bytes.Buffer
233+
if verbose {
234+
// In verbose mode, show all output
235+
cmd.Stdout = os.Stdout
236+
cmd.Stderr = os.Stderr
237+
} else {
238+
// In non-verbose mode, capture stderr for error reporting
239+
cmd.Stdout = nil
240+
cmd.Stderr = &stderr
241+
}
231242

232243
if err := cmd.Run(); err != nil {
233244
if verbose {
234245
fmt.Printf(" %sFAILED\n", utils.Emoji("❌ "))
246+
} else {
247+
// Show error details in non-verbose mode
248+
fmt.Printf(" %s %s: %v\n", utils.Emoji("❌"), tool.Name, err)
249+
if stderr.Len() > 0 {
250+
fmt.Printf(" %s\n", strings.TrimSpace(stderr.String()))
251+
}
235252
}
236253
failed = append(failed, tool.Name)
254+
// Capture first error for context
255+
if firstError == nil {
256+
if stderr.Len() > 0 {
257+
firstError = fmt.Errorf("%s failed: %w\n%s", tool.Name, err, strings.TrimSpace(stderr.String()))
258+
} else {
259+
firstError = fmt.Errorf("%s failed: %w", tool.Name, err)
260+
}
261+
}
237262
} else {
238263
if verbose {
239264
fmt.Printf(" %s\n", utils.Emoji("✅"))
@@ -247,6 +272,9 @@ func InstallTools(config *Config, goVersion string, goenvRoot string, hostGopath
247272
}
248273

249274
if len(failed) > 0 {
275+
if firstError != nil {
276+
return fmt.Errorf("failed to install %d tool(s): %s\n\nFirst error: %w", len(failed), strings.Join(failed, ", "), firstError)
277+
}
250278
return fmt.Errorf("failed to install %d tool(s): %s", len(failed), strings.Join(failed, ", "))
251279
}
252280

internal/tools/utils.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var commonTools = map[string]string{
1111
"gomodifytags": "github.com/fatih/gomodifytags",
1212
"vscgo": "github.com/golang/vscode-go/vscgo",
1313
"goplay": "github.com/haya14busa/goplay/cmd/goplay",
14-
"gotests": "github.com/cweill/gotests",
14+
"gotests": "github.com/cweill/gotests/gotests",
1515
"gotestsum": "gotest.tools/gotestsum",
1616
"gopls": "golang.org/x/tools/gopls",
1717
"goimports": "golang.org/x/tools/cmd/goimports",
@@ -126,11 +126,16 @@ func BuildVSCodeToolsConfig() *Config {
126126
}
127127

128128
for _, toolName := range VSCodeTools {
129-
pkg := NormalizePackagePath(toolName)
129+
// Get package path without version (commonTools contains base paths only)
130+
pkg := toolName
131+
if fullPath, exists := commonTools[toolName]; exists {
132+
pkg = fullPath
133+
}
134+
130135
toolConfig.Tools = append(toolConfig.Tools, Tool{
131136
Name: toolName,
132-
Package: pkg,
133-
Version: "latest",
137+
Package: pkg, // Base package path without version
138+
Version: "", // Empty - InstallTools will add @latest
134139
Binary: toolName,
135140
})
136141
}

0 commit comments

Comments
 (0)