diff options
author | Éric Araujo <merwok@netwok.org> | 2012-07-03 05:12:42 (GMT) |
---|---|---|
committer | Éric Araujo <merwok@netwok.org> | 2012-07-03 05:12:42 (GMT) |
commit | 3cf202e9578cef4429254641599e8f6be6540309 (patch) | |
tree | 046bb0fcd13f54034cbb475441fa280574da1c0d /Lib/distutils | |
parent | 96534689a8d59d01f383d5e50e6d542586790eb8 (diff) | |
download | cpython-3cf202e9578cef4429254641599e8f6be6540309.zip cpython-3cf202e9578cef4429254641599e8f6be6540309.tar.gz cpython-3cf202e9578cef4429254641599e8f6be6540309.tar.bz2 |
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.
Diffstat (limited to 'Lib/distutils')
-rw-r--r-- | Lib/distutils/dir_util.py | 4 | ||||
-rw-r--r-- | Lib/distutils/tests/test_dir_util.py | 18 | ||||
-rw-r--r-- | Lib/distutils/tests/test_sdist.py | 7 |
3 files changed, 26 insertions, 3 deletions
diff --git a/Lib/distutils/dir_util.py b/Lib/distutils/dir_util.py index 9c5cf33..5026e24 100644 --- a/Lib/distutils/dir_util.py +++ b/Lib/distutils/dir_util.py @@ -144,6 +144,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 693f77c..d82d913 100644 --- a/Lib/distutils/tests/test_dir_util.py +++ b/Lib/distutils/tests/test_dir_util.py @@ -101,6 +101,24 @@ 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: + fh = open(f, 'w') + try: + fh.write('some content') + finally: + fh.close() + + 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_sdist.py b/Lib/distutils/tests/test_sdist.py index 3a89f73..7e7d98d 100644 --- a/Lib/distutils/tests/test_sdist.py +++ b/Lib/distutils/tests/test_sdist.py @@ -91,9 +91,8 @@ class SDistTestCase(PyPIRCCommandTestCase): @unittest.skipUnless(zlib, "requires zlib") 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')) @@ -107,6 +106,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() |