commit
3f7c0e4036
|
@ -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])
|
||||
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -833,7 +833,7 @@ always available.
|
|||
For other systems, the values are:
|
||||
|
||||
================ ===========================
|
||||
System :data:`platform` value
|
||||
System ``platform`` value
|
||||
================ ===========================
|
||||
Linux ``'linux'``
|
||||
Windows ``'win32'``
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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."""
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in New Issue