vagrant-exec 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fdf97359b08da7aecc1cec47589bf02aaa36d376
4
- data.tar.gz: af4fed40dc6b5ca851aec0a382a58c4fc8457943
3
+ metadata.gz: a3a198b905f07055f13866e6362600566d379f33
4
+ data.tar.gz: 804b8f85d3c87f30ca0e82e53e3c2d60d91e023d
5
5
  SHA512:
6
- metadata.gz: 834d0241290326ca7fa9a458956ff1e2a748ea1b48919c8a0f1ae6197e554c299d3de2c58cd0e0745048d7ca125e74d2a2b57847ab5d280e8a633744eaac290f
7
- data.tar.gz: 990ed319f29140ec6e523552dd770e5f3a2514ea4938889918e13f76126b0e2d94879fcce5d247f810fdfc656862bab1406aa5f1b894d4b16ee680d9afcdf870
6
+ metadata.gz: 0e6fe2bc7f19ecd536ab49942acbb7436ccebb674767e8e45aa02ec4f5fd9e2d1f37e35d12bd9075c4c4ef0cbe184109e34a7ccfde28ab04c9383acea8004ea4
7
+ data.tar.gz: e2dc1c0bd0f76c223fcb1b8af329b647d2db88d7828210d720c1225b6971ee500fe43fb45208cbc9b48aff7124553303c4ee6071f403653766c4a36eddcc5e45
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ /pkg/
2
+ /tmp/
3
+ /.bundle/
4
+ /vendor/bundle/
5
+ Gemfile.lock
6
+ results.html
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Alex Rodionov
1
+ Copyright (c) 2013-2104 Alex Rodionov
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -8,99 +8,100 @@ Description
8
8
 
9
9
  You will probably use the plugin if you don't want to SSH into the box to execute commands simply because your machine environment is already configured (e.g. I use ZSH and TextMate bundles to run specs/features).
10
10
 
11
- Example
12
- -------
11
+ Installation
12
+ ------------
13
13
 
14
14
  ```bash
15
- ➜ vagrant exec pwd
16
- /vagrant
15
+ ➜ vagrant plugin install vagrant-exec
17
16
  ```
18
17
 
19
- Installation
20
- ------------
18
+ Example
19
+ -------
21
20
 
22
21
  ```bash
23
- ➜ vagrant plugin install vagrant-exec
22
+ ➜ vagrant exec pwd
23
+ /vagrant
24
24
  ```
25
25
 
26
26
  Configuration
27
27
  -------------
28
28
 
29
- ### Custom root
30
-
31
- The root directory can be configured using Vagrantfile.
29
+ vagrant-exec has only one configuration option for Vagrantfile, which allows you to alter the behavior of all or specific commands.
32
30
 
33
31
  ```ruby
34
32
  Vagrant.configure('2') do |config|
35
33
  config.vm.box = 'precise32'
36
- config.exec.root = '/custom'
34
+ config.exec.commands '*', directory: '/tmp'
37
35
  end
38
36
  ```
39
37
 
40
- ```bash
41
- ➜ vagrant exec pwd
42
- # is the same as
43
- vagrant ssh -c "cd /custom && bundle exec pwd"
44
- ```
38
+ Commands can either be:
39
+
40
+ * `"*"` (wildcard) - apply options to all the commands
41
+ * `"command"` (string) - apply options for specific commands
42
+ * `%w(command1 command2)` (array) - apply options to all commands in array
45
43
 
46
- ### Prepend with
44
+ Configuration options are merged, so if you specify single command in several places, all the option will be applied. The only exception is `:directory`, which is applied only once and in reverse order (i.e. the last set is used).
47
45
 
48
- You can tell `vagrant-exec` to prepend all the commands with custom string.
46
+ ### Directory
49
47
 
50
48
  ```ruby
51
49
  Vagrant.configure('2') do |config|
52
50
  config.vm.box = 'precise32'
53
- config.exec.prepend_with 'bundle exec'
54
- end
55
- ```
56
51
 
57
- ```bash
58
- ➜ vagrant exec pwd
59
- # is the same as
60
- ➜ vagrant ssh -c "cd /vagrant && bundle exec pwd"
52
+ # Make /tmp working directory for all the commands:
53
+ # ➜ vagrant exec pwd
54
+ # # is the same as
55
+ # ➜ vagrant ssh -c "cd /tmp && pwd"
56
+ config.exec.commands '*', directory: '/tmp'
57
+
58
+ # Make /etc working directory for env command:
59
+ # ➜ vagrant exec env
60
+ # # is the same as
61
+ # ➜ vagrant ssh -c "cd /etc && env"
62
+ config.exec.commands '*', directory: '/etc'
63
+ end
61
64
  ```
62
65
 
63
- You can also limit prepend to specific commands and combine them.
66
+ ### Prepend
64
67
 
65
68
  ```ruby
66
69
  Vagrant.configure('2') do |config|
67
70
  config.vm.box = 'precise32'
68
- config.exec.prepend_with 'bundle exec', :only => %w(rails rspec cucumber)
69
- config.exec.prepend_with 'rvmsudo', :only => %w(gem)
70
- end
71
- ```
72
-
73
- ```bash
74
- ➜ vagrant exec rails c
75
- # is the same as
76
- ➜ vagrant ssh -c "cd /vagrant && bundle exec rails c"
77
- ```
78
71
 
79
- ```bash
80
- ➜ vagrant exec gem install bundler
81
- # is the same as
82
- ➜ vagrant ssh -c "cd /vagrant && rvmsudo gem install bundler"
72
+ # Automatically prepend apt-get command with sudo:
73
+ # ➜ vagrant exec apt-get install htop
74
+ # # is the same as
75
+ # ➜ vagrant ssh -c "cd /vagrant && sudo apt-get install htop"
76
+ config.exec.commands 'apt-get', prepend: 'sudo'
77
+
78
+ # Automatically prepend rails and rspec commands with bundle exec:
79
+ # ➜ vagrant exec rails c
80
+ # # is the same as
81
+ # ➜ vagrant ssh -c "cd /vagrant && bundle exec rails c"
82
+ #
83
+ # ➜ vagrant exec rspec spec/
84
+ # # is the same as
85
+ # ➜ vagrant ssh -c "cd /vagrant && bundle exec rspec spec/"
86
+ config.exec.commands %w(rails rspec), prepend: 'bundle exec'
87
+ end
83
88
  ```
84
89
 
85
90
  ### Environment variables
86
91
 
87
- You can add environment variables to be exported before.
88
-
89
92
  ```ruby
90
93
  Vagrant.configure('2') do |config|
91
94
  config.vm.box = 'precise32'
92
- config.exec.env['RAILS_ENV'] = 'test'
93
- config.exec.env['RAILS_ROOT'] = '/vagrant'
94
- end
95
- ```
96
95
 
97
- ```bash
98
- ➜ vagrant exec pwd
99
- # is the same as
100
- ➜ vagrant ssh -c "cd /vagrant && export RAILS_ENV=test && export RAILS_ROOT=/vagrant && pwd"
96
+ # Automatically export environment variables for ruby command:
97
+ # ➜ vagrant exec ruby -e 'puts 1'
98
+ # # is the same as
99
+ # ➜ vagrant ssh -c "cd /vagrant && export RUBY_GC_MALLOC_LIMIT=100000000 && ruby -e 'puts 1'"
100
+ config.exec.commands 'ruby', env: { 'RUBY_GC_MALLOC_LIMIT' => 100000000 }
101
+ end
101
102
  ```
102
103
 
103
- Acceptance tests
104
+ Testing
104
105
  ----------------
105
106
 
106
107
  Before running features, you'll need to bootstrap box.
@@ -138,4 +139,4 @@ Note on Patches/Pull Requests
138
139
  Copyright
139
140
  ---------
140
141
 
141
- Copyright (c) 2013-2013 Alex Rodionov. See LICENSE.md for details.
142
+ Copyright (c) 2013-2014 Alex Rodionov. See LICENSE.md for details.
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ namespace :features do
9
9
  end
10
10
 
11
11
  Cucumber::Rake::Task.new(:run) do |t|
12
- t.cucumber_opts = %w(--format pretty)
12
+ t.cucumber_opts = %w(--require feature --format pretty --format html --out results.html)
13
13
  end
14
14
 
15
15
  desc 'Removes testing vagrant box.'
@@ -1,13 +1,9 @@
1
1
  @no-clobber
2
2
  Feature: vagrant-exec
3
3
  In order to execute commands in Vagrant box
4
- Within context of root synced folder
4
+ Within context of synced folder
5
5
  As a developer using vagrant-exec plugin
6
6
  I want to use "vagrant exec" command
7
- And be able to customize folder
8
- And prepend commands with "bundle exec"
9
- And set exported environmental variables
10
- Using Vagrantfile configuration
11
7
 
12
8
  Background:
13
9
  Given I write to "Vagrantfile" with:
@@ -43,140 +39,3 @@ Feature: vagrant-exec
43
39
  | cwd -h |
44
40
  | cwd --blah |
45
41
  | "cwd -h blah -v blah" |
46
-
47
- Scenario: uses /vagrant as default root
48
- Given I run `bundle exec vagrant up`
49
- When I run `bundle exec vagrant exec pwd`
50
- Then the exit status should be 0
51
- And SHH subprocess should execute command "cd /vagrant && pwd"
52
-
53
- Scenario: can use custom root
54
- Given I overwrite "Vagrantfile" with:
55
- """
56
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
57
- require 'vagrant-exec'
58
-
59
- Vagrant.configure('2') do |config|
60
- config.vm.box = 'vagrant_exec'
61
- config.exec.root = '/tmp'
62
- end
63
- """
64
- And I run `bundle exec vagrant up`
65
- When I run `bundle exec vagrant exec pwd`
66
- Then the exit status should be 0
67
- And SHH subprocess should execute command "cd /tmp && pwd"
68
-
69
- Scenario: raises error if root is improperly set
70
- Given I overwrite "Vagrantfile" with:
71
- """
72
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
73
- require 'vagrant-exec'
74
-
75
- Vagrant.configure('2') do |config|
76
- config.vm.box = 'vagrant_exec'
77
- config.exec.root = true
78
- end
79
- """
80
- And I run `bundle exec vagrant up`
81
- Then the exit status should not be 0
82
- And the output should contain "root should be a string"
83
-
84
- Scenario: can prepend all commands
85
- Given I overwrite "Vagrantfile" with:
86
- """
87
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
88
- require 'vagrant-exec'
89
-
90
- Vagrant.configure('2') do |config|
91
- config.vm.box = 'vagrant_exec'
92
- config.exec.prepend_with 'echo vagrant-exec &&'
93
- end
94
- """
95
- And I run `bundle exec vagrant up`
96
- When I run `bundle exec vagrant exec pwd`
97
- Then the exit status should be 0
98
- And SHH subprocess should execute command "cd /vagrant && echo vagrant-exec && pwd"
99
-
100
- Scenario: can prepend only specific commands
101
- Given I overwrite "Vagrantfile" with:
102
- """
103
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
104
- require 'vagrant-exec'
105
-
106
- Vagrant.configure('2') do |config|
107
- config.vm.box = 'vagrant_exec'
108
- config.exec.prepend_with 'echo vagrant-exec &&', :only => %w(pwd echo)
109
- end
110
- """
111
- And I run `bundle exec vagrant up`
112
- When I run `bundle exec vagrant exec pwd`
113
- Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec && pwd"
114
- When I run `bundle exec vagrant exec echo 1`
115
- Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec && echo 1"
116
- When I run `bundle exec vagrant exec env`
117
- Then SHH subprocess should execute command "cd /vagrant && env"
118
-
119
- Scenario: can use prepend multiple times
120
- Given I overwrite "Vagrantfile" with:
121
- """
122
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
123
- require 'vagrant-exec'
124
-
125
- Vagrant.configure('2') do |config|
126
- config.vm.box = 'vagrant_exec'
127
- config.exec.prepend_with 'echo vagrant-exec1 &&', :only => %w(pwd)
128
- config.exec.prepend_with 'echo vagrant-exec2 &&', :only => %w(echo)
129
- end
130
- """
131
- And I run `bundle exec vagrant up`
132
- When I run `bundle exec vagrant exec pwd`
133
- Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec1 && pwd"
134
- When I run `bundle exec vagrant exec echo 1`
135
- Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec2 && echo 1"
136
-
137
- Scenario: raises error if prepend command is improperly set
138
- Given I overwrite "Vagrantfile" with:
139
- """
140
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
141
- require 'vagrant-exec'
142
-
143
- Vagrant.configure('2') do |config|
144
- config.vm.box = 'vagrant_exec'
145
- config.exec.prepend_with :test
146
- end
147
- """
148
- When I run `bundle exec vagrant up`
149
- Then the exit status should not be 0
150
- And the output should contain "prepend_with command should be a string"
151
-
152
- Scenario: raises error if prepend only is improperly set
153
- Given I overwrite "Vagrantfile" with:
154
- """
155
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
156
- require 'vagrant-exec'
157
-
158
- Vagrant.configure('2') do |config|
159
- config.vm.box = 'vagrant_exec'
160
- config.exec.prepend_with 'echo vagrant-exec1 &&', :only => 'test'
161
- end
162
- """
163
- And I run `bundle exec vagrant up`
164
- Then the exit status should not be 0
165
- And the output should contain "prepend_with :only should be an array"
166
-
167
- Scenario: can export environment variables
168
- Given I overwrite "Vagrantfile" with:
169
- """
170
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
171
- require 'vagrant-exec'
172
-
173
- Vagrant.configure('2') do |config|
174
- config.vm.box = 'vagrant_exec'
175
- config.exec.env['TEST1'] = true
176
- config.exec.env['TEST2'] = false
177
- end
178
- """
179
- And I run `bundle exec vagrant up`
180
- When I run `bundle exec vagrant exec pwd`
181
- Then the exit status should be 0
182
- And SHH subprocess should execute command "cd /vagrant && export TEST1=true && export TEST2=false && pwd"
@@ -0,0 +1,55 @@
1
+ @no-clobber
2
+ Feature: vagrant-exec directory
3
+ In order to change the working directory
4
+ For commands I execute using vagrant-exec
5
+ As a user
6
+ I should be able to specify it in Vagrantfile
7
+
8
+ Scenario: uses /vagrant as default directory
9
+ Given I write to "Vagrantfile" with:
10
+ """
11
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
12
+ require 'vagrant-exec'
13
+
14
+ Vagrant.configure('2') do |config|
15
+ config.vm.box = 'vagrant_exec'
16
+ end
17
+ """
18
+ Given I run `bundle exec vagrant up`
19
+ When I run `bundle exec vagrant exec pwd`
20
+ Then the exit status should be 0
21
+ And SHH subprocess should execute command "cd /vagrant && pwd"
22
+
23
+ Scenario: can use custom directory for all commands
24
+ Given I write to "Vagrantfile" with:
25
+ """
26
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
27
+ require 'vagrant-exec'
28
+
29
+ Vagrant.configure('2') do |config|
30
+ config.vm.box = 'vagrant_exec'
31
+ config.exec.commands '*', directory: '/tmp'
32
+ end
33
+ """
34
+ And I run `bundle exec vagrant up`
35
+ When I run `bundle exec vagrant exec pwd`
36
+ Then the exit status should be 0
37
+ And SHH subprocess should execute command "cd /tmp && pwd"
38
+
39
+ Scenario: can use custom directory for specific commands
40
+ Given I write to "Vagrantfile" with:
41
+ """
42
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
43
+ require 'vagrant-exec'
44
+
45
+ Vagrant.configure('2') do |config|
46
+ config.vm.box = 'vagrant_exec'
47
+ config.exec.commands %w(pwd echo), directory: '/tmp'
48
+ end
49
+ """
50
+ And I run `bundle exec vagrant up`
51
+ When I run `bundle exec vagrant exec echo 1`
52
+ Then SHH subprocess should execute command "cd /tmp && echo 1"
53
+ When I run `bundle exec vagrant exec env`
54
+ Then SHH subprocess should execute command "cd /vagrant && env"
55
+
@@ -0,0 +1,65 @@
1
+ @no-clobber
2
+ Feature: vagrant-exec environment variables
3
+ In order to automatically set environment variables
4
+ For commands I execute using vagrant-exec
5
+ As a user
6
+ I should be able to specify them in Vagrantfile
7
+
8
+ Scenario: can export environment variables for all commands
9
+ Given I write to "Vagrantfile" with:
10
+ """
11
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
12
+ require 'vagrant-exec'
13
+
14
+ Vagrant.configure('2') do |config|
15
+ config.vm.box = 'vagrant_exec'
16
+ config.exec.commands '*', env: { 'TEST1' => true, 'TEST2' => false }
17
+ end
18
+ """
19
+ And I run `bundle exec vagrant up`
20
+ When I run `bundle exec vagrant exec pwd`
21
+ Then the exit status should be 0
22
+ And SHH subprocess should execute command "cd /vagrant && export TEST1=true && export TEST2=false && pwd"
23
+
24
+ Scenario: can export environment variables for specific commands
25
+ Given I write to "Vagrantfile" with:
26
+ """
27
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
28
+ require 'vagrant-exec'
29
+
30
+ Vagrant.configure('2') do |config|
31
+ config.vm.box = 'vagrant_exec'
32
+ config.exec.commands 'cmd', env: { 'TEST1' => 'yo' }
33
+ config.exec.commands %w(pwd echo), env: { 'TEST2' => true, 'TEST3' => false }
34
+ end
35
+ """
36
+ And I run `bundle exec vagrant up`
37
+ When I run `bundle exec vagrant exec cmd`
38
+ Then SHH subprocess should execute command "cd /vagrant && export TEST1=yo && cmd"
39
+ When I run `bundle exec vagrant exec pwd`
40
+ Then SHH subprocess should execute command "cd /vagrant && export TEST2=true && export TEST3=false && pwd"
41
+ When I run `bundle exec vagrant exec echo 1`
42
+ Then SHH subprocess should execute command "cd /vagrant && export TEST2=true && export TEST3=false && echo 1"
43
+ When I run `bundle exec vagrant exec env`
44
+ Then SHH subprocess should execute command "cd /vagrant && env"
45
+
46
+ Scenario: can combine environment variables
47
+ Given I write to "Vagrantfile" with:
48
+ """
49
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
50
+ require 'vagrant-exec'
51
+
52
+ Vagrant.configure('2') do |config|
53
+ config.vm.box = 'vagrant_exec'
54
+ config.exec.commands '*', env: { 'TEST1' => true }
55
+ config.exec.commands 'pwd', env: { 'TEST2' => false }
56
+ config.exec.commands %w(pwd echo), env: { 'TEST3' => false }
57
+ end
58
+ """
59
+ And I run `bundle exec vagrant up`
60
+ When I run `bundle exec vagrant exec pwd`
61
+ Then SHH subprocess should execute command "cd /vagrant && export TEST1=true && export TEST2=false && export TEST3=false && pwd"
62
+ When I run `bundle exec vagrant exec echo 1`
63
+ Then SHH subprocess should execute command "cd /vagrant && export TEST1=true && export TEST3=false && echo 1"
64
+ When I run `bundle exec vagrant exec env`
65
+ Then SHH subprocess should execute command "cd /vagrant && export TEST1=true && env"
@@ -0,0 +1,66 @@
1
+ @no-clobber
2
+ Feature: vagrant-exec prepend
3
+ In order to automatically prepend with custom command
4
+ Commands I execute using vagrant-exec
5
+ As a user
6
+ I should be able to specify it in Vagrantfile
7
+
8
+ Scenario: can prepend all commands
9
+ Given I write to "Vagrantfile" with:
10
+ """
11
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
12
+ require 'vagrant-exec'
13
+
14
+ Vagrant.configure('2') do |config|
15
+ config.vm.box = 'vagrant_exec'
16
+ config.exec.commands '*', prepend: 'echo vagrant-exec &&'
17
+ end
18
+ """
19
+ And I run `bundle exec vagrant up`
20
+ When I run `bundle exec vagrant exec pwd`
21
+ Then the exit status should be 0
22
+ And SHH subprocess should execute command "cd /vagrant && echo vagrant-exec && pwd"
23
+
24
+ Scenario: can prepend specific commands
25
+ Given I write to "Vagrantfile" with:
26
+ """
27
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
28
+ require 'vagrant-exec'
29
+
30
+ Vagrant.configure('2') do |config|
31
+ config.vm.box = 'vagrant_exec'
32
+ config.exec.commands 'cmd', prepend: 'echo vagrant-exec1 &&'
33
+ config.exec.commands %w(pwd echo), prepend: 'echo vagrant-exec2 &&'
34
+ end
35
+ """
36
+ And I run `bundle exec vagrant up`
37
+ When I run `bundle exec vagrant exec cmd`
38
+ Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec1 && cmd"
39
+ When I run `bundle exec vagrant exec pwd`
40
+ Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec2 && pwd"
41
+ When I run `bundle exec vagrant exec echo 1`
42
+ Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec2 && echo 1"
43
+ When I run `bundle exec vagrant exec env`
44
+ Then SHH subprocess should execute command "cd /vagrant && env"
45
+
46
+ Scenario: can combine prepended
47
+ Given I write to "Vagrantfile" with:
48
+ """
49
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
50
+ require 'vagrant-exec'
51
+
52
+ Vagrant.configure('2') do |config|
53
+ config.vm.box = 'vagrant_exec'
54
+ config.exec.commands '*', prepend: 'echo vagrant-exec1 &&'
55
+ config.exec.commands 'pwd', prepend: 'echo vagrant-exec2 &&'
56
+ config.exec.commands %w(pwd echo), prepend: 'echo vagrant-exec3 &&'
57
+ end
58
+ """
59
+ And I run `bundle exec vagrant up`
60
+ When I run `bundle exec vagrant exec pwd`
61
+ Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec1 && echo vagrant-exec2 && echo vagrant-exec3 && pwd"
62
+ When I run `bundle exec vagrant exec echo 1`
63
+ Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec1 && echo vagrant-exec3 && echo 1"
64
+ When I run `bundle exec vagrant exec env`
65
+ Then SHH subprocess should execute command "cd /vagrant && echo vagrant-exec1 && env"
66
+
@@ -0,0 +1,37 @@
1
+ @no-clobber
2
+ Feature: vagrant-exec validations
3
+ In order to avoid configuration mistakes for vagrant-exec commands
4
+ As a user
5
+ I should see proper validation errors
6
+
7
+ Background:
8
+ Given I write to "Vagrantfile" with:
9
+ """
10
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
11
+ require 'vagrant-exec'
12
+
13
+ Vagrant.configure('2') do |config|
14
+ config.vm.box = 'vagrant_exec'
15
+ config.exec.commands true, directory: nil, prepend: true, env: 0
16
+ end
17
+ """
18
+
19
+ Scenario: raises error if command is not string or array of strings
20
+ When I run `bundle exec vagrant up`
21
+ Then the exit status should not be 0
22
+ And the output should contain "Commands should be String or Array<String>, received: true"
23
+
24
+ Scenario: raises error if directory is improperly set
25
+ When I run `bundle exec vagrant up`
26
+ Then the exit status should not be 0
27
+ And the output should contain ":directory should be String, received: nil"
28
+
29
+ Scenario: raises error if prepend is improperly set
30
+ When I run `bundle exec vagrant up`
31
+ Then the exit status should not be 0
32
+ And the output should contain ":prepend should be String, received: true"
33
+
34
+ Scenario: raises error if environment variables are improperly set
35
+ When I run `bundle exec vagrant up`
36
+ Then the exit status should not be 0
37
+ And the output should contain ":env should be Hash, received: 0"
@@ -3,7 +3,7 @@ module VagrantPlugins
3
3
  class Command < Vagrant.plugin(2, :command)
4
4
 
5
5
  def self.synopsis
6
- 'proxies command to VM synced folder root'
6
+ 'executes commands in virtual machine'
7
7
  end
8
8
 
9
9
  def execute
@@ -12,19 +12,34 @@ module VagrantPlugins
12
12
 
13
13
  # Execute the actual SSH
14
14
  with_target_vms(nil, single_target: true) do |vm|
15
- vm.config.exec.finalize! # TODO: do we have to call it explicitly?
15
+ settings = vm.config.exec._parsed_commands
16
+ passed_command, constructed_command = cmd.dup, ''
16
17
 
17
- plain = cmd.dup
18
- plain << ' ' << cmd_args.join(' ') unless cmd_args.empty?
18
+ # directory is applied only once
19
+ settings.reverse.each do |command|
20
+ cmd, opts = command[:cmd], command[:opts]
19
21
 
20
- command = "cd #{vm.config.exec.root} && "
21
- command << add_env(vm.config.exec.env)
22
- command << prepend_command(vm.config.exec.prepends, plain)
23
- command << plain
22
+ if command_matches?(cmd, passed_command) && !directory_added?
23
+ constructed_command << add_directory(opts[:directory])
24
+ end
25
+ end
26
+
27
+ # apply options
28
+ settings.each do |command|
29
+ cmd, opts = command[:cmd], command[:opts]
30
+
31
+ if command_matches?(cmd, passed_command)
32
+ constructed_command << add_env(opts[:env])
33
+ constructed_command << add_prepend(opts[:prepend])
34
+ end
35
+ end
24
36
 
25
- @logger.info("Executing single command on remote machine: #{command}")
37
+ constructed_command << passed_command
38
+ constructed_command << ' ' << cmd_args.join(' ') if cmd_args.any?
39
+
40
+ @logger.info("Executing single command on remote machine: #{constructed_command}")
26
41
  ssh_opts = { extra_args: ['-q'] } # make it quiet
27
- env = vm.action(:ssh_run, ssh_run_command: command, ssh_opts: ssh_opts)
42
+ env = vm.action(:ssh_run, ssh_run_command: constructed_command, ssh_opts: ssh_opts)
28
43
 
29
44
  status = env[:ssh_run_exit_status] || 0
30
45
  return status
@@ -59,26 +74,37 @@ module VagrantPlugins
59
74
  return cmd, cmd_args
60
75
  end
61
76
 
77
+ def add_directory(directory)
78
+ ''.tap do |str|
79
+ if directory
80
+ str << "cd #{directory} && "
81
+ @directory_added = true
82
+ end
83
+ end
84
+ end
85
+
62
86
  def add_env(env)
63
- ''.tap do |cmd|
87
+ ''.tap do |str|
64
88
  env.each do |key, value|
65
- cmd << "export #{key}=#{value} && "
66
- end if env.any?
89
+ str << "export #{key}=#{value} && "
90
+ end if env
67
91
  end
68
92
  end
69
93
 
70
- def prepend_command(prepends, command)
71
- bin = command.split(' ').first
72
- ''.tap do |cmd|
73
- prepends.each do |prep|
74
- if !prep[:only] || prep[:only].include?(bin)
75
- prep = prep[:command].strip # remove trailing space
76
- cmd << "#{prep} "
77
- end
78
- end if prepends.any?
94
+ def add_prepend(prep)
95
+ ''.tap do |str|
96
+ str << "#{prep.strip} " if prep
79
97
  end
80
98
  end
81
99
 
100
+ def command_matches?(expected, actual)
101
+ expected =='*' || expected == actual || expected.include?(actual)
102
+ end
103
+
104
+ def directory_added?
105
+ !!@directory_added
106
+ end
107
+
82
108
  end # Command
83
109
  end # Exec
84
110
  end # VagrantPlugins
@@ -2,41 +2,79 @@ module VagrantPlugins
2
2
  module Exec
3
3
  class Config < Vagrant.plugin(2, :config)
4
4
 
5
- attr_reader :env
6
- attr_accessor :root
5
+ DEFAULT_SETTINGS = {
6
+ cmd: '*',
7
+ opts: {
8
+ directory: '/vagrant'
9
+ }
10
+ }.freeze
7
11
 
8
12
  def initialize
9
- @env = {}
10
- @prepend_with = UNSET_VALUE
11
- @root = UNSET_VALUE
13
+ @commands = UNSET_VALUE
12
14
  end
13
15
 
14
- def prepend_with(command, opts = {})
15
- @prepend_with = [] if @prepend_with == UNSET_VALUE
16
- @prepend_with << { :command => command }.merge(opts)
17
- end
18
-
19
- def prepends
20
- @prepend_with
16
+ #
17
+ # Configures commands.
18
+ #
19
+ # @param cmd [String, Array<String>]
20
+ # @param opts [Hash]
21
+ # @option opts [String] :directory Directory to execute commands in
22
+ # @option opts [String] :prepend Command to prepend with
23
+ # @option opts [Hash] :env Environmental variables to export
24
+ #
25
+ def commands(cmd, opts = {})
26
+ @commands = [] if @commands == UNSET_VALUE
27
+ @commands << { cmd: cmd, opts: opts }
21
28
  end
22
29
 
23
30
  def validate(_)
24
- return { 'exec' => ['root should be a string'] } unless @root.is_a?(String)
25
- if @prepend_with.any?
26
- if !@prepend_with.all? { |p| p[:command].is_a?(String) }
27
- return { 'exec' => ['prepend_with command should be a string'] }
31
+ finalize!
32
+ errors = _detected_errors
33
+
34
+ @commands.each do |command|
35
+ cmd, opts = command[:cmd], command[:opts]
36
+
37
+ if !cmd.is_a?(String) && !array_of_strings?(cmd)
38
+ errors << "Commands should be String or Array<String>, received: #{cmd.inspect}"
28
39
  end
29
- if !@prepend_with.all? { |p| !p[:only] || p[:only].is_a?(Array) }
30
- return { 'exec' => ['prepend_with :only should be an array'] }
40
+
41
+ if opts.has_key?(:directory) && !opts[:directory].is_a?(String)
42
+ errors << ":directory should be String, received: #{opts[:directory].inspect}"
43
+ end
44
+
45
+ if opts.has_key?(:prepend) && !opts[:prepend].is_a?(String)
46
+ errors << ":prepend should be String, received: #{opts[:prepend].inspect}"
47
+ end
48
+
49
+ if opts.has_key?(:env) && !opts[:env].is_a?(Hash)
50
+ errors << ":env should be Hash, received: #{opts[:env].inspect}"
31
51
  end
32
52
  end
33
53
 
34
- {}
54
+ { 'exec' => errors }
35
55
  end
36
56
 
37
57
  def finalize!
38
- @root = '/vagrant' if @root == UNSET_VALUE
39
- @prepend_with = [] if @prepend_with == UNSET_VALUE
58
+ if @commands == UNSET_VALUE
59
+ @commands = [DEFAULT_SETTINGS.dup]
60
+ else
61
+ # add default settings and merge options for splat
62
+ splats, commands = @commands.partition { |command| command[:cmd] == '*' }
63
+ commands.unshift(DEFAULT_SETTINGS.dup)
64
+ splats.each { |splat| commands.first[:opts].merge!(splat[:opts]) }
65
+ @commands = commands
66
+ end
67
+ end
68
+
69
+ # @api private
70
+ def _parsed_commands
71
+ @commands
72
+ end
73
+
74
+ private
75
+
76
+ def array_of_strings?(array)
77
+ array.is_a?(Array) && array.all? { |i| i.is_a?(String) }
40
78
  end
41
79
 
42
80
  end # Config
@@ -1,7 +1,7 @@
1
1
  module VagrantPlugins
2
2
  module Exec
3
3
 
4
- VERSION = '0.3.1'
4
+ VERSION = '0.4.0'
5
5
 
6
6
  end # Exec
7
7
  end # VagrantPlugins
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-exec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Rodionov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-13 00:00:00.000000000 Z
11
+ date: 2014-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aruba
@@ -44,6 +44,7 @@ executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
+ - ".gitignore"
47
48
  - Gemfile
48
49
  - LICENSE.md
49
50
  - README.md
@@ -51,6 +52,10 @@ files:
51
52
  - features/step_definitions/steps.rb
52
53
  - features/support/env.rb
53
54
  - features/vagrant-exec.feature
55
+ - features/vagrant-exec/directory.feature
56
+ - features/vagrant-exec/environment_variables.feature
57
+ - features/vagrant-exec/prepend.feature
58
+ - features/vagrant-exec/validations.feature
54
59
  - lib/vagrant-exec.rb
55
60
  - lib/vagrant-exec/command.rb
56
61
  - lib/vagrant-exec/config.rb
@@ -85,3 +90,7 @@ test_files:
85
90
  - features/step_definitions/steps.rb
86
91
  - features/support/env.rb
87
92
  - features/vagrant-exec.feature
93
+ - features/vagrant-exec/directory.feature
94
+ - features/vagrant-exec/environment_variables.feature
95
+ - features/vagrant-exec/prepend.feature
96
+ - features/vagrant-exec/validations.feature