From 072e5df4ed3afb0ca6a7bbd8e869d9ff8e5f8d73 Mon Sep 17 00:00:00 2001 From: Vlad Shablinsky Date: Mon, 1 Aug 2016 16:31:36 +0300 Subject: [PATCH] Cache outdated_versions for Formula Closes #584. Signed-off-by: Xu Cheng --- Library/Homebrew/formula.rb | 32 +++++++++++++++------------ Library/Homebrew/test/test_formula.rb | 1 + 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index d7d2f16fca..3730b135c8 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1001,24 +1001,28 @@ class Formula # @private def outdated_versions(options = {}) - @outdated_versions ||= begin - all_versions = [] - + @outdated_versions ||= Hash.new do |cache, key| raise Migrator::MigrationNeededError.new(self) if migration_needed? + cache[key] = _outdated_versions(key) + end + @outdated_versions[options] + end - installed_kegs.each do |keg| - version = keg.version - all_versions << version + def _outdated_versions(options = {}) + all_versions = [] - return [] if pkg_version <= version && !version.head? - end + installed_kegs.each do |keg| + version = keg.version + all_versions << version - head_version = latest_head_version - if head_version - head_version_outdated?(head_version, options) ? all_versions.sort! : [] - else - all_versions.sort! - end + return [] if pkg_version <= version && !version.head? + end + + head_version = latest_head_version + if head_version && !head_version_outdated?(head_version, options) + [] + else + all_versions.sort end end diff --git a/Library/Homebrew/test/test_formula.rb b/Library/Homebrew/test/test_formula.rb index 3f39384146..af98c358f0 100644 --- a/Library/Homebrew/test/test_formula.rb +++ b/Library/Homebrew/test/test_formula.rb @@ -583,6 +583,7 @@ class OutdatedVersionsTests < Homebrew::TestCase def reset_outdated_versions f.instance_variable_set(:@outdated_versions, nil) + f.instance_variable_set(:@outdated_versions_head_fetched, nil) end def test_greater_different_tap_installed