vagrant 0.9.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/CHANGELOG.md +41 -0
  2. data/config/default.rb +0 -1
  3. data/lib/vagrant.rb +9 -5
  4. data/lib/vagrant/action.rb +1 -0
  5. data/lib/vagrant/action/builtin.rb +10 -0
  6. data/lib/vagrant/action/general/check_virtualbox.rb +28 -0
  7. data/lib/vagrant/action/general/package.rb +10 -7
  8. data/lib/vagrant/action/general/validate.rb +2 -3
  9. data/lib/vagrant/action/vm/customize.rb +1 -1
  10. data/lib/vagrant/action/vm/network.rb +10 -9
  11. data/lib/vagrant/action/vm/nfs.rb +7 -0
  12. data/lib/vagrant/command.rb +1 -0
  13. data/lib/vagrant/command/base.rb +8 -2
  14. data/lib/vagrant/command/destroy.rb +29 -3
  15. data/lib/vagrant/command/gem.rb +35 -0
  16. data/lib/vagrant/command/package.rb +1 -1
  17. data/lib/vagrant/command/ssh.rb +1 -1
  18. data/lib/vagrant/command/ssh_config.rb +1 -1
  19. data/lib/vagrant/config/loader.rb +2 -0
  20. data/lib/vagrant/config/ssh.rb +0 -20
  21. data/lib/vagrant/config/vm.rb +0 -48
  22. data/lib/vagrant/data_store.rb +18 -9
  23. data/lib/vagrant/driver/virtualbox.rb +1 -0
  24. data/lib/vagrant/driver/virtualbox_4_0.rb +36 -14
  25. data/lib/vagrant/driver/virtualbox_4_1.rb +36 -14
  26. data/lib/vagrant/driver/virtualbox_base.rb +37 -19
  27. data/lib/vagrant/environment.rb +21 -2
  28. data/lib/vagrant/errors.rb +10 -0
  29. data/lib/vagrant/guest.rb +1 -0
  30. data/lib/vagrant/guest/arch.rb +10 -2
  31. data/lib/vagrant/guest/base.rb +1 -1
  32. data/lib/vagrant/guest/debian.rb +5 -2
  33. data/lib/vagrant/guest/fedora.rb +66 -0
  34. data/lib/vagrant/guest/freebsd.rb +18 -7
  35. data/lib/vagrant/guest/gentoo.rb +6 -0
  36. data/lib/vagrant/guest/linux.rb +1 -0
  37. data/lib/vagrant/guest/redhat.rb +1 -0
  38. data/lib/vagrant/guest/ubuntu.rb +1 -1
  39. data/lib/vagrant/hosts.rb +1 -0
  40. data/lib/vagrant/hosts/opensuse.rb +30 -0
  41. data/lib/vagrant/plugin.rb +21 -19
  42. data/lib/vagrant/provisioners/chef.rb +3 -1
  43. data/lib/vagrant/provisioners/puppet.rb +18 -7
  44. data/lib/vagrant/util/line_ending_helpers.rb +14 -0
  45. data/lib/vagrant/util/subprocess.rb +9 -0
  46. data/lib/vagrant/version.rb +1 -1
  47. data/lib/vagrant/vm.rb +6 -6
  48. data/templates/commands/init/Vagrantfile.erb +1 -1
  49. data/templates/guests/fedora/network_dhcp.erb +6 -0
  50. data/templates/guests/fedora/network_static.erb +13 -0
  51. data/templates/guests/freebsd/network_dhcp.erb +3 -0
  52. data/templates/guests/freebsd/network_static.erb +3 -0
  53. data/templates/locales/en.yml +26 -0
  54. data/templates/nfs/exports_linux.erb +1 -1
  55. data/test/acceptance/networking/host_only_test.rb +2 -2
  56. data/test/unit/vagrant/config/vm_test.rb +4 -4
  57. data/test/unit/vagrant/data_store_test.rb +12 -0
  58. data/test/unit/vagrant/environment_test.rb +20 -0
  59. data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
  60. data/vagrant.gemspec +1 -1
  61. metadata +37 -27
@@ -1,3 +1,44 @@
1
+ ## 1.0.0 (March 6, 2012)
2
+
3
+ - `vagrant gem` should now be used to install Vagrant plugins that are
4
+ gems. This installs the gems to a private gem folder that Vagrant adds
5
+ to its own load path. This isolates Vagrant-related gems from system
6
+ gems.
7
+ - Plugin loading no longer happens right when Vagrant is loaded, but when
8
+ a Vagrant environment is loaded. I don't anticipate this causing any
9
+ problems but it is a backwards incompatible change should a plugin
10
+ depend on this (but I don't see any reason why they would).
11
+ - `vagrant destroy` now asks for confirmation by default. This can be
12
+ overridden with the `--force` flag. [GH-699]
13
+ - Fix issue with Puppet config inheritance. [GH-722]
14
+ - Fix issue where starting a VM on some systems was incorrectly treated
15
+ as failing. [GH-720]
16
+ - It is now an error to specify the packaging `output` as a directory. [GH-730]
17
+ - Unix-style line endings are used properly for guest OS. [GH-727]
18
+ - Retry certain VirtualBox operations, since they intermittently fail.
19
+ [GH-726]
20
+ - Fix issue where Vagrant would sometimes "lose" a VM if an exception
21
+ occurred. [GH-725]
22
+ - `vagrant destroy` destroys virtual machines in reverse order. [GH-739]
23
+ - Add an `fsid` option to Linux NFS exports. [GH-736]
24
+ - Fix edge case where an exception could be raised in networking code. [GH-742]
25
+ - Add missing translation for the "guru meditation" state. [GH-745]
26
+ - Check that VirtualBox exists before certain commands. [GH-746]
27
+ - NIC type can be defined for host-only network adapters. [GH-750]
28
+ - Fix issue where re-running chef-client would sometimes cause
29
+ problems due to file permissions. [GH-748]
30
+ - FreeBSD guests can now have their hostnames changed. [GH-757]
31
+ - FreeBSD guests now support host only networking and bridged networking. [GH-762]
32
+ - `VM#run_action` is now public so plugin-devs can hook into it.
33
+ - Fix crashing bug when attempting to run commands on the "primary"
34
+ VM in a multi-VM environment. [GH-761]
35
+ - With puppet you can now specify `:facter` as a dictionary of facts to
36
+ override what is generated by Puppet. [GH-753]
37
+ - Automatically convert all arguments to `customize` to strings.
38
+ - openSUSE host system. [GH-766]
39
+ - Fix subprocess IO deadlock which would occur on Windows. [GH-765]
40
+ - Fedora 16 guest support. [GH-772]
41
+
1
42
  ## 0.9.7 (February 9, 2012)
2
43
 
3
44
  - Fix regression where all subprocess IO simply didn't work with
@@ -4,7 +4,6 @@ Vagrant::Config.run do |config|
4
4
  config.vagrant.host = :detect
5
5
 
6
6
  config.ssh.username = "vagrant"
7
- config.ssh.password = "vagrant"
8
7
  config.ssh.host = "127.0.0.1"
9
8
  config.ssh.guest_port = 22
10
9
  config.ssh.max_tries = 100
@@ -1,9 +1,10 @@
1
+ require 'log4r'
2
+
1
3
  # Enable logging if it is requested. We do this before
2
4
  # anything else so that we can setup the output before
3
5
  # any logging occurs.
4
6
  if ENV["VAGRANT_LOG"] && ENV["VAGRANT_LOG"] != ""
5
7
  # Require Log4r and define the levels we'll be using
6
- require 'log4r'
7
8
  require 'log4r/config'
8
9
  Log4r.define_levels(*Log4r::Log4rConfig::LogLevels)
9
10
 
@@ -50,6 +51,10 @@ require 'i18n'
50
51
  # there are issues with ciphers not being properly loaded.
51
52
  require 'openssl'
52
53
 
54
+ # Always make the version available
55
+ require 'vagrant/version'
56
+ Log4r::Logger.new("vagrant::global").info("Vagrant version: #{Vagrant::VERSION}")
57
+
53
58
  module Vagrant
54
59
  autoload :Action, 'vagrant/action'
55
60
  autoload :Box, 'vagrant/box'
@@ -136,6 +141,7 @@ I18n.load_path << File.expand_path("templates/locales/en.yml", Vagrant.source_ro
136
141
  # Register the built-in commands
137
142
  Vagrant.commands.register(:box) { Vagrant::Command::Box }
138
143
  Vagrant.commands.register(:destroy) { Vagrant::Command::Destroy }
144
+ Vagrant.commands.register(:gem) { Vagrant::Command::Gem }
139
145
  Vagrant.commands.register(:halt) { Vagrant::Command::Halt }
140
146
  Vagrant.commands.register(:init) { Vagrant::Command::Init }
141
147
  Vagrant.commands.register(:package) { Vagrant::Command::Package }
@@ -159,6 +165,7 @@ Vagrant.config_keys.register(:package) { Vagrant::Config::PackageConfig }
159
165
  Vagrant.hosts.register(:arch) { Vagrant::Hosts::Arch }
160
166
  Vagrant.hosts.register(:bsd) { Vagrant::Hosts::BSD }
161
167
  Vagrant.hosts.register(:fedora) { Vagrant::Hosts::Fedora }
168
+ Vagrant.hosts.register(:opensuse) { Vagrant::Hosts::OpenSUSE }
162
169
  Vagrant.hosts.register(:freebsd) { Vagrant::Hosts::FreeBSD }
163
170
  Vagrant.hosts.register(:gentoo) { Vagrant::Hosts::Gentoo }
164
171
  Vagrant.hosts.register(:linux) { Vagrant::Hosts::Linux }
@@ -167,6 +174,7 @@ Vagrant.hosts.register(:windows) { Vagrant::Hosts::Windows }
167
174
  # Register the built-in guests
168
175
  Vagrant.guests.register(:arch) { Vagrant::Guest::Arch }
169
176
  Vagrant.guests.register(:debian) { Vagrant::Guest::Debian }
177
+ Vagrant.guests.register(:fedora) { Vagrant::Guest::Fedora }
170
178
  Vagrant.guests.register(:freebsd) { Vagrant::Guest::FreeBSD }
171
179
  Vagrant.guests.register(:gentoo) { Vagrant::Guest::Gentoo }
172
180
  Vagrant.guests.register(:linux) { Vagrant::Guest::Linux }
@@ -186,7 +194,3 @@ Vagrant.provisioners.register(:shell) { Vagrant::Provisioners::Shell }
186
194
  Vagrant.config_keys.register(:freebsd) { Vagrant::Guest::FreeBSD::FreeBSDConfig }
187
195
  Vagrant.config_keys.register(:linux) { Vagrant::Guest::Linux::LinuxConfig }
188
196
  Vagrant.config_keys.register(:solaris) { Vagrant::Guest::Solaris::SolarisConfig }
189
-
190
- # Load the things which must be loaded before anything else.
191
- require 'vagrant/version'
192
- Vagrant::Plugin.load!
@@ -20,6 +20,7 @@ module Vagrant
20
20
  end
21
21
 
22
22
  module General
23
+ autoload :CheckVirtualbox, 'vagrant/action/general/check_virtualbox'
23
24
  autoload :Package, 'vagrant/action/general/package'
24
25
  autoload :Validate, 'vagrant/action/general/validate'
25
26
  end
@@ -20,6 +20,7 @@ module Vagrant
20
20
  # provision - Provisions a running VM
21
21
  register(:provision) do
22
22
  Builder.new do
23
+ use General::CheckVirtualbox
23
24
  use General::Validate
24
25
  use VM::CheckAccessible
25
26
  use VM::Provision
@@ -30,6 +31,7 @@ module Vagrant
30
31
  # environment.
31
32
  register(:start) do
32
33
  Builder.new do
34
+ use General::CheckVirtualbox
33
35
  use General::Validate
34
36
  use VM::CheckAccessible
35
37
  use VM::CleanMachineFolder
@@ -53,6 +55,7 @@ module Vagrant
53
55
  # a restart if fails.
54
56
  register(:halt) do
55
57
  Builder.new do
58
+ use General::CheckVirtualbox
56
59
  use General::Validate
57
60
  use VM::CheckAccessible
58
61
  use VM::DiscardState
@@ -63,6 +66,7 @@ module Vagrant
63
66
  # suspend - Suspends the VM
64
67
  register(:suspend) do
65
68
  Builder.new do
69
+ use General::CheckVirtualbox
66
70
  use General::Validate
67
71
  use VM::CheckAccessible
68
72
  use VM::Suspend
@@ -72,6 +76,7 @@ module Vagrant
72
76
  # resume - Resume a VM
73
77
  register(:resume) do
74
78
  Builder.new do
79
+ use General::CheckVirtualbox
75
80
  use General::Validate
76
81
  use VM::CheckAccessible
77
82
  use VM::CheckPortCollisions
@@ -82,6 +87,7 @@ module Vagrant
82
87
  # reload - Halts then restarts the VM
83
88
  register(:reload) do
84
89
  Builder.new do
90
+ use General::CheckVirtualbox
85
91
  use General::Validate
86
92
  use VM::CheckAccessible
87
93
  use registry.get(:halt)
@@ -92,6 +98,7 @@ module Vagrant
92
98
  # up - Imports, prepares, then starts a fresh VM.
93
99
  register(:up) do
94
100
  Builder.new do
101
+ use General::CheckVirtualbox
95
102
  use General::Validate
96
103
  use VM::CheckAccessible
97
104
  use VM::CheckBox
@@ -106,6 +113,7 @@ module Vagrant
106
113
  # destroy - Halts, cleans up, and destroys an existing VM
107
114
  register(:destroy) do
108
115
  Builder.new do
116
+ use General::CheckVirtualbox
109
117
  use General::Validate
110
118
  use VM::CheckAccessible
111
119
  use registry.get(:halt), :force => true
@@ -120,6 +128,7 @@ module Vagrant
120
128
  # package - Export and package the VM
121
129
  register(:package) do
122
130
  Builder.new do
131
+ use General::CheckVirtualbox
123
132
  use General::Validate
124
133
  use VM::SetupPackageFiles
125
134
  use VM::CheckAccessible
@@ -135,6 +144,7 @@ module Vagrant
135
144
  # box_add - Download and add a box.
136
145
  register(:box_add) do
137
146
  Builder.new do
147
+ use General::CheckVirtualbox
138
148
  use Box::Download
139
149
  use Box::Unpackage
140
150
  use Box::Verify
@@ -0,0 +1,28 @@
1
+ module Vagrant
2
+ module Action
3
+ module General
4
+ # Checks that virtualbox is installed and ready to be used.
5
+ class CheckVirtualbox
6
+ def initialize(app, env)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ # Certain actions may not actually have a VM, and thus no
12
+ # driver, so we have to be clever about obtaining an instance
13
+ # of the driver.
14
+ driver = nil
15
+ driver = env[:vm].driver if env[:vm]
16
+ driver = Driver::VirtualBox.new(nil) if !driver
17
+
18
+ # Verify that it is ready to go! This will raise an exception
19
+ # if anything goes wrong.
20
+ driver.verify!
21
+
22
+ # Carry on.
23
+ @app.call(env)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -27,6 +27,7 @@ module Vagrant
27
27
  def call(env)
28
28
  @env = env
29
29
 
30
+ raise Errors::PackageOutputDirectory if File.directory?(tar_path)
30
31
  raise Errors::PackageOutputExists if File.exist?(tar_path)
31
32
  raise Errors::PackageRequiresDirectory if !env["package.directory"] ||
32
33
  !File.directory?(env["package.directory"])
@@ -37,12 +38,14 @@ module Vagrant
37
38
  end
38
39
 
39
40
  def recover(env)
40
- # Don't delete the tar_path if the error is that the output already
41
- # exists, since this will nuke the user's previous file.
42
- if !env["vagrant.error"].is_a?(Errors::PackageOutputExists)
43
- # Cleanup any packaged files if the packaging failed at some point.
44
- File.delete(tar_path) if File.exist?(tar_path)
45
- end
41
+ # There are certain exceptions that we don't delete the file for.
42
+ ignore_exc = [Errors::PackageOutputDirectory, Errors::PackageOutputExists]
43
+ ignore_exc.each do |exc|
44
+ return if env["vagrant.error"].is_a?(exc)
45
+ end
46
+
47
+ # Cleanup any packaged files if the packaging failed at some point.
48
+ File.delete(tar_path) if File.exist?(tar_path)
46
49
  end
47
50
 
48
51
  # This method copies the include files (passed in via command line)
@@ -90,7 +93,7 @@ module Vagrant
90
93
 
91
94
  # Path to the final box output file
92
95
  def tar_path
93
- File.join(FileUtils.pwd, @env["package.output"])
96
+ File.expand_path(@env["package.output"], FileUtils.pwd)
94
97
  end
95
98
  end
96
99
  end
@@ -6,12 +6,11 @@ module Vagrant
6
6
  class Validate
7
7
  def initialize(app, env)
8
8
  @app = app
9
- @env = env
10
9
  end
11
10
 
12
11
  def call(env)
13
- @env[:vm].config.validate!(@env[:vm].env) if !@env.has_key?("validate") || @env["validate"]
14
- @app.call(@env)
12
+ env[:vm].config.validate!(env[:vm].env) if !env.has_key?("validate") || env["validate"]
13
+ @app.call(env)
15
14
  end
16
15
  end
17
16
  end
@@ -15,7 +15,7 @@ module Vagrant
15
15
  customizations.each do |command|
16
16
  processed_command = command.collect do |arg|
17
17
  arg = env[:vm].uuid if arg == :id
18
- arg
18
+ arg.to_s
19
19
  end
20
20
 
21
21
  result = env[:vm].driver.execute_command(processed_command)
@@ -37,12 +37,9 @@ module Vagrant
37
37
  adapters << adapter
38
38
 
39
39
  # Get the network configuration
40
- if config[:auto_config]
41
- network = send("#{type}_network_config", config)
42
- networks << network
43
- else
44
- @logger.info("Auto config disabled, not configuring: #{type}")
45
- end
40
+ network = send("#{type}_network_config", config)
41
+ network[:_auto_config] = true if config[:auto_config]
42
+ networks << network
46
43
  end
47
44
 
48
45
  if !adapters.empty?
@@ -68,9 +65,11 @@ module Vagrant
68
65
  # Determine the interface numbers for the guest.
69
66
  assign_interface_numbers(networks, adapters)
70
67
 
71
- # Configure all the network interfaces on the guest.
68
+ # Configure all the network interfaces on the guest. We only
69
+ # want to configure the networks that have `auto_config` setup.
70
+ networks_to_configure = networks.select { |n| n[:_auto_config] }
72
71
  env[:ui].info I18n.t("vagrant.actions.vm.network.configuring")
73
- env[:vm].guest.configure_networks(networks)
72
+ env[:vm].guest.configure_networks(networks_to_configure)
74
73
  end
75
74
  end
76
75
 
@@ -253,7 +252,8 @@ module Vagrant
253
252
  :adapter => config[:adapter],
254
253
  :type => :hostonly,
255
254
  :hostonly => interface[:name],
256
- :mac_address => config[:mac]
255
+ :mac_address => config[:mac],
256
+ :nic_type => config[:nic_type]
257
257
  }
258
258
  end
259
259
 
@@ -309,6 +309,7 @@ module Vagrant
309
309
 
310
310
  def bridged_config(args)
311
311
  options = args[0] || {}
312
+ options = {} if !options.is_a?(Hash)
312
313
 
313
314
  return {
314
315
  :adapter => nil,
@@ -1,3 +1,4 @@
1
+ require 'digest/md5'
1
2
  require 'fileutils'
2
3
  require 'pathname'
3
4
 
@@ -93,6 +94,12 @@ module Vagrant
93
94
  opts[:map_gid] = prepare_permission(:gid, opts)
94
95
  opts[:nfs_version] ||= 3
95
96
 
97
+ # The poor man's UUID. An MD5 hash here is sufficient since
98
+ # we need a 32 character "uuid" to represent the filesystem
99
+ # of an export. Hashing the host path is safe because two of
100
+ # the same host path will hash to the same fsid.
101
+ opts[:uuid] = Digest::MD5.hexdigest(opts[:hostpath])
102
+
96
103
  acc[key] = opts
97
104
  acc
98
105
  end
@@ -8,6 +8,7 @@ module Vagrant
8
8
  autoload :BoxRepackage, 'vagrant/command/box_repackage'
9
9
  autoload :BoxList, 'vagrant/command/box_list'
10
10
  autoload :Destroy, 'vagrant/command/destroy'
11
+ autoload :Gem, 'vagrant/command/gem'
11
12
  autoload :Halt, 'vagrant/command/halt'
12
13
  autoload :Init, 'vagrant/command/init'
13
14
  autoload :Package, 'vagrant/command/package'
@@ -60,10 +60,13 @@ module Vagrant
60
60
  # @param [String] name The name of the VM. Nil if every VM.
61
61
  # @param [Boolean] single_target If true, then an exception will be
62
62
  # raised if more than one target is found.
63
- def with_target_vms(name=nil, single_target=false)
63
+ def with_target_vms(name=nil, options=nil)
64
64
  # Using VMs requires a Vagrant environment to be properly setup
65
65
  raise Errors::NoEnvironmentError if !@env.root_path
66
66
 
67
+ # Setup the options hash
68
+ options ||= {}
69
+
67
70
  # First determine the proper array of VMs.
68
71
  vms = []
69
72
  if name
@@ -89,7 +92,10 @@ module Vagrant
89
92
  end
90
93
 
91
94
  # Make sure we're only working with one VM if single target
92
- raise Errors::MultiVMTargetRequired if single_target && vms.length != 1
95
+ raise Errors::MultiVMTargetRequired if options[:single_target] && vms.length != 1
96
+
97
+ # If we asked for reversed ordering, then reverse it
98
+ vms.reverse! if options[:reverse]
93
99
 
94
100
  # Go through each VM and yield it!
95
101
  vms.each do |old_vm|
@@ -4,8 +4,15 @@ module Vagrant
4
4
  module Command
5
5
  class Destroy < Base
6
6
  def execute
7
+ options = {}
8
+
7
9
  opts = OptionParser.new do |opts|
8
10
  opts.banner = "Usage: vagrant destroy [vm-name]"
11
+ opts.separator ""
12
+
13
+ opts.on("-f", "--force", "Destroy without confirmation.") do |f|
14
+ options[:force] = f
15
+ end
9
16
  end
10
17
 
11
18
  # Parse the options
@@ -13,10 +20,29 @@ module Vagrant
13
20
  return if !argv
14
21
 
15
22
  @logger.debug("'Destroy' each target VM...")
16
- with_target_vms(argv[0]) do |vm|
23
+ with_target_vms(argv[0], :reverse => true) do |vm|
17
24
  if vm.created?
18
- @logger.info("Destroying: #{vm.name}")
19
- vm.destroy
25
+ # Boolean whether we should actually go through with the destroy
26
+ # or not. This is true only if the "--force" flag is set or if the
27
+ # user confirms it.
28
+ do_destroy = false
29
+
30
+ if options[:force]
31
+ do_destroy = true
32
+ else
33
+ choice = @env.ui.ask(I18n.t("vagrant.commands.destroy.confirmation",
34
+ :name => vm.name))
35
+ do_destroy = choice.upcase == "Y"
36
+ end
37
+
38
+ if do_destroy
39
+ @logger.info("Destroying: #{vm.name}")
40
+ vm.destroy
41
+ else
42
+ @logger.info("Not destroying #{vm.name} since confirmation was declined.")
43
+ @env.ui.success(I18n.t("vagrant.commands.destroy.will_not_destroy",
44
+ :name => vm.name), :prefix => false)
45
+ end
20
46
  else
21
47
  @logger.info("Not destroying #{vm.name}, since it isn't created.")
22
48
  vm.ui.info I18n.t("vagrant.commands.common.vm_not_created")
@@ -0,0 +1,35 @@
1
+ require "rubygems"
2
+ require "rubygems/gem_runner"
3
+
4
+ module Vagrant
5
+ module Command
6
+ class Gem < Base
7
+ def execute
8
+ # Bundler sets up its own custom gem load paths such that our
9
+ # own gems are never loaded. Therefore, give an error if a user
10
+ # tries to install gems while within a Bundler-managed environment.
11
+ if defined?(Bundler)
12
+ require 'bundler/shared_helpers'
13
+ if Bundler::SharedHelpers.in_bundle?
14
+ raise Errors::GemCommandInBundler
15
+ end
16
+ end
17
+
18
+ # If the user needs some help, we add our own little message at the
19
+ # top so that they're aware of what `vagrant gem` is doing, really.
20
+ if @argv.empty? || @argv.include?("-h") || @argv.include?("--help")
21
+ @env.ui.info(I18n.t("vagrant.commands.gem.help_preamble"),
22
+ :prefix => false)
23
+ puts
24
+ end
25
+
26
+ # We just proxy the arguments onto a real RubyGems command
27
+ # but change `GEM_HOME` so that the gems are installed into
28
+ # our own private gem folder.
29
+ ENV["GEM_HOME"] = @env.gems_path.to_s
30
+ ::Gem.clear_paths
31
+ ::Gem::GemRunner.new.run(@argv.dup)
32
+ end
33
+ end
34
+ end
35
+ end