Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #10895: Use relative paths to machines folder path for Listener #10902

Merged
merged 1 commit into from Jun 17, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 5 additions & 1 deletion plugins/synced_folders/rsync/command/rsync_auto.rb
Expand Up @@ -121,9 +121,13 @@ def execute

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

Expand Down
15 changes: 8 additions & 7 deletions plugins/synced_folders/rsync/helper.rb
Expand Up @@ -16,27 +16,28 @@ class RsyncHelper

# 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?("/")
start_anchor = true
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)
Expand Down
Expand Up @@ -66,15 +66,12 @@ def machine_stub(name)
# 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
Expand Down Expand Up @@ -103,6 +100,11 @@ def machine_stub(name)
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

Expand Down
16 changes: 8 additions & 8 deletions test/unit/plugins/synced_folders/rsync/helper_test.rb
Expand Up @@ -32,23 +32,23 @@
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

Expand Down