vaguerent/lib/vagrant/action/box/unpackage.rb
2011-12-10 21:49:00 -08:00

62 lines
1.5 KiB
Ruby

require 'fileutils'
require 'archive/tar/minitar'
module Vagrant
module Action
module Box
# Unpackages a downloaded box to a given directory with a given
# name.
#
# # Required Variables
#
# * `download.temp_path` - A location for the downloaded box. This is
# set by the {Download} action.
# * `box` - A {Vagrant::Box} object.
#
class Unpackage
attr_reader :box_directory
def initialize(app, env)
@app = app
@env = env
end
def call(env)
@env = env
setup_box_directory
decompress
@app.call(@env)
end
def recover(env)
if box_directory && File.directory?(box_directory)
FileUtils.rm_rf(box_directory)
end
end
def setup_box_directory
if File.directory?(@env["box_directory"])
raise Errors::BoxAlreadyExists, :name => @env["box_name"]
end
FileUtils.mkdir_p(@env["box_directory"])
@box_directory = @env["box_directory"]
end
def decompress
Dir.chdir(@env["box_directory"]) do
@env[:ui].info I18n.t("vagrant.actions.box.unpackage.extracting")
begin
Archive::Tar::Minitar.unpack(@env["download.temp_path"], @env["box_directory"].to_s)
rescue SystemCallError
raise Errors::BoxUnpackageFailure
end
end
end
end
end
end
end