| import inspect |
| import optparse |
| import shlex |
| import sys |
| import time |
| |
| import lldb |
| |
| |
| class ProgressTesterCommand: |
| program = "test-progress" |
| |
| @classmethod |
| def register_lldb_command(cls, debugger, module_name): |
| parser = cls.create_options() |
| cls.__doc__ = parser.format_help() |
| # Add any commands contained in this module to LLDB |
| command = "command script add -c %s.%s %s" % ( |
| module_name, |
| cls.__name__, |
| cls.program, |
| ) |
| debugger.HandleCommand(command) |
| print( |
| 'The "{0}" command has been installed, type "help {0}" or "{0} ' |
| '--help" for detailed help.'.format(cls.program) |
| ) |
| |
| @classmethod |
| def create_options(cls): |
| usage = "usage: %prog [options]" |
| description = "SBProgress testing tool" |
| # Opt parse is deprecated, but leaving this the way it is because it allows help formating |
| # Additionally all our commands use optparse right now, ideally we migrate them all in one go. |
| parser = optparse.OptionParser( |
| description=description, prog=cls.program, usage=usage |
| ) |
| |
| parser.add_option( |
| "--total", |
| dest="total", |
| help="Total items in this progress object. When this option is not specified, this will be an indeterminate progress.", |
| type="int", |
| default=None, |
| ) |
| |
| parser.add_option( |
| "--seconds", |
| dest="seconds", |
| help="Total number of seconds to wait between increments", |
| type="int", |
| ) |
| |
| parser.add_option( |
| "--no-details", |
| dest="no_details", |
| help="Do not display details", |
| action="store_true", |
| default=False, |
| ) |
| |
| return parser |
| |
| def get_short_help(self): |
| return "Progress Tester" |
| |
| def get_long_help(self): |
| return self.help_string |
| |
| def __init__(self, debugger, unused): |
| self.parser = self.create_options() |
| self.help_string = self.parser.format_help() |
| |
| def __call__(self, debugger, command, exe_ctx, result): |
| command_args = shlex.split(command) |
| try: |
| (cmd_options, args) = self.parser.parse_args(command_args) |
| except: |
| result.SetError("option parsing failed") |
| return |
| |
| total = cmd_options.total |
| if total is None: |
| progress = lldb.SBProgress( |
| "Progress tester", "Initial Indeterminate Detail", debugger |
| ) |
| else: |
| progress = lldb.SBProgress( |
| "Progress tester", "Initial Detail", total, debugger |
| ) |
| # Check to see if total is set to None to indicate an indeterminate |
| # progress then default to 3 steps. |
| with progress: |
| if total is None: |
| total = 3 |
| |
| for i in range(1, total): |
| if cmd_options.no_details: |
| progress.Increment(1) |
| else: |
| progress.Increment(1, f"Step {i}") |
| time.sleep(cmd_options.seconds) |
| |
| |
| def __lldb_init_module(debugger, dict): |
| # Register all classes that have a register_lldb_command method |
| for _name, cls in inspect.getmembers(sys.modules[__name__]): |
| if inspect.isclass(cls) and callable( |
| getattr(cls, "register_lldb_command", None) |
| ): |
| cls.register_lldb_command(debugger, __name__) |