From 16680a4dfd5f1489c6ef986ed53a6902e1aa0a84 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Wed, 10 Sep 2025 13:11:00 -0400 Subject: [PATCH] modernize: use strings.CutPrefix/SplitSeq/FieldsSeq Use the CutPrefix(), SplitSeq(), and FieldsSeq() functions from the strings package when chopping up or iterating over parts of strings, per golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize Signed-off-by: Nalin Dahyabhai --- cmd/buildah/containers.go | 4 ++-- copier/copier.go | 10 +++++----- copier/xattrs.go | 2 +- imagebuildah/executor.go | 8 ++++---- imagebuildah/stage_executor.go | 2 +- info.go | 8 ++++---- internal/mkcw/archive.go | 2 +- internal/mkcw/attest.go | 4 ++-- pkg/cli/build.go | 2 +- pkg/parse/parse.go | 6 +++--- tests/conformance/conformance_test.go | 14 +++++++------- 11 files changed, 31 insertions(+), 31 deletions(-) diff --git a/cmd/buildah/containers.go b/cmd/buildah/containers.go index 8a5d72a9e..8ae213f0b 100644 --- a/cmd/buildah/containers.go +++ b/cmd/buildah/containers.go @@ -277,8 +277,8 @@ func containerOutputHeader(truncate bool) { func parseCtrFilter(filter string) (*containerFilterParams, error) { params := new(containerFilterParams) - filters := strings.Split(filter, ",") - for _, param := range filters { + filters := strings.SplitSeq(filter, ",") + for param := range filters { pair := strings.SplitN(param, "=", 2) if len(pair) != 2 { return nil, fmt.Errorf("incorrect filter value %q, should be of form filter=value", param) diff --git a/copier/copier.go b/copier/copier.go index 6ffe52d86..dbe7373b5 100644 --- a/copier/copier.go +++ b/copier/copier.go @@ -801,7 +801,7 @@ func copierWithSubprocess(bulkReader io.Reader, bulkWriter io.Writer, req reques } loggedOutput := strings.TrimSuffix(errorBuffer.String(), "\n") if len(loggedOutput) > 0 { - for _, output := range strings.Split(loggedOutput, "\n") { + for output := range strings.SplitSeq(loggedOutput, "\n") { logrus.Debug(output) } } @@ -1588,8 +1588,8 @@ func mapWithPrefixedKeysWithoutKeyPrefix[K any](m map[string]K, p string) map[st } cloned := make(map[string]K, len(m)) for k, v := range m { - if strings.HasPrefix(k, p) { - cloned[strings.TrimPrefix(k, p)] = v + if after, ok := strings.CutPrefix(k, p); ok { + cloned[after] = v } } return cloned @@ -1819,7 +1819,7 @@ func copierHandlerPut(bulkReader io.Reader, req request, idMappings *idtools.IDM return fmt.Errorf("%q is not a subdirectory of %q: %w", directory, req.Root, err) } subdir := "" - for _, component := range strings.Split(rel, string(os.PathSeparator)) { + for component := range strings.SplitSeq(rel, string(os.PathSeparator)) { subdir = filepath.Join(subdir, component) path := filepath.Join(req.Root, subdir) if err := os.Mkdir(path, 0o700); err == nil { @@ -2219,7 +2219,7 @@ func copierHandlerMkdir(req request, idMappings *idtools.IDMappings) (*response, subdir := "" var created []string - for _, component := range strings.Split(rel, string(os.PathSeparator)) { + for component := range strings.SplitSeq(rel, string(os.PathSeparator)) { subdir = filepath.Join(subdir, component) path := filepath.Join(req.Root, subdir) if err := os.Mkdir(path, 0o700); err == nil { diff --git a/copier/xattrs.go b/copier/xattrs.go index 2e4b944ad..73fc4b6df 100644 --- a/copier/xattrs.go +++ b/copier/xattrs.go @@ -65,7 +65,7 @@ func Lgetxattrs(path string) (map[string]string, error) { return nil, fmt.Errorf("unable to read list of attributes for %q: size would have been too big", path) } m := make(map[string]string) - for _, attribute := range strings.Split(string(list), string('\000')) { + for attribute := range strings.SplitSeq(string(list), string('\000')) { if isRelevantXattr(attribute) { attributeSize := initialXattrValueSize var attributeValue []byte diff --git a/imagebuildah/executor.go b/imagebuildah/executor.go index 904849a91..02bdde593 100644 --- a/imagebuildah/executor.go +++ b/imagebuildah/executor.go @@ -836,12 +836,12 @@ func (b *Executor) Build(ctx context.Context, stages imagebuilder.Stages) (image } case "ADD", "COPY": for _, flag := range child.Flags { // flags for this instruction - if strings.HasPrefix(flag, "--from=") { + if after, ok := strings.CutPrefix(flag, "--from="); ok { // TODO: this didn't undergo variable and // arg expansion, so if the previous stage // was named using argument values, we might // not record the right value here. - rootfs := strings.TrimPrefix(flag, "--from=") + rootfs := after b.rootfsMap[rootfs] = struct{}{} logrus.Debugf("rootfs needed for COPY in stage %d: %q", stageIndex, rootfs) // Populate dependency tree and check @@ -885,8 +885,8 @@ func (b *Executor) Build(ctx context.Context, stages imagebuilder.Stages) (image // dependency calculation. if strings.HasPrefix(flag, "--mount=") && strings.Contains(flag, "from") { mountFlags := strings.TrimPrefix(flag, "--mount=") - fields := strings.Split(mountFlags, ",") - for _, field := range fields { + fields := strings.SplitSeq(mountFlags, ",") + for field := range fields { if mountFrom, hasFrom := strings.CutPrefix(field, "from="); hasFrom { // Check if this base is a stage if yes // add base to current stage's dependency tree diff --git a/imagebuildah/stage_executor.go b/imagebuildah/stage_executor.go index 00a96bfbc..7a57d80ef 100644 --- a/imagebuildah/stage_executor.go +++ b/imagebuildah/stage_executor.go @@ -1913,7 +1913,7 @@ func (s *StageExecutor) getCreatedBy(node *parser.Node, addedContentSummary stri switch command { case "ARG": - for _, variable := range strings.Fields(node.Original) { + for variable := range strings.FieldsSeq(node.Original) { if variable != "ARG" { s.argsFromContainerfile = append(s.argsFromContainerfile, variable) } diff --git a/info.go b/info.go index 56a28429c..d0dd48932 100644 --- a/info.go +++ b/info.go @@ -183,11 +183,11 @@ func getHostDistributionInfo() map[string]string { l := bufio.NewScanner(f) for l.Scan() { - if strings.HasPrefix(l.Text(), "ID=") { - dist["Distribution"] = strings.TrimPrefix(l.Text(), "ID=") + if after, ok := strings.CutPrefix(l.Text(), "ID="); ok { + dist["Distribution"] = after } - if strings.HasPrefix(l.Text(), "VERSION_ID=") { - dist["Version"] = strings.Trim(strings.TrimPrefix(l.Text(), "VERSION_ID="), "\"") + if after, ok := strings.CutPrefix(l.Text(), "VERSION_ID="); ok { + dist["Version"] = strings.Trim(after, "\"") } } return dist diff --git a/internal/mkcw/archive.go b/internal/mkcw/archive.go index f462a8fa9..d13629865 100644 --- a/internal/mkcw/archive.go +++ b/internal/mkcw/archive.go @@ -543,7 +543,7 @@ func slop(size int64, slop string) int64 { if slop == "" { return size * 5 / 4 } - for _, factor := range strings.Split(slop, "+") { + for factor := range strings.SplitSeq(slop, "+") { factor = strings.TrimSpace(factor) if factor == "" { continue diff --git a/internal/mkcw/attest.go b/internal/mkcw/attest.go index 3b7273976..b974ca524 100644 --- a/internal/mkcw/attest.go +++ b/internal/mkcw/attest.go @@ -240,8 +240,8 @@ func GenerateMeasurement(workloadConfig WorkloadConfig, firmwareLibrary string) scanner := bufio.NewScanner(&stdout) for scanner.Scan() { line := scanner.Text() - if strings.HasPrefix(line, prefix+":") { - return strings.TrimSpace(strings.TrimPrefix(line, prefix+":")), nil + if after, ok := strings.CutPrefix(line, prefix+":"); ok { + return strings.TrimSpace(after), nil } } return "", fmt.Errorf("generating measurement: no line starting with %q found in output from krunfw_measurement", prefix+":") diff --git a/pkg/cli/build.go b/pkg/cli/build.go index bdbd1105f..9449ac883 100644 --- a/pkg/cli/build.go +++ b/pkg/cli/build.go @@ -474,7 +474,7 @@ func readBuildArgFile(buildargfile string, args map[string]string) error { if err != nil { return err } - for _, arg := range strings.Split(string(argfile), "\n") { + for arg := range strings.SplitSeq(string(argfile), "\n") { if len(arg) == 0 || arg[0] == '#' { continue } diff --git a/pkg/parse/parse.go b/pkg/parse/parse.go index 053c04347..911d5deda 100644 --- a/pkg/parse/parse.go +++ b/pkg/parse/parse.go @@ -733,7 +733,7 @@ func GetBuildOutput(buildOutput string) (define.BuildOutputOption, error) { isStdout := false typeSelected := "" pathSelected := "" - for _, option := range strings.Split(buildOutput, ",") { + for option := range strings.SplitSeq(buildOutput, ",") { key, value, found := strings.Cut(option, "=") if !found { return define.BuildOutputOption{}, fmt.Errorf("invalid build output options %q, expected format key=value", buildOutput) @@ -789,7 +789,7 @@ func GetConfidentialWorkloadOptions(arg string) (define.ConfidentialWorkloadOpti TempDir: GetTempDir(), } defaults := options - for _, option := range strings.Split(arg, ",") { + for option := range strings.SplitSeq(arg, ",") { var err error switch { case strings.HasPrefix(option, "type="): @@ -936,7 +936,7 @@ func GetAutoOptions(base string) (*storageTypes.AutoUserNsOptions, error) { if len(parts) == 1 { return &options, nil } - for _, o := range strings.Split(parts[1], ",") { + for o := range strings.SplitSeq(parts[1], ",") { v := strings.SplitN(o, "=", 2) if len(v) != 2 { return nil, fmt.Errorf("invalid option specified: %q", o) diff --git a/tests/conformance/conformance_test.go b/tests/conformance/conformance_test.go index d6a098254..45e2fa1ec 100644 --- a/tests/conformance/conformance_test.go +++ b/tests/conformance/conformance_test.go @@ -672,10 +672,10 @@ func buildUsingDocker(ctx context.Context, t *testing.T, client *docker.Client, // read the Dockerfile so that we can pull base images dockerfileContent, err := os.ReadFile(dockerfileName) require.NoErrorf(t, err, "reading dockerfile %q", dockerfileName) - for _, line := range strings.Split(string(dockerfileContent), "\n") { + for line := range strings.SplitSeq(string(dockerfileContent), "\n") { line = strings.TrimSpace(line) - if strings.HasPrefix(line, "# syntax=") { - pullImageIfMissing(t, client, strings.TrimPrefix(line, "# syntax=")) + if after, ok := strings.CutPrefix(line, "# syntax="); ok { + pullImageIfMissing(t, client, after) } } parsed, err := imagebuilder.ParseDockerfile(bytes.NewReader(dockerfileContent)) @@ -1131,8 +1131,8 @@ func applyLayerToFSTree(t *testing.T, layer *Layer, root *FSEntry) { } // if the item is a whiteout, strip the "this is a whiteout // entry" prefix and remove the item it names - if strings.HasPrefix(base, ".wh.") { - delete(dirEntry.Children, strings.TrimPrefix(base, ".wh.")) + if after, ok := strings.CutPrefix(base, ".wh."); ok { + delete(dirEntry.Children, after) continue } // if the item already exists, make sure we don't get confused @@ -1281,8 +1281,8 @@ func compareJSON(a, b map[string]any, skip []string) (missKeys, leftKeys, diffKe var nextSkip []string prefix := k + ":" for _, s := range skip { - if strings.HasPrefix(s, prefix) { - nextSkip = append(nextSkip, strings.TrimPrefix(s, prefix)) + if after, ok0 := strings.CutPrefix(s, prefix); ok0 { + nextSkip = append(nextSkip, after) } } submiss, subleft, subdiff, ok := compareJSON(v.(map[string]any), vb.(map[string]any), nextSkip)