Coverage for pyguymer3/perms.py: 2%
42 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-08 18:47 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-08 18:47 +0000
1#!/usr/bin/env python3
3# Define function ...
4def perms(
5 path,
6 /,
7 *,
8 allowHidden = False,
9 debug = __debug__,
10 ensureNFC = True,
11 filePerms = None,
12 folderPerms = None,
13 follow_symlinks = True,
14 group = None,
15 return_symlinks = False,
16 skips = None,
17 user = None,
18):
19 """Set permissions within a path.
21 This function sets the file/folder mode and group/user owner of all files
22 and folders within the path.
24 Parameters
25 ----------
26 path : str
27 the path to set permissions within
28 allowHidden : bool, optional
29 allow hidden files
30 debug : bool, optional
31 print debug messages
32 ensureNFC : bool, optional
33 ensure that the Unicode encoding is NFC
34 filePerms : int, default=None
35 desired file mode (recommended to supply integer in octal to improve clarity)
36 folderPerms : int, default=None
37 desired folder mode (recommended to supply integer in octal to improve clarity)
38 group : str, default=None
39 desired group owner
40 user : str, default=None
41 desired user owner
42 follow_symlinks : bool, optional
43 follow symbolic links
44 return_symlinks : bool, optional
45 set permissions on symbolic links
46 skips : list of str, default=[]
47 a list of strings which, if any are present in a file/folder name, result in the file/folder being skipped
49 Notes
50 -----
51 Copyright 2017 Thomas Guymer [1]_
53 References
54 ----------
55 .. [1] PyGuymer3, https://github.com/Guymer/PyGuymer3
56 """
58 # Import standard modules ...
59 import os
60 import shutil
61 import stat
63 # Import sub-functions ...
64 from .return_file_list import return_file_list
65 from .return_folder_list import return_folder_list
66 from .stat import stat as myStat # NOTE: To avoid name clash.
68 # Populate default values ...
69 if skips is None:
70 skips = []
72 # Fetch lists ...
73 flist = return_file_list(
74 path,
75 allowHidden = allowHidden,
76 debug = debug,
77 ensureNFC = ensureNFC,
78 follow_symlinks = follow_symlinks,
79 return_symlinks = return_symlinks,
80 )
81 dlist = return_folder_list(
82 path,
83 allowHidden = allowHidden,
84 debug = debug,
85 ensureNFC = ensureNFC,
86 follow_symlinks = follow_symlinks,
87 return_symlinks = return_symlinks,
88 )
90 # Loop over files and folders ...
91 for name in flist + dlist:
92 # Skip if it needs to be skipped ...
93 toSkip = False
94 for skip in skips:
95 if skip in name:
96 toSkip = True
97 break
98 if toSkip:
99 continue
101 # Fetch information ...
102 info = myStat(name, follow_symlinks = follow_symlinks)
104 # Set group owner if it is wrong ...
105 if group is not None:
106 if info["group"] != group:
107 if debug:
108 print(f'INFO: Changing group owner of \"{name}\" to \"{group}\" (it is \"{info["group"]}\").')
109 shutil.chown(name, group = group)
111 # Set user owner if it is wrong ...
112 if user is not None:
113 if info["user"] != user:
114 if debug:
115 print(f'INFO: Changing user owner of \"{name}\" to \"{user}\" (it is \"{info["user"]}\").')
116 shutil.chown(name, user = user)
118 # Set file permissions if it is wrong ...
119 if stat.S_ISREG(info["st_mode"]):
120 if filePerms is not None:
121 if stat.S_IMODE(info["st_mode"]) != filePerms:
122 if debug:
123 print(f'INFO: Changing file permissions of \"{name}\" to \"{oct(filePerms)}\" (it is \"{oct(stat.S_IMODE(info["st_mode"]))}\").')
124 os.chmod(
125 name,
126 filePerms,
127 follow_symlinks = follow_symlinks,
128 )
130 # Set folder permissions if it is wrong ...
131 if stat.S_ISDIR(info["st_mode"]):
132 if folderPerms is not None:
133 if stat.S_IMODE(info["st_mode"]) != folderPerms:
134 if debug:
135 print(f'INFO: Changing folder permissions of \"{name}\" to \"{oct(folderPerms)}\" (it is \"{oct(stat.S_IMODE(info["st_mode"]))}\").')
136 os.chmod(
137 name,
138 folderPerms,
139 follow_symlinks = follow_symlinks,
140 )