From 894041628c8c8e4d10780e90255aec83f9b7db09 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Mon, 20 Apr 2020 16:41:32 -0400 Subject: [PATCH 1/3] Add recursive set --- oschmod/__init__.py | 33 +++++++++++++++++++++++++++++++ tests/test_oschmod.py | 45 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/oschmod/__init__.py b/oschmod/__init__.py index 4cb6ee8..319258a 100644 --- a/oschmod/__init__.py +++ b/oschmod/__init__.py @@ -169,6 +169,39 @@ def set_mode(path, mode): return os.chmod(path, mode) +def set_mode_recursive(path, mode, dir_mode=None): + r""" + Set all file and directory permissions at or under path to modes. + + Args: + path: (:obj:`str`) + Object which will have its mode set. If path is a file, only its mode + is set - no recursion occurs. If path is a directory, its mode and the + mode of all files and subdirectories below it are set. + + mode: (`int`) + Mode to be applied to object(s). + + dir_mode: (`int`) + If provided, this mode is given to all directories only. + + """ + if get_object_type(path) == FILE: + return set_mode(path, mode) + + if not dir_mode: + dir_mode = mode + + for root, dirs, files in os.walk(path, topdown=False): + for one_file in files: + set_mode(os.path.join(root, one_file), mode) + + for one_dir in dirs: + set_mode(os.path.join(root, one_dir), dir_mode) + + return set_mode(path, dir_mode) + + def get_object_type(path): """Get whether object is file or directory.""" object_type = DIRECTORY diff --git a/tests/test_oschmod.py b/tests/test_oschmod.py index 1f6234d..29ac22b 100644 --- a/tests/test_oschmod.py +++ b/tests/test_oschmod.py @@ -4,8 +4,10 @@ import glob import os import random +import shutil import stat import string +import time import oschmod @@ -48,3 +50,46 @@ def test_permissions(): os.remove(file_path) except FileNotFoundError: print("Error while deleting file : ", file_path) + + +def test_set_recursive(): + """Check file permissions are recursively set.""" + # create dirs + topdir = 'testdir1' + testdir = os.path.join(topdir, 'testdir2', 'testdir3') + os.makedirs(testdir) + + # create files + fileh = open(os.path.join(topdir, 'file1'), "w+") + fileh.write("contents") + fileh.close() + + fileh = open(os.path.join(testdir, 'file2'), "w+") + fileh.write("contents") + fileh.close() + + # set permissions to badness + triple7 = stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP\ + | stat.S_IWGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IWOTH\ + | stat.S_IXOTH + oschmod.set_mode(topdir, triple7) + oschmod.set_mode(testdir, triple7) + oschmod.set_mode(os.path.join(topdir, 'file1'), triple7) + oschmod.set_mode(os.path.join(testdir, 'file2'), triple7) + time.sleep(1) # modes aren't always ready to go immediately + + # set permissions - the test + file_mode = 0o600 + dir_mode = 0o700 + oschmod.set_mode_recursive(topdir, file_mode, dir_mode) + time.sleep(1) # modes aren't always ready to go immediately + + # check it out + assert oschmod.get_mode(topdir) == dir_mode + assert oschmod.get_mode(os.path.join(topdir, 'testdir2')) == dir_mode + assert oschmod.get_mode(testdir) == dir_mode + assert oschmod.get_mode(os.path.join(topdir, 'file1')) == file_mode + assert oschmod.get_mode(os.path.join(testdir, 'file2')) == file_mode + + # clean up + shutil.rmtree(topdir) From e5c439adf669881e1ad0ceb2ce217a32af327048 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Mon, 20 Apr 2020 16:42:05 -0400 Subject: [PATCH 2/3] Bump version --- .bumpversion.cfg | 2 +- oschmod/__init__.py | 2 +- setup.cfg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 29793b3..f64dfb3 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.1.5 +current_version = 0.2.0 commit = False tag = False tag_name = {new_version} diff --git a/oschmod/__init__.py b/oschmod/__init__.py index 319258a..3cca3e2 100644 --- a/oschmod/__init__.py +++ b/oschmod/__init__.py @@ -152,7 +152,7 @@ "S_IXOTH" ) -__version__ = "0.1.5" +__version__ = "0.2.0" def get_mode(path): diff --git a/setup.cfg b/setup.cfg index 6737816..2d3811a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,7 +3,7 @@ name = oschmod description = Windows and Linux compatible chmod long_description = file: README.md, CHANGELOG.md long_description_content_type = text/markdown -version = 0.1.5 +version = 0.2.0 author = YakDriver author_email = projects@plus3it.com url = https://github.com/yakdriver/oschmod From bd2fd434ac605162e73a0d8aeaf077e64ce622f1 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Mon, 20 Apr 2020 16:44:06 -0400 Subject: [PATCH 3/3] Update changelog --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7d9094..bde8e1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,18 @@ ## Changelog +### 0.2.0 + +**Commit Delta**: [Change from 0.1.5 release](https://github.com/YakDriver/oschmod/compare/0.1.5...0.2.0) + +**Released**: 2020.04.20 + +**Summary**: + +* Add recursive version of `oschmod.set_mode()`: `oschmod.set_mode_recursive()` + ### 0.1.5 -**Commit Delta**: [Change from 0.1.0 release](https://github.com/YakDriver/oschmod/compare/0.1.4...0.1.5) +**Commit Delta**: [Change from 0.1.4 release](https://github.com/YakDriver/oschmod/compare/0.1.4...0.1.5) **Released**: 2020.04.17