From cc2fcd700c4429d47ad43bf349944b14d731c6db Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Tue, 23 Feb 2010 16:04:02 -0500
Subject: [PATCH] docs/FTP: the Twisted patch (t3462) has landed, will be in
 the next release

---
 docs/frontends/FTP-and-SFTP.txt | 73 +++------------------------------
 1 file changed, 6 insertions(+), 67 deletions(-)

diff --git a/docs/frontends/FTP-and-SFTP.txt b/docs/frontends/FTP-and-SFTP.txt
index df63a877..7fe28de3 100644
--- a/docs/frontends/FTP-and-SFTP.txt
+++ b/docs/frontends/FTP-and-SFTP.txt
@@ -145,70 +145,9 @@ library that is frequently installed as /usr/lib/libcryptopp.a, to avoid
 problems with non-alphanumerics in filenames).
 
 The FTP server requires code in Twisted that enables asynchronous closing of
-file-upload operations. This code was not in the Twisted-8.2.0 release, and
-has not been committed to SVN trunk as of r27213 (see
-http://twistedmatrix.com/trac/ticket/3462 for details). So it may be
-necessary to apply the following patch. The Tahoe node will refuse to start
-the FTP server if it detects that this patch has not been applied.
-
-Index: twisted/protocols/ftp.py
-===================================================================
---- twisted/protocols/ftp.py	(revision 24956)
-+++ twisted/protocols/ftp.py	(working copy)
-@@ -1049,7 +1049,6 @@
-                 cons = ASCIIConsumerWrapper(cons)
- 
-             d = self.dtpInstance.registerConsumer(cons)
--            d.addCallbacks(cbSent, ebSent)
- 
-             # Tell them what to doooo
-             if self.dtpInstance.isConnected:
-@@ -1062,6 +1061,8 @@
-         def cbOpened(file):
-             d = file.receive()
-             d.addCallback(cbConsumer)
-+            d.addCallback(lambda ignored: file.close())
-+            d.addCallbacks(cbSent, ebSent)
-             return d
- 
-         def ebOpened(err):
-@@ -1434,7 +1435,14 @@
-         @rtype: C{Deferred} of C{IConsumer}
-         """
- 
-+    def close():
-+        """
-+        Perform any post-write work that needs to be done. This method may
-+        only be invoked once on each provider, and will always be invoked
-+        after receive().
- 
-+        @rtype: C{Deferred} of anything: the value is ignored
-+        """
- 
- def _getgroups(uid):
-     """Return the primary and supplementary groups for the given UID.
-@@ -1795,6 +1803,8 @@
-         # FileConsumer will close the file object
-         return defer.succeed(FileConsumer(self.fObj))
- 
-+    def close(self):
-+        return defer.succeed(None)
- 
- 
- class FTPRealm:
-Index: twisted/vfs/adapters/ftp.py
-===================================================================
---- twisted/vfs/adapters/ftp.py	(revision 24956)
-+++ twisted/vfs/adapters/ftp.py	(working copy)
-@@ -295,6 +295,11 @@
-         """
-         return defer.succeed(IConsumer(self.node))
- 
-+    def close(self):
-+        """
-+        Perform post-write actions.
-+        """
-+        return defer.succeed(None)
- 
- 
- class _FileToConsumerAdapter(object):
+file-upload operations. This code was landed to Twisted's SVN trunk in r28453
+on 23-Feb-2010, slightly too late for the Twisted-10.0 release, but it should
+be present in the next release after that. To use Tahoe's FTP server with
+Twisted-10.0 or earlier, you will need to apply the patch attached to
+http://twistedmatrix.com/trac/ticket/3462 . The Tahoe node will refuse to
+start the FTP server unless it detects the necessary support code in Twisted.
-- 
2.45.2