Merge pull request #7817 from bluetech/fix-testpaths-bestrelpath2
terminal: fix crash in header reporting when absolute testpaths is used
This commit is contained in:
commit
a6a7ba57e0
|
@ -0,0 +1 @@
|
||||||
|
Fixed crash in header reporting when :confval:`testpaths` is used and contains absolute paths (regression in 6.1.0).
|
|
@ -578,7 +578,10 @@ def absolutepath(path: Union[Path, str]) -> Path:
|
||||||
|
|
||||||
def commonpath(path1: Path, path2: Path) -> Optional[Path]:
|
def commonpath(path1: Path, path2: Path) -> Optional[Path]:
|
||||||
"""Return the common part shared with the other path, or None if there is
|
"""Return the common part shared with the other path, or None if there is
|
||||||
no common part."""
|
no common part.
|
||||||
|
|
||||||
|
If one path is relative and one is absolute, returns None.
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
return Path(os.path.commonpath((str(path1), str(path2))))
|
return Path(os.path.commonpath((str(path1), str(path2))))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
@ -589,13 +592,17 @@ def bestrelpath(directory: Path, dest: Path) -> str:
|
||||||
"""Return a string which is a relative path from directory to dest such
|
"""Return a string which is a relative path from directory to dest such
|
||||||
that directory/bestrelpath == dest.
|
that directory/bestrelpath == dest.
|
||||||
|
|
||||||
|
The paths must be either both absolute or both relative.
|
||||||
|
|
||||||
If no such path can be determined, returns dest.
|
If no such path can be determined, returns dest.
|
||||||
"""
|
"""
|
||||||
if dest == directory:
|
if dest == directory:
|
||||||
return os.curdir
|
return os.curdir
|
||||||
# Find the longest common directory.
|
# Find the longest common directory.
|
||||||
base = commonpath(directory, dest)
|
base = commonpath(directory, dest)
|
||||||
# Can be the case on Windows.
|
# Can be the case on Windows for two absolute paths on different drives.
|
||||||
|
# Can be the case for two relative paths without common prefix.
|
||||||
|
# Can be the case for a relative path and an absolute path.
|
||||||
if not base:
|
if not base:
|
||||||
return str(dest)
|
return str(dest)
|
||||||
reldirectory = directory.relative_to(base)
|
reldirectory = directory.relative_to(base)
|
||||||
|
|
|
@ -718,10 +718,10 @@ class TerminalReporter:
|
||||||
if config.inipath:
|
if config.inipath:
|
||||||
line += ", configfile: " + bestrelpath(config.rootpath, config.inipath)
|
line += ", configfile: " + bestrelpath(config.rootpath, config.inipath)
|
||||||
|
|
||||||
testpaths = config.getini("testpaths")
|
testpaths = config.getini("testpaths") # type: List[str]
|
||||||
if testpaths and config.args == testpaths:
|
if config.invocation_params.dir == config.rootpath and config.args == testpaths:
|
||||||
rel_paths = [bestrelpath(config.rootpath, x) for x in testpaths]
|
line += ", testpaths: {}".format(", ".join(testpaths))
|
||||||
line += ", testpaths: {}".format(", ".join(rel_paths))
|
|
||||||
result = [line]
|
result = [line]
|
||||||
|
|
||||||
plugininfo = config.pluginmanager.list_plugin_distinfo()
|
plugininfo = config.pluginmanager.list_plugin_distinfo()
|
||||||
|
|
|
@ -18,6 +18,7 @@ import pytest
|
||||||
from _pytest._io.wcwidth import wcswidth
|
from _pytest._io.wcwidth import wcswidth
|
||||||
from _pytest.config import Config
|
from _pytest.config import Config
|
||||||
from _pytest.config import ExitCode
|
from _pytest.config import ExitCode
|
||||||
|
from _pytest.monkeypatch import MonkeyPatch
|
||||||
from _pytest.pathlib import Path
|
from _pytest.pathlib import Path
|
||||||
from _pytest.pytester import Testdir
|
from _pytest.pytester import Testdir
|
||||||
from _pytest.reports import BaseReport
|
from _pytest.reports import BaseReport
|
||||||
|
@ -749,6 +750,29 @@ class TestTerminalFunctional:
|
||||||
result = testdir.runpytest("tests")
|
result = testdir.runpytest("tests")
|
||||||
result.stdout.fnmatch_lines(["rootdir: *test_header0, configfile: tox.ini"])
|
result.stdout.fnmatch_lines(["rootdir: *test_header0, configfile: tox.ini"])
|
||||||
|
|
||||||
|
def test_header_absolute_testpath(
|
||||||
|
self, testdir: Testdir, monkeypatch: MonkeyPatch
|
||||||
|
) -> None:
|
||||||
|
"""Regresstion test for #7814."""
|
||||||
|
tests = testdir.tmpdir.join("tests")
|
||||||
|
tests.ensure_dir()
|
||||||
|
testdir.makepyprojecttoml(
|
||||||
|
"""
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
testpaths = ['{}']
|
||||||
|
""".format(
|
||||||
|
tests
|
||||||
|
)
|
||||||
|
)
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines(
|
||||||
|
[
|
||||||
|
"rootdir: *absolute_testpath0, configfile: pyproject.toml, testpaths: {}".format(
|
||||||
|
tests
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def test_no_header(self, testdir):
|
def test_no_header(self, testdir):
|
||||||
testdir.tmpdir.join("tests").ensure_dir()
|
testdir.tmpdir.join("tests").ensure_dir()
|
||||||
testdir.tmpdir.join("gui").ensure_dir()
|
testdir.tmpdir.join("gui").ensure_dir()
|
||||||
|
|
Loading…
Reference in New Issue