mirror of https://github.com/python/cpython
gh-112578: Fix RuntimeWarning when running zipfile (GH-112579)
This commit is contained in:
parent
fc9e24b01f
commit
29e6c7b68a
|
@ -2227,12 +2227,79 @@ class PyZipFile(ZipFile):
|
||||||
return (fname, archivename)
|
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
|
from ._path import ( # noqa: E402
|
||||||
Path,
|
Path,
|
||||||
|
|
||||||
# used privately for tests
|
# used privately for tests
|
||||||
CompleteDirs, # noqa: F401
|
CompleteDirs, # noqa: F401
|
||||||
)
|
)
|
||||||
|
|
||||||
# used privately for tests
|
|
||||||
from .__main__ import main # noqa: F401, E402
|
|
||||||
|
|
|
@ -1,77 +1,4 @@
|
||||||
import sys
|
from . import main
|
||||||
import os
|
|
||||||
from . import ZipFile, ZIP_DEFLATED
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix a spurious :exc:`RuntimeWarning` when executing the :mod:`zipfile` module.
|
Loading…
Reference in New Issue