From 91c5c15a488ad46bf111c7c97c68574a59ac6fac Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Mon, 15 Jul 2013 19:28:10 -0700 Subject: [PATCH] FormulaInstaller: move Cellar checks to module. --- Library/Homebrew/formula_cellar_checks.rb | 89 ++++++++++++++++++ Library/Homebrew/formula_installer.rb | 104 ++++------------------ 2 files changed, 106 insertions(+), 87 deletions(-) create mode 100644 Library/Homebrew/formula_cellar_checks.rb diff --git a/Library/Homebrew/formula_cellar_checks.rb b/Library/Homebrew/formula_cellar_checks.rb new file mode 100644 index 0000000000..c82b7acabd --- /dev/null +++ b/Library/Homebrew/formula_cellar_checks.rb @@ -0,0 +1,89 @@ +module FormulaCellarChecks + def check_PATH bin + # warn the user if stuff was installed outside of their PATH + return unless bin.directory? + return unless bin.children.length > 0 + + bin = (HOMEBREW_PREFIX/bin.basename).realpath + return if ORIGINAL_PATHS.include? bin + + ["#{bin} is not in your PATH", + "You can amend this by altering your ~/.bashrc file"] + end + + def check_manpages + # Check for man pages that aren't in share/man + return unless (f.prefix+'man').directory? + + ['A top-level "man" directory was found.', + <<-EOS.undent + Homebrew requires that man pages live under share. + This can often be fixed by passing "--mandir=#{man}" to configure. + EOS + ] + end + + def check_infopages + # Check for info pages that aren't in share/info + return unless (f.prefix+'info').directory? + + ['A top-level "info" directory was found.', + <<-EOS.undent + Homebrew suggests that info pages live under share. + This can often be fixed by passing "--infodir=#{info}" to configure. + EOS + ] + end + + def check_jars + return unless f.lib.directory? + + jars = f.lib.children.select{|g| g.to_s =~ /\.jar$/} + return if jars.empty? + + ['JARs were installed to "lib".', + <<-EOS.undent + Installing JARs to "lib" can cause conflicts between packages. + For Java software, it is typically better for the formula to + install to "libexec" and then symlink or wrap binaries into "bin". + "See "activemq", "jruby", etc. for examples." + "The offending files are:" + #{jars} + EOS + ] + end + + def check_non_libraries + return unless f.lib.directory? + + valid_extensions = %w(.a .dylib .framework .jnilib .la .o .so + .jar .prl .pm .sh) + non_libraries = f.lib.children.select do |g| + next if g.directory? + not valid_extensions.include? g.extname + end + return if non_libraries.empty? + + ['Non-libraries were installed to "lib".', + <<-EOS.undent + Installing non-libraries to "lib" is bad practice. + The offending files are: + #{non_libraries} + EOS + ] + end + + def check_non_executables bin + return unless bin.directory? + + non_exes = bin.children.select { |g| g.directory? or not g.executable? } + return if non_exes.empty? + + ["Non-executables were installed to \"#{bin}\".", + <<-EOS.undent + The offending files are: + #{non_exes}" + EOS + ] + end +end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index b24424164e..efaa146a6c 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -7,8 +7,11 @@ require 'tab' require 'bottles' require 'caveats' require 'cleaner' +require 'formula_cellar_checks' class FormulaInstaller + include FormulaCellarChecks + attr_reader :f attr_accessor :tab, :options, :ignore_deps attr_accessor :show_summary_heading, :show_header @@ -437,110 +440,37 @@ class FormulaInstaller ## checks - def check_PATH bin - # warn the user if stuff was installed outside of their PATH - if bin.directory? and bin.children.length > 0 - bin = (HOMEBREW_PREFIX/bin.basename).realpath - unless ORIGINAL_PATHS.include? bin - opoo "#{bin} is not in your PATH" - puts "You can amend this by altering your ~/.bashrc file" - @show_summary_heading = true - end - end - end - - def check_manpages - # Check for man pages that aren't in share/man - if (f.prefix+'man').directory? - opoo 'A top-level "man" directory was found.' - puts "Homebrew requires that man pages live under share." - puts 'This can often be fixed by passing "--mandir=#{man}" to configure.' - @show_summary_heading = true - Homebrew.failed = true # fatal to Brew Bot - end - end - - def check_infopages - # Check for info pages that aren't in share/info - if (f.prefix+'info').directory? - opoo 'A top-level "info" directory was found.' - puts "Homebrew suggests that info pages live under share." - puts 'This can often be fixed by passing "--infodir=#{info}" to configure.' - @show_summary_heading = true - end - end - - def check_jars - return unless f.lib.directory? - - jars = f.lib.children.select{|g| g.to_s =~ /\.jar$/} - unless jars.empty? - opoo 'JARs were installed to "lib".' - puts "Installing JARs to \"lib\" can cause conflicts between packages." - puts "For Java software, it is typically better for the formula to" - puts "install to \"libexec\" and then symlink or wrap binaries into \"bin\"." - puts "See \"activemq\", \"jruby\", etc. for examples." - puts "The offending files are:" - puts jars - @show_summary_heading = true - end - end - - def check_non_libraries - return unless f.lib.directory? - - valid_extensions = %w(.a .dylib .framework .jnilib .la .o .so - .jar .prl .pm .sh) - non_libraries = f.lib.children.select do |g| - next if g.directory? - not valid_extensions.include? g.extname - end - - unless non_libraries.empty? - opoo 'Non-libraries were installed to "lib".' - puts "Installing non-libraries to \"lib\" is bad practice." - puts "The offending files are:" - puts non_libraries - @show_summary_heading = true - end - end - - def check_non_executables bin - non_exes = bin.children.select { |g| g.directory? or not g.executable? } - - unless non_exes.empty? - opoo 'Non-executables were installed to "bin".' - puts "Installing non-executables to \"bin\" is bad practice." - puts "The offending files are:" - puts non_exes - @show_summary_heading = true - Homebrew.failed = true # fatal to Brew Bot - end + def print_check_output warning_and_description + return unless warning_and_description + warning, description = *warning_and_description + opoo warning + puts description + @show_summary_heading = true end def audit_bin return unless f.bin.directory? - check_PATH f.bin unless f.keg_only? - check_non_executables f.bin + print_check_output(check_PATH(f.bin)) unless f.keg_only? + print_check_output(check_non_executables(f.bin)) end def audit_sbin return unless f.sbin.directory? - check_PATH f.sbin unless f.keg_only? - check_non_executables f.sbin + print_check_output(check_PATH(f.sbin)) unless f.keg_only? + print_check_output(check_non_executables(f.sbin)) end def audit_lib - check_jars - check_non_libraries + print_check_output(check_jars) + print_check_output(check_non_libraries) end def audit_man - check_manpages + print_check_output(check_manpages) end def audit_info - check_infopages + print_check_output(check_infopages) end private