[Python-checkins] r83992 - in python/branches/release26-maint: Lib/distutils/command/sdist.py Lib/distutils/tests/test_sdist.py Misc/NEWS

eric.araujo python-checkins at python.org
Sat Aug 14 04:07:26 CEST 2010


Author: eric.araujo
Date: Sat Aug 14 04:07:26 2010
New Revision: 83992

Log:
Revert regression from r81256 (with release manager approval, see #8688)


Modified:
   python/branches/release26-maint/Lib/distutils/command/sdist.py
   python/branches/release26-maint/Lib/distutils/tests/test_sdist.py
   python/branches/release26-maint/Misc/NEWS

Modified: python/branches/release26-maint/Lib/distutils/command/sdist.py
==============================================================================
--- python/branches/release26-maint/Lib/distutils/command/sdist.py	(original)
+++ python/branches/release26-maint/Lib/distutils/command/sdist.py	Sat Aug 14 04:07:26 2010
@@ -57,8 +57,7 @@
          "just regenerate the manifest and then stop "
          "(implies --force-manifest)"),
         ('force-manifest', 'f',
-         "forcibly regenerate the manifest and carry on as usual. "
-         "Deprecated: now the manifest is always regenerated."),
+         "forcibly regenerate the manifest and carry on as usual"),
         ('formats=', None,
          "formats for source distribution (comma-separated list)"),
         ('keep-temp', 'k',
@@ -191,34 +190,67 @@
         distribution, and put it in 'self.filelist'.  This might involve
         reading the manifest template (and writing the manifest), or just
         reading the manifest, or just using the default file set -- it all
-        depends on the user's options.
+        depends on the user's options and the state of the filesystem.
         """
-        # new behavior:
-        # the file list is recalculated everytime because
-        # even if MANIFEST.in or setup.py are not changed
-        # the user might have added some files in the tree that
-        # need to be included.
-        #
-        #  This makes --force the default and only behavior.
-        template_exists = os.path.isfile(self.template)
-        if not template_exists:
-            self.warn(("manifest template '%s' does not exist " +
-                        "(using default file list)") %
-                        self.template)
-        self.filelist.findall()
-
-        if self.use_defaults:
-            self.add_defaults()
 
+        # If we have a manifest template, see if it's newer than the
+        # manifest; if so, we'll regenerate the manifest.
+        template_exists = os.path.isfile(self.template)
         if template_exists:
-            self.read_template()
+            template_newer = dep_util.newer(self.template, self.manifest)
 
-        if self.prune:
-            self.prune_file_list()
+        # The contents of the manifest file almost certainly depend on the
+        # setup script as well as the manifest template -- so if the setup
+        # script is newer than the manifest, we'll regenerate the manifest
+        # from the template.  (Well, not quite: if we already have a
+        # manifest, but there's no template -- which will happen if the
+        # developer elects to generate a manifest some other way -- then we
+        # can't regenerate the manifest, so we don't.)
+        self.debug_print("checking if %s newer than %s" %
+                         (self.distribution.script_name, self.manifest))
+        setup_newer = dep_util.newer(self.distribution.script_name,
+                                     self.manifest)
+
+        # cases:
+        #   1) no manifest, template exists: generate manifest
+        #      (covered by 2a: no manifest == template newer)
+        #   2) manifest & template exist:
+        #      2a) template or setup script newer than manifest:
+        #          regenerate manifest
+        #      2b) manifest newer than both:
+        #          do nothing (unless --force or --manifest-only)
+        #   3) manifest exists, no template:
+        #      do nothing (unless --force or --manifest-only)
+        #   4) no manifest, no template: generate w/ warning ("defaults only")
+
+        manifest_outofdate = (template_exists and
+                              (template_newer or setup_newer))
+        force_regen = self.force_manifest or self.manifest_only
+        manifest_exists = os.path.isfile(self.manifest)
+        neither_exists = (not template_exists and not manifest_exists)
+
+        # Regenerate the manifest if necessary (or if explicitly told to)
+        if manifest_outofdate or neither_exists or force_regen:
+            if not template_exists:
+                self.warn(("manifest template '%s' does not exist " +
+                           "(using default file list)") %
+                          self.template)
+            self.filelist.findall()
+
+            if self.use_defaults:
+                self.add_defaults()
+            if template_exists:
+                self.read_template()
+            if self.prune:
+                self.prune_file_list()
+
+            self.filelist.sort()
+            self.filelist.remove_duplicates()
+            self.write_manifest()
 
-        self.filelist.sort()
-        self.filelist.remove_duplicates()
-        self.write_manifest()
+        # Don't regenerate the manifest, just read it in.
+        else:
+            self.read_manifest()
 
     # get_file_list ()
 

Modified: python/branches/release26-maint/Lib/distutils/tests/test_sdist.py
==============================================================================
--- python/branches/release26-maint/Lib/distutils/tests/test_sdist.py	(original)
+++ python/branches/release26-maint/Lib/distutils/tests/test_sdist.py	Sat Aug 14 04:07:26 2010
@@ -29,7 +29,6 @@
         super(sdistTestCase, self).setUp()
         self.old_path = os.getcwd()
         self.temp_pkg = os.path.join(self.mkdtemp(), 'temppkg')
-        self.tmp_dir = self.mkdtemp()
 
     def tearDown(self):
         os.chdir(self.old_path)
@@ -152,67 +151,6 @@
         self.assertEquals(result,
                 ['fake-1.0.tar', 'fake-1.0.tar.gz'])
 
-    def get_cmd(self, metadata=None):
-        """Returns a cmd"""
-        if metadata is None:
-            metadata = {'name': 'fake', 'version': '1.0',
-                        'url': 'xxx', 'author': 'xxx',
-                        'author_email': 'xxx'}
-        dist = Distribution(metadata)
-        dist.script_name = 'setup.py'
-        dist.packages = ['somecode']
-        dist.include_package_data = True
-        cmd = sdist(dist)
-        cmd.dist_dir = 'dist'
-        def _warn(*args):
-            pass
-        cmd.warn = _warn
-        return dist, cmd
-
-    def test_get_file_list(self):
-        # make sure MANIFEST is recalculated
-        dist, cmd = self.get_cmd()
-
-        os.chdir(self.tmp_dir)
-
-        # filling data_files by pointing files in package_data
-        os.mkdir(os.path.join(self.tmp_dir, 'somecode'))
-        self.write_file((self.tmp_dir, 'somecode', '__init__.py'), '#')
-        self.write_file((self.tmp_dir, 'somecode', 'one.py'), '#')
-        cmd.ensure_finalized()
-        cmd.run()
-
-        f = open(cmd.manifest)
-        try:
-            manifest = [line.strip() for line in f.read().split('\n')
-                        if line.strip() != '']
-        finally:
-            f.close()
-
-        self.assertEquals(len(manifest), 2)
-
-        # adding a file
-        self.write_file((self.tmp_dir, 'somecode', 'two.py'), '#')
-
-        # make sure build_py is reinitinialized, like a fresh run
-        build_py = dist.get_command_obj('build_py')
-        build_py.finalized = False
-        build_py.ensure_finalized()
-
-        cmd.run()
-
-        f = open(cmd.manifest)
-        try:
-            manifest2 = [line.strip() for line in f.read().split('\n')
-                         if line.strip() != '']
-        finally:
-            f.close()
-
-        # do we have the new file in MANIFEST ?
-        self.assertEquals(len(manifest2), 3)
-        self.assert_('two.py' in manifest2[-1])
-
-
 def test_suite():
     return unittest.makeSuite(sdistTestCase)
 

Modified: python/branches/release26-maint/Misc/NEWS
==============================================================================
--- python/branches/release26-maint/Misc/NEWS	(original)
+++ python/branches/release26-maint/Misc/NEWS	Sat Aug 14 04:07:26 2010
@@ -12,6 +12,9 @@
 Library
 -------
 
+- Issue #8688: Revert regression introduced in 2.6.6rc1 (making Distutils
+  recalculate MANIFEST every time).
+
 - Issue #5798: Handle select.poll flag oddities properly on OS X.
   This fixes test_asynchat and test_smtplib failures on OS X.
 


More information about the Python-checkins mailing list