Show More
@@ -554,6 +554,12 b' def link_or_copy(src, dst):' | |||||
554 |
|
554 | |||
555 | link_errno = link(src, dst) |
|
555 | link_errno = link(src, dst) | |
556 | if link_errno == errno.EEXIST: |
|
556 | if link_errno == errno.EEXIST: | |
|
557 | if os.stat(src).st_ino == os.stat(dst).st_ino: | |||
|
558 | # dst is already a hard link to the correct file, so we don't need | |||
|
559 | # to do anything else. If we try to link and rename the file | |||
|
560 | # anyway, we get duplicate files - see http://bugs.python.org/issue21876 | |||
|
561 | return | |||
|
562 | ||||
557 | new_dst = dst + "-temp-%04X" %(random.randint(1, 16**4), ) |
|
563 | new_dst = dst + "-temp-%04X" %(random.randint(1, 16**4), ) | |
558 | try: |
|
564 | try: | |
559 | link_or_copy(src, new_dst) |
|
565 | link_or_copy(src, new_dst) |
@@ -676,3 +676,12 b' class TestLinkOrCopy(object):' | |||||
676 | dst = self.dst("target") |
|
676 | dst = self.dst("target") | |
677 | path.link_or_copy(self.src, dst) |
|
677 | path.link_or_copy(self.src, dst) | |
678 | self.assert_content_equal(self.src, dst) |
|
678 | self.assert_content_equal(self.src, dst) | |
|
679 | ||||
|
680 | def test_link_twice(self): | |||
|
681 | # Linking the same file twice shouldn't leave duplicates around. | |||
|
682 | # See https://github.com/ipython/ipython/issues/6450 | |||
|
683 | dst = self.dst('target') | |||
|
684 | path.link_or_copy(self.src, dst) | |||
|
685 | path.link_or_copy(self.src, dst) | |||
|
686 | self.assert_inode_equal(self.src, dst) | |||
|
687 | nt.assert_equal(sorted(os.listdir(self.tempdir.name)), ['src', 'target']) |
General Comments 0
You need to be logged in to leave comments.
Login now