mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #8876: distutils now falls back to copying files when hard linking doesn't work.
This allows use with special filesystems such as VirtualBox shared folders.
This commit is contained in:
commit
aea7f4a8e2
3 changed files with 55 additions and 14 deletions
|
@ -5,7 +5,7 @@ import shutil
|
|||
import errno
|
||||
from unittest.mock import patch
|
||||
|
||||
from distutils.file_util import move_file
|
||||
from distutils.file_util import move_file, copy_file
|
||||
from distutils import log
|
||||
from distutils.tests import support
|
||||
from distutils.errors import DistutilsFileError
|
||||
|
@ -78,6 +78,36 @@ class FileUtilTestCase(support.TempdirManager, unittest.TestCase):
|
|||
fobj.write('spam eggs')
|
||||
move_file(self.source, self.target, verbose=0)
|
||||
|
||||
def test_copy_file_hard_link(self):
|
||||
with open(self.source, 'w') as f:
|
||||
f.write('some content')
|
||||
st = os.stat(self.source)
|
||||
copy_file(self.source, self.target, link='hard')
|
||||
st2 = os.stat(self.source)
|
||||
st3 = os.stat(self.target)
|
||||
self.assertTrue(os.path.samestat(st, st2), (st, st2))
|
||||
self.assertTrue(os.path.samestat(st2, st3), (st2, st3))
|
||||
with open(self.source, 'r') as f:
|
||||
self.assertEqual(f.read(), 'some content')
|
||||
|
||||
def test_copy_file_hard_link_failure(self):
|
||||
# If hard linking fails, copy_file() falls back on copying file
|
||||
# (some special filesystems don't support hard linking even under
|
||||
# Unix, see issue #8876).
|
||||
with open(self.source, 'w') as f:
|
||||
f.write('some content')
|
||||
st = os.stat(self.source)
|
||||
with patch("os.link", side_effect=OSError(0, "linking unsupported")):
|
||||
copy_file(self.source, self.target, link='hard')
|
||||
st2 = os.stat(self.source)
|
||||
st3 = os.stat(self.target)
|
||||
self.assertTrue(os.path.samestat(st, st2), (st, st2))
|
||||
self.assertFalse(os.path.samestat(st2, st3), (st2, st3))
|
||||
for fn in (self.source, self.target):
|
||||
with open(fn, 'r') as f:
|
||||
self.assertEqual(f.read(), 'some content')
|
||||
|
||||
|
||||
def test_suite():
|
||||
return unittest.makeSuite(FileUtilTestCase)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue