sync 2.55 KB
#!/usr/bin/ruby
# Sync binary snapshots to S3.

require "pathname"
require "tempfile"

# Put us where we belong, in the root dir of our boxen repo.

Dir.chdir Pathname.new(__FILE__).realpath + "../.."

# Make sure our local dependencies are up to date.

abort "Sorry, can't bootstrap." unless system "script/bootstrap"

# Set up our local configuration, deps, and load path.

load "config/basic.rb"

require "aws-sdk"
require "boxen/config"

access_key  = ENV["BOXEN_S3_ACCESS_KEY"]
secret_key  = ENV["BOXEN_S3_SECRET_KEY"]
bucket_name = ENV["BOXEN_S3_BUCKET"]

unless access_key && secret_key && bucket_name
  abort "Please set the BOXEN_S3_{ACCESS_KEY,SECRET_KEY,BUCKET} env vars."
end

s3 = AWS::S3.new :access_key_id => access_key, :secret_access_key => secret_key
os = `sw_vers -productVersion`.strip.split(".")[0..1].join "."

bucket = s3.buckets[bucket_name]
config = Boxen::Config.load

# Sync Homebrew packages.

Dir.chdir "/usr/local/Cellar" do
  Dir["*/*"].each do |dir|
    name, version = File.split dir

    file = "homebrew/#{os}/#{name}-#{version}.tar.bz2"
    temp = Tempfile.new "homebrew"
    obj  = bucket.objects[file]

    next if obj.exists?

    printf "Snapshotting #{name} #{version}... "
    $stdout.flush

    system "tar", "-cjf", temp.path, dir
    puts "done."

    printf "Shipping #{name} #{version} to S3... "
    $stdout.flush

    obj.write :acl => :public_read, :file => temp.path
    puts "done."
  end
end

# Sync rbenv rubies.

Dir.chdir "#{config.homedir}/rbenv/versions" do
  Dir["*"].each do |dir|
    next if File.symlink? dir

    version = File.basename dir
    file    = "rbenv/#{os}/#{version}.tar.bz2"
    temp    = Tempfile.new "rbenv"
    obj     = bucket.objects[file]

    next if obj.exists?

    printf "Snapshotting ruby #{version}... "
    $stdout.flush

    system "tar -cjf #{temp.path} #{version}"
    puts "done."

    printf "Shipping ruby #{version} to S3... "
    $stdout.flush

    obj.write :acl => :public_read, :file => temp.path
    puts "done."
  end
end

# Sync NVM nodes.

Dir.chdir "#{config.homedir}/nodenv/versions" do
  Dir["*"].each do |dir|
    next if File.symlink? dir

    version = File.basename dir
    file    = "nodenv/#{os}/#{version}.tar.bz2"
    temp    = Tempfile.new "nodenv"
    obj     = bucket.objects[file]

    next if obj.exists?

    printf "Snapshotting node.js #{version}... "
    $stdout.flush

    system "tar -cjf #{temp.path} #{version}"
    puts "done."

    printf "Shipping node.js #{version} to S3... "
    $stdout.flush

    obj.write :acl => :public_read, :file => temp.path
    puts "done."
  end
end