Coverage for pyguymer3/perms.py: 2%

42 statements  

« prev     ^ index     » next       coverage.py v7.9.2, created at 2025-07-08 18:47 +0000

1#!/usr/bin/env python3 

2 

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. 

20 

21 This function sets the file/folder mode and group/user owner of all files 

22 and folders within the path. 

23 

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 

48 

49 Notes 

50 ----- 

51 Copyright 2017 Thomas Guymer [1]_ 

52 

53 References 

54 ---------- 

55 .. [1] PyGuymer3, https://github.com/Guymer/PyGuymer3 

56 """ 

57 

58 # Import standard modules ... 

59 import os 

60 import shutil 

61 import stat 

62 

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. 

67 

68 # Populate default values ... 

69 if skips is None: 

70 skips = [] 

71 

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 ) 

89 

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 

100 

101 # Fetch information ... 

102 info = myStat(name, follow_symlinks = follow_symlinks) 

103 

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) 

110 

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) 

117 

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 ) 

129 

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 )