summaryrefslogtreecommitdiffstats
path: root/Lib/zipfile.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-10-23 10:32:12 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-10-23 10:32:12 (GMT)
commit8c9331057d0f5c75cd3e73f3f85fe237da0f9ed1 (patch)
tree42a9733465f9776efb45494c06b6cdb8dce146cf /Lib/zipfile.py
parente4bdf4fce5c1f5958ce2d4025c6e19dcb2825a8b (diff)
downloadcpython-8c9331057d0f5c75cd3e73f3f85fe237da0f9ed1.zip
cpython-8c9331057d0f5c75cd3e73f3f85fe237da0f9ed1.tar.gz
cpython-8c9331057d0f5c75cd3e73f3f85fe237da0f9ed1.tar.bz2
Issue #28115: Command-line interface of the zipfile module now uses argparse.
Added support of long options.
Diffstat (limited to 'Lib/zipfile.py')
-rw-r--r--Lib/zipfile.py77
1 files changed, 37 insertions, 40 deletions
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 3751e69..d3661a3 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -1950,51 +1950,45 @@ class PyZipFile(ZipFile):
return (fname, archivename)
-def main(args = None):
- import textwrap
- USAGE=textwrap.dedent("""\
- Usage:
- zipfile.py -l zipfile.zip # Show listing of a zipfile
- zipfile.py -t zipfile.zip # Test if a zipfile is valid
- zipfile.py -e zipfile.zip target # Extract zipfile into target dir
- zipfile.py -c zipfile.zip src ... # Create zipfile from sources
- """)
- if args is None:
- args = sys.argv[1:]
-
- if not args or args[0] not in ('-l', '-c', '-e', '-t'):
- print(USAGE, file=sys.stderr)
- sys.exit(1)
-
- if args[0] == '-l':
- if len(args) != 2:
- print(USAGE, file=sys.stderr)
- sys.exit(1)
- with ZipFile(args[1], 'r') as zf:
- zf.printdir()
-
- elif args[0] == '-t':
- if len(args) != 2:
- print(USAGE, file=sys.stderr)
- sys.exit(1)
- with ZipFile(args[1], 'r') as zf:
+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()
+ 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')
+ args = parser.parse_args(args)
+
+ if args.test is not None:
+ src = args.test
+ with ZipFile(src, 'r') as zf:
badfile = zf.testzip()
if badfile:
print("The following enclosed file is corrupted: {!r}".format(badfile))
print("Done testing")
- elif args[0] == '-e':
- if len(args) != 3:
- print(USAGE, file=sys.stderr)
- sys.exit(1)
+ elif args.list is not None:
+ src = args.list
+ with ZipFile(src, 'r') as zf:
+ zf.printdir()
- with ZipFile(args[1], 'r') as zf:
- zf.extractall(args[2])
+ elif args.extract is not None:
+ src, curdir = args.extract
+ with ZipFile(src, 'r') as zf:
+ zf.extractall(curdir)
- elif args[0] == '-c':
- if len(args) < 3:
- print(USAGE, file=sys.stderr)
- sys.exit(1)
+ elif args.create is not None:
+ zip_name = args.create.pop(0)
+ files = args.create
def addToZip(zf, path, zippath):
if os.path.isfile(path):
@@ -2007,8 +2001,8 @@ def main(args = None):
os.path.join(path, nm), os.path.join(zippath, nm))
# else: ignore
- with ZipFile(args[1], 'w') as zf:
- for path in args[2:]:
+ 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))
@@ -2016,5 +2010,8 @@ def main(args = None):
zippath = ''
addToZip(zf, path, zippath)
+ else:
+ parser.exit(2, parser.format_usage())
+
if __name__ == "__main__":
main()