| 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__) |