Avoid recursive calls into SetupTools entrypoint
Add a check in pbr.core.pbr() to make sure it hasn't already run, and return immediately if it has. This replaces the earlier attempt at loop-busting by setting the entrypoint to None in the dist, in order to support PEP 517 builds without setup_requires. Also test that pbr.json is now included in the dist tree, in order to avoid future regressions. Change-Id: I407ae88ab8de4b61f94034b3d79a2ca7f7d79d16
This commit is contained in:
parent
397b6fcdf9
commit
949c47c979
23
pbr/core.py
23
pbr/core.py
@ -61,6 +61,11 @@ else:
|
|||||||
integer_types = (int, long) # noqa
|
integer_types = (int, long) # noqa
|
||||||
|
|
||||||
|
|
||||||
|
# We use this canary to detect whether the module has already been called,
|
||||||
|
# in order to avoid recursion
|
||||||
|
in_use = False
|
||||||
|
|
||||||
|
|
||||||
def pbr(dist, attr, value):
|
def pbr(dist, attr, value):
|
||||||
"""Implements the actual pbr setup() keyword.
|
"""Implements the actual pbr setup() keyword.
|
||||||
|
|
||||||
@ -81,6 +86,16 @@ def pbr(dist, attr, value):
|
|||||||
not work well with distributions that do use a `Distribution` subclass.
|
not work well with distributions that do use a `Distribution` subclass.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# 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
|
||||||
|
# this canary so we don't repeat ourselves.
|
||||||
|
global in_use
|
||||||
|
if in_use:
|
||||||
|
return
|
||||||
|
in_use = True
|
||||||
|
|
||||||
if not value:
|
if not value:
|
||||||
return
|
return
|
||||||
if isinstance(value, string_type):
|
if isinstance(value, string_type):
|
||||||
@ -130,14 +145,6 @@ def pbr(dist, attr, value):
|
|||||||
msg = 'Unknown distribution option: %s' % repr(key)
|
msg = 'Unknown distribution option: %s' % repr(key)
|
||||||
warnings.warn(msg)
|
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
|
# Re-finalize the underlying Distribution
|
||||||
try:
|
try:
|
||||||
super(dist.__class__, dist).finalize_options()
|
super(dist.__class__, dist).finalize_options()
|
||||||
|
@ -381,6 +381,12 @@ class TestPackagingWheels(base.BaseTestCase):
|
|||||||
wheel_file.extractall(self.extracted_wheel_dir)
|
wheel_file.extractall(self.extracted_wheel_dir)
|
||||||
wheel_file.close()
|
wheel_file.close()
|
||||||
|
|
||||||
|
def test_metadata_directory_has_pbr_json(self):
|
||||||
|
# Build the path to the scripts directory
|
||||||
|
pbr_json = os.path.join(
|
||||||
|
self.extracted_wheel_dir, 'pbr_testpackage-0.0.dist-info/pbr.json')
|
||||||
|
self.assertTrue(os.path.exists(pbr_json))
|
||||||
|
|
||||||
def test_data_directory_has_wsgi_scripts(self):
|
def test_data_directory_has_wsgi_scripts(self):
|
||||||
# Build the path to the scripts directory
|
# Build the path to the scripts directory
|
||||||
scripts_dir = os.path.join(
|
scripts_dir = os.path.join(
|
||||||
|
Loading…
Reference in New Issue
Block a user