diff --git a/swh/core/tarball.py b/swh/core/tarball.py --- a/swh/core/tarball.py +++ b/swh/core/tarball.py @@ -179,8 +179,11 @@ Args: path: the path under which permissions should be normalized """ - for dirpath, _, fnames in os.walk(path): + for dirpath, dnames, fnames in os.walk(path): os.chmod(dirpath, 0o0755) + for dname in dnames: + dpath = os.path.join(dirpath, dname) + os.chmod(dpath, 0o0755) for fname in fnames: fpath = os.path.join(dirpath, fname) if not os.path.islink(fpath): diff --git a/swh/core/tests/test_tarball.py b/swh/core/tests/test_tarball.py --- a/swh/core/tests/test_tarball.py +++ b/swh/core/tests/test_tarball.py @@ -6,6 +6,7 @@ import hashlib import os import shutil +import stat import pytest @@ -186,16 +187,26 @@ file_path.touch() file_path.chmod(perms) + # add directory without any permission + dir_path = tmp_path / "dir" + dir_path.mkdir(mode=stat.S_IFDIR) + for file in tmp_path.iterdir(): - assert file.stat().st_mode == 0o100000 | int(file.name) + if file.is_dir(): + assert file.stat().st_mode == stat.S_IFDIR + else: + assert file.stat().st_mode == 0o100000 | int(file.name) tarball.normalize_permissions(str(tmp_path)) for file in tmp_path.iterdir(): - if int(file.name) & 0o100: # original file was executable for its owner - assert file.stat().st_mode == 0o100755 + if file.is_dir(): + assert file.stat().st_mode == stat.S_IFDIR + 0o000755 else: - assert file.stat().st_mode == 0o100644 + if int(file.name) & 0o100: # original file was executable for its owner + assert file.stat().st_mode == 0o100755 + else: + assert file.stat().st_mode == 0o100644 def test_unpcompress_zip_imploded(tmp_path, datadir):