summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorÉric Araujo <aeric@mtlpy.org>2012-12-09 03:53:43 (GMT)
committerÉric Araujo <aeric@mtlpy.org>2012-12-09 03:53:43 (GMT)
commit3f7c0e403606f7e888442048ac71cb8f391e8d83 (patch)
treeb9bd563ea0facf995a395d22b9c8ad043648ba5e
parentf93ed3fa67260fa0023a1360a37ab7e320550455 (diff)
parent24457c9ad375239aca9bd176284d1e4f181e02f4 (diff)
downloadcpython-3f7c0e403606f7e888442048ac71cb8f391e8d83.zip
cpython-3f7c0e403606f7e888442048ac71cb8f391e8d83.tar.gz
cpython-3f7c0e403606f7e888442048ac71cb8f391e8d83.tar.bz2
Merge fixes for #13614, #13512 and #7719 from 3.2
-rw-r--r--Doc/distutils/apiref.rst6
-rw-r--r--Doc/library/abc.rst6
-rw-r--r--Doc/library/io.rst2
-rw-r--r--Doc/library/sys.rst2
-rw-r--r--Lib/distutils/command/check.py3
-rw-r--r--Lib/distutils/config.py11
-rw-r--r--Lib/distutils/dir_util.py4
-rw-r--r--Lib/distutils/tests/test_dir_util.py21
-rw-r--r--Lib/distutils/tests/test_register.py34
-rw-r--r--Lib/distutils/tests/test_sdist.py7
-rw-r--r--Misc/ACKS3
-rw-r--r--Misc/NEWS9
12 files changed, 74 insertions, 34 deletions
diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst
index 71702e5..106cc52 100644
--- a/Doc/distutils/apiref.rst
+++ b/Doc/distutils/apiref.rst
@@ -992,6 +992,12 @@ directories.
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.3.1
+ 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
index db3adbd..6f23596 100644
--- a/Doc/library/abc.rst
+++ b/Doc/library/abc.rst
@@ -129,7 +129,7 @@ This module provides the following class:
The :mod:`abc` module also provides the following decorators:
-.. decorator:: abstractmethod(function)
+.. decorator:: abstractmethod
A decorator indicating abstract methods.
@@ -203,7 +203,7 @@ The :mod:`abc` module also provides the following decorators:
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`.
@@ -224,7 +224,7 @@ The :mod:`abc` module also provides the following decorators:
:func:`abstractmethod`, making this decorator redundant.
-.. 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
index 810e56f..98e0358 100644
--- a/Doc/library/io.rst
+++ b/Doc/library/io.rst
@@ -232,7 +232,7 @@ I/O Base Classes
Note that calling any method (even inquiries) on a closed stream is
undefined. Implementations may raise :exc:`ValueError` in this case.
- :class:`IOBase` (and its subclasses) support the iterator protocol, meaning
+ :class:`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
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index 73914e3..93273c4 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -833,7 +833,7 @@ always available.
For other systems, the values are:
================ ===========================
- System :data:`platform` value
+ System ``platform`` value
================ ===========================
Linux ``'linux'``
Windows ``'win32'``
diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py
index b67c795..22b9349 100644
--- a/Lib/distutils/command/check.py
+++ b/Lib/distutils/command/check.py
@@ -23,6 +23,9 @@ try:
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
index 5b625f3..1fd5334 100644
--- a/Lib/distutils/config.py
+++ b/Lib/distutils/config.py
@@ -4,7 +4,6 @@ Provides the PyPIRCCommand class, the base class for the command classes
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 @@ class PyPIRCCommand(Command):
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
index 30daf49..2826ff8 100644
--- a/Lib/distutils/dir_util.py
+++ b/Lib/distutils/dir_util.py
@@ -141,6 +141,10 @@ def copy_tree(src, dst, preserve_mode=1, preserve_times=1,
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
index ce74589..1589f12 100644
--- a/Lib/distutils/tests/test_dir_util.py
+++ b/Lib/distutils/tests/test_dir_util.py
@@ -76,7 +76,6 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase):
remove_tree(self.root_target, verbose=0)
-
def test_copy_tree_verbosity(self):
mkpath(self.target, verbose=0)
@@ -88,11 +87,8 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase):
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 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase):
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
index 5863ae1..a86b860 100644
--- 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 test.support import check_warnings, run_unittest
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 @@ class RegisterTestCase(PyPIRCCommandTestCase):
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 @@ class RegisterTestCase(PyPIRCCommandTestCase):
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 @@ class RegisterTestCase(PyPIRCCommandTestCase):
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@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
index 1ba2a1a..e6359d6 100644
--- a/Lib/distutils/tests/test_sdist.py
+++ b/Lib/distutils/tests/test_sdist.py
@@ -83,9 +83,8 @@ class SDistTestCase(PyPIRCCommandTestCase):
@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 @@ class SDistTestCase(PyPIRCCommandTestCase):
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
index 1fe98c9..b200044 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -242,6 +242,7 @@ David Costanzo
Scott Cotton
Greg Couch
David Cournapeau
+Julien Courteau
Steve Cousins
Alex Coventry
Matthew Dixon Cowles
@@ -564,6 +565,7 @@ Julien Jehannet
Drew Jenkins
Flemming Kjær Jensen
Philip H. Jensen
+Philip Jenvey
MunSic Jeong
Chris Jerdonek
Jim Jewett
@@ -685,6 +687,7 @@ John J. Lee
Thomas Lee
Tennessee Leeuwenburg
Luc Lefebvre
+Pierre Paul Lefebvre
Glyph Lefkowitz
Vincent Legoll
Kip Lehman
diff --git a/Misc/NEWS b/Misc/NEWS
index b26d20b..f9b8c37 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -110,6 +110,15 @@ Library
- 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.