<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/sprinkle/installers/transfer.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -54,6 +54,7 @@ lib/sprinkle/installers/push_text.rb
 lib/sprinkle/installers/rake.rb
 lib/sprinkle/installers/rpm.rb
 lib/sprinkle/installers/source.rb
+lib/sprinkle/installers/transfer.rb
 lib/sprinkle/installers/yum.rb
 lib/sprinkle/package.rb
 lib/sprinkle/policy.rb</diff>
      <filename>Manifest.txt</filename>
    </modified>
    <modified>
      <diff>@@ -76,6 +76,22 @@ module Sprinkle
         end
       end
 
+			def transfer(name, source, destination, roles, recursive = true, suppress_and_return_failures = false)
+        define_task(name, roles) do
+          upload source, destination, :via =&gt; :scp, :recursive =&gt; recursive
+        end
+        
+        begin
+          run(name)
+          return true
+        rescue ::Capistrano::CommandError =&gt; e
+          return false if suppress_and_return_failures
+          
+          # Reraise error if we're not suppressing it
+          raise
+        end
+			end
+			
       private
 
         # REVISIT: can we set the description somehow?</diff>
      <filename>lib/sprinkle/actors/capistrano.rb</filename>
    </modified>
    <modified>
      <diff>@@ -25,6 +25,13 @@ module Sprinkle
         return true
       end
       
+			def transfer(name, source, destination, roles, recursive = true, suppress_and_return_failures = false)
+				if recursive
+					flags = &quot;-R &quot;
+				end
+				
+				system &quot;cp #{flags}#{source} #{destination}&quot;
+			end
     end
   end
 end</diff>
      <filename>lib/sprinkle/actors/local.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
 require 'net/ssh/gateway'
+require 'net/scp'
 
 module Sprinkle
   module Actors
@@ -26,7 +27,12 @@ module Sprinkle
         return process_with_gateway(name, commands, roles) if gateway_defined?
         process_direct(name, commands, roles)
       end
-      
+
+      def transfer(name, source, destination, roles, recursive = true, suppress_and_return_failures = false)
+        return transfer_with_gateway(name, source, destination, roles, recursive) if gateway_defined?
+        transfer_direct(name, source, destination, roles, recursive)
+      end
+			
       protected
       
         def process_with_gateway(name, commands, roles)
@@ -39,10 +45,25 @@ module Sprinkle
           Array(roles).each { |role| execute_on_role(commands, role) }
         end
         
+        def transfer_with_gateway(name, source, destination, roles, recursive)
+          on_gateway do |gateway|
+            Array(roles).each { |role| transfer_to_role(source, destination, role, recursive, gateway) }
+          end
+        end
+        
+        def transfer_direct(name, source, destination, roles, recursive)
+          Array(roles).each { |role| transfer_to_role(source, destination, role, recursive) }
+        end
+
         def execute_on_role(commands, role, gateway = nil)
           hosts = @options[:roles][role]
           Array(hosts).each { |host| execute_on_host(commands, host, gateway) }
         end
+
+        def transfer_to_role(source, destination, role, gateway = nil)
+          hosts = @options[:roles][role]
+          Array(hosts).each { |host| transfer_to_host(source, destination, host, gateway) }
+        end
         
         def execute_on_host(commands, host, gateway = nil)
           if gateway # SSH connection via gateway
@@ -64,6 +85,23 @@ module Sprinkle
           end
         end
 
+        def transfer_to_host(source, destination, host, recursive, gateway = nil)
+          if gateway # SSH connection via gateway
+            gateway.ssh(host, @options[:user]) do |ssh|
+              transfer_on_connection(source, destination, recursive, ssh)
+            end
+          else # direct SSH connection
+            Net::SSH.start(host, @options[:user]) do |ssh|
+              transfer_on_connection(source, destination, recursive, ssh)
+            end
+          end
+        end
+        
+        def transfer_on_connection(source, destination, recursive, connection)
+					scp = Net::SCP.new(connection)
+					scp.upload! source, destination, :recursive =&gt; recursive
+        end
+
       private
       
         def gateway_defined?</diff>
      <filename>lib/sprinkle/actors/ssh.rb</filename>
    </modified>
    <modified>
      <diff>@@ -55,6 +55,19 @@ module Sprinkle
         end
       end
 
+			# Sorry, all transfers are recursive
+      def transfer(name, source, destination, roles, recursive = true, suppress_and_return_failures = false) #:nodoc:
+        begin
+					rsync source, destination
+          return true
+        rescue ::Vlad::CommandFailedError =&gt; e
+          return false if suppress_and_return_failures
+          
+          # Reraise error if we're not suppressing it
+          raise
+        end
+      end
+
       private
 
         def task_sym(name)</diff>
      <filename>lib/sprinkle/actors/vlad.rb</filename>
    </modified>
    <modified>
      <diff>@@ -173,7 +173,11 @@ module Sprinkle
       def push_text(text, path, options = {}, &amp;block)
         @installer = Sprinkle::Installers::PushText.new(self, text, path, options, &amp;block)
       end
-      
+
+			def transfer(source, destination, options = {}, &amp;block)
+				@installer = Sprinkle::Installers::Transfer.new(self, source, destination, options, &amp;block)
+      end
+
       def verify(description = '', &amp;block)
         @verifications &lt;&lt; Sprinkle::Verify.new(self, description, &amp;block)
       end</diff>
      <filename>lib/sprinkle/package.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>5ab83c9e487800aef41a026f1ca505407c388cce</id>
    </parent>
  </parents>
  <author>
    <name>Jacob Harris</name>
    <email>jharris@nytimes.com</email>
  </author>
  <url>http://github.com/crafterm/sprinkle/commit/f2c82abd85ba428f8f2ab29e119469d77f8917bd</url>
  <id>f2c82abd85ba428f8f2ab29e119469d77f8917bd</id>
  <committed-date>2009-06-08T14:34:00-07:00</committed-date>
  <authored-date>2009-06-08T14:34:00-07:00</authored-date>
  <message>Added a new transfer installer that copies files to remote servers (needs some testing)</message>
  <tree>a79f30c31e73e148c68dde1e74240444585405b4</tree>
  <committer>
    <name>Jacob Harris</name>
    <email>jharris@nytimes.com</email>
  </committer>
</commit>
