From 256fc898f764b86a0aacae738b1c9c69705aa206 Mon Sep 17 00:00:00 2001 From: JinWang An Date: Mon, 27 Mar 2023 17:02:37 +0900 Subject: [PATCH] Imported Upstream version 58.5.0 --- .bumpversion.cfg | 2 +- CHANGES.rst | 17 ++++++++++++++--- bootstrap.egg-info/entry_points.txt | 4 ++++ setup.cfg | 2 +- setuptools/command/build_py.py | 10 ++++++++++ setuptools/command/egg_info.py | 12 ++++++++++++ setuptools/command/sdist.py | 13 ++++++++----- setuptools/tests/test_sdist.py | 22 ++++++++++++++++++++++ 8 files changed, 72 insertions(+), 10 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 095e606..1f0b2d3 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 58.4.0 +current_version = 58.5.0 commit = True tag = True diff --git a/CHANGES.rst b/CHANGES.rst index 89e525c..26b8d67 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,14 @@ +v58.5.0 +------- + + +Changes +^^^^^^^ +* #1461: Fix inconsistency with ``include_package_data`` and ``packages_data`` in sdist + by replacing the loop breaking mechanism between the ``sdist`` and + ``egg_info`` commands -- by :user:`abravalheri` + + v58.4.0 ------- @@ -8,9 +19,9 @@ Changes Documentation changes ^^^^^^^^^^^^^^^^^^^^^ -* #2932: Removed the deprecated ``data_files`` option from the example in the +* #2832: Removed the deprecated ``data_files`` option from the example in the declarative configuration docs -- by :user:`abravalheri` -* #2932: Change type of ``data_files`` option from ``dict`` to ``section`` in +* #2832: Change type of ``data_files`` option from ``dict`` to ``section`` in declarative configuration docs (to match previous example) -- by :user:`abravalheri` @@ -21,7 +32,7 @@ v58.3.0 Changes ^^^^^^^ -* #917: ``setup.py install`` and ``easy_install`` commands are now officially deprecated. Use other standards-based installers (like pip) and builders (like build). Workloads reliant on this behavior should pin to this major version of Setuptools. +* #917: ``setup.py install`` and ``easy_install`` commands are now officially deprecated. Use other standards-based installers (like pip) and builders (like build). Workloads reliant on this behavior should pin to this major version of Setuptools. See `Why you shouldn't invoke setup.py directly `_ for more background. * #1988: Deprecated the ``bdist_rpm`` command. Binary packages should be built as wheels instead. -- by :user:`hugovk` * #2785: Replace ``configparser``'s ``readfp`` with ``read_file``, deprecated since Python 3.2. diff --git a/bootstrap.egg-info/entry_points.txt b/bootstrap.egg-info/entry_points.txt index 834d674..c00d1d3 100644 --- a/bootstrap.egg-info/entry_points.txt +++ b/bootstrap.egg-info/entry_points.txt @@ -1,11 +1,15 @@ [distutils.commands] egg_info = setuptools.command.egg_info:egg_info +build_py = setuptools.command.build_py:build_py +sdist = setuptools.command.sdist:sdist [distutils.setup_keywords] include_package_data = setuptools.dist:assert_bool install_requires = setuptools.dist:check_requirements extras_require = setuptools.dist:check_extras entry_points = setuptools.dist:check_entry_points +exclude_package_data = setuptools.dist:check_package_data +namespace_packages = setuptools.dist:check_nsp [egg_info.writers] PKG-INFO = setuptools.command.egg_info:write_pkg_info diff --git a/setup.cfg b/setup.cfg index 50622cc..6ce5448 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = setuptools -version = 58.4.0 +version = 58.5.0 author = Python Packaging Authority author_email = distutils-sig@python.org description = Easily download, build, install, upgrade, and uninstall Python packages diff --git a/setuptools/command/build_py.py b/setuptools/command/build_py.py index 6a61543..c3fdc09 100644 --- a/setuptools/command/build_py.py +++ b/setuptools/command/build_py.py @@ -67,6 +67,16 @@ class build_py(orig.build_py): self.analyze_manifest() return list(map(self._get_pkg_data_files, self.packages or ())) + def get_data_files_without_manifest(self): + """ + Generate list of ``(package,src_dir,build_dir,filenames)`` tuples, + but without triggering any attempt to analyze or build the manifest. + """ + # Prevent eventual errors from unset `manifest_files` + # (that would otherwise be set by `analyze_manifest`) + self.__dict__.setdefault('manifest_files', {}) + return list(map(self._get_pkg_data_files, self.packages or ())) + def _get_pkg_data_files(self, package): # Locate package source directory src_dir = self.get_package_dir(package) diff --git a/setuptools/command/egg_info.py b/setuptools/command/egg_info.py index 18b8134..4165c35 100644 --- a/setuptools/command/egg_info.py +++ b/setuptools/command/egg_info.py @@ -608,6 +608,18 @@ class manifest_maker(sdist): self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, is_regex=1) + def _safe_data_files(self, build_py): + """ + The parent class implementation of this method + (``sdist``) will try to include data files, which + might cause recursion problems when + ``include_package_data=True``. + + Therefore, avoid triggering any attempt of + analyzing/building the manifest again. + """ + return build_py.get_data_files_without_manifest() + def write_file(filename, contents): """Create a file with the specified name and write 'contents' (a diff --git a/setuptools/command/sdist.py b/setuptools/command/sdist.py index e8062f2..0285b69 100644 --- a/setuptools/command/sdist.py +++ b/setuptools/command/sdist.py @@ -114,12 +114,15 @@ class sdist(sdist_add_defaults, orig.sdist): def _safe_data_files(self, build_py): """ - Extracting data_files from build_py is known to cause - infinite recursion errors when `include_package_data` - is enabled, so suppress it in that case. + Since the ``sdist`` class is also used to compute the MANIFEST + (via :obj:`setuptools.command.egg_info.manifest_maker`), + there might be recursion problems when trying to obtain the list of + data_files and ``include_package_data=True`` (which in turn depends on + the files included in the MANIFEST). + + To avoid that, ``manifest_maker`` should be able to overwrite this + method and avoid recursive attempts to build/analyze the MANIFEST. """ - if self.distribution.include_package_data: - return () return build_py.data_files def _add_data_files(self, data_files): diff --git a/setuptools/tests/test_sdist.py b/setuptools/tests/test_sdist.py index 049fdcc..34c32bb 100644 --- a/setuptools/tests/test_sdist.py +++ b/setuptools/tests/test_sdist.py @@ -126,6 +126,28 @@ class TestSdistTest: assert os.path.join('sdist_test', 'c.rst') not in manifest assert os.path.join('d', 'e.dat') in manifest + def test_package_data_and_include_package_data_in_sdist(self): + """ + Ensure package_data and include_package_data work + together. + """ + setup_attrs = {**SETUP_ATTRS, 'include_package_data': True} + assert setup_attrs['package_data'] + + dist = Distribution(setup_attrs) + dist.script_name = 'setup.py' + cmd = sdist(dist) + cmd.ensure_finalized() + + with quiet(): + cmd.run() + + manifest = cmd.filelist.files + assert os.path.join('sdist_test', 'a.txt') in manifest + assert os.path.join('sdist_test', 'b.txt') in manifest + assert os.path.join('sdist_test', 'c.rst') not in manifest + assert os.path.join('d', 'e.dat') in manifest + def test_setup_py_exists(self): dist = Distribution(SETUP_ATTRS) dist.script_name = 'foo.py' -- 2.34.1