namespace :cloudfiles do
desc "Copy assets from one container to another container" task transfer: :environment do config = YAML.load_file("config/cloudfiles.yml") config = HashWithIndifferentAccess.new(config) username = config[:origin][:username] rescue ask("Origin username:") api_key = config[:origin][:api_key] rescue ask("Origin API key:") container = config[:origin][:container] rescue ask("Origin container name:") snet = config[:origin][:snet] rescue false @client_from = CloudFilesTransfer::Client.new( username: username, api_key: api_key, container: container, snet: snet ) username = config["destination"]["username"] rescue ask("Destination username:") api_key = config["destination"]["api_key"] rescue ask("Destination API key:") container = config["destination"]["container"] rescue ask("Destination container name:") snet = config["destination"]["snet"] rescue false @client_to = CloudFilesTransfer::Client.new( username: username, api_key: api_key, container: container, snet: snet ) @container_from = @client_from.container @container_to = @client_to.container @assets = @container_from.objects jobs_count = ENV['jobs'].try(:to_i) || 4 puts "#{@assets.size} files to copy." puts "Transfering #{jobs_count} files at a time. Here we go!" @assets = @assets.in_groups(jobs_count) Thread.abort_on_exception=true threads = jobs_count.times.map do |i| Thread.new(i) do |i| @assets[i].each do |path| CloudFilesTransfer::Transfer.copy!(@container_from, @container_to, path) end end end threads.each {|t| t.join} puts "Done." @client_to.container.refresh end def ask question STDOUT.puts question STDIN.gets.chomp end
end