Merge pull request #8431 from SeekingMeaning/formula/installed_prefix

formula: rename `installed_prefix` and `opt_or_installed_prefix_keg`
This commit is contained in:
Mike McQuaid 2020-09-01 19:22:50 +01:00 committed by GitHub
commit 5e5dabcadd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 95 additions and 53 deletions

View File

@ -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

View File

@ -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

View File

@ -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.opt_or_installed_prefix_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.

View File

@ -16,6 +16,28 @@ 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
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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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?
@ -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(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.
@ -1617,20 +1610,30 @@ 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)
elsif (latest_installed_prefix = installed_prefixes.last)
Keg.new(latest_installed_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)
latest_installed_prefix
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)
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
@ -1665,12 +1668,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|
@ -1910,7 +1913,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|

View File

@ -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_version.major
next false if major < version
next false if major > version && !can_be_newer
end

View File

@ -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_version.version.commit
else
formula.version
end

View File

@ -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?)

View File

@ -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

View File

@ -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" },
]

View File

@ -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|
@ -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

View File

@ -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

View File

@ -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