From 2e054128bf72c328ed565cfde1ceb7c9a470dc51 Mon Sep 17 00:00:00 2001 From: cui fliter Date: Thu, 29 Sep 2022 02:16:56 +0000 Subject: [PATCH] cmd/go/internal: use strings.Cut Change-Id: Icbe2af4f2abf22b6a8c9cec33f0f88018f3bd1c7 GitHub-Last-Rev: 81392a6e88d5297f958116031949b37f70271556 GitHub-Pull-Request: golang/go#55908 Reviewed-on: https://go-review.googlesource.com/c/go/+/435737 TryBot-Result: Gopher Robot Reviewed-by: Ian Lance Taylor Reviewed-by: Bryan Mills Auto-Submit: Bryan Mills Run-TryBot: Bryan Mills --- src/cmd/go/internal/cmdflag/flag.go | 9 +------ src/cmd/go/internal/envcmd/env.go | 5 ++-- src/cmd/go/internal/modcmd/edit.go | 25 ++++++++++---------- src/cmd/go/internal/modconv/dep.go | 8 +++---- src/cmd/go/internal/modfetch/codehost/vcs.go | 6 ++--- src/cmd/go/internal/modget/query.go | 10 +++----- src/cmd/go/internal/modload/build.go | 4 ++-- src/cmd/go/internal/modload/list.go | 9 ++----- src/cmd/go/internal/test/test.go | 6 ++--- src/cmd/go/internal/vcs/vcs.go | 6 ++--- src/cmd/go/internal/work/gccgo.go | 5 +--- src/cmd/go/internal/workcmd/edit.go | 11 +++++---- 12 files changed, 42 insertions(+), 62 deletions(-) diff --git a/src/cmd/go/internal/cmdflag/flag.go b/src/cmd/go/internal/cmdflag/flag.go index a634bc1ab8..86e33ea111 100644 --- a/src/cmd/go/internal/cmdflag/flag.go +++ b/src/cmd/go/internal/cmdflag/flag.go @@ -70,14 +70,7 @@ func ParseOne(fs *flag.FlagSet, args []string) (f *flag.Flag, remainingArgs []st return nil, args, NonFlagError{RawArg: raw} } - name := arg[1:] - hasValue := false - value := "" - if i := strings.Index(name, "="); i >= 0 { - value = name[i+1:] - hasValue = true - name = name[0:i] - } + name, value, hasValue := strings.Cut(arg[1:], "=") f = fs.Lookup(name) if f == nil { diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go index 2d8f7afd6b..f7f065529d 100644 --- a/src/cmd/go/internal/envcmd/env.go +++ b/src/cmd/go/internal/envcmd/env.go @@ -318,11 +318,10 @@ func runEnvW(args []string) { } add := make(map[string]string) for _, arg := range args { - i := strings.Index(arg, "=") - if i < 0 { + key, val, found := strings.Cut(arg, "=") + if !found { base.Fatalf("go: arguments must be KEY=VALUE: invalid argument: %s", arg) } - key, val := arg[:i], arg[i+1:] if err := checkEnvWrite(key, val); err != nil { base.Fatalf("go: %v", err) } diff --git a/src/cmd/go/internal/modcmd/edit.go b/src/cmd/go/internal/modcmd/edit.go index e5182a9590..edc1b19877 100644 --- a/src/cmd/go/internal/modcmd/edit.go +++ b/src/cmd/go/internal/modcmd/edit.go @@ -262,11 +262,11 @@ func runEdit(ctx context.Context, cmd *base.Command, args []string) { // parsePathVersion parses -flag=arg expecting arg to be path@version. func parsePathVersion(flag, arg string) (path, version string) { - i := strings.Index(arg, "@") - if i < 0 { + before, after, found := strings.Cut(arg, "@") + if !found { base.Fatalf("go: -%s=%s: need path@version", flag, arg) } - path, version = strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:]) + path, version = strings.TrimSpace(before), strings.TrimSpace(after) if err := module.CheckImportPath(path); err != nil { base.Fatalf("go: -%s=%s: invalid path: %v", flag, arg, err) } @@ -293,10 +293,11 @@ func parsePath(flag, arg string) (path string) { // parsePathVersionOptional parses path[@version], using adj to // describe any errors. func parsePathVersionOptional(adj, arg string, allowDirPath bool) (path, version string, err error) { - if i := strings.Index(arg, "@"); i < 0 { + before, after, found := strings.Cut(arg, "@") + if !found { path = arg } else { - path, version = strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:]) + path, version = strings.TrimSpace(before), strings.TrimSpace(after) } if err := module.CheckImportPath(path); err != nil { if !allowDirPath || !modfile.IsDirectoryPath(path) { @@ -324,12 +325,12 @@ func parseVersionInterval(arg string) (modfile.VersionInterval, error) { return modfile.VersionInterval{}, fmt.Errorf("invalid version interval: %q", arg) } s := arg[1 : len(arg)-1] - i := strings.Index(s, ",") - if i < 0 { + before, after, found := strings.Cut(s, ",") + if !found { return modfile.VersionInterval{}, fmt.Errorf("invalid version interval: %q", arg) } - low := strings.TrimSpace(s[:i]) - high := strings.TrimSpace(s[i+1:]) + low := strings.TrimSpace(before) + high := strings.TrimSpace(after) if !allowedVersionArg(low) || !allowedVersionArg(high) { return modfile.VersionInterval{}, fmt.Errorf("invalid version interval: %q", arg) } @@ -387,11 +388,11 @@ func flagDropExclude(arg string) { // flagReplace implements the -replace flag. func flagReplace(arg string) { - var i int - if i = strings.Index(arg, "="); i < 0 { + before, after, found := strings.Cut(arg, "=") + if !found { base.Fatalf("go: -replace=%s: need old[@v]=new[@w] (missing =)", arg) } - old, new := strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:]) + old, new := strings.TrimSpace(before), strings.TrimSpace(after) if strings.HasPrefix(new, ">") { base.Fatalf("go: -replace=%s: separator between old and new is =, not =>", arg) } diff --git a/src/cmd/go/internal/modconv/dep.go b/src/cmd/go/internal/modconv/dep.go index 2e673c3ab9..9bea761b49 100644 --- a/src/cmd/go/internal/modconv/dep.go +++ b/src/cmd/go/internal/modconv/dep.go @@ -44,12 +44,12 @@ func ParseGopkgLock(file string, data []byte) (*modfile.File, error) { if r == nil { continue } - i := strings.Index(line, "=") - if i < 0 { + before, after, found := strings.Cut(line, "=") + if !found { continue } - key := strings.TrimSpace(line[:i]) - val := strings.TrimSpace(line[i+1:]) + key := strings.TrimSpace(before) + val := strings.TrimSpace(after) if len(val) >= 2 && val[0] == '"' && val[len(val)-1] == '"' { q, err := strconv.Unquote(val) // Go unquoting, but close enough for now if err != nil { diff --git a/src/cmd/go/internal/modfetch/codehost/vcs.go b/src/cmd/go/internal/modfetch/codehost/vcs.go index 99be8646a4..300a23c6ac 100644 --- a/src/cmd/go/internal/modfetch/codehost/vcs.go +++ b/src/cmd/go/internal/modfetch/codehost/vcs.go @@ -539,12 +539,12 @@ func bzrParseStat(rev, out string) (*RevInfo, error) { if line[0] == '-' { continue } - i := strings.Index(line, ":") - if i < 0 { + before, after, found := strings.Cut(line, ":") + if !found { // End of header, start of commit message. break } - key, val := line[:i], strings.TrimSpace(line[i+1:]) + key, val := before, strings.TrimSpace(after) switch key { case "revno": if j := strings.Index(val, " "); j >= 0 { diff --git a/src/cmd/go/internal/modget/query.go b/src/cmd/go/internal/modget/query.go index 8fffb3354c..d18770e889 100644 --- a/src/cmd/go/internal/modget/query.go +++ b/src/cmd/go/internal/modget/query.go @@ -138,13 +138,9 @@ func errSet(err error) pathSet { return pathSet{err: err} } // newQuery returns a new query parsed from the raw argument, // which must be either path or path@version. func newQuery(raw string) (*query, error) { - pattern := raw - rawVers := "" - if i := strings.Index(raw, "@"); i >= 0 { - pattern, rawVers = raw[:i], raw[i+1:] - if strings.Contains(rawVers, "@") || rawVers == "" { - return nil, fmt.Errorf("invalid module version syntax %q", raw) - } + pattern, rawVers, found := strings.Cut(raw, "@") + if found && (strings.Contains(rawVers, "@") || rawVers == "") { + return nil, fmt.Errorf("invalid module version syntax %q", raw) } // If no version suffix is specified, assume @upgrade. diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index f5e16e2a92..14ba83c9c9 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -89,8 +89,8 @@ func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { return nil } - if i := strings.Index(path, "@"); i >= 0 { - m := module.Version{Path: path[:i], Version: path[i+1:]} + if path, vers, found := strings.Cut(path, "@"); found { + m := module.Version{Path: path, Version: vers} return moduleInfo(ctx, nil, m, 0, nil) } diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 6586309291..f77901fa21 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -140,9 +140,7 @@ func listModules(ctx context.Context, rs *Requirements, args []string, mode List } continue } - if i := strings.Index(arg, "@"); i >= 0 { - path := arg[:i] - vers := arg[i+1:] + if path, vers, found := strings.Cut(arg, "@"); found { if vers == "upgrade" || vers == "patch" { if _, ok := rs.rootSelected(path); !ok || rs.pruning == unpruned { needFullGraph = true @@ -168,10 +166,7 @@ func listModules(ctx context.Context, rs *Requirements, args []string, mode List matchedModule := map[module.Version]bool{} for _, arg := range args { - if i := strings.Index(arg, "@"); i >= 0 { - path := arg[:i] - vers := arg[i+1:] - + if path, vers, found := strings.Cut(arg, "@"); found { var current string if mg == nil { current, _ = rs.rootSelected(path) diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 2b59763211..dac13e9a4b 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -1507,15 +1507,13 @@ func computeTestInputsID(a *work.Action, testlog []byte) (cache.ActionID, error) continue } s := string(line) - i := strings.Index(s, " ") - if i < 0 { + op, name, found := strings.Cut(s, " ") + if !found { if cache.DebugTest { fmt.Fprintf(os.Stderr, "testcache: %s: input list malformed (%q)\n", a.Package.ImportPath, line) } return cache.ActionID{}, errBadTestInputs } - op := s[:i] - name := s[i+1:] switch op { default: if cache.DebugTest { diff --git a/src/cmd/go/internal/vcs/vcs.go b/src/cmd/go/internal/vcs/vcs.go index baa0876742..d2004579c4 100644 --- a/src/cmd/go/internal/vcs/vcs.go +++ b/src/cmd/go/internal/vcs/vcs.go @@ -880,11 +880,11 @@ func parseGOVCS(s string) (govcsConfig, error) { if item == "" { return nil, fmt.Errorf("empty entry in GOVCS") } - i := strings.Index(item, ":") - if i < 0 { + pattern, list, found := strings.Cut(item, ":") + if !found { return nil, fmt.Errorf("malformed entry in GOVCS (missing colon): %q", item) } - pattern, list := strings.TrimSpace(item[:i]), strings.TrimSpace(item[i+1:]) + pattern, list = strings.TrimSpace(pattern), strings.TrimSpace(list) if pattern == "" { return nil, fmt.Errorf("empty pattern in GOVCS: %q", item) } diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go index d37b8df07b..a65c61ffd5 100644 --- a/src/cmd/go/internal/work/gccgo.go +++ b/src/cmd/go/internal/work/gccgo.go @@ -157,10 +157,7 @@ func buildImportcfgSymlinks(b *Builder, root string, importcfg []byte) error { } else { verb, args = line[:i], strings.TrimSpace(line[i+1:]) } - var before, after string - if i := strings.Index(args, "="); i >= 0 { - before, after = args[:i], args[i+1:] - } + before, after, _ := strings.Cut(args, "=") switch verb { default: base.Fatalf("importcfg:%d: unknown directive %q", lineNum, verb) diff --git a/src/cmd/go/internal/workcmd/edit.go b/src/cmd/go/internal/workcmd/edit.go index a0b96cd730..8d1d38318b 100644 --- a/src/cmd/go/internal/workcmd/edit.go +++ b/src/cmd/go/internal/workcmd/edit.go @@ -219,10 +219,11 @@ func allowedVersionArg(arg string) bool { // parsePathVersionOptional parses path[@version], using adj to // describe any errors. func parsePathVersionOptional(adj, arg string, allowDirPath bool) (path, version string, err error) { - if i := strings.Index(arg, "@"); i < 0 { + before, after, found := strings.Cut(arg, "@") + if !found { path = arg } else { - path, version = strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:]) + path, version = strings.TrimSpace(before), strings.TrimSpace(after) } if err := module.CheckImportPath(path); err != nil { if !allowDirPath || !modfile.IsDirectoryPath(path) { @@ -237,11 +238,11 @@ func parsePathVersionOptional(adj, arg string, allowDirPath bool) (path, version // flagEditworkReplace implements the -replace flag. func flagEditworkReplace(arg string) { - var i int - if i = strings.Index(arg, "="); i < 0 { + before, after, found := strings.Cut(arg, "=") + if !found { base.Fatalf("go: -replace=%s: need old[@v]=new[@w] (missing =)", arg) } - old, new := strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:]) + old, new := strings.TrimSpace(before), strings.TrimSpace(after) if strings.HasPrefix(new, ">") { base.Fatalf("go: -replace=%s: separator between old and new is =, not =>", arg) } -- 2.50.0