man: improve manpage output.

This commit is contained in:
Mike McQuaid 2019-01-30 21:33:30 +00:00
parent 2062c5191d
commit 0fff6e0c09
No known key found for this signature in database
GPG Key ID: 48A898132FD8EE70

View File

@ -11,24 +11,8 @@ require "formula"
require "erb"
require "ostruct"
require "cli_parser"
require "dev-cmd/audit"
require "dev-cmd/bottle"
require "dev-cmd/bump-formula-pr"
require "dev-cmd/create"
require "dev-cmd/edit"
require "dev-cmd/extract"
require "dev-cmd/formula"
require "dev-cmd/irb"
require "dev-cmd/linkage"
require "dev-cmd/mirror"
require "dev-cmd/prof"
require "dev-cmd/pull"
require "dev-cmd/release-notes"
require "dev-cmd/ruby"
require "dev-cmd/tap-new"
require "dev-cmd/test"
require "dev-cmd/tests"
require "dev-cmd/update-test"
# Require all commands
Dir.glob("#{HOMEBREW_LIBRARY_PATH}/{dev-,}cmd/*.rb").each { |cmd| require cmd }
module Homebrew
module_function
@ -83,22 +67,14 @@ module Homebrew
convert_man_page(cask_markup, TARGET_MAN_PATH/"brew-cask.1")
end
def path_glob_commands(glob)
Pathname.glob(glob)
.sort_by { |source_file| sort_key_for_path(source_file) }
.map(&:read).map(&:lines)
.map { |lines| lines.grep(/^#:/).map { |line| line.slice(2..-1) }.join }
.reject { |s| s.strip.empty? || s.include?("@hide_from_man_page") }
end
def build_man_page
template = (SOURCE_PATH/"brew.1.md.erb").read
variables = OpenStruct.new
variables[:commands] = path_glob_commands("#{HOMEBREW_LIBRARY_PATH}/cmd/*.{rb,sh}")
variables[:commands] = generate_cmd_manpages("#{HOMEBREW_LIBRARY_PATH}/cmd/*.{rb,sh}")
variables[:developer_commands] = generate_cmd_manpages("#{HOMEBREW_LIBRARY_PATH}/dev-cmd/{*.rb,sh}")
variables[:global_options] = global_options_manpage
variables[:developer_commands] = generate_cmd_manpages("#{HOMEBREW_LIBRARY_PATH}/dev-cmd/*.{rb,sh}")
variables[:global_options] = global_options_manpage_lines
readme = HOMEBREW_REPOSITORY/"README.md"
variables[:lead_maintainer] =
readme.read[/(Homebrew's lead maintainer .*\.)/, 1]
@ -119,9 +95,6 @@ module Homebrew
readme.read[/(Former maintainers .*\.)/, 1]
.gsub(/\[([^\]]+)\]\([^)]+\)/, '\1')
variables[:homebrew_bundle] = help_output(:bundle)
variables[:homebrew_services] = help_output(:services)
ERB.new(template, nil, ">").result(variables.instance_eval { binding })
end
@ -162,6 +135,7 @@ module Homebrew
odie "Got no output from ronn!" unless ronn_output
if format_flag == "--markdown"
ronn_output = ronn_output.gsub(%r{<var>(.*?)</var>}, "*`\\1`*")
.gsub(/\n\n\n+/, "\n\n")
elsif format_flag == "--roff"
ronn_output = ronn_output.gsub(%r{<code>(.*?)</code>}, "\\fB\\1\\fR")
.gsub(%r{<var>(.*?)</var>}, "\\fI\\1\\fR")
@ -171,12 +145,6 @@ module Homebrew
end
end
def help_output(command)
tap = Tap.fetch("Homebrew/homebrew-#{command}")
tap.install unless tap.installed?
command_help_lines(which("brew-#{command}.rb", Tap.cmd_directories))
end
def target_path_to_format(target)
case target.basename
when /\.md$/ then ["--markdown", "markdown"]
@ -190,38 +158,61 @@ module Homebrew
cmd_paths = Pathname.glob(glob).sort
man_page_lines = []
man_args = Homebrew.args
cmd_paths.each do |cmd_path|
begin
cmd_parser = Homebrew.send(cmd_arg_parser(cmd_path))
man_page_lines << cmd_manpage_lines(cmd_parser).join
rescue NoMethodError
man_page_lines << path_glob_commands(cmd_path.to_s).first
# 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)
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
end
cmd_man_page_lines ||= cmd_comment_manpage_lines(cmd_path)
man_page_lines << cmd_man_page_lines
end
Homebrew.args = man_args
man_page_lines
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_manpage_lines(cmd_parser)
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|
next if !long.nil? && cmd_parser.global_option?(cmd_parser.option_to_name(long))
generate_option_doc(short, long, desc)
end.reject(&:blank?)
lines
end
def cmd_comment_manpage_lines(cmd_path)
comment_lines = cmd_path.read.lines.grep(/^#:/)
return if comment_lines.empty?
return if comment_lines.first.include?("@hide_from_man_page")
lines = [format_usage_banner(comment_lines.first).chomp]
comment_lines.slice(1..-1)
.each do |line|
line = line.slice(4..-1)
next unless line
lines << line.gsub(/^ +(-+[a-z-]+) */, "* `\\1`:\n ")
end
lines
end
def global_options_manpage_lines
def global_options_manpage
lines = ["These options are applicable across all sub-commands.\n"]
lines += Homebrew::CLI::Parser.global_options.values.map do |names, _, desc|
short, long = names
generate_option_doc(short, long, desc)
end
lines
lines.join("\n")
end
def generate_option_doc(short, long, desc)
@ -238,6 +229,6 @@ module Homebrew
end
def format_usage_banner(usage_banner)
usage_banner.sub(/^/, "### ")
usage_banner&.sub(/^(#: *\* )?/, "### ")
end
end