diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2018-06-21 23:05:38 +0200 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2018-07-02 13:25:44 +0200 |
commit | 510cf1a2ab4221234b9666a6499d4291e817fe50 (patch) | |
tree | dfe0fd359c50859d943597e377c87616dd1f5f6e /python/servo/util.py | |
parent | b9d5f11b208e3b888433e9de3ad5eee503e82ea1 (diff) | |
download | servo-510cf1a2ab4221234b9666a6499d4291e817fe50.tar.gz servo-510cf1a2ab4221234b9666a6499d4291e817fe50.zip |
boostrap: set executable bits when extracting zip files
Diffstat (limited to 'python/servo/util.py')
-rw-r--r-- | python/servo/util.py | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/python/servo/util.py b/python/servo/util.py index a4e126d3240..7c4cc5aee1b 100644 --- a/python/servo/util.py +++ b/python/servo/util.py @@ -153,10 +153,25 @@ def download_file(desc, src, dst): download(desc, src, fd) os.rename(tmp_path, dst) - -def extract(src, dst, movedir=None): +# https://stackoverflow.com/questions/39296101/python-zipfile-removes-execute-permissions-from-binaries +# In particular, we want the executable bit for executable files. +class ZipFileWithUnixPermissions(zipfile.ZipFile): + def extract(self, member, path=None, pwd=None): + if not isinstance(member, zipfile.ZipInfo): + member = self.getinfo(member) + + if path is None: + path = os.getcwd() + + extracted = self._extract_member(member, path, pwd) + mode = os.stat(extracted).st_mode + mode |= (member.external_attr >> 16) + os.chmod(extracted, mode) + return extracted + +def extract(src, dst, movedir=None, remove=True): assert src.endswith(".zip") - zipfile.ZipFile(src).extractall(dst) + ZipFileWithUnixPermissions(src).extractall(dst) if movedir: for f in os.listdir(movedir): @@ -165,7 +180,8 @@ def extract(src, dst, movedir=None): os.rename(frm, to) os.rmdir(movedir) - os.remove(src) + if remove: + os.remove(src) def check_hash(filename, expected, algorithm): hasher = hashlib.new(algorithm) |