(#5160) Only rsync-auto current working dir with docker provider
Prior to this commit, when users invoked the `rsync-auto` command using the docker provider with boot2docker, vagrant would rsync all known containers using the boot2docker vm rather than the current working dir. This commit updates that behavior to ensure that only the current working dirs vagrant machines will be rsynced.
This commit is contained in:
parent
0ff65a249c
commit
b1548a2eb6
|
@ -48,6 +48,9 @@ module VagrantPlugins
|
|||
paths = {}
|
||||
ignores = []
|
||||
with_target_vms(argv) do |machine|
|
||||
next if machine.state.id == :not_created
|
||||
cwd = machine.env.cwd.to_s
|
||||
|
||||
if machine.provider.capability?(:proxy_machine)
|
||||
proxy = machine.provider.capability(:proxy_machine)
|
||||
if proxy
|
||||
|
@ -70,6 +73,21 @@ module VagrantPlugins
|
|||
folders = cached[:rsync]
|
||||
next if !folders || folders.empty?
|
||||
|
||||
# NOTE: This check is required with boot2docker since all containers
|
||||
# share the same virtual machine. This prevents rsync-auto from
|
||||
# syncing all known containers with rsync to the boot2docker vm
|
||||
# and only syncs the current working dirs folders.
|
||||
sync_folders = {}
|
||||
folders.each do |id, folder_opts|
|
||||
if cwd != folder_opts[:hostpath]
|
||||
machine.ui.info(I18n.t("vagrant.rsync_auto_remove_folder",
|
||||
folder: folder_opts[:hostpath]))
|
||||
else
|
||||
sync_folders[id] = folder_opts
|
||||
end
|
||||
end
|
||||
folders = sync_folders
|
||||
|
||||
# Get the SSH info for this machine so we can do an initial
|
||||
# sync to the VM.
|
||||
ssh_info = machine.ssh_info
|
||||
|
|
|
@ -218,6 +218,8 @@ en:
|
|||
have specified `rsync_auto` to be false.
|
||||
rsync_auto_path: |-
|
||||
Watching: %{path}
|
||||
rsync_auto_remove_folder: |-
|
||||
Not syncing %{folder} as it is not part of the current working directory.
|
||||
rsync_auto_rsync_error: |-
|
||||
There was an error while executing rsync. The error is shown below.
|
||||
This may not be critical since rsync sometimes fails, but if this message
|
||||
|
|
|
@ -13,17 +13,18 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do
|
|||
env.create_vagrant_env
|
||||
end
|
||||
|
||||
let(:synced_folders) { {} }
|
||||
let(:synced_folders_empty) { {} }
|
||||
let(:synced_folders_dupe) { {"1234":
|
||||
{type: "rsync",
|
||||
exclude: false,
|
||||
hostpath: "/Users/brian/code/vagrant-sandbox"},
|
||||
"5678":
|
||||
{type: "rsync",
|
||||
exclude: false,
|
||||
hostpath: "/Not/The/Same/Path"}} }
|
||||
|
||||
let(:helper_class) { VagrantPlugins::SyncedFolderRSync::RsyncHelper }
|
||||
|
||||
subject do
|
||||
described_class.new(argv, iso_env).tap do |s|
|
||||
s.stub(synced_folders: synced_folders)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#callback" do
|
||||
let(:paths) { {} }
|
||||
let(:ssh_info) {{}}
|
||||
|
||||
|
@ -32,12 +33,57 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do
|
|||
m.stub(id: "foo")
|
||||
m.stub(reload: nil)
|
||||
m.stub(ssh_info: ssh_info)
|
||||
m.stub(ui: double("ui"))
|
||||
m.stub(ui: iso_env.ui)
|
||||
m.stub(provider: double("provider"))
|
||||
m.stub(state: double("state", id: :not_created))
|
||||
m.stub(env: iso_env)
|
||||
|
||||
m.ui.stub(error: nil)
|
||||
end
|
||||
end
|
||||
|
||||
subject do
|
||||
described_class.new(argv, iso_env).tap
|
||||
end
|
||||
|
||||
|
||||
describe "#execute" do
|
||||
let (:machine) { machine_stub("m") }
|
||||
let (:cached_folders) { { rsync: synced_folders_dupe } }
|
||||
|
||||
before do
|
||||
allow(subject).to receive(:with_target_vms) { |&block| block.call machine }
|
||||
end
|
||||
|
||||
it "does not sync folders outside of the cwd" do
|
||||
allow(machine.ui).to receive(:info)
|
||||
allow(machine.state).to receive(:id).and_return(:created)
|
||||
allow(machine.env).to receive(:cwd).
|
||||
and_return("/Users/brian/code/vagrant-sandbox")
|
||||
allow(machine.provider).to receive(:capability?).and_return(false)
|
||||
|
||||
allow(subject).to receive(:synced_folders).
|
||||
with(machine, cached: true).and_return(cached_folders)
|
||||
allow(helper_class).to receive(:rsync_single).and_return(true)
|
||||
allow(Vagrant::Util::Busy).to receive(:busy).and_return(true)
|
||||
allow(Listen).to receive(:to).and_return(true)
|
||||
|
||||
|
||||
expect(machine.ui).to receive(:info).
|
||||
with("Not syncing /Not/The/Same/Path as it is not part of the current working directory.")
|
||||
expect(helper_class).to receive(:rsync_single)
|
||||
|
||||
subject.execute()
|
||||
end
|
||||
end
|
||||
|
||||
subject do
|
||||
described_class.new(argv, iso_env).tap do |s|
|
||||
s.stub(synced_folders: synced_folders_empty)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#callback" do
|
||||
it "syncs modified folders to the proper path" do
|
||||
paths["/foo"] = [
|
||||
{ machine: machine_stub("m1"), opts: double("opts_m1") },
|
||||
|
|
Loading…
Reference in New Issue