aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/dev-cmd/man.rb
diff options
context:
space:
mode:
authorMike McQuaid2016-09-05 21:37:02 +0100
committerMike McQuaid2016-09-08 20:46:37 +0100
commitaf8605ea4ba1d9856c055c8c76b447e030540e3f (patch)
treed093b11340406c21a4b873a80effe3b068fd07d4 /Library/Homebrew/dev-cmd/man.rb
parent4f6bae46f9c0f7b713cdbb999318460135f423de (diff)
downloadbrew-af8605ea4ba1d9856c055c8c76b447e030540e3f.tar.bz2
Move developer-focused commands to dev-cmd.
Diffstat (limited to 'Library/Homebrew/dev-cmd/man.rb')
-rw-r--r--Library/Homebrew/dev-cmd/man.rb88
1 files changed, 88 insertions, 0 deletions
diff --git a/Library/Homebrew/dev-cmd/man.rb b/Library/Homebrew/dev-cmd/man.rb
new file mode 100644
index 000000000..6754a15f2
--- /dev/null
+++ b/Library/Homebrew/dev-cmd/man.rb
@@ -0,0 +1,88 @@
+#: @hide_from_man_page
+#: * `man`:
+#: Generate Homebrew's manpages.
+
+require "formula"
+require "erb"
+require "ostruct"
+
+module Homebrew
+ SOURCE_PATH = HOMEBREW_LIBRARY_PATH/"manpages"
+ TARGET_MAN_PATH = HOMEBREW_REPOSITORY/"share/man/man1"
+ TARGET_DOC_PATH = HOMEBREW_REPOSITORY/"share/doc/homebrew"
+
+ def man
+ raise UsageError unless ARGV.named.empty?
+
+ if ARGV.flag? "--link"
+ odie "`brew man --link` is now done automatically by `brew update`."
+ else
+ regenerate_man_pages
+ end
+ end
+
+ private
+
+ def regenerate_man_pages
+ Homebrew.install_gem_setup_path! "ronn"
+
+ markup = build_man_page
+ convert_man_page(markup, TARGET_DOC_PATH/"brew.1.html")
+ convert_man_page(markup, TARGET_MAN_PATH/"brew.1")
+
+ cask_markup = (HOMEBREW_LIBRARY/"Homebrew/manpages/brew-cask.1.md").read
+ convert_man_page(cask_markup, TARGET_MAN_PATH/"brew-cask.1")
+ end
+
+ def build_man_page
+ template = (SOURCE_PATH/"brew.1.md.erb").read
+ variables = OpenStruct.new
+
+ variables[:commands] = Pathname.glob("#{HOMEBREW_LIBRARY_PATH}/cmd/*.{rb,sh}").
+ sort_by { |source_file| sort_key_for_path(source_file) }.
+ map { |source_file|
+ source_file.read.lines.
+ grep(/^#:/).
+ map { |line| line.slice(2..-1) }.
+ join
+ }.
+ reject { |s| s.strip.empty? || s.include?("@hide_from_man_page") }
+
+ variables[:maintainers] = (HOMEBREW_REPOSITORY/"README.md").
+ read[/Homebrew's current maintainers are (.*)\./, 1].
+ scan(/\[([^\]]*)\]/).flatten
+
+ ERB.new(template, nil, ">").result(variables.instance_eval{ binding })
+ end
+
+ def sort_key_for_path(path)
+ # Options after regular commands (`~` comes after `z` in ASCII table).
+ path.basename.to_s.sub(/\.(rb|sh)$/, "").sub(/^--/, "~~")
+ end
+
+ def convert_man_page(markup, target)
+ shared_args = %W[
+ --pipe
+ --organization=Homebrew
+ --manual=#{target.basename(".1")}
+ ]
+
+ format_flag, format_desc = target_path_to_format(target)
+
+ puts "Writing #{format_desc} to #{target}"
+ Utils.popen(["ronn", format_flag] + shared_args, "rb+") do |ronn|
+ ronn.write markup
+ ronn.close_write
+ target.atomic_write ronn.read
+ end
+ end
+
+ def target_path_to_format(target)
+ case target.basename
+ when /\.html?$/ then ["--fragment", "HTML fragment"]
+ when /\.\d$/ then ["--roff", "man page"]
+ else
+ odie "Failed to infer output format from '#{target.basename}'."
+ end
+ end
+end