mirror of https://github.com/python/cpython
78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
import sys
|
|
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__":
|
|
main()
|