lib/vagrant-mutate/box_loader.rb in vagrant-mutate-0.1.5 vs lib/vagrant-mutate/box_loader.rb in vagrant-mutate-0.2.0
- old
+ new
@@ -46,17 +46,17 @@
if box_arg =~ /:\/\//
box = load_from_url(box_arg)
elsif box_arg =~ /\.box$/
box = load_from_file(box_arg)
else
- box = load_by_name(box_arg)
+ box = load_from_boxes_path(box_arg)
end
if box.supported_input
return box
else
- raise Errors::ProviderNotSupported, :provider => provider_name, :direction => 'input'
+ raise Errors::ProviderNotSupported, :provider => box.provider_name, :direction => 'input'
end
end
def load_from_url(url)
@logger.info "Loading box from url #{url}"
@@ -103,15 +103,19 @@
provider_name = determine_provider(dir)
box = create_box(provider_name, name, dir)
end
- def load_by_name(name)
- @logger.info "Loading box from name #{name}"
- dir = find_input_dir(name)
- # cheat for now since only supported input is virtualbox
- box = create_box('virtualbox', name, dir)
+ def load_from_boxes_path(identifier)
+ @logger.info "Loading box #{identifier} from vagrants box path"
+ provider_name, name = parse_identifier(identifier)
+ if provider_name
+ dir = verify_input_dir(provider_name, name)
+ else
+ provider_name, dir = find_input_dir(name)
+ end
+ box = create_box(provider_name, name, dir)
end
def cleanup
unless @tmp_files.empty?
@env.ui.info "Cleaning up temporary files."
@@ -138,17 +142,49 @@
@logger.info "No metadata found, so assuming input provider is virtualbox"
return 'virtualbox'
end
end
+ def parse_identifier(identifier)
+ if identifier =~ /^([\w-]+)#{File::SEPARATOR}([\w-]+)$/
+ @logger.info "Parsed provider name as #{$1} and box name as #{$2}"
+ return $1, $2
+ else
+ @logger.info "Parsed provider name as not given and box name as #{identifier}"
+ return nil, identifier
+ end
+ end
+
def find_input_dir(name)
- # cheat for now since only supported input is virtualbox
- in_dir = File.join( @env.boxes_path, name, 'virtualbox' )
- if File.directory?(in_dir)
- @logger.info "Found input directory #{in_dir}"
- return in_dir
+ box_parent_dir = File.join( @env.boxes_path, name)
+
+ if Dir.exist?(box_parent_dir)
+ providers = Dir.entries(box_parent_dir).reject { |entry| entry =~ /^\./ }
+ @logger.info "Found potential providers #{providers}"
else
- raise Errors::BoxNotFound, :box => in_dir
+ providers = []
+ end
+
+ case
+ when providers.length < 1
+ raise Errors::BoxNotFound, :box => name
+ when providers.length > 1
+ raise Errors::TooManyBoxesFound, :box => name
+ else
+ provider_name = providers.first
+ input_dir = File.join( box_parent_dir, provider_name)
+ @logger.info "Found source for box #{name} from provider #{provider_name} at #{input_dir}"
+ return provider_name, input_dir
+ end
+ end
+
+ def verify_input_dir(provider_name, name)
+ input_dir = File.join( @env.boxes_path, name, provider_name)
+ if File.directory?(input_dir)
+ @logger.info "Found input directory #{input_dir}"
+ return input_dir
+ else
+ raise Errors::BoxNotFound, :box => input_dir
end
end
def create_output_dir(name, provider_name)
# e.g. $HOME/.vagrant.d/boxes/fedora-19/libvirt