2929There normally shouldn't be any need to import this module directly.
3030It will usually be imported through the generic SCons.Tool.Tool()
3131selection method.
32-
3332"""
3433
3534import os
3635
36+ import SCons .Action
3737import SCons .Builder
3838import SCons .Defaults
3939import SCons .Node .FS
4040import SCons .Util
4141
42- import time
4342import zipfile
4443
4544
4645zip_compression = zipfile .ZIP_DEFLATED
4746
4847
49- def _create_zipinfo_for_file (fname , arcname , date_time , compression ):
50- st = os .stat (fname )
51- if not date_time :
52- mtime = time .localtime (st .st_mtime )
53- date_time = mtime [0 :6 ]
54- zinfo = zipfile .ZipInfo (filename = arcname , date_time = date_time )
55- zinfo .external_attr = (st .st_mode & 0xFFFF ) << 16 # Unix attributes
48+ def _create_zipinfo_for_file (fname : str , arcname : str , date_time : tuple , compression : int ) -> zipfile .ZipInfo :
49+ zinfo = zipfile .ZipInfo .from_file (fname , arcname )
50+ if date_time :
51+ zinfo .date_time = date_time
5652 zinfo .compress_type = compression
57- zinfo .file_size = st .st_size
5853 return zinfo
5954
6055
6156def zip_builder (target , source , env ) -> None :
62- compression = env .get ('ZIPCOMPRESSION' , zipfile .ZIP_STORED )
63- zip_root = str (env .get ('ZIPROOT' , '' ))
64- date_time = env .get ('ZIP_OVERRIDE_TIMESTAMP' )
57+ compression : int = env .get ('ZIPCOMPRESSION' , zipfile .ZIP_STORED )
58+ zip_root : str = str (env .get ('ZIPROOT' , '' ))
59+ date_time : tuple = env .get ('ZIP_OVERRIDE_TIMESTAMP' )
6560
66- files = []
61+ files : list [ str ] = []
6762 for s in source :
6863 if s .isdir ():
6964 for dirpath , dirnames , filenames in os .walk (str (s )):
@@ -74,10 +69,9 @@ def zip_builder(target, source, env) -> None:
7469 else :
7570 files .append (str (s ))
7671
77- with zipfile .ZipFile (str (target [0 ]), 'w' , compression ) as zf :
72+ with zipfile .ZipFile (str (target [0 ]), mode = 'w' , compression = compression ) as zf :
7873 for fname in files :
7974 arcname = os .path .relpath (fname , zip_root )
80- # TODO: Switch to ZipInfo.from_file when 3.6 becomes the base python version
8175 zinfo = _create_zipinfo_for_file (fname , arcname , date_time , compression )
8276 with open (fname , "rb" ) as f :
8377 zf .writestr (zinfo , f .read ())
@@ -92,7 +86,7 @@ def zip_builder(target, source, env) -> None:
9286 source_factory = SCons .Node .FS .Entry ,
9387 source_scanner = SCons .Defaults .DirScanner ,
9488 suffix = '$ZIPSUFFIX' ,
95- multi = 1 )
89+ multi = True )
9690
9791
9892def generate (env ) -> None :
0 commit comments