diff options
author | Éric Araujo <merwok@netwok.org> | 2010-08-14 02:30:34 (GMT) |
---|---|---|
committer | Éric Araujo <merwok@netwok.org> | 2010-08-14 02:30:34 (GMT) |
commit | da668ff24fc7d959ad2938f128281dcc49d168d8 (patch) | |
tree | c3472aa284598314ea66b2319d744bf4d9ef6b53 | |
parent | e406ef41b162698478df3f7a000999debb7135f7 (diff) | |
download | cpython-da668ff24fc7d959ad2938f128281dcc49d168d8.zip cpython-da668ff24fc7d959ad2938f128281dcc49d168d8.tar.gz cpython-da668ff24fc7d959ad2938f128281dcc49d168d8.tar.bz2 |
Use a marker in generated MANIFEST files, don't touch files without it. Fixes #8688.
-rw-r--r-- | Doc/distutils/sourcedist.rst | 13 | ||||
-rw-r--r-- | Lib/distutils/command/sdist.py | 17 | ||||
-rw-r--r-- | Lib/distutils/tests/test_sdist.py | 36 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
4 files changed, 61 insertions, 9 deletions
diff --git a/Doc/distutils/sourcedist.rst b/Doc/distutils/sourcedist.rst index b829f1d..8a083a2 100644 --- a/Doc/distutils/sourcedist.rst +++ b/Doc/distutils/sourcedist.rst @@ -103,6 +103,10 @@ per line, regular files (or symlinks to them) only. If you do supply your own :file:`MANIFEST`, you must specify everything: the default set of files described above does not apply in this case. +.. versionadded:: 3.2 + :file:`MANIFEST` files start with a comment indicated they are generated. + Files without this comment are not overwritten or removed. + The manifest template has one command per line, where each command specifies a set of files to include or exclude from the source distribution. For an example, again we turn to the Distutils' own manifest template:: @@ -187,10 +191,6 @@ The normal course of operations for the :command:`sdist` command is as follows: * if neither :file:`MANIFEST` nor :file:`MANIFEST.in` exist, create a manifest with just the default file set -* if either :file:`MANIFEST.in` or the setup script (:file:`setup.py`) are more - recent than :file:`MANIFEST`, recreate :file:`MANIFEST` by reading - :file:`MANIFEST.in` - * use the list of files now in :file:`MANIFEST` (either just generated or read in) to create the source distribution archive(s) @@ -205,4 +205,7 @@ distribution:: :option:`-o` is a shortcut for :option:`--manifest-only`. - +.. versionchanged:: 3.2 + An existing generated :file:`MANIFEST` will be regenerated without + :command:`sdist` comparing its modification time to the one of + :file:`MANIFEST.in` or :file:`setup.py`. diff --git a/Lib/distutils/command/sdist.py b/Lib/distutils/command/sdist.py index f51d72f..818a452 100644 --- a/Lib/distutils/command/sdist.py +++ b/Lib/distutils/command/sdist.py @@ -335,8 +335,21 @@ class sdist(Command): by 'add_defaults()' and 'read_template()') to the manifest file named by 'self.manifest'. """ - self.execute(file_util.write_file, - (self.manifest, self.filelist.files), + if os.path.isfile(self.manifest): + fp = open(self.manifest) + try: + first_line = fp.readline() + finally: + fp.close() + + if first_line != '# file GENERATED by distutils, do NOT edit\n': + log.info("not writing to manually maintained " + "manifest file '%s'" % self.manifest) + return + + content = self.filelist.files[:] + content.insert(0, '# file GENERATED by distutils, do NOT edit') + self.execute(file_util.write_file, (self.manifest, content), "writing manifest file '%s'" % self.manifest) def read_manifest(self): diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py index f95035d..209aa59 100644 --- a/Lib/distutils/tests/test_sdist.py +++ b/Lib/distutils/tests/test_sdist.py @@ -29,6 +29,7 @@ setup(name='fake') """ MANIFEST = """\ +# file GENERATED by distutils, do NOT edit README inroot.txt setup.py @@ -294,7 +295,7 @@ class SDistTestCase(PyPIRCCommandTestCase): finally: f.close() - self.assertEquals(len(manifest), 4) + self.assertEquals(len(manifest), 5) # adding a file self.write_file((self.tmp_dir, 'somecode', 'doc2.txt'), '#') @@ -314,9 +315,40 @@ class SDistTestCase(PyPIRCCommandTestCase): f.close() # do we have the new file in MANIFEST ? - self.assertEquals(len(manifest2), 5) + self.assertEquals(len(manifest2), 6) self.assertIn('doc2.txt', manifest2[-1]) + def test_manifest_marker(self): + # check that autogenerated MANIFESTs have a marker + dist, cmd = self.get_cmd() + 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.assertEqual(manifest[0], + '# file GENERATED by distutils, do NOT edit') + + def test_manual_manifest(self): + # check that a MANIFEST without a marker is left alone + dist, cmd = self.get_cmd() + cmd.ensure_finalized() + self.write_file((self.tmp_dir, cmd.manifest), 'README.manual') + cmd.run() + + f = open(cmd.manifest) + try: + manifest = [line.strip() for line in f.read().split('\n') + if line.strip() != ''] + finally: + f.close() + + self.assertEqual(manifest, ['README.manual']) def test_suite(): return unittest.makeSuite(SDistTestCase) @@ -83,6 +83,10 @@ Extensions Library ------- +- Issue #8688: MANIFEST files created by distutils now include a magic + comment indicating they are generated. Manually maintained MANIFESTs + without this marker will not be overwritten or removed. + - Issue #7467: when reading a file from a ZIP archive, its CRC is checked and a BadZipfile error is raised if it doesn't match (as used to be the case in Python 2.5 and earlier). |