"cmd/go/internal/modload"
"cmd/go/internal/str"
"context"
- "errors"
"fmt"
"io/fs"
"os"
base.Fatalf("go: 'go work use' requires one or more directory arguments")
}
for _, useDir := range args {
- if !*useR {
- if target, err := fsys.Stat(useDir); err == nil && !target.IsDir() {
- base.Errorf(`go: argument "%s" is not a directory`, useDir)
+ absArg, _ := pathRel(workDir, useDir)
+
+ info, err := fsys.Stat(absArg)
+ if err != nil {
+ // Errors raised from os.Stat are formatted to be more user-friendly.
+ if os.IsNotExist(err) {
+ base.Errorf("go: directory %v does not exist", absArg)
} else {
- lookDir(useDir)
+ base.Errorf("go: %v", err)
}
continue
+ } else if !info.IsDir() {
+ base.Errorf("go: %s is not a directory", absArg)
+ continue
+ }
+
+ if !*useR {
+ lookDir(useDir)
+ continue
}
// Add or remove entries for any subdirectories that still exist.
- err := fsys.Walk(useDir, func(path string, info fs.FileInfo, err error) error {
+ fsys.Walk(useDir, func(path string, info fs.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+
if !info.IsDir() {
if info.Mode()&fs.ModeSymlink != 0 {
if target, err := fsys.Stat(path); err == nil && target.IsDir() {
lookDir(path)
return nil
})
- if err != nil && !errors.Is(err, os.ErrNotExist) {
- base.Errorf("go: %v", err)
- }
// Remove entries for subdirectories that no longer exist.
// Because they don't exist, they will be skipped by Walk.
- absArg, _ := pathRel(workDir, useDir)
for absDir, _ := range haveDirs {
if str.HasFilePathPrefix(absDir, absArg) {
if _, ok := keepDirs[absDir]; !ok {