Skip to content

Commit

Permalink
Various fixes to the homebrew cookbook
Browse files Browse the repository at this point in the history
* Fixing install script path
* Modified Chef::Provider::Package::Homebrew to account for aliases
* Fixed an issue with Homebrew aliases to formulas
* Resolves a strange issue on OSX 10.9 and Chef's Omnibus installer's embedded
  Ruby (1.9.3) where it's unable to resolve symlinks with either Pathname or File
* Added debug message whenever homebrew_package resolves an alias to a formula
* Modified install_package to use version
* Removed debug line in homebrew_package
* homebrew_package fixed with version argument checks
  • Loading branch information
greglu committed Jan 23, 2015
1 parent 1c9015d commit 233ac83
Showing 1 changed file with 38 additions and 13 deletions.
51 changes: 38 additions & 13 deletions libraries/homebrew_package.rb
Expand Up @@ -32,9 +32,8 @@
class Chef
class Provider
class Package
# Package
class Homebrew < Package
# Homebrew packagex

include Chef::Mixin::ShellOut
include ::Homebrew::Mixin

Expand All @@ -47,15 +46,15 @@ def load_current_resource
end

def install_package(name, version)
brew('install', @new_resource.options, name)
brew('install', @new_resource.options, name, version_arg(version))
end

def upgrade_package(name, version)
brew('upgrade', name)
brew('upgrade', name, version_arg(version))
end

def remove_package(name, version)
brew('uninstall', @new_resource.options, name)
brew('uninstall', @new_resource.options, name, version_arg(version))
end

# Homebrew doesn't really have a notion of purging, so just remove.
Expand All @@ -66,13 +65,17 @@ def purge_package(name, version)

protected

def version_arg(version)
version.to_s.start_with?('-') ? version : '-v=#{version}'
end

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

def current_installed_version
pkg = get_version_from_formula
versions = pkg.to_hash['installed'].map { |v| v['version'] }
versions = pkg.to_hash['installed'].map {|v| v['version']}
versions.join(' ') unless versions.empty?
end

Expand All @@ -86,23 +89,45 @@ def get_version_from_command(command)
version.empty? ? nil : version
end

def brew_library_path
::File.join(shell_out!('brew --prefix', :user => homebrew_owner).stdout.chomp, 'Library')
end

def get_version_from_formula
brew_cmd = shell_out!('brew --prefix', :user => homebrew_owner)
libpath = ::File.join(brew_cmd.stdout.chomp, 'Library', 'Homebrew')
$LOAD_PATH.unshift(libpath)
libpath = ::File.join(brew_library_path, 'Homebrew')
$:.unshift(libpath)

require 'global'
require 'cmd/info'

Formula[new_resource.package_name]
Formula.factory resolved_package_name
end

def resolved_package_name
package_name = new_resource.package_name

# Resolves a strange issue on OSX 10.9 and Chef's Omnibus installer's embedded
# Ruby (1.9.3) where it's unable to resolve symlinks with either Pathname or File
if Formula.aliases.include? package_name
alias_path = ::File.join(brew_library_path, 'Aliases', package_name)
formula_path = ::File.expand_path(::File.readlink(alias_path), ::File.dirname(alias_path))
formula_name = ::File.basename(formula_path, '.rb')

Chef::Log.debug 'Resolved alias \'#{package_name}\' to formula \'#{formula_name}\''
return formula_name
end

# When it's resolved the Formula#canonical_name method
# should be able to resolve aliases as well
Formula.canonical_name package_name
end

def get_response_from_command(command)
require 'etc'
home_dir = Etc.getpwnam(homebrew_owner).dir

Chef::Log.debug "Executing '#{command}' as #{homebrew_owner}"
output = shell_out!(command, :user => homebrew_owner, :environment => { 'HOME' => home_dir, 'RUBYOPT' => nil })
Chef::Log.debug 'Executing \'#{command}\' as #{homebrew_owner}'
output = shell_out!(command, :user => homebrew_owner, :environment => {'HOME' => home_dir})
output.stdout
end
end
Expand Down

0 comments on commit 233ac83

Please sign in to comment.