lib/exogenesis/passengers/rvm.rb
require 'exogenesis/support/passenger'
# Manages the Ruby Version Manager RVM
class Rvm < Passenger
register_as :rvm
needs :rubies
with_emoji :cyclone
def up
if command_exists? 'rvm'
skip_task 'Setup'
else
execute_interactive 'Setup', '\\curl -L https://get.rvm.io | bash -s'
end
execute 'Update', 'rvm get head'
rubies.each { |ruby| install_or_update_ruby ruby }
execute 'Reload', 'rvm reload'
end
def down
execute_interactive 'Teardown', 'rvm implode'
end
private
def install_or_update_ruby(ruby)
if installed_versions[ruby].nil?
install_ruby ruby
else
update_ruby installed_versions[ruby], ruby
end
end
def install_ruby(ruby)
execute "Installing #{ruby}", "rvm install #{ruby} --with-gcc=gcc-4.2"
end
def update_ruby(old_ruby, new_ruby)
execute "Upgrading #{new_ruby}", "rvm upgrade #{old_ruby} #{new_ruby} --force --with-gcc=gcc-4.2" do |_output, error_output|
raise TaskSkipped, 'Already Up to Date' if error_output.include? 'are the same'
end
end
def installed_versions
return @installed_versions if @installed_versions
@installed_versions = {}
execute 'Getting Installed Versions', 'rvm list' do |output|
output.scan(/((\w+-[\w\.]+)(-(p\d+))?)/).each do |ruby|
@installed_versions[ruby[1]] = ruby[0]
end
end
@installed_versions
end
end