~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

``.bazaar``, ``.bazaar/bazaar.conf`` and ``.bzr.log`` inherit user and group ownership from the containing directory. This allow bzr to work better with sudo.

Show diffs side-by-side

added added

removed removed

Lines of Context:
51
51
    cache_utf8,
52
52
    errors,
53
53
    win32utils,
 
54
    trace,
54
55
    )
 
56
 
55
57
""")
56
58
 
57
59
# sha and md5 modules are deprecated in python2.6 but hashlib is available as
1804
1806
            real_handlers[kind](abspath, relpath)
1805
1807
 
1806
1808
 
 
1809
def copy_ownership(dst, src=None):
 
1810
    """Copy usr/grp ownership from src file/dir to dst file/dir.
 
1811
 
 
1812
    If src is None, the containing directory is used as source. If chown
 
1813
    fails, the error is ignored and a warning is printed.
 
1814
    """
 
1815
    has_chown = getattr(os, 'chown')
 
1816
    if has_chown is None: return
 
1817
 
 
1818
    if src == None:
 
1819
        src = os.path.dirname(dst)
 
1820
        if src == '':
 
1821
            src = '.'
 
1822
 
 
1823
    try:
 
1824
        s = os.stat(src)
 
1825
        os.chown(dst, s.st_uid, s.st_gid)
 
1826
    except OSError, e:
 
1827
        trace.warning("Unable to copy ownership from '%s' to '%s': IOError: %s." % (src, dst, e))
 
1828
 
 
1829
 
 
1830
def mkdir_with_ownership(path, ownership_src=None):
 
1831
    """Create the directory 'path' with specified ownership.
 
1832
 
 
1833
    If ownership_src is given, copies (chown) usr/grp ownership
 
1834
    from 'ownership_src' to 'path'. If ownership_src is None, use the
 
1835
    containing dir ownership.
 
1836
    """
 
1837
    os.mkdir(path)
 
1838
    copy_ownership(path, ownership_src)
 
1839
 
 
1840
 
 
1841
def open_with_ownership(filename, mode='r', bufsize=-1, ownership_src=None):
 
1842
    """Open the file 'filename' with the specified ownership.
 
1843
 
 
1844
    If ownership_src is specified, copy usr/grp ownership from ownership_src
 
1845
    to filename. If ownership_src is None, copy ownership from containing
 
1846
    directory.
 
1847
    Returns the opened file object.
 
1848
    """
 
1849
    f = open(filename, mode, bufsize)
 
1850
    copy_ownership(filename, ownership_src)
 
1851
    return f
 
1852
 
 
1853
 
1807
1854
def path_prefix_key(path):
1808
1855
    """Generate a prefix-order path key for path.
1809
1856