diff --git a/lib/vagrant/action/builtin/box_add.rb b/lib/vagrant/action/builtin/box_add.rb index 3451bffa8..534f6f568 100644 --- a/lib/vagrant/action/builtin/box_add.rb +++ b/lib/vagrant/action/builtin/box_add.rb @@ -23,6 +23,15 @@ module Vagrant @download_interrupted = false url = env[:box_url] + + # If we received a shorthand URL ("mitchellh/precise64"), + # then expand it properly. + uri = URI.parse(url) + if !uri.scheme && !File.file?(url) + url = "#{Vagrant.server_url}/#{url}" + env[:box_url] = url + end + if metadata_url?(url, env) add_from_metadata(env) else diff --git a/test/unit/vagrant/action/builtin/box_add_test.rb b/test/unit/vagrant/action/builtin/box_add_test.rb index 0940bd0b7..def9a1d4e 100644 --- a/test/unit/vagrant/action/builtin/box_add_test.rb +++ b/test/unit/vagrant/action/builtin/box_add_test.rb @@ -171,7 +171,6 @@ describe Vagrant::Action::Builtin::BoxAdd do f.close end - md_path = Pathname.new(tf.path) with_web_server(md_path) do |port| env[:box_url] = "http://127.0.0.1:#{port}/#{md_path.basename}" @@ -189,6 +188,52 @@ describe Vagrant::Action::Builtin::BoxAdd do end end + it "adds from shorthand path" do + box_path = iso_env.box2_file(:virtualbox) + td = Pathname.new(Dir.mktmpdir) + tf = td.join("mitchellh", "precise64.json") + tf.dirname.mkpath + tf.open("w") do |f| + f.write(<<-RAW) + { + "name": "mitchellh/precise64", + "versions": [ + { + "version": "0.5" + }, + { + "version": "0.7", + "providers": [ + { + "name": "virtualbox", + "url": "#{box_path}" + } + ] + } + ] + } + RAW + end + + with_web_server(tf.dirname) do |port| + env[:box_url] = "mitchellh/precise64.json" + + box_collection.should_receive(:add).with do |path, name, version| + expect(name).to eq("mitchellh/precise64") + expect(version).to eq("0.7") + expect(checksum(path)).to eq(checksum(box_path)) + true + end.and_return(box) + + app.should_receive(:call).with(env) + + url = "http://127.0.0.1:#{port}" + with_temp_env("VAGRANT_SERVER_URL" => url) do + subject.call(env) + end + end + end + it "adds the latest version of a box with only one provider" do box_path = iso_env.box2_file(:virtualbox) tf = Tempfile.new("vagrant").tap do |f|