aboutsummaryrefslogtreecommitdiffstats
path: root/python/servo/util.py
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2018-06-21 23:05:38 +0200
committerSimon Sapin <simon.sapin@exyr.org>2018-07-02 13:25:44 +0200
commit510cf1a2ab4221234b9666a6499d4291e817fe50 (patch)
treedfe0fd359c50859d943597e377c87616dd1f5f6e /python/servo/util.py
parentb9d5f11b208e3b888433e9de3ad5eee503e82ea1 (diff)
downloadservo-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.py24
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)