[llvm] r374400 - [lit] Move argument parsing/validation to separate file

Julian Lettner via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 10 10:58:38 PDT 2019


Author: yln
Date: Thu Oct 10 10:58:38 2019
New Revision: 374400

URL: http://llvm.org/viewvc/llvm-project?rev=374400&view=rev
Log:
[lit] Move argument parsing/validation to separate file

Reviewed By: serge-sans-paille

Differential Revision: https://reviews.llvm.org/D68529

Added:
    llvm/trunk/utils/lit/lit/cl_arguments.py
Modified:
    llvm/trunk/utils/lit/lit/main.py

Added: llvm/trunk/utils/lit/lit/cl_arguments.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/cl_arguments.py?rev=374400&view=auto
==============================================================================
--- llvm/trunk/utils/lit/lit/cl_arguments.py (added)
+++ llvm/trunk/utils/lit/lit/cl_arguments.py Thu Oct 10 10:58:38 2019
@@ -0,0 +1,218 @@
+import argparse
+import os
+import shlex
+import sys
+
+import lit.util
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('test_paths',
+            nargs='*',
+            help='Files or paths to include in the test suite')
+
+    parser.add_argument("--version",
+            dest="show_version",
+            help="Show version and exit",
+            action="store_true",
+            default=False)
+    parser.add_argument("-j", "--workers",
+            dest="numWorkers",
+            metavar="N",
+            help="Number of workers used for testing",
+            type=int,
+            default=None)
+    parser.add_argument("--config-prefix",
+            dest="configPrefix",
+            metavar="NAME",
+            help="Prefix for 'lit' config files",
+            action="store",
+            default=None)
+    parser.add_argument("-D", "--param",
+            dest="userParameters",
+            metavar="NAME=VAL",
+            help="Add 'NAME' = 'VAL' to the user defined parameters",
+            type=str,
+            action="append",
+            default=[])
+
+    format_group = parser.add_argument_group("Output Format")
+    # FIXME: I find these names very confusing, although I like the
+    # functionality.
+    format_group.add_argument("-q", "--quiet",
+            help="Suppress no error output",
+            action="store_true",
+            default=False)
+    format_group.add_argument("-s", "--succinct",
+            help="Reduce amount of output",
+            action="store_true",
+            default=False)
+    format_group.add_argument("-v", "--verbose",
+            dest="showOutput",
+            help="Show test output for failures",
+            action="store_true",
+            default=False)
+    format_group.add_argument("-vv", "--echo-all-commands",
+            dest="echoAllCommands",
+            action="store_true",
+            default=False,
+            help="Echo all commands as they are executed to stdout. In case of "
+                 "failure, last command shown will be the failing one.")
+    format_group.add_argument("-a", "--show-all",
+            dest="showAllOutput",
+            help="Display all commandlines and output",
+            action="store_true",
+            default=False)
+    format_group.add_argument("-o", "--output",
+            dest="output_path",
+            help="Write test results to the provided path",
+            action="store",
+            metavar="PATH")
+    format_group.add_argument("--no-progress-bar",
+            dest="useProgressBar",
+            help="Do not use curses based progress bar",
+            action="store_false",
+            default=True)
+    format_group.add_argument("--show-unsupported",
+            help="Show unsupported tests",
+            action="store_true",
+            default=False)
+    format_group.add_argument("--show-xfail",
+            help="Show tests that were expected to fail",
+            action="store_true",
+            default=False)
+
+    execution_group = parser.add_argument_group("Test Execution")
+    execution_group.add_argument("--path",
+            help="Additional paths to add to testing environment",
+            action="append",
+            type=str,
+            default=[])
+    execution_group.add_argument("--vg",
+            dest="useValgrind",
+            help="Run tests under valgrind",
+            action="store_true",
+            default=False)
+    execution_group.add_argument("--vg-leak",
+            dest="valgrindLeakCheck",
+            help="Check for memory leaks under valgrind",
+            action="store_true",
+            default=False)
+    execution_group.add_argument("--vg-arg",
+            dest="valgrindArgs",
+            metavar="ARG",
+            help="Specify an extra argument for valgrind",
+            type=str,
+            action="append",
+            default=[])
+    execution_group.add_argument("--time-tests",
+            dest="timeTests",
+            help="Track elapsed wall time for each test",
+            action="store_true",
+            default=False)
+    execution_group.add_argument("--no-execute",
+            dest="noExecute",
+            help="Don't execute any tests (assume PASS)",
+            action="store_true",
+            default=False)
+    execution_group.add_argument("--xunit-xml-output",
+            dest="xunit_output_file",
+            help="Write XUnit-compatible XML test reports to the specified file",
+            default=None)
+    execution_group.add_argument("--timeout",
+            dest="maxIndividualTestTime",
+            help="Maximum time to spend running a single test (in seconds). "
+                 "0 means no time limit. [Default: 0]",
+            type=int,
+            default=None)
+    execution_group.add_argument("--max-failures",
+            dest="maxFailures",
+            help="Stop execution after the given number of failures.",
+            action="store",
+            type=int,
+            default=None)
+
+    selection_group = parser.add_argument_group("Test Selection")
+    selection_group.add_argument("--max-tests",
+            dest="maxTests",
+            metavar="N",
+            help="Maximum number of tests to run",
+            action="store",
+            type=int,
+            default=None)
+    selection_group.add_argument("--max-time",
+            dest="maxTime",
+            metavar="N",
+            help="Maximum time to spend testing (in seconds)",
+            action="store",
+            type=float,
+            default=None)
+    selection_group.add_argument("--shuffle",
+            help="Run tests in random order",
+            action="store_true",
+            default=False)
+    selection_group.add_argument("-i", "--incremental",
+            help="Run modified and failing tests first (updates mtimes)",
+            action="store_true",
+            default=False)
+    selection_group.add_argument("--filter",
+            metavar="REGEX",
+            help="Only run tests with paths matching the given regular expression",
+            action="store",
+            default=os.environ.get("LIT_FILTER"))
+    selection_group.add_argument("--num-shards", dest="numShards", metavar="M",
+            help="Split testsuite into M pieces and only run one",
+            action="store",
+            type=int,
+            default=os.environ.get("LIT_NUM_SHARDS"))
+    selection_group.add_argument("--run-shard",
+            dest="runShard",
+            metavar="N",
+            help="Run shard #N of the testsuite",
+            action="store",
+            type=int,
+            default=os.environ.get("LIT_RUN_SHARD"))
+
+    debug_group = parser.add_argument_group("Debug and Experimental Options")
+    debug_group.add_argument("--debug",
+            help="Enable debugging (for 'lit' development)",
+            action="store_true",
+            default=False)
+    debug_group.add_argument("--show-suites",
+            dest="showSuites",
+            help="Show discovered test suites",
+            action="store_true",
+            default=False)
+    debug_group.add_argument("--show-tests",
+            dest="showTests",
+            help="Show all discovered tests",
+            action="store_true",
+            default=False)
+
+    opts = parser.parse_args(sys.argv[1:] +
+                             shlex.split(os.environ.get("LIT_OPTS", "")))
+
+    # Validate options
+    if not opts.test_paths:
+        parser.error('No inputs specified')
+
+    if opts.numWorkers is None:
+        opts.numWorkers = lit.util.detectCPUs()
+    elif opts.numWorkers <= 0:
+        parser.error("Option '--workers' or '-j' requires positive integer")
+
+    if opts.maxFailures is not None and opts.maxFailures <= 0:
+        parser.error("Option '--max-failures' requires positive integer")
+
+    if opts.echoAllCommands:
+        opts.showOutput = True
+
+    if (opts.numShards is not None) or (opts.runShard is not None):
+        if (opts.numShards is None) or (opts.runShard is None):
+            parser.error("--num-shards and --run-shard must be used together")
+        if opts.numShards <= 0:
+            parser.error("--num-shards must be positive")
+        if (opts.runShard < 1) or (opts.runShard > opts.numShards):
+            parser.error("--run-shard must be between 1 and --num-shards (inclusive)")
+
+    return opts

Modified: llvm/trunk/utils/lit/lit/main.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/main.py?rev=374400&r1=374399&r2=374400&view=diff
==============================================================================
--- llvm/trunk/utils/lit/lit/main.py (original)
+++ llvm/trunk/utils/lit/lit/main.py Thu Oct 10 10:58:38 2019
@@ -11,14 +11,13 @@ import os
 import platform
 import random
 import re
-import shlex
 import sys
 import time
-import argparse
 import tempfile
 import shutil
 from xml.sax.saxutils import quoteattr
 
+import lit.cl_arguments
 import lit.discovery
 import lit.display
 import lit.LitConfig
@@ -90,14 +89,12 @@ def update_incremental_cache(test):
     fname = test.getFilePath()
     os.utime(fname, None)
 
-def sort_by_incremental_cache(run):
-    def sortIndex(test):
-        fname = test.getFilePath()
-        try:
-            return -os.path.getmtime(fname)
-        except:
-            return 0
-    run.tests.sort(key = lambda t: sortIndex(t))
+def by_mtime(test):
+    fname = test.getFilePath()
+    try:
+        return os.path.getmtime(fname)
+    except:
+        return 0
 
 def main(builtinParameters = {}):
     # Create a temp directory inside the normal temp directory so that we can
@@ -129,152 +126,12 @@ def main(builtinParameters = {}):
                 pass
 
 def main_with_tmp(builtinParameters):
-    parser = argparse.ArgumentParser()
-    parser.add_argument('test_paths',
-                        nargs='*',
-                        help='Files or paths to include in the test suite')
-
-    parser.add_argument("--version", dest="show_version",
-                      help="Show version and exit",
-                      action="store_true", default=False)
-    parser.add_argument("-j", "--threads", "--workers", dest="numWorkers", metavar="N",
-                      help="Number of workers used for testing",
-                      type=int, default=None)
-    parser.add_argument("--config-prefix", dest="configPrefix",
-                      metavar="NAME", help="Prefix for 'lit' config files",
-                      action="store", default=None)
-    parser.add_argument("-D", "--param", dest="userParameters",
-                      metavar="NAME=VAL",
-                      help="Add 'NAME' = 'VAL' to the user defined parameters",
-                      type=str, action="append", default=[])
-
-    format_group = parser.add_argument_group("Output Format")
-    # FIXME: I find these names very confusing, although I like the
-    # functionality.
-    format_group.add_argument("-q", "--quiet",
-                     help="Suppress no error output",
-                     action="store_true", default=False)
-    format_group.add_argument("-s", "--succinct",
-                     help="Reduce amount of output",
-                     action="store_true", default=False)
-    format_group.add_argument("-v", "--verbose", dest="showOutput",
-                     help="Show test output for failures",
-                     action="store_true", default=False)
-    format_group.add_argument("-vv", "--echo-all-commands",
-                     dest="echoAllCommands",
-                     action="store_true", default=False,
-                     help="Echo all commands as they are executed to stdout.\
-                     In case of failure, last command shown will be the\
-                     failing one.")
-    format_group.add_argument("-a", "--show-all", dest="showAllOutput",
-                     help="Display all commandlines and output",
-                     action="store_true", default=False)
-    format_group.add_argument("-o", "--output", dest="output_path",
-                     help="Write test results to the provided path",
-                     action="store", metavar="PATH")
-    format_group.add_argument("--no-progress-bar", dest="useProgressBar",
-                     help="Do not use curses based progress bar",
-                     action="store_false", default=True)
-    format_group.add_argument("--show-unsupported",
-                     help="Show unsupported tests",
-                     action="store_true", default=False)
-    format_group.add_argument("--show-xfail",
-                     help="Show tests that were expected to fail",
-                     action="store_true", default=False)
-
-    execution_group = parser.add_argument_group("Test Execution")
-    execution_group.add_argument("--path",
-                     help="Additional paths to add to testing environment",
-                     action="append", type=str, default=[])
-    execution_group.add_argument("--vg", dest="useValgrind",
-                     help="Run tests under valgrind",
-                     action="store_true", default=False)
-    execution_group.add_argument("--vg-leak", dest="valgrindLeakCheck",
-                     help="Check for memory leaks under valgrind",
-                     action="store_true", default=False)
-    execution_group.add_argument("--vg-arg", dest="valgrindArgs", metavar="ARG",
-                     help="Specify an extra argument for valgrind",
-                     type=str, action="append", default=[])
-    execution_group.add_argument("--time-tests", dest="timeTests",
-                     help="Track elapsed wall time for each test",
-                     action="store_true", default=False)
-    execution_group.add_argument("--no-execute", dest="noExecute",
-                     help="Don't execute any tests (assume PASS)",
-                     action="store_true", default=False)
-    execution_group.add_argument("--xunit-xml-output", dest="xunit_output_file",
-                      help=("Write XUnit-compatible XML test reports to the"
-                            " specified file"), default=None)
-    execution_group.add_argument("--timeout", dest="maxIndividualTestTime",
-                     help="Maximum time to spend running a single test (in seconds)."
-                     "0 means no time limit. [Default: 0]",
-                    type=int, default=None)
-    execution_group.add_argument("--max-failures", dest="maxFailures",
-                     help="Stop execution after the given number of failures.",
-                     action="store", type=int, default=None)
-
-    selection_group = parser.add_argument_group("Test Selection")
-    selection_group.add_argument("--max-tests", dest="maxTests", metavar="N",
-                     help="Maximum number of tests to run",
-                     action="store", type=int, default=None)
-    selection_group.add_argument("--max-time", dest="maxTime", metavar="N",
-                     help="Maximum time to spend testing (in seconds)",
-                     action="store", type=float, default=None)
-    selection_group.add_argument("--shuffle",
-                     help="Run tests in random order",
-                     action="store_true", default=False)
-    selection_group.add_argument("-i", "--incremental",
-                     help="Run modified and failing tests first (updates "
-                     "mtimes)",
-                     action="store_true", default=False)
-    selection_group.add_argument("--filter", metavar="REGEX",
-                     help=("Only run tests with paths matching the given "
-                           "regular expression"),
-                     action="store",
-                     default=os.environ.get("LIT_FILTER"))
-    selection_group.add_argument("--num-shards", dest="numShards", metavar="M",
-                     help="Split testsuite into M pieces and only run one",
-                     action="store", type=int,
-                     default=os.environ.get("LIT_NUM_SHARDS"))
-    selection_group.add_argument("--run-shard", dest="runShard", metavar="N",
-                     help="Run shard #N of the testsuite",
-                     action="store", type=int,
-                     default=os.environ.get("LIT_RUN_SHARD"))
-
-    debug_group = parser.add_argument_group("Debug and Experimental Options")
-    debug_group.add_argument("--debug",
-                      help="Enable debugging (for 'lit' development)",
-                      action="store_true", default=False)
-    debug_group.add_argument("--show-suites", dest="showSuites",
-                      help="Show discovered test suites",
-                      action="store_true", default=False)
-    debug_group.add_argument("--show-tests", dest="showTests",
-                      help="Show all discovered tests",
-                      action="store_true", default=False)
-
-    opts = parser.parse_args(sys.argv[1:] +
-                             shlex.split(os.environ.get("LIT_OPTS", "")))
-    args = opts.test_paths
+    opts = lit.cl_arguments.parse_args()
 
     if opts.show_version:
         print("lit %s" % (lit.__version__,))
         return
 
-    if not args:
-        parser.error('No inputs specified')
-
-    if opts.numWorkers is None:
-        opts.numWorkers = lit.util.detectCPUs()
-    elif opts.numWorkers <= 0:
-        parser.error("Option '--workers' or '-j' requires positive integer")
-
-    if opts.maxFailures is not None and opts.maxFailures <= 0:
-        parser.error("Option '--max-failures' requires positive integer")
-
-    if opts.echoAllCommands:
-        opts.showOutput = True
-
-    inputs = args
-
     # Create the user defined parameters.
     userParams = dict(builtinParameters)
     for entry in opts.userParameters:
@@ -313,7 +170,7 @@ def main_with_tmp(builtinParameters):
 
     # Perform test discovery.
     run = lit.run.Run(litConfig,
-                      lit.discovery.find_tests_for_inputs(litConfig, inputs))
+                      lit.discovery.find_tests_for_inputs(litConfig, opts.test_paths))
 
     # After test discovery the configuration might have changed
     # the maxIndividualTestTime. If we explicitly set this on the
@@ -377,18 +234,12 @@ def main_with_tmp(builtinParameters):
     if opts.shuffle:
         random.shuffle(run.tests)
     elif opts.incremental:
-        sort_by_incremental_cache(run)
+        run.tests.sort(key=by_mtime, reverse=True)
     else:
         run.tests.sort(key = lambda t: (not t.isEarlyTest(), t.getFullName()))
 
     # Then optionally restrict our attention to a shard of the tests.
     if (opts.numShards is not None) or (opts.runShard is not None):
-        if (opts.numShards is None) or (opts.runShard is None):
-            parser.error("--num-shards and --run-shard must be used together")
-        if opts.numShards <= 0:
-            parser.error("--num-shards must be positive")
-        if (opts.runShard < 1) or (opts.runShard > opts.numShards):
-            parser.error("--run-shard must be between 1 and --num-shards (inclusive)")
         num_tests = len(run.tests)
         # Note: user views tests and shard numbers counting from 1.
         test_ixs = range(opts.runShard - 1, num_tests, opts.numShards)




More information about the llvm-commits mailing list