62 lines
1.5 KiB
Ruby
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
|