<commit_before>require "log4r"

require "vagrant/util/subprocess"

module VagrantPlugins
  module OpenStack
    module Action
      # This middleware uses `rsync` to sync the folders over to the
      # remote instance.
      class SyncFolders
        def initialize(app, env)
          @app    = app
          @logger = Log4r::Logger.new("vagrant_openstack::action::sync_folders")
        end

        def call(env)
          @app.call(env)

          ssh_info = env[:machine].ssh_info

          env[:machine].config.vm.synced_folders.each do |id, data|
            # ignore disabled shared folders
            if data[:disabled]
              @logger.info "Not syncing disabled folder: #{data[:hostpath]} => #{data[:guestpath]}"
              next
            end

            hostpath  = File.expand_path(data[:hostpath], env[:root_path])
            guestpath = data[:guestpath]

            # Make sure there is a trailing slash on the host path to
            # avoid creating an additional directory with rsync
            hostpath = "#{hostpath}/" if hostpath !~ /\/$/

            env[:ui].info(I18n.t("vagrant_openstack.rsync_folder",
                                :hostpath => hostpath,
                                :guestpath => guestpath))

            # Create the guest path
            env[:machine].communicate.sudo("mkdir -p '#{guestpath}'")
            env[:machine].communicate.sudo(
              "chown #{ssh_info[:username]} '#{guestpath}'")

            #collect rsync excludes specified :rsync_excludes=>['path1',...] in synced_folder options
            excludes = ['.vagrant/', 'Vagrantfile', *Array(data[:rsync_excludes])].uniq

            # Rsync over to the guest path using the SSH info
            if env[:machine].config.ssh.proxy_command
              proxy_cmd = "-o ProxyCommand='#{env[:machine].config.ssh.proxy_command}'"
            else
              proxy_cmd = ''
            end

            # poor workaround for poor ipv6 handling of rsync
            if ssh_info[:host].include? ':'
              user_at_host = "[#{ssh_info[:username]}@#{ssh_info[:host]}]"
            else
              user_at_host = ssh_info[:username] + "@" + ssh_info[:host]
            end

            command = [
              'rsync', '--verbose', '--archive', '-z', '--delete',
              *excludes.map{|e|['--exclude', e]}.flatten,
              '-e', "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no #{proxy_cmd} #{ssh_key_options(ssh_info)}",
              hostpath,
              user_at_host + ":" + guestpath]

            r = Vagrant::Util::Subprocess.execute(*command)
            if r.exit_code != 0
              raise Errors::RsyncError,
                :guestpath => guestpath,
                :hostpath => hostpath,
                :stderr => r.stderr
            end
          end
        end

        private

        def ssh_key_options(ssh_info)
          # Ensure that `private_key_path` is an Array (for Vagrant < 1.4)
          Array(ssh_info[:private_key_path]).map { |path| "-i '#{path}'" }.join
        end
      end
    end
  end
end
<commit_msg>Avoid using sudo to make synced_folder if possible<commit_after>require "log4r"

require "vagrant/util/subprocess"

module VagrantPlugins
  module OpenStack
    module Action
      # This middleware uses `rsync` to sync the folders over to the
      # remote instance.
      class SyncFolders
        def initialize(app, env)
          @app    = app
          @logger = Log4r::Logger.new("vagrant_openstack::action::sync_folders")
        end

        def call(env)
          @app.call(env)

          ssh_info = env[:machine].ssh_info

          env[:machine].config.vm.synced_folders.each do |id, data|
            # ignore disabled shared folders
            if data[:disabled]
              @logger.info "Not syncing disabled folder: #{data[:hostpath]} => #{data[:guestpath]}"
              next
            end

            hostpath  = File.expand_path(data[:hostpath], env[:root_path])
            guestpath = data[:guestpath]

            # Make sure there is a trailing slash on the host path to
            # avoid creating an additional directory with rsync
            hostpath = "#{hostpath}/" if hostpath !~ /\/$/

            env[:ui].info(I18n.t("vagrant_openstack.rsync_folder",
                                :hostpath => hostpath,
                                :guestpath => guestpath))

            # Create the guest path
            # Use sudo only when it is necessary 
            cmd_mkdir = "mkdir -p '#{guestpath}'"
            cmd_chown = "chown #{ssh_info[:username]} '#{guestpath}'"
            if env[:machine].communicate.execute(cmd_mkdir, :error_check => false) != 0 then
              env[:machine].communicate.sudo(cmd_mkdir)
            end
            if env[:machine].communicate.execute(cmd_chown, :error_check => false) != 0 then
              env[:machine].communicate.sudo(cmd_chown)
            end

            #collect rsync excludes specified :rsync_excludes=>['path1',...] in synced_folder options
            excludes = ['.vagrant/', 'Vagrantfile', *Array(data[:rsync_excludes])].uniq

            # Rsync over to the guest path using the SSH info
            if env[:machine].config.ssh.proxy_command
              proxy_cmd = "-o ProxyCommand='#{env[:machine].config.ssh.proxy_command}'"
            else
              proxy_cmd = ''
            end

            # poor workaround for poor ipv6 handling of rsync
            if ssh_info[:host].include? ':'
              user_at_host = "[#{ssh_info[:username]}@#{ssh_info[:host]}]"
            else
              user_at_host = ssh_info[:username] + "@" + ssh_info[:host]
            end

            command = [
              'rsync', '--verbose', '--archive', '-z', '--delete',
              *excludes.map{|e|['--exclude', e]}.flatten,
              '-e', "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no #{proxy_cmd} #{ssh_key_options(ssh_info)}",
              hostpath,
              user_at_host + ":" + guestpath]

            r = Vagrant::Util::Subprocess.execute(*command)
            if r.exit_code != 0
              raise Errors::RsyncError,
                :guestpath => guestpath,
                :hostpath => hostpath,
                :stderr => r.stderr
            end
          end
        end

        private

        def ssh_key_options(ssh_info)
          # Ensure that `private_key_path` is an Array (for Vagrant < 1.4)
          Array(ssh_info[:private_key_path]).map { |path| "-i '#{path}'" }.join
        end
      end
    end
  end
end

{'fraction_non_alphanumeric': 0.12078395624430265, 'fraction_numerical': 0.003038590094196293, 'mean_word_length': 1.8277491408934707, 'pattern_counts': {'":': 2, '<': 5, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7654309', 'n_tokens_mistral': 1980, 'n_tokens_neox': 1869, 'n_words': 441}