vagrant-mirror 0.1.0.alpha

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 ADDED
@@ -0,0 +1,17 @@
1
+ # rcov generated
2
+ coverage
3
+ coverage.data
4
+
5
+ # rdoc generated
6
+ rdoc
7
+
8
+ # yard generated
9
+ doc
10
+ .yardoc
11
+
12
+ # bundler
13
+ .bundle
14
+
15
+ # jeweler generated
16
+ pkgtmp/
17
+ tmp/
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format documentation
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,43 @@
1
+ We love pull requests. Here's a quick guide:
2
+
3
+ 1. Fork the repo, and make your changes.
4
+
5
+ 2. Once you're ready to submit, rebase your branch against our master branch to
6
+ maintain a clean history and ensure you're up to date with all the most recent
7
+ changes.
8
+
9
+ 3. Run the tests. We only take pull requests with passing tests, and it's great
10
+ to know that you have a clean slate: `bundle && rake`
11
+
12
+ 4. Add a test for your change. Only refactoring and documentation changes
13
+ require no new tests. If you are adding functionality or fixing a bug, we need
14
+ a test!
15
+
16
+ 5. Make the test pass.
17
+
18
+ 6. Push to your fork and submit a pull request.
19
+
20
+
21
+ At this point you're waiting on us. We like to at least comment on, if not
22
+ accept, pull requests within three business days (and, typically, one business
23
+ day). We may suggest some changes or improvements or alternatives. Your pull request
24
+ will be built by [Travis](https://travis-ci.org/ingenerator/vagrant-mirror) first -
25
+ if the build fails please fix that first.
26
+
27
+ Some things that will increase the chance that your pull request is accepted,
28
+ taken straight from the Ruby on Rails guide:
29
+
30
+ * Include tests that fail without your code, and pass with it
31
+ * Update the documentation, the surrounding one, examples elsewhere, guides,
32
+ whatever is affected by your contribution
33
+
34
+ Syntax:
35
+
36
+ * Two spaces, no tabs.
37
+ * No trailing whitespace. Blank lines should not have any space.
38
+ * Prefer &&/|| over and/or.
39
+ * MyClass.my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
40
+ * a = b and not a=b.
41
+ * Follow the conventions you see used in the source already.
42
+
43
+ And in case we didn't emphasize it enough: we love tests!
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Dependencies specified in the gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem 'rb-inotify', :require => false
8
+ gem 'rb-fsevent', :require => false
9
+ gem 'rb-fchange', :require => false
10
+ gem 'wdm', :require => false, :platforms => [:mswin, :mingw]
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,85 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ vagrant-mirror (0.0.1)
5
+ listen
6
+ vagrant (~> 1.0.5)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ archive-tar-minitar (0.5.2)
12
+ childprocess (0.3.9)
13
+ ffi (~> 1.0, >= 1.0.11)
14
+ coderay (1.0.8)
15
+ diff-lcs (1.1.3)
16
+ erubis (2.7.0)
17
+ ffi (1.2.0)
18
+ ffi (1.2.0-x86-mingw32)
19
+ guard (1.6.1)
20
+ listen (>= 0.6.0)
21
+ lumberjack (>= 1.0.2)
22
+ pry (>= 0.9.10)
23
+ thor (>= 0.14.6)
24
+ guard-rspec (2.3.3)
25
+ guard (>= 1.1)
26
+ rspec (~> 2.11)
27
+ i18n (0.6.4)
28
+ json (1.7.7)
29
+ listen (0.7.0)
30
+ log4r (1.1.10)
31
+ lumberjack (1.0.2)
32
+ method_source (0.8.1)
33
+ net-scp (1.0.4)
34
+ net-ssh (>= 1.99.1)
35
+ net-ssh (2.2.2)
36
+ pry (0.9.10)
37
+ coderay (~> 1.0.5)
38
+ method_source (~> 0.8)
39
+ slop (~> 3.3.1)
40
+ pry (0.9.10-x86-mingw32)
41
+ coderay (~> 1.0.5)
42
+ method_source (~> 0.8)
43
+ slop (~> 3.3.1)
44
+ win32console (~> 1.3)
45
+ rake (10.0.3)
46
+ rb-fchange (0.0.6)
47
+ ffi
48
+ rb-fsevent (0.9.3)
49
+ rb-inotify (0.8.8)
50
+ ffi (>= 0.5.0)
51
+ rspec (2.12.0)
52
+ rspec-core (~> 2.12.0)
53
+ rspec-expectations (~> 2.12.0)
54
+ rspec-mocks (~> 2.12.0)
55
+ rspec-core (2.12.2)
56
+ rspec-expectations (2.12.1)
57
+ diff-lcs (~> 1.1.3)
58
+ rspec-mocks (2.12.1)
59
+ slop (3.3.3)
60
+ thor (0.16.0)
61
+ vagrant (1.0.7)
62
+ archive-tar-minitar (= 0.5.2)
63
+ childprocess (~> 0.3.1)
64
+ erubis (~> 2.7.0)
65
+ i18n (~> 0.6.0)
66
+ json (>= 1.5.1, < 1.8.0)
67
+ log4r (~> 1.1.9)
68
+ net-scp (~> 1.0.4)
69
+ net-ssh (~> 2.2.2)
70
+ wdm (0.1.0)
71
+ win32console (1.3.2-x86-mingw32)
72
+
73
+ PLATFORMS
74
+ x86-mingw32
75
+
76
+ DEPENDENCIES
77
+ guard
78
+ guard-rspec
79
+ rake
80
+ rb-fchange
81
+ rb-fsevent
82
+ rb-inotify
83
+ rspec
84
+ vagrant-mirror!
85
+ wdm
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/vagrant-mirror/(.+)\.rb$}) { |m| "spec/vagrant-mirror/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 inGenerator Ltd, a company registered in Scotland no. SC435161
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,153 @@
1
+ # Vagrant::Mirror
2
+
3
+ [![Build Status](https://travis-ci.org/ingenerator/vagrant-mirror.png)](https://travis-ci.org/ingenerator/vagrant-mirror)
4
+
5
+ **This plugin is for the 1.0.x series of Vagrant and has not been updated to work with 1.1 and
6
+ above. We plan to update it eventually, if you want it faster than that then contributions are
7
+ welcome!**
8
+
9
+ A vagrant plugin that mirrors a folder from host to guest, designed to get around the performance
10
+ issues of virtualbox shared folders and the headaches of NFS or Samba shares with a windows host and
11
+ linux guest. Tested with Windows XP and Vista hosts and Ubuntu 12.04 guest. However, it uses the
12
+ [listen](https://rubygems.org/gems/listen) gem from guard so it should be fully cross-platform. Your
13
+ guest will need to have rsync installed.
14
+
15
+ Vagrant-mirror runs on top of existing virtualbox shared folders, using rsync to mirror from the
16
+ shared folder to a local instance folder. This seems to be best for performance and limits the
17
+ number of dependencies.
18
+
19
+ ## Installation
20
+
21
+ The best option is to install the gem (note you will need to run `vagrant gem vagrant-mirror` if
22
+ using the bundled Vagrant package as this runs in isolation from your global ruby installation).
23
+
24
+ You also need to install the correct filesystem driver for your host operating system:
25
+
26
+ * For Windows - [WDM](https://github.com/Maher4Ever/wdm)
27
+ * For Linux - [rb-inotify](https://github.com/nex3/rb-inotify)
28
+ * For OS X - [rb-fsevent](https://github.com/thibaudgg/rb-fsevent)
29
+
30
+ Unfortunately there is currently no way to specify these as platform-specific dependencies in the
31
+ gemfile.
32
+
33
+ You can then add to your Vagrantfile like so:
34
+
35
+ ```ruby
36
+ require 'vagrant-mirror'
37
+
38
+ Vagrant::Config.run do | config |
39
+ #.....
40
+ end
41
+ ```
42
+
43
+ Alternatively, add this repository alongside the Vagrantfile and require the library manually.
44
+
45
+ ## Basic usage
46
+
47
+ Include paths to mirror in your Vagrantfile like so:
48
+
49
+ ```ruby
50
+ # To mirror the vagrant root path
51
+ config.mirror.vagrant_root "/guest/path"
52
+
53
+ # To mirror any arbitrary path
54
+ config.vm.share_folder "foo", "guest/share/path", "host/path"
55
+ config.mirror.folder "foo", "/guest/mirror/path"
56
+ ```
57
+
58
+ When you run `vagrant up` or `vagrant resume`, vagrant-mirror will:
59
+
60
+ * Ensure that your guest has any shared folders required for the pair
61
+ * Create any local symlinks required
62
+ * Run rsync on the guest to copy from the virtualbox shared folder to the local guest path
63
+ * Register with the local host filesystem for updates using using [listen](https://rubygems.org/gems/listen)
64
+
65
+ When changes are detected on the host, they will be notified by the listen gem. Once a change is
66
+ detected, the host will trigger the guest to run rsync on the changed path to update the locally
67
+ stored file.
68
+
69
+ If you want to force a full resync, you can run `vagrant mirror-sync`.
70
+
71
+ If for some reason the mirror crashes you can just run `vagrant-mirror monitor` on the host to bring
72
+ it back up.
73
+
74
+ ## Advanced usage
75
+
76
+ ### Mixing mirrored and shared files
77
+
78
+ Perhaps there are a few files or directories on the guest that you do want to appear on the host
79
+ too? Vagrant-mirror can create symbolic links for these from your mirror back to the virtualbox
80
+ shared folder. For example, perhaps you want the 'log' directory to work as though it were just on
81
+ the virtualbox shared folder?
82
+
83
+ ```ruby
84
+ # To mirror the vagrant root path - the options hash is also available when sharing any folder
85
+ config.mirror.vagrant_root "/guest/path", {
86
+ :symlinks => [ "/log"]
87
+ }
88
+ ```
89
+
90
+ This will exclude the "/log" folder from rsync and symlink it directly to the shared folder.
91
+
92
+ ### Excluding paths
93
+
94
+ Perhaps there are paths you don't require on your virtual machine. For example, syncing your docs
95
+ folder might waste performance. You can easily add paths that should be excluded from mirroring:
96
+
97
+ ```ruby
98
+ # To mirror the vagrant root path - the options hash is also available when sharing any folder
99
+ config.mirror.vagrant_root "/guest/path", {
100
+ :exclude => [ "/docs"]
101
+ }
102
+ ```
103
+
104
+ You can use any valid rsync exclude patterns for this option. All paths should be specified relative
105
+ to the directory being mirrored.
106
+
107
+ ### Propogating deletes
108
+
109
+ By default, vagrant mirror transfers new files and folders but does not propogate deletes. This can
110
+ lead to unwanted behaviour, in particular if your application on the guest indexes or autoloads all
111
+ the files it finds. You can enable deletions with the following:
112
+
113
+ ```ruby
114
+ # To mirror the vagrant root path - the options hash is also available when sharing any folder
115
+ config.mirror.vagrant_root "/guest/path", {
116
+ :delete => true
117
+ }
118
+ ```
119
+
120
+ You should ensure that your "exclude" configuration includes all the paths that may be present on
121
+ the guest (build directories, cache, assets) as otherwise they will be deleted.
122
+
123
+ ### Notifications
124
+
125
+ The time between updates is generally pretty fast, but it is nonzero. If you're working in fast
126
+ cycles it can be that you rerun a command on the guest before your updated files have been
127
+ transferred, which may be confusing. Avoid this by having vagrant-mirror issue a system beep whenever
128
+ transfers complete.
129
+
130
+ ```ruby
131
+ # To mirror the vagrant root path - the options hash is also available when sharing any folder
132
+ config.mirror.vagrant_root "/guest/path", {
133
+ :beep => true
134
+ }
135
+ ```
136
+
137
+ ## Contributing
138
+
139
+ 1. Fork it
140
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
141
+ 3. Commit your changes (`git commit -am 'Add some feature'`) with specs
142
+ 4. Push to the branch (`git push origin my-new-feature`)
143
+ 5. Create new Pull Request
144
+
145
+ ## Acknowledgements
146
+
147
+ The [vagrant-notify](https://github.com/fgrehm/vagrant-notify/) plugin was very useful in working
148
+ out how to structure this plugin.
149
+
150
+ ## Copyright
151
+
152
+ Copyright (c) 2013 inGenerator Ltd. See LICENSE.txt for
153
+ further details.
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
3
+
4
+ desc "Open an irb session preloaded with vagrant-mirror"
5
+ task :console do
6
+ sh "irb -rubygems -I lib -r vagrant-mirror"
7
+ end
8
+
9
+ require 'rspec/core/rake_task'
10
+ RSpec::Core::RakeTask.new do |t|
11
+ t.pattern = "spec/**/*_spec.rb"
12
+ end
13
+
14
+ # From the vagrant-notify gem
15
+ desc 'Outpus some information about Vagrant middleware stack useful for development (use ACTION=action_name to filter out actions)'
16
+ task 'vagrant-stack' do
17
+ require 'vagrant'
18
+ Vagrant.actions.to_hash.each do |action, stack|
19
+ next unless !ENV['ACTION'] || ENV['ACTION'] == action.to_s
20
+
21
+ puts action
22
+ stack.send(:stack).each do |middleware|
23
+ puts " #{middleware[0]}"
24
+ puts " -> #{middleware[1].inspect}" unless middleware[1].empty?
25
+ end
26
+ end
27
+ end
28
+
29
+ task :default => :spec
@@ -0,0 +1,71 @@
1
+ require 'optparse'
2
+
3
+ # Command line tasks to run a full synchronisation of the mirrored folders,
4
+ # or to restart the live mirror (for example, if it fails). Folder mirroring
5
+ # will also be started with vagrant up and vagrant resume
6
+ module Vagrant
7
+ module Mirror
8
+ class Command < Vagrant::Command::Base
9
+
10
+ # Initializes the command and parses the subcommands from argv
11
+ def initialize(argv, env)
12
+ super
13
+ @main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
14
+ end
15
+
16
+ # Run the command - valid commands are:
17
+ # - vagrant mirror sync
18
+ # - vagrant mirror monitor
19
+ def execute
20
+
21
+ if @main_args.include?("-h") || @main_args.include?("--help")
22
+ # Print the help for all the box commands.
23
+ return help
24
+ end
25
+
26
+ # Currently we can only work with a single VM environment
27
+ raise Errors::SingleVMEnvironmentRequired if @env.multivm?
28
+
29
+ # Run the appropriate subcommand
30
+ case @sub_command
31
+ when 'sync'
32
+ return execute_sync
33
+ when 'monitor'
34
+ return execute_monitor
35
+ when nil
36
+ return execute_monitor
37
+ else
38
+ return help
39
+ end
40
+ end
41
+
42
+ protected
43
+
44
+ # Execute the Sync middleware on the primary vm
45
+ def execute_sync
46
+ @env.primary_vm.run_action(Vagrant::Mirror::Middleware::Sync)
47
+ end
48
+
49
+ # Execute the Mirror middleware on the primary vm
50
+ def execute_monitor
51
+ @env.primary_vm.run_action(Vagrant::Mirror::Middleware::Mirror)
52
+ end
53
+
54
+ # Output help documentation
55
+ def help
56
+ opts = OptionParser.new do |opts|
57
+ opts.banner = "Usage: vagrant mirror <command> [<args>]"
58
+ opts.separator ""
59
+ opts.separator "Available subcommands:"
60
+ opts.separator " sync One-off synchronisation of all mirrored files"
61
+ opts.separator " monitor Monitor and mirror changes on host and guest"
62
+ opts.separator ""
63
+ opts.separator "For help on any individual command run `vagrant mirror COMMAND -h`"
64
+ end
65
+
66
+ @env.ui.info(opts.help, :prefix => false)
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,73 @@
1
+ # Holds configuration for the vagrant-mirror plugin
2
+ #
3
+ # @author Andrew Coulton < andrew@ingerator.com >
4
+ module Vagrant
5
+ module Mirror
6
+ class Config < Vagrant::Config::Base
7
+
8
+ # @return [Array] An array of hashes holding the details of folders to monitor
9
+ attr_reader :folders
10
+
11
+ def initialize
12
+ @folders = []
13
+ end
14
+
15
+ # Validates the provided configuration
16
+ # @param [Vagrant::Environment] Vagrant environment instance
17
+ # @param [Vagrant::Config::ErrorRecorder] Stack of errors in configuration
18
+ def validate(env, errors)
19
+ folders.each do | folder |
20
+ errors.add("vagrant-mirror cannot mirror an empty or nil host path") if (folder[:name].nil? || folder[:name].empty?)
21
+ errors.add("vagrant-mirror cannot mirror an empty or nil guest path") if (folder[:guest_path].nil? || folder[:guest_path].empty?)
22
+ valid_opts = [:name, :guest_path, :delete, :beep, :exclude, :symlinks]
23
+ folder.each do | option, value |
24
+ errors.add("vagrant-mirror does not understand the option #{option}") unless valid_opts.include?(option)
25
+ end
26
+ end
27
+ end
28
+
29
+ # Shortcut to mirror the Vagrant root folder (where the Vagrantfile is stored) to a path on the guest
30
+ # @param [String] Path on the guest to mirror to
31
+ # @param [Hash] Command options - see README.md for details
32
+ def vagrant_root(guest_path, options = {} )
33
+ folder('v-root', guest_path, options)
34
+ end
35
+
36
+ # Mirror a folder between the host and the guest
37
+ # @param [String] Name of the shared folder to mirror as passed to the vagrant shared folder config
38
+ # @param [String] Path on the guest to mirror to
39
+ # @param [Hash] Command options - see README.md for details
40
+ def folder(share_name, guest_path, options = {} )
41
+ # Add the default options
42
+ folder = {
43
+ :delete => false,
44
+ :beep => false,
45
+ :exclude => [],
46
+ :symlinks => []
47
+ }.merge(options)
48
+
49
+ # If there are any symlinks, they need to be added to the rsync excludes
50
+ folder[:symlinks].each do | link_path |
51
+ folder[:exclude] << link_path
52
+ end
53
+
54
+ # Add the names to the hash
55
+ folder[:name] = share_name
56
+ folder[:guest_path] = guest_path
57
+
58
+ # Store the folder details
59
+ @folders << folder
60
+ end
61
+
62
+ # Custom merge method since some keys here are merged differently.
63
+ # @param [Vagrant::Mirror::Config] Configuration to merge with this one
64
+ # @return [Vagrant::Mirror::Config] A new config instance with the merged configuration
65
+ def merge(other)
66
+ result = super
67
+ result.instance_variable_set(:@folders, @folders + other.folders)
68
+ result
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,42 @@
1
+ module Vagrant
2
+ module Mirror
3
+ module Errors
4
+ class SingleVMEnvironmentRequired < Vagrant::Errors::VagrantError
5
+ status_code(99)
6
+
7
+ def initialize()
8
+ message = "Vagrant-mirror currently only supports a single VM environment"
9
+ super
10
+ end
11
+ end
12
+
13
+ class Error < Vagrant::Errors::VagrantError
14
+ status_code(100)
15
+
16
+ def initialize(msg)
17
+ message = msg
18
+ super
19
+ end
20
+ end
21
+
22
+ class MultipleFoldersNotSupported < Vagrant::Errors::VagrantError
23
+ status_code(101)
24
+
25
+ def initialize(msg)
26
+ message = msg
27
+ super
28
+ end
29
+ end
30
+
31
+ class SharedFolderNotMapped < Vagrant::Errors::VagrantError
32
+ status_code(102)
33
+
34
+ def initialize(msg)
35
+ message = msg
36
+ super
37
+ end
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ # Uses Guard to listen for changes on the host filesystem, which it queues
2
+ # for review and transfer to the guest.
3
+ #
4
+ # @author Andrew Coulton < andrew@ingenerator.com >
5
+
6
+ require 'listen'
7
+
8
+ module Vagrant
9
+ module Mirror
10
+ module Listener
11
+ class Host
12
+
13
+ def initialize(path, queue)
14
+ @path = path
15
+ @queue = queue
16
+ end
17
+
18
+ # Makes a blocking call to Guard to listen on the configured path
19
+ def listen!
20
+ Listen.to(@path, :relative_paths => true) do | modified, added, removed |
21
+ @queue << {
22
+ :source => :host,
23
+ :added => added,
24
+ :modified => modified,
25
+ :removed => removed
26
+ }
27
+ end
28
+ end
29
+
30
+ # Runs listen! in a separate thread and returns the thread handle
31
+ #
32
+ # @return [Thread] The listener thread
33
+ def listen
34
+ Thread.new do
35
+ listen!
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,65 @@
1
+ # Base middleware with common functionality.
2
+ #
3
+ # @author Andrew Coulton < andrew@ingerator.com >
4
+ module Vagrant
5
+ module Mirror
6
+ module Middleware
7
+ class Base
8
+
9
+ # Creates an instance
10
+ #
11
+ # @param [Object] The next middleware in the chain
12
+ # @param [Vagrant::Action::Environment] The environment
13
+ def initialize(app, env)
14
+ @app = app
15
+ @env = env
16
+ end
17
+
18
+ # Executes the middleware and then continues to the next middleware in the
19
+ # stack
20
+ #
21
+ # @param [Vagrant::Action::Environment] The environment
22
+ def call(env)
23
+ mirrors = env[:vm].config.mirror.folders
24
+ if !mirrors.empty?
25
+ execute(mirrors, env)
26
+ else
27
+ env[:ui].info("No vagrant-mirror mirrored folders configured for this box")
28
+ end
29
+ @app.call(env)
30
+ end
31
+
32
+ protected
33
+
34
+ # Iterates over a set of mirror configs, fetching the paths for the shared folder pair from
35
+ # on the guest and host and passing them together with the folder config to the passed block
36
+ #
37
+ # @param [Hash] The folder pair
38
+ def each_mirror(mirrors)
39
+ shared_folders = @env[:vm].config.vm.shared_folders
40
+
41
+ if (mirrors.count > 1)
42
+ raise Vagrant::Mirror::Errors::MultipleFoldersNotSupported.new("Sorry, vagrant-mirror doesn't support multiple base folders yet")
43
+ end
44
+
45
+ mirrors.each do | folder |
46
+ # Locate the shared folder pairing in the config
47
+ shared_folder = shared_folders[folder[:name]]
48
+
49
+ if shared_folder.nil?
50
+ raise Vagrant::Mirror::Errors::SharedFolderNotMapped.new("The folder #{folder[:name]} was not a valid Vagrant shared folder name")
51
+ end
52
+
53
+ # Pull out the guest and host path
54
+ guest_path = shared_folder[:guestpath]
55
+ host_path = File.expand_path(shared_folder[:hostpath], @env[:root_path])
56
+
57
+ # Yield for the parent
58
+ yield host_path, guest_path, folder
59
+ end
60
+ end
61
+
62
+ end
63
+ end
64
+ end
65
+ end