summaryrefslogtreecommitdiff
path: root/coverage/files.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2022-11-30 05:12:41 -0500
committerNed Batchelder <ned@nedbatchelder.com>2022-12-01 08:54:50 -0500
commitc2e35658d8311fd2b5d1460c2cb56762d5fe0ec7 (patch)
tree6a8506c65a4bc07697d26ab5a31960a7644673e5 /coverage/files.py
parent54eb890e24713c5375cce7005f78bf2863f7f901 (diff)
downloadpython-coveragepy-git-c2e35658d8311fd2b5d1460c2cb56762d5fe0ec7.tar.gz
fix: prevent infinite recursion
If using relative file paths, and a file remapping failed, we'd get an infinite recursion.
Diffstat (limited to 'coverage/files.py')
-rw-r--r--coverage/files.py11
1 files changed, 8 insertions, 3 deletions
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