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"]
 | 
			
		||||
    Keg.all.select do |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|
 | 
			
		||||
        # Resolve formula rather than directly comparing names
 | 
			
		||||
        # in case of conflicts between formulae from different taps.
 | 
			
		||||
 | 
			
		||||
@ -242,6 +242,17 @@ class Tab < OpenStruct
 | 
			
		||||
    super || DevelopmentTools.default_compiler
 | 
			
		||||
  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
 | 
			
		||||
    # Older tabs won't have these values, so provide sensible defaults
 | 
			
		||||
    lib = stdlib.to_sym if stdlib
 | 
			
		||||
 | 
			
		||||
@ -348,13 +348,22 @@ class InstalledDependantsTests < LinkTestCase
 | 
			
		||||
    tab.write
 | 
			
		||||
  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|
 | 
			
		||||
      tab.homebrew_version = homebrew_version
 | 
			
		||||
      tab.tabfile = @dependent.join("INSTALL_RECEIPT.json")
 | 
			
		||||
      tab.runtime_dependencies = deps
 | 
			
		||||
    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.
 | 
			
		||||
  # This can happen if e.g. a formula is installed
 | 
			
		||||
  # from a file path or URL.
 | 
			
		||||
@ -426,4 +435,11 @@ class InstalledDependantsTests < LinkTestCase
 | 
			
		||||
    assert_equal [@dependent], @keg.installed_dependents
 | 
			
		||||
    assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg])
 | 
			
		||||
  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
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
  "homebrew_version": "1.1.6",
 | 
			
		||||
  "used_options": [
 | 
			
		||||
    "--with-foo",
 | 
			
		||||
    "--without-bar"
 | 
			
		||||
 | 
			
		||||
@ -32,6 +32,11 @@ class TabTests < Homebrew::TestCase
 | 
			
		||||
 | 
			
		||||
  def test_defaults
 | 
			
		||||
    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.used_options
 | 
			
		||||
    assert_nil tab.changed_files
 | 
			
		||||
@ -69,6 +74,49 @@ class TabTests < Homebrew::TestCase
 | 
			
		||||
    assert_predicate tab, :universal?
 | 
			
		||||
  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
 | 
			
		||||
    assert_equal :clang, @tab.cxxstdlib.compiler
 | 
			
		||||
    assert_equal :libcxx, @tab.cxxstdlib.type
 | 
			
		||||
@ -151,6 +199,10 @@ class TabTests < Homebrew::TestCase
 | 
			
		||||
    stdlib = :libcxx
 | 
			
		||||
    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 = [
 | 
			
		||||
      { "full_name" => "bar", "version" => "2.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 }
 | 
			
		||||
 | 
			
		||||
    tab = Tab.empty
 | 
			
		||||
    tab.homebrew_version = "1.1.6"
 | 
			
		||||
    tab.tabfile = @dependent.installed_prefix/Tab::FILENAME
 | 
			
		||||
    tab.runtime_dependencies = [
 | 
			
		||||
      { "full_name" => "dependency", "version" => "1" },
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user