Class: Chef::Provider::Package::Homebrew

Inherits:
Chef::Provider::Package show all
Includes:
Mixin::HomebrewUser
Defined in:
lib/chef/provider/package/homebrew.rb

Constant Summary

Constants included from Mixin::ShellOut

Mixin::ShellOut::DEPRECATED_OPTIONS

Instance Attribute Summary

Attributes inherited from Chef::Provider

#action, #cookbook_name, #current_resource, #new_resource, #recipe_name, #run_context

Instance Method Summary collapse

Methods included from Mixin::HomebrewUser

#find_homebrew_uid

Methods included from Mixin::ShellOut

#run_command_compatible_options, #shell_out, #shell_out!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!

Methods inherited from Chef::Provider::Package

#action_install, #action_purge, #action_reconfig, #action_remove, #action_upgrade, #as_array, #check_resource_semantics!, #define_resource_requirements, #expand_options, #get_preseed_file, #have_any_matching_version?, #initialize, #multipackage_api_adapter, #preseed_package, #preseed_resource, #reconfig_package, #removing_package?, #target_version_already_installed?, #version_requirement_satisfied?, #whyrun_supported?

Methods included from Mixin::SubclassDirective

#subclass_directive

Methods included from Mixin::Command

#chdir_or_tmpdir, #handle_command_failures, #output_of_command, #run_command, #run_command_and_return_stdout_stderr, #run_command_with_systems_locale

Methods included from Mixin::Command::Windows

#popen4

Methods included from Mixin::Command::Unix

#popen4

Methods inherited from Chef::Provider

#action_nothing, #check_resource_semantics!, #cleanup_after_converge, #converge_by, #converge_if_changed, #define_resource_requirements, #events, include_resource_dsl, include_resource_dsl_module, #initialize, #node, #process_resource_requirements, provides, provides?, #requirements, #resource_collection, #resource_updated?, #run_action, #set_updated_status, supports?, use_inline_resources, #whyrun_mode?, #whyrun_supported?

Methods included from Mixin::Provides

#provided_as, #provides, #provides?

Methods included from Mixin::DescendantsTracker

#descendants, descendants, direct_descendants, #direct_descendants, find_descendants_by_name, #find_descendants_by_name, #inherited, store_inherited

Methods included from DeprecatedLWRPClass

#const_missing, #deprecated_constants, #register_deprecated_lwrp_class

Methods included from Mixin::LazyModuleInclude

#descendants, #include, #included

Methods included from Mixin::NotifyingBlock

#notifying_block, #subcontext_block

Methods included from DSL::DeclareResource

#build_resource, #declare_resource, #delete_resource, #delete_resource!, #edit_resource, #edit_resource!, #find_resource, #find_resource!, #with_run_context

Methods included from Mixin::PowershellOut

#powershell_out, #powershell_out!

Methods included from Mixin::WindowsArchitectureHelper

#assert_valid_windows_architecture!, #disable_wow64_file_redirection, #forced_32bit_override_required?, #is_i386_process_on_x86_64_windows?, #node_supports_windows_architecture?, #node_windows_architecture, #restore_wow64_file_redirection, #valid_windows_architecture?, #with_os_architecture, #wow64_architecture_override_required?, #wow64_directory

Methods included from DSL::PlatformIntrospection

#docker?, #platform?, #platform_family?, #value_for_platform, #value_for_platform_family

Constructor Details

This class inherits a constructor from Chef::Provider::Package

Instance Method Details

#brew(*args) ⇒ Object



75
76
77
# File 'lib/chef/provider/package/homebrew.rb', line 75

def brew(*args)
  get_response_from_command("brew #{args.join(' ')}")
end

#brew_infoObject

We implement a querying method that returns the JSON-as-Hash data for a formula per the Homebrew documentation. Previous implementations of this provider in the homebrew cookbook performed a bit of magic with the load path to get this information, but that is not any more robust than using the command-line interface that returns the same thing.

github.com/Homebrew/homebrew/wiki/Querying-Brew



87
88
89
# File 'lib/chef/provider/package/homebrew.rb', line 87

def brew_info
  @brew_info ||= Chef::JSONCompat.from_json(brew("info", "--json=v1", new_resource.package_name)).first
end

#candidate_versionObject

Packages (formula) available to install should have a “stable” version, per the Homebrew project’s acceptable formula documentation, so we will rely on that being the case. Older implementations of this provider in the homebrew cookbook would fall back to brew_info, but the schema has changed, and homebrew is a constantly rolling forward project.

github.com/Homebrew/homebrew/wiki/Acceptable-Formulae#stable-versions



118
119
120
# File 'lib/chef/provider/package/homebrew.rb', line 118

def candidate_version
  brew_info["versions"]["stable"]
end

#current_installed_versionObject

Some packages (formula) are “keg only” and aren’t linked, because multiple versions installed can cause conflicts. We handle this by using the last installed version as the “current” (as in latest). Otherwise, we will use the version that brew thinks is linked as the current version.



97
98
99
100
101
102
103
104
105
106
107
# File 'lib/chef/provider/package/homebrew.rb', line 97

def current_installed_version
  if brew_info["keg_only"]
    if brew_info["installed"].empty?
      nil
    else
      brew_info["installed"].last["version"]
    end
  else
    brew_info["linked_keg"]
  end
end

#install_package(name, version) ⇒ Object



47
48
49
50
51
# File 'lib/chef/provider/package/homebrew.rb', line 47

def install_package(name, version)
  unless current_resource.version == version
    brew("install", new_resource.options, name)
  end
end

#load_current_resourceObject



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/chef/provider/package/homebrew.rb', line 34

def load_current_resource
  self.current_resource = Chef::Resource::Package.new(new_resource.name)
  current_resource.package_name(new_resource.package_name)
  current_resource.version(current_installed_version)
  Chef::Log.debug("#{new_resource} current version is #{current_resource.version}") if current_resource.version

  @candidate_version = candidate_version

  Chef::Log.debug("#{new_resource} candidate version is #{@candidate_version}") if @candidate_version

  current_resource
end

#purge_package(name, version) ⇒ Object

Homebrew doesn’t really have a notion of purging, do a “force remove”



70
71
72
73
# File 'lib/chef/provider/package/homebrew.rb', line 70

def purge_package(name, version)
  new_resource.options((new_resource.options || "") << " --force").strip
  remove_package(name, version)
end

#remove_package(name, version) ⇒ Object



63
64
65
66
67
# File 'lib/chef/provider/package/homebrew.rb', line 63

def remove_package(name, version)
  if current_resource.version
    brew("uninstall", new_resource.options, name)
  end
end

#upgrade_package(name, version) ⇒ Object



53
54
55
56
57
58
59
60
61
# File 'lib/chef/provider/package/homebrew.rb', line 53

def upgrade_package(name, version)
  current_version = current_resource.version

  if current_version.nil? || current_version.empty?
    install_package(name, version)
  elsif current_version != version
    brew("upgrade", new_resource.options, name)
  end
end