This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author YoSTEALTH
Recipients YoSTEALTH
Date 2015-12-03.20:27:32
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1449174453.32.0.268528261377.issue25790@psf.upfronthosting.co.za>
In-reply-to
Content
A very simple but useful enhancement for shutil.chown function

Currently "shutil.chown" function effects only one directory or file user/group permission by adding "recursive" parameter it can easily effect all sub-directories/files

Source: https://hg.python.org/cpython/file/3.5/Lib/shutil.py#l1007


# Current:
def chown(path, user=None, group=None):

    """Change owner user and group of the given path.


    user and group can be the uid/gid or the user/group names, and in that case,

    they are converted to their respective uid/gid.

    """


    if user is None and group is None:

        raise ValueError("user and/or group must be set")


    _user = user

    _group = group


    # -1 means don't change it

    if user is None:

        _user = -1

    # user can either be an int (the uid) or a string (the system username)

    elif isinstance(user, str):

        _user = _get_uid(user)

        if _user is None:

            raise LookupError("no such user: {!r}".format(user))


    if group is None:

        _group = -1

    elif not isinstance(group, int):

        _group = _get_gid(group)

        if _group is None:

            raise LookupError("no such group: {!r}".format(group))


    os.chown(path, _user, _group)


# Enhanced:

import os.path


# Internal Function
def _dir_walk(path):
    ''' Get All Directories & Files'''

    for dir_path, dir_names, file_names in os.walk(path):

        # Directories
        for dir_name in dir_names:
            yield os.path.join(dir_path, dir_name)

        # Files
        for file_name in file_names:
            yield os.path.join(dir_path, file_name)

def chown(path, user=None, group=None, recursive=False):

    """Change owner user and group of the given path.


    user and group can be the uid/gid or the user/group names, and in that case,

    they are converted to their respective uid/gid.

    """


    if user is None and group is None:

        raise ValueError("user and/or group must be set")


    _user = user

    _group = group


    # -1 means don't change it

    if user is None:

        _user = -1

    # user can either be an int (the uid) or a string (the system username)

    elif isinstance(user, str):

        _user = _get_uid(user)

        if _user is None:

            raise LookupError("no such user: {!r}".format(user))


    if group is None:

        _group = -1

    elif not isinstance(group, int):

        _group = _get_gid(group)

        if _group is None:

            raise LookupError("no such group: {!r}".format(group))

    # Default Do First
    if not recursive:
        os.chown(path, _user, _group)
    else:
        for recursive_path in _dir_walk(path):
            os.chown(recursive_path, _user, _group)


hope this helps :)
History
Date User Action Args
2015-12-03 20:27:33YoSTEALTHsetrecipients: + YoSTEALTH
2015-12-03 20:27:33YoSTEALTHsetmessageid: <1449174453.32.0.268528261377.issue25790@psf.upfronthosting.co.za>
2015-12-03 20:27:33YoSTEALTHlinkissue25790 messages
2015-12-03 20:27:32YoSTEALTHcreate