~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

(vila,
        for songofacandy) Use O_NOINHERIT to avoid PermissionDenied errors

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2009 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
74
74
# be opened in binary mode, rather than text mode.
75
75
# On other platforms, O_BINARY doesn't exist, because
76
76
# they always open in binary mode, so it is okay to
77
 
# OR with 0 on those platforms
 
77
# OR with 0 on those platforms.
 
78
# O_NOINHERIT and O_TEXT exists only on win32 too.
78
79
O_BINARY = getattr(os, 'O_BINARY', 0)
 
80
O_TEXT = getattr(os, 'O_TEXT', 0)
 
81
O_NOINHERIT = getattr(os, 'O_NOINHERIT', 0)
79
82
 
80
83
 
81
84
def get_unicode_argv():
639
642
def sha_file_by_name(fname):
640
643
    """Calculate the SHA1 of a file by reading the full text"""
641
644
    s = sha()
642
 
    f = os.open(fname, os.O_RDONLY | O_BINARY)
 
645
    f = os.open(fname, os.O_RDONLY | O_BINARY | O_NOINHERIT)
643
646
    try:
644
647
        while True:
645
648
            b = os.read(f, 1<<16)
1907
1910
    if use_cache:
1908
1911
        _cached_concurrency = concurrency
1909
1912
    return concurrency
 
1913
 
 
1914
if sys.platform == 'win32':
 
1915
    def open_file(filename, mode='r', bufsize=-1):
 
1916
        """This function is used to override the ``open`` builtin.
 
1917
        
 
1918
        But it uses O_NOINHERIT flag so the file handle is not inherited by
 
1919
        child processes.  Deleting or renaming a closed file opened with this
 
1920
        function is not blocking child processes.
 
1921
        """
 
1922
        writing = 'w' in mode
 
1923
        appending = 'a' in mode
 
1924
        updating = '+' in mode
 
1925
        binary = 'b' in mode
 
1926
 
 
1927
        flags = O_NOINHERIT
 
1928
        # see http://msdn.microsoft.com/en-us/library/yeby3zcb%28VS.71%29.aspx
 
1929
        # for flags for each modes.
 
1930
        if binary:
 
1931
            flags |= O_BINARY
 
1932
        else:
 
1933
            flags |= O_TEXT
 
1934
 
 
1935
        if writing:
 
1936
            if updating:
 
1937
                flags |= os.O_RDWR
 
1938
            else:
 
1939
                flags |= os.O_WRONLY
 
1940
            flags |= os.O_CREAT | os.O_TRUNC
 
1941
        elif appending:
 
1942
            if updating:
 
1943
                flags |= os.O_RDWR
 
1944
            else:
 
1945
                flags |= os.O_WRONLY
 
1946
            flags |= os.O_CREAT | os.O_APPEND
 
1947
        else: #reading
 
1948
            if updating:
 
1949
                flags |= os.O_RDWR
 
1950
            else:
 
1951
                flags |= os.O_RDONLY
 
1952
 
 
1953
        return os.fdopen(os.open(filename, flags), mode, bufsize)
 
1954
else:
 
1955
    open_file = open