diff options
author | Shantanu <12621235+hauntsaninja@users.noreply.github.com> | 2023-12-03 11:09:29 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-03 11:09:29 (GMT) |
commit | 29e6c7b68acac628b084a82670708008be262379 (patch) | |
tree | 01c2f0dbc958b4557a507273b17d0ea7fa37c0f1 /Lib/zipfile/__init__.py | |
parent | fc9e24b01fb7da4160b82cef26981d72bb678c13 (diff) | |
download | cpython-29e6c7b68acac628b084a82670708008be262379.zip cpython-29e6c7b68acac628b084a82670708008be262379.tar.gz cpython-29e6c7b68acac628b084a82670708008be262379.tar.bz2 |
gh-112578: Fix RuntimeWarning when running zipfile (GH-112579)
Diffstat (limited to 'Lib/zipfile/__init__.py')
-rw-r--r-- | Lib/zipfile/__init__.py | 73 |
1 files changed, 70 insertions, 3 deletions
diff --git a/Lib/zipfile/__init__.py b/Lib/zipfile/__init__.py index 2b28a07..fe629ed 100644 --- a/Lib/zipfile/__init__.py +++ b/Lib/zipfile/__init__.py @@ -2227,12 +2227,79 @@ class PyZipFile(ZipFile): return (fname, archivename) +def main(args=None): + import argparse + + description = 'A simple command-line interface for zipfile module.' + parser = argparse.ArgumentParser(description=description) + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('-l', '--list', metavar='<zipfile>', + help='Show listing of a zipfile') + group.add_argument('-e', '--extract', nargs=2, + metavar=('<zipfile>', '<output_dir>'), + help='Extract zipfile into target dir') + group.add_argument('-c', '--create', nargs='+', + metavar=('<name>', '<file>'), + help='Create zipfile from sources') + group.add_argument('-t', '--test', metavar='<zipfile>', + help='Test if a zipfile is valid') + parser.add_argument('--metadata-encoding', metavar='<encoding>', + help='Specify encoding of member names for -l, -e and -t') + args = parser.parse_args(args) + + encoding = args.metadata_encoding + + if args.test is not None: + src = args.test + with ZipFile(src, 'r', metadata_encoding=encoding) as zf: + badfile = zf.testzip() + if badfile: + print("The following enclosed file is corrupted: {!r}".format(badfile)) + print("Done testing") + + elif args.list is not None: + src = args.list + with ZipFile(src, 'r', metadata_encoding=encoding) as zf: + zf.printdir() + + elif args.extract is not None: + src, curdir = args.extract + with ZipFile(src, 'r', metadata_encoding=encoding) as zf: + zf.extractall(curdir) + + elif args.create is not None: + if encoding: + print("Non-conforming encodings not supported with -c.", + file=sys.stderr) + sys.exit(1) + + zip_name = args.create.pop(0) + files = args.create + + def addToZip(zf, path, zippath): + if os.path.isfile(path): + zf.write(path, zippath, ZIP_DEFLATED) + elif os.path.isdir(path): + if zippath: + zf.write(path, zippath) + for nm in sorted(os.listdir(path)): + addToZip(zf, + os.path.join(path, nm), os.path.join(zippath, nm)) + # else: ignore + + with ZipFile(zip_name, 'w') as zf: + for path in files: + zippath = os.path.basename(path) + if not zippath: + zippath = os.path.basename(os.path.dirname(path)) + if zippath in ('', os.curdir, os.pardir): + zippath = '' + addToZip(zf, path, zippath) + + from ._path import ( # noqa: E402 Path, # used privately for tests CompleteDirs, # noqa: F401 ) - -# used privately for tests -from .__main__ import main # noqa: F401, E402 |