From 510cf1a2ab4221234b9666a6499d4291e817fe50 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 21 Jun 2018 23:05:38 +0200 Subject: boostrap: set executable bits when extracting zip files --- python/servo/util.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'python/servo/util.py') 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) -- cgit v1.2.3