Merge pull request #3771 from nicoddemus/package-infinite-recursion-bug

Fix infinite recursion collection bug with pytest_ignore_collect hook
This commit is contained in:
Bruno Oliveira 2018-08-06 10:09:31 -03:00 committed by GitHub
commit e723069165
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 17 additions and 3 deletions

View File

@ -0,0 +1 @@
Fix infinite recursion during collection if a ``pytest_ignore_collect`` returns ``False`` instead of ``None``.

View File

@ -561,7 +561,7 @@ class Package(Module):
def _recurse(self, path):
ihook = self.gethookproxy(path.dirpath())
if ihook.pytest_ignore_collect(path=path, config=self.config):
return
return False
for pat in self._norecursepatterns:
if path.check(fnmatch=pat):
return False
@ -594,9 +594,12 @@ class Package(Module):
return path in self.session._initialpaths
def collect(self):
path = self.fspath.dirpath()
this_path = self.fspath.dirpath()
pkg_prefix = None
for path in path.visit(fil=lambda x: 1, rec=self._recurse, bf=True, sort=True):
for path in this_path.visit(rec=self._recurse, bf=True, sort=True):
# we will visit our own __init__.py file, in which case we skip it
if path.basename == "__init__.py" and path.dirpath() == this_path:
continue
if pkg_prefix and pkg_prefix in path.parts():
continue
for x in self._collectfile(path):

View File

@ -0,0 +1,2 @@
def pytest_ignore_collect(path):
return False

View File

@ -0,0 +1,2 @@
def test():
pass

View File

@ -1577,3 +1577,9 @@ def test_keep_duplicates(testdir):
)
result = testdir.runpytest("--keep-duplicates", a.strpath, a.strpath)
result.stdout.fnmatch_lines(["*collected 2 item*"])
def test_package_collection_infinite_recursion(testdir):
testdir.copy_example("collect/package_infinite_recursion")
result = testdir.runpytest()
result.stdout.fnmatch_lines("*1 passed*")