From 103e16e4cce5ee896a9d84cb52a880dfc9d906e0 Mon Sep 17 00:00:00 2001 From: Filipe Cabecinhas Date: Sat, 16 Feb 2013 09:05:23 +0000 Subject: [PATCH] Include a small argparse compatibility layer for Python < 2.7 llvm-svn: 175341 --- lldb/test/argparse_compat.py | 80 ++++++++++++++++++++++++++++++++++++++++++++ lldb/test/dotest.py | 8 +++-- 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100755 lldb/test/argparse_compat.py diff --git a/lldb/test/argparse_compat.py b/lldb/test/argparse_compat.py new file mode 100755 index 0000000..32f73db --- /dev/null +++ b/lldb/test/argparse_compat.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +""" +Compatibility module to use the lldb test-suite with Python 2.6. + +Warning: This may be buggy. It has not been extensively tested and should only +be used when it is impossible to use a newer Python version. +It is also a special-purpose class for lldb's test-suite. +""" + +import sys + +if sys.version_info >= (2, 7): + raise "This module shouldn't be used when argparse is available (Python >= 2.7)" +else: + print "Using Python 2.6 compatibility layer. Some command line options may not be supported" + + +import optparse + + +class ArgumentParser(object): + def __init__(self, description="My program's description", prefix_chars='-', add_help=True): + self.groups = [] + self.parser = optparse.OptionParser(description=description, add_help_option=add_help) + self.prefix_chars = prefix_chars + + def add_argument_group(self, name): + group = optparse.OptionGroup(self.parser, name) + # Hack around our test directories argument (what's left after the + # options) + if name != 'Test directories': + self.groups.append(group) + return ArgumentGroup(group) + + def add_argument(self, *opt_strs, **kwargs): + self.parser.add_option(*opt_strs, **kwargs) + # def add_argument(self, opt_str, action='store', dest=None, metavar=None, help=''): + # if dest is None and metavar is None: + # self.parser.add_argument(opt_str, action=action, help=help) + + def parse_args(self, arguments=sys.argv[1:]): + map(lambda g: self.parser.add_option_group(g), self.groups) + (options, args) = self.parser.parse_args(arguments) + d = vars(options) + d['args'] = args + return Namespace(d) + + def print_help(self): + self.parser.print_help() + + +class ArgumentGroup(object): + def __init__(self, option_group): + self.option_group = option_group + + def add_argument(self, *opt_strs, **kwargs): + # Hack around our positional argument (the test directories) + if opt_strs == ('args',): + return + + # Hack around the options that start with '+' + if len(opt_strs) == 1 and opt_strs[0] == '+a': + opt_strs = ('--plus_a',) + if len(opt_strs) == 1 and opt_strs[0] == '+b': + opt_strs = ('--plus_b',) + self.option_group.add_option(*opt_strs, **kwargs) + + +class Namespace(object): + def __init__(self, d): + self.__dict__ = d + + def __str__(self): + strings = [] + for (k, v) in self.__dict__.iteritems(): + strings.append(str(k) + '=' + str(v)) + strings.sort() + + return self.__class__.__name__ + '(' + ', '.join(strings) + ')' diff --git a/lldb/test/dotest.py b/lldb/test/dotest.py index ffd0da8..ee25370 100755 --- a/lldb/test/dotest.py +++ b/lldb/test/dotest.py @@ -20,7 +20,6 @@ Type: for available options. """ -import argparse import os import platform import signal @@ -31,6 +30,11 @@ import time import unittest2 import progress +if sys.version_info >= (2, 7): + argparse = __import__('argparse') +else: + argparse = __import__('argparse_compat') + def is_exe(fpath): """Returns true if fpath is an executable.""" return os.path.isfile(fpath) and os.access(fpath, os.X_OK) @@ -133,7 +137,7 @@ post_flight = None # The 'archs' and 'compilers' can be specified via either command line or configFile, # with the command line overriding the configFile. The corresponding options can be -# specified more than once. For example, "-A x86_64 -A i386" => archs=['x86_64', 'i386'] +# specified more than once. For example, "-A x86_64 -A i386" => archs=['x86_64', 'i386'] # and "-C gcc -C clang" => compilers=['gcc', 'clang']. archs = None # Must be initialized after option parsing compilers = None # Must be initialized after option parsing -- 2.7.4