tnargav 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +31 -0
- data/.gitsetup.yml +5 -0
- data/.travis.yml +7 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +1067 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +89 -0
- data/Rakefile +18 -0
- data/bin/vagrant +106 -0
- data/config/default.rb +36 -0
- data/contrib/README.md +12 -0
- data/contrib/bash/completion.sh +3 -0
- data/contrib/emacs/vagrant.el +8 -0
- data/contrib/vim/vagrantfile.vim +9 -0
- data/keys/README.md +17 -0
- data/keys/vagrant +27 -0
- data/keys/vagrant.pub +1 -0
- data/lib/vagrant/action/builder.rb +174 -0
- data/lib/vagrant/action/builtin/box_add.rb +81 -0
- data/lib/vagrant/action/builtin/call.rb +67 -0
- data/lib/vagrant/action/builtin/config_validate.rb +30 -0
- data/lib/vagrant/action/builtin/confirm.rb +38 -0
- data/lib/vagrant/action/builtin/destroy_confirm.rb +21 -0
- data/lib/vagrant/action/builtin/env_set.rb +24 -0
- data/lib/vagrant/action/builtin/graceful_halt.rb +73 -0
- data/lib/vagrant/action/builtin/handle_box_url.rb +77 -0
- data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +134 -0
- data/lib/vagrant/action/builtin/lock.rb +57 -0
- data/lib/vagrant/action/builtin/nfs.rb +118 -0
- data/lib/vagrant/action/builtin/provision.rb +70 -0
- data/lib/vagrant/action/builtin/set_hostname.rb +27 -0
- data/lib/vagrant/action/builtin/ssh_exec.rb +42 -0
- data/lib/vagrant/action/builtin/ssh_run.rb +43 -0
- data/lib/vagrant/action/general/package.rb +103 -0
- data/lib/vagrant/action/hook.rb +107 -0
- data/lib/vagrant/action/runner.rb +69 -0
- data/lib/vagrant/action/warden.rb +103 -0
- data/lib/vagrant/action.rb +43 -0
- data/lib/vagrant/batch_action.rb +113 -0
- data/lib/vagrant/box.rb +97 -0
- data/lib/vagrant/box_collection.rb +375 -0
- data/lib/vagrant/cli.rb +82 -0
- data/lib/vagrant/config/loader.rb +222 -0
- data/lib/vagrant/config/v1/dummy_config.rb +13 -0
- data/lib/vagrant/config/v1/loader.rb +105 -0
- data/lib/vagrant/config/v1/root.rb +60 -0
- data/lib/vagrant/config/v1.rb +9 -0
- data/lib/vagrant/config/v2/dummy_config.rb +13 -0
- data/lib/vagrant/config/v2/loader.rb +141 -0
- data/lib/vagrant/config/v2/root.rb +105 -0
- data/lib/vagrant/config/v2/util.rb +21 -0
- data/lib/vagrant/config/v2.rb +9 -0
- data/lib/vagrant/config/version_base.rb +80 -0
- data/lib/vagrant/config.rb +61 -0
- data/lib/vagrant/environment.rb +843 -0
- data/lib/vagrant/errors.rb +570 -0
- data/lib/vagrant/guest.rb +163 -0
- data/lib/vagrant/hosts.rb +28 -0
- data/lib/vagrant/machine.rb +325 -0
- data/lib/vagrant/machine_state.rb +45 -0
- data/lib/vagrant/plugin/v1/command.rb +169 -0
- data/lib/vagrant/plugin/v1/communicator.rb +98 -0
- data/lib/vagrant/plugin/v1/config.rb +112 -0
- data/lib/vagrant/plugin/v1/errors.rb +15 -0
- data/lib/vagrant/plugin/v1/guest.rb +92 -0
- data/lib/vagrant/plugin/v1/host.rb +66 -0
- data/lib/vagrant/plugin/v1/manager.rb +131 -0
- data/lib/vagrant/plugin/v1/plugin.rb +229 -0
- data/lib/vagrant/plugin/v1/provider.rb +68 -0
- data/lib/vagrant/plugin/v1/provisioner.rb +50 -0
- data/lib/vagrant/plugin/v1.rb +19 -0
- data/lib/vagrant/plugin/v2/command.rb +234 -0
- data/lib/vagrant/plugin/v2/communicator.rb +98 -0
- data/lib/vagrant/plugin/v2/components.rb +47 -0
- data/lib/vagrant/plugin/v2/config.rb +136 -0
- data/lib/vagrant/plugin/v2/errors.rb +15 -0
- data/lib/vagrant/plugin/v2/guest.rb +78 -0
- data/lib/vagrant/plugin/v2/host.rb +66 -0
- data/lib/vagrant/plugin/v2/manager.rb +173 -0
- data/lib/vagrant/plugin/v2/plugin.rb +226 -0
- data/lib/vagrant/plugin/v2/provider.rb +69 -0
- data/lib/vagrant/plugin/v2/provisioner.rb +47 -0
- data/lib/vagrant/plugin/v2.rb +22 -0
- data/lib/vagrant/plugin.rb +6 -0
- data/lib/vagrant/registry.rb +78 -0
- data/lib/vagrant/ui.rb +215 -0
- data/lib/vagrant/util/ansi_escape_code_remover.rb +34 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/counter.rb +24 -0
- data/lib/vagrant/util/downloader.rb +146 -0
- data/lib/vagrant/util/file_checksum.rb +38 -0
- data/lib/vagrant/util/file_mode.rb +12 -0
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/is_port_open.rb +38 -0
- data/lib/vagrant/util/line_ending_helpers.rb +14 -0
- data/lib/vagrant/util/network_ip.rb +28 -0
- data/lib/vagrant/util/platform.rb +58 -0
- data/lib/vagrant/util/retryable.rb +31 -0
- data/lib/vagrant/util/safe_chdir.rb +33 -0
- data/lib/vagrant/util/safe_exec.rb +36 -0
- data/lib/vagrant/util/safe_puts.rb +31 -0
- data/lib/vagrant/util/scoped_hash_override.rb +45 -0
- data/lib/vagrant/util/ssh.rb +150 -0
- data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
- data/lib/vagrant/util/string_block_editor.rb +77 -0
- data/lib/vagrant/util/subprocess.rb +273 -0
- data/lib/vagrant/util/template_renderer.rb +83 -0
- data/lib/vagrant/util/which.rb +43 -0
- data/lib/vagrant/util.rb +12 -0
- data/lib/vagrant/version.rb +6 -0
- data/lib/vagrant.rb +258 -0
- data/plugins/README.md +5 -0
- data/plugins/commands/box/command/add.rb +51 -0
- data/plugins/commands/box/command/list.rb +41 -0
- data/plugins/commands/box/command/remove.rb +37 -0
- data/plugins/commands/box/command/repackage.rb +43 -0
- data/plugins/commands/box/command/root.rb +75 -0
- data/plugins/commands/box/plugin.rb +15 -0
- data/plugins/commands/destroy/command.rb +31 -0
- data/plugins/commands/destroy/plugin.rb +18 -0
- data/plugins/commands/halt/command.rb +33 -0
- data/plugins/commands/halt/plugin.rb +18 -0
- data/plugins/commands/init/command.rb +40 -0
- data/plugins/commands/init/plugin.rb +18 -0
- data/plugins/commands/package/command.rb +83 -0
- data/plugins/commands/package/plugin.rb +18 -0
- data/plugins/commands/plugin/action/bundler_check.rb +25 -0
- data/plugins/commands/plugin/action/install_gem.rb +81 -0
- data/plugins/commands/plugin/action/license_plugin.rb +54 -0
- data/plugins/commands/plugin/action/list_plugins.rb +54 -0
- data/plugins/commands/plugin/action/prune_gems.rb +149 -0
- data/plugins/commands/plugin/action/uninstall_plugin.rb +23 -0
- data/plugins/commands/plugin/action.rb +52 -0
- data/plugins/commands/plugin/command/base.rb +22 -0
- data/plugins/commands/plugin/command/install.rb +58 -0
- data/plugins/commands/plugin/command/license.rb +31 -0
- data/plugins/commands/plugin/command/list.rb +28 -0
- data/plugins/commands/plugin/command/root.rb +75 -0
- data/plugins/commands/plugin/command/uninstall.rb +28 -0
- data/plugins/commands/plugin/gem_helper.rb +74 -0
- data/plugins/commands/plugin/plugin.rb +22 -0
- data/plugins/commands/plugin/state_file.rb +57 -0
- data/plugins/commands/provision/command.rb +34 -0
- data/plugins/commands/provision/plugin.rb +18 -0
- data/plugins/commands/reload/command.rb +37 -0
- data/plugins/commands/reload/plugin.rb +18 -0
- data/plugins/commands/resume/command.rb +25 -0
- data/plugins/commands/resume/plugin.rb +17 -0
- data/plugins/commands/ssh/command.rb +63 -0
- data/plugins/commands/ssh/plugin.rb +17 -0
- data/plugins/commands/ssh_config/command.rb +49 -0
- data/plugins/commands/ssh_config/plugin.rb +18 -0
- data/plugins/commands/status/command.rb +39 -0
- data/plugins/commands/status/plugin.rb +18 -0
- data/plugins/commands/suspend/command.rb +25 -0
- data/plugins/commands/suspend/plugin.rb +18 -0
- data/plugins/commands/up/command.rb +57 -0
- data/plugins/commands/up/plugin.rb +17 -0
- data/plugins/commands/up/start_mixins.rb +26 -0
- data/plugins/communicators/ssh/communicator.rb +342 -0
- data/plugins/communicators/ssh/plugin.rb +19 -0
- data/plugins/guests/arch/cap/change_host_name.rb +18 -0
- data/plugins/guests/arch/cap/configure_networks.rb +23 -0
- data/plugins/guests/arch/guest.rb +11 -0
- data/plugins/guests/arch/plugin.rb +25 -0
- data/plugins/guests/debian/cap/change_host_name.rb +18 -0
- data/plugins/guests/debian/cap/configure_networks.rb +61 -0
- data/plugins/guests/debian/guest.rb +9 -0
- data/plugins/guests/debian/plugin.rb +25 -0
- data/plugins/guests/fedora/cap/configure_networks.rb +59 -0
- data/plugins/guests/fedora/cap/network_scripts_dir.rb +15 -0
- data/plugins/guests/fedora/guest.rb +11 -0
- data/plugins/guests/fedora/plugin.rb +25 -0
- data/plugins/guests/freebsd/cap/change_host_name.rb +14 -0
- data/plugins/guests/freebsd/cap/configure_networks.rb +39 -0
- data/plugins/guests/freebsd/cap/halt.rb +16 -0
- data/plugins/guests/freebsd/cap/mount_nfs_folder.rb +14 -0
- data/plugins/guests/freebsd/guest.rb +14 -0
- data/plugins/guests/freebsd/plugin.rb +35 -0
- data/plugins/guests/gentoo/cap/change_host_name.rb +17 -0
- data/plugins/guests/gentoo/cap/configure_networks.rb +43 -0
- data/plugins/guests/gentoo/guest.rb +9 -0
- data/plugins/guests/gentoo/plugin.rb +25 -0
- data/plugins/guests/linux/cap/halt.rb +16 -0
- data/plugins/guests/linux/cap/mount_nfs.rb +30 -0
- data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +40 -0
- data/plugins/guests/linux/cap/read_ip_address.rb +17 -0
- data/plugins/guests/linux/cap/shell_expand_guest_path.rb +26 -0
- data/plugins/guests/linux/guest.rb +11 -0
- data/plugins/guests/linux/plugin.rb +40 -0
- data/plugins/guests/openbsd/cap/halt.rb +16 -0
- data/plugins/guests/openbsd/guest.rb +11 -0
- data/plugins/guests/openbsd/plugin.rb +20 -0
- data/plugins/guests/pld/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/pld/guest.rb +11 -0
- data/plugins/guests/pld/plugin.rb +20 -0
- data/plugins/guests/redhat/cap/change_host_name.rb +18 -0
- data/plugins/guests/redhat/cap/configure_networks.rb +60 -0
- data/plugins/guests/redhat/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/redhat/guest.rb +11 -0
- data/plugins/guests/redhat/plugin.rb +30 -0
- data/plugins/guests/solaris/cap/change_host_name.rb +17 -0
- data/plugins/guests/solaris/cap/configure_networks.rb +25 -0
- data/plugins/guests/solaris/cap/halt.rb +21 -0
- data/plugins/guests/solaris/cap/mount_virtualbox_shared_folder.rb +28 -0
- data/plugins/guests/solaris/config.rb +18 -0
- data/plugins/guests/solaris/guest.rb +14 -0
- data/plugins/guests/solaris/plugin.rb +40 -0
- data/plugins/guests/suse/cap/change_host_name.rb +18 -0
- data/plugins/guests/suse/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/suse/guest.rb +11 -0
- data/plugins/guests/suse/plugin.rb +25 -0
- data/plugins/guests/ubuntu/cap/change_host_name.rb +23 -0
- data/plugins/guests/ubuntu/guest.rb +32 -0
- data/plugins/guests/ubuntu/plugin.rb +20 -0
- data/plugins/hosts/arch/host.rb +68 -0
- data/plugins/hosts/arch/plugin.rb +15 -0
- data/plugins/hosts/bsd/host.rb +102 -0
- data/plugins/hosts/bsd/plugin.rb +15 -0
- data/plugins/hosts/fedora/host.rb +51 -0
- data/plugins/hosts/fedora/plugin.rb +15 -0
- data/plugins/hosts/freebsd/host.rb +43 -0
- data/plugins/hosts/freebsd/plugin.rb +15 -0
- data/plugins/hosts/gentoo/host.rb +24 -0
- data/plugins/hosts/gentoo/plugin.rb +15 -0
- data/plugins/hosts/linux/host.rb +95 -0
- data/plugins/hosts/linux/plugin.rb +15 -0
- data/plugins/hosts/opensuse/host.rb +34 -0
- data/plugins/hosts/opensuse/plugin.rb +15 -0
- data/plugins/hosts/windows/host.rb +17 -0
- data/plugins/hosts/windows/plugin.rb +15 -0
- data/plugins/kernel_v1/config/nfs.rb +20 -0
- data/plugins/kernel_v1/config/package.rb +17 -0
- data/plugins/kernel_v1/config/ssh.rb +46 -0
- data/plugins/kernel_v1/config/vagrant.rb +31 -0
- data/plugins/kernel_v1/config/vm.rb +184 -0
- data/plugins/kernel_v1/plugin.rb +44 -0
- data/plugins/kernel_v2/config/nfs.rb +14 -0
- data/plugins/kernel_v2/config/package.rb +13 -0
- data/plugins/kernel_v2/config/ssh.rb +76 -0
- data/plugins/kernel_v2/config/ssh_connect.rb +40 -0
- data/plugins/kernel_v2/config/vagrant.rb +13 -0
- data/plugins/kernel_v2/config/vm.rb +416 -0
- data/plugins/kernel_v2/config/vm_provisioner.rb +55 -0
- data/plugins/kernel_v2/config/vm_subvm.rb +30 -0
- data/plugins/kernel_v2/plugin.rb +44 -0
- data/plugins/providers/virtualbox/action/boot.rb +49 -0
- data/plugins/providers/virtualbox/action/check_accessible.rb +23 -0
- data/plugins/providers/virtualbox/action/check_created.rb +21 -0
- data/plugins/providers/virtualbox/action/check_guest_additions.rb +45 -0
- data/plugins/providers/virtualbox/action/check_running.rb +21 -0
- data/plugins/providers/virtualbox/action/check_virtualbox.rb +22 -0
- data/plugins/providers/virtualbox/action/clean_machine_folder.rb +43 -0
- data/plugins/providers/virtualbox/action/clear_forwarded_ports.rb +18 -0
- data/plugins/providers/virtualbox/action/clear_network_interfaces.rb +31 -0
- data/plugins/providers/virtualbox/action/clear_shared_folders.rb +17 -0
- data/plugins/providers/virtualbox/action/created.rb +20 -0
- data/plugins/providers/virtualbox/action/customize.rb +36 -0
- data/plugins/providers/virtualbox/action/destroy.rb +19 -0
- data/plugins/providers/virtualbox/action/destroy_unused_network_interfaces.rb +16 -0
- data/plugins/providers/virtualbox/action/discard_state.rb +20 -0
- data/plugins/providers/virtualbox/action/export.rb +57 -0
- data/plugins/providers/virtualbox/action/forced_halt.rb +25 -0
- data/plugins/providers/virtualbox/action/forward_ports.rb +87 -0
- data/plugins/providers/virtualbox/action/import.rb +51 -0
- data/plugins/providers/virtualbox/action/is_paused.rb +20 -0
- data/plugins/providers/virtualbox/action/is_running.rb +20 -0
- data/plugins/providers/virtualbox/action/is_saved.rb +20 -0
- data/plugins/providers/virtualbox/action/match_mac_address.rb +21 -0
- data/plugins/providers/virtualbox/action/message_already_running.rb +16 -0
- data/plugins/providers/virtualbox/action/message_not_created.rb +16 -0
- data/plugins/providers/virtualbox/action/message_not_running.rb +16 -0
- data/plugins/providers/virtualbox/action/message_will_not_destroy.rb +17 -0
- data/plugins/providers/virtualbox/action/network.rb +410 -0
- data/plugins/providers/virtualbox/action/package.rb +20 -0
- data/plugins/providers/virtualbox/action/package_vagrantfile.rb +33 -0
- data/plugins/providers/virtualbox/action/prepare_forwarded_port_collision_params.rb +35 -0
- data/plugins/providers/virtualbox/action/prepare_nfs_settings.rb +64 -0
- data/plugins/providers/virtualbox/action/prune_nfs_exports.rb +20 -0
- data/plugins/providers/virtualbox/action/resume.rb +25 -0
- data/plugins/providers/virtualbox/action/sane_defaults.rb +91 -0
- data/plugins/providers/virtualbox/action/set_name.rb +40 -0
- data/plugins/providers/virtualbox/action/setup_package_files.rb +51 -0
- data/plugins/providers/virtualbox/action/share_folders.rb +128 -0
- data/plugins/providers/virtualbox/action/suspend.rb +20 -0
- data/plugins/providers/virtualbox/action.rb +311 -0
- data/plugins/providers/virtualbox/config.rb +86 -0
- data/plugins/providers/virtualbox/driver/base.rb +360 -0
- data/plugins/providers/virtualbox/driver/meta.rb +142 -0
- data/plugins/providers/virtualbox/driver/version_4_0.rb +485 -0
- data/plugins/providers/virtualbox/driver/version_4_1.rb +485 -0
- data/plugins/providers/virtualbox/driver/version_4_2.rb +482 -0
- data/plugins/providers/virtualbox/model/forwarded_port.rb +58 -0
- data/plugins/providers/virtualbox/plugin.rb +42 -0
- data/plugins/providers/virtualbox/provider.rb +92 -0
- data/plugins/providers/virtualbox/util/compile_forwarded_ports.rb +31 -0
- data/plugins/provisioners/ansible/config.rb +72 -0
- data/plugins/provisioners/ansible/plugin.rb +23 -0
- data/plugins/provisioners/ansible/provisioner.rb +45 -0
- data/plugins/provisioners/cfengine/cap/debian/cfengine_install.rb +19 -0
- data/plugins/provisioners/cfengine/cap/linux/cfengine_installed.rb +14 -0
- data/plugins/provisioners/cfengine/cap/linux/cfengine_needs_bootstrap.rb +34 -0
- data/plugins/provisioners/cfengine/cap/redhat/cfengine_install.rb +24 -0
- data/plugins/provisioners/cfengine/config.rb +120 -0
- data/plugins/provisioners/cfengine/plugin.rb +42 -0
- data/plugins/provisioners/cfengine/provisioner.rb +136 -0
- data/plugins/provisioners/chef/config/base.rb +85 -0
- data/plugins/provisioners/chef/config/chef_client.rb +57 -0
- data/plugins/provisioners/chef/config/chef_solo.rb +87 -0
- data/plugins/provisioners/chef/plugin.rb +33 -0
- data/plugins/provisioners/chef/provisioner/base.rb +93 -0
- data/plugins/provisioners/chef/provisioner/chef_client.rb +107 -0
- data/plugins/provisioners/chef/provisioner/chef_solo.rb +192 -0
- data/plugins/provisioners/puppet/config/puppet.rb +70 -0
- data/plugins/provisioners/puppet/config/puppet_server.rb +16 -0
- data/plugins/provisioners/puppet/plugin.rb +33 -0
- data/plugins/provisioners/puppet/provisioner/puppet.rb +117 -0
- data/plugins/provisioners/puppet/provisioner/puppet_server.rb +67 -0
- data/plugins/provisioners/shell/config.rb +56 -0
- data/plugins/provisioners/shell/plugin.rb +23 -0
- data/plugins/provisioners/shell/provisioner.rb +86 -0
- data/tasks/acceptance.rake +113 -0
- data/tasks/bundler.rake +3 -0
- data/tasks/test.rake +20 -0
- data/templates/commands/init/Vagrantfile.erb +111 -0
- data/templates/commands/ssh_config/config.erb +16 -0
- data/templates/config/messages.erb +14 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/guests/arch/network_dhcp.erb +4 -0
- data/templates/guests/arch/network_static.erb +6 -0
- data/templates/guests/debian/network_dhcp.erb +11 -0
- data/templates/guests/debian/network_static.erb +7 -0
- data/templates/guests/fedora/network_dhcp.erb +6 -0
- data/templates/guests/fedora/network_static.erb +13 -0
- data/templates/guests/freebsd/network_dhcp.erb +3 -0
- data/templates/guests/freebsd/network_static.erb +3 -0
- data/templates/guests/gentoo/network_dhcp.erb +4 -0
- data/templates/guests/gentoo/network_static.erb +4 -0
- data/templates/guests/redhat/network_dhcp.erb +6 -0
- data/templates/guests/redhat/network_static.erb +8 -0
- data/templates/locales/en.yml +1126 -0
- data/templates/nfs/exports.erb +5 -0
- data/templates/nfs/exports_freebsd.erb +5 -0
- data/templates/nfs/exports_linux.erb +5 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/templates/provisioners/chef_client/client.erb +32 -0
- data/templates/provisioners/chef_solo/solo.erb +25 -0
- data/templates/rgloader.rb +9 -0
- data/test/acceptance/base.rb +48 -0
- data/test/acceptance/box_test.rb +99 -0
- data/test/acceptance/destroy_test.rb +37 -0
- data/test/acceptance/halt_test.rb +72 -0
- data/test/acceptance/init_test.rb +33 -0
- data/test/acceptance/networking/host_only_test.rb +37 -0
- data/test/acceptance/networking/port_forward_test.rb +125 -0
- data/test/acceptance/package_test.rb +46 -0
- data/test/acceptance/provisioning/basic_test.rb +61 -0
- data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
- data/test/acceptance/provisioning/shell_test.rb +53 -0
- data/test/acceptance/resume_test.rb +17 -0
- data/test/acceptance/shared_folders_test.rb +84 -0
- data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
- data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
- data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
- data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
- data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
- data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
- data/test/acceptance/ssh_test.rb +46 -0
- data/test/acceptance/support/config.rb +42 -0
- data/test/acceptance/support/isolated_environment.rb +118 -0
- data/test/acceptance/support/matchers/have_color.rb +9 -0
- data/test/acceptance/support/matchers/match_output.rb +14 -0
- data/test/acceptance/support/matchers/succeed.rb +14 -0
- data/test/acceptance/support/network_tests.rb +29 -0
- data/test/acceptance/support/output.rb +95 -0
- data/test/acceptance/support/shared/base_context.rb +72 -0
- data/test/acceptance/support/shared/command_examples.rb +33 -0
- data/test/acceptance/support/virtualbox.rb +36 -0
- data/test/acceptance/suspend_test.rb +56 -0
- data/test/acceptance/up_basic_test.rb +33 -0
- data/test/acceptance/up_with_box_url.rb +40 -0
- data/test/acceptance/vagrant_test.rb +47 -0
- data/test/acceptance/version_test.rb +15 -0
- data/test/config/acceptance_boxes.yml +7 -0
- data/test/support/isolated_environment.rb +46 -0
- data/test/support/tempdir.rb +43 -0
- data/test/unit/base.rb +27 -0
- data/test/unit/support/dummy_provider.rb +16 -0
- data/test/unit/support/isolated_environment.rb +179 -0
- data/test/unit/support/shared/base_context.rb +104 -0
- data/test/unit/vagrant/action/builder_test.rb +242 -0
- data/test/unit/vagrant/action/builtin/call_test.rb +145 -0
- data/test/unit/vagrant/action/builtin/confirm_test.rb +36 -0
- data/test/unit/vagrant/action/builtin/env_set_test.rb +20 -0
- data/test/unit/vagrant/action/builtin/graceful_halt_test.rb +61 -0
- data/test/unit/vagrant/action/builtin/lock_test.rb +98 -0
- data/test/unit/vagrant/action/builtin/ssh_exec_test.rb +57 -0
- data/test/unit/vagrant/action/hook_test.rb +120 -0
- data/test/unit/vagrant/action/runner_test.rb +71 -0
- data/test/unit/vagrant/action/warden_test.rb +92 -0
- data/test/unit/vagrant/batch_action_test.rb +36 -0
- data/test/unit/vagrant/box_collection_test.rb +237 -0
- data/test/unit/vagrant/box_test.rb +122 -0
- data/test/unit/vagrant/cli_test.rb +27 -0
- data/test/unit/vagrant/config/loader_test.rb +184 -0
- data/test/unit/vagrant/config/v1/dummy_config_test.rb +24 -0
- data/test/unit/vagrant/config/v1/loader_test.rb +145 -0
- data/test/unit/vagrant/config/v1/root_test.rb +40 -0
- data/test/unit/vagrant/config/v2/dummy_config_test.rb +24 -0
- data/test/unit/vagrant/config/v2/loader_test.rb +151 -0
- data/test/unit/vagrant/config/v2/root_test.rb +97 -0
- data/test/unit/vagrant/config/v2/util_test.rb +21 -0
- data/test/unit/vagrant/config_test.rb +66 -0
- data/test/unit/vagrant/environment_test.rb +721 -0
- data/test/unit/vagrant/guest_test.rb +166 -0
- data/test/unit/vagrant/hosts_test.rb +37 -0
- data/test/unit/vagrant/machine_state_test.rb +26 -0
- data/test/unit/vagrant/machine_test.rb +384 -0
- data/test/unit/vagrant/plugin/v1/command_test.rb +143 -0
- data/test/unit/vagrant/plugin/v1/communicator_test.rb +9 -0
- data/test/unit/vagrant/plugin/v1/config_test.rb +50 -0
- data/test/unit/vagrant/plugin/v1/host_test.rb +5 -0
- data/test/unit/vagrant/plugin/v1/manager_test.rb +114 -0
- data/test/unit/vagrant/plugin/v1/plugin_test.rb +267 -0
- data/test/unit/vagrant/plugin/v1/provider_test.rb +18 -0
- data/test/unit/vagrant/plugin/v2/command_test.rb +238 -0
- data/test/unit/vagrant/plugin/v2/communicator_test.rb +9 -0
- data/test/unit/vagrant/plugin/v2/components_test.rb +17 -0
- data/test/unit/vagrant/plugin/v2/config_test.rb +60 -0
- data/test/unit/vagrant/plugin/v2/host_test.rb +5 -0
- data/test/unit/vagrant/plugin/v2/manager_test.rb +174 -0
- data/test/unit/vagrant/plugin/v2/plugin_test.rb +305 -0
- data/test/unit/vagrant/plugin/v2/provider_test.rb +18 -0
- data/test/unit/vagrant/registry_test.rb +128 -0
- data/test/unit/vagrant/util/ansi_escape_code_remover_test.rb +16 -0
- data/test/unit/vagrant/util/downloader_test.rb +57 -0
- data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
- data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +38 -0
- data/test/unit/vagrant/util/is_port_open_test.rb +53 -0
- data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
- data/test/unit/vagrant/util/network_ip_test.rb +17 -0
- data/test/unit/vagrant/util/retryable_test.rb +106 -0
- data/test/unit/vagrant/util/safe_chdir_test.rb +43 -0
- data/test/unit/vagrant/util/scoped_hash_override_test.rb +48 -0
- data/test/unit/vagrant/util/ssh_test.rb +30 -0
- data/test/unit/vagrant/util/string_block_editor_test.rb +106 -0
- data/test/unit/vagrant/util/which_test.rb +43 -0
- data/test/unit/vagrant_test.rb +56 -0
- data/tnargav.gemspec +69 -0
- data/vagrant.gemspec +69 -0
- metadata +730 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
require "set"
|
|
2
|
+
|
|
3
|
+
require "log4r"
|
|
4
|
+
|
|
5
|
+
require "vagrant/plugin/v2/components"
|
|
6
|
+
|
|
7
|
+
module Vagrant
|
|
8
|
+
module Plugin
|
|
9
|
+
module V2
|
|
10
|
+
# This is the superclass for all V2 plugins.
|
|
11
|
+
class Plugin
|
|
12
|
+
# Special marker that can be used for action hooks that matches
|
|
13
|
+
# all action sequences.
|
|
14
|
+
ALL_ACTIONS = :__all_actions__
|
|
15
|
+
|
|
16
|
+
# The logger for this class.
|
|
17
|
+
LOGGER = Log4r::Logger.new("vagrant::plugin::v2::plugin")
|
|
18
|
+
|
|
19
|
+
# Set the root class up to be ourself, so that we can reference this
|
|
20
|
+
# from within methods which are probably in subclasses.
|
|
21
|
+
ROOT_CLASS = self
|
|
22
|
+
|
|
23
|
+
# This returns the manager for all V2 plugins.
|
|
24
|
+
#
|
|
25
|
+
# @return [V2::Manager]
|
|
26
|
+
def self.manager
|
|
27
|
+
@manager ||= Manager.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Returns the {Components} for this plugin.
|
|
31
|
+
#
|
|
32
|
+
# @return [Components]
|
|
33
|
+
def self.components
|
|
34
|
+
@components ||= Components.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Set the name of the plugin. The moment that this is called, the
|
|
38
|
+
# plugin will be registered and available. Before this is called, a
|
|
39
|
+
# plugin does not exist. The name must be unique among all installed
|
|
40
|
+
# plugins.
|
|
41
|
+
#
|
|
42
|
+
# @param [String] name Name of the plugin.
|
|
43
|
+
# @return [String] The name of the plugin.
|
|
44
|
+
def self.name(name=UNSET_VALUE)
|
|
45
|
+
# Get or set the value first, so we have a name for logging when
|
|
46
|
+
# we register.
|
|
47
|
+
result = get_or_set(:name, name)
|
|
48
|
+
|
|
49
|
+
# The plugin should be registered if we're setting a real name on it
|
|
50
|
+
Plugin.manager.register(self) if name != UNSET_VALUE
|
|
51
|
+
|
|
52
|
+
# Return the result
|
|
53
|
+
result
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Sets a human-friendly descrition of the plugin.
|
|
57
|
+
#
|
|
58
|
+
# @param [String] value Description of the plugin.
|
|
59
|
+
# @return [String] Description of the plugin.
|
|
60
|
+
def self.description(value=UNSET_VALUE)
|
|
61
|
+
get_or_set(:description, value)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Registers a callback to be called when a specific action sequence
|
|
65
|
+
# is run. This allows plugin authors to hook into things like VM
|
|
66
|
+
# bootup, VM provisioning, etc.
|
|
67
|
+
#
|
|
68
|
+
# @param [String] name Name of the action.
|
|
69
|
+
# @param [Symbol] hook_name The location to hook. If this isn't
|
|
70
|
+
# set, every middleware action is hooked.
|
|
71
|
+
# @return [Array] List of the hooks for the given action.
|
|
72
|
+
def self.action_hook(name, hook_name=nil, &block)
|
|
73
|
+
# The name is currently not used but we want it for the future.
|
|
74
|
+
|
|
75
|
+
hook_name ||= ALL_ACTIONS
|
|
76
|
+
components.action_hooks[hook_name] << block
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Defines additional command line commands available by key. The key
|
|
80
|
+
# becomes the subcommand, so if you register a command "foo" then
|
|
81
|
+
# "vagrant foo" becomes available.
|
|
82
|
+
#
|
|
83
|
+
# @param [String] name Subcommand key.
|
|
84
|
+
def self.command(name=UNSET_VALUE, &block)
|
|
85
|
+
data[:command] ||= Registry.new
|
|
86
|
+
|
|
87
|
+
if name != UNSET_VALUE
|
|
88
|
+
# Validate the name of the command
|
|
89
|
+
if name.to_s !~ /^[-a-z0-9]+$/i
|
|
90
|
+
raise InvalidCommandName, "Commands can only contain letters, numbers, and hyphens"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Register a new command class only if a name was given.
|
|
94
|
+
data[:command].register(name.to_sym, &block)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Return the registry
|
|
98
|
+
data[:command]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Defines additional communicators to be available. Communicators
|
|
102
|
+
# should be returned by a block passed to this method. This is done
|
|
103
|
+
# to ensure that the class is lazy loaded, so if your class inherits
|
|
104
|
+
# from or uses any Vagrant internals specific to Vagrant 1.0, then
|
|
105
|
+
# the plugin can still be defined without breaking anything in future
|
|
106
|
+
# versions of Vagrant.
|
|
107
|
+
#
|
|
108
|
+
# @param [String] name Communicator name.
|
|
109
|
+
def self.communicator(name=UNSET_VALUE, &block)
|
|
110
|
+
data[:communicator] ||= Registry.new
|
|
111
|
+
|
|
112
|
+
# Register a new communicator class only if a name was given.
|
|
113
|
+
data[:communicator].register(name.to_sym, &block) if name != UNSET_VALUE
|
|
114
|
+
|
|
115
|
+
# Return the registry
|
|
116
|
+
data[:communicator]
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Defines additional configuration keys to be available in the
|
|
120
|
+
# Vagrantfile. The configuration class should be returned by a
|
|
121
|
+
# block passed to this method. This is done to ensure that the class
|
|
122
|
+
# is lazy loaded, so if your class inherits from any classes that
|
|
123
|
+
# are specific to Vagrant 1.0, then the plugin can still be defined
|
|
124
|
+
# without breaking anything in future versions of Vagrant.
|
|
125
|
+
#
|
|
126
|
+
# @param [String] name Configuration key.
|
|
127
|
+
def self.config(name, scope=nil, &block)
|
|
128
|
+
scope ||= :top
|
|
129
|
+
components.configs[scope].register(name.to_sym, &block)
|
|
130
|
+
nil
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Defines an additionally available guest implementation with
|
|
134
|
+
# the given key.
|
|
135
|
+
#
|
|
136
|
+
# @param [String] name Name of the guest.
|
|
137
|
+
# @param [String] parent Name of the parent guest (if any)
|
|
138
|
+
def self.guest(name=UNSET_VALUE, parent=nil, &block)
|
|
139
|
+
components.guests.register(name.to_sym) do
|
|
140
|
+
parent = parent.to_sym if parent
|
|
141
|
+
|
|
142
|
+
[block.call, parent]
|
|
143
|
+
end
|
|
144
|
+
nil
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Defines a capability for the given guest. The block should return
|
|
148
|
+
# a class/module that has a method with the capability name, ready
|
|
149
|
+
# to be executed. This means that if it is an instance method,
|
|
150
|
+
# the block should return an instance of the class.
|
|
151
|
+
#
|
|
152
|
+
# @param [String] guest The name of the guest
|
|
153
|
+
# @param [String] cap The name of the capability
|
|
154
|
+
def self.guest_capability(guest, cap, &block)
|
|
155
|
+
components.guest_capabilities[guest.to_sym].register(cap.to_sym, &block)
|
|
156
|
+
nil
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Defines an additionally available host implementation with
|
|
160
|
+
# the given key.
|
|
161
|
+
#
|
|
162
|
+
# @param [String] name Name of the host.
|
|
163
|
+
def self.host(name=UNSET_VALUE, &block)
|
|
164
|
+
data[:hosts] ||= Registry.new
|
|
165
|
+
|
|
166
|
+
# Register a new host class only if a name was given
|
|
167
|
+
data[:hosts].register(name.to_sym, &block) if name != UNSET_VALUE
|
|
168
|
+
|
|
169
|
+
# Return the registry
|
|
170
|
+
data[:hosts]
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Registers additional providers to be available.
|
|
174
|
+
#
|
|
175
|
+
# @param [Symbol] name Name of the provider.
|
|
176
|
+
def self.provider(name=UNSET_VALUE, options=nil, &block)
|
|
177
|
+
components.providers.register(name.to_sym) do
|
|
178
|
+
[block.call, options || {}]
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
nil
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Registers additional provisioners to be available.
|
|
185
|
+
#
|
|
186
|
+
# @param [String] name Name of the provisioner.
|
|
187
|
+
def self.provisioner(name=UNSET_VALUE, &block)
|
|
188
|
+
data[:provisioners] ||= Registry.new
|
|
189
|
+
|
|
190
|
+
# Register a new provisioner class only if a name was given
|
|
191
|
+
data[:provisioners].register(name.to_sym, &block) if name != UNSET_VALUE
|
|
192
|
+
|
|
193
|
+
# Return the registry
|
|
194
|
+
data[:provisioners]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Returns the internal data associated with this plugin. This
|
|
198
|
+
# should NOT be called by the general public.
|
|
199
|
+
#
|
|
200
|
+
# @return [Hash]
|
|
201
|
+
def self.data
|
|
202
|
+
@data ||= {}
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
protected
|
|
206
|
+
|
|
207
|
+
# Sentinel value denoting that a value has not been set.
|
|
208
|
+
UNSET_VALUE = Object.new
|
|
209
|
+
|
|
210
|
+
# Helper method that will set a value if a value is given, or otherwise
|
|
211
|
+
# return the already set value.
|
|
212
|
+
#
|
|
213
|
+
# @param [Symbol] key Key for the data
|
|
214
|
+
# @param [Object] value Value to store.
|
|
215
|
+
# @return [Object] Stored value.
|
|
216
|
+
def self.get_or_set(key, value=UNSET_VALUE)
|
|
217
|
+
# If no value is to be set, then return the value we have already set
|
|
218
|
+
return data[key] if value.eql?(UNSET_VALUE)
|
|
219
|
+
|
|
220
|
+
# Otherwise set the value
|
|
221
|
+
data[key] = value
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Plugin
|
|
3
|
+
module V2
|
|
4
|
+
# This is the base class for a provider for the V2 API. A provider
|
|
5
|
+
# is responsible for creating compute resources to match the needs
|
|
6
|
+
# of a Vagrant-configured system.
|
|
7
|
+
class Provider
|
|
8
|
+
# Initialize the provider to represent the given machine.
|
|
9
|
+
#
|
|
10
|
+
# @param [Vagrant::Machine] machine The machine that this provider
|
|
11
|
+
# is responsible for.
|
|
12
|
+
def initialize(machine)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# This should return an action callable for the given name.
|
|
16
|
+
#
|
|
17
|
+
# @param [Symbol] name Name of the action.
|
|
18
|
+
# @return [Object] A callable action sequence object, whether it
|
|
19
|
+
# is a proc, object, etc.
|
|
20
|
+
def action(name)
|
|
21
|
+
nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# This method is called if the underying machine ID changes. Providers
|
|
25
|
+
# can use this method to load in new data for the actual backing
|
|
26
|
+
# machine or to realize that the machine is now gone (the ID can
|
|
27
|
+
# become `nil`). No parameters are given, since the underlying machine
|
|
28
|
+
# is simply the machine instance given to this object. And no
|
|
29
|
+
# return value is necessary.
|
|
30
|
+
def machine_id_changed
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# This should return a hash of information that explains how to
|
|
34
|
+
# SSH into the machine. If the machine is not at a point where
|
|
35
|
+
# SSH is even possible, then `nil` should be returned.
|
|
36
|
+
#
|
|
37
|
+
# The general structure of this returned hash should be the
|
|
38
|
+
# following:
|
|
39
|
+
#
|
|
40
|
+
# {
|
|
41
|
+
# :host => "1.2.3.4",
|
|
42
|
+
# :port => "22",
|
|
43
|
+
# :username => "mitchellh",
|
|
44
|
+
# :private_key_path => "/path/to/my/key"
|
|
45
|
+
# }
|
|
46
|
+
#
|
|
47
|
+
# **Note:** Vagrant only supports private key based authentication,
|
|
48
|
+
# mainly for the reason that there is no easy way to exec into an
|
|
49
|
+
# `ssh` prompt with a password, whereas we can pass a private key
|
|
50
|
+
# via commandline.
|
|
51
|
+
#
|
|
52
|
+
# @return [Hash] SSH information. For the structure of this hash
|
|
53
|
+
# read the accompanying documentation for this method.
|
|
54
|
+
def ssh_info
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# This should return the state of the machine within this provider.
|
|
59
|
+
# The state must be an instance of {MachineState}. Please read the
|
|
60
|
+
# documentation of that class for more information.
|
|
61
|
+
#
|
|
62
|
+
# @return [MachineState]
|
|
63
|
+
def state
|
|
64
|
+
nil
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Plugin
|
|
3
|
+
module V2
|
|
4
|
+
# This is the base class for a provisioner for the V2 API. A provisioner
|
|
5
|
+
# is primarily responsible for installing software on a Vagrant guest.
|
|
6
|
+
class Provisioner
|
|
7
|
+
attr_reader :machine
|
|
8
|
+
attr_reader :config
|
|
9
|
+
|
|
10
|
+
# Initializes the provisioner with the machine that it will be
|
|
11
|
+
# provisioning along with the provisioner configuration (if there
|
|
12
|
+
# is any).
|
|
13
|
+
#
|
|
14
|
+
# The provisioner should _not_ do anything at this point except
|
|
15
|
+
# initialize internal state.
|
|
16
|
+
#
|
|
17
|
+
# @param [Machine] machine The machine that this will be provisioning.
|
|
18
|
+
# @param [Object] config Provisioner configuration, if one was set.
|
|
19
|
+
def initialize(machine, config)
|
|
20
|
+
@machine = machine
|
|
21
|
+
@config = config
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Called with the root configuration of the machine so the provisioner
|
|
25
|
+
# can add some configuration on top of the machine.
|
|
26
|
+
#
|
|
27
|
+
# During this step, and this step only, the provisioner should modify
|
|
28
|
+
# the root machine configuration to add any additional features it
|
|
29
|
+
# may need. Examples include sharing folders, networking, and so on.
|
|
30
|
+
# This step is guaranteed to be called before any of those steps are
|
|
31
|
+
# done so the provisioner may do that.
|
|
32
|
+
#
|
|
33
|
+
# No return value is expected.
|
|
34
|
+
def configure(root_config)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# This is the method called when the actual provisioning should be
|
|
38
|
+
# done. The communicator is guaranteed to be ready at this point,
|
|
39
|
+
# and any shared folders or networks are already setup.
|
|
40
|
+
#
|
|
41
|
+
# No return value is expected.
|
|
42
|
+
def provision
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
# We don't autoload components because if we're loading anything in the
|
|
4
|
+
# V2 namespace anyways, then we're going to need the Components class.
|
|
5
|
+
require "vagrant/plugin/v2/components"
|
|
6
|
+
require "vagrant/plugin/v2/errors"
|
|
7
|
+
|
|
8
|
+
module Vagrant
|
|
9
|
+
module Plugin
|
|
10
|
+
module V2
|
|
11
|
+
autoload :Command, "vagrant/plugin/v2/command"
|
|
12
|
+
autoload :Communicator, "vagrant/plugin/v2/communicator"
|
|
13
|
+
autoload :Config, "vagrant/plugin/v2/config"
|
|
14
|
+
autoload :Guest, "vagrant/plugin/v2/guest"
|
|
15
|
+
autoload :Host, "vagrant/plugin/v2/host"
|
|
16
|
+
autoload :Manager, "vagrant/plugin/v2/manager"
|
|
17
|
+
autoload :Plugin, "vagrant/plugin/v2/plugin"
|
|
18
|
+
autoload :Provider, "vagrant/plugin/v2/provider"
|
|
19
|
+
autoload :Provisioner, "vagrant/plugin/v2/provisioner"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
# Register components in a single location that can be queried.
|
|
3
|
+
#
|
|
4
|
+
# This allows certain components (such as guest systems, configuration
|
|
5
|
+
# pieces, etc.) to be registered and queried, lazily.
|
|
6
|
+
class Registry
|
|
7
|
+
def initialize
|
|
8
|
+
@items = {}
|
|
9
|
+
@results_cache = {}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Register a key with a lazy-loaded value.
|
|
13
|
+
#
|
|
14
|
+
# If a key with the given name already exists, it is overwritten.
|
|
15
|
+
def register(key, &block)
|
|
16
|
+
raise ArgumentError, "block required" if !block_given?
|
|
17
|
+
@items[key] = block
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Get a value by the given key.
|
|
21
|
+
#
|
|
22
|
+
# This will evaluate the block given to `register` and return the
|
|
23
|
+
# resulting value.
|
|
24
|
+
def get(key)
|
|
25
|
+
return nil if !@items.has_key?(key)
|
|
26
|
+
return @results_cache[key] if @results_cache.has_key?(key)
|
|
27
|
+
@results_cache[key] = @items[key].call
|
|
28
|
+
end
|
|
29
|
+
alias :[] :get
|
|
30
|
+
|
|
31
|
+
# Checks if the given key is registered with the registry.
|
|
32
|
+
#
|
|
33
|
+
# @return [Boolean]
|
|
34
|
+
def has_key?(key)
|
|
35
|
+
@items.has_key?(key)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Iterate over the keyspace.
|
|
39
|
+
def each(&block)
|
|
40
|
+
@items.each do |key, _|
|
|
41
|
+
yield key, get(key)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Merge one registry with another and return a completely new
|
|
46
|
+
# registry. Note that the result cache is completely busted, so
|
|
47
|
+
# any gets on the new registry will result in a cache miss.
|
|
48
|
+
def merge(other)
|
|
49
|
+
self.class.new.tap do |result|
|
|
50
|
+
result.merge!(self)
|
|
51
|
+
result.merge!(other)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Like #{merge} but merges into self.
|
|
56
|
+
def merge!(other)
|
|
57
|
+
@items.merge!(other.__internal_state[:items])
|
|
58
|
+
self
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Converts this registry to a hash
|
|
62
|
+
def to_hash
|
|
63
|
+
result = {}
|
|
64
|
+
self.each do |key, value|
|
|
65
|
+
result[key] = value
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
result
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def __internal_state
|
|
72
|
+
{
|
|
73
|
+
:items => @items,
|
|
74
|
+
:results_cache => @results_cache
|
|
75
|
+
}
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
data/lib/vagrant/ui.rb
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
require "thread"
|
|
2
|
+
|
|
3
|
+
require "log4r"
|
|
4
|
+
|
|
5
|
+
require "vagrant/util/platform"
|
|
6
|
+
require "vagrant/util/safe_puts"
|
|
7
|
+
|
|
8
|
+
module Vagrant
|
|
9
|
+
module UI
|
|
10
|
+
# Vagrant UIs handle communication with the outside world (typically
|
|
11
|
+
# through a shell). They must respond to the following methods:
|
|
12
|
+
#
|
|
13
|
+
# * `info`
|
|
14
|
+
# * `warn`
|
|
15
|
+
# * `error`
|
|
16
|
+
# * `success`
|
|
17
|
+
class Interface
|
|
18
|
+
def initialize
|
|
19
|
+
@logger = Log4r::Logger.new("vagrant::ui::interface")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
[:ask, :warn, :error, :info, :success].each do |method|
|
|
23
|
+
define_method(method) do |message, *opts|
|
|
24
|
+
# Log normal console messages
|
|
25
|
+
@logger.info { "#{method}: #{message}" }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
[:clear_line, :report_progress].each do |method|
|
|
30
|
+
# By default do nothing, these aren't logged
|
|
31
|
+
define_method(method) { |*args| }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns a new UI class that is scoped to the given resource name.
|
|
35
|
+
# Subclasses can then use this scope name to do whatever they please.
|
|
36
|
+
#
|
|
37
|
+
# @param [String] scope_name
|
|
38
|
+
# @return [Interface]
|
|
39
|
+
def scope(scope_name)
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# This is a UI implementation that does nothing.
|
|
45
|
+
class Silent < Interface
|
|
46
|
+
def ask(*args)
|
|
47
|
+
super
|
|
48
|
+
|
|
49
|
+
# Silent can't do this, obviously.
|
|
50
|
+
raise Errors::UIExpectsTTY
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# This is a UI implementation that outputs the text as is. It
|
|
55
|
+
# doesn't add any color.
|
|
56
|
+
class Basic < Interface
|
|
57
|
+
include Util::SafePuts
|
|
58
|
+
|
|
59
|
+
def initialize
|
|
60
|
+
super
|
|
61
|
+
|
|
62
|
+
@lock = Mutex.new
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Use some light meta-programming to create the various methods to
|
|
66
|
+
# output text to the UI. These all delegate the real functionality
|
|
67
|
+
# to `say`.
|
|
68
|
+
[:info, :warn, :error, :success].each do |method|
|
|
69
|
+
class_eval <<-CODE
|
|
70
|
+
def #{method}(message, *args)
|
|
71
|
+
super(message)
|
|
72
|
+
say(#{method.inspect}, message, *args)
|
|
73
|
+
end
|
|
74
|
+
CODE
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def ask(message, opts=nil)
|
|
78
|
+
super(message)
|
|
79
|
+
|
|
80
|
+
# We can't ask questions when the output isn't a TTY.
|
|
81
|
+
raise Errors::UIExpectsTTY if !$stdin.tty? && !Vagrant::Util::Platform.cygwin?
|
|
82
|
+
|
|
83
|
+
# Setup the options so that the new line is suppressed
|
|
84
|
+
opts ||= {}
|
|
85
|
+
opts[:new_line] = false if !opts.has_key?(:new_line)
|
|
86
|
+
opts[:prefix] = false if !opts.has_key?(:prefix)
|
|
87
|
+
|
|
88
|
+
# Output the data
|
|
89
|
+
say(:info, message, opts)
|
|
90
|
+
|
|
91
|
+
# Get the results and chomp off the newline. We do a logical OR
|
|
92
|
+
# here because `gets` can return a nil, for example in the case
|
|
93
|
+
# that ctrl-D is pressed on the input.
|
|
94
|
+
input = $stdin.gets || ""
|
|
95
|
+
input.chomp
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# This is used to output progress reports to the UI.
|
|
99
|
+
# Send this method progress/total and it will output it
|
|
100
|
+
# to the UI. Send `clear_line` to clear the line to show
|
|
101
|
+
# a continuous progress meter.
|
|
102
|
+
def report_progress(progress, total, show_parts=true)
|
|
103
|
+
if total && total > 0
|
|
104
|
+
percent = (progress.to_f / total.to_f) * 100
|
|
105
|
+
line = "Progress: #{percent.to_i}%"
|
|
106
|
+
line << " (#{progress} / #{total})" if show_parts
|
|
107
|
+
else
|
|
108
|
+
line = "Progress: #{progress}"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
info(line, :new_line => false)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def clear_line
|
|
115
|
+
reset = "\r"
|
|
116
|
+
reset += "\e[0K" if Util::Platform.windows? && !Util::Platform.cygwin?
|
|
117
|
+
|
|
118
|
+
info(reset, :new_line => false)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# This method handles actually outputting a message of a given type
|
|
122
|
+
# to the console.
|
|
123
|
+
def say(type, message, opts=nil)
|
|
124
|
+
defaults = { :new_line => true, :prefix => true }
|
|
125
|
+
opts = defaults.merge(opts || {})
|
|
126
|
+
|
|
127
|
+
# Determine whether we're expecting to output our
|
|
128
|
+
# own new line or not.
|
|
129
|
+
printer = opts[:new_line] ? :puts : :print
|
|
130
|
+
|
|
131
|
+
# Determine the proper IO channel to send this message
|
|
132
|
+
# to based on the type of the message
|
|
133
|
+
channel = type == :error || opts[:channel] == :error ? $stderr : $stdout
|
|
134
|
+
|
|
135
|
+
# Output! We wrap this in a lock so that it safely outputs only
|
|
136
|
+
# one line at a time.
|
|
137
|
+
@lock.synchronize do
|
|
138
|
+
safe_puts(format_message(type, message, opts),
|
|
139
|
+
:io => channel, :printer => printer)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def scope(scope_name)
|
|
144
|
+
BasicScope.new(self, scope_name)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# This is called by `say` to format the message for output.
|
|
148
|
+
def format_message(type, message, opts=nil)
|
|
149
|
+
opts ||= {}
|
|
150
|
+
message = "[#{opts[:scope]}] #{message}" if opts[:scope] && opts[:prefix]
|
|
151
|
+
message
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# This implements a scope for the {Basic} UI.
|
|
156
|
+
class BasicScope < Interface
|
|
157
|
+
def initialize(ui, scope)
|
|
158
|
+
super()
|
|
159
|
+
|
|
160
|
+
@ui = ui
|
|
161
|
+
@scope = scope
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
[:ask, :warn, :error, :info, :success].each do |method|
|
|
165
|
+
define_method(method) do |message, opts=nil|
|
|
166
|
+
opts ||= {}
|
|
167
|
+
opts[:scope] = @scope
|
|
168
|
+
@ui.send(method, message, opts)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
[:clear_line, :report_progress].each do |method|
|
|
173
|
+
# By default do nothing, these aren't logged
|
|
174
|
+
define_method(method) { |*args| @ui.send(method, *args) }
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# This is a UI implementation that outputs color for various types
|
|
179
|
+
# of messages. This should only be used with a TTY that supports color,
|
|
180
|
+
# but is up to the user of the class to verify this is the case.
|
|
181
|
+
class Colored < Basic
|
|
182
|
+
# Terminal colors
|
|
183
|
+
COLORS = {
|
|
184
|
+
:clear => "\e[0m",
|
|
185
|
+
:red => "\e[31m",
|
|
186
|
+
:green => "\e[32m",
|
|
187
|
+
:yellow => "\e[33m"
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
# Mapping between type of message and the color to output
|
|
191
|
+
COLOR_MAP = {
|
|
192
|
+
:warn => COLORS[:yellow],
|
|
193
|
+
:error => COLORS[:red],
|
|
194
|
+
:success => COLORS[:green]
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
# This is called by `say` to format the message for output.
|
|
198
|
+
def format_message(type, message, opts=nil)
|
|
199
|
+
# Get the format of the message before adding color.
|
|
200
|
+
message = super
|
|
201
|
+
|
|
202
|
+
# Colorize the message if there is a color for this type of message,
|
|
203
|
+
# either specified by the options or via the default color map.
|
|
204
|
+
if opts.has_key?(:color)
|
|
205
|
+
color = COLORS[opts[:color]]
|
|
206
|
+
message = "#{color}#{message}#{COLORS[:clear]}"
|
|
207
|
+
else
|
|
208
|
+
message = "#{COLOR_MAP[type]}#{message}#{COLORS[:clear]}" if COLOR_MAP[type]
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
message
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Util
|
|
3
|
+
module ANSIEscapeCodeRemover
|
|
4
|
+
# Removes ANSI escape code sequences from the text and returns
|
|
5
|
+
# it.
|
|
6
|
+
#
|
|
7
|
+
# This removes all the ANSI escape codes listed here along with
|
|
8
|
+
# the escape codes for VT100 terminals:
|
|
9
|
+
#
|
|
10
|
+
# http://ascii-table.com/ansi-escape-sequences.php
|
|
11
|
+
def remove_ansi_escape_codes(text)
|
|
12
|
+
# An array of regular expressions which match various kinds
|
|
13
|
+
# of escape sequences. I can't think of a better single regular
|
|
14
|
+
# expression or any faster way to do this.
|
|
15
|
+
matchers = [/\e\[\d*[ABCD]/, # Matches things like \e[4D
|
|
16
|
+
/\e\[(\d*;)?\d*[HF]/, # Matches \e[1;2H or \e[H
|
|
17
|
+
/\e\[(s|u|2J|K)/, # Matches \e[s, \e[2J, etc.
|
|
18
|
+
/\e\[=\d*[hl]/, # Matches \e[=24h
|
|
19
|
+
/\e\[\?[1-9][hl]/, # Matches \e[?2h
|
|
20
|
+
/\e\[20[hl]/, # Matches \e[20l]
|
|
21
|
+
/\e[DME78H]/, # Matches \eD, \eH, etc.
|
|
22
|
+
/\e\[[0-2]?[JK]/, # Matches \e[0J, \e[K, etc.
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
# Take each matcher and replace it with emptiness.
|
|
26
|
+
matchers.each do |matcher|
|
|
27
|
+
text.gsub!(matcher, "")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
text
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|