From e9274b382789bc51cdc7313eb9478896cbf387a8 Mon Sep 17 00:00:00 2001 From: Dawid Dziurla Date: Sun, 26 Jan 2020 18:11:56 +0100 Subject: [PATCH 1/5] help: print cli/parser help message if used --- Library/Homebrew/brew.rb | 2 +- Library/Homebrew/help.rb | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index 11dd3ff30b..89b8e906e2 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -94,7 +94,7 @@ begin # - if cmd is Cask, let Cask handle the help command instead if (empty_argv || help_flag) && cmd != "cask" require "help" - Homebrew::Help.help cmd, empty_argv: empty_argv + Homebrew::Help.help cmd, empty_argv: empty_argv, internal_cmd: internal_cmd # `Homebrew.help` never returns, except for external/unknown commands. end diff --git a/Library/Homebrew/help.rb b/Library/Homebrew/help.rb index c99e6dae7f..039a4567d0 100644 --- a/Library/Homebrew/help.rb +++ b/Library/Homebrew/help.rb @@ -72,6 +72,9 @@ module Homebrew # Resume execution in `brew.rb` for unknown commands. return if path.nil? + # Resume execution in `brew.rb` for external commands using "cli/parser". + return if !flags[:internal_cmd] && path.read.match?("require .cli/parser.") + # Display help for internal command (or generic help if undocumented). puts command_help(path) exit 0 From 0fac6e262e7879860cd6c30fcc82bad842b446b6 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 1 Feb 2020 19:03:07 +0100 Subject: [PATCH 2/5] utils: tweak formatting. --- Library/Homebrew/utils.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index 4dfc19fe9e..7f2c7aea82 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -498,7 +498,10 @@ module Kernel end def command_help_lines(path) - path.read.lines.grep(/^#:/).map { |line| line.slice(2..-1) } + path.read + .lines + .grep(/^#:/) + .map { |line| line.slice(2..-1) } end def redact_secrets(input, secrets) From 736dade71d228134e767d5d09b3355fed7696a45 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 1 Feb 2020 19:03:25 +0100 Subject: [PATCH 3/5] cli/parser: tweak formatting. --- Library/Homebrew/cli/parser.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cli/parser.rb b/Library/Homebrew/cli/parser.rb index e43620a0cf..6303be8e2b 100644 --- a/Library/Homebrew/cli/parser.rb +++ b/Library/Homebrew/cli/parser.rb @@ -155,7 +155,8 @@ module Homebrew end def generate_help_text - @parser.to_s.sub(/^/, "#{Tty.bold}Usage: brew#{Tty.reset} ") + @parser.to_s + .sub(/^/, "#{Tty.bold}Usage: brew#{Tty.reset} ") .gsub(/`(.*?)`/m, "#{Tty.bold}\\1#{Tty.reset}") .gsub(%r{<([^\s]+?://[^\s]+?)>}) { |url| Formatter.url(url) } .gsub(/<(.*?)>/m, "#{Tty.underline}\\1#{Tty.reset}") From cd423a27551cb8a3230455b580ced17f56d6af55 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 1 Feb 2020 19:04:16 +0100 Subject: [PATCH 4/5] help: tweak structure/formatting. --- Library/Homebrew/help.rb | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Library/Homebrew/help.rb b/Library/Homebrew/help.rb index 039a4567d0..f9bd03eb71 100644 --- a/Library/Homebrew/help.rb +++ b/Library/Homebrew/help.rb @@ -93,19 +93,20 @@ module Homebrew nil end + # Otherwise read #: lines from the file. help_lines = command_help_lines(path) - if help_lines.empty? + if help_lines.blank? opoo "No help text in: #{path}" if ARGV.homebrew_developer? - HOMEBREW_HELP - else - Formatter.wrap(help_lines.join.gsub(/^ /, ""), COMMAND_DESC_WIDTH) - .sub("@hide_from_man_page ", "") - .sub(/^\* /, "#{Tty.bold}Usage: brew#{Tty.reset} ") - .gsub(/`(.*?)`/m, "#{Tty.bold}\\1#{Tty.reset}") - .gsub(%r{<([^\s]+?://[^\s]+?)>}) { |url| Formatter.url(url) } - .gsub(/<(.*?)>/m, "#{Tty.underline}\\1#{Tty.reset}") - .gsub(/\*(.*?)\*/m, "#{Tty.underline}\\1#{Tty.reset}") + return HOMEBREW_HELP end + + Formatter.wrap(help_lines.join.gsub(/^ /, ""), COMMAND_DESC_WIDTH) + .sub("@hide_from_man_page ", "") + .sub(/^\* /, "#{Tty.bold}Usage: brew#{Tty.reset} ") + .gsub(/`(.*?)`/m, "#{Tty.bold}\\1#{Tty.reset}") + .gsub(%r{<([^\s]+?://[^\s]+?)>}) { |url| Formatter.url(url) } + .gsub(/<(.*?)>/m, "#{Tty.underline}\\1#{Tty.reset}") + .gsub(/\*(.*?)\*/m, "#{Tty.underline}\\1#{Tty.reset}") end end end From b03efb4356e40c866c46037b799c8babaa49cfa5 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 1 Feb 2020 19:05:03 +0100 Subject: [PATCH 5/5] Move shared man/help logic to cli/parser. --- Library/Homebrew/brew.rb | 4 ++-- Library/Homebrew/cli/parser.rb | 16 ++++++++++++++++ Library/Homebrew/dev-cmd/man.rb | 18 +++--------------- Library/Homebrew/help.rb | 18 ++++-------------- 4 files changed, 25 insertions(+), 31 deletions(-) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index 89b8e906e2..c1638fee8e 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -94,8 +94,8 @@ begin # - if cmd is Cask, let Cask handle the help command instead if (empty_argv || help_flag) && cmd != "cask" require "help" - Homebrew::Help.help cmd, empty_argv: empty_argv, internal_cmd: internal_cmd - # `Homebrew.help` never returns, except for external/unknown commands. + Homebrew::Help.help cmd, empty_argv: empty_argv + # `Homebrew.help` never returns, except for unknown commands. end if internal_cmd diff --git a/Library/Homebrew/cli/parser.rb b/Library/Homebrew/cli/parser.rb index 6303be8e2b..b5579276e0 100644 --- a/Library/Homebrew/cli/parser.rb +++ b/Library/Homebrew/cli/parser.rb @@ -16,6 +16,22 @@ module Homebrew new(args, &block).parse(args) end + def self.from_cmd_path(cmd_path) + cmd_method_prefix = cmd_path.basename(cmd_path.extname) + .to_s + .sub(/^brew-/, "") + .tr("-", "_") + cmd_args_method_name = "#{cmd_method_prefix}_args".to_sym + + begin + Homebrew.send(cmd_args_method_name) if require?(cmd_path) + rescue NoMethodError => e + raise if e.name != cmd_args_method_name + + nil + end + end + def self.global_options { quiet: [["-q", "--quiet"], :quiet, "Suppress any warnings."], diff --git a/Library/Homebrew/dev-cmd/man.rb b/Library/Homebrew/dev-cmd/man.rb index a536aa326f..9be0d45917 100644 --- a/Library/Homebrew/dev-cmd/man.rb +++ b/Library/Homebrew/dev-cmd/man.rb @@ -4,8 +4,6 @@ require "formula" require "erb" require "ostruct" require "cli/parser" -# Require all commands -Dir.glob("#{HOMEBREW_LIBRARY_PATH}/{dev-,}cmd/*.rb").sort.each { |cmd| require cmd } module Homebrew module_function @@ -151,19 +149,13 @@ module Homebrew # preserve existing manpage order cmd_paths.sort_by(&method(:sort_key_for_path)) .each do |cmd_path| - cmd_args_method_name = cmd_arg_parser(cmd_path) - - cmd_man_page_lines = begin - cmd_parser = Homebrew.send(cmd_args_method_name) + cmd_man_page_lines = if cmd_parser = CLI::Parser.from_cmd_path(cmd_path) next if cmd_parser.hide_from_man_page cmd_parser_manpage_lines(cmd_parser).join - rescue NoMethodError => e - raise if e.name != cmd_args_method_name - - nil + else + cmd_comment_manpage_lines(cmd_path) end - cmd_man_page_lines ||= cmd_comment_manpage_lines(cmd_path) man_page_lines << cmd_man_page_lines end @@ -171,10 +163,6 @@ module Homebrew man_page_lines.compact.join("\n") end - def cmd_arg_parser(cmd_path) - "#{cmd_path.basename.to_s.gsub(".rb", "").tr("-", "_")}_args".to_sym - end - def cmd_parser_manpage_lines(cmd_parser) lines = [format_usage_banner(cmd_parser.usage_banner_text)] lines += cmd_parser.processed_options.map do |short, long, _, desc| diff --git a/Library/Homebrew/help.rb b/Library/Homebrew/help.rb index f9bd03eb71..d1ed09408b 100644 --- a/Library/Homebrew/help.rb +++ b/Library/Homebrew/help.rb @@ -72,25 +72,15 @@ module Homebrew # Resume execution in `brew.rb` for unknown commands. return if path.nil? - # Resume execution in `brew.rb` for external commands using "cli/parser". - return if !flags[:internal_cmd] && path.read.match?("require .cli/parser.") - - # Display help for internal command (or generic help if undocumented). + # Display help for commands (or generic help if undocumented). puts command_help(path) exit 0 end def command_help(path) - # Let OptionParser generate help text for commands which have a parser defined - cmd = path.basename(path.extname) - cmd_args_method_name = "#{cmd.to_s.tr("-", "_")}_args".to_sym - begin - return Homebrew.send(cmd_args_method_name) - .generate_help_text - rescue NoMethodError => e - raise if e.name != cmd_args_method_name - - nil + # Let OptionParser generate help text for commands which have a parser + if cmd_parser = CLI::Parser.from_cmd_path(path) + return cmd_parser.generate_help_text end # Otherwise read #: lines from the file.