namespace :localcopy do

def archive_name
  fetch(:archive_name, "archive.tar.gz")
end

def include_dir
  fetch(:include_dir, "*")
end

def exclude_dir
  Array(fetch(:exclude_dir, []))
end

def exclude_args
  exclude_dir.map { |dir| [ "--exclude", dir] }.flatten
end

def tar_roles
  fetch(:tar_roles, :all)
end

def tar_verbose
  fetch(:tar_verbose, true)
end

desc "Archive files to #{archive_name}"
file archive_name => FileList[include_dir].exclude(archive_name) do |t|
  sh "tar", "-c#{tar_verbose ? "v" : ""}zf", t.name, *exclude_args, *t.prerequisites
end

desc "Deploy #{archive_name} to release_path"
task :deploy => archive_name do |t|
  tarball = t.prerequisites.first

  on roles(tar_roles) do
    # Make sure the release directory exists
    puts "==> release_path: #{release_path} is created on #{tar_roles} roles <=="
    execute :mkdir, "-p", release_path

    # Create a temporary file on the server
    tmp_file = capture("mktemp")

    # Upload the archive, extract it and finally remove the tmp_file
    upload!(tarball, tmp_file)
    execute :tar, "-xzf", tmp_file, "-C", release_path
    execute :rm, tmp_file
  end
end

task :clean do |t|
  # Delete the local archive
  File.delete archive_name if File.exists? archive_name
end

after 'deploy:finished', 'localcopy:clean'

task :create_release => :deploy
task :check
task :set_current_revision

end