From 4440056fff8d88f13bbfd61603e740f58b946e4c Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Thu, 13 Jul 2017 10:47:50 -0700 Subject: [PATCH] (#8770) rsync-auto relative dirs from vagrantfile Prior to this commit, rsync-auto would not properly rsync realtive dirs outside the cwd if defined in the Vagrantfile. This commit updates that to ensure that the command looks at the Vagrant config to ensure that folder was intended to be rsync'd to the machine even if outside the current working dir. --- .../rsync/command/rsync_auto.rb | 7 +++- .../rsync/command/rsync_auto_test.rb | 34 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/plugins/synced_folders/rsync/command/rsync_auto.rb b/plugins/synced_folders/rsync/command/rsync_auto.rb index 8b84f8ed3..b74abf432 100644 --- a/plugins/synced_folders/rsync/command/rsync_auto.rb +++ b/plugins/synced_folders/rsync/command/rsync_auto.rb @@ -78,8 +78,13 @@ module VagrantPlugins # syncing all known containers with rsync to the boot2docker vm # and only syncs the current working dirs folders. sync_folders = {} + # Still sync existing synced folders from vagrantfile + config_synced_folders = machine.config.vm.synced_folders.values.map { |x| x[:hostpath] } + config_synced_folders.map! { |x| File.expand_path(x, machine.env.root_path) } folders.each do |id, folder_opts| - if cwd != folder_opts[:hostpath] + if cwd != folder_opts[:hostpath] && + !config_synced_folders.include?(folder_opts[:hostpath]) + machine.ui.info(I18n.t("vagrant.rsync_auto_remove_folder", folder: folder_opts[:hostpath])) else diff --git a/test/unit/plugins/synced_folders/rsync/command/rsync_auto_test.rb b/test/unit/plugins/synced_folders/rsync/command/rsync_auto_test.rb index a6aafaa4b..0317c4195 100644 --- a/test/unit/plugins/synced_folders/rsync/command/rsync_auto_test.rb +++ b/test/unit/plugins/synced_folders/rsync/command/rsync_auto_test.rb @@ -21,7 +21,11 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do "5678": {type: "rsync", exclude: false, - hostpath: "/Not/The/Same/Path"}} } + hostpath: "/Not/The/Same/Path"}, + "0912": + {type: "rsync", + exclude: false, + hostpath: "/Users/brian/code/relative-dir"}}} let(:helper_class) { VagrantPlugins::SyncedFolderRSync::RsyncHelper } @@ -37,6 +41,8 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do m.stub(provider: double("provider")) m.stub(state: double("state", id: :not_created)) m.stub(env: iso_env) + m.stub(config: double("config")) + m.ui.stub(error: nil) end @@ -51,6 +57,26 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do let (:machine) { machine_stub("m") } let (:cached_folders) { { rsync: synced_folders_dupe } } + # NOTE: `relative-dir` is not actually a "relative dir" in this data structure + # due to the fact that when vagrant stores synced folders, it path expands + # them with root_dir, and when you grab those synced_folders options from + # the machines config file, they end up being a full path rather than a + # relative path, and so these tests reflect that. + # For reference: + # https://github.com/mitchellh/vagrant/blob/9c1b014536e61b332cfaa00774a87a240cce8ed9/lib/vagrant/action/builtin/synced_folders.rb#L45-L46 + let(:config_synced_folders) { {"/vagrant": + {type: "rsync", + exclude: false, + hostpath: "/Users/brian/code/vagrant-sandbox"}, + "/vagrant/other-dir": + {type: "rsync", + exclude: false, + hostpath: "/Users/brian/code/vagrant-sandbox/other-dir"}, + "/vagrant/relative-dir": + {type: "rsync", + exclude: false, + hostpath: "/Users/brian/code/relative-dir"}}} + before do allow(subject).to receive(:with_target_vms) { |&block| block.call machine } end @@ -61,6 +87,8 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do allow(machine.env).to receive(:cwd). and_return("/Users/brian/code/vagrant-sandbox") allow(machine.provider).to receive(:capability?).and_return(false) + allow(machine.config).to receive(:vm).and_return(true) + allow(machine.config.vm).to receive(:synced_folders).and_return(config_synced_folders) allow(subject).to receive(:synced_folders). with(machine, cached: true).and_return(cached_folders) @@ -71,6 +99,10 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do expect(machine.ui).to receive(:info). with("Not syncing /Not/The/Same/Path as it is not part of the current working directory.") + expect(machine.ui).to receive(:info). + with("Watching: /Users/brian/code/vagrant-sandbox") + expect(machine.ui).to receive(:info). + with("Watching: /Users/brian/code/relative-dir") expect(helper_class).to receive(:rsync_single) subject.execute()