Skip to content

Commit be3497b

Browse files
committed
Fix test_dir_without_exec_permission on Python 3.14
One unit test fails on Python 3.14 as follows: ``` _____________ TestFolderTraversal.test_dir_without_exec_permission _____________ self = <test.unit.scan.test_folder_traversal.TestFolderTraversal object at 0x7f5530606350> tmp_path = PosixPath('/tmp/pytest-of-sbuild/pytest-0/test_dir_without_exec_permissi0') fs_perm_tool = <test.unit.conftest.UnixPermTool object at 0x7f55301ca510> @pytest.mark.skipif( platform.system() == 'Windows', reason='Unix-only filesystem permissions are tested', ) def test_dir_without_exec_permission(self, tmp_path, fs_perm_tool): """Test that a excluded directory/file without permissions emits warnings.""" no_perm_dir = tmp_path / 'no_perm_dir' no_perm_dir.mkdir() (no_perm_dir / 'file.txt').touch() (no_perm_dir / 'file2.txt').touch() # chmod -x no_perm_dir no_perm_dir.chmod(0o600) scan_policy = ScanPoliciesManager() reporter = ProgressReport(sys.stdout, False) folder = LocalFolder(str(tmp_path)) local_paths = folder.all_files(reporter=reporter, policies_manager=scan_policy) absolute_paths = [path.absolute_path for path in local_paths] assert not absolute_paths # Check that no access warnings are issued for the excluded directory/file > assert set(reporter.warnings) == { f'WARNING: {tmp_path/"no_perm_dir/file.txt"} could not be accessed (no permissions to read?)', f'WARNING: {tmp_path/"no_perm_dir/file2.txt"} could not be accessed (no permissions to read?)', } E AssertionError: assert {'WARNING: /t...en symlink?)'} == {'WARNING: /t...ns to read?)'} E E Extra items in the left set: E 'WARNING: /tmp/pytest-of-sbuild/pytest-0/test_dir_without_exec_permissi0/no_perm_dir/file2.txt could not be accessed (broken symlink?)' E 'WARNING: /tmp/pytest-of-sbuild/pytest-0/test_dir_without_exec_permissi0/no_perm_dir/file.txt could not be accessed (broken symlink?)' E Extra items in the right set: E 'WARNING: /tmp/pytest-of-sbuild/pytest-0/test_dir_without_exec_permissi0/no_perm_dir/file.txt could not be accessed (no permissions to read?)' E 'WARNING: /tmp/pytest-of-sbuild/pytest-0/test_dir_without_exec_permissi0/no_perm_dir/file2.txt could not be accessed (no permissions to read?)' E Use -v to get more diff test/unit/scan/test_folder_traversal.py:721: AssertionError ``` This is due to python/cpython#118243. I'm not sure how important it is to preserve the exact same warning message here, but the conservative approach is to do so; https://docs.python.org/3/library/pathlib.html advises using `Path.stat` to distinguish these cases.
1 parent c884f6f commit be3497b

2 files changed

Lines changed: 8 additions & 1 deletion

File tree

b2sdk/_internal/scan/folder.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import os
1414
import platform
1515
import re
16+
import stat
1617
import sys
1718
from abc import ABCMeta, abstractmethod
1819
from pathlib import Path
@@ -274,14 +275,19 @@ def _walk_relative_paths(
274275
reporter.invalid_name(str(local_path), str(e))
275276
continue
276277

278+
# Deliberately don't use Path.is_dir here: for directories
279+
# without search permission, Python 3.13 raises PermissionError
280+
# while Python 3.14 returns False.
277281
try:
278-
is_dir = local_path.is_dir()
282+
is_dir = stat.S_ISDIR(local_path.stat().st_mode)
279283
except PermissionError: # `chmod -x dir` can trigger this
280284
if reporter is not None and not policies_manager.should_exclude_local_directory(
281285
str(relative_file_path)
282286
):
283287
reporter.local_permission_error(str(local_path))
284288
continue
289+
except (OSError, ValueError):
290+
is_dir = False
285291

286292
if is_dir:
287293
if policies_manager.should_exclude_local_directory(str(relative_file_path)):

changelog.d/+py314-test.fixed.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix `TestFolderTraversal.test_dir_without_exec_permission` on Python 3.14.

0 commit comments

Comments
 (0)