Merge branch '2293-track-box-url' of https://github.com/fgrehm/vagrant into fgrehm-2293-track-box-url
Conflicts: plugins/commands/box/command/list.rb
This commit is contained in:
commit
3bedc77cc4
|
@ -8,7 +8,8 @@ module Vagrant
|
||||||
# Builtin contains middleware classes that are shipped with Vagrant-core
|
# Builtin contains middleware classes that are shipped with Vagrant-core
|
||||||
# and are thus available to all plugins as a "standard library" of sorts.
|
# and are thus available to all plugins as a "standard library" of sorts.
|
||||||
module Builtin
|
module Builtin
|
||||||
autoload :BoxAdd, "vagrant/action/builtin/box_add"
|
autoload :BoxAdd, "vagrant/action/builtin/box_add"
|
||||||
|
autoload :BoxRemove, "vagrant/action/builtin/box_remove"
|
||||||
autoload :Call, "vagrant/action/builtin/call"
|
autoload :Call, "vagrant/action/builtin/call"
|
||||||
autoload :Confirm, "vagrant/action/builtin/confirm"
|
autoload :Confirm, "vagrant/action/builtin/confirm"
|
||||||
autoload :ConfigValidate, "vagrant/action/builtin/config_validate"
|
autoload :ConfigValidate, "vagrant/action/builtin/config_validate"
|
||||||
|
@ -41,5 +42,14 @@ module Vagrant
|
||||||
b.use Builtin::BoxAdd
|
b.use Builtin::BoxAdd
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# This is the action that will remove a box given a name (and optionally
|
||||||
|
# a provider). This middleware sequence is built-in to Vagrant. Plugins
|
||||||
|
# can hook into this like any other middleware sequence.
|
||||||
|
def self.action_box_remove
|
||||||
|
Builder.new.tap do |b|
|
||||||
|
b.use Builtin::BoxRemove
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -81,9 +81,9 @@ module Vagrant
|
||||||
|
|
||||||
# Add the box
|
# Add the box
|
||||||
env[:ui].info I18n.t("vagrant.actions.box.add.adding", :name => env[:box_name])
|
env[:ui].info I18n.t("vagrant.actions.box.add.adding", :name => env[:box_name])
|
||||||
added_box = nil
|
box_added = nil
|
||||||
begin
|
begin
|
||||||
added_box = env[:box_collection].add(
|
box_added = env[:box_collection].add(
|
||||||
@temp_path, env[:box_name], box_formats, env[:box_force])
|
@temp_path, env[:box_name], box_formats, env[:box_force])
|
||||||
rescue Vagrant::Errors::BoxUpgradeRequired
|
rescue Vagrant::Errors::BoxUpgradeRequired
|
||||||
# Upgrade the box
|
# Upgrade the box
|
||||||
|
@ -99,7 +99,13 @@ module Vagrant
|
||||||
|
|
||||||
# Success, we added a box!
|
# Success, we added a box!
|
||||||
env[:ui].success(
|
env[:ui].success(
|
||||||
I18n.t("vagrant.actions.box.add.added", name: added_box.name, provider: added_box.provider))
|
I18n.t("vagrant.actions.box.add.added", name: box_added.name, provider: box_added.provider))
|
||||||
|
|
||||||
|
# Persists URL used on download and the time it was added
|
||||||
|
write_extra_info(box_added, url)
|
||||||
|
|
||||||
|
# Passes on the newly added box to the rest of the middleware chain
|
||||||
|
env[:box_added] = box_added
|
||||||
|
|
||||||
# Carry on!
|
# Carry on!
|
||||||
@app.call(env)
|
@app.call(env)
|
||||||
|
@ -110,6 +116,13 @@ module Vagrant
|
||||||
File.unlink(@temp_path)
|
File.unlink(@temp_path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def write_extra_info(box_added, url)
|
||||||
|
info = {'url' => url, 'downloaded_at' => Time.now.utc}
|
||||||
|
box_added.directory.join('info.json').open("w+") do |f|
|
||||||
|
f.write(JSON.dump(info))
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
require "log4r"
|
||||||
|
|
||||||
|
module Vagrant
|
||||||
|
module Action
|
||||||
|
module Builtin
|
||||||
|
# This middleware will remove a box for a given provider.
|
||||||
|
class BoxRemove
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
@logger = Log4r::Logger.new("vagrant::action::builtin::box_remove")
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
box_name = env[:box_name]
|
||||||
|
box_provider = env[:box_provider].to_sym
|
||||||
|
|
||||||
|
box = nil
|
||||||
|
begin
|
||||||
|
box = env[:box_collection].find(box_name, box_provider)
|
||||||
|
rescue Vagrant::Errors::BoxUpgradeRequired
|
||||||
|
@env.boxes.upgrade(box_name)
|
||||||
|
retry
|
||||||
|
end
|
||||||
|
|
||||||
|
raise Vagrant::Errors::BoxNotFound, :name => box_name, :provider => box_provider if !box
|
||||||
|
env[:ui].info(I18n.t("vagrant.commands.box.removing",
|
||||||
|
:name => box_name,
|
||||||
|
:provider => box_provider))
|
||||||
|
box.destroy!
|
||||||
|
|
||||||
|
# Passes on the removed box to the rest of the middleware chain
|
||||||
|
env[:box_removed] = box
|
||||||
|
@app.call(env)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -44,7 +44,7 @@ module VagrantPlugins
|
||||||
:box_url => argv[1],
|
:box_url => argv[1],
|
||||||
:box_clean => options[:clean],
|
:box_clean => options[:clean],
|
||||||
:box_force => options[:force],
|
:box_force => options[:force],
|
||||||
:box_download_insecure => options[:insecure],
|
:box_download_insecure => options[:insecure]
|
||||||
})
|
})
|
||||||
|
|
||||||
# Success, exit status 0
|
# Success, exit status 0
|
||||||
|
|
|
@ -9,6 +9,11 @@ module VagrantPlugins
|
||||||
|
|
||||||
opts = OptionParser.new do |opts|
|
opts = OptionParser.new do |opts|
|
||||||
opts.banner = "Usage: vagrant box list"
|
opts.banner = "Usage: vagrant box list"
|
||||||
|
opts.separator ""
|
||||||
|
|
||||||
|
opts.on("-i", "--box-info", "Displays additional information about the boxes.") do |i|
|
||||||
|
options[:info] = i
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Parse the options
|
# Parse the options
|
||||||
|
@ -20,10 +25,23 @@ module VagrantPlugins
|
||||||
return @env.ui.warn(I18n.t("vagrant.commands.box.no_installed_boxes"), :prefix => false)
|
return @env.ui.warn(I18n.t("vagrant.commands.box.no_installed_boxes"), :prefix => false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
list_boxes(boxes, options[:info])
|
||||||
|
|
||||||
|
# Success, exit status 0
|
||||||
|
0
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def list_boxes(boxes, extra_info)
|
||||||
# Find the longest box name
|
# Find the longest box name
|
||||||
longest_box = boxes.max_by { |x| x[0].length }
|
longest_box = boxes.max_by { |x| x[0].length }
|
||||||
longest_box_length = longest_box[0].length
|
longest_box_length = longest_box[0].length
|
||||||
|
|
||||||
|
# Find the longest provider name
|
||||||
|
longest_provider = boxes.max_by { |x| x[1].length }
|
||||||
|
longest_provider_length = longest_provider[1].length
|
||||||
|
|
||||||
# Go through each box and output the information about it. We
|
# Go through each box and output the information about it. We
|
||||||
# ignore the "v1" param for now since I'm not yet sure if its
|
# ignore the "v1" param for now since I'm not yet sure if its
|
||||||
# important for the user to know what boxes need to be upgraded
|
# important for the user to know what boxes need to be upgraded
|
||||||
|
@ -33,10 +51,29 @@ module VagrantPlugins
|
||||||
|
|
||||||
@env.ui.machine("box-name", name)
|
@env.ui.machine("box-name", name)
|
||||||
@env.ui.machine("box-provider", provider)
|
@env.ui.machine("box-provider", provider)
|
||||||
end
|
|
||||||
|
|
||||||
# Success, exit status 0
|
extra = ''
|
||||||
0
|
if extra_info
|
||||||
|
extra << format_extra_info(name.to_s, provider.to_s)
|
||||||
|
end
|
||||||
|
|
||||||
|
name = name.ljust(longest_box_length)
|
||||||
|
provider = "(#{provider})".ljust(longest_provider_length + 2) # 2 -> parenthesis
|
||||||
|
box_info = "#{name} #{provider}#{extra}"
|
||||||
|
|
||||||
|
@env.ui.info(box_info, :prefix => false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def format_extra_info(name, provider)
|
||||||
|
info_json = @env.boxes.find(name, provider).directory.join('info.json')
|
||||||
|
if info_json.file?
|
||||||
|
info = JSON.parse(info_json.read)
|
||||||
|
return "\n `- URL: #{info['url']}" +
|
||||||
|
"\n `- Date: #{info['downloaded_at']}"
|
||||||
|
else
|
||||||
|
return ''
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -34,19 +34,10 @@ module VagrantPlugins
|
||||||
argv[1] = providers[0] || ""
|
argv[1] = providers[0] || ""
|
||||||
end
|
end
|
||||||
|
|
||||||
b = nil
|
@env.action_runner.run(Vagrant::Action.action_box_remove, {
|
||||||
begin
|
:box_name => argv[0],
|
||||||
b = @env.boxes.find(argv[0], argv[1].to_sym)
|
:box_provider => argv[1]
|
||||||
rescue Vagrant::Errors::BoxUpgradeRequired
|
})
|
||||||
@env.boxes.upgrade(argv[0])
|
|
||||||
retry
|
|
||||||
end
|
|
||||||
|
|
||||||
raise Vagrant::Errors::BoxNotFound, :name => argv[0], :provider => argv[1].to_sym if !b
|
|
||||||
@env.ui.info(I18n.t("vagrant.commands.box.removing",
|
|
||||||
:name => argv[0],
|
|
||||||
:provider => argv[1]))
|
|
||||||
b.destroy!
|
|
||||||
|
|
||||||
# Success, exit status 0
|
# Success, exit status 0
|
||||||
0
|
0
|
||||||
|
|
Loading…
Reference in New Issue