From 78be386f0a6c2cc0805b949a2d249087d40b6e58 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 2 Jan 2023 11:33:52 -0500 Subject: [PATCH] fix: relative_files should keep relative path maps. #1519 --- CHANGES.rst | 5 +++++ coverage/files.py | 13 +++++++++---- tests/test_files.py | 5 +++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 352ddb656..fa83063d5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,6 +20,10 @@ development at the same time, such as 4.5.x and 5.0. Unreleased ---------- +- Fix: when using the ``[run] relative_files = True`` setting, a relative + ``[paths]`` pattern was still being made absolute. This is now fixed, + closing `issue 1519`_. + - Fix: if Python doesn't provide tomllib, then TOML configuration files can only be read if coverage.py is installed with the ``[toml]`` extra. Coverage.py will raise an error if toml support is not installed when it sees @@ -41,6 +45,7 @@ Unreleased .. _issue 1515: https://github.com/nedbat/coveragepy/issues/1515 .. _issue 1516: https://github.com/nedbat/coveragepy/issues/1516 +.. _issue 1519: https://github.com/nedbat/coveragepy/issues/1519 .. _changes_7-0-1: diff --git a/coverage/files.py b/coverage/files.py index ed37067fe..11dbdaa3e 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -395,7 +395,11 @@ class PathAliases: map a path through those aliases to produce a unified path. """ - def __init__(self, debugfn:Optional[Callable[[str], None]]=None, relative:bool=False) -> None: + def __init__( + self, + debugfn: Optional[Callable[[str], None]]=None, + relative: bool=False, + ) -> None: # A list of (original_pattern, regex, result) self.aliases: List[Tuple[str, Regex, str]] = [] self.debugfn = debugfn or (lambda msg: 0) @@ -431,10 +435,11 @@ def add(self, pattern: str, result: str) -> None: if pattern.endswith("*"): raise ConfigError("Pattern must not end with wildcards.") - # The pattern is meant to match a filepath. Let's make it absolute + # The pattern is meant to match a file path. Let's make it absolute # unless it already is, or is meant to match any prefix. - if not pattern.startswith('*') and not isabs_anywhere(pattern + pattern_sep): - pattern = abs_file(pattern) + if not self.relative: + if not pattern.startswith('*') and not isabs_anywhere(pattern + pattern_sep): + pattern = abs_file(pattern) if not pattern.endswith(pattern_sep): pattern += pattern_sep diff --git a/tests/test_files.py b/tests/test_files.py index 54c916287..67c926541 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -418,6 +418,11 @@ def test_no_dotslash(self, rel_yn): # Because the map result has no slash, the actual result is os-dependent. self.assert_mapped(aliases, '/ned/home/project/src/a.py', f'src{os.sep}a.py') + def test_relative_pattern(self): + aliases = PathAliases(relative=True) + aliases.add(".tox/*/site-packages", "src") + self.assert_mapped(aliases, ".tox/py314/site-packages/proj/a.py", "src/proj/a.py") + def test_multiple_patterns(self, rel_yn): # also test the debugfn... msgs = []