##// END OF EJS Templates
Merge with crew-stable
Patrick Mezard -
r8256:e68e149f merge default
parent child Browse files
Show More
@@ -630,13 +630,28 b' def rename(src, dst):'
630 try:
630 try:
631 os.rename(src, dst)
631 os.rename(src, dst)
632 except OSError, err: # FIXME: check err (EEXIST ?)
632 except OSError, err: # FIXME: check err (EEXIST ?)
633 # on windows, rename to existing file is not allowed, so we
633
634 # must delete destination first. but if file is open, unlink
634 # On windows, rename to existing file is not allowed, so we
635 # schedules it for delete but does not delete it. rename
635 # must delete destination first. But if a file is open, unlink
636 # schedules it for delete but does not delete it. Rename
636 # happens immediately even for open files, so we rename
637 # happens immediately even for open files, so we rename
637 # destination to a temporary name, then delete that. then
638 # destination to a temporary name, then delete that. Then
638 # rename is safe to do.
639 # rename is safe to do.
639 temp = dst + "-force-rename"
640 # The temporary name is chosen at random to avoid the situation
641 # where a file is left lying around from a previous aborted run.
642 # The usual race condition this introduces can't be avoided as
643 # we need the name to rename into, and not the file itself. Due
644 # to the nature of the operation however, any races will at worst
645 # lead to the rename failing and the current operation aborting.
646
647 def tempname(prefix):
648 for tries in xrange(10):
649 temp = '%s-%08x' % (prefix, random.randint(0, 0xffffffff))
650 if not os.path.exists(temp):
651 return temp
652 raise IOError, (errno.EEXIST, "No usable temporary filename found")
653
654 temp = tempname(dst)
640 os.rename(dst, temp)
655 os.rename(dst, temp)
641 os.unlink(temp)
656 os.unlink(temp)
642 os.rename(src, dst)
657 os.rename(src, dst)
General Comments 0
You need to be logged in to leave comments. Login now