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, #define_resource_requirements, #expand_options, #get_preseed_file, #initialize, #preseed_package, #preseed_resource, #reconfig_package, #removing_package?, #target_version_already_installed?, #whyrun_supported?

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, #cleanup_after_converge, #converge_by, #define_resource_requirements, #events, #initialize, #node, node_map, #process_resource_requirements, provides, provides?, #requirements, #resource_collection, #resource_updated?, #run_action, #set_updated_status, supports?, #whyrun_mode?, #whyrun_supported?

Methods included from Mixin::DescendantsTracker

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

Constructor Details

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

Instance Method Details

#brew(*args) ⇒ Object



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

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



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

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



109
110
111
# File 'lib/chef/provider/package/homebrew.rb', line 109

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.



96
97
98
# File 'lib/chef/provider/package/homebrew.rb', line 96

def current_installed_version
  brew_info['keg_only'] ? brew_info['installed'].last['version'] : brew_info['linked_keg']
end

#install_package(name, version) ⇒ Object



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

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

#load_current_resourceObject



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

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”



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

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

#remove_package(name, version) ⇒ Object



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

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

#upgrade_package(name, version) ⇒ Object



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

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

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