From 510cf1a2ab4221234b9666a6499d4291e817fe50 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 21 Jun 2018 23:05:38 +0200 Subject: [PATCH] boostrap: set executable bits when extracting zip files --- python/servo/util.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 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) +# 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) -def extract(src, dst, movedir=None): + 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)