Merge pull request #10902 from briancain/fixup-rsync-listener

Fixes #10895: Use relative paths to machines folder path for Listener
This commit is contained in:
Brian Cain 2019-06-17 08:20:37 -07:00 committed by GitHub
commit 75d42fed9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 19 deletions

View File

@ -121,9 +121,13 @@ module VagrantPlugins
if folder_opts[:exclude]
Array(folder_opts[:exclude]).each do |pattern|
ignores << RsyncHelper.exclude_to_regexp(hostpath, pattern.to_s)
ignores << RsyncHelper.exclude_to_regexp(pattern.to_s)
end
end
# Always ignore Vagrant
ignores << /.vagrant\//
ignores.uniq!
end
end

View File

@ -16,7 +16,13 @@ module VagrantPlugins
# This converts an rsync exclude pattern to a regular expression
# we can send to Listen.
def self.exclude_to_regexp(path, exclude)
#
# Note: Listen expects a path relative to the parameter passed into the
# Listener, not a fully qualified path
#
# @param [String] - exclude path
# @return [Regexp] - A regex of the path, modified, to exclude
def self.exclude_to_regexp(exclude)
start_anchor = false
if exclude.start_with?("/")
@ -24,19 +30,14 @@ module VagrantPlugins
exclude = exclude[1..-1]
end
path = "#{path}/" if !path.end_with?("/")
regexp = "^#{Regexp.escape(path)}"
regexp += ".*" if !start_anchor
# This is not an ideal solution, but it's a start. We can improve and
# keep unit tests passing in the future.
exclude = exclude.gsub("**", "|||GLOBAL|||")
exclude = exclude.gsub("*", "|||PATH|||")
exclude = exclude.gsub("|||PATH|||", "[^/]*")
exclude = exclude.gsub("|||GLOBAL|||", ".*")
regexp += exclude
Regexp.new(regexp)
Regexp.new(exclude)
end
def self.rsync_single(machine, ssh_info, opts)

View File

@ -66,15 +66,12 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do
# https://github.com/hashicorp/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
@ -103,6 +100,11 @@ describe VagrantPlugins::SyncedFolderRSync::Command::RsyncAuto do
with("Watching: /Users/brian/code/relative-dir")
expect(helper_class).to receive(:rsync_single)
expect(Listen).to receive(:to).
with("/Users/brian/code/vagrant-sandbox",
"/Users/brian/code/relative-dir",
{:ignore=>[/.vagrant\//],
:force_polling=>false})
subject.execute
end

View File

@ -32,23 +32,23 @@ describe VagrantPlugins::SyncedFolderRSync::RsyncHelper do
let(:path) { "/foo/bar" }
it "converts a directory match" do
expect(described_class.exclude_to_regexp(path, "foo/")).
to eq(/^#{Regexp.escape(path)}\/.*foo\//)
expect(described_class.exclude_to_regexp("foo/")).
to eq(/foo\//)
end
it "converts the start anchor" do
expect(described_class.exclude_to_regexp(path, "/foo")).
to eq(/^\/foo\/bar\/foo/)
expect(described_class.exclude_to_regexp("/foo")).
to eq(/foo/)
end
it "converts the **" do
expect(described_class.exclude_to_regexp(path, "fo**o")).
to eq(/^#{Regexp.escape(path)}\/.*fo.*o/)
expect(described_class.exclude_to_regexp("fo**o")).
to eq(/fo.*o/)
end
it "converts the *" do
expect(described_class.exclude_to_regexp(path, "fo*o")).
to eq(/^#{Regexp.escape(path)}\/.*fo[^\/]*o/)
expect(described_class.exclude_to_regexp("fo*o")).
to eq(/fo[^\/]*o/)
end
end