Add symlink support to zip script (#32257)
diff --git a/build/zip.py b/build/zip.py
index 7936ea2..1a71242 100755
--- a/build/zip.py
+++ b/build/zip.py
@@ -8,6 +8,7 @@
import json
import zipfile
import os
+import stat
import sys
@@ -15,22 +16,52 @@
path = path.rstrip('/\\')
for root, dirs, files in os.walk(path):
for file in files:
+ if os.path.islink(os.path.join(root, file)):
+ add_symlink(
+ zip_file,
+ os.path.join(root, file),
+ os.path.join(root.replace(path, prefix), file)
+ )
+ continue
zip_file.write(os.path.join(root, file), os.path.join(
root.replace(path, prefix), file))
+def add_symlink(zip_file, source, target):
+ """Adds a symlink to a zip file.
+
+ Args:
+ zip_file: The ZipFile obj where the symlink will be added.
+ source: The full path to the symlink.
+ target: The target path for the symlink within the zip file.
+ """
+ zip_info = zipfile.ZipInfo(target)
+ zip_info.create_system = 3 # Unix like system
+ unix_st_mode = (stat.S_IFLNK | stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR |
+ stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP | stat.S_IROTH |
+ stat.S_IWOTH | stat.S_IXOTH)
+ zip_info.external_attr = unix_st_mode << 16
+ zip_file.writestr(zip_info, source)
+
+
def main(args):
zip_file = zipfile.ZipFile(args.output, 'w', zipfile.ZIP_DEFLATED)
if args.source_file:
with open(args.source_file) as source_file:
file_dict_list = json.load(source_file)
for file_dict in file_dict_list:
+ if os.path.islink(file_dict['source']):
+ add_symlink(zip_file, file_dict['source'], file_dict['destination'])
+ continue
if os.path.isdir(file_dict['source']):
_zip_dir(file_dict['source'], zip_file, file_dict['destination'])
else:
zip_file.write(file_dict['source'], file_dict['destination'])
else:
for path, archive_name in args.input_pairs:
+ if os.path.islink(path):
+ add_symlink(zip_file, path, archive_name)
+ continue
if os.path.isdir(path):
_zip_dir(path, zip_file, archive_name)
else: