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

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

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

#a_to_s, #clean_array, #shell_out, #shell_out!, #shell_out_compact, #shell_out_compact!, #shell_out_compact_timeout, #shell_out_compact_timeout!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!

Methods included from Mixin::PathSanity

#enforce_path_sanity, #sanitized_path

Methods inherited from Chef::Provider::Package

#action_lock, #action_unlock, #as_array, #check_resource_semantics!, #define_resource_requirements, #expand_options, #get_preseed_file, #have_any_matching_version?, #initialize, #lock_package, #multipackage_api_adapter, #options, #package_locked, #preseed_package, #preseed_resource, #reconfig_package, #removing_package?, #target_version_already_installed?, #unlock_package, #version_requirement_satisfied?

Methods included from Mixin::SubclassDirective

#subclass_directive

Methods inherited from Chef::Provider

action, #action_nothing, #check_resource_semantics!, #cleanup_after_converge, #compile_and_converge_action, #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 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


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

def brew(*args)
  get_response_from_command("brew", *args)
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.

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


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

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['version']+, but the schema has changed, and homebrew is a constantly rolling forward project.

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


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

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.


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

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", 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::HomebrewPackage.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
74
# File 'lib/chef/provider/package/homebrew.rb', line 70

def purge_package(name, version)
  if current_resource.version
    brew("uninstall", "--force", options, name)
  end
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", 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", options, name)
  end
end