namespace :rsync do

def build_server_string(role)
  user = role.user + "@" if !role.user.nil?
  "#{user}#{role.hostname}"
end

desc "Synchronise from local to remote folder via rsync"
task :up do
  files = fetch(:syncfiles)
  files.each do |local_path, config|
    remote_path  = config[:remote]
    exclude_dir  = Array(config[:exclude])
    exclude_args = exclude_dir.map { |dir| "--exclude '#{dir}'"}
    sync_roles   = fetch(:syncfiles_roles, :all)

    on release_roles sync_roles do |role|
      server = build_server_string(role)

      args = fetch(:syncfiles_rsync_options)
      args = args + " --rsync-path='sudo rsync'" if fetch(:use_sudo)
      cmd  = ["rsync #{args} #{local_path}/ #{server}:#{get_syncfiles_base_path}#{remote_path}", *exclude_args]
      puts cmd.join(' ')
      system cmd.join(' ')
    end
  end
end

desc "Synchronise from remote to local folder via rsync"
task :down do
  files = fetch(:syncfiles)
  files.each do |local_path, config|
    remote_path  = config[:remote]
    exclude_dir  = Array(config[:exclude])
    exclude_args = exclude_dir.map { |dir| "--exclude '#{dir}'"}
    sync_roles   = fetch(:syncfiles_roles, :all)

    on release_roles sync_roles do |role|
      server = build_server_string(role)

      args = fetch(:syncfiles_rsync_options)
      args = args + " --rsync-path='sudo rsync'" if fetch(:use_sudo)

      cmd  = ["rsync #{args} #{server}:#{get_syncfiles_base_path}#{remote_path}/ #{local_path}", *exclude_args]
      puts cmd.join(' ')
      system cmd.join(' ')
    end
  end
end

end