Commit 3e4a3dcb authored by Éric Araujo's avatar Éric Araujo

Ignore .nfs* files in distutils (#7719).

These files are created by some NFS clients a file is edited and removed
concurrently (see added link in doc for more info).  If such a file is
removed between distutils calls listdir and copy, it will get confused.
Other special files are ignored in sdist (namely VCS directories), but
this has to be filtered out earlier.
parent 09974b4e
...@@ -992,6 +992,12 @@ directories. ...@@ -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.2.4
NFS files are ignored.
.. function:: remove_tree(directory[, verbose=0, dry_run=0]) .. function:: remove_tree(directory[, verbose=0, dry_run=0])
......
...@@ -141,6 +141,10 @@ def copy_tree(src, dst, preserve_mode=1, preserve_times=1, ...@@ -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 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase): ...@@ -76,7 +76,6 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase):
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 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase): ...@@ -88,11 +87,8 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase):
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 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase): ...@@ -101,6 +97,21 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase):
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')
......
...@@ -83,9 +83,8 @@ class SDistTestCase(PyPIRCCommandTestCase): ...@@ -83,9 +83,8 @@ class SDistTestCase(PyPIRCCommandTestCase):
@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 @@ class SDistTestCase(PyPIRCCommandTestCase): ...@@ -99,6 +98,8 @@ class SDistTestCase(PyPIRCCommandTestCase):
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()
......
...@@ -177,6 +177,9 @@ Library ...@@ -177,6 +177,9 @@ Library
- Issue #16628: Fix a memory leak in ctypes.resize(). - Issue #16628: Fix a memory leak in ctypes.resize().
- 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.
......
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