=== modified file 'vendor/gems/capistrano-1.99.1/lib/capistrano/errors.rb'
--- vendor/gems/capistrano-1.99.1/lib/capistrano/errors.rb	2007-05-25 15:53:54 +0000
+++ vendor/gems/capistrano-1.99.1/lib/capistrano/errors.rb	2007-06-04 16:05:02 +0000
@@ -3,10 +3,13 @@
 
   class CaptureError < Error; end
   class ConnectionError < Error; end
-  class UploadError < Error; end
   class NoSuchTaskError < Error; end
 
+  class UploadError < Error
+    attr_accessor :hosts
+  end
+
   class CommandError < Error
     attr_accessor :hosts
   end
-end
\ No newline at end of file
+end

=== modified file 'vendor/gems/capistrano-1.99.1/lib/capistrano/upload.rb'
--- vendor/gems/capistrano-1.99.1/lib/capistrano/upload.rb	2007-05-25 15:53:54 +0000
+++ vendor/gems/capistrano-1.99.1/lib/capistrano/upload.rb	2007-06-04 16:19:41 +0000
@@ -62,12 +62,22 @@
       while running?
         @sftps.each do |sftp|
           next if sftp.channel[:done]
-          sftp.channel.connection.process(true)
+          begin
+            sftp.channel.connection.process(true)
+          rescue Net::SFTP::Operations::StatusException => error
+            logger.important "uploading failed: #{error.description}", sftp.channel[:server] if logger
+            failed!(sftp)
+          end
         end
       end
       logger.trace "upload finished" if logger
 
-      raise UploadError, "upload of #{filename} failed on one or more hosts" if failed > 0
+      if (failed = @sftps.select { |sftp| sftp.channel[:failed] }).any?
+        hosts = failed.map { |sftp| sftp.channel[:server] }
+        error = UploadError.new("upload of #{filename} failed on #{hosts.join(',')}")
+        error.hosts = hosts
+        raise error
+      end
 
       self
     end
@@ -84,7 +94,9 @@
           sftp = session.sftp
           sftp.connect unless sftp.state == :open
 
+          sftp.channel[:server] = server
           sftp.channel[:done] = false
+          sftp.channel[:failed] = false
           sftp.open(filename, IO::WRONLY | IO::CREAT | IO::TRUNC, options[:mode] || 0660) do |status, handle|
             break unless check_status(sftp, "open #{filename}", server, status)
             
@@ -118,6 +130,7 @@
       def failed!(sftp)
         completed!(sftp)
         @failed += 1
+        sftp.channel[:failed] = true
       end
 
       def completed!(sftp)

