diff --git a/Library/Homebrew/cmd/outdated.rb b/Library/Homebrew/cmd/outdated.rb index 7a199fcae2..2c3316f853 100644 --- a/Library/Homebrew/cmd/outdated.rb +++ b/Library/Homebrew/cmd/outdated.rb @@ -13,41 +13,12 @@ module Homebrew Homebrew.failed = ARGV.resolved_formulae.any? && outdated.any? end - def outdated_brews(formulae) - formulae.map do |f| - all_versions = [] - older_or_same_tap_versions = [] - - if f.oldname && !f.rack.exist? && (dir = HOMEBREW_CELLAR/f.oldname).directory? && - !dir.subdirs.empty? && f.tap == Tab.for_keg(dir.subdirs.first).tap - raise Migrator::MigrationNeededError.new(f) - end - - f.rack.subdirs.each do |keg_dir| - keg = Keg.new keg_dir - version = keg.version - all_versions << version - older_version = f.pkg_version <= version - - tap = Tab.for_keg(keg).tap - if tap.nil? || f.tap == tap || older_version - older_or_same_tap_versions << version - end - end - - if older_or_same_tap_versions.all? { |version| f.pkg_version > version } - yield f, all_versions if block_given? - f - end - end.compact - end - def print_outdated(formulae) verbose = ($stdout.tty? || ARGV.verbose?) && !ARGV.flag?("--quiet") - outdated_brews(formulae) do |f, versions| + formulae.select(&:outdated?).each do |f| if verbose - puts "#{f.full_name} (#{versions*", "} < #{f.pkg_version})" + puts "#{f.full_name} (#{f.outdated_versions*", "} < #{f.pkg_version})" else puts f.full_name end @@ -56,9 +27,10 @@ module Homebrew def print_outdated_json(formulae) json = [] - outdated = outdated_brews(formulae) do |f, versions| + outdated = formulae.select(&:outdated?).each do |f| + json << { :name => f.full_name, - :installed_versions => versions.collect(&:to_s), + :installed_versions => f.outdated_versions.collect(&:to_s), :current_version => f.pkg_version.to_s } end puts Utils::JSON.dump(json) diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index e9d46fa92b..83c34340f3 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -1,5 +1,4 @@ require "cmd/install" -require "cmd/outdated" require "cmd/cleanup" module Homebrew @@ -9,10 +8,10 @@ module Homebrew Homebrew.perform_preinstall_checks if ARGV.named.empty? - outdated = Homebrew.outdated_brews(Formula.installed) + outdated = Formula.installed.select(&:outdated?) exit 0 if outdated.empty? elsif ARGV.named.any? - outdated = Homebrew.outdated_brews(ARGV.resolved_formulae) + outdated = ARGV.resolved_formulae.select(&:outdated?) (ARGV.resolved_formulae - outdated).each do |f| if f.rack.directory? diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index fccdf85680..29693eee99 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -926,6 +926,44 @@ class Formula @oldname_lock.unlock unless @oldname_lock.nil? end + # @private + def outdated_versions + @outdated_versions ||= begin + all_versions = [] + older_or_same_tap_versions = [] + + if oldname && !rack.exist? && (dir = HOMEBREW_CELLAR/oldname).directory? && + !dir.subdirs.empty? && tap == Tab.for_keg(dir.subdirs.first).tap + raise Migrator::MigrationNeededError.new(f) + end + + rack.subdirs.each do |keg_dir| + keg = Keg.new keg_dir + version = keg.version + all_versions << version + older_version = pkg_version <= version + + tab_tap = Tab.for_keg(keg).tap + if tab_tap.nil? || tab_tap == tap || older_version + older_or_same_tap_versions << version + end + end + + if older_or_same_tap_versions.all? { |v| pkg_version > v } + all_versions + else + [] + end + end + end + + # @private + def outdated? + outdated_versions.any? + rescue Migrator::MigrationNeededError + true + end + # @private def pinnable? @pin.pinnable? @@ -1202,6 +1240,8 @@ class Formula "revision" => revision, "installed" => [], "linked_keg" => (linked_keg.resolved_path.basename.to_s if linked_keg.exist?), + "pinned" => pinned?, + "outdated" => outdated?, "keg_only" => keg_only?, "dependencies" => deps.map(&:name).uniq, "conflicts_with" => conflicts.map(&:name),