mirror of https://github.com/python/cpython.git
commit
bb7da03f6e
|
@ -992,6 +992,12 @@ directories.
|
||||||
destination of the symlink will be copied. *update* and *verbose* are the same
|
destination of the symlink will be copied. *update* and *verbose* are the same
|
||||||
as for :func:`copy_file`.
|
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])
|
.. function:: remove_tree(directory[, verbose=0, dry_run=0])
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,7 @@ This module provides the following class:
|
||||||
|
|
||||||
The :mod:`abc` module also provides the following decorators:
|
The :mod:`abc` module also provides the following decorators:
|
||||||
|
|
||||||
.. decorator:: abstractmethod(function)
|
.. decorator:: abstractmethod
|
||||||
|
|
||||||
A decorator indicating abstract methods.
|
A decorator indicating abstract methods.
|
||||||
|
|
||||||
|
@ -203,7 +203,7 @@ The :mod:`abc` module also provides the following decorators:
|
||||||
multiple-inheritance.
|
multiple-inheritance.
|
||||||
|
|
||||||
|
|
||||||
.. decorator:: abstractclassmethod(function)
|
.. decorator:: abstractclassmethod
|
||||||
|
|
||||||
A subclass of the built-in :func:`classmethod`, indicating an abstract
|
A subclass of the built-in :func:`classmethod`, indicating an abstract
|
||||||
classmethod. Otherwise it is similar to :func:`abstractmethod`.
|
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.
|
:func:`abstractmethod`, making this decorator redundant.
|
||||||
|
|
||||||
|
|
||||||
.. decorator:: abstractstaticmethod(function)
|
.. decorator:: abstractstaticmethod
|
||||||
|
|
||||||
A subclass of the built-in :func:`staticmethod`, indicating an abstract
|
A subclass of the built-in :func:`staticmethod`, indicating an abstract
|
||||||
staticmethod. Otherwise it is similar to :func:`abstractmethod`.
|
staticmethod. Otherwise it is similar to :func:`abstractmethod`.
|
||||||
|
|
|
@ -232,7 +232,7 @@ I/O Base Classes
|
||||||
Note that calling any method (even inquiries) on a closed stream is
|
Note that calling any method (even inquiries) on a closed stream is
|
||||||
undefined. Implementations may raise :exc:`ValueError` in this case.
|
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
|
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. Lines are defined slightly differently depending on whether the
|
||||||
stream is a binary stream (yielding bytes), or a text stream (yielding
|
stream is a binary stream (yielding bytes), or a text stream (yielding
|
||||||
|
|
|
@ -833,7 +833,7 @@ always available.
|
||||||
For other systems, the values are:
|
For other systems, the values are:
|
||||||
|
|
||||||
================ ===========================
|
================ ===========================
|
||||||
System :data:`platform` value
|
System ``platform`` value
|
||||||
================ ===========================
|
================ ===========================
|
||||||
Linux ``'linux'``
|
Linux ``'linux'``
|
||||||
Windows ``'win32'``
|
Windows ``'win32'``
|
||||||
|
|
|
@ -23,6 +23,9 @@ def __init__(self, source, report_level, halt_level, stream=None,
|
||||||
|
|
||||||
def system_message(self, level, message, *children, **kwargs):
|
def system_message(self, level, message, *children, **kwargs):
|
||||||
self.messages.append((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
|
HAS_DOCUTILS = True
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
that uses .pypirc in the distutils.command package.
|
that uses .pypirc in the distutils.command package.
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
|
|
||||||
from distutils.cmd import Command
|
from distutils.cmd import Command
|
||||||
|
@ -43,16 +42,8 @@ def _get_rc_file(self):
|
||||||
def _store_pypirc(self, username, password):
|
def _store_pypirc(self, username, password):
|
||||||
"""Creates a default .pypirc file."""
|
"""Creates a default .pypirc file."""
|
||||||
rc = self._get_rc_file()
|
rc = self._get_rc_file()
|
||||||
f = open(rc, 'w')
|
with os.fdopen(os.open(rc, os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f:
|
||||||
try:
|
|
||||||
f.write(DEFAULT_PYPIRC % (username, password))
|
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):
|
def _read_pypirc(self):
|
||||||
"""Reads the .pypirc file."""
|
"""Reads the .pypirc file."""
|
||||||
|
|
|
@ -141,6 +141,10 @@ def copy_tree(src, dst, preserve_mode=1, preserve_times=1,
|
||||||
src_name = os.path.join(src, n)
|
src_name = os.path.join(src, n)
|
||||||
dst_name = os.path.join(dst, 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):
|
if preserve_symlinks and os.path.islink(src_name):
|
||||||
link_dest = os.readlink(src_name)
|
link_dest = os.readlink(src_name)
|
||||||
if verbose >= 1:
|
if verbose >= 1:
|
||||||
|
|
|
@ -76,7 +76,6 @@ def test_create_tree_verbosity(self):
|
||||||
|
|
||||||
remove_tree(self.root_target, verbose=0)
|
remove_tree(self.root_target, verbose=0)
|
||||||
|
|
||||||
|
|
||||||
def test_copy_tree_verbosity(self):
|
def test_copy_tree_verbosity(self):
|
||||||
|
|
||||||
mkpath(self.target, verbose=0)
|
mkpath(self.target, verbose=0)
|
||||||
|
@ -88,11 +87,8 @@ def test_copy_tree_verbosity(self):
|
||||||
|
|
||||||
mkpath(self.target, verbose=0)
|
mkpath(self.target, verbose=0)
|
||||||
a_file = os.path.join(self.target, 'ok.txt')
|
a_file = os.path.join(self.target, 'ok.txt')
|
||||||
f = open(a_file, 'w')
|
with open(a_file, 'w') as f:
|
||||||
try:
|
|
||||||
f.write('some content')
|
f.write('some content')
|
||||||
finally:
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
wanted = ['copying %s -> %s' % (a_file, self.target2)]
|
wanted = ['copying %s -> %s' % (a_file, self.target2)]
|
||||||
copy_tree(self.target, self.target2, verbose=1)
|
copy_tree(self.target, self.target2, verbose=1)
|
||||||
|
@ -101,6 +97,21 @@ def test_copy_tree_verbosity(self):
|
||||||
remove_tree(self.root_target, verbose=0)
|
remove_tree(self.root_target, verbose=0)
|
||||||
remove_tree(self.target2, 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):
|
def test_ensure_relative(self):
|
||||||
if os.sep == '/':
|
if os.sep == '/':
|
||||||
self.assertEqual(ensure_relative('/home/foo'), 'home/foo')
|
self.assertEqual(ensure_relative('/home/foo'), 'home/foo')
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
"""Tests for distutils.command.register."""
|
"""Tests for distutils.command.register."""
|
||||||
import sys
|
|
||||||
import os
|
import os
|
||||||
import unittest
|
import unittest
|
||||||
import getpass
|
import getpass
|
||||||
|
@ -10,11 +9,14 @@
|
||||||
|
|
||||||
from distutils.command import register as register_module
|
from distutils.command import register as register_module
|
||||||
from distutils.command.register import register
|
from distutils.command.register import register
|
||||||
from distutils.core import Distribution
|
|
||||||
from distutils.errors import DistutilsSetupError
|
from distutils.errors import DistutilsSetupError
|
||||||
|
|
||||||
from distutils.tests import support
|
from distutils.tests.test_config import PyPIRCCommandTestCase
|
||||||
from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
|
|
||||||
|
try:
|
||||||
|
import docutils
|
||||||
|
except ImportError:
|
||||||
|
docutils = None
|
||||||
|
|
||||||
PYPIRC_NOPASSWORD = """\
|
PYPIRC_NOPASSWORD = """\
|
||||||
[distutils]
|
[distutils]
|
||||||
|
@ -193,6 +195,7 @@ def test_password_reset(self):
|
||||||
self.assertEqual(headers['Content-length'], '290')
|
self.assertEqual(headers['Content-length'], '290')
|
||||||
self.assertTrue((b'tarek') in req.data)
|
self.assertTrue((b'tarek') in req.data)
|
||||||
|
|
||||||
|
@unittest.skipUnless(docutils is not None, 'needs docutils')
|
||||||
def test_strict(self):
|
def test_strict(self):
|
||||||
# testing the script option
|
# testing the script option
|
||||||
# when on, the register command stops if
|
# when on, the register command stops if
|
||||||
|
@ -205,13 +208,6 @@ def test_strict(self):
|
||||||
cmd.strict = 1
|
cmd.strict = 1
|
||||||
self.assertRaises(DistutilsSetupError, cmd.run)
|
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 are OK but long_description is broken
|
||||||
metadata = {'url': 'xxx', 'author': 'xxx',
|
metadata = {'url': 'xxx', 'author': 'xxx',
|
||||||
'author_email': 'éxéxé',
|
'author_email': 'éxéxé',
|
||||||
|
@ -265,6 +261,22 @@ def test_strict(self):
|
||||||
finally:
|
finally:
|
||||||
del register_module.input
|
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):
|
def test_check_metadata_deprecated(self):
|
||||||
# makes sure make_metadata is deprecated
|
# makes sure make_metadata is deprecated
|
||||||
cmd = self._get_cmd()
|
cmd = self._get_cmd()
|
||||||
|
|
|
@ -83,9 +83,8 @@ def get_cmd(self, metadata=None):
|
||||||
|
|
||||||
@unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
|
@unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
|
||||||
def test_prune_file_list(self):
|
def test_prune_file_list(self):
|
||||||
# this test creates a package with some vcs dirs in it
|
# this test creates a project with some VCS dirs and an NFS rename
|
||||||
# and launch sdist to make sure they get pruned
|
# file, then launches sdist to check they get pruned on all systems
|
||||||
# on all systems
|
|
||||||
|
|
||||||
# creating VCS directories with some files in them
|
# creating VCS directories with some files in them
|
||||||
os.mkdir(join(self.tmp_dir, 'somecode', '.svn'))
|
os.mkdir(join(self.tmp_dir, 'somecode', '.svn'))
|
||||||
|
@ -99,6 +98,8 @@ def test_prune_file_list(self):
|
||||||
self.write_file((self.tmp_dir, 'somecode', '.git',
|
self.write_file((self.tmp_dir, 'somecode', '.git',
|
||||||
'ok'), 'xxx')
|
'ok'), 'xxx')
|
||||||
|
|
||||||
|
self.write_file((self.tmp_dir, 'somecode', '.nfs0001'), 'xxx')
|
||||||
|
|
||||||
# now building a sdist
|
# now building a sdist
|
||||||
dist, cmd = self.get_cmd()
|
dist, cmd = self.get_cmd()
|
||||||
|
|
||||||
|
|
|
@ -243,6 +243,7 @@ David Costanzo
|
||||||
Scott Cotton
|
Scott Cotton
|
||||||
Greg Couch
|
Greg Couch
|
||||||
David Cournapeau
|
David Cournapeau
|
||||||
|
Julien Courteau
|
||||||
Steve Cousins
|
Steve Cousins
|
||||||
Alex Coventry
|
Alex Coventry
|
||||||
Matthew Dixon Cowles
|
Matthew Dixon Cowles
|
||||||
|
@ -566,6 +567,7 @@ Julien Jehannet
|
||||||
Drew Jenkins
|
Drew Jenkins
|
||||||
Flemming Kjær Jensen
|
Flemming Kjær Jensen
|
||||||
Philip H. Jensen
|
Philip H. Jensen
|
||||||
|
Philip Jenvey
|
||||||
MunSic Jeong
|
MunSic Jeong
|
||||||
Chris Jerdonek
|
Chris Jerdonek
|
||||||
Jim Jewett
|
Jim Jewett
|
||||||
|
@ -688,6 +690,7 @@ John J. Lee
|
||||||
Thomas Lee
|
Thomas Lee
|
||||||
Tennessee Leeuwenburg
|
Tennessee Leeuwenburg
|
||||||
Luc Lefebvre
|
Luc Lefebvre
|
||||||
|
Pierre Paul Lefebvre
|
||||||
Glyph Lefkowitz
|
Glyph Lefkowitz
|
||||||
Vincent Legoll
|
Vincent Legoll
|
||||||
Kip Lehman
|
Kip Lehman
|
||||||
|
|
|
@ -165,6 +165,15 @@ Library
|
||||||
|
|
||||||
- Issue #16628: Fix a memory leak in ctypes.resize().
|
- 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.
|
- Issue #13120: Allow to call pdb.set_trace() from thread.
|
||||||
Patch by Ilya Sandler.
|
Patch by Ilya Sandler.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue