diff --git a/Library/Homebrew/cmd/tap.rb b/Library/Homebrew/cmd/tap.rb index 08b9e8327b..a7fd3f5001 100644 --- a/Library/Homebrew/cmd/tap.rb +++ b/Library/Homebrew/cmd/tap.rb @@ -5,6 +5,7 @@ module Homebrew if ARGV.empty? puts Tap.names elsif ARGV.first == "--repair" + Tap.each(&:link_manpages) migrate_taps :force => true elsif ARGV.first == "--list-official" require "official_taps" diff --git a/Library/Homebrew/cmd/update.rb b/Library/Homebrew/cmd/update.rb index 39a0371fb7..dfabe95eec 100644 --- a/Library/Homebrew/cmd/update.rb +++ b/Library/Homebrew/cmd/update.rb @@ -76,6 +76,7 @@ module Homebrew puts "Already up-to-date." unless master_updated || !updated_taps.empty? Tap.clear_cache + Tap.each(&:link_manpages) # automatically tap any migrated formulae's new tap report.select_formula(:D).each do |f| diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb index 9134b7d8c0..03b702569a 100644 --- a/Library/Homebrew/tap.rb +++ b/Library/Homebrew/tap.rb @@ -138,6 +138,8 @@ class Tap raise end + link_manpages + formula_count = formula_files.size puts "Tapped #{formula_count} formula#{plural(formula_count, "e")} (#{path.abv})" Descriptions.cache_formulae(formula_names) @@ -153,6 +155,29 @@ class Tap end end + def link_manpages + return unless (path/"man").exist? + conflicts = [] + (path/"man").find do |src| + next if src.directory? + dst = HOMEBREW_PREFIX/"share"/src.relative_path_from(path) + next if dst.symlink? && src == dst.resolved_path + if dst.exist? + conflicts << dst + next + end + dst.make_relative_symlink(src) + end + unless conflicts.empty? + onoe <<-EOS.undent + Could not link #{name} manpages to: + #{conflicts.join("\n")} + + Please delete these files and run `brew tap --repair`. + EOS + end + end + # uninstall this {Tap}. def uninstall raise TapUnavailableError, name unless installed? @@ -161,11 +186,22 @@ class Tap unpin if pinned? formula_count = formula_files.size Descriptions.uncache_formulae(formula_names) + unlink_manpages path.rmtree - path.dirname.rmdir_if_possible + path.parent.rmdir_if_possible puts "Untapped #{formula_count} formula#{plural(formula_count, "e")}" end + def unlink_manpages + return unless (path/"man").exist? + (path/"man").find do |src| + next if src.directory? + dst = HOMEBREW_PREFIX/src.relative_path_from(path) + dst.delete if dst.symlink? && src == dst.resolved_path + dst.parent.rmdir_if_possible + end + end + # True if the {#remote} of {Tap} is customized. def custom_remote? return true unless remote @@ -262,7 +298,7 @@ class Tap raise TapUnavailableError, name unless installed? raise TapPinStatusError.new(name, false) unless pinned? pinned_symlink_path.delete - pinned_symlink_path.dirname.rmdir_if_possible + pinned_symlink_path.parent.rmdir_if_possible @pinned = false end