diff --git a/namcap.py b/namcap.py index a7f532a..bb2754e 100755 --- a/namcap.py +++ b/namcap.py @@ -19,10 +19,10 @@ # # -import getopt import os import sys import tarfile +import argparse import Namcap.depends import Namcap.tags @@ -33,22 +33,6 @@ def get_modules(): """Return all possible modules (rules)""" return Namcap.rules.all_rules -def usage(): - """Display usage information""" - print("") - print("Usage: " + sys.argv[0] + " [OPTIONS] packages") - print("") - print("Options are:") - print(" -L, --list : list available rules") - print(" -i : prints information (debug) responses from rules") - print(" -m : makes the output parseable (machine-readable)") - print(" -e rulelist, --exclude=rulelist : don't apply RULELIST rules to the package") - print(" -r rulelist, --rules=rulelist : only apply RULELIST rules to the package") - print(" -t tags : use a custom tag file") - print(" -v version : print version and exit") - - sys.exit(2) - def open_package(filename): try: tar = tarfile.open(filename, "r") @@ -61,17 +45,6 @@ def open_package(filename): return None return tar -def check_rules_exclude(optlist): - '''Check if the -r (--rules) and the -r (--exclude) options - are being used at same time''' - args_used = 0 - for i in optlist: - if '-r' in i or '-e' in i: - args_used += 1 - if '--rules' in i or '--exclude' in i: - args_used += 1 - return args_used - def show_messages(name, key, messages): for msg in messages: print("%s %s: %s" % (name, key, Namcap.tags.format_message(msg))) @@ -162,74 +135,57 @@ def process_pkgbuild(package, modules): # Main modules = get_modules() -info_reporting = 0 -machine_readable = False -filename = None - -# get our options and process them -try: - optlist, args = getopt.getopt(sys.argv[1:], "ihmr:e:t:Lv", - ["info", "help", "machine-readable", "rules=", - "exclude=", "tags=", "list", "version"]) -except getopt.GetoptError: - usage() - -active_modules = {} -# Verifying if we are using the -r and -r options at same time -if check_rules_exclude(optlist) > 1: - print("You cannot use '-r' (--rules) and '-e' (-exclude) options at same time") - usage() - -for i, k in optlist: - if i in ('-L', '--list'): +# Let's handle those options! +version = Namcap.version.get_version() + +parser = argparse.ArgumentParser() +parser.add_argument('-L', '--list', action='store_true', help='List available rules') +parser.add_argument('-i', '--info', action='store_const', const=1, default=0, help='Prints information (debug) responses from rules') +parser.add_argument('-m', '--machine-readable', action='store_true', help='Makes the output parseable (machine-readable)') +parser.add_argument('-t', '--tags', action='store', help='Use a custom tag file') +parser.add_argument('packages', nargs='+') +pargroup = parser.add_mutually_exclusive_group() +pargroup.add_argument('-e', '--exclude', action='store', metavar='RULELIST', help="Don't apply RULELIST rules to the package") +pargroup.add_argument('-r', '--rules', action='store', metavar='RULELIST', help='Only apply RULELIST rules to the packag') +parser.add_argument('-v', '--version', action='version', version=version) +args = parser.parse_args() + +# Do something with all these options +if (args.list): print("-"*20 + " Namcap rule list " + "-"*20) for j in sorted(modules): print("%-20s: %s" % (j, modules[j].description)) - sys.exit(2) - - if i in ('-r', '--rules'): - module_list = k.split(',') - for j in module_list: - if j in modules: - active_modules[j] = modules[j] - else: - print("Error: Rule '%s' does not exist" % j) - usage() - - # Used to exclude some rules from the check - if i in ('-e', '--exclude'): - module_list = k.split(',') - active_modules.update(modules) - for j in module_list: - if j in modules: - active_modules.pop(j) - else: - print("Error: Rule '%s' does not exist" % j) - usage() - - if i in ('-i', '--info'): - info_reporting = 1 - - if i in ('-h', '--help'): - usage() - if i in ('-m', '--machine-readable'): - machine_readable = True - - if i in ('-t', '--tags'): - filename = k - - if i in ('-v', '--version'): - print(Namcap.version.get_version()) - sys.exit(0) - -# If there are no args, print usage -if (args == []): - usage() + parser.exit(2) -Namcap.tags.load_tags(filename = filename, machine = machine_readable) +info_reporting = args.info +machine_readable = args.machine_readable +filename = args.tags -packages = args +if (args.rules): + module_list = args.rules + for j in module_list: + if j in modules: + active_modules[j] = modules[j] + else: + print("Error: Rule '%s' does not exist" % j) + parser.exit(2) + +if (args.exclude): + module_list = args.exclude + active_modules.update(modules) + for j in module_list: + if j in modules: + active_modules.pop(j) + else: + print("Error: Rule '%s' does not exist" % j) + parser.exit(2) + +packages = args.packages + +active_modules = {} + +Namcap.tags.load_tags(filename = filename, machine = machine_readable) # No rules selected? Then select them all! if len(active_modules) == 0: @@ -239,7 +195,7 @@ if len(active_modules) == 0: for package in packages: if not os.access(package, os.R_OK): print("Error: Problem reading %s" % package) - usage() + parser.print_usage() if os.path.isfile(package) and tarfile.is_tarfile(package): process_realpackage(package, active_modules)