From 56345c345bdfdd71399d17ccd0ffe8f39bf720eb Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 26 Jul 2021 23:46:32 -0400 Subject: repo: refactor help output handling Currently we have the behavior: * `repo`: Equivalent to `repo help` -- only shows common subcommands (with short description), and then exits 0. * `repo --help`: Shows repo's core options, lists all commands (no specific info), and then exits 0. The first case is not behaving well: * If you run `repo` without a specific subcommand, that's an error, so we should be exiting 1 instead. * Showing only subcommands and no actual option summary makes it seem like repo itself doesn't take any options. This confuses users. Let's rework things a bit. Now we have the behavior: * `repo`: Shows repo's core options, lists all commands (no specific info), and then exits 1. * `repo --help`: Shows repo's core options, shows common subcommands (with short description), and then exits 0. * `repo --help-all`: Shows repo's core options, shows all subcommands (with short description), and then exits 0. Basically we swap the behavior of `repo` and `repo --help`, and fix the exit status when the subcommand is missing. The addition of --help-all is mostly for the man pages. We were relying on `repo help --all` to generate the repo(1) man page, but that too omitted the core repo options. Now the man page includes all the core repo options and provides a summary of all commands. Change-Id: I1f99b99d5b8af2591f96a078d0647a3d76d6b0fc Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/312908 Reviewed-by: Xin Li Tested-by: Mike Frysinger --- main.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'main.py') diff --git a/main.py b/main.py index 253f3112..229cb729 100755 --- a/main.py +++ b/main.py @@ -95,6 +95,8 @@ global_options = optparse.OptionParser( add_help_option=False) global_options.add_option('-h', '--help', action='store_true', help='show this help message and exit') +global_options.add_option('--help-all', action='store_true', + help='show this help message with all subcommands and exit') global_options.add_option('-p', '--paginate', dest='pager', action='store_true', help='display command output in the pager') @@ -128,6 +130,23 @@ class _Repo(object): self.repodir = repodir self.commands = all_commands + def _PrintHelp(self, short: bool = False, all_commands: bool = False): + """Show --help screen.""" + global_options.print_help() + print() + if short: + commands = ' '.join(sorted(self.commands)) + wrapped_commands = textwrap.wrap(commands, width=77) + print('Available commands:\n %s' % ('\n '.join(wrapped_commands),)) + print('\nRun `repo help ` for command-specific details.') + print('Bug reports:', Wrapper().BUG_URL) + else: + cmd = self.commands['help']() + if all_commands: + cmd.PrintAllCommandsBody() + else: + cmd.PrintCommonCommandsBody() + def _ParseArgs(self, argv): """Parse the main `repo` command line options.""" for i, arg in enumerate(argv): @@ -177,19 +196,16 @@ class _Repo(object): SetTrace() # Handle options that terminate quickly first. - if gopts.help: - global_options.print_help() - commands = ' '.join(sorted(self.commands)) - wrapped_commands = textwrap.wrap(commands, width=77) - print('\nAvailable commands:\n %s' % ('\n '.join(wrapped_commands),)) - print('\nRun `repo help ` for command-specific details.') + if gopts.help or gopts.help_all: + self._PrintHelp(short=False, all_commands=gopts.help_all) return 0 elif gopts.show_version: # Always allow global --version regardless of subcommand validity. name = 'version' elif not name: # No subcommand specified, so show the help/subcommand. - name = 'help' + self._PrintHelp(short=True) + return 1 SetDefaultColoring(gopts.color) -- cgit v1.2.3-54-g00ecf