lib/vagrant-unison/command.rb in vagrant-unison-0.0.4 vs lib/vagrant-unison/command.rb in vagrant-unison-0.0.5
- old
+ new
@@ -1,50 +1,72 @@
require "log4r"
require "vagrant"
+require 'listen'
module VagrantPlugins
module Unison
class Command < Vagrant.plugin("2", :command)
+
def execute
-
+
with_target_vms do |machine|
+ hostpath, guestpath = init_paths machine
- ssh_info = machine.ssh_info
+ trigger_unison_sync machine
+ @env.ui.info "Watching #{hostpath} for changes..."
+
+ Listen.to(hostpath) do |modified, added, removed|
+ @env.ui.info "Detected modifications to #{modified.inspect}" unless modified.empty?
+ @env.ui.info "Detected new files #{added.inspect}" unless added.empty?
+ @env.ui.info "Detected deleted files #{removed.inspect}" unless removed.empty?
+
+ trigger_unison_sync machine
+ end
+ end
+
+ 0 #all is well
+ end
+
+ def init_paths(machine)
hostpath = File.expand_path(machine.config.sync.host_folder, @env.root_path)
guestpath = machine.config.sync.guest_folder
# Make sure there is a trailing slash on the host path to
# avoid creating an additional directory with rsync
hostpath = "#{hostpath}/" if hostpath !~ /\/$/
- @env.ui.info "Unisoning {host}::#{hostpath} --> {guest VM}::#{guestpath}"
+ [hostpath, guestpath]
+ end
- # Create the guest path
- #machine.communicate.sudo("mkdir -p '#{guestpath}'")
- #machine.communicate.sudo("chown #{ssh_info[:username]} '#{guestpath}'")
+ def trigger_unison_sync(machine)
+ hostpath, guestpath = init_paths machine
- # Unison over to the guest path using the SSH info
- command = [
- "unison", "-batch",
- "-ignore=Name {git*,.vagrant/,*.DS_Store}",
- "-sshargs", "-p #{ssh_info[:port]} -o StrictHostKeyChecking=no -i #{ssh_info[:private_key_path]}",
- hostpath,
- "ssh://#{ssh_info[:username]}@#{ssh_info[:host]}/#{guestpath}"
- ]
+ @env.ui.info "Unisoning changes from {host}::#{hostpath} --> {guest VM}::#{guestpath}"
- r = Vagrant::Util::Subprocess.execute(*command)
- if r.exit_code != 0
- raise Vagrant::Errors::UnisonError,
- :command => command.inspect,
- :guestpath => guestpath,
- :hostpath => hostpath,
- :stderr => r.stderr
- end
+ ssh_info = machine.ssh_info
- end
+ # Create the guest path
+ machine.communicate.sudo("mkdir -p '#{guestpath}'")
+ machine.communicate.sudo("chown #{ssh_info[:username]} '#{guestpath}'")
- 0
+ # Unison over to the guest path using the SSH info
+ command = [
+ "unison", "-batch",
+ "-ignore=Name {git*,.vagrant/,*.DS_Store}",
+ "-sshargs", "-p #{ssh_info[:port]} -o StrictHostKeyChecking=no -i #{ssh_info[:private_key_path]}",
+ hostpath,
+ "ssh://#{ssh_info[:username]}@#{ssh_info[:host]}/#{guestpath}"
+ ]
+
+ r = Vagrant::Util::Subprocess.execute(*command)
+ if r.exit_code != 0
+ raise Vagrant::Errors::UnisonError,
+ :command => command.inspect,
+ :guestpath => guestpath,
+ :hostpath => hostpath,
+ :stderr => r.stderr
+ end
end
end
end
end
\ No newline at end of file