Allow PEP517 without setup_requires

When using PBR PEP517 support without setup_requires were were
infinitely recursing because Distribution.finalize_options calls pbr()
and pbr() calls Distribution.finalize_options. With a setup_requires
this doesn't seem to happen because something is resetting dist.pbr's
value from True (callable) to None (not callable) after the initial
pbr() call and before further recursion can occur.

Explicitly enforce this behavior in pbr() via an explicit update of
dist.pbr to None to avoid calling pbr() more than once resulting in the
unwanted loop.

Change-Id: I1f2b4d34e587389f7e11b99d000e14477cf5091b
This commit is contained in:
Clark Boylan 2021-11-12 09:16:04 -08:00
parent d21c2caf1d
commit de0c717b17
2 changed files with 14 additions and 1 deletions

View File

@ -130,6 +130,14 @@ def pbr(dist, attr, value):
msg = 'Unknown distribution option: %s' % repr(key)
warnings.warn(msg)
# Distribution.finalize_options() is what calls this method. That means
# there is potential for recursion here. Recursion seems to be an issue
# particularly when using PEP517 build-system configs without
# setup_requires in setup.py. We can avoid the recursion by setting
# dist.pbr to a None value as the corresponding entrypoint (this function)
# will only be called on a non None value.
setattr(dist, "pbr", None)
# Re-finalize the underlying Distribution
try:
super(dist.__class__, dist).finalize_options()

View File

@ -930,7 +930,12 @@ class TestPEP517Support(base.BaseTestCase):
sphinx
iso8601
"""),
# Use default PBR test setup.py.
# Override default setup.py to remove setup_requires.
'setup.py': textwrap.dedent("""\
#!/usr/bin/env python
import setuptools
setuptools.setup(pbr=True)
"""),
'setup.cfg': textwrap.dedent("""\
[metadata]
name = test_pep517