diff options
author | Josip Delic <delijati@googlemail.com> | 2022-03-10 18:05:05 +0100 |
---|---|---|
committer | Anderson Bravalheri <andersonbravalheri@gmail.com> | 2022-03-14 10:59:25 +0000 |
commit | d8fd1c29384bdf0cfab2c030910cee1cf19fc0af (patch) | |
tree | 103af708f6a7648523ec00545b6939f3fb3d723a | |
parent | 8aa366d568b67339f04ca538c6fb11aad6ad1c91 (diff) | |
download | python-setuptools-git-d8fd1c29384bdf0cfab2c030910cee1cf19fc0af.tar.gz |
Fix ZipFile mode not set
-rw-r--r-- | setuptools/wheel.py | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/setuptools/wheel.py b/setuptools/wheel.py index 9819e8b9..6e8cfa98 100644 --- a/setuptools/wheel.py +++ b/setuptools/wheel.py @@ -27,6 +27,20 @@ NAMESPACE_PACKAGE_INIT = \ "__import__('pkg_resources').declare_namespace(__name__)\n" +class ZipFilePreserveMode(zipfile.ZipFile): + """ Extended ZipFile class to preserve file mode """ + def _extract_member(self, member, targetpath, pwd): + if not isinstance(member, zipfile.ZipInfo): + member = self.getinfo(member) + + targetpath = super()._extract_member(member, targetpath, pwd) + + attr = member.external_attr >> 16 + if attr != 0: + os.chmod(targetpath, attr) + return targetpath + + def unpack(src_dir, dst_dir): '''Move everything under `src_dir` to `dst_dir`, and delete the former.''' for dirpath, dirnames, filenames in os.walk(src_dir): @@ -91,7 +105,7 @@ class Wheel: def install_as_egg(self, destination_eggdir): '''Install wheel as an egg directory.''' - with zipfile.ZipFile(self.filename) as zf: + with ZipFilePreserveMode(self.filename) as zf: self._install_as_egg(destination_eggdir, zf) def _install_as_egg(self, destination_eggdir, zf): |