-#! /usr/bin/env python
+#! /usr/bin/env python3
"""Zip (zip -r9) with encoded filenames
- Written by Oleg Broytman. Copyright (C) 2009, 2010 PhiloSoft Design.
+ Written by Oleg Broytman. Copyright (C) 2009-2023 PhiloSoft Design.
"""
import sys, os
from getopt import getopt, GetoptError
-from zipfile import ZipFile, ZIP_DEFLATED
+from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED
from m_lib.defenc import default_encoding
def usage():
usage()
def addToZip(zf, path):
- if os.path.isfile(path):
+ if os.path.isfile(path) or os.path.islink(path):
print(path)
- recoded_path = path.decode(default_encoding).encode('cp866')
- zf.write(path, recoded_path, ZIP_DEFLATED)
+ if isinstance(path, bytes):
+ recoded_path = path.decode(default_encoding).encode('cp866')
+ else:
+ recoded_path = path
+ if os.path.islink(path):
+ # http://www.mail-archive.com/python-list@python.org/msg34223.html
+ zipInfo = ZipInfo(recoded_path)
+ zipInfo.create_system = 3
+ # say, symlink attr magic...
+ zipInfo.external_attr = 0xA1ED0000
+ zf.writestr(zipInfo, os.readlink(path))
+ else:
+ zf.write(path, recoded_path, ZIP_DEFLATED)
elif os.path.isdir(path):
for nm in os.listdir(path):
addToZip(zf, os.path.join(path, nm))