diff --git a/lib/vagrant/box_collection.rb b/lib/vagrant/box_collection.rb index 46e90fac5..3d29a67f8 100644 --- a/lib/vagrant/box_collection.rb +++ b/lib/vagrant/box_collection.rb @@ -220,39 +220,43 @@ module Vagrant # Find a box in the collection with the given name and provider. # # @param [String] name Name of the box (logical name). - # @Param [String] provider Provider that the box implements. + # @param [String] provider Provider that the box implements. # @return [Box] The box found, or `nil` if not found. - def find(name, provider) - with_collection_lock do - # First look directly for the box we're asking for. - box_directory = @directory.join(name, provider.to_s, "metadata.json") - @logger.info("Searching for box: #{name} (#{provider}) in #{box_directory}") - if box_directory.file? - @logger.info("Box found: #{name} (#{provider})") - return Box.new(name, provider, box_directory.dirname) - end + def find(name, providers) + providers = [providers].flatten - # If we're looking for a VirtualBox box, then we check if there is - # a V1 box. - if provider.to_sym == :virtualbox - # Check if a V1 version of this box exists, and if so, raise an - # exception notifying the caller that the box exists but needs - # to be upgraded. We don't do the upgrade here because it can be - # a fairly intensive activity and don't want to immediately degrade - # user performance on a find. - # - # To determine if it is a V1 box we just do a simple heuristic - # based approach. - @logger.info("Searching for V1 box: #{name}") - if v1_box?(@directory.join(name)) - @logger.warn("V1 box found: #{name}") - raise Errors::BoxUpgradeRequired, :name => name + with_collection_lock do + providers.each do |provider| + # First look directly for the box we're asking for. + box_directory = @directory.join(name, provider.to_s, "metadata.json") + @logger.info("Searching for box: #{name} (#{provider}) in #{box_directory}") + if box_directory.file? + @logger.info("Box found: #{name} (#{provider})") + return Box.new(name, provider, box_directory.dirname) + end + + # If we're looking for a VirtualBox box, then we check if there is + # a V1 box. + if provider.to_sym == :virtualbox + # Check if a V1 version of this box exists, and if so, raise an + # exception notifying the caller that the box exists but needs + # to be upgraded. We don't do the upgrade here because it can be + # a fairly intensive activity and don't want to immediately degrade + # user performance on a find. + # + # To determine if it is a V1 box we just do a simple heuristic + # based approach. + @logger.info("Searching for V1 box: #{name}") + if v1_box?(@directory.join(name)) + @logger.warn("V1 box found: #{name}") + raise Errors::BoxUpgradeRequired, :name => name + end end end end # Didn't find it, return nil - @logger.info("Box not found: #{name} (#{provider})") + @logger.info("Box not found: #{name} (#{providers.join(", ")})") nil end diff --git a/lib/vagrant/environment.rb b/lib/vagrant/environment.rb index 56b808dd6..327e68c27 100644 --- a/lib/vagrant/environment.rb +++ b/lib/vagrant/environment.rb @@ -339,7 +339,17 @@ module Vagrant box_changed = false load_box_and_overrides = lambda do - box = find_box(config.vm.box, box_formats) if config.vm.box + box = nil + if config.vm.box + begin + box = boxes.find(config.vm.box, box_formats) + rescue Errors::BoxUpgradeRequired + # Upgrade the box if we must + @logger.info("Upgrading box during config load: #{config.vm.box}") + boxes.upgrade(config.vm.box) + retry + end + end # If a box was found, then we attempt to load the Vagrantfile for # that box. We don't require a box since we allow providers to download @@ -694,39 +704,6 @@ module Vagrant Pathname.new(path) end - # This finds a box for the given name and formats, or returns nil - # if the box isn't found. - # - # @param [String] name Name of the box - # @param [Array] formats The formats to search for the box. - # @return [Box] - def find_box(name, formats) - # Determine the box formats we support - formats = [formats] if !formats.is_a?(Array) - - @logger.info("Provider-supported box formats: #{formats.inspect}") - formats.each do |format| - box = nil - - begin - box = boxes.find(name, format.to_s) - rescue Errors::BoxUpgradeRequired - # Upgrade the box if we must - @logger.info("Upgrading box during config load: #{name}") - boxes.upgrade(name) - retry - end - - # If a box was found, we exit - if box - @logger.info("Box found with format: #{format}") - return box - end - end - - nil - end - # Finds the Vagrantfile in the given directory. # # @param [Pathname] path Path to search in.