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 {
}
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)
}
// 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)
}
// 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) {
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)
}
// 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)
}
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 {
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 {
// 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.
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)
}
}
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
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)
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 {
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)
}
} 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)
// 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) {
// 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)
}