From d036fc34ef99216e2626b9c56624cd77fa4f8e1e Mon Sep 17 00:00:00 2001 From: Jaap de Haan <261428+jdehaan@users.noreply.github.com> Date: Tue, 24 Mar 2026 22:24:51 +0000 Subject: [PATCH] refactor: use slices --- backup/cmd/config.go | 3 ++- backup/cmd/job.go | 3 ++- backup/internal/check.go | 12 ++++++------ backup/internal/config.go | 12 ++++++------ backup/internal/macros.go | 5 +++-- backup/internal/rsync.go | 3 ++- backup/internal/testutil/builder.go | 3 ++- backup/internal/testutil/job.go | 7 +++++-- 8 files changed, 28 insertions(+), 20 deletions(-) diff --git a/backup/cmd/config.go b/backup/cmd/config.go index 8fb2a6f..532e9e5 100644 --- a/backup/cmd/config.go +++ b/backup/cmd/config.go @@ -3,6 +3,7 @@ package cmd import ( "backup-rsync/backup/internal" "fmt" + "slices" "github.com/spf13/cobra" ) @@ -38,7 +39,7 @@ func buildConfigCommand() *cobra.Command { Short: "Manage configuration", } - for _, verb := range configVerbs { + for verb := range slices.Values(configVerbs) { configCmd.AddCommand(&cobra.Command{ Use: verb.use, Short: verb.short, diff --git a/backup/cmd/job.go b/backup/cmd/job.go index a2cb847..741b6c4 100644 --- a/backup/cmd/job.go +++ b/backup/cmd/job.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "log/slog" + "slices" "strings" "time" @@ -31,7 +32,7 @@ func parseSetFlags(cmd *cobra.Command) map[string]string { setFlags, _ := cmd.Flags().GetStringArray("set") overrides := make(map[string]string, len(setFlags)) - for _, s := range setFlags { + for s := range slices.Values(setFlags) { key, value, ok := strings.Cut(s, "=") if ok { overrides[key] = value diff --git a/backup/internal/check.go b/backup/internal/check.go index 48884b0..d6ebbd1 100644 --- a/backup/internal/check.go +++ b/backup/internal/check.go @@ -17,8 +17,8 @@ type CoverageChecker struct { } func (c *CoverageChecker) IsExcludedGlobally(path string, mappings []Mapping) bool { - for _, mapping := range mappings { - for _, exclusion := range mapping.Exclusions { + for mapping := range slices.Values(mappings) { + for exclusion := range slices.Values(mapping.Exclusions) { exclusionPath := filepath.Join(mapping.Source, exclusion) if strings.HasPrefix(NormalizePath(path), exclusionPath) { c.Logger.Info(fmt.Sprintf("EXCLUDED: Path '%s' is globally excluded by '%s' in source '%s'", @@ -37,7 +37,7 @@ func (c *CoverageChecker) ListUncoveredPaths(cfg Config) []string { seen := make(map[string]bool) - for _, mapping := range cfg.Mappings { + for mapping := range slices.Values(cfg.Mappings) { c.checkPath(mapping.Source, cfg.Mappings, &result, seen) } @@ -71,7 +71,7 @@ func (c *CoverageChecker) isCoveredByJob(path string, job Job) bool { } func (c *CoverageChecker) isCovered(path string, mappings []Mapping) bool { - for _, mapping := range mappings { + for mapping := range slices.Values(mappings) { if slices.ContainsFunc(mapping.Jobs, func(job Job) bool { return c.isCoveredByJob(path, job) }) { @@ -137,7 +137,7 @@ func (c *CoverageChecker) isEffectivelyCovered(path string, mappings []Mapping) allCovered := true - for _, child := range children { + for child := range slices.Values(children) { covered := c.IsExcludedGlobally(child, mappings) || c.isCovered(child, mappings) || c.isEffectivelyCovered(child, mappings) if !covered { @@ -162,7 +162,7 @@ func getChildDirectories(fs afero.Fs, path string) ([]string, error) { return nil, fmt.Errorf("failed to read directory '%s': %w", path, err) } - for _, info := range fileInfos { + for info := range slices.Values(fileInfos) { if info.IsDir() { children = append(children, filepath.Join(path, info.Name())) } diff --git a/backup/internal/config.go b/backup/internal/config.go index 205d830..2fdd984 100644 --- a/backup/internal/config.go +++ b/backup/internal/config.go @@ -55,7 +55,7 @@ type Config struct { // AllJobs returns a flat list of all jobs across all mappings. func (cfg Config) AllJobs() []Job { var jobs []Job - for _, m := range cfg.Mappings { + for m := range slices.Values(cfg.Mappings) { jobs = append(jobs, m.Jobs...) } @@ -83,7 +83,7 @@ func (cfg Config) Apply(rsync JobCommand, logger *slog.Logger) error { counts := make(map[JobStatus]int) allJobs := cfg.AllJobs() - for _, job := range allJobs { + for job := range slices.Values(allJobs) { status := job.Apply(rsync) rsync.ReportJobStatus(job.Name, status, logger) counts[status]++ @@ -240,7 +240,7 @@ func ValidateJobNames(jobs []Job) error { nameSet := make(map[string]bool) - for _, job := range jobs { + for job := range slices.Values(jobs) { if nameSet[job.Name] { invalidNames = append(invalidNames, "duplicate job name: "+job.Name) } else { @@ -288,7 +288,7 @@ func ValidateTemplateVars(cfg Config) error { var missing []string - for _, v := range cfg.Template.Variables { + for v := range slices.Values(cfg.Template.Variables) { if _, ok := cfg.Variables[v]; !ok { missing = append(missing, v) } @@ -321,7 +321,7 @@ func loadTemplateConfig(templatePath string) (Config, error) { } func expandIncludes(cfg *Config, configDir string) error { - for _, inc := range cfg.Include { + for inc := range slices.Values(cfg.Include) { templatePath := inc.Uses if !filepath.IsAbs(templatePath) { templatePath = filepath.Join(configDir, templatePath) @@ -357,7 +357,7 @@ func expandIncludes(cfg *Config, configDir string) error { } func mergeOverrides(cfg Config, overrides []map[string]string) Config { - for _, override := range overrides { + for override := range slices.Values(overrides) { if cfg.Variables == nil { cfg.Variables = make(map[string]string) } diff --git a/backup/internal/macros.go b/backup/internal/macros.go index 1540439..78bd1df 100644 --- a/backup/internal/macros.go +++ b/backup/internal/macros.go @@ -3,6 +3,7 @@ package internal import ( "errors" "fmt" + "slices" "strings" "unicode" ) @@ -210,7 +211,7 @@ func findInnermostMacro(input string) (int, int, string, string, bool) { func ValidateNoUnresolvedMacros(cfg Config) error { var errs []error - for _, mapping := range cfg.Mappings { + for mapping := range slices.Values(cfg.Mappings) { for _, field := range []struct { name, value string }{ @@ -224,7 +225,7 @@ func ValidateNoUnresolvedMacros(cfg Config) error { } } - for _, job := range mapping.Jobs { + for job := range slices.Values(mapping.Jobs) { for _, field := range []struct { name, value string }{ diff --git a/backup/internal/rsync.go b/backup/internal/rsync.go index cd17ec5..52c1f36 100644 --- a/backup/internal/rsync.go +++ b/backup/internal/rsync.go @@ -7,6 +7,7 @@ import ( "log/slog" "os" "path/filepath" + "slices" "strings" ) @@ -120,7 +121,7 @@ func ArgumentsForJob(job Job, logPath string, simulate bool) []string { args = append(args, "--log-file="+logPath) } - for _, excl := range job.Exclusions { + for excl := range slices.Values(job.Exclusions) { args = append(args, "--exclude="+excl) } diff --git a/backup/internal/testutil/builder.go b/backup/internal/testutil/builder.go index b596416..af106df 100644 --- a/backup/internal/testutil/builder.go +++ b/backup/internal/testutil/builder.go @@ -2,6 +2,7 @@ package testutil import ( "fmt" + "slices" "strings" ) @@ -66,7 +67,7 @@ func (b *ConfigBuilder) AddJobToMapping(name, source, target string, opts ...Job } job := jobDef{name: name, source: source, target: target} - for _, opt := range opts { + for opt := range slices.Values(opts) { opt(&job) } diff --git a/backup/internal/testutil/job.go b/backup/internal/testutil/job.go index 7f357a6..f8391d0 100644 --- a/backup/internal/testutil/job.go +++ b/backup/internal/testutil/job.go @@ -1,6 +1,9 @@ package testutil -import "backup-rsync/backup/internal" +import ( + "backup-rsync/backup/internal" + "slices" +) // TestJobOpt configures a test Job struct. type TestJobOpt func(*internal.Job) @@ -17,7 +20,7 @@ func NewTestJob(opts ...TestJobOpt) internal.Job { Exclusions: []string{"*.tmp"}, } - for _, opt := range opts { + for opt := range slices.Values(opts) { opt(&job) }