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