##// END OF EJS Templates
fix(hooks): make compat for WSL filesystem better by explicity only changing permissions if they are lower at creation time.
super-admin -
r1186:652285bb default
parent child Browse files
Show More
@@ -27,6 +27,19 b' from vcsserver.str_utils import safe_byt'
27
27
28 log = logging.getLogger(__name__)
28 log = logging.getLogger(__name__)
29
29
30 HOOKS_DIR_MODE = 0o755
note

Ok, isso é um teste. Não use maiusculas.

Certo.

Feito

31 HOOKS_FILE_MODE = 0o755
32
33
34 def set_permissions_if_needed(path_to_check, perms: oct):
35 # Get current permissions
36 current_permissions = os.stat(path_to_check).st_mode & 0o777 # Extract permission bits
37
38 # Check if current permissions are lower than required
39 if current_permissions < int(perms):
40 # Change the permissions if they are lower than required
41 os.chmod(path_to_check, perms)
42
30
43
31 def get_git_hooks_path(repo_path, bare):
44 def get_git_hooks_path(repo_path, bare):
32 hooks_path = os.path.join(repo_path, 'hooks')
45 hooks_path = os.path.join(repo_path, 'hooks')
@@ -51,10 +64,9 b' def install_git_hooks(repo_path, bare, e'
51 # we always call it to ensure dir exists and it has a proper mode
64 # we always call it to ensure dir exists and it has a proper mode
52 if not os.path.exists(hooks_path):
65 if not os.path.exists(hooks_path):
53 # If it doesn't exist, create a new directory with the specified mode
66 # If it doesn't exist, create a new directory with the specified mode
54 os.makedirs(hooks_path, mode=0o777, exist_ok=True)
67 os.makedirs(hooks_path, mode=HOOKS_DIR_MODE, exist_ok=True)
55 else:
56 # If it exists, change the directory's mode to the specified mode
68 # If it exists, change the directory's mode to the specified mode
57 os.chmod(hooks_path, mode=0o777)
69 set_permissions_if_needed(hooks_path, perms=HOOKS_DIR_MODE)
58
70
59 tmpl_post = pkg_resources.resource_string(
71 tmpl_post = pkg_resources.resource_string(
60 'vcsserver', '/'.join(
72 'vcsserver', '/'.join(
@@ -80,7 +92,7 b' def install_git_hooks(repo_path, bare, e'
80 template = template.replace(b'_ENV_', safe_bytes(executable))
92 template = template.replace(b'_ENV_', safe_bytes(executable))
81 template = template.replace(b'_PATH_', safe_bytes(path))
93 template = template.replace(b'_PATH_', safe_bytes(path))
82 f.write(template)
94 f.write(template)
83 os.chmod(_hook_file, 0o755)
95 set_permissions_if_needed(_hook_file, perms=HOOKS_FILE_MODE)
84 except OSError:
96 except OSError:
85 log.exception('error writing hook file %s', _hook_file)
97 log.exception('error writing hook file %s', _hook_file)
86 else:
98 else:
@@ -22,8 +22,9 b' import pytest'
22 import vcsserver
22 import vcsserver
23 import tempfile
23 import tempfile
24 from vcsserver import hook_utils
24 from vcsserver import hook_utils
25 from vcsserver.hook_utils import set_permissions_if_needed, HOOKS_DIR_MODE, HOOKS_FILE_MODE
25 from vcsserver.tests.fixture import no_newline_id_generator
26 from vcsserver.tests.fixture import no_newline_id_generator
26 from vcsserver.str_utils import safe_bytes, safe_str
27 from vcsserver.str_utils import safe_bytes
27 from vcsserver.utils import AttributeDict
28 from vcsserver.utils import AttributeDict
28
29
29
30
@@ -58,13 +59,22 b' class TestCheckRhodecodeHook:'
58 class BaseInstallHooks:
59 class BaseInstallHooks:
59 HOOK_FILES = ()
60 HOOK_FILES = ()
60
61
62 def _check_hook_file_dir_mode(self, file_path):
63 dir_path = os.path.dirname(file_path)
64 assert os.path.exists(dir_path), f'dir {file_path} missing'
65 stat_info = os.stat(dir_path)
66
67 file_mode = stat.S_IMODE(stat_info.st_mode)
68 expected_mode = int(HOOKS_DIR_MODE)
69 assert expected_mode == file_mode, f'expected mode: {oct(expected_mode)} got: {oct(file_mode)} for {dir_path}'
70
61 def _check_hook_file_mode(self, file_path):
71 def _check_hook_file_mode(self, file_path):
62 assert os.path.exists(file_path), f'path {file_path} missing'
72 assert os.path.exists(file_path), f'path {file_path} missing'
63 stat_info = os.stat(file_path)
73 stat_info = os.stat(file_path)
64
74
65 file_mode = stat.S_IMODE(stat_info.st_mode)
75 file_mode = stat.S_IMODE(stat_info.st_mode)
66 expected_mode = int('755', 8)
76 expected_mode = int(HOOKS_FILE_MODE)
67 assert expected_mode == file_mode
77 assert expected_mode == file_mode, f'expected mode: {oct(expected_mode)} got: {oct(file_mode)} for {file_path}'
68
78
69 def _check_hook_file_content(self, file_path, executable):
79 def _check_hook_file_content(self, file_path, executable):
70 executable = executable or sys.executable
80 executable = executable or sys.executable
@@ -102,6 +112,8 b' class BaseInstallHooks:'
102 file_path = os.path.join(repo_path, 'hooks', file_name)
112 file_path = os.path.join(repo_path, 'hooks', file_name)
103 else:
113 else:
104 file_path = os.path.join(repo_path, '.git', 'hooks', file_name)
114 file_path = os.path.join(repo_path, '.git', 'hooks', file_name)
115
116 self._check_hook_file_dir_mode(file_path)
105 self._check_hook_file_mode(file_path)
117 self._check_hook_file_mode(file_path)
106 self._check_hook_file_content(file_path, sys.executable)
118 self._check_hook_file_content(file_path, sys.executable)
107
119
@@ -204,3 +216,74 b' class TestInstallSvnHooks(BaseInstallHoo'
204 repo.path, force_create=True)
216 repo.path, force_create=True)
205 assert result
217 assert result
206 self.check_hooks(repo.path, )
218 self.check_hooks(repo.path, )
219
220
221 def create_test_file(filename):
222 """Utility function to create a test file."""
223 with open(filename, 'w') as f:
224 f.write("Test file")
225
226
227 def remove_test_file(filename):
228 """Utility function to remove a test file."""
229 if os.path.exists(filename):
230 os.remove(filename)
231
232
233 @pytest.fixture
234 def test_file():
235 filename = 'test_file.txt'
236 create_test_file(filename)
237 yield filename
238 remove_test_file(filename)
239
240
241 def test_increase_permissions(test_file):
242 # Set initial lower permissions
243 initial_perms = 0o644
244 os.chmod(test_file, initial_perms)
245
246 # Set higher permissions
247 new_perms = 0o666
248 set_permissions_if_needed(test_file, new_perms)
249
250 # Check if permissions were updated
251 assert (os.stat(test_file).st_mode & 0o777) == new_perms
252
253
254 def test_no_permission_change_needed(test_file):
255 # Set initial permissions
256 initial_perms = 0o666
257 os.chmod(test_file, initial_perms)
258
259 # Attempt to set the same permissions
260 set_permissions_if_needed(test_file, initial_perms)
261
262 # Check if permissions were unchanged
263 assert (os.stat(test_file).st_mode & 0o777) == initial_perms
264
265
266 def test_no_permission_reduction(test_file):
267 # Set initial higher permissions
268 initial_perms = 0o666
269 os.chmod(test_file, initial_perms)
270
271 # Attempt to set lower permissions
272 lower_perms = 0o644
273 set_permissions_if_needed(test_file, lower_perms)
274
275 # Check if permissions were not reduced
276 assert (os.stat(test_file).st_mode & 0o777) == initial_perms
277
278
279 def test_no_permission_reduction_when_on_777(test_file):
280 # Set initial higher permissions
281 initial_perms = 0o777
282 os.chmod(test_file, initial_perms)
283
284 # Attempt to set lower permissions
285 lower_perms = 0o755
286 set_permissions_if_needed(test_file, lower_perms)
287
288 # Check if permissions were not reduced
289 assert (os.stat(test_file).st_mode & 0o777) == initial_perms
General Comments 0
You need to be logged in to leave comments. Login now