[llvm-commits] [LNT] r165145 - in /lnt/trunk/lnt: lnttool/convert.py lnttool/create.py lnttool/import_data.py lnttool/main.py lnttool/updatedb.py util/multitool.py

Daniel Dunbar daniel at zuster.org
Wed Oct 3 12:25:12 PDT 2012


Author: ddunbar
Date: Wed Oct  3 14:25:11 2012
New Revision: 165145

URL: http://llvm.org/viewvc/llvm-project?rev=165145&view=rev
Log:
lnttool: Factor out a MultiTool helper class.

Added:
    lnt/trunk/lnt/util/multitool.py
Modified:
    lnt/trunk/lnt/lnttool/convert.py
    lnt/trunk/lnt/lnttool/create.py
    lnt/trunk/lnt/lnttool/import_data.py
    lnt/trunk/lnt/lnttool/main.py
    lnt/trunk/lnt/lnttool/updatedb.py

Modified: lnt/trunk/lnt/lnttool/convert.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/lnttool/convert.py?rev=165145&r1=165144&r2=165145&view=diff
==============================================================================
--- lnt/trunk/lnt/lnttool/convert.py (original)
+++ lnt/trunk/lnt/lnttool/convert.py Wed Oct  3 14:25:11 2012
@@ -18,7 +18,7 @@
 
     from optparse import OptionParser, OptionGroup
     from lnt import formats
-    parser = OptionParser("%%prog %s [options] [<input>, [<output>]]" % name)
+    parser = OptionParser("%s [options] [<input>, [<output>]]" % name)
     parser.add_option("", "--from", dest="inputFormat", metavar="NAME",
                       help="input format name [%default]", default='<auto>',
                       choices=formats.format_names + ['<auto>'])

Modified: lnt/trunk/lnt/lnttool/create.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/lnttool/create.py?rev=165145&r1=165144&r2=165145&view=diff
==============================================================================
--- lnt/trunk/lnt/lnttool/create.py (original)
+++ lnt/trunk/lnt/lnttool/create.py Wed Oct  3 14:25:11 2012
@@ -87,7 +87,7 @@
     """create an LLVM nightly test installation"""
 
     from optparse import OptionParser, OptionGroup
-    parser = OptionParser("%%prog %s [options] <path>" % name)
+    parser = OptionParser("%s [options] <path>" % name)
     parser.add_option("", "--name", dest="name", default="LNT",
                       help="name to use for the installation [%default]")
     parser.add_option("", "--config", dest="config", default="lnt.cfg",

Modified: lnt/trunk/lnt/lnttool/import_data.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/lnttool/import_data.py?rev=165145&r1=165144&r2=165145&view=diff
==============================================================================
--- lnt/trunk/lnt/lnttool/import_data.py (original)
+++ lnt/trunk/lnt/lnttool/import_data.py Wed Oct  3 14:25:11 2012
@@ -9,7 +9,7 @@
 
     from optparse import OptionParser, OptionGroup
 
-    parser = OptionParser("%%prog %s [options] <instance path> <file>+"%name)
+    parser = OptionParser("%s [options] <instance path> <file>+"%name)
     parser.add_option("", "--database", dest="database", default="default",
                       help="database to write to [%default]")
     parser.add_option("", "--format", dest="format",

Modified: lnt/trunk/lnt/lnttool/main.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/lnttool/main.py?rev=165145&r1=165144&r2=165145&view=diff
==============================================================================
--- lnt/trunk/lnt/lnttool/main.py (original)
+++ lnt/trunk/lnt/lnttool/main.py Wed Oct  3 14:25:11 2012
@@ -10,6 +10,7 @@
 
 import StringIO
 import lnt
+import lnt.util.multitool
 import lnt.util.ImportData
 from lnt import testing
 from lnt.testing.util.commands import note, warning, error, fatal
@@ -18,7 +19,7 @@
     """start a new development server"""
 
     parser = OptionParser("""\
-%%prog %s [options] <instance path>
+%s [options] <instance path>
 
 Start the LNT server using a development WSGI server. Additional options can be
 used to control the server host and port, as well as useful development features
@@ -94,7 +95,7 @@
 def action_checkformat(name, args):
     """check the format of an LNT test report file"""
 
-    parser = OptionParser("%%prog %s [options] files" % name)
+    parser = OptionParser("%s [options] files" % name)
 
     (opts, args) = parser.parse_args(args)
     if len(args) > 1:
@@ -117,7 +118,7 @@
 def action_runtest(name, args):
     """run a builtin test application"""
 
-    parser = OptionParser("%%prog %s test-name [options]" % name)
+    parser = OptionParser("%s test-name [options]" % name)
     parser.disable_interspersed_args()
     parser.add_option("", "--submit", dest="submit_url", metavar="URLORPATH",
                       help=("autosubmit the test result to the given server "
@@ -190,7 +191,7 @@
 def action_showtests(name, args):
     """show the available built-in tests"""
 
-    parser = OptionParser("%%prog %s" % name)
+    parser = OptionParser("%s" % name)
     (opts, args) = parser.parse_args(args)
     if len(args) != 0:
         parser.error("incorrect number of argments")
@@ -207,7 +208,7 @@
 def action_submit(name, args):
     """submit a test report to the server"""
 
-    parser = OptionParser("%%prog %s [options] <url> <file>+" % name)
+    parser = OptionParser("%s [options] <url> <file>+" % name)
     parser.add_option("", "--commit", dest="commit", type=int,
                       help=("whether the result should be committed "
                             "[%default]"),
@@ -226,7 +227,7 @@
 def action_update(name, args):
     """create and or auto-update the given database"""
 
-    parser = OptionParser("%%prog %s [options] <db path>" % name)
+    parser = OptionParser("%s [options] <db path>" % name)
     parser.add_option("", "--show-sql", dest="show_sql", default=False,
                       action="store_true", help="show all SQL queries")
 
@@ -256,29 +257,8 @@
 
 ###
 
-commands = dict((name[7:], f) for name,f in locals().items()
-                if name.startswith('action_'))
-def main():
-    cmds_width = max(map(len, commands))
-    parser = OptionParser("""\
-%%prog [options] <command> ... arguments ...
-
-Available commands:
-%s""" % ("\n".join("  %-*s - %s" % (cmds_width, name, func.__doc__)
-                   for name, func in sorted(commands.items()))),
-                          version = "lnt version %s" % lnt.__version__)
-    parser.disable_interspersed_args()
-    (opts, args) = parser.parse_args()
-
-    if not args:
-        parser.print_usage()
-        return
-
-    cmd = args[0]
-    if cmd not in commands:
-        parser.error("invalid command: %r" % cmd)
-
-    commands[cmd](cmd, args[1:])
+tool = lnt.util.multitool.MultiTool(locals())
+main = tool.main
 
 if __name__ == '__main__':
     main()

Modified: lnt/trunk/lnt/lnttool/updatedb.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/lnttool/updatedb.py?rev=165145&r1=165144&r2=165145&view=diff
==============================================================================
--- lnt/trunk/lnt/lnttool/updatedb.py (original)
+++ lnt/trunk/lnt/lnttool/updatedb.py Wed Oct  3 14:25:11 2012
@@ -9,7 +9,7 @@
 
     from optparse import OptionParser, OptionGroup
 
-    parser = OptionParser("%%prog %s [options] <instance> <file>+"%name)
+    parser = OptionParser("%s [options] <instance> <file>+"%name)
     parser.add_option("", "--database", dest="database", default="default",
                       help="database to modify [%default]")
     parser.add_option("", "--testsuite", dest="testsuite",

Added: lnt/trunk/lnt/util/multitool.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/util/multitool.py?rev=165145&view=auto
==============================================================================
--- lnt/trunk/lnt/util/multitool.py (added)
+++ lnt/trunk/lnt/util/multitool.py Wed Oct  3 14:25:11 2012
@@ -0,0 +1,60 @@
+import os
+import sys
+
+class MultiTool(object):
+    """
+    This object defines a generic command line tool instance, which dynamically
+    builds its commands from a module dictionary.
+
+    Example usage::
+
+      import multitool
+
+      def action_foo(name, args):
+          "the foo command"
+
+          ... 
+
+      tool = multitool.MultiTool(locals())
+      if __name__ == '__main__':
+        tool.main(sys.argv)
+
+    Any function beginning with "action_" is considered a tool command. It's
+    name is defined by the function name suffix. Underscores in the function
+    name are converted to '-' in the command line syntax. Actions ending ith
+    "-debug" are not listed in the help.
+    """
+
+    def __init__(self, locals):
+        # Create the list of commands.
+        self.commands = dict((name[7:].replace('_','-'), f)
+                             for name,f in locals.items()
+                             if name.startswith('action_'))
+
+    def usage(self, name):
+        print >>sys.stderr, "Usage: %s <command> [options] ... arguments ..." %(
+            os.path.basename(name),)
+        print >>sys.stderr
+        print >>sys.stderr, """\
+Use ``%s <command> --help`` for more information on a specific command.\n""" % (
+            os.path.basename(name),)
+        print >>sys.stderr, "Available commands:"
+        cmds_width = max(map(len, self.commands))
+        for name,func in sorted(self.commands.items()):
+            if name.endswith("-debug"):
+                continue
+
+            print >>sys.stderr, "  %-*s - %s" % (cmds_width, name, func.__doc__)
+        sys.exit(1)
+
+    def main(self, args=None):
+        if args is None:
+            args = sys.argv
+
+        if len(args) < 2 or args[1] not in self.commands:
+            if len(args) >= 2:
+                print >>sys.stderr,"error: invalid command %r\n" % args[1]
+            self.usage(args[0])
+
+        cmd = args[1]
+        self.commands[cmd]('%s %s' % (os.path.basename(args[0]), cmd), args[2:])





More information about the llvm-commits mailing list