Merge pull request #1750 from alyssais/fallback_dependencies
keg: fall back for dependencies of buggy tabs
This commit is contained in:
commit
33fbf3f32d
@ -377,7 +377,7 @@ class Keg
|
|||||||
tap = Tab.for_keg(self).source["tap"]
|
tap = Tab.for_keg(self).source["tap"]
|
||||||
Keg.all.select do |keg|
|
Keg.all.select do |keg|
|
||||||
tab = Tab.for_keg(keg)
|
tab = Tab.for_keg(keg)
|
||||||
next if tab.runtime_dependencies.nil? # no dependency information saved.
|
next if tab.runtime_dependencies.nil?
|
||||||
tab.runtime_dependencies.any? do |dep|
|
tab.runtime_dependencies.any? do |dep|
|
||||||
# Resolve formula rather than directly comparing names
|
# Resolve formula rather than directly comparing names
|
||||||
# in case of conflicts between formulae from different taps.
|
# in case of conflicts between formulae from different taps.
|
||||||
|
|||||||
@ -242,6 +242,17 @@ class Tab < OpenStruct
|
|||||||
super || DevelopmentTools.default_compiler
|
super || DevelopmentTools.default_compiler
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def parsed_homebrew_version
|
||||||
|
return Version::NULL if homebrew_version.nil?
|
||||||
|
Version.new(homebrew_version)
|
||||||
|
end
|
||||||
|
|
||||||
|
def runtime_dependencies
|
||||||
|
# Homebrew versions prior to 1.1.6 generated incorrect runtime dependency
|
||||||
|
# lists.
|
||||||
|
super unless parsed_homebrew_version < "1.1.6"
|
||||||
|
end
|
||||||
|
|
||||||
def cxxstdlib
|
def cxxstdlib
|
||||||
# Older tabs won't have these values, so provide sensible defaults
|
# Older tabs won't have these values, so provide sensible defaults
|
||||||
lib = stdlib.to_sym if stdlib
|
lib = stdlib.to_sym if stdlib
|
||||||
|
|||||||
@ -348,13 +348,22 @@ class InstalledDependantsTests < LinkTestCase
|
|||||||
tab.write
|
tab.write
|
||||||
end
|
end
|
||||||
|
|
||||||
def dependencies(deps)
|
# 1.1.6 is the earliest version of Homebrew that generates correct runtime
|
||||||
|
# dependency lists in tabs.
|
||||||
|
def dependencies(deps, homebrew_version: "1.1.6")
|
||||||
alter_tab do |tab|
|
alter_tab do |tab|
|
||||||
|
tab.homebrew_version = homebrew_version
|
||||||
tab.tabfile = @dependent.join("INSTALL_RECEIPT.json")
|
tab.tabfile = @dependent.join("INSTALL_RECEIPT.json")
|
||||||
tab.runtime_dependencies = deps
|
tab.runtime_dependencies = deps
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def unreliable_dependencies(deps)
|
||||||
|
# 1.1.5 is (hopefully!) the last version of Homebrew that generates
|
||||||
|
# incorrect runtime dependency lists in tabs.
|
||||||
|
dependencies(deps, homebrew_version: "1.1.5")
|
||||||
|
end
|
||||||
|
|
||||||
# Test with a keg whose formula isn't known.
|
# Test with a keg whose formula isn't known.
|
||||||
# This can happen if e.g. a formula is installed
|
# This can happen if e.g. a formula is installed
|
||||||
# from a file path or URL.
|
# from a file path or URL.
|
||||||
@ -426,4 +435,11 @@ class InstalledDependantsTests < LinkTestCase
|
|||||||
assert_equal [@dependent], @keg.installed_dependents
|
assert_equal [@dependent], @keg.installed_dependents
|
||||||
assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg])
|
assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_fallback_for_old_versions
|
||||||
|
unreliable_dependencies [{ "full_name" => "baz", "version" => "1.0" }]
|
||||||
|
Formula["bar"].class.depends_on "foo"
|
||||||
|
assert_empty @keg.installed_dependents
|
||||||
|
assert_equal [[@keg], ["bar"]], Keg.find_some_installed_dependents([@keg])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"homebrew_version": "1.1.6",
|
||||||
"used_options": [
|
"used_options": [
|
||||||
"--with-foo",
|
"--with-foo",
|
||||||
"--without-bar"
|
"--without-bar"
|
||||||
|
|||||||
@ -32,6 +32,11 @@ class TabTests < Homebrew::TestCase
|
|||||||
|
|
||||||
def test_defaults
|
def test_defaults
|
||||||
tab = Tab.empty
|
tab = Tab.empty
|
||||||
|
|
||||||
|
# FIXME: remove this line after Homebrew 1.1.6 is released.
|
||||||
|
# See https://github.com/Homebrew/brew/pull/1750#discussion_r94254622
|
||||||
|
tab.homebrew_version = "1.1.6"
|
||||||
|
|
||||||
assert_empty tab.unused_options
|
assert_empty tab.unused_options
|
||||||
assert_empty tab.used_options
|
assert_empty tab.used_options
|
||||||
assert_nil tab.changed_files
|
assert_nil tab.changed_files
|
||||||
@ -69,6 +74,49 @@ class TabTests < Homebrew::TestCase
|
|||||||
assert_predicate tab, :universal?
|
assert_predicate tab, :universal?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_parsed_homebrew_version
|
||||||
|
tab = Tab.new
|
||||||
|
assert_same Version::NULL, tab.parsed_homebrew_version
|
||||||
|
|
||||||
|
tab = Tab.new(homebrew_version: "1.2.3")
|
||||||
|
assert_equal "1.2.3", tab.parsed_homebrew_version
|
||||||
|
assert tab.parsed_homebrew_version < "1.2.3-1-g12789abdf"
|
||||||
|
assert_kind_of Version, tab.parsed_homebrew_version
|
||||||
|
|
||||||
|
tab.homebrew_version = "1.2.4-567-g12789abdf"
|
||||||
|
assert tab.parsed_homebrew_version > "1.2.4"
|
||||||
|
assert tab.parsed_homebrew_version > "1.2.4-566-g21789abdf"
|
||||||
|
assert tab.parsed_homebrew_version < "1.2.4-568-g01789abdf"
|
||||||
|
|
||||||
|
tab = Tab.new(homebrew_version: "2.0.0-134-gabcdefabc-dirty")
|
||||||
|
assert tab.parsed_homebrew_version > "2.0.0"
|
||||||
|
assert tab.parsed_homebrew_version > "2.0.0-133-g21789abdf"
|
||||||
|
assert tab.parsed_homebrew_version < "2.0.0-135-g01789abdf"
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_runtime_dependencies
|
||||||
|
tab = Tab.new
|
||||||
|
assert_nil tab.runtime_dependencies
|
||||||
|
|
||||||
|
tab.homebrew_version = "1.1.6"
|
||||||
|
assert_nil tab.runtime_dependencies
|
||||||
|
|
||||||
|
tab.runtime_dependencies = []
|
||||||
|
refute_nil tab.runtime_dependencies
|
||||||
|
|
||||||
|
tab.homebrew_version = "1.1.5"
|
||||||
|
assert_nil tab.runtime_dependencies
|
||||||
|
|
||||||
|
tab.homebrew_version = "1.1.7"
|
||||||
|
refute_nil tab.runtime_dependencies
|
||||||
|
|
||||||
|
tab.homebrew_version = "1.1.10"
|
||||||
|
refute_nil tab.runtime_dependencies
|
||||||
|
|
||||||
|
tab.runtime_dependencies = [{ "full_name" => "foo", "version" => "1.0" }]
|
||||||
|
refute_nil tab.runtime_dependencies
|
||||||
|
end
|
||||||
|
|
||||||
def test_cxxstdlib
|
def test_cxxstdlib
|
||||||
assert_equal :clang, @tab.cxxstdlib.compiler
|
assert_equal :clang, @tab.cxxstdlib.compiler
|
||||||
assert_equal :libcxx, @tab.cxxstdlib.type
|
assert_equal :libcxx, @tab.cxxstdlib.type
|
||||||
@ -151,6 +199,10 @@ class TabTests < Homebrew::TestCase
|
|||||||
stdlib = :libcxx
|
stdlib = :libcxx
|
||||||
tab = Tab.create(f, compiler, stdlib)
|
tab = Tab.create(f, compiler, stdlib)
|
||||||
|
|
||||||
|
# FIXME: remove this line after Homebrew 1.1.6 is released.
|
||||||
|
# See https://github.com/Homebrew/brew/pull/1750#discussion_r94254622
|
||||||
|
tab.homebrew_version = "1.1.6"
|
||||||
|
|
||||||
runtime_dependencies = [
|
runtime_dependencies = [
|
||||||
{ "full_name" => "bar", "version" => "2.0" },
|
{ "full_name" => "bar", "version" => "2.0" },
|
||||||
{ "full_name" => "user/repo/from_tap", "version" => "1.0" },
|
{ "full_name" => "user/repo/from_tap", "version" => "1.0" },
|
||||||
|
|||||||
@ -12,6 +12,7 @@ class UninstallTests < Homebrew::TestCase
|
|||||||
[@dependency, @dependent].each { |f| f.installed_prefix.mkpath }
|
[@dependency, @dependent].each { |f| f.installed_prefix.mkpath }
|
||||||
|
|
||||||
tab = Tab.empty
|
tab = Tab.empty
|
||||||
|
tab.homebrew_version = "1.1.6"
|
||||||
tab.tabfile = @dependent.installed_prefix/Tab::FILENAME
|
tab.tabfile = @dependent.installed_prefix/Tab::FILENAME
|
||||||
tab.runtime_dependencies = [
|
tab.runtime_dependencies = [
|
||||||
{ "full_name" => "dependency", "version" => "1" },
|
{ "full_name" => "dependency", "version" => "1" },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user