summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosip Delic <delijati@googlemail.com>2022-03-10 18:05:05 +0100
committerAnderson Bravalheri <andersonbravalheri@gmail.com>2022-03-14 10:59:25 +0000
commitd8fd1c29384bdf0cfab2c030910cee1cf19fc0af (patch)
tree103af708f6a7648523ec00545b6939f3fb3d723a
parent8aa366d568b67339f04ca538c6fb11aad6ad1c91 (diff)
downloadpython-setuptools-git-d8fd1c29384bdf0cfab2c030910cee1cf19fc0af.tar.gz
Fix ZipFile mode not set
-rw-r--r--setuptools/wheel.py16
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):