~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Vincent Ladeuil
  • Date: 2010-03-05 08:55:12 UTC
  • mfrom: (4797.2.27 2.1-integration)
  • mto: This revision was merged to the branch mainline in revision 5075.
  • Revision ID: v.ladeuil+lp@free.fr-20100305085512-rsguvvb02fbyx7zj
Merge 2.1 into bzr.dev including fixes for #524560 and #449776

Show diffs side-by-side

added added

removed removed

Lines of Context:
85
85
# be opened in binary mode, rather than text mode.
86
86
# On other platforms, O_BINARY doesn't exist, because
87
87
# they always open in binary mode, so it is okay to
88
 
# OR with 0 on those platforms
 
88
# OR with 0 on those platforms.
 
89
# O_NOINHERIT and O_TEXT exists only on win32 too.
89
90
O_BINARY = getattr(os, 'O_BINARY', 0)
 
91
O_TEXT = getattr(os, 'O_TEXT', 0)
 
92
O_NOINHERIT = getattr(os, 'O_NOINHERIT', 0)
90
93
 
91
94
 
92
95
def get_unicode_argv():
663
666
def sha_file_by_name(fname):
664
667
    """Calculate the SHA1 of a file by reading the full text"""
665
668
    s = sha()
666
 
    f = os.open(fname, os.O_RDONLY | O_BINARY)
 
669
    f = os.open(fname, os.O_RDONLY | O_BINARY | O_NOINHERIT)
667
670
    try:
668
671
        while True:
669
672
            b = os.read(f, 1<<16)
2117
2120
        else:
2118
2121
            data, _ = self.encode(object, self.errors)
2119
2122
            self.stream.write(data)
 
2123
 
 
2124
if sys.platform == 'win32':
 
2125
    def open_file(filename, mode='r', bufsize=-1):
 
2126
        """This function is used to override the ``open`` builtin.
 
2127
        
 
2128
        But it uses O_NOINHERIT flag so the file handle is not inherited by
 
2129
        child processes.  Deleting or renaming a closed file opened with this
 
2130
        function is not blocking child processes.
 
2131
        """
 
2132
        writing = 'w' in mode
 
2133
        appending = 'a' in mode
 
2134
        updating = '+' in mode
 
2135
        binary = 'b' in mode
 
2136
 
 
2137
        flags = O_NOINHERIT
 
2138
        # see http://msdn.microsoft.com/en-us/library/yeby3zcb%28VS.71%29.aspx
 
2139
        # for flags for each modes.
 
2140
        if binary:
 
2141
            flags |= O_BINARY
 
2142
        else:
 
2143
            flags |= O_TEXT
 
2144
 
 
2145
        if writing:
 
2146
            if updating:
 
2147
                flags |= os.O_RDWR
 
2148
            else:
 
2149
                flags |= os.O_WRONLY
 
2150
            flags |= os.O_CREAT | os.O_TRUNC
 
2151
        elif appending:
 
2152
            if updating:
 
2153
                flags |= os.O_RDWR
 
2154
            else:
 
2155
                flags |= os.O_WRONLY
 
2156
            flags |= os.O_CREAT | os.O_APPEND
 
2157
        else: #reading
 
2158
            if updating:
 
2159
                flags |= os.O_RDWR
 
2160
            else:
 
2161
                flags |= os.O_RDONLY
 
2162
 
 
2163
        return os.fdopen(os.open(filename, flags), mode, bufsize)
 
2164
else:
 
2165
    open_file = open