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