From dc48d27937d4eb0ec5072b97dce54e7556618f8e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 10 Apr 2021 09:50:01 -0400 Subject: [PATCH] fix: make TreeMatcher right for case-sensitive worlds --- coverage/files.py | 6 ++++-- tests/test_files.py | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/coverage/files.py b/coverage/files.py index 59b2bd61d..1cf4b18e6 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -216,17 +216,19 @@ class TreeMatcher(object): """ def __init__(self, paths): - self.paths = list(paths) + self.original_paths = list(paths) + self.paths = list(map(os.path.normcase, paths)) def __repr__(self): return "" % self.paths def info(self): """A list of strings for displaying when dumping state.""" - return self.paths + return self.original_paths def match(self, fpath): """Does `fpath` indicate a file in one of our trees?""" + fpath = os.path.normcase(fpath) for p in self.paths: if fpath.startswith(p): if fpath == p: diff --git a/tests/test_files.py b/tests/test_files.py index 512e42945..2f1bb83bf 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -151,16 +151,21 @@ def assertMatches(self, matcher, filepath, matches): assert matches == matcher.match(canonical), msg def test_tree_matcher(self): + case_folding = env.WINDOWS matches_to_try = [ (self.make_file("sub/file1.py"), True), (self.make_file("sub/file2.c"), True), (self.make_file("sub2/file3.h"), False), (self.make_file("sub3/file4.py"), True), (self.make_file("sub3/file5.c"), False), + (self.make_file("sub4/File5.py"), case_folding), + (self.make_file("sub5/file6.py"), case_folding), ] trees = [ files.canonical_filename("sub"), files.canonical_filename("sub3/file4.py"), + files.canonical_filename("sub4/file5.py"), + files.canonical_filename("SUB5/file6.py"), ] tm = TreeMatcher(trees) assert tm.info() == trees