From 5acdcd26d086299e78e9e505f488215818c44008 Mon Sep 17 00:00:00 2001 From: Seeker Date: Fri, 21 Aug 2020 12:10:44 -0700 Subject: [PATCH 1/4] formula: rename `installed_prefix` to `latest_installed_prefix` --- Library/Homebrew/cli/named_args.rb | 2 +- Library/Homebrew/cmd/--prefix.rb | 2 +- Library/Homebrew/formula.rb | 8 +++--- Library/Homebrew/tab.rb | 2 +- Library/Homebrew/test/cmd/uninstall_spec.rb | 8 +++--- Library/Homebrew/test/formula_spec.rb | 30 ++++++++++----------- Library/Homebrew/utils/bottles.rb | 2 +- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Library/Homebrew/cli/named_args.rb b/Library/Homebrew/cli/named_args.rb index a33fd1e086..ec3812d445 100644 --- a/Library/Homebrew/cli/named_args.rb +++ b/Library/Homebrew/cli/named_args.rb @@ -163,7 +163,7 @@ module Homebrew Formulary.from_rack(rack) end - unless (prefix = f.installed_prefix).directory? + unless (prefix = f.latest_installed_prefix).directory? raise MultipleVersionsInstalledError, "#{rack.basename} has multiple installed versions" end diff --git a/Library/Homebrew/cmd/--prefix.rb b/Library/Homebrew/cmd/--prefix.rb index d6d3ed7b63..01fd584ad7 100644 --- a/Library/Homebrew/cmd/--prefix.rb +++ b/Library/Homebrew/cmd/--prefix.rb @@ -26,7 +26,7 @@ module Homebrew puts HOMEBREW_PREFIX else puts args.named.to_resolved_formulae.map { |f| - f.opt_prefix.exist? ? f.opt_prefix : f.installed_prefix + f.opt_prefix.exist? ? f.opt_prefix : f.latest_installed_prefix } end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index dc8c8d23e2..f4f72c58c2 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -488,11 +488,11 @@ class Formula delegate compiler_failures: :active_spec # If this {Formula} is installed. - # This is actually just a check for if the {#installed_prefix} directory + # This is actually just a check for if the {#latest_installed_prefix} directory # exists and is not empty. # @private def latest_version_installed? - (dir = installed_prefix).directory? && !dir.children.empty? + (dir = latest_installed_prefix).directory? && !dir.children.empty? end # If at least one version of {Formula} is installed. @@ -547,7 +547,7 @@ class Formula # The latest prefix for this formula. Checks for {#head}, then {#devel} # and then {#stable}'s {#prefix} # @private - def installed_prefix + def latest_installed_prefix if head && (head_version = latest_head_version) && !head_version_outdated?(head_version) latest_head_prefix elsif devel && (devel_prefix = prefix(PkgVersion.new(devel.version, revision))).directory? @@ -563,7 +563,7 @@ class Formula # if the formula is not installed. # @private def installed_version - Keg.new(installed_prefix).version + Keg.new(latest_installed_prefix).version end # The directory in the cellar that the formula is installed to. diff --git a/Library/Homebrew/tab.rb b/Library/Homebrew/tab.rb index d146533e5f..6eb68599b0 100644 --- a/Library/Homebrew/tab.rb +++ b/Library/Homebrew/tab.rb @@ -145,7 +145,7 @@ class Tab < OpenStruct paths << dirs.first end - paths << f.installed_prefix + paths << f.latest_installed_prefix path = paths.map { |pn| pn/FILENAME }.find(&:file?) diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index f27ff096bf..999d38f547 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -28,17 +28,17 @@ describe Homebrew do end end - let(:kegs_by_rack) { { dependency.rack => [Keg.new(dependency.installed_prefix)] } } + let(:kegs_by_rack) { { dependency.rack => [Keg.new(dependency.latest_installed_prefix)] } } before do [dependency, dependent].each do |f| - f.installed_prefix.mkpath - Keg.new(f.installed_prefix).optlink + f.latest_installed_prefix.mkpath + Keg.new(f.latest_installed_prefix).optlink end tab = Tab.empty tab.homebrew_version = "1.1.6" - tab.tabfile = dependent.installed_prefix/Tab::FILENAME + tab.tabfile = dependent.latest_installed_prefix/Tab::FILENAME tab.runtime_dependencies = [ { "full_name" => "dependency", "version" => "1" }, ] diff --git a/Library/Homebrew/test/formula_spec.rb b/Library/Homebrew/test/formula_spec.rb index e198291e19..265846e025 100644 --- a/Library/Homebrew/test/formula_spec.rb +++ b/Library/Homebrew/test/formula_spec.rb @@ -282,23 +282,23 @@ describe Formula do describe "#latest_version_installed?" do let(:f) { Testball.new } - it "returns false if the #installed_prefix is not a directory" do - allow(f).to receive(:installed_prefix).and_return(double(directory?: false)) + it "returns false if the #latest_installed_prefix is not a directory" do + allow(f).to receive(:latest_installed_prefix).and_return(double(directory?: false)) expect(f).not_to be_latest_version_installed end - it "returns false if the #installed_prefix does not have children" do - allow(f).to receive(:installed_prefix).and_return(double(directory?: true, children: [])) + it "returns false if the #latest_installed_prefix does not have children" do + allow(f).to receive(:latest_installed_prefix).and_return(double(directory?: true, children: [])) expect(f).not_to be_latest_version_installed end - it "returns true if the #installed_prefix has children" do - allow(f).to receive(:installed_prefix).and_return(double(directory?: true, children: [double])) + it "returns true if the #latest_installed_prefix has children" do + allow(f).to receive(:latest_installed_prefix).and_return(double(directory?: true, children: [double])) expect(f).to be_latest_version_installed end end - describe "#installed prefix" do + describe "#latest_installed_prefix" do let(:f) do formula do url "foo" @@ -311,17 +311,17 @@ describe Formula do let(:head_prefix) { HOMEBREW_CELLAR/f.name/f.head.version } it "is the same as #prefix by default" do - expect(f.installed_prefix).to eq(f.prefix) + expect(f.latest_installed_prefix).to eq(f.prefix) end it "returns the stable prefix if it is installed" do stable_prefix.mkpath - expect(f.installed_prefix).to eq(stable_prefix) + expect(f.latest_installed_prefix).to eq(stable_prefix) end it "returns the head prefix if it is installed" do head_prefix.mkpath - expect(f.installed_prefix).to eq(head_prefix) + expect(f.latest_installed_prefix).to eq(head_prefix) end it "returns the stable prefix if head is outdated" do @@ -332,12 +332,12 @@ describe Formula do tab.source["versions"] = { "stable" => "1.0" } tab.write - expect(f.installed_prefix).to eq(stable_prefix) + expect(f.latest_installed_prefix).to eq(stable_prefix) end it "returns the head prefix if the active specification is :head" do f.active_spec = :head - expect(f.installed_prefix).to eq(head_prefix) + expect(f.latest_installed_prefix).to eq(head_prefix) end end @@ -728,7 +728,7 @@ describe Formula do dependency = formula("dependency") { url "f-1.0" } formula.brew { formula.install } - keg = Keg.for(formula.installed_prefix) + keg = Keg.for(formula.latest_installed_prefix) keg.link linkage_checker = double("linkage checker", undeclared_deps: [dependency.name]) @@ -745,7 +745,7 @@ describe Formula do tab.runtime_dependencies = ["foo"] tab.write - keg = Keg.for(formula.installed_prefix) + keg = Keg.for(formula.latest_installed_prefix) keg.link expect(formula.runtime_dependencies.map(&:name)).to be_empty @@ -865,7 +865,7 @@ describe Formula do head("foo") end - stable_prefix = f.installed_prefix + stable_prefix = f.latest_installed_prefix stable_prefix.mkpath [["000000_1", 1], ["111111", 2], ["111111_1", 2]].each do |pkg_version_suffix, stamp| diff --git a/Library/Homebrew/utils/bottles.rb b/Library/Homebrew/utils/bottles.rb index b5cafd9ac9..ec47aa0c94 100644 --- a/Library/Homebrew/utils/bottles.rb +++ b/Library/Homebrew/utils/bottles.rb @@ -15,7 +15,7 @@ module Utils def built_as?(f) return false unless f.latest_version_installed? - tab = Tab.for_keg(f.installed_prefix) + tab = Tab.for_keg(f.latest_installed_prefix) tab.built_as_bottle end From 1f6bb52d3da2f2e6e8d8359d7d2474ff5548a2f0 Mon Sep 17 00:00:00 2001 From: Seeker Date: Fri, 21 Aug 2020 12:41:53 -0700 Subject: [PATCH 2/4] formula: deprecate `installed_prefix` and `installed_version` --- Library/Homebrew/compat/formula.rb | 16 ++++++++++++++++ Library/Homebrew/formula.rb | 7 ------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Library/Homebrew/compat/formula.rb b/Library/Homebrew/compat/formula.rb index 74caf081fb..c41f9236e2 100644 --- a/Library/Homebrew/compat/formula.rb +++ b/Library/Homebrew/compat/formula.rb @@ -16,6 +16,22 @@ class Formula super end + + def installed_prefix + # TODO: deprecate for Homebrew 2.5 + # odeprecated "Formula#installed_prefix", + # "Formula#latest_installed_prefix (or Formula#any_installed_prefix)" + latest_installed_prefix + end + + # The currently installed version for this formula. Will raise an exception + # if the formula is not installed. + # @private + def installed_version + # TODO: deprecate for Homebrew 2.5 + # odeprecated "Formula#installed_version" + Keg.new(latest_installed_prefix).version + end end prepend Compat diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index f4f72c58c2..cfdaaaa579 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -559,13 +559,6 @@ class Formula end end - # The currently installed version for this formula. Will raise an exception - # if the formula is not installed. - # @private - def installed_version - Keg.new(latest_installed_prefix).version - end - # The directory in the cellar that the formula is installed to. # This directory points to {#opt_prefix} if it exists and if #{prefix} is not # called from within the same formula's {#install} or {#post_install} methods. From 5def0701ba49b7216e56d8979e7d62932e797e25 Mon Sep 17 00:00:00 2001 From: Seeker Date: Mon, 31 Aug 2020 10:58:36 -0700 Subject: [PATCH 3/4] formula: rename `opt_or_installed_prefix_keg` to `any_installed_keg` --- Library/Homebrew/cmd/install.rb | 2 +- Library/Homebrew/compat/formula.rb | 6 ++++++ Library/Homebrew/dev-cmd/linkage.rb | 2 +- Library/Homebrew/dev-cmd/pr-pull.rb | 2 +- Library/Homebrew/dev-cmd/pull.rb | 2 +- Library/Homebrew/formula.rb | 24 +++++++++++++++--------- Library/Homebrew/language/java.rb | 2 +- Library/Homebrew/livecheck/livecheck.rb | 2 +- Library/Homebrew/test/cmd/link_spec.rb | 2 +- Library/Homebrew/upgrade.rb | 4 ++-- 10 files changed, 30 insertions(+), 18 deletions(-) diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index af41382d3c..cda32afd64 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -219,7 +219,7 @@ module Homebrew end opoo msg if msg elsif !f.any_version_installed? && old_formula = f.old_installed_formulae.first - installed_version = old_formula.opt_or_installed_prefix_keg.version + installed_version = old_formula.any_installed_keg.version msg = "#{old_formula.full_name} #{installed_version} already installed" if !old_formula.linked? && !old_formula.keg_only? msg = <<~EOS diff --git a/Library/Homebrew/compat/formula.rb b/Library/Homebrew/compat/formula.rb index c41f9236e2..2759d9a7f9 100644 --- a/Library/Homebrew/compat/formula.rb +++ b/Library/Homebrew/compat/formula.rb @@ -32,6 +32,12 @@ class Formula # odeprecated "Formula#installed_version" Keg.new(latest_installed_prefix).version end + + def opt_or_installed_prefix_keg + # TODO: deprecate for Homebrew 2.5 + # odeprecated "Formula#opt_or_installed_prefix_keg", "Formula#any_installed_keg" + any_installed_keg + end end prepend Compat diff --git a/Library/Homebrew/dev-cmd/linkage.rb b/Library/Homebrew/dev-cmd/linkage.rb index a95234a57c..e090e413bd 100644 --- a/Library/Homebrew/dev-cmd/linkage.rb +++ b/Library/Homebrew/dev-cmd/linkage.rb @@ -32,7 +32,7 @@ module Homebrew CacheStoreDatabase.use(:linkage) do |db| kegs = if args.named.to_kegs.empty? - Formula.installed.map(&:opt_or_installed_prefix_keg).reject(&:nil?) + Formula.installed.map(&:any_installed_keg).reject(&:nil?) else args.named.to_kegs end diff --git a/Library/Homebrew/dev-cmd/pr-pull.rb b/Library/Homebrew/dev-cmd/pr-pull.rb index be6586ae77..0e46ebbbc3 100644 --- a/Library/Homebrew/dev-cmd/pr-pull.rb +++ b/Library/Homebrew/dev-cmd/pr-pull.rb @@ -73,7 +73,7 @@ module Homebrew else if gnupg.any_version_installed? path = PATH.new(ENV.fetch("PATH")) - path.prepend(gnupg.opt_or_installed_prefix_keg/"bin") + path.prepend(gnupg.any_installed_prefix/"bin") ENV["PATH"] = path end end diff --git a/Library/Homebrew/dev-cmd/pull.rb b/Library/Homebrew/dev-cmd/pull.rb index 9ca64a27ce..687db6b86b 100644 --- a/Library/Homebrew/dev-cmd/pull.rb +++ b/Library/Homebrew/dev-cmd/pull.rb @@ -60,7 +60,7 @@ module Homebrew else if gnupg.any_version_installed? path = PATH.new(ENV.fetch("PATH")) - path.prepend(gnupg.opt_or_installed_prefix_keg/"bin") + path.prepend(gnupg.any_installed_prefix/"bin") ENV["PATH"] = path end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index cfdaaaa579..10ea1bcc78 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1610,12 +1610,18 @@ class Formula # Returns a Keg for the opt_prefix or installed_prefix if they exist. # If not, return nil. # @private - def opt_or_installed_prefix_keg - Formula.cache[:opt_or_installed_prefix_keg] ||= {} - Formula.cache[:opt_or_installed_prefix_keg][full_name] ||= if optlinked? && opt_prefix.exist? - Keg.new(opt_prefix) + def any_installed_keg + Formula.cache[:any_installed_keg] ||= {} + Formula.cache[:any_installed_keg][full_name] ||= if (installed_prefix = any_installed_prefix) + Keg.new(installed_prefix) + end + end + + def any_installed_prefix + if optlinked? && opt_prefix.exist? + opt_prefix elsif (latest_installed_prefix = installed_prefixes.last) - Keg.new(latest_installed_prefix) + latest_installed_prefix end end @@ -1623,7 +1629,7 @@ class Formula # @private def runtime_dependencies(read_from_tab: true, undeclared: true) deps = if read_from_tab && undeclared && - (tab_deps = opt_or_installed_prefix_keg&.runtime_dependencies) + (tab_deps = any_installed_keg&.runtime_dependencies) tab_deps.map do |d| full_name = d["full_name"] next unless full_name @@ -1658,12 +1664,12 @@ class Formula end def runtime_installed_formula_dependents - # `opt_or_installed_prefix_keg` and `runtime_dependencies` `select`s ensure + # `any_installed_keg` and `runtime_dependencies` `select`s ensure # that we don't end up with something `Formula#runtime_dependencies` can't # read from a `Tab`. Formula.cache[:runtime_installed_formula_dependents] = {} Formula.cache[:runtime_installed_formula_dependents][full_name] ||= Formula.installed - .select(&:opt_or_installed_prefix_keg) + .select(&:any_installed_keg) .select(&:runtime_dependencies) .select do |f| f.runtime_formula_dependencies.any? do |dep| @@ -1903,7 +1909,7 @@ class Formula # but the formula links to. # @private def undeclared_runtime_dependencies - keg = opt_or_installed_prefix_keg + keg = any_installed_keg return [] unless keg CacheStoreDatabase.use(:linkage) do |db| diff --git a/Library/Homebrew/language/java.rb b/Library/Homebrew/language/java.rb index db9be69a22..b8293e0474 100644 --- a/Library/Homebrew/language/java.rb +++ b/Library/Homebrew/language/java.rb @@ -14,7 +14,7 @@ module Language next false unless f.any_version_installed? unless version.zero? - major = f.opt_or_installed_prefix_keg.version.major + major = f.any_installed_keg.version.major next false if major < version next false if major > version && !can_be_newer end diff --git a/Library/Homebrew/livecheck/livecheck.rb b/Library/Homebrew/livecheck/livecheck.rb index 0ebeaaad7d..92d9b22ed7 100644 --- a/Library/Homebrew/livecheck/livecheck.rb +++ b/Library/Homebrew/livecheck/livecheck.rb @@ -81,7 +81,7 @@ module Homebrew formula.head.downloader.shutup! if formula.head? current = if formula.head? - formula.opt_or_installed_prefix_keg.version.version.commit + formula.any_installed_keg.version.version.commit else formula.version end diff --git a/Library/Homebrew/test/cmd/link_spec.rb b/Library/Homebrew/test/cmd/link_spec.rb index f76b5a1d89..67748ae138 100644 --- a/Library/Homebrew/test/cmd/link_spec.rb +++ b/Library/Homebrew/test/cmd/link_spec.rb @@ -9,7 +9,7 @@ end describe "brew link", :integration_test do it "links a given Formula" do install_test_formula "testball" - Formula["testball"].opt_or_installed_prefix_keg.unlink + Formula["testball"].any_installed_keg.unlink expect { brew "link", "testball" } .to output(/Linking/).to_stdout diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index ee7827a884..a64cabf5ac 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -125,7 +125,7 @@ module Homebrew installed_formulae.flat_map(&:runtime_installed_formula_dependents) .uniq .select do |f| - keg = f.opt_or_installed_prefix_keg + keg = f.any_installed_keg next unless keg LinkageChecker.new(keg, cache_db: db) @@ -245,7 +245,7 @@ module Homebrew end def depends_on(a, b) - if a.opt_or_installed_prefix_keg + if a.any_installed_keg &.runtime_dependencies &.any? { |d| d["full_name"] == b.full_name } 1 From f366280e18ebaca3ae3da134a50a51fd4baed5ac Mon Sep 17 00:00:00 2001 From: Seeker Date: Mon, 31 Aug 2020 10:59:27 -0700 Subject: [PATCH 4/4] formula: add `any_installed_version` --- Library/Homebrew/cmd/install.rb | 3 +-- Library/Homebrew/formula.rb | 4 ++++ Library/Homebrew/language/java.rb | 2 +- Library/Homebrew/livecheck/livecheck.rb | 2 +- Library/Homebrew/test/formula_spec.rb | 18 ++++++++++++++++++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index cda32afd64..5dad52493e 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -219,8 +219,7 @@ module Homebrew end opoo msg if msg elsif !f.any_version_installed? && old_formula = f.old_installed_formulae.first - installed_version = old_formula.any_installed_keg.version - msg = "#{old_formula.full_name} #{installed_version} already installed" + msg = "#{old_formula.full_name} #{old_formula.any_installed_version} already installed" if !old_formula.linked? && !old_formula.keg_only? msg = <<~EOS #{msg}, it's just not linked. diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 10ea1bcc78..fbbd55fd96 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1625,6 +1625,10 @@ class Formula end end + def any_installed_version + any_installed_keg&.version + end + # Returns a list of Dependency objects that are required at runtime. # @private def runtime_dependencies(read_from_tab: true, undeclared: true) diff --git a/Library/Homebrew/language/java.rb b/Library/Homebrew/language/java.rb index b8293e0474..fb9b7b0119 100644 --- a/Library/Homebrew/language/java.rb +++ b/Library/Homebrew/language/java.rb @@ -14,7 +14,7 @@ module Language next false unless f.any_version_installed? unless version.zero? - major = f.any_installed_keg.version.major + major = f.any_installed_version.major next false if major < version next false if major > version && !can_be_newer end diff --git a/Library/Homebrew/livecheck/livecheck.rb b/Library/Homebrew/livecheck/livecheck.rb index 92d9b22ed7..d94bce7d8e 100644 --- a/Library/Homebrew/livecheck/livecheck.rb +++ b/Library/Homebrew/livecheck/livecheck.rb @@ -81,7 +81,7 @@ module Homebrew formula.head.downloader.shutup! if formula.head? current = if formula.head? - formula.any_installed_keg.version.version.commit + formula.any_installed_version.version.commit else formula.version end diff --git a/Library/Homebrew/test/formula_spec.rb b/Library/Homebrew/test/formula_spec.rb index 265846e025..82ef571953 100644 --- a/Library/Homebrew/test/formula_spec.rb +++ b/Library/Homebrew/test/formula_spec.rb @@ -1344,4 +1344,22 @@ describe Formula do end end end + + describe "#any_installed_version" do + let(:f) do + Class.new(Testball) do + version "1.0" + revision 1 + end.new + end + + it "returns nil when not installed" do + expect(f.any_installed_version).to be nil + end + + it "returns package version when installed" do + f.brew { f.install } + expect(f.any_installed_version).to eq(PkgVersion.parse("1.0_1")) + end + end end