File: ziptools/ziptools/docetc/1.2-upgrades/verify-1.2-utc-timestamps.txt
#========================================================================================= # Demo 1.2 UTC timestamp modtimes, with "trace" set to print in zipmodtimeutc.py. # This file's code was run on Mac OS (Unix). Its tests (and sections): # # 1 - ziptools under Python 3.X # 2 - ziptools under Python 2.X # 3 - 2.X zips unzipped by 3.X, and vice versa # 4 - Unix 'unzip' of ziptools zips # # Spoiler: # - 3.X and 2.X results are the same, but 2.X doesn't propagate symlink modtimes # - Unix 'unzip' is the same, but doesn't propagate symlink modtimes or permissions # These differences reflect known limitations of Python 2.X on Unix and the Unix 'uzip' # command, not issues with the ziptools 1.2 UTC timestamp upgrade. #========================================================================================= ########################################################################################## # 1) Using Python 3.X (recommended if symlinks) ########################################################################################## # Setup ~/Desktop$ export Z=/MY-STUFF/Code/mergeall/test/ziptools-1.2 ~/Desktop$ export M=/MY-STUFF/Code/mergeall ~/Desktop$ date Mon Apr 6 11:17:03 PDT 2020 # Zip in 3X ~/Desktop$ py3 $Z/zip-create.py cgi12-3x.zip cgi -skipcruft Zipping ['cgi'] to cgi12-3x.zip Cruft patterns: {'keep': ['.htaccess'], 'skip': ['.*', '[dD]esktop.ini', 'Thumbs.db', '~*', '$*', '*.py[co]']} Adding folder cgi ==== Added UTC timestamp: b'UT\x05\x00\x00\x1e-\x86^' Adding file cgi/.htaccess ==== Added UTC timestamp: b'UT\x05\x00\x008\xfcz\\' Adding file cgi/__prior-sitesearch-savedterms.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\x94R\x88Z' Adding file cgi/_prior-sitesearch-savedterms.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xc4$~Y' Adding folder cgi/dev ==== Added UTC timestamp: b'UT\x05\x00\x00\x94\x0b@Y' Adding file cgi/dev/orig-sitesearch.py ==== Added UTC timestamp: b'UT\x05\x00\x00\x0e\xb0\x92V' Adding file cgi/dev/other-sitesearch.py ==== Added UTC timestamp: b'UT\x05\x00\x00 \xef\x92V' Adding file cgi/dev/py2-mock-out.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xa0R\xa6V' Adding file cgi/dev/py3-mock-out.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xa0R\xa6V' Adding file cgi/dev/sitesearch-savedterms-live.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\x0cS\xa6V' Adding file cgi/dev/sitesearch-savedterms.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xa0R\xa6V' Adding file cgi/DIFFS-with-offline-june2017.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xe2\r@Y' Adding link ~folder cgi/DIRLINK1 ==== Added UTC timestamp: b'UT\x05\x00\x00\x08{v^' Adding link ~folder cgi/DIRLINK2 ==== Added UTC timestamp: b'UT\x05\x00\x00N{v^' Adding link ~file cgi/FILELINK1 ==== Added UTC timestamp: b'UT\x05\x00\x00\xe8zv^' Adding link ~file cgi/FILELINK2 ==== Added UTC timestamp: b'UT\x05\x00\x00\xf6zv^' Adding file cgi/HOW-INSTALL-CGI-SCRIPTS.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xc4\xd6\x17]' Adding file cgi/HOW.txt ==== Added UTC timestamp: b'UT\x05\x00\x000P\xd2Z' Adding file cgi/index.html ==== Added UTC timestamp: b'UT\x05\x00\x00\xfe\x02S^' Adding folder cgi/LIVE-Aug2017 ==== Added UTC timestamp: b'UT\x05\x00\x00\xbe\xaa\x87Y' Adding file cgi/LIVE-Aug2017/sitesearch-savedterms.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xbe\xaa\x87Y' Adding folder cgi/LIVE-June2017 ==== Added UTC timestamp: b'UT\x05\x00\x00L\r@Y' Adding file cgi/LIVE-June2017/gdform.cgi ==== Added UTC timestamp: b'UT\x05\x00\x00\x14A8O' Adding file cgi/LIVE-June2017/gdformssl.cgi ==== Added UTC timestamp: b'UT\x05\x00\x00\x14A8O' Adding file cgi/LIVE-June2017/pylotto-players.txt ==== Added UTC timestamp: b'UT\x05\x00\x00>\x0f5Y' Adding file cgi/LIVE-June2017/pylotto.pswd ==== Added UTC timestamp: b'UT\x05\x00\x00\xd0\xe49M' Adding file cgi/LIVE-June2017/pylotto.py ==== Added UTC timestamp: b'UT\x05\x00\x004\xc0gM' Adding file cgi/LIVE-June2017/pylotto24.py ==== Added UTC timestamp: b'UT\x05\x00\x00\x10\xff9M' Adding file cgi/LIVE-June2017/sitesearch-savedterms.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\x0e\x02@Y' Adding file cgi/LIVE-June2017/sitesearch.html ==== Added UTC timestamp: b'UT\x05\x00\x00\xfe\x02S^' Adding file cgi/LIVE-June2017/sitesearch.py ==== Added UTC timestamp: b'UT\x05\x00\x00`S\xa6V' Adding file cgi/pylotto-full.py ==== Added UTC timestamp: b'UT\x05\x00\x00b\xff\x03S' Adding file cgi/pylotto.py ==== Added UTC timestamp: b'UT\x05\x00\x00\x0e`@Y' Adding file cgi/showcode-template.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xe6\xed1]' Adding file cgi/showcode-unicode-demo.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\xf2V\x90Z' Adding file cgi/showcode.py ==== Added UTC timestamp: b'UT\x05\x00\x00R.[]' Adding file cgi/sitesearch-savedterms.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\x8a\x1d\x19]' Adding file cgi/sitesearch.py ==== Added UTC timestamp: b'UT\x05\x00\x00V\x88\x17]' Adding file cgi/temp.html ==== Added UTC timestamp: b'UT\x05\x00\x00\xfe\x02S^' Adding file cgi/test.py ==== Added UTC timestamp: b'UT\x05\x00\x00\xee\x85\xd2Z' Adding file cgi/xreadonly.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\x1a-\x86^' Adding file cgi/xwriteonly.txt ==== Added UTC timestamp: b'UT\x05\x00\x00\x1e-\x86^' Create finished: files=34, folders=4, links=4, unknowns=0, crufts=0. # Clean (else permission error for read-only item present) ~/Desktop$ rm -rf cgi12-3x # Unzip in 3.X ~/Desktop$ py3 $Z/zip-extract.py cgi12-3x.zip cgi12-3x -permissions Unzipping from cgi12-3x.zip to cgi12-3x Extracted cgi/ => cgi12-3x/cgi ==== Got UTC timestamp: 1585851678 Extracted cgi/.htaccess => cgi12-3x/cgi/.htaccess ==== Got UTC timestamp: 1551563832 Extracted cgi/__prior-sitesearch-savedterms.txt => cgi12-3x/cgi/__prior-sitesearch-savedterms.txt ==== Got UTC timestamp: 1518883476 Extracted cgi/_prior-sitesearch-savedterms.txt => cgi12-3x/cgi/_prior-sitesearch-savedterms.txt ==== Got UTC timestamp: 1501439172 Extracted cgi/dev/ => cgi12-3x/cgi/dev ==== Got UTC timestamp: 1497369492 Extracted cgi/dev/orig-sitesearch.py => cgi12-3x/cgi/dev/orig-sitesearch.py ==== Got UTC timestamp: 1452453902 Extracted cgi/dev/other-sitesearch.py => cgi12-3x/cgi/dev/other-sitesearch.py ==== Got UTC timestamp: 1452470048 Extracted cgi/dev/py2-mock-out.txt => cgi12-3x/cgi/dev/py2-mock-out.txt ==== Got UTC timestamp: 1453740704 Extracted cgi/dev/py3-mock-out.txt => cgi12-3x/cgi/dev/py3-mock-out.txt ==== Got UTC timestamp: 1453740704 Extracted cgi/dev/sitesearch-savedterms-live.txt => cgi12-3x/cgi/dev/sitesearch-savedterms-live.txt ==== Got UTC timestamp: 1453740812 Extracted cgi/dev/sitesearch-savedterms.txt => cgi12-3x/cgi/dev/sitesearch-savedterms.txt ==== Got UTC timestamp: 1453740704 Extracted cgi/DIFFS-with-offline-june2017.txt => cgi12-3x/cgi/DIFFS-with-offline-june2017.txt ==== Got UTC timestamp: 1497370082 (Link) Extracted cgi/DIRLINK1 => cgi12-3x/cgi/DIRLINK1 ==== Got UTC timestamp: 1584823048 (Link) Extracted cgi/DIRLINK2 => cgi12-3x/cgi/DIRLINK2 ==== Got UTC timestamp: 1584823118 (Link) Extracted cgi/FILELINK1 => cgi12-3x/cgi/FILELINK1 ==== Got UTC timestamp: 1584823016 (Link) Extracted cgi/FILELINK2 => cgi12-3x/cgi/FILELINK2 ==== Got UTC timestamp: 1584823030 Extracted cgi/HOW-INSTALL-CGI-SCRIPTS.txt => cgi12-3x/cgi/HOW-INSTALL-CGI-SCRIPTS.txt ==== Got UTC timestamp: 1561843396 Extracted cgi/HOW.txt => cgi12-3x/cgi/HOW.txt ==== Got UTC timestamp: 1523732528 Extracted cgi/index.html => cgi12-3x/cgi/index.html ==== Got UTC timestamp: 1582498558 Extracted cgi/LIVE-Aug2017/ => cgi12-3x/cgi/LIVE-Aug2017 ==== Got UTC timestamp: 1502063294 Extracted cgi/LIVE-Aug2017/sitesearch-savedterms.txt => cgi12-3x/cgi/LIVE-Aug2017/sitesearch-savedterms.txt ==== Got UTC timestamp: 1502063294 Extracted cgi/LIVE-June2017/ => cgi12-3x/cgi/LIVE-June2017 ==== Got UTC timestamp: 1497369932 Extracted cgi/LIVE-June2017/gdform.cgi => cgi12-3x/cgi/LIVE-June2017/gdform.cgi ==== Got UTC timestamp: 1329086740 Extracted cgi/LIVE-June2017/gdformssl.cgi => cgi12-3x/cgi/LIVE-June2017/gdformssl.cgi ==== Got UTC timestamp: 1329086740 Extracted cgi/LIVE-June2017/pylotto-players.txt => cgi12-3x/cgi/LIVE-June2017/pylotto-players.txt ==== Got UTC timestamp: 1496649534 Extracted cgi/LIVE-June2017/pylotto.pswd => cgi12-3x/cgi/LIVE-June2017/pylotto.pswd ==== Got UTC timestamp: 1295639760 Extracted cgi/LIVE-June2017/pylotto.py => cgi12-3x/cgi/LIVE-June2017/pylotto.py ==== Got UTC timestamp: 1298645044 Extracted cgi/LIVE-June2017/pylotto24.py => cgi12-3x/cgi/LIVE-June2017/pylotto24.py ==== Got UTC timestamp: 1295646480 Extracted cgi/LIVE-June2017/sitesearch-savedterms.txt => cgi12-3x/cgi/LIVE-June2017/sitesearch-savedterms.txt ==== Got UTC timestamp: 1497367054 Extracted cgi/LIVE-June2017/sitesearch.html => cgi12-3x/cgi/LIVE-June2017/sitesearch.html ==== Got UTC timestamp: 1582498558 Extracted cgi/LIVE-June2017/sitesearch.py => cgi12-3x/cgi/LIVE-June2017/sitesearch.py ==== Got UTC timestamp: 1453740896 Extracted cgi/pylotto-full.py => cgi12-3x/cgi/pylotto-full.py ==== Got UTC timestamp: 1392770914 Extracted cgi/pylotto.py => cgi12-3x/cgi/pylotto.py ==== Got UTC timestamp: 1497391118 Extracted cgi/showcode-template.txt => cgi12-3x/cgi/showcode-template.txt ==== Got UTC timestamp: 1563553254 Extracted cgi/showcode-unicode-demo.txt => cgi12-3x/cgi/showcode-unicode-demo.txt ==== Got UTC timestamp: 1519408882 Extracted cgi/showcode.py => cgi12-3x/cgi/showcode.py ==== Got UTC timestamp: 1566256722 Extracted cgi/sitesearch-savedterms.txt => cgi12-3x/cgi/sitesearch-savedterms.txt ==== Got UTC timestamp: 1561927050 Extracted cgi/sitesearch.py => cgi12-3x/cgi/sitesearch.py ==== Got UTC timestamp: 1561823318 Extracted cgi/temp.html => cgi12-3x/cgi/temp.html ==== Got UTC timestamp: 1582498558 Extracted cgi/test.py => cgi12-3x/cgi/test.py ==== Got UTC timestamp: 1523746286 Extracted cgi/xreadonly.txt => cgi12-3x/cgi/xreadonly.txt ==== Got UTC timestamp: 1585851674 Extracted cgi/xwriteonly.txt => cgi12-3x/cgi/xwriteonly.txt ==== Got UTC timestamp: 1585851678 Extract finished: files=34, folders=4, links=4, unknowns=0. # Timestamps in 3.X ~/Desktop$ py3 >>> import time >>> time.localtime(1561823318) time.struct_time(tm_year=2019, tm_mon=6, tm_mday=29, tm_hour=8, tm_min=48, tm_sec=38, tm_wday=5, tm_yday=180, tm_isdst=1) >>> time.localtime(1582498558) time.struct_time(tm_year=2020, tm_mon=2, tm_mday=23, tm_hour=14, tm_min=55, tm_sec=58, tm_wday=6, tm_yday=54, tm_isdst=0) # Zipped and unzipped in 3.X ~/Desktop$ ls -lT cgi12-3x/cgi total 328 -rw-r--r-- 1 blue staff 1219 Jun 13 09:08:02 2017 DIFFS-with-offline-june2017.txt lrwxr-xr-x 1 blue staff 12 Mar 21 13:37:28 2020 DIRLINK1 -> LIVE-Aug2017 lrwxr-xr-x 1 blue staff 13 Mar 21 13:38:38 2020 DIRLINK2 -> LIVE-Aug2017/ lrw------- 1 blue staff 11 Mar 21 13:36:56 2020 FILELINK1 -> showcode.py lrwxr-xr-x 1 blue staff 25 Mar 21 13:37:10 2020 FILELINK2 -> sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 1768 Jun 29 14:23:16 2019 HOW-INSTALL-CGI-SCRIPTS.txt -rwxrwxrwx 1 blue staff 1042 Apr 14 12:02:08 2018 HOW.txt drwx------ 3 blue staff 102 Aug 6 16:48:14 2017 LIVE-Aug2017 drwxr-xr-x 11 blue staff 374 Jun 13 09:05:32 2017 LIVE-June2017 -rw-r--r-- 1 blue staff 6315 Feb 17 08:04:36 2018 __prior-sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 5205 Jul 30 11:26:12 2017 _prior-sitesearch-savedterms.txt drwxrwxrwx 8 blue staff 272 Jun 13 08:58:12 2017 dev -rw-r--r-- 1 blue staff 2584 Feb 23 14:55:58 2020 index.html -rwxr-xr-x 1 blue staff 20729 Feb 18 16:48:34 2014 pylotto-full.py -rwxr-xr-x 1 blue staff 151 Jun 13 14:58:38 2017 pylotto.py -rwxrwxrwx 1 blue staff 3035 Jul 19 09:20:54 2019 showcode-template.txt -rw-r--r-- 1 blue staff 72 Feb 23 10:01:22 2018 showcode-unicode-demo.txt -rw------- 1 blue staff 26250 Aug 19 16:18:42 2019 showcode.py -rw------- 1 blue staff 13948 Jun 30 13:37:30 2019 sitesearch-savedterms.txt -rwxr-xr-x 1 blue staff 14054 Jun 29 08:48:38 2019 sitesearch.py -rw-r--r-- 1 blue staff 15372 Feb 23 14:55:58 2020 temp.html -rwxr-xr-x 1 blue staff 78 Apr 14 15:51:26 2018 test.py -r--r--r-- 1 blue staff 0 Apr 2 11:21:14 2020 xreadonly.txt -rw--w--w- 1 blue staff 0 Apr 2 11:21:18 2020 xwriteonly.txt # Original (same) ~/Desktop$ ls -lT cgi total 328 -rw-r--r-- 1 blue staff 1219 Jun 13 09:08:02 2017 DIFFS-with-offline-june2017.txt lrwxr-xr-x 1 blue staff 12 Mar 21 13:37:28 2020 DIRLINK1 -> LIVE-Aug2017 lrwxr-xr-x 1 blue staff 13 Mar 21 13:38:38 2020 DIRLINK2 -> LIVE-Aug2017/ lrw------- 1 blue staff 11 Mar 21 13:36:56 2020 FILELINK1 -> showcode.py lrwxr-xr-x 1 blue staff 25 Mar 21 13:37:10 2020 FILELINK2 -> sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 1768 Jun 29 14:23:16 2019 HOW-INSTALL-CGI-SCRIPTS.txt -rwxrwxrwx 1 blue staff 1042 Apr 14 12:02:08 2018 HOW.txt drwx------ 3 blue staff 102 Aug 6 16:48:14 2017 LIVE-Aug2017 drwxr-xr-x 11 blue staff 374 Jun 13 09:05:32 2017 LIVE-June2017 -rw-r--r-- 1 blue staff 6315 Feb 17 08:04:36 2018 __prior-sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 5205 Jul 30 11:26:12 2017 _prior-sitesearch-savedterms.txt drwxrwxrwx 8 blue staff 272 Jun 13 08:58:12 2017 dev -rw-r--r-- 1 blue staff 2584 Feb 23 14:55:58 2020 index.html -rwxr-xr-x 1 blue staff 20729 Feb 18 16:48:34 2014 pylotto-full.py -rwxr-xr-x 1 blue staff 151 Jun 13 14:58:38 2017 pylotto.py -rwxrwxrwx 1 blue staff 3035 Jul 19 09:20:54 2019 showcode-template.txt -rw-r--r-- 1 blue staff 72 Feb 23 10:01:22 2018 showcode-unicode-demo.txt -rw------- 1 blue staff 26250 Aug 19 16:18:42 2019 showcode.py -rw------- 1 blue staff 13948 Jun 30 13:37:30 2019 sitesearch-savedterms.txt -rwxr-xr-x 1 blue staff 14054 Jun 29 08:48:38 2019 sitesearch.py -rw-r--r-- 1 blue staff 15372 Feb 23 14:55:58 2020 temp.html -rwxr-xr-x 1 blue staff 78 Apr 14 15:51:26 2018 test.py -r--r--r-- 1 blue staff 0 Apr 2 11:21:14 2020 xreadonly.txt -rw--w--w- 1 blue staff 0 Apr 2 11:21:18 2020 xwriteonly.txt # Check 3.X content (same) ~/Desktop$ py3 $M/diffall.py cgi cgi12-3x/cgi -skipcruft | tail -n 6 ================================================================================ Runtime hrs:mins:secs = 0:0:0.01 Dirs checked 4, Files checked: 38, Files skipped: 0 System metadata (cruft) files were skipped No diffs found. End of report. # Check 3.X modtimes (same) ~/Desktop$ py3 $M/mergeall.py cgi cgi12-3x/cgi -skipcruft -report | tail -n 9 ------------------------------------------------------------------------------- *Summary Compared => files: 34, folders: 4 Differences => samefile: 0, uniqueto: 0, uniquefrom: 0, mixedmode: 0 Changed: files => created: 0, deleted: 0, replaced: 0 folders => created: 0, deleted: 0, replaced: 0 ------------------------------------------------------------------------------- Finished. # Unzipping a file without UTC timestamps (local time used) ~/Desktop$ py3 $Z/zip-extract.py cgi cgi12-3x-noutc -permissions | tail -n 10 Extracted cgi/test.py => cgi12-3x-noutc/cgi/test.py ==== No UTC timestamp found: used local Extracted cgi/xreadonly.txt => cgi12-3x-noutc/cgi/xreadonly.txt ==== No UTC timestamp found: used local Extracted cgi/xwriteonly.txt => cgi12-3x-noutc/cgi/xwriteonly.txt ==== No UTC timestamp found: used local Extract finished: files=34, folders=4, links=4, unknowns=0. ########################################################################################## # 2) Using Python 2.X (same, EXCEPT for 4 links' modtimes - a known 2.X limitation) ########################################################################################## # Zip n 2.X ~/Desktop$ py2 $Z/zip-create.py cgi12-2x.zip cgi -skipcruft Zipping ['cgi'] to cgi12-2x.zip Cruft patterns: {'skip': ['.*', '[dD]esktop.ini', 'Thumbs.db', '~*', '$*', '*.py[co]'], 'keep': ['.htaccess']} Adding folder cgi ==== Added UTC timestamp: 'UT\x05\x00\x00\x1e-\x86^' Adding file cgi/.htaccess ==== Added UTC timestamp: 'UT\x05\x00\x008\xfcz\\' Adding file cgi/__prior-sitesearch-savedterms.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\x94R\x88Z' Adding file cgi/_prior-sitesearch-savedterms.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xc4$~Y' Adding folder cgi/dev ==== Added UTC timestamp: 'UT\x05\x00\x00\x94\x0b@Y' Adding file cgi/dev/orig-sitesearch.py ==== Added UTC timestamp: 'UT\x05\x00\x00\x0e\xb0\x92V' Adding file cgi/dev/other-sitesearch.py ==== Added UTC timestamp: 'UT\x05\x00\x00 \xef\x92V' Adding file cgi/dev/py2-mock-out.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xa0R\xa6V' Adding file cgi/dev/py3-mock-out.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xa0R\xa6V' Adding file cgi/dev/sitesearch-savedterms-live.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\x0cS\xa6V' Adding file cgi/dev/sitesearch-savedterms.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xa0R\xa6V' Adding file cgi/DIFFS-with-offline-june2017.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xe2\r@Y' Adding link ~folder cgi/DIRLINK1 ==== Added UTC timestamp: 'UT\x05\x00\x00\x08{v^' Adding link ~folder cgi/DIRLINK2 ==== Added UTC timestamp: 'UT\x05\x00\x00N{v^' Adding link ~file cgi/FILELINK1 ==== Added UTC timestamp: 'UT\x05\x00\x00\xe8zv^' Adding link ~file cgi/FILELINK2 ==== Added UTC timestamp: 'UT\x05\x00\x00\xf6zv^' Adding file cgi/HOW-INSTALL-CGI-SCRIPTS.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xc4\xd6\x17]' Adding file cgi/HOW.txt ==== Added UTC timestamp: 'UT\x05\x00\x000P\xd2Z' Adding file cgi/index.html ==== Added UTC timestamp: 'UT\x05\x00\x00\xfe\x02S^' Adding folder cgi/LIVE-Aug2017 ==== Added UTC timestamp: 'UT\x05\x00\x00\xbe\xaa\x87Y' Adding file cgi/LIVE-Aug2017/sitesearch-savedterms.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xbe\xaa\x87Y' Adding folder cgi/LIVE-June2017 ==== Added UTC timestamp: 'UT\x05\x00\x00L\r@Y' Adding file cgi/LIVE-June2017/gdform.cgi ==== Added UTC timestamp: 'UT\x05\x00\x00\x14A8O' Adding file cgi/LIVE-June2017/gdformssl.cgi ==== Added UTC timestamp: 'UT\x05\x00\x00\x14A8O' Adding file cgi/LIVE-June2017/pylotto-players.txt ==== Added UTC timestamp: 'UT\x05\x00\x00>\x0f5Y' Adding file cgi/LIVE-June2017/pylotto.pswd ==== Added UTC timestamp: 'UT\x05\x00\x00\xd0\xe49M' Adding file cgi/LIVE-June2017/pylotto.py ==== Added UTC timestamp: 'UT\x05\x00\x004\xc0gM' Adding file cgi/LIVE-June2017/pylotto24.py ==== Added UTC timestamp: 'UT\x05\x00\x00\x10\xff9M' Adding file cgi/LIVE-June2017/sitesearch-savedterms.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\x0e\x02@Y' Adding file cgi/LIVE-June2017/sitesearch.html ==== Added UTC timestamp: 'UT\x05\x00\x00\xfe\x02S^' Adding file cgi/LIVE-June2017/sitesearch.py ==== Added UTC timestamp: 'UT\x05\x00\x00`S\xa6V' Adding file cgi/pylotto-full.py ==== Added UTC timestamp: 'UT\x05\x00\x00b\xff\x03S' Adding file cgi/pylotto.py ==== Added UTC timestamp: 'UT\x05\x00\x00\x0e`@Y' Adding file cgi/showcode-template.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xe6\xed1]' Adding file cgi/showcode-unicode-demo.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\xf2V\x90Z' Adding file cgi/showcode.py ==== Added UTC timestamp: 'UT\x05\x00\x00R.[]' Adding file cgi/sitesearch-savedterms.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\x8a\x1d\x19]' Adding file cgi/sitesearch.py ==== Added UTC timestamp: 'UT\x05\x00\x00V\x88\x17]' Adding file cgi/temp.html ==== Added UTC timestamp: 'UT\x05\x00\x00\xfe\x02S^' Adding file cgi/test.py ==== Added UTC timestamp: 'UT\x05\x00\x00\xee\x85\xd2Z' Adding file cgi/xreadonly.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\x1a-\x86^' Adding file cgi/xwriteonly.txt ==== Added UTC timestamp: 'UT\x05\x00\x00\x1e-\x86^' Create finished: files=34, folders=4, links=4, unknowns=0, crufts=0. # Clean (read-only files) ~/Desktop$ rm -rf cgi12-2x # Unzip in 2.X ~/Desktop$ py2 $Z/zip-extract.py cgi12-2x.zip cgi12-2x -permissions Unzipping from cgi12-2x.zip to cgi12-2x Extracted cgi/ => cgi12-2x/cgi ==== Got UTC timestamp: 1585851678 Extracted cgi/.htaccess => cgi12-2x/cgi/.htaccess ==== Got UTC timestamp: 1551563832 Extracted cgi/__prior-sitesearch-savedterms.txt => cgi12-2x/cgi/__prior-sitesearch-savedterms.txt ==== Got UTC timestamp: 1518883476 Extracted cgi/_prior-sitesearch-savedterms.txt => cgi12-2x/cgi/_prior-sitesearch-savedterms.txt ==== Got UTC timestamp: 1501439172 Extracted cgi/dev/ => cgi12-2x/cgi/dev ==== Got UTC timestamp: 1497369492 Extracted cgi/dev/orig-sitesearch.py => cgi12-2x/cgi/dev/orig-sitesearch.py ==== Got UTC timestamp: 1452453902 Extracted cgi/dev/other-sitesearch.py => cgi12-2x/cgi/dev/other-sitesearch.py ==== Got UTC timestamp: 1452470048 Extracted cgi/dev/py2-mock-out.txt => cgi12-2x/cgi/dev/py2-mock-out.txt ==== Got UTC timestamp: 1453740704 Extracted cgi/dev/py3-mock-out.txt => cgi12-2x/cgi/dev/py3-mock-out.txt ==== Got UTC timestamp: 1453740704 Extracted cgi/dev/sitesearch-savedterms-live.txt => cgi12-2x/cgi/dev/sitesearch-savedterms-live.txt ==== Got UTC timestamp: 1453740812 Extracted cgi/dev/sitesearch-savedterms.txt => cgi12-2x/cgi/dev/sitesearch-savedterms.txt ==== Got UTC timestamp: 1453740704 Extracted cgi/DIFFS-with-offline-june2017.txt => cgi12-2x/cgi/DIFFS-with-offline-june2017.txt ==== Got UTC timestamp: 1497370082 (Link) Extracted cgi/DIRLINK1 => cgi12-2x/cgi/DIRLINK1 ==== Got UTC timestamp: 1584823048 (Link) Extracted cgi/DIRLINK2 => cgi12-2x/cgi/DIRLINK2 ==== Got UTC timestamp: 1584823118 (Link) Extracted cgi/FILELINK1 => cgi12-2x/cgi/FILELINK1 ==== Got UTC timestamp: 1584823016 (Link) Extracted cgi/FILELINK2 => cgi12-2x/cgi/FILELINK2 ==== Got UTC timestamp: 1584823030 Extracted cgi/HOW-INSTALL-CGI-SCRIPTS.txt => cgi12-2x/cgi/HOW-INSTALL-CGI-SCRIPTS.txt ==== Got UTC timestamp: 1561843396 Extracted cgi/HOW.txt => cgi12-2x/cgi/HOW.txt ==== Got UTC timestamp: 1523732528 Extracted cgi/index.html => cgi12-2x/cgi/index.html ==== Got UTC timestamp: 1582498558 Extracted cgi/LIVE-Aug2017/ => cgi12-2x/cgi/LIVE-Aug2017 ==== Got UTC timestamp: 1502063294 Extracted cgi/LIVE-Aug2017/sitesearch-savedterms.txt => cgi12-2x/cgi/LIVE-Aug2017/sitesearch-savedterms.txt ==== Got UTC timestamp: 1502063294 Extracted cgi/LIVE-June2017/ => cgi12-2x/cgi/LIVE-June2017 ==== Got UTC timestamp: 1497369932 Extracted cgi/LIVE-June2017/gdform.cgi => cgi12-2x/cgi/LIVE-June2017/gdform.cgi ==== Got UTC timestamp: 1329086740 Extracted cgi/LIVE-June2017/gdformssl.cgi => cgi12-2x/cgi/LIVE-June2017/gdformssl.cgi ==== Got UTC timestamp: 1329086740 Extracted cgi/LIVE-June2017/pylotto-players.txt => cgi12-2x/cgi/LIVE-June2017/pylotto-players.txt ==== Got UTC timestamp: 1496649534 Extracted cgi/LIVE-June2017/pylotto.pswd => cgi12-2x/cgi/LIVE-June2017/pylotto.pswd ==== Got UTC timestamp: 1295639760 Extracted cgi/LIVE-June2017/pylotto.py => cgi12-2x/cgi/LIVE-June2017/pylotto.py ==== Got UTC timestamp: 1298645044 Extracted cgi/LIVE-June2017/pylotto24.py => cgi12-2x/cgi/LIVE-June2017/pylotto24.py ==== Got UTC timestamp: 1295646480 Extracted cgi/LIVE-June2017/sitesearch-savedterms.txt => cgi12-2x/cgi/LIVE-June2017/sitesearch-savedterms.txt ==== Got UTC timestamp: 1497367054 Extracted cgi/LIVE-June2017/sitesearch.html => cgi12-2x/cgi/LIVE-June2017/sitesearch.html ==== Got UTC timestamp: 1582498558 Extracted cgi/LIVE-June2017/sitesearch.py => cgi12-2x/cgi/LIVE-June2017/sitesearch.py ==== Got UTC timestamp: 1453740896 Extracted cgi/pylotto-full.py => cgi12-2x/cgi/pylotto-full.py ==== Got UTC timestamp: 1392770914 Extracted cgi/pylotto.py => cgi12-2x/cgi/pylotto.py ==== Got UTC timestamp: 1497391118 Extracted cgi/showcode-template.txt => cgi12-2x/cgi/showcode-template.txt ==== Got UTC timestamp: 1563553254 Extracted cgi/showcode-unicode-demo.txt => cgi12-2x/cgi/showcode-unicode-demo.txt ==== Got UTC timestamp: 1519408882 Extracted cgi/showcode.py => cgi12-2x/cgi/showcode.py ==== Got UTC timestamp: 1566256722 Extracted cgi/sitesearch-savedterms.txt => cgi12-2x/cgi/sitesearch-savedterms.txt ==== Got UTC timestamp: 1561927050 Extracted cgi/sitesearch.py => cgi12-2x/cgi/sitesearch.py ==== Got UTC timestamp: 1561823318 Extracted cgi/temp.html => cgi12-2x/cgi/temp.html ==== Got UTC timestamp: 1582498558 Extracted cgi/test.py => cgi12-2x/cgi/test.py ==== Got UTC timestamp: 1523746286 Extracted cgi/xreadonly.txt => cgi12-2x/cgi/xreadonly.txt ==== Got UTC timestamp: 1585851674 Extracted cgi/xwriteonly.txt => cgi12-2x/cgi/xwriteonly.txt ==== Got UTC timestamp: 1585851678 Extract finished: files=34, folders=4, links=4, unknowns=0. # Timestamps (same as 3.X) ~/Desktop$ py2 >>> import time >>> time.localtime(1561823318) time.struct_time(tm_year=2019, tm_mon=6, tm_mday=29, tm_hour=8, tm_min=48, tm_sec=38, tm_wday=5, tm_yday=180, tm_isdst=1) >>> time.localtime(1582498558) time.struct_time(tm_year=2020, tm_mon=2, tm_mday=23, tm_hour=14, tm_min=55, tm_sec=58, tm_wday=6, tm_yday=54, tm_isdst=0) # Zipped and unzipped in 2.X ~/Desktop$ ls -lT cgi12-2x/cgi total 328 -rw-r--r-- 1 blue staff 1219 Jun 13 09:08:02 2017 DIFFS-with-offline-june2017.txt lrwxr-xr-x 1 blue staff 12 Apr 6 11:48:19 2020 DIRLINK1 -> LIVE-Aug2017 lrwxr-xr-x 1 blue staff 13 Apr 6 11:48:19 2020 DIRLINK2 -> LIVE-Aug2017/ lrw------- 1 blue staff 11 Apr 6 11:48:19 2020 FILELINK1 -> showcode.py lrwxr-xr-x 1 blue staff 25 Apr 6 11:48:19 2020 FILELINK2 -> sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 1768 Jun 29 14:23:16 2019 HOW-INSTALL-CGI-SCRIPTS.txt -rwxrwxrwx 1 blue staff 1042 Apr 14 12:02:08 2018 HOW.txt drwx------ 3 blue staff 102 Aug 6 16:48:14 2017 LIVE-Aug2017 drwxr-xr-x 11 blue staff 374 Jun 13 09:05:32 2017 LIVE-June2017 -rw-r--r-- 1 blue staff 6315 Feb 17 08:04:36 2018 __prior-sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 5205 Jul 30 11:26:12 2017 _prior-sitesearch-savedterms.txt drwxrwxrwx 8 blue staff 272 Jun 13 08:58:12 2017 dev -rw-r--r-- 1 blue staff 2584 Feb 23 14:55:58 2020 index.html -rwxr-xr-x 1 blue staff 20729 Feb 18 16:48:34 2014 pylotto-full.py -rwxr-xr-x 1 blue staff 151 Jun 13 14:58:38 2017 pylotto.py -rwxrwxrwx 1 blue staff 3035 Jul 19 09:20:54 2019 showcode-template.txt -rw-r--r-- 1 blue staff 72 Feb 23 10:01:22 2018 showcode-unicode-demo.txt -rw------- 1 blue staff 26250 Aug 19 16:18:42 2019 showcode.py -rw------- 1 blue staff 13948 Jun 30 13:37:30 2019 sitesearch-savedterms.txt -rwxr-xr-x 1 blue staff 14054 Jun 29 08:48:38 2019 sitesearch.py -rw-r--r-- 1 blue staff 15372 Feb 23 14:55:58 2020 temp.html -rwxr-xr-x 1 blue staff 78 Apr 14 15:51:26 2018 test.py -r--r--r-- 1 blue staff 0 Apr 2 11:21:14 2020 xreadonly.txt -rw--w--w- 1 blue staff 0 Apr 2 11:21:18 2020 xwriteonly.txt # Original (same - EXCEPT 4 symlinks' modtimes) ~/Desktop$ ls -lT cgi total 328 -rw-r--r-- 1 blue staff 1219 Jun 13 09:08:02 2017 DIFFS-with-offline-june2017.txt lrwxr-xr-x 1 blue staff 12 Mar 21 13:37:28 2020 DIRLINK1 -> LIVE-Aug2017 lrwxr-xr-x 1 blue staff 13 Mar 21 13:38:38 2020 DIRLINK2 -> LIVE-Aug2017/ lrw------- 1 blue staff 11 Mar 21 13:36:56 2020 FILELINK1 -> showcode.py lrwxr-xr-x 1 blue staff 25 Mar 21 13:37:10 2020 FILELINK2 -> sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 1768 Jun 29 14:23:16 2019 HOW-INSTALL-CGI-SCRIPTS.txt -rwxrwxrwx 1 blue staff 1042 Apr 14 12:02:08 2018 HOW.txt drwx------ 3 blue staff 102 Aug 6 16:48:14 2017 LIVE-Aug2017 drwxr-xr-x 11 blue staff 374 Jun 13 09:05:32 2017 LIVE-June2017 -rw-r--r-- 1 blue staff 6315 Feb 17 08:04:36 2018 __prior-sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 5205 Jul 30 11:26:12 2017 _prior-sitesearch-savedterms.txt drwxrwxrwx 8 blue staff 272 Jun 13 08:58:12 2017 dev -rw-r--r-- 1 blue staff 2584 Feb 23 14:55:58 2020 index.html -rwxr-xr-x 1 blue staff 20729 Feb 18 16:48:34 2014 pylotto-full.py -rwxr-xr-x 1 blue staff 151 Jun 13 14:58:38 2017 pylotto.py -rwxrwxrwx 1 blue staff 3035 Jul 19 09:20:54 2019 showcode-template.txt -rw-r--r-- 1 blue staff 72 Feb 23 10:01:22 2018 showcode-unicode-demo.txt -rw------- 1 blue staff 26250 Aug 19 16:18:42 2019 showcode.py -rw------- 1 blue staff 13948 Jun 30 13:37:30 2019 sitesearch-savedterms.txt -rwxr-xr-x 1 blue staff 14054 Jun 29 08:48:38 2019 sitesearch.py -rw-r--r-- 1 blue staff 15372 Feb 23 14:55:58 2020 temp.html -rwxr-xr-x 1 blue staff 78 Apr 14 15:51:26 2018 test.py -r--r--r-- 1 blue staff 0 Apr 2 11:21:14 2020 xreadonly.txt -rw--w--w- 1 blue staff 0 Apr 2 11:21:18 2020 xwriteonly.txt # Check 2.X content (same) ~/Desktop$ py3 $M/diffall.py cgi cgi12-2x/cgi -skipcruft | tail -n 6 ================================================================================ Runtime hrs:mins:secs = 0:0:0.01 Dirs checked 4, Files checked: 38, Files skipped: 0 System metadata (cruft) files were skipped No diffs found. End of report. # Check 2.X modtimes (same - sans 4 symlinks' modtimes) ~/Desktop$ py3 $M/mergeall.py cgi cgi12-2x/cgi -skipcruft -report | tail -n 9 ------------------------------------------------------------------------------- *Summary Compared => files: 34, folders: 4 Differences => samefile: 4, uniqueto: 0, uniquefrom: 0, mixedmode: 0 Changed: files => created: 0, deleted: 0, replaced: 0 folders => created: 0, deleted: 0, replaced: 0 ------------------------------------------------------------------------------- Finished. ########################################################################################## # 3) Unzip Python 2.X zip in 3.X - and vice versa ########################################################################################## # # 2.X in 3.X # ~/Desktop$ rm -rf cgi12-3x # Unzip 2.X in 3.X ~/Desktop$ py3 $Z/zip-extract.py cgi12-2x.zip cgi12-3x -permissions | tail -n 4 Extracted cgi/xwriteonly.txt => cgi12-3x/cgi/xwriteonly.txt ==== Got UTC timestamp: 1585851678 Extract finished: files=34, folders=4, links=4, unknowns=0. # Content ~/Desktop$ py3 $M/diffall.py cgi cgi12-3x/cgi -skipcruft | tail -n 6 ================================================================================ Runtime hrs:mins:secs = 0:0:0.01 Dirs checked 4, Files checked: 38, Files skipped: 0 System metadata (cruft) files were skipped No diffs found. End of report. # Modtimes ~/Desktop$ py3 $M/mergeall.py cgi cgi12-3x/cgi -skipcruft -report | tail -n 9 ------------------------------------------------------------------------------- *Summary Compared => files: 34, folders: 4 Differences => samefile: 0, uniqueto: 0, uniquefrom: 0, mixedmode: 0 Changed: files => created: 0, deleted: 0, replaced: 0 folders => created: 0, deleted: 0, replaced: 0 ------------------------------------------------------------------------------- Finished. # # 3.X in 2.X # ~/Desktop$ rm -rf cgi12-2x # Unzip 3.X in 2.X ~/Desktop$ py2 $Z/zip-extract.py cgi12-3x.zip cgi12-2x -permissions | tail -n 4 Extracted cgi/xwriteonly.txt => cgi12-2x/cgi/xwriteonly.txt ==== Got UTC timestamp: 1585851678 Extract finished: files=34, folders=4, links=4, unknowns=0. # Content ~/Desktop$ py3 $M/diffall.py cgi cgi12-2x/cgi -skipcruft | tail -n 6 ================================================================================ Runtime hrs:mins:secs = 0:0:0.00 Dirs checked 4, Files checked: 38, Files skipped: 0 System metadata (cruft) files were skipped No diffs found. End of report. # Modtimes (again, 2.X doesn't do symlink modtimes) ~/Desktop$ py3 $M/mergeall.py cgi cgi12-2x/cgi -skipcruft -report | tail -n 9 ------------------------------------------------------------------------------- *Summary Compared => files: 34, folders: 4 Differences => samefile: 4, uniqueto: 0, uniquefrom: 0, mixedmode: 0 Changed: files => created: 0, deleted: 0, replaced: 0 folders => created: 0, deleted: 0, replaced: 0 ------------------------------------------------------------------------------- Finished. ########################################################################################## # 4) Verify zips in Unix 'unzip' (same, except 'unzip' doesn't do symlink modtimes) ########################################################################################## # Setup ~/Desktop$ mkdir test-unix-zip ~/Desktop$ cp cgi12-3x.zip test-unix-zip ~/Desktop$ cp cgi12-2x.zip test-unix-zip ~/Desktop$ cd test-unix-zip/ # # Unix unzip of ziptools' py3.X zip # # Unix unzip ~/Desktop/test-unix-zip$ unzip -d . cgi12-3x.zip Archive: cgi12-3x.zip creating: ./cgi/ inflating: ./cgi/.htaccess inflating: ./cgi/__prior-sitesearch-savedterms.txt inflating: ./cgi/_prior-sitesearch-savedterms.txt creating: ./cgi/dev/ inflating: ./cgi/dev/orig-sitesearch.py inflating: ./cgi/dev/other-sitesearch.py inflating: ./cgi/dev/py2-mock-out.txt inflating: ./cgi/dev/py3-mock-out.txt inflating: ./cgi/dev/sitesearch-savedterms-live.txt inflating: ./cgi/dev/sitesearch-savedterms.txt inflating: ./cgi/DIFFS-with-offline-june2017.txt inflating: ./cgi/DIRLINK1 -> LIVE-Aug2017 inflating: ./cgi/DIRLINK2 -> LIVE-Aug2017/ inflating: ./cgi/FILELINK1 -> showcode.py inflating: ./cgi/FILELINK2 -> sitesearch-savedterms.txt inflating: ./cgi/HOW-INSTALL-CGI-SCRIPTS.txt inflating: ./cgi/HOW.txt inflating: ./cgi/index.html creating: ./cgi/LIVE-Aug2017/ inflating: ./cgi/LIVE-Aug2017/sitesearch-savedterms.txt creating: ./cgi/LIVE-June2017/ inflating: ./cgi/LIVE-June2017/gdform.cgi inflating: ./cgi/LIVE-June2017/gdformssl.cgi inflating: ./cgi/LIVE-June2017/pylotto-players.txt inflating: ./cgi/LIVE-June2017/pylotto.pswd inflating: ./cgi/LIVE-June2017/pylotto.py inflating: ./cgi/LIVE-June2017/pylotto24.py inflating: ./cgi/LIVE-June2017/sitesearch-savedterms.txt inflating: ./cgi/LIVE-June2017/sitesearch.html inflating: ./cgi/LIVE-June2017/sitesearch.py inflating: ./cgi/pylotto-full.py inflating: ./cgi/pylotto.py inflating: ./cgi/showcode-template.txt inflating: ./cgi/showcode-unicode-demo.txt inflating: ./cgi/showcode.py inflating: ./cgi/sitesearch-savedterms.txt inflating: ./cgi/sitesearch.py inflating: ./cgi/temp.html inflating: ./cgi/test.py inflating: ./cgi/xreadonly.txt inflating: ./cgi/xwriteonly.txt finishing deferred symbolic links: ./cgi/DIRLINK1 -> LIVE-Aug2017 ./cgi/DIRLINK2 -> LIVE-Aug2017/ ./cgi/FILELINK1 -> showcode.py ./cgi/FILELINK2 -> sitesearch-savedterms.txt # Content - Unix unzip same as original ~/Desktop/test-unix-zip$ py3 $M/diffall.py ../cgi ./cgi -skipcruft | tail -n 6 ================================================================================ Runtime hrs:mins:secs = 0:0:0.01 Dirs checked 4, Files checked: 38, Files skipped: 0 System metadata (cruft) files were skipped No diffs found. End of report. # Modtimes - same as original, EXCEPT 4 symlinks' modtimes (a known 'unzip' limitation) ~/Desktop/test-unix-zip$ py3 $M/mergeall.py ../cgi ./cgi -skipcruft -report | tail -n 9 ------------------------------------------------------------------------------- *Summary Compared => files: 34, folders: 4 Differences => samefile: 4, uniqueto: 0, uniquefrom: 0, mixedmode: 0 Changed: files => created: 0, deleted: 0, replaced: 0 folders => created: 0, deleted: 0, replaced: 0 ------------------------------------------------------------------------------- Finished. # The Unix unzip's modtime diffs ~/Desktop/test-unix-zip$ py3 $M/mergeall.py ../cgi ./cgi -skipcruft -report | more Starting. ...etc... ------------------------------------------------------------------------------- SAMEFILE DIFFERENCES: (name, dirfrom, dirto, why) **These items will be replaced in dirto by automatic resolution** [('DIRLINK1', '../cgi', './cgi', 'modtime'), ('DIRLINK2', '../cgi', './cgi', 'modtime'), ('FILELINK1', '../cgi', './cgi', 'modtime'), ('FILELINK2', '../cgi', './cgi', 'modtime')] ------------------------------------------------------------------------------- # Unix unzip's results (symlink permissions NOT propagated either - 'unzip' limitation) ~/Desktop/test-unix-zip$ ls -l cgi total 328 -rw-r--r-- 1 blue staff 1219 Jun 13 2017 DIFFS-with-offline-june2017.txt lrwxr-xr-x 1 blue staff 12 Apr 6 12:35 DIRLINK1 -> LIVE-Aug2017 lrwxr-xr-x 1 blue staff 13 Apr 6 12:35 DIRLINK2 -> LIVE-Aug2017/ lrwxr-xr-x 1 blue staff 11 Apr 6 12:35 FILELINK1 -> showcode.py lrwxr-xr-x 1 blue staff 25 Apr 6 12:35 FILELINK2 -> sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 1768 Jun 29 2019 HOW-INSTALL-CGI-SCRIPTS.txt -rwxrwxrwx 1 blue staff 1042 Apr 14 2018 HOW.txt drwx------ 3 blue staff 102 Aug 6 2017 LIVE-Aug2017 drwxr-xr-x 11 blue staff 374 Jun 13 2017 LIVE-June2017 -rw-r--r-- 1 blue staff 6315 Feb 17 2018 __prior-sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 5205 Jul 30 2017 _prior-sitesearch-savedterms.txt drwxrwxrwx 8 blue staff 272 Jun 13 2017 dev -rw-r--r-- 1 blue staff 2584 Feb 23 14:55 index.html -rwxr-xr-x 1 blue staff 20729 Feb 18 2014 pylotto-full.py -rwxr-xr-x 1 blue staff 151 Jun 13 2017 pylotto.py -rwxrwxrwx 1 blue staff 3035 Jul 19 2019 showcode-template.txt -rw-r--r-- 1 blue staff 72 Feb 23 2018 showcode-unicode-demo.txt -rw------- 1 blue staff 26250 Aug 19 2019 showcode.py -rw------- 1 blue staff 13948 Jun 30 2019 sitesearch-savedterms.txt -rwxr-xr-x 1 blue staff 14054 Jun 29 2019 sitesearch.py -rw-r--r-- 1 blue staff 15372 Feb 23 14:55 temp.html -rwxr-xr-x 1 blue staff 78 Apr 14 2018 test.py -r--r--r-- 1 blue staff 0 Apr 2 11:21 xreadonly.txt -rw--w--w- 1 blue staff 0 Apr 2 11:21 xwriteonly.txt # Versus original (and ziptools' results) ~/Desktop/test-unix-zip$ ls -l ../cgi total 328 -rw-r--r-- 1 blue staff 1219 Jun 13 2017 DIFFS-with-offline-june2017.txt lrwxr-xr-x 1 blue staff 12 Mar 21 13:37 DIRLINK1 -> LIVE-Aug2017 lrwxr-xr-x 1 blue staff 13 Mar 21 13:38 DIRLINK2 -> LIVE-Aug2017/ lrw------- 1 blue staff 11 Mar 21 13:36 FILELINK1 -> showcode.py lrwxr-xr-x 1 blue staff 25 Mar 21 13:37 FILELINK2 -> sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 1768 Jun 29 2019 HOW-INSTALL-CGI-SCRIPTS.txt -rwxrwxrwx 1 blue staff 1042 Apr 14 2018 HOW.txt drwx------ 3 blue staff 102 Aug 6 2017 LIVE-Aug2017 drwxr-xr-x 11 blue staff 374 Jun 13 2017 LIVE-June2017 -rw-r--r-- 1 blue staff 6315 Feb 17 2018 __prior-sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 5205 Jul 30 2017 _prior-sitesearch-savedterms.txt drwxrwxrwx 8 blue staff 272 Jun 13 2017 dev -rw-r--r-- 1 blue staff 2584 Feb 23 14:55 index.html -rwxr-xr-x 1 blue staff 20729 Feb 18 2014 pylotto-full.py -rwxr-xr-x 1 blue staff 151 Jun 13 2017 pylotto.py -rwxrwxrwx 1 blue staff 3035 Jul 19 2019 showcode-template.txt -rw-r--r-- 1 blue staff 72 Feb 23 2018 showcode-unicode-demo.txt -rw------- 1 blue staff 26250 Aug 19 2019 showcode.py -rw------- 1 blue staff 13948 Jun 30 2019 sitesearch-savedterms.txt -rwxr-xr-x 1 blue staff 14054 Jun 29 2019 sitesearch.py -rw-r--r-- 1 blue staff 15372 Feb 23 14:55 temp.html -rwxr-xr-x 1 blue staff 78 Apr 14 2018 test.py -r--r--r-- 1 blue staff 0 Apr 2 11:21 xreadonly.txt -rw--w--w- 1 blue staff 0 Apr 2 11:21 xwriteonly.txt # ziptools' results: symlinks retain both modtimes and permissions ~/Desktop/test-unix-zip$ ls -l ../cgi12-3x/cgi total 328 -rw-r--r-- 1 blue staff 1219 Jun 13 2017 DIFFS-with-offline-june2017.txt lrwxr-xr-x 1 blue staff 12 Mar 21 13:37 DIRLINK1 -> LIVE-Aug2017 lrwxr-xr-x 1 blue staff 13 Mar 21 13:38 DIRLINK2 -> LIVE-Aug2017/ lrw------- 1 blue staff 11 Mar 21 13:36 FILELINK1 -> showcode.py lrwxr-xr-x 1 blue staff 25 Mar 21 13:37 FILELINK2 -> sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 1768 Jun 29 2019 HOW-INSTALL-CGI-SCRIPTS.txt -rwxrwxrwx 1 blue staff 1042 Apr 14 2018 HOW.txt drwx------ 3 blue staff 102 Aug 6 2017 LIVE-Aug2017 ...etc... -rwxr-xr-x 1 blue staff 78 Apr 14 2018 test.py -r--r--r-- 1 blue staff 0 Apr 2 11:21 xreadonly.txt -rw--w--w- 1 blue staff 0 Apr 2 11:21 xwriteonly.txt # # Rerun on ziptools' py2.X zip - same results # # Unix unzip ~/Desktop/test-unix-zip$ rm -rf cgi ~/Desktop/test-unix-zip$ unzip -d . cgi12-2x.zip Archive: cgi12-2x.zip creating: ./cgi/ inflating: ./cgi/.htaccess inflating: ./cgi/__prior-sitesearch-savedterms.txt inflating: ./cgi/_prior-sitesearch-savedterms.txt creating: ./cgi/dev/ inflating: ./cgi/dev/orig-sitesearch.py inflating: ./cgi/dev/other-sitesearch.py inflating: ./cgi/dev/py2-mock-out.txt inflating: ./cgi/dev/py3-mock-out.txt inflating: ./cgi/dev/sitesearch-savedterms-live.txt inflating: ./cgi/dev/sitesearch-savedterms.txt inflating: ./cgi/DIFFS-with-offline-june2017.txt inflating: ./cgi/DIRLINK1 -> LIVE-Aug2017 inflating: ./cgi/DIRLINK2 -> LIVE-Aug2017/ inflating: ./cgi/FILELINK1 -> showcode.py inflating: ./cgi/FILELINK2 -> sitesearch-savedterms.txt ...etc... finishing deferred symbolic links: ./cgi/DIRLINK1 -> LIVE-Aug2017 ./cgi/DIRLINK2 -> LIVE-Aug2017/ ./cgi/FILELINK1 -> showcode.py ./cgi/FILELINK2 -> sitesearch-savedterms.txt # Unix unzip content ~/Desktop/test-unix-zip$ py3 $M/diffall.py ../cgi ./cgi -skipcruft | tail -n 6 ================================================================================ Runtime hrs:mins:secs = 0:0:0.01 Dirs checked 4, Files checked: 38, Files skipped: 0 System metadata (cruft) files were skipped No diffs found. End of report. # Unix unzip modtimes ~/Desktop/test-unix-zip$ py3 $M/mergeall.py ../cgi ./cgi -skipcruft -report | tail -n 9 ------------------------------------------------------------------------------- *Summary Compared => files: 34, folders: 4 Differences => samefile: 4, uniqueto: 0, uniquefrom: 0, mixedmode: 0 Changed: files => created: 0, deleted: 0, replaced: 0 folders => created: 0, deleted: 0, replaced: 0 ------------------------------------------------------------------------------- Finished. # Unix unzip permissions + modtimes ~/Desktop/test-unix-zip$ ls -lT cgi total 328 -rw-r--r-- 1 blue staff 1219 Jun 13 09:08:02 2017 DIFFS-with-offline-june2017.txt lrwxr-xr-x 1 blue staff 12 Apr 6 12:36:40 2020 DIRLINK1 -> LIVE-Aug2017 lrwxr-xr-x 1 blue staff 13 Apr 6 12:36:40 2020 DIRLINK2 -> LIVE-Aug2017/ lrwxr-xr-x 1 blue staff 11 Apr 6 12:36:40 2020 FILELINK1 -> showcode.py lrwxr-xr-x 1 blue staff 25 Apr 6 12:36:40 2020 FILELINK2 -> sitesearch-savedterms.txt -rw-r--r-- 1 blue staff 1768 Jun 29 14:23:16 2019 HOW-INSTALL-CGI-SCRIPTS.txt -rwxrwxrwx 1 blue staff 1042 Apr 14 12:02:08 2018 HOW.txt drwx------ 3 blue staff 102 Aug 6 16:48:14 2017 LIVE-Aug2017 ...etc... #========================================================================================= # OTHER # # Mac OS Finder-click unzip was tested on ziptools UTC-laden zips too: # results were the same, except that it adjusts local times for DST (badly). # # ziptools 1.2 was also tested on Windows and Python 3.7, with the same results # as 3.X here (though the UTC upgrade is very dependent on the zipfile module). # Later note: ziptools has also been successfully used on Pythons 3.8 and 3.9. #=========================================================================================