mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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:
		
							parent
							
								
									5e78f4daa8
								
							
						
					
					
						commit
						ed14c86fac
					
				
					 3 changed files with 55 additions and 13 deletions
				
			
		|  | @ -5,7 +5,7 @@ | |||
| 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 @@ def test_move_file_exception_unpacking_unlink(self): | |||
|                 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
	
	 Antoine Pitrou
						Antoine Pitrou