[Python-checkins] cpython (merge 3.2 -> 3.2): Branch merge

eric.araujo python-checkins at python.org
Sun Dec 9 04:57:27 CET 2012


http://hg.python.org/cpython/rev/ffb64a074b66
changeset:   80772:ffb64a074b66
branch:      3.2
parent:      80759:0748c22b37e5
parent:      80771:99c80e8a721e
user:        Éric Araujo <aeric at mtlpy.org>
date:        Sat Dec 08 22:47:03 2012 -0500
summary:
  Branch merge

files:
  Doc/distutils/apiref.rst             |   6 ++
  Doc/library/abc.rst                  |   6 +-
  Doc/library/io.rst                   |   2 +-
  Doc/library/sys.rst                  |   2 +-
  Lib/distutils/command/check.py       |   3 +
  Lib/distutils/config.py              |  11 +----
  Lib/distutils/dir_util.py            |   4 +
  Lib/distutils/tests/test_dir_util.py |  21 +++++++--
  Lib/distutils/tests/test_register.py |  34 ++++++++++-----
  Lib/distutils/tests/test_sdist.py    |   7 +-
  Misc/ACKS                            |   3 +
  Misc/NEWS                            |   9 ++++
  12 files changed, 74 insertions(+), 34 deletions(-)


diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst
--- a/Doc/distutils/apiref.rst
+++ b/Doc/distutils/apiref.rst
@@ -992,6 +992,12 @@
    destination of the symlink will be copied.  *update* and *verbose* are the same
    as for :func:`copy_file`.
 
+   Files in *src* that begin with :file:`.nfs` are skipped (more information on
+   these files is available in answer D2 of the `NFS FAQ page
+   <http://nfs.sourceforge.net/#section_d>`_.
+
+   .. versionchanged:: 3.2.4
+      NFS files are ignored.
 
 .. function:: remove_tree(directory[, verbose=0, dry_run=0])
 
diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst
--- a/Doc/library/abc.rst
+++ b/Doc/library/abc.rst
@@ -126,7 +126,7 @@
 
 It also provides the following decorators:
 
-.. decorator:: abstractmethod(function)
+.. decorator:: abstractmethod
 
    A decorator indicating abstract methods.
 
@@ -161,7 +161,7 @@
       multiple-inheritance.
 
 
-.. decorator:: abstractclassmethod(function)
+.. decorator:: abstractclassmethod
 
    A subclass of the built-in :func:`classmethod`, indicating an abstract
    classmethod. Otherwise it is similar to :func:`abstractmethod`.
@@ -176,7 +176,7 @@
    .. versionadded:: 3.2
 
 
-.. decorator:: abstractstaticmethod(function)
+.. decorator:: abstractstaticmethod
 
    A subclass of the built-in :func:`staticmethod`, indicating an abstract
    staticmethod. Otherwise it is similar to :func:`abstractmethod`.
diff --git a/Doc/library/io.rst b/Doc/library/io.rst
--- a/Doc/library/io.rst
+++ b/Doc/library/io.rst
@@ -236,7 +236,7 @@
    Note that calling any method (even inquiries) on a closed stream is
    undefined.  Implementations may raise :exc:`IOError` in this case.
 
-   IOBase (and its subclasses) support the iterator protocol, meaning that an
+   IOBase (and its subclasses) supports the iterator protocol, meaning that an
    :class:`IOBase` object can be iterated over yielding the lines in a stream.
    Lines are defined slightly differently depending on whether the stream is
    a binary stream (yielding bytes), or a text stream (yielding character
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -739,7 +739,7 @@
    For other systems, the values are:
 
    ====================== ===========================
-   System                 :data:`platform` value
+   System                 ``platform`` value
    ====================== ===========================
    Linux (2.x *and* 3.x)  ``'linux2'``
    Windows                ``'win32'``
diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py
--- a/Lib/distutils/command/check.py
+++ b/Lib/distutils/command/check.py
@@ -23,6 +23,9 @@
 
         def system_message(self, level, message, *children, **kwargs):
             self.messages.append((level, message, children, kwargs))
+            return nodes.system_message(message, level=level,
+                                        type=self.levels[level],
+                                        *children, **kwargs)
 
     HAS_DOCUTILS = True
 except Exception:
diff --git a/Lib/distutils/config.py b/Lib/distutils/config.py
--- a/Lib/distutils/config.py
+++ b/Lib/distutils/config.py
@@ -4,7 +4,6 @@
 that uses .pypirc in the distutils.command package.
 """
 import os
-import sys
 from configparser import ConfigParser
 
 from distutils.cmd import Command
@@ -43,16 +42,8 @@
     def _store_pypirc(self, username, password):
         """Creates a default .pypirc file."""
         rc = self._get_rc_file()
-        f = open(rc, 'w')
-        try:
+        with os.fdopen(os.open(rc, os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f:
             f.write(DEFAULT_PYPIRC % (username, password))
-        finally:
-            f.close()
-        try:
-            os.chmod(rc, 0o600)
-        except OSError:
-            # should do something better here
-            pass
 
     def _read_pypirc(self):
         """Reads the .pypirc file."""
diff --git a/Lib/distutils/dir_util.py b/Lib/distutils/dir_util.py
--- a/Lib/distutils/dir_util.py
+++ b/Lib/distutils/dir_util.py
@@ -141,6 +141,10 @@
         src_name = os.path.join(src, n)
         dst_name = os.path.join(dst, n)
 
+        if n.startswith('.nfs'):
+            # skip NFS rename files
+            continue
+
         if preserve_symlinks and os.path.islink(src_name):
             link_dest = os.readlink(src_name)
             if verbose >= 1:
diff --git a/Lib/distutils/tests/test_dir_util.py b/Lib/distutils/tests/test_dir_util.py
--- a/Lib/distutils/tests/test_dir_util.py
+++ b/Lib/distutils/tests/test_dir_util.py
@@ -76,7 +76,6 @@
 
         remove_tree(self.root_target, verbose=0)
 
-
     def test_copy_tree_verbosity(self):
 
         mkpath(self.target, verbose=0)
@@ -88,11 +87,8 @@
 
         mkpath(self.target, verbose=0)
         a_file = os.path.join(self.target, 'ok.txt')
-        f = open(a_file, 'w')
-        try:
+        with open(a_file, 'w') as f:
             f.write('some content')
-        finally:
-            f.close()
 
         wanted = ['copying %s -> %s' % (a_file, self.target2)]
         copy_tree(self.target, self.target2, verbose=1)
@@ -101,6 +97,21 @@
         remove_tree(self.root_target, verbose=0)
         remove_tree(self.target2, verbose=0)
 
+    def test_copy_tree_skips_nfs_temp_files(self):
+        mkpath(self.target, verbose=0)
+
+        a_file = os.path.join(self.target, 'ok.txt')
+        nfs_file = os.path.join(self.target, '.nfs123abc')
+        for f in a_file, nfs_file:
+            with open(f, 'w') as fh:
+                fh.write('some content')
+
+        copy_tree(self.target, self.target2)
+        self.assertEqual(os.listdir(self.target2), ['ok.txt'])
+
+        remove_tree(self.root_target, verbose=0)
+        remove_tree(self.target2, verbose=0)
+
     def test_ensure_relative(self):
         if os.sep == '/':
             self.assertEqual(ensure_relative('/home/foo'), 'home/foo')
diff --git a/Lib/distutils/tests/test_register.py b/Lib/distutils/tests/test_register.py
--- a/Lib/distutils/tests/test_register.py
+++ b/Lib/distutils/tests/test_register.py
@@ -1,5 +1,4 @@
 """Tests for distutils.command.register."""
-import sys
 import os
 import unittest
 import getpass
@@ -10,11 +9,14 @@
 
 from distutils.command import register as register_module
 from distutils.command.register import register
-from distutils.core import Distribution
 from distutils.errors import DistutilsSetupError
 
-from distutils.tests import support
-from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
+from distutils.tests.test_config import PyPIRCCommandTestCase
+
+try:
+    import docutils
+except ImportError:
+    docutils = None
 
 PYPIRC_NOPASSWORD = """\
 [distutils]
@@ -193,6 +195,7 @@
         self.assertEqual(headers['Content-length'], '290')
         self.assertTrue((b'tarek') in req.data)
 
+    @unittest.skipUnless(docutils is not None, 'needs docutils')
     def test_strict(self):
         # testing the script option
         # when on, the register command stops if
@@ -205,13 +208,6 @@
         cmd.strict = 1
         self.assertRaises(DistutilsSetupError, cmd.run)
 
-        # we don't test the reSt feature if docutils
-        # is not installed
-        try:
-            import docutils
-        except ImportError:
-            return
-
         # metadata are OK but long_description is broken
         metadata = {'url': 'xxx', 'author': 'xxx',
                     'author_email': 'éxéxé',
@@ -265,6 +261,22 @@
         finally:
             del register_module.input
 
+    @unittest.skipUnless(docutils is not None, 'needs docutils')
+    def test_register_invalid_long_description(self):
+        description = ':funkie:`str`'  # mimic Sphinx-specific markup
+        metadata = {'url': 'xxx', 'author': 'xxx',
+                    'author_email': 'xxx',
+                    'name': 'xxx', 'version': 'xxx',
+                    'long_description': description}
+        cmd = self._get_cmd(metadata)
+        cmd.ensure_finalized()
+        cmd.strict = True
+        inputs = Inputs('2', 'tarek', 'tarek at ziade.org')
+        register_module.input = inputs
+        self.addCleanup(delattr, register_module, 'input')
+
+        self.assertRaises(DistutilsSetupError, cmd.run)
+
     def test_check_metadata_deprecated(self):
         # makes sure make_metadata is deprecated
         cmd = self._get_cmd()
diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py
--- a/Lib/distutils/tests/test_sdist.py
+++ b/Lib/distutils/tests/test_sdist.py
@@ -83,9 +83,8 @@
 
     @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
     def test_prune_file_list(self):
-        # this test creates a package with some vcs dirs in it
-        # and launch sdist to make sure they get pruned
-        # on all systems
+        # this test creates a project with some VCS dirs and an NFS rename
+        # file, then launches sdist to check they get pruned on all systems
 
         # creating VCS directories with some files in them
         os.mkdir(join(self.tmp_dir, 'somecode', '.svn'))
@@ -99,6 +98,8 @@
         self.write_file((self.tmp_dir, 'somecode', '.git',
                          'ok'), 'xxx')
 
+        self.write_file((self.tmp_dir, 'somecode', '.nfs0001'), 'xxx')
+
         # now building a sdist
         dist, cmd = self.get_cmd()
 
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -222,6 +222,7 @@
 Scott Cotton
 Greg Couch
 David Cournapeau
+Julien Courteau
 Steve Cousins
 Alex Coventry
 Matthew Dixon Cowles
@@ -512,6 +513,7 @@
 Drew Jenkins
 Flemming Kjær Jensen
 Philip H. Jensen
+Philip Jenvey
 MunSic Jeong
 Chris Jerdonek
 Pedro Diaz Jimenez
@@ -620,6 +622,7 @@
 Christopher Lee
 Tennessee Leeuwenburg
 Luc Lefebvre
+Pierre Paul Lefebvre
 Glyph Lefkowitz
 Vincent Legoll
 Kip Lehman
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -181,6 +181,15 @@
 
 - Issue #16628: Fix a memory leak in ctypes.resize().
 
+- Issue #13614: Fix setup.py register failure with invalid rst in description.
+  Patch by Julien Courteau and Pierre Paul Lefebvre.
+
+- Issue #13512: Create ~/.pypirc securely (CVE-2011-4944).  Initial patch by
+  Philip Jenvey, tested by Mageia and Debian.
+
+- Issue #7719: Make distutils ignore ``.nfs*`` files instead of choking later
+  on.  Initial patch by SilentGhost and Jeff Ramnani.
+
 - Issue #13120: Allow to call pdb.set_trace() from thread.
   Patch by Ilya Sandler.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list