diff --git a/plugins/provisioners/file/provisioner.rb b/plugins/provisioners/file/provisioner.rb index 7b997a7dc..3c8081fce 100644 --- a/plugins/provisioners/file/provisioner.rb +++ b/plugins/provisioners/file/provisioner.rb @@ -3,14 +3,30 @@ module VagrantPlugins class Provisioner < Vagrant.plugin("2", :provisioner) def provision @machine.communicate.tap do |comm| + source = File.expand_path(config.source) destination = expand_guest_path(config.destination) + # if source is a directory, make it then trim destination with dirname # Make sure the remote path exists - command = "mkdir -p %s" % File.dirname(destination) + if File.directory?(source) + # We need to make sure the actual destination folder + # also exists before uploading, otherwise + # you will get nested folders. We also need to append + # a './' to the source folder so we copy the contents + # rather than the folder itself, in case a users destination + # folder differs from its source. + # + # https://serverfault.com/questions/538368/make-scp-always-overwrite-or-create-directory + # https://unix.stackexchange.com/questions/292641/get-scp-path-behave-like-rsync-path/292732 + command = "mkdir -p %s" % destination + source << "/." + else + command = "mkdir -p %s" % File.dirname(destination) + end comm.execute(command) # now upload the file - comm.upload(File.expand_path(config.source), destination) + comm.upload(source, destination) end end