From c2e35658d8311fd2b5d1460c2cb56762d5fe0ec7 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 30 Nov 2022 05:12:41 -0500 Subject: fix: prevent infinite recursion If using relative file paths, and a file remapping failed, we'd get an infinite recursion. --- coverage/files.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'coverage/files.py') diff --git a/coverage/files.py b/coverage/files.py index 14d696b6..63e9afb2 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -452,15 +452,20 @@ class PathAliases: # If we get here, no pattern matched. if self.relative and not isabs_anywhere(path): + # Auto-generate a pattern to implicitly match relative files parts = re.split(r"[/\\]", path) if len(parts) > 1: dir1 = parts[0] pattern = f"*/{dir1}" regex = rf"^(.*[\\/])?{re.escape(dir1)}[\\/]" result = f"{dir1}{os.sep}" - self.debugfn(f"Generating rule: {pattern!r} -> {result!r} using regex {regex!r}") - self.aliases.append((pattern, re.compile(regex), result)) - return self.map(path, exists=exists) + # Only add a new pattern if we don't already have this pattern. + if not any(p == pattern for p, _, _ in self.aliases): + self.debugfn( + f"Generating rule: {pattern!r} -> {result!r} using regex {regex!r}" + ) + self.aliases.append((pattern, re.compile(regex), result)) + return self.map(path, exists=exists) self.debugfn(f"No rules match, path {path!r} is unchanged") return path -- cgit v1.2.1