From aa8190527f29b678ec1e0e2fa2bc9a2c2af3aded Mon Sep 17 00:00:00 2001 From: Charlie Egan Date: Tue, 28 May 2024 15:34:05 +0100 Subject: [PATCH] cmd/fix: Filter files loaded for fixing This uses the same logic to filter files when loading them for fixing as used in linting. Signed-off-by: Charlie Egan --- cmd/fix.go | 8 +++++- e2e/cli_test.go | 6 +++++ pkg/fixer/fileprovider/fs.go | 32 ++++++++---------------- pkg/fixer/fixes/useassignmentoperator.go | 4 +++ 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/cmd/fix.go b/cmd/fix.go index e2422892..2a7b61ae 100644 --- a/cmd/fix.go +++ b/cmd/fix.go @@ -237,7 +237,13 @@ func fix(args []string, params *fixCommandParams) error { f := fixer.NewFixer() f.RegisterFixes(fixes.NewDefaultFixes()...) - fileProvider := fileprovider.NewFSFileProvider(args...) + ignore := userConfig.Ignore.Files + + if len(params.ignoreFiles.v) > 0 { + ignore = params.ignoreFiles.v + } + + fileProvider := fileprovider.NewFSFileProvider(ignore, args...) fixReport, err := f.Fix(ctx, &l, fileProvider) if err != nil { diff --git a/e2e/cli_test.go b/e2e/cli_test.go index 6092d1fd..21bdfa1c 100644 --- a/e2e/cli_test.go +++ b/e2e/cli_test.go @@ -751,6 +751,12 @@ allow if { t.Fatalf("failed to write main.rego: %v", err) } + unrelatedFileContents := []byte(`foobar`) + err = os.WriteFile(filepath.Join(td, "unrelated.txt"), unrelatedFileContents, 0o644) + if err != nil { + t.Fatalf("failed to write unrelated.txt: %v", err) + } + err = regal(&stdout, &stderr)("fix", td) // 0 exit status is expected as all violations should have been fixed diff --git a/pkg/fixer/fileprovider/fs.go b/pkg/fixer/fileprovider/fs.go index 155a34d5..6ab7fb93 100644 --- a/pkg/fixer/fileprovider/fs.go +++ b/pkg/fixer/fileprovider/fs.go @@ -3,45 +3,33 @@ package fileprovider import ( "fmt" "os" - "path/filepath" "github.com/open-policy-agent/opa/ast" "github.com/styrainc/regal/internal/parse" + "github.com/styrainc/regal/pkg/config" "github.com/styrainc/regal/pkg/rules" ) type FSFileProvider struct { - roots []string + roots []string + ignore []string } -func NewFSFileProvider(roots ...string) *FSFileProvider { +func NewFSFileProvider(ignore []string, roots ...string) *FSFileProvider { return &FSFileProvider{ - roots: roots, + roots: roots, + ignore: ignore, } } func (p *FSFileProvider) ListFiles() ([]string, error) { - var files []string - - for _, root := range p.roots { - err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if !info.IsDir() { - files = append(files, path) - } - - return nil - }) - if err != nil { - return nil, fmt.Errorf("failed to list files: %w", err) - } + filtered, err := config.FilterIgnoredPaths(p.roots, p.ignore, true, "") + if err != nil { + return nil, fmt.Errorf("failed to filter ignored paths: %w", err) } - return files, nil + return filtered, nil } func (*FSFileProvider) GetFile(file string) ([]byte, error) { diff --git a/pkg/fixer/fixes/useassignmentoperator.go b/pkg/fixer/fixes/useassignmentoperator.go index 7b8b06f3..0b7e34f3 100644 --- a/pkg/fixer/fixes/useassignmentoperator.go +++ b/pkg/fixer/fixes/useassignmentoperator.go @@ -28,6 +28,10 @@ func (*UseAssignmentOperator) Fix(fc *FixCandidate, opts *RuntimeOptions) ([]Fix line := lines[loc.Row-1] + if loc.Col-1 < 0 || loc.Col-1 >= len(line) { + continue + } + // unexpected character at location column, skipping if line[loc.Col-1] != byte('=') { continue