| OLD | NEW |
| 1 # Copyright (C) 2003 Python Software Foundation | 1 # Copyright (C) 2003 Python Software Foundation |
| 2 | 2 |
| 3 import unittest | 3 import unittest |
| 4 import shutil | 4 import shutil |
| 5 import tempfile | 5 import tempfile |
| 6 import sys | 6 import sys |
| 7 import stat | 7 import stat |
| 8 import os | 8 import os |
| 9 import os.path | 9 import os.path |
| 10 import errno | 10 import errno |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 dst_link = os.path.join(tmp_dir, 'quux') | 270 dst_link = os.path.join(tmp_dir, 'quux') |
| 271 write_file(src, 'foo') | 271 write_file(src, 'foo') |
| 272 write_file(dst, 'foo') | 272 write_file(dst, 'foo') |
| 273 os.symlink(src, src_link) | 273 os.symlink(src, src_link) |
| 274 os.symlink(dst, dst_link) | 274 os.symlink(dst, dst_link) |
| 275 os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) | 275 os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) |
| 276 os.chmod(dst, stat.S_IRWXU) | 276 os.chmod(dst, stat.S_IRWXU) |
| 277 os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG) | 277 os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG) |
| 278 # link to link | 278 # link to link |
| 279 os.lchmod(dst_link, stat.S_IRWXO) | 279 os.lchmod(dst_link, stat.S_IRWXO) |
| 280 shutil.copymode(src_link, dst_link, symlinks=True) | 280 shutil.copymode(src_link, dst_link, follow_symlinks=False) |
| 281 self.assertEqual(os.lstat(src_link).st_mode, | 281 self.assertEqual(os.lstat(src_link).st_mode, |
| 282 os.lstat(dst_link).st_mode) | 282 os.lstat(dst_link).st_mode) |
| 283 self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) | 283 self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) |
| 284 # src link - use chmod | 284 # src link - use chmod |
| 285 os.lchmod(dst_link, stat.S_IRWXO) | 285 os.lchmod(dst_link, stat.S_IRWXO) |
| 286 shutil.copymode(src_link, dst, symlinks=True) | 286 shutil.copymode(src_link, dst, follow_symlinks=False) |
| 287 self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) | 287 self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) |
| 288 # dst link - use chmod | 288 # dst link - use chmod |
| 289 os.lchmod(dst_link, stat.S_IRWXO) | 289 os.lchmod(dst_link, stat.S_IRWXO) |
| 290 shutil.copymode(src, dst_link, symlinks=True) | 290 shutil.copymode(src, dst_link, follow_symlinks=False) |
| 291 self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) | 291 self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) |
| 292 | 292 |
| 293 @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing') | 293 @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing') |
| 294 @support.skip_unless_symlink | 294 @support.skip_unless_symlink |
| 295 def test_copymode_symlink_to_symlink_wo_lchmod(self): | 295 def test_copymode_symlink_to_symlink_wo_lchmod(self): |
| 296 tmp_dir = self.mkdtemp() | 296 tmp_dir = self.mkdtemp() |
| 297 src = os.path.join(tmp_dir, 'foo') | 297 src = os.path.join(tmp_dir, 'foo') |
| 298 dst = os.path.join(tmp_dir, 'bar') | 298 dst = os.path.join(tmp_dir, 'bar') |
| 299 src_link = os.path.join(tmp_dir, 'baz') | 299 src_link = os.path.join(tmp_dir, 'baz') |
| 300 dst_link = os.path.join(tmp_dir, 'quux') | 300 dst_link = os.path.join(tmp_dir, 'quux') |
| 301 write_file(src, 'foo') | 301 write_file(src, 'foo') |
| 302 write_file(dst, 'foo') | 302 write_file(dst, 'foo') |
| 303 os.symlink(src, src_link) | 303 os.symlink(src, src_link) |
| 304 os.symlink(dst, dst_link) | 304 os.symlink(dst, dst_link) |
| 305 shutil.copymode(src_link, dst_link, symlinks=True) # silent fail | 305 shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fai
l |
| 306 | 306 |
| 307 @support.skip_unless_symlink | 307 @support.skip_unless_symlink |
| 308 def test_copystat_symlinks(self): | 308 def test_copystat_symlinks(self): |
| 309 tmp_dir = self.mkdtemp() | 309 tmp_dir = self.mkdtemp() |
| 310 src = os.path.join(tmp_dir, 'foo') | 310 src = os.path.join(tmp_dir, 'foo') |
| 311 dst = os.path.join(tmp_dir, 'bar') | 311 dst = os.path.join(tmp_dir, 'bar') |
| 312 src_link = os.path.join(tmp_dir, 'baz') | 312 src_link = os.path.join(tmp_dir, 'baz') |
| 313 dst_link = os.path.join(tmp_dir, 'qux') | 313 dst_link = os.path.join(tmp_dir, 'qux') |
| 314 write_file(src, 'foo') | 314 write_file(src, 'foo') |
| 315 src_stat = os.stat(src) | 315 src_stat = os.stat(src) |
| 316 os.utime(src, (src_stat.st_atime, | 316 os.utime(src, (src_stat.st_atime, |
| 317 src_stat.st_mtime - 42.0)) # ensure different mtimes | 317 src_stat.st_mtime - 42.0)) # ensure different mtimes |
| 318 write_file(dst, 'bar') | 318 write_file(dst, 'bar') |
| 319 self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime) | 319 self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime) |
| 320 os.symlink(src, src_link) | 320 os.symlink(src, src_link) |
| 321 os.symlink(dst, dst_link) | 321 os.symlink(dst, dst_link) |
| 322 if hasattr(os, 'lchmod'): | 322 if hasattr(os, 'lchmod'): |
| 323 os.lchmod(src_link, stat.S_IRWXO) | 323 os.lchmod(src_link, stat.S_IRWXO) |
| 324 if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): | 324 if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): |
| 325 os.lchflags(src_link, stat.UF_NODUMP) | 325 os.lchflags(src_link, stat.UF_NODUMP) |
| 326 src_link_stat = os.lstat(src_link) | 326 src_link_stat = os.lstat(src_link) |
| 327 # follow | 327 # follow |
| 328 if hasattr(os, 'lchmod'): | 328 if hasattr(os, 'lchmod'): |
| 329 shutil.copystat(src_link, dst_link, symlinks=False) | 329 shutil.copystat(src_link, dst_link, follow_symlinks=True) |
| 330 self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode) | 330 self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode) |
| 331 # don't follow | 331 # don't follow |
| 332 shutil.copystat(src_link, dst_link, symlinks=True) | 332 shutil.copystat(src_link, dst_link, follow_symlinks=False) |
| 333 dst_link_stat = os.lstat(dst_link) | 333 dst_link_stat = os.lstat(dst_link) |
| 334 if os.utime in os.supports_follow_symlinks: | 334 if os.utime in os.supports_follow_symlinks: |
| 335 for attr in 'st_atime', 'st_mtime': | 335 for attr in 'st_atime', 'st_mtime': |
| 336 # The modification times may be truncated in the new file. | 336 # The modification times may be truncated in the new file. |
| 337 self.assertLessEqual(getattr(src_link_stat, attr), | 337 self.assertLessEqual(getattr(src_link_stat, attr), |
| 338 getattr(dst_link_stat, attr) + 1) | 338 getattr(dst_link_stat, attr) + 1) |
| 339 if hasattr(os, 'lchmod'): | 339 if hasattr(os, 'lchmod'): |
| 340 self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode) | 340 self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode) |
| 341 if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): | 341 if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): |
| 342 self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags) | 342 self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags) |
| 343 # tell to follow but dst is not a link | 343 # tell to follow but dst is not a link |
| 344 shutil.copystat(src_link, dst, symlinks=True) | 344 shutil.copystat(src_link, dst, follow_symlinks=False) |
| 345 self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) < | 345 self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) < |
| 346 00000.1) | 346 00000.1) |
| 347 | 347 |
| 348 @unittest.skipUnless(hasattr(os, 'chflags') and | 348 @unittest.skipUnless(hasattr(os, 'chflags') and |
| 349 hasattr(errno, 'EOPNOTSUPP') and | 349 hasattr(errno, 'EOPNOTSUPP') and |
| 350 hasattr(errno, 'ENOTSUP'), | 350 hasattr(errno, 'ENOTSUP'), |
| 351 "requires os.chflags, EOPNOTSUPP & ENOTSUP") | 351 "requires os.chflags, EOPNOTSUPP & ENOTSUP") |
| 352 def test_copystat_handles_harmless_chflags_errors(self): | 352 def test_copystat_handles_harmless_chflags_errors(self): |
| 353 tmpdir = self.mkdtemp() | 353 tmpdir = self.mkdtemp() |
| 354 file1 = os.path.join(tmpdir, 'file1') | 354 file1 = os.path.join(tmpdir, 'file1') |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 src = os.path.join(tmp_dir, 'foo') | 422 src = os.path.join(tmp_dir, 'foo') |
| 423 src_link = os.path.join(tmp_dir, 'baz') | 423 src_link = os.path.join(tmp_dir, 'baz') |
| 424 write_file(src, 'foo') | 424 write_file(src, 'foo') |
| 425 os.symlink(src, src_link) | 425 os.symlink(src, src_link) |
| 426 os.setxattr(src, 'trusted.foo', b'42') | 426 os.setxattr(src, 'trusted.foo', b'42') |
| 427 os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False) | 427 os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False) |
| 428 dst = os.path.join(tmp_dir, 'bar') | 428 dst = os.path.join(tmp_dir, 'bar') |
| 429 dst_link = os.path.join(tmp_dir, 'qux') | 429 dst_link = os.path.join(tmp_dir, 'qux') |
| 430 write_file(dst, 'bar') | 430 write_file(dst, 'bar') |
| 431 os.symlink(dst, dst_link) | 431 os.symlink(dst, dst_link) |
| 432 shutil._copyxattr(src_link, dst_link, symlinks=True) | 432 shutil._copyxattr(src_link, dst_link, follow_symlinks=False) |
| 433 self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=Fa
lse), b'43') | 433 self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=Fa
lse), b'43') |
| 434 self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo') | 434 self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo') |
| 435 shutil._copyxattr(src_link, dst, symlinks=True) | 435 shutil._copyxattr(src_link, dst, follow_symlinks=False) |
| 436 self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43') | 436 self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43') |
| 437 | 437 |
| 438 @support.skip_unless_symlink | 438 @support.skip_unless_symlink |
| 439 def test_copy_symlinks(self): | 439 def test_copy_symlinks(self): |
| 440 tmp_dir = self.mkdtemp() | 440 tmp_dir = self.mkdtemp() |
| 441 src = os.path.join(tmp_dir, 'foo') | 441 src = os.path.join(tmp_dir, 'foo') |
| 442 dst = os.path.join(tmp_dir, 'bar') | 442 dst = os.path.join(tmp_dir, 'bar') |
| 443 src_link = os.path.join(tmp_dir, 'baz') | 443 src_link = os.path.join(tmp_dir, 'baz') |
| 444 write_file(src, 'foo') | 444 write_file(src, 'foo') |
| 445 os.symlink(src, src_link) | 445 os.symlink(src, src_link) |
| 446 if hasattr(os, 'lchmod'): | 446 if hasattr(os, 'lchmod'): |
| 447 os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) | 447 os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) |
| 448 # don't follow | 448 # don't follow |
| 449 shutil.copy(src_link, dst, symlinks=False) | 449 shutil.copy(src_link, dst, follow_symlinks=True) |
| 450 self.assertFalse(os.path.islink(dst)) | 450 self.assertFalse(os.path.islink(dst)) |
| 451 self.assertEqual(read_file(src), read_file(dst)) | 451 self.assertEqual(read_file(src), read_file(dst)) |
| 452 os.remove(dst) | 452 os.remove(dst) |
| 453 # follow | 453 # follow |
| 454 shutil.copy(src_link, dst, symlinks=True) | 454 shutil.copy(src_link, dst, follow_symlinks=False) |
| 455 self.assertTrue(os.path.islink(dst)) | 455 self.assertTrue(os.path.islink(dst)) |
| 456 self.assertEqual(os.readlink(dst), os.readlink(src_link)) | 456 self.assertEqual(os.readlink(dst), os.readlink(src_link)) |
| 457 if hasattr(os, 'lchmod'): | 457 if hasattr(os, 'lchmod'): |
| 458 self.assertEqual(os.lstat(src_link).st_mode, | 458 self.assertEqual(os.lstat(src_link).st_mode, |
| 459 os.lstat(dst).st_mode) | 459 os.lstat(dst).st_mode) |
| 460 | 460 |
| 461 @support.skip_unless_symlink | 461 @support.skip_unless_symlink |
| 462 def test_copy2_symlinks(self): | 462 def test_copy2_symlinks(self): |
| 463 tmp_dir = self.mkdtemp() | 463 tmp_dir = self.mkdtemp() |
| 464 src = os.path.join(tmp_dir, 'foo') | 464 src = os.path.join(tmp_dir, 'foo') |
| 465 dst = os.path.join(tmp_dir, 'bar') | 465 dst = os.path.join(tmp_dir, 'bar') |
| 466 src_link = os.path.join(tmp_dir, 'baz') | 466 src_link = os.path.join(tmp_dir, 'baz') |
| 467 write_file(src, 'foo') | 467 write_file(src, 'foo') |
| 468 os.symlink(src, src_link) | 468 os.symlink(src, src_link) |
| 469 if hasattr(os, 'lchmod'): | 469 if hasattr(os, 'lchmod'): |
| 470 os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) | 470 os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) |
| 471 if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): | 471 if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): |
| 472 os.lchflags(src_link, stat.UF_NODUMP) | 472 os.lchflags(src_link, stat.UF_NODUMP) |
| 473 src_stat = os.stat(src) | 473 src_stat = os.stat(src) |
| 474 src_link_stat = os.lstat(src_link) | 474 src_link_stat = os.lstat(src_link) |
| 475 # follow | 475 # follow |
| 476 shutil.copy2(src_link, dst, symlinks=False) | 476 shutil.copy2(src_link, dst, follow_symlinks=True) |
| 477 self.assertFalse(os.path.islink(dst)) | 477 self.assertFalse(os.path.islink(dst)) |
| 478 self.assertEqual(read_file(src), read_file(dst)) | 478 self.assertEqual(read_file(src), read_file(dst)) |
| 479 os.remove(dst) | 479 os.remove(dst) |
| 480 # don't follow | 480 # don't follow |
| 481 shutil.copy2(src_link, dst, symlinks=True) | 481 shutil.copy2(src_link, dst, follow_symlinks=False) |
| 482 self.assertTrue(os.path.islink(dst)) | 482 self.assertTrue(os.path.islink(dst)) |
| 483 self.assertEqual(os.readlink(dst), os.readlink(src_link)) | 483 self.assertEqual(os.readlink(dst), os.readlink(src_link)) |
| 484 dst_stat = os.lstat(dst) | 484 dst_stat = os.lstat(dst) |
| 485 if os.utime in os.supports_follow_symlinks: | 485 if os.utime in os.supports_follow_symlinks: |
| 486 for attr in 'st_atime', 'st_mtime': | 486 for attr in 'st_atime', 'st_mtime': |
| 487 # The modification times may be truncated in the new file. | 487 # The modification times may be truncated in the new file. |
| 488 self.assertLessEqual(getattr(src_link_stat, attr), | 488 self.assertLessEqual(getattr(src_link_stat, attr), |
| 489 getattr(dst_stat, attr) + 1) | 489 getattr(dst_stat, attr) + 1) |
| 490 if hasattr(os, 'lchmod'): | 490 if hasattr(os, 'lchmod'): |
| 491 self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode) | 491 self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 509 @support.skip_unless_symlink | 509 @support.skip_unless_symlink |
| 510 def test_copyfile_symlinks(self): | 510 def test_copyfile_symlinks(self): |
| 511 tmp_dir = self.mkdtemp() | 511 tmp_dir = self.mkdtemp() |
| 512 src = os.path.join(tmp_dir, 'src') | 512 src = os.path.join(tmp_dir, 'src') |
| 513 dst = os.path.join(tmp_dir, 'dst') | 513 dst = os.path.join(tmp_dir, 'dst') |
| 514 dst_link = os.path.join(tmp_dir, 'dst_link') | 514 dst_link = os.path.join(tmp_dir, 'dst_link') |
| 515 link = os.path.join(tmp_dir, 'link') | 515 link = os.path.join(tmp_dir, 'link') |
| 516 write_file(src, 'foo') | 516 write_file(src, 'foo') |
| 517 os.symlink(src, link) | 517 os.symlink(src, link) |
| 518 # don't follow | 518 # don't follow |
| 519 shutil.copyfile(link, dst_link, symlinks=True) | 519 shutil.copyfile(link, dst_link, follow_symlinks=False) |
| 520 self.assertTrue(os.path.islink(dst_link)) | 520 self.assertTrue(os.path.islink(dst_link)) |
| 521 self.assertEqual(os.readlink(link), os.readlink(dst_link)) | 521 self.assertEqual(os.readlink(link), os.readlink(dst_link)) |
| 522 # follow | 522 # follow |
| 523 shutil.copyfile(link, dst) | 523 shutil.copyfile(link, dst) |
| 524 self.assertFalse(os.path.islink(dst)) | 524 self.assertFalse(os.path.islink(dst)) |
| 525 | 525 |
| 526 def test_rmtree_uses_safe_fd_version_if_available(self): | 526 def test_rmtree_uses_safe_fd_version_if_available(self): |
| 527 _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= | 527 _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= |
| 528 os.supports_dir_fd and | 528 os.supports_dir_fd and |
| 529 os.listdir in os.supports_fd and | 529 os.listdir in os.supports_fd and |
| (...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1601 | 1601 |
| 1602 self.assertEqual(expected, actual) | 1602 self.assertEqual(expected, actual) |
| 1603 | 1603 |
| 1604 | 1604 |
| 1605 def test_main(): | 1605 def test_main(): |
| 1606 support.run_unittest(TestShutil, TestMove, TestCopyFile, | 1606 support.run_unittest(TestShutil, TestMove, TestCopyFile, |
| 1607 TermsizeTests, TestWhich) | 1607 TermsizeTests, TestWhich) |
| 1608 | 1608 |
| 1609 if __name__ == '__main__': | 1609 if __name__ == '__main__': |
| 1610 test_main() | 1610 test_main() |
| OLD | NEW |