Upload big files with Capistrano
Guy Naor has a nice tip to help with large file uploading in Capistrano.
class Capistrano::Actor
# A saner put replacement that doesn't read the whole file into memory...
def put_file(path, remote_path, options = {})
raise "put_file can only be used with SFTP" unless Capistrano::SFTP && options.fetch(:sftp, true)
execute_on_servers(options) do |servers|
servers.each do |server|
logger.info "uploading #{File.basename(path)} to #{server}"
sftp = sessions[server].sftp
sftp.connect unless sftp.state ==
pen
sftp.put_file path, remote_path
logger.debug "done uploading #{File.basename(path)} to #{server}"
end
end
end
end
and I had to update it for Capistrano 2.0:
module Capistrano
class Configuration
module Actions
module FileTransfer
# A saner put replacement that doesn't read the whole file into memory...
def put_file(path, remote_path, options = {})
execute_on_servers(options) do |servers|
servers.each do |server|
logger.info "uploading #{File.basename(path)} to #{server}"
sftp = sessions[server].sftp
sftp.connect unless sftp.state ==
pen
sftp.put_file path, remote_path
logger.debug "done uploading #{File.basename(path)} to #{server}"
end
end
end
end
end
end
end
2 comments.
I had a look in the sftp gem’s source:
def put_file( local_path, remote_path )
contents = File.open( local_path, “rb” ) { |f| f.read }
open_handle( remote_path, “w” ) { |handle| write( handle, contents ) }
end
damned if you do, damned if you don’t…
capistrano/transfer has a method called upload ( at least in cap 2.5 ) that does the job well
Cheers
Carl.
Leave a Reply