Commit 64aa49d0 authored by Éric Araujo's avatar Éric Araujo

Merged revisions 83993 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r83993 | eric.araujo | 2010-08-14 04:30:34 +0200 (sam., 14 août 2010) | 2 lines

  Use a marker in generated MANIFEST files, don't touch files without it. Fixes #8688.
........
parent 7f2893f4
...@@ -162,6 +162,10 @@ This mechanism can be used when the default list of files is not enough. ...@@ -162,6 +162,10 @@ This mechanism can be used when the default list of files is not enough.
Principle Principle
--------- ---------
.. versionadded:: 2.7
: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 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 set of files to include or exclude from the source distribution. For an
example, let's look at the Distutils' own manifest template:: example, let's look at the Distutils' own manifest template::
...@@ -268,3 +272,7 @@ character, and ``[range]`` matches any of the characters in *range* (e.g., ...@@ -268,3 +272,7 @@ character, and ``[range]`` matches any of the characters in *range* (e.g.,
character" is platform-specific: on Unix it is anything except slash; on Windows character" is platform-specific: on Unix it is anything except slash; on Windows
anything except backslash or colon. anything except backslash or colon.
.. versionchanged:: 2.7
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`.
...@@ -349,8 +349,21 @@ class sdist(Command): ...@@ -349,8 +349,21 @@ class sdist(Command):
by 'add_defaults()' and 'read_template()') to the manifest file by 'add_defaults()' and 'read_template()') to the manifest file
named by 'self.manifest'. named by 'self.manifest'.
""" """
self.execute(file_util.write_file, if os.path.isfile(self.manifest):
(self.manifest, self.filelist.files), 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) "writing manifest file '%s'" % self.manifest)
def read_manifest(self): def read_manifest(self):
......
...@@ -45,6 +45,7 @@ setup(name='fake') ...@@ -45,6 +45,7 @@ setup(name='fake')
""" """
MANIFEST = """\ MANIFEST = """\
# file GENERATED by distutils, do NOT edit
README README
inroot.txt inroot.txt
setup.py setup.py
...@@ -364,7 +365,7 @@ class SDistTestCase(PyPIRCCommandTestCase): ...@@ -364,7 +365,7 @@ class SDistTestCase(PyPIRCCommandTestCase):
finally: finally:
f.close() f.close()
self.assertEquals(len(manifest), 4) self.assertEquals(len(manifest), 5)
# adding a file # adding a file
self.write_file((self.tmp_dir, 'somecode', 'doc2.txt'), '#') self.write_file((self.tmp_dir, 'somecode', 'doc2.txt'), '#')
...@@ -384,9 +385,40 @@ class SDistTestCase(PyPIRCCommandTestCase): ...@@ -384,9 +385,40 @@ class SDistTestCase(PyPIRCCommandTestCase):
f.close() f.close()
# do we have the new file in MANIFEST ? # do we have the new file in MANIFEST ?
self.assertEquals(len(manifest2), 5) self.assertEquals(len(manifest2), 6)
self.assertIn('doc2.txt', manifest2[-1]) 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(): def test_suite():
return unittest.makeSuite(SDistTestCase) return unittest.makeSuite(SDistTestCase)
......
...@@ -29,6 +29,10 @@ Core and Builtins ...@@ -29,6 +29,10 @@ Core and Builtins
Library 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 - 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 and a BadZipfile error is raised if it doesn't match (as used to be the
case in Python 2.5 and earlier). case in Python 2.5 and earlier).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment