~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/atomicfile.py

[merge] robertc's integration, updated tests to check for retcode=3

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
 
19
19
from warnings import warn
20
 
 
 
20
from osutils import rename
 
21
import errno
21
22
 
22
23
class AtomicFile(object):
23
24
    """A file that does an atomic-rename to move into place.
65
66
        self.f.close()
66
67
        self.f = None
67
68
        
68
 
        if sys.platform == 'win32':
69
 
            # windows cannot rename over an existing file
70
 
            try:
71
 
                os.remove(self.realfilename)
72
 
            except OSError, e:
73
 
                import errno
74
 
                if e.errno != errno.ENOENT:
75
 
                    raise
76
 
                
77
 
        os.rename(self.tmpfilename, self.realfilename)
 
69
        try:
 
70
            stat = os.lstat(self.realfilename)
 
71
            os.chmod(self.tmpfilename, stat.st_mode)
 
72
        except OSError, e:
 
73
            if e.errno != errno.ENOENT:
 
74
                raise
 
75
        rename(self.tmpfilename, self.realfilename)
78
76
 
79
77
 
80
78
    def abort(self):
97
95
 
98
96
 
99
97
    def __del__(self):
100
 
        if not self.closed:
 
98
        if hasattr(self, 'closed') and not self.closed:
101
99
            warn("%r leaked" % self)
102
100