Jason R. Coombs committed 13205a6 Draft Merge

Merged in embray/distribute/fix-sdist (pull request #4)

Comments (0)

Files changed (3)


         include_package_data = True
-This tells setuptools to install any data files it finds in your packages.  The
-data files must be under CVS or Subversion control, or else they must be
+This tells setuptools to install any data files it finds in your packages.
+The data files must be under CVS or Subversion control, or else they must be
 specified via the distutils' ```` file.  (They can also be tracked
 by another revision control system, using an appropriate plugin.  See the
 section below on `Adding Support for Other Revision Control Systems`_ for
 information on how to write such plugins.)
-If you want finer-grained control over what files are included (for example, if
-you have documentation files in your package directories and want to exclude
-them from installation), then you can also use the ``package_data`` keyword,
+If the data files are not under version control, or are not in a supported
+version control system, or if you want finer-grained control over what files
+are included (for example, if you have documentation files in your package
+directories and want to exclude them from installation), then you can also use
+the ``package_data`` keyword, e.g.::
     from setuptools import setup, find_packages
 (Note: although the ``package_data`` argument was previously only available in
 ``setuptools``, it was also added to the Python ``distutils`` package as of
 Python 2.4; there is `some documentation for the feature`__ available on the website.) website.  If using the setuptools-specific ``include_package_data``
+argument, files specified by ``package_data`` will *not* be automatically
+added to the manifest unless they are tracked by a supported version control
+system, or are listed in the file.)


         if self.distribution.has_pure_modules():
             build_py = self.get_finalized_command('build_py')
+            # This functionality is incompatible with include_package_data, and
+            # will in fact create an infinite recursion if include_package_data
+            # is True.  Use of include_package_data will imply that
+            # distutils-style automatic handling of package_data is disabled
+            if not self.distribution.include_package_data:
+                for _, src_dir, _, filenames in build_py.data_files:
+                    self.filelist.extend([os.path.join(src_dir, filename)
+                                          for filename in filenames])
         if self.distribution.has_ext_modules():
             build_ext = self.get_finalized_command('build_ext')


+"""sdist tests"""
+import os
+import shutil
+import sys
+import tempfile
+import unittest
+from StringIO import StringIO
+from setuptools.command.sdist import sdist
+from setuptools.dist import Distribution
+    'name': 'sdist_test',
+    'version': '0.0',
+    'packages': ['sdist_test'],
+    'package_data': {'sdist_test': ['*.txt']}
+SETUP_PY = """\
+from setuptools import setup
+class TestSdistTest(unittest.TestCase):
+    def setUp(self):
+        self.temp_dir = tempfile.mkdtemp()
+        f = open(os.path.join(self.temp_dir, ''), 'w')
+        f.write(SETUP_PY)
+        f.close()
+        # Set up the rest of the test package
+        test_pkg = os.path.join(self.temp_dir, 'sdist_test')
+        os.mkdir(test_pkg)
+        # *.rst was not included in package_data, so c.rst should not be
+        # automatically added to the manifest when not under version control
+        for fname in ['', 'a.txt', 'b.txt', 'c.rst']:
+            # Just touch the files; their contents are irrelevant
+            open(os.path.join(test_pkg, fname), 'w').close()
+        self.old_cwd = os.getcwd()
+        os.chdir(self.temp_dir)
+    def tearDown(self):
+        os.chdir(self.old_cwd)
+        shutil.rmtree(self.temp_dir)
+    def test_package_data_in_sdist(self):
+        """Regression test for pull request #4: ensures that files listed in
+        package_data are included in the manifest even if they're not added to
+        version control.
+        """
+        dist = Distribution(SETUP_ATTRS)
+        dist.script_name = ''
+        cmd = sdist(dist)
+        cmd.ensure_finalized()
+        # squelch output
+        old_stdout = sys.stdout
+        old_stderr = sys.stderr
+        sys.stdout = StringIO()
+        sys.stderr = StringIO()
+        try:
+        finally:
+            sys.stdout = old_stdout
+            sys.stderr = old_stderr
+        manifest = cmd.filelist.files
+        self.assert_(os.path.join('sdist_test', 'a.txt') in manifest)
+        self.assert_(os.path.join('sdist_test', 'b.txt') in manifest)
+        self.assert_(os.path.join('sdist_test', 'c.rst') not in manifest)