Skip to content

Commit ddf42d7

Browse files
committed
Use _pytest.pathlib.safe_exists in get_dirs_from_args
Related to pytest-dev#11394
1 parent 28ccf47 commit ddf42d7

File tree

4 files changed

+10
-22
lines changed

4 files changed

+10
-22
lines changed

src/_pytest/config/__init__.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
from _pytest.pathlib import import_path
6060
from _pytest.pathlib import ImportMode
6161
from _pytest.pathlib import resolve_package_path
62+
from _pytest.pathlib import safe_exists
6263
from _pytest.stash import Stash
6364
from _pytest.warning_types import PytestConfigWarning
6465
from _pytest.warning_types import warn_explicit_for
@@ -562,12 +563,8 @@ def _set_initial_conftests(
562563
anchor = absolutepath(current / path)
563564

564565
# Ensure we do not break if what appears to be an anchor
565-
# is in fact a very long option (#10169).
566-
try:
567-
anchor_exists = anchor.exists()
568-
except OSError: # pragma: no cover
569-
anchor_exists = False
570-
if anchor_exists:
566+
# is in fact a very long option (#10169, #11394).
567+
if safe_exists(anchor):
571568
self._try_load_conftest(anchor, importmode, rootpath)
572569
foundanchor = True
573570
if not foundanchor:

src/_pytest/config/findpaths.py

+1-8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from _pytest.outcomes import fail
1616
from _pytest.pathlib import absolutepath
1717
from _pytest.pathlib import commonpath
18+
from _pytest.pathlib import safe_exists
1819

1920

2021
def _parse_ini_config(path: Path) -> iniconfig.IniConfig:
@@ -147,14 +148,6 @@ def get_dir_from_path(path: Path) -> Path:
147148
return path
148149
return path.parent
149150

150-
def safe_exists(path: Path) -> bool:
151-
# This can throw on paths that contain characters unrepresentable at the OS level,
152-
# or with invalid syntax on Windows (https://bugs.python.org/issue35306)
153-
try:
154-
return path.exists()
155-
except OSError:
156-
return False
157-
158151
# These look like paths but may not exist
159152
possible_paths = (
160153
absolutepath(get_file_part_from_node_id(arg))

src/_pytest/pathlib.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import atexit
22
import contextlib
3-
import errno
43
import fnmatch
54
import importlib.util
65
import itertools
@@ -780,7 +779,7 @@ def safe_exists(p: Path) -> bool:
780779
"""Like Path.exists(), but account for input arguments that might be too long (#11394)."""
781780
try:
782781
return p.exists()
783-
except OSError as e:
784-
if e.errno == errno.ENAMETOOLONG:
785-
return False
786-
raise
782+
except (ValueError, OSError):
783+
# ValueError: stat: path too long for Windows
784+
# OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect
785+
return False

testing/test_pathlib.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,6 @@ def test_safe_exists(tmp_path: Path) -> None:
688688
Path,
689689
"exists",
690690
autospec=True,
691-
side_effect=OSError(errno.EIO, "another kind of error"),
691+
side_effect=ValueError("name too long"),
692692
):
693-
with pytest.raises(OSError):
694-
_ = safe_exists(p)
693+
assert safe_exists(p) is False

0 commit comments

Comments
 (0)