diff --git a/pr_agent/algo/file_filter.py b/pr_agent/algo/file_filter.py index fb40cfda..cc466f57 100644 --- a/pr_agent/algo/file_filter.py +++ b/pr_agent/algo/file_filter.py @@ -8,15 +8,24 @@ def filter_ignored(files): Filter out files that match the ignore patterns. """ - # load regex patterns, and translate glob patterns to regex - patterns = get_settings().ignore.regex - patterns += [fnmatch.translate(glob) for glob in get_settings().ignore.glob] + try: + # load regex patterns, and translate glob patterns to regex + patterns = get_settings().ignore.regex + patterns += [fnmatch.translate(glob) for glob in get_settings().ignore.glob] - # compile regex patterns - compiled_patterns = [re.compile(r) for r in patterns] + # compile all valid patterns + compiled_patterns = [] + for r in patterns: + try: + compiled_patterns.append(re.compile(r)) + except re.error: + pass - # keep filenames that _don't_ match the ignore regex - for r in compiled_patterns: - files = [f for f in files if not r.match(f.filename)] + # keep filenames that _don't_ match the ignore regex + for r in compiled_patterns: + files = [f for f in files if not r.match(f.filename)] + + except Exception as e: + print(f"Could not filter file list: {e}") return files diff --git a/tests/unittest/test_file_filter.py b/tests/unittest/test_file_filter.py index 4856fbb4..43e9c9b4 100644 --- a/tests/unittest/test_file_filter.py +++ b/tests/unittest/test_file_filter.py @@ -14,7 +14,7 @@ class TestIgnoreFilter: type('', (object,), {'filename': 'file4.py'})(), type('', (object,), {'filename': 'file5.py'})() ] - assert filter_ignored(files) == files + assert filter_ignored(files) == files, "Expected all files to be returned when no ignore patterns are given." def test_glob_ignores(self, monkeypatch): """ @@ -57,3 +57,24 @@ class TestIgnoreFilter: filtered_files = filter_ignored(files) assert filtered_files == expected, f"Expected {[file.filename for file in expected]}, but got {[file.filename for file in filtered_files]}." + + def test_invalid_regex(self, monkeypatch): + """ + Test invalid patterns are quietly ignored. + """ + monkeypatch.setattr(global_settings.ignore, 'regex', ['(((||', '^file[2-4]\..*$']) + + files = [ + type('', (object,), {'filename': 'file1.py'})(), + type('', (object,), {'filename': 'file2.java'})(), + type('', (object,), {'filename': 'file3.cpp'})(), + type('', (object,), {'filename': 'file4.py'})(), + type('', (object,), {'filename': 'file5.py'})() + ] + expected = [ + files[0], + files[4] + ] + + filtered_files = filter_ignored(files) + assert filtered_files == expected, f"Expected {[file.filename for file in expected]}, but got {[file.filename for file in filtered_files]}."