2011-12-09 17:23:27 -08:00

85 lines
2.2 KiB
Ruby

module Vagrant
module Action
module Box
class Download
BASENAME = "box"
include Util
attr_reader :temp_path
def initialize(app, env)
@app = app
@env = env
@env["download.classes"] ||= []
@env["download.classes"] += [Downloaders::HTTP, Downloaders::File]
@downloader = nil
end
def call(env)
@env = env
download if instantiate_downloader
@app.call(@env)
recover(env) # called in both cases to cleanup workspace
end
def instantiate_downloader
# Assign to a temporary variable since this is easier to type out,
# since it is used so many times.
classes = @env["download.classes"]
# Find the class to use.
classes.each_index do |i|
klass = classes[i]
# Use the class if it matches the given URI or if this
# is the last class...
if classes.length == (i + 1) || klass.match?(@env["box_url"])
@env[:ui].info I18n.t("vagrant.actions.box.download.with", :class => klass.to_s)
@downloader = klass.new(@env[:ui])
break
end
end
# This line should never be reached, but we'll keep this here
# just in case for now.
raise Errors::BoxDownloadUnknownType if !@downloader
@downloader.prepare(@env["box_url"])
true
end
def download
with_tempfile do |tempfile|
download_to(tempfile)
@temp_path = @env["download.temp_path"] = tempfile.path
end
end
def recover(env)
if temp_path && File.exist?(temp_path)
env[:ui].info I18n.t("vagrant.actions.box.download.cleaning")
File.unlink(temp_path)
end
end
def with_tempfile
File.open(box_temp_path, Platform.tar_file_options) do |tempfile|
yield tempfile
end
end
def box_temp_path
@env[:tmp_path].join(BASENAME + Time.now.to_i.to_s)
end
def download_to(f)
@downloader.download!(@env["box_url"], f)
end
end
end
end
end