The current code implements a lot of ad-hoc argument parsing when it
could simply let the argparse module do it all for it.  This makes the
code easier to understand and extend in the process.
---
 bin/xpak-helper.py | 68 ++++++++++++++++++++----------------------------------
 1 file changed, 25 insertions(+), 43 deletions(-)

diff --git a/bin/xpak-helper.py b/bin/xpak-helper.py
index 8c965ec..1b2883d 100755
--- a/bin/xpak-helper.py
+++ b/bin/xpak-helper.py
@@ -2,68 +2,50 @@
 # Copyright 2009-2014 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
+"""Helper to manage xpak archives"""
+
 import argparse
 import sys
 import portage
 portage._internal_caller = True
 from portage import os
 
-def command_recompose(args):
-
-       usage = "usage: recompose <binpkg_path> <metadata_dir>\n"
 
-       if len(args) != 2:
-               sys.stderr.write(usage)
-               sys.stderr.write("2 arguments are required, got %s\n" % 
len(args))
-               return 1
+def command_recompose(parser, opts):
+       """Create an xpak archive from a directory"""
+       binpkg_path = opts.binpkg_path
+       metadata_dir = opts.metadata_dir
 
-       binpkg_path, metadata_dir = args
-
-       if not os.path.isfile(binpkg_path):
-               sys.stderr.write(usage)
-               sys.stderr.write("Argument 1 is not a regular file: '%s'\n" % \
-                       binpkg_path)
-               return 1
+       if os.path.exists(binpkg_path) and not os.path.isfile(binpkg_path):
+               parser.error('binpkg_path is not a regular file: %s' % 
binpkg_path)
 
        if not os.path.isdir(metadata_dir):
-               sys.stderr.write(usage)
-               sys.stderr.write("Argument 2 is not a directory: '%s'\n" % \
-                       metadata_dir)
-               return 1
+               parser.error('metadata_dir is not a directory: %s' % 
metadata_dir)
 
        t = portage.xpak.tbz2(binpkg_path)
        t.recompose(metadata_dir)
        return os.EX_OK
 
-def main(argv):
 
-       if argv and isinstance(argv[0], bytes):
-               for i, x in enumerate(argv):
-                       argv[i] = portage._unicode_decode(x, errors='strict')
+def get_parser():
+       """Return the command line parser"""
+       parser = argparse.ArgumentParser(description=__doc__)
+       subparsers = parser.add_subparsers()
 
-       valid_commands = ('recompose',)
-       description = "Perform metadata operations on a binary package."
-       usage = "usage: %s COMMAND [args]" % \
-               os.path.basename(argv[0])
+       subparser = subparsers.add_parser('recompose',
+               help=command_recompose.__doc__)
+       subparser.set_defaults(func=command_recompose)
+       subparser.add_argument('binpkg_path', help='Path to output xpak')
+       subparser.add_argument('metadata_dir', help='Path to input dir')
 
-       parser = argparse.ArgumentParser(description=description, usage=usage)
-       options, args = parser.parse_known_args(argv[1:])
+       return parser
 
-       if not args:
-               parser.error("missing command argument")
 
-       command = args[0]
-
-       if command not in valid_commands:
-               parser.error("invalid command: '%s'" % command)
-
-       if command == 'recompose':
-               rval = command_recompose(args[1:])
-       else:
-               raise AssertionError("invalid command: '%s'" % command)
+def main(argv):
+       parser = get_parser()
+       opts = parser.parse_args(argv)
+       opts.func(parser, opts)
 
-       return rval
 
-if __name__ == "__main__":
-       rval = main(sys.argv[:])
-       sys.exit(rval)
+if __name__ == '__main__':
+       sys.exit(main(sys.argv[1:]))
-- 
2.5.2


Reply via email to