|
27 | 27 | "__import__('pkg_resources').declare_namespace(__name__)\n"
|
28 | 28 |
|
29 | 29 |
|
| 30 | +class ZipFilePreserveMode(zipfile.ZipFile): |
| 31 | + """ Extended ZipFile class to preserve file mode """ |
| 32 | + def _extract_member(self, member, targetpath, pwd): |
| 33 | + if not isinstance(member, zipfile.ZipInfo): |
| 34 | + member = self.getinfo(member) |
| 35 | + |
| 36 | + targetpath = super()._extract_member(member, targetpath, pwd) |
| 37 | + |
| 38 | + attr = member.external_attr >> 16 |
| 39 | + if attr != 0: |
| 40 | + os.chmod(targetpath, attr) |
| 41 | + return targetpath |
| 42 | + |
| 43 | + |
30 | 44 | def unpack(src_dir, dst_dir):
|
31 | 45 | '''Move everything under `src_dir` to `dst_dir`, and delete the former.'''
|
32 | 46 | for dirpath, dirnames, filenames in os.walk(src_dir):
|
@@ -91,7 +105,7 @@ def get_dist_info(self, zf):
|
91 | 105 |
|
92 | 106 | def install_as_egg(self, destination_eggdir):
|
93 | 107 | '''Install wheel as an egg directory.'''
|
94 |
| - with zipfile.ZipFile(self.filename) as zf: |
| 108 | + with ZipFilePreserveMode(self.filename) as zf: |
95 | 109 | self._install_as_egg(destination_eggdir, zf)
|
96 | 110 |
|
97 | 111 | def _install_as_egg(self, destination_eggdir, zf):
|
|
0 commit comments