[core] Fix srcFilter exclusions being silently ignored on Windows (#17648)

This commit is contained in:
Brandon Harvey
2026-07-21 08:18:15 +12:00
committed by Jesse Hills
parent 7afe7750cd
commit cd40fb1c68
2 changed files with 49 additions and 0 deletions
+6
View File
@@ -292,6 +292,12 @@ def collect_filtered_files(src_dir: PathType, src_filters: list[str]) -> list[st
for root, _, files in os.walk(item):
matched.extend([str(Path(root) / f) for f in files])
# glob keeps the pattern's literal separators for non-wildcard path
# components, so on Windows the same file can surface with different
# separators depending on where the wildcards sit; normalize so the
# include/exclude set operations below compare equal paths.
matched = [os.path.normpath(m) for m in matched]
# FILTER_REGEX only ever captures "+" or "-", so the else is the "-" case.
if sign == "+":
selected.update(matched)
+43
View File
@@ -1,3 +1,4 @@
import glob
import hashlib
import json
import os
@@ -86,6 +87,48 @@ def test_collect_filtered_files_exclude(tmp_path):
assert str(f2) not in result
def test_collect_filtered_files_exclude_pattern_in_subdir(tmp_path):
src = tmp_path / "lib" / "src"
src.mkdir(parents=True)
kept = src / "a.c"
excluded = src / "hasty.c"
kept.write_text("int a;")
excluded.write_text("int b;")
result = collect_filtered_files(tmp_path, ["+<lib/src/*.c>", "-<lib/src/hasty.c>"])
assert str(kept) in result
assert str(excluded) not in result
def test_collect_filtered_files_exclude_unnormalized_glob_output(tmp_path, monkeypatch):
# On Windows, glob keeps the pattern's literal separators for non-wildcard
# path components, so the "+" wildcard pattern and the "-" literal pattern
# yield the same file spelled differently and the exclude set difference
# misses it. Backslash is a regular filename character on POSIX (such paths
# fail the final is_file filter), so reproduce the unnormalized-output
# mismatch portably with dot segments, which normpath also collapses.
src = tmp_path / "lib" / "src"
src.mkdir(parents=True)
kept = src / "a.c"
excluded = src / "hasty.c"
kept.write_text("int a;")
excluded.write_text("int b;")
real_glob = glob.glob
def unnormalized_glob(pattern, recursive=False):
if "*" in pattern:
base = str(tmp_path)
return [base + "/lib/./src/a.c", base + "/lib/./src/hasty.c"]
return real_glob(pattern, recursive=recursive)
monkeypatch.setattr(glob, "glob", unnormalized_glob)
result = collect_filtered_files(tmp_path, ["+<lib/src/*.c>", "-<lib/src/hasty.c>"])
assert [Path(r).name for r in result] == ["a.c"]
assert str(kept) in result
def test_split_list_by_condition():
items = ["-Iinclude", "-Llib", "-Wall"]