Ticket #1442: fix-1442-and-1446-version3.darcs.patch

File fix-1442-and-1446-version3.darcs.patch, 37.2 KB (added by davidsarah, at 2011-07-30T00:32:01Z)

SFTP: write an error message to standard error for unrecognized shell commands. Change the existing message for shell sessions to be written to standard error, and refactor some duplicated code. Also change the lines of the error messages to end in CRLF, and take into account Kevan's review comments. fixes #1442, #1446

Line 
11 patch for repository /home/davidsarah/tahoe/mdmf:
2
3Sat Jul 30 00:31:02 BST 2011  david-sarah@jacaranda.org
4  * SFTP: write an error message to standard error for unrecognized shell commands. Change the existing message for shell sessions to be written to standard error, and refactor some duplicated code. Also change the lines of the error messages to end in CRLF, and take into account Kevan's review comments. fixes #1442, #1446
5
6New patches:
7
8[SFTP: write an error message to standard error for unrecognized shell commands. Change the existing message for shell sessions to be written to standard error, and refactor some duplicated code. Also change the lines of the error messages to end in CRLF, and take into account Kevan's review comments. fixes #1442, #1446
9david-sarah@jacaranda.org**20110729233102
10 Ignore-this: d2f2bb4664f25007d1602bf7333e2cdd
11] {
12hunk ./src/allmydata/frontends/sftpd.py 1865
13         if hasattr(protocol, 'transport') and protocol.transport is None:
14             protocol.transport = FakeTransport()  # work around Twisted bug
15 
16-        d = defer.succeed(None)
17-        d.addCallback(lambda ign: protocol.write("This server supports only SFTP, not shell sessions.\n"))
18-        d.addCallback(lambda ign: protocol.processEnded(Reason(ProcessTerminated(exitCode=1))))
19-        return d
20+        return self._unsupported(protocol)
21 
22     def execCommand(self, protocol, cmd):
23         self.log(".execCommand(%r, %r)" % (protocol, cmd), level=OPERATIONAL)
24hunk ./src/allmydata/frontends/sftpd.py 1875
25         d = defer.succeed(None)
26         if cmd == "df -P -k /":
27             d.addCallback(lambda ign: protocol.write(
28-                          "Filesystem         1024-blocks      Used Available Capacity Mounted on\n"
29-                          "tahoe                628318530 314159265 314159265      50% /\n"))
30+                          "Filesystem         1024-blocks      Used Available Capacity Mounted on\r\n"
31+                          "tahoe                628318530 314159265 314159265      50% /\r\n"))
32             d.addCallback(lambda ign: protocol.processEnded(Reason(ProcessDone(None))))
33         else:
34hunk ./src/allmydata/frontends/sftpd.py 1879
35-            d.addCallback(lambda ign: protocol.processEnded(Reason(ProcessTerminated(exitCode=1))))
36+            d.addCallback(lambda ign: self._unsupported(protocol))
37+        return d
38+
39+    def _unsupported(self, protocol):
40+        d = defer.succeed(None)
41+        d.addCallback(lambda ign: protocol.errReceived(
42+                      "This server supports only the SFTP protocol. It does not support SCP,\r\n"
43+                      "interactive shell sessions, or commands other than one needed by sshfs.\r\n"))
44+        d.addCallback(lambda ign: protocol.processEnded(Reason(ProcessTerminated(exitCode=1))))
45         return d
46 
47     def windowChanged(self, newWindowSize):
48hunk ./src/allmydata/test/test_sftp.py 1333
49     test_makeDirectory.timeout = 15
50 
51     def test_execCommand_and_openShell(self):
52-        class FakeProtocol:
53+        class MockProtocol:
54             def __init__(self):
55                 self.output = ""
56hunk ./src/allmydata/test/test_sftp.py 1336
57+                self.error = ""
58                 self.reason = None
59hunk ./src/allmydata/test/test_sftp.py 1338
60+
61             def write(self, data):
62hunk ./src/allmydata/test/test_sftp.py 1340
63+                return self.outReceived(data)
64+
65+            def outReceived(self, data):
66                 self.output += data
67                 return defer.succeed(None)
68hunk ./src/allmydata/test/test_sftp.py 1345
69+
70+            def errReceived(self, data):
71+                self.error += data
72+                return defer.succeed(None)
73+
74             def processEnded(self, reason):
75                 self.reason = reason
76                 return defer.succeed(None)
77hunk ./src/allmydata/test/test_sftp.py 1354
78 
79+        def _lines_end_in_crlf(s):
80+            return s.replace('\r\n', '').find('\n') == -1 and s.endswith('\r\n')
81+
82         d = self._set_up("execCommand_and_openShell")
83 
84         d.addCallback(lambda ign: conch_interfaces.ISession(self.handler))
85hunk ./src/allmydata/test/test_sftp.py 1361
86         def _exec_df(session):
87-            protocol = FakeProtocol()
88+            protocol = MockProtocol()
89             d2 = session.execCommand(protocol, "df -P -k /")
90             d2.addCallback(lambda ign: self.failUnlessIn("1024-blocks", protocol.output))
91hunk ./src/allmydata/test/test_sftp.py 1364
92+            d2.addCallback(lambda ign: self.failUnless(_lines_end_in_crlf(protocol.output), protocol.output))
93+            d2.addCallback(lambda ign: self.failUnlessEqual(protocol.error, ""))
94             d2.addCallback(lambda ign: self.failUnless(isinstance(protocol.reason.value, ProcessDone)))
95             d2.addCallback(lambda ign: session.eofReceived())
96             d2.addCallback(lambda ign: session.closed())
97hunk ./src/allmydata/test/test_sftp.py 1372
98             return d2
99         d.addCallback(_exec_df)
100 
101+        def _check_unsupported(protocol):
102+            d2 = defer.succeed(None)
103+            d2.addCallback(lambda ign: self.failUnlessEqual(protocol.output, ""))
104+            d2.addCallback(lambda ign: self.failUnlessIn("only the SFTP protocol", protocol.error))
105+            d2.addCallback(lambda ign: self.failUnless(_lines_end_in_crlf(protocol.error), protocol.error))
106+            d2.addCallback(lambda ign: self.failUnless(isinstance(protocol.reason.value, ProcessTerminated)))
107+            d2.addCallback(lambda ign: self.failUnlessEqual(protocol.reason.value.exitCode, 1))
108+            return d2
109+
110         d.addCallback(lambda ign: conch_interfaces.ISession(self.handler))
111         def _exec_error(session):
112hunk ./src/allmydata/test/test_sftp.py 1383
113-            protocol = FakeProtocol()
114+            protocol = MockProtocol()
115             d2 = session.execCommand(protocol, "error")
116             d2.addCallback(lambda ign: session.windowChanged(None))
117hunk ./src/allmydata/test/test_sftp.py 1386
118-            d2.addCallback(lambda ign: self.failUnlessEqual("", protocol.output))
119-            d2.addCallback(lambda ign: self.failUnless(isinstance(protocol.reason.value, ProcessTerminated)))
120-            d2.addCallback(lambda ign: self.failUnlessEqual(protocol.reason.value.exitCode, 1))
121+            d2.addCallback(lambda ign: _check_unsupported(protocol))
122             d2.addCallback(lambda ign: session.closed())
123             return d2
124         d.addCallback(_exec_error)
125hunk ./src/allmydata/test/test_sftp.py 1393
126 
127         d.addCallback(lambda ign: conch_interfaces.ISession(self.handler))
128         def _openShell(session):
129-            protocol = FakeProtocol()
130+            protocol = MockProtocol()
131             d2 = session.openShell(protocol)
132hunk ./src/allmydata/test/test_sftp.py 1395
133-            d2.addCallback(lambda ign: self.failUnlessIn("only SFTP", protocol.output))
134-            d2.addCallback(lambda ign: self.failUnless(isinstance(protocol.reason.value, ProcessTerminated)))
135-            d2.addCallback(lambda ign: self.failUnlessEqual(protocol.reason.value.exitCode, 1))
136+            d2.addCallback(lambda ign: _check_unsupported(protocol))
137             d2.addCallback(lambda ign: session.closed())
138             return d2
139         d.addCallback(_openShell)
140}
141
142Context:
143
144[Resolve conflict with trunk in src/allmydata/scripts/cli.py. refs #393
145david-sarah@jacaranda.org**20110728233303
146 Ignore-this: 5ea8bfbffd84233d59a97706a12bc0c7
147]
148[test/test_cli: test CLI's MDMF creation powers
149Kevan Carstensen <kevan@isnotajoke.com>**20110617180209
150 Ignore-this: d4b493b266446b2be3ce3c5f2505577d
151]
152[scripts: teach CLI to make MDMF directories
153Kevan Carstensen <kevan@isnotajoke.com>**20110617180137
154 Ignore-this: 5dc968bd22278033b534a561f230a4f
155]
156[test/test_web: test webapi and WUI for MDMF directory handling
157Kevan Carstensen <kevan@isnotajoke.com>**20110617180100
158 Ignore-this: 63ed7832872fd35eb7319cf6a6f251b
159]
160[web: teach WUI and webapi to create MDMF directories
161Kevan Carstensen <kevan@isnotajoke.com>**20110617180019
162 Ignore-this: 956a60542a26c2d5118085ab9e3c470e
163]
164[Add tests for MDMF directories
165Kevan Carstensen <kevan@isnotajoke.com>**20110617175950
166 Ignore-this: 27882fd4cf827030d7574bd4b2b8cb77
167]
168[Add MDMF dirnodes
169Kevan Carstensen <kevan@isnotajoke.com>**20110617175808
170 Ignore-this: e7d184ece57b272be0e5a3917cc7642a
171]
172[test: change test fixtures to work with our new extension passing API; add, change, and delete tests as appropriate to reflect the fact that caps without hints are now the exception rather than the norm
173Kevan Carstensen <kevan@isnotajoke.com>**20110531012739
174 Ignore-this: 30ebf79b5f6c17f40fa4385de12070a0
175]
176[mutable/filenode: pass downloader hints between publisher, MutableFileNode, and MutableFileVersion as convenient
177Kevan Carstensen <kevan@isnotajoke.com>**20110531012641
178 Ignore-this: 672c586891abfa38397bcdf90b64ca72
179 
180 We still need to work on making this more thorough; i.e., passing hints
181 when other operations change encoding parameters.
182]
183[mutable/servermap: caps imply protocol version, so the servermap doesn't need to tell the filenode what it is anymore.
184Kevan Carstensen <kevan@isnotajoke.com>**20110531012557
185 Ignore-this: 9925f5dde5452db92cdbc4a7d6adf1c1
186]
187[mutable/publish: tell filenodes about encoding parameters so they can be put in the cap
188Kevan Carstensen <kevan@isnotajoke.com>**20110531012447
189 Ignore-this: cf19f07a6913208a327604457466f2f2
190]
191[interfaces: working update to interfaces.py for extension handling
192Kevan Carstensen <kevan@isnotajoke.com>**20110531012201
193 Ignore-this: 559c43cbf14eec7ac163ebd00c0b7a36
194]
195[uri: teach mutable URI objects how to allow other objects to give them extension parameters
196Kevan Carstensen <kevan@isnotajoke.com>**20110531012036
197 Ignore-this: 96c06cee1efe5a92a5ed8d87ca09a7dd
198]
199[web/info.py: Display mutable type information when describing a mutable file
200Kevan Carstensen <kevan@isnotajoke.com>**20110515230444
201 Ignore-this: ce5ad22b494effe6c15e49471fae0d99
202]
203[web/filenode.py: complain if a PUT is requested with a readonly cap
204Kevan Carstensen <kevan@isnotajoke.com>**20110515230421
205 Ignore-this: e2f05201f3b008e157062ed187eacbb9
206]
207[test/test_web: add MDMF cap tests
208Kevan Carstensen <kevan@isnotajoke.com>**20110515230358
209 Ignore-this: ace5af3bdc9b65c3f6964c8fe056816
210]
211[test/test_mutable.py: implement cap type checking
212Kevan Carstensen <kevan@isnotajoke.com>**20110515230326
213 Ignore-this: 64cf51b809605061047c8a1b02f5e212
214]
215[test/test_mutable.py: write a test for pausing during retrieval, write support structure for that test
216Kevan Carstensen <kevan@isnotajoke.com>**20110515230207
217 Ignore-this: 8884ef3ad5be59dbc870ed14002ac45
218]
219[test/test_cli: Alter existing MDMF tests to test for MDMF caps
220Kevan Carstensen <kevan@isnotajoke.com>**20110515230054
221 Ignore-this: a90d089e1afb0f261710083c2be6b2fa
222]
223[test/common.py: fix some MDMF-related bugs in common test fixtures
224Kevan Carstensen <kevan@isnotajoke.com>**20110515230038
225 Ignore-this: ab5ffe4789bb5e6ed5f54b91b760bac9
226]
227[scripts/tahoe_put.py: teach tahoe put about MDMF caps
228Kevan Carstensen <kevan@isnotajoke.com>**20110515230008
229 Ignore-this: 1522f434f651683c924e37251a3c1bfd
230]
231[mutable/retrieve: fix typo in paused check
232Kevan Carstensen <kevan@isnotajoke.com>**20110515225946
233 Ignore-this: a9c7f3bdbab2f8248f8b6a64f574e7c4
234]
235[nodemaker, mutable/filenode: train nodemaker and filenode to handle MDMF caps
236Kevan Carstensen <kevan@isnotajoke.com>**20110501224523
237 Ignore-this: 1f3b4581eb583e7bb93d234182bda395
238]
239[uri.py: Add MDMF cap
240Kevan Carstensen <kevan@isnotajoke.com>**20110501224249
241 Ignore-this: a6d1046d33f5cc811c5e8b10af925f33
242]
243[mutable/layout.py: reorder on-disk format to aput variable-length fields at the end of the share, after a predictably long preamble
244Kevan Carstensen <kevan@isnotajoke.com>**20110501224125
245 Ignore-this: 8b2c5d29b8984dfe675c1a2ada5205cf
246]
247[mutable: use integer division where appropriate
248Kevan Carstensen <kevan@isnotajoke.com>**20110307082229
249 Ignore-this: a8767e89d919c9f2a5d5fef3953d53f9
250]
251[mutable/filenode: remove incorrect comments about segment boundaries
252Kevan Carstensen <kevan@isnotajoke.com>**20110307081713
253 Ignore-this: 7008644c3d9588815000a86edbf9c568
254]
255[web: use None instead of False in the case of no offset, use object identity comparison to check whether or not an offset was specified.
256Kevan Carstensen <kevan@isnotajoke.com>**20110305010858
257 Ignore-this: 14b7550ca95ce423c9b0b7f6f14ffd2f
258]
259[tahoe-put: raise UsageError when given a nonsensical mutable type, move option validation code to the option parser.
260Kevan Carstensen <kevan@isnotajoke.com>**20110301030807
261 Ignore-this: 2dc19d8bd741842eff458ca553d0bf2a
262]
263[mutable/publish: account for offsets on segment boundaries.
264Kevan Carstensen <kevan@isnotajoke.com>**20110228083327
265 Ignore-this: c8758a0580fcc15a22c2f8582d758a6b
266]
267[test_mutable.py: add test to exercise fencepost bug
268warner@lothar.com**20110228021056
269 Ignore-this: d2f9cf237ce6db42fb250c8ad71a4fc3
270]
271[mutable/layout: remove references to the salt hash tree.
272Kevan Carstensen <kevan@isnotajoke.com>**20110228010637
273 Ignore-this: b3b2963ba4d0b42c78b6bba219d4deb5
274]
275[docs/configuration.rst: fix more conflicts between #393 and trunk
276Kevan Carstensen <kevan@isnotajoke.com>**20110228003426
277 Ignore-this: 7917effdeecab00d634a06f1df8fe2cf
278]
279[web: Use the string "replace" to trigger whole-file replacement when processing an offset parameter.
280Kevan Carstensen <kevan@isnotajoke.com>**20110227231643
281 Ignore-this: 5bbf0b90d68efe20d4c531bb98a8321a
282]
283[mutable/filenode: Clean up servermap handling in MutableFileVersion
284Kevan Carstensen <kevan@isnotajoke.com>**20110226010433
285 Ignore-this: 2257c9f65502098789f5ea355b94f130
286 
287 We want to update the servermap before attempting to modify a file,
288 which we now do. This introduced code duplication, which was addressed
289 by refactoring the servermap update into its own method, and then
290 eliminating duplicate servermap updates throughout the
291 MutableFileVersion.
292]
293[update MDMF code with StorageFarmBroker changes
294"Brian Warner <warner@lothar.com>"**20110221061004
295 Ignore-this: a693b201d31125b391cebe0412ddd027
296]
297[resolve more conflicts with current trunk
298"Brian Warner <warner@lothar.com>"**20110221055600
299 Ignore-this: 77ad038a478dbf5d9b34f7a68159a3e0
300]
301[mutable/filenode.py: fix create_mutable_file('string')
302"Brian Warner <warner@lothar.com>"**20110221014659
303 Ignore-this: dc6bdad761089f0199681eeb784f1001
304]
305[resolve conflicts between 393-MDMF patches and trunk as of 1.8.2
306"Brian Warner <warner@lothar.com>"**20110220230201
307 Ignore-this: 9bbf5d26c994e8069202331dcb4cdd95
308]
309[tests:
310Kevan Carstensen <kevan@isnotajoke.com>**20100819003531
311 Ignore-this: 314e8bbcce532ea4d5d2cecc9f31cca0
312 
313     - A lot of existing tests relied on aspects of the mutable file
314       implementation that were changed. This patch updates those tests
315       to work with the changes.
316     - This patch also adds tests for new features.
317]
318[mutable/servermap.py: Alter the servermap updater to work with MDMF files
319Kevan Carstensen <kevan@isnotajoke.com>**20100819003439
320 Ignore-this: 7e408303194834bd59a2f27efab3bdb
321 
322 These modifications were basically all to the end of having the
323 servermap updater use the unified MDMF + SDMF read interface whenever
324 possible -- this reduces the complexity of the code, making it easier to
325 read and maintain. To do this, I needed to modify the process of
326 updating the servermap a little bit.
327 
328 To support partial-file updates, I also modified the servermap updater
329 to fetch the block hash trees and certain segments of files while it
330 performed a servermap update (this can be done without adding any new
331 roundtrips because of batch-read functionality that the read proxy has).
332 
333]
334[mutable/retrieve.py: Modify the retrieval process to support MDMF
335Kevan Carstensen <kevan@isnotajoke.com>**20100819003409
336 Ignore-this: c03f4e41aaa0366a9bf44847f2caf9db
337 
338 The logic behind a mutable file download had to be adapted to work with
339 segmented mutable files; this patch performs those adaptations. It also
340 exposes some decoding and decrypting functionality to make partial-file
341 updates a little easier, and supports efficient random-access downloads
342 of parts of an MDMF file.
343]
344[mutable/layout.py and interfaces.py: add MDMF writer and reader
345Kevan Carstensen <kevan@isnotajoke.com>**20100819003304
346 Ignore-this: 44400fec923987b62830da2ed5075fb4
347 
348 The MDMF writer is responsible for keeping state as plaintext is
349 gradually processed into share data by the upload process. When the
350 upload finishes, it will write all of its share data to a remote server,
351 reporting its status back to the publisher.
352 
353 The MDMF reader is responsible for abstracting an MDMF file as it sits
354 on the grid from the downloader; specifically, by receiving and
355 responding to requests for arbitrary data within the MDMF file.
356 
357 The interfaces.py file has also been modified to contain an interface
358 for the writer.
359]
360[docs: update docs to mention MDMF
361Kevan Carstensen <kevan@isnotajoke.com>**20100814225644
362 Ignore-this: 1c3caa3cd44831007dcfbef297814308
363]
364[nodemaker.py: Make nodemaker expose a way to create MDMF files
365Kevan Carstensen <kevan@isnotajoke.com>**20100819003509
366 Ignore-this: a6701746d6b992fc07bc0556a2b4a61d
367]
368[mutable/publish.py: Modify the publish process to support MDMF
369Kevan Carstensen <kevan@isnotajoke.com>**20100819003342
370 Ignore-this: 2bb379974927e2e20cff75bae8302d1d
371 
372 The inner workings of the publishing process needed to be reworked to a
373 large extend to cope with segmented mutable files, and to cope with
374 partial-file updates of mutable files. This patch does that. It also
375 introduces wrappers for uploadable data, allowing the use of
376 filehandle-like objects as data sources, in addition to strings. This
377 reduces memory inefficiency when dealing with large files through the
378 webapi, and clarifies update code there.
379]
380[mutable/filenode.py: add versions and partial-file updates to the mutable file node
381Kevan Carstensen <kevan@isnotajoke.com>**20100819003231
382 Ignore-this: b7b5434201fdb9b48f902d7ab25ef45c
383 
384 One of the goals of MDMF as a GSoC project is to lay the groundwork for
385 LDMF, a format that will allow Tahoe-LAFS to deal with and encourage
386 multiple versions of a single cap on the grid. In line with this, there
387 is a now a distinction between an overriding mutable file (which can be
388 thought to correspond to the cap/unique identifier for that mutable
389 file) and versions of the mutable file (which we can download, update,
390 and so on). All download, upload, and modification operations end up
391 happening on a particular version of a mutable file, but there are
392 shortcut methods on the object representing the overriding mutable file
393 that perform these operations on the best version of the mutable file
394 (which is what code should be doing until we have LDMF and better
395 support for other paradigms).
396 
397 Another goal of MDMF was to take advantage of segmentation to give
398 callers more efficient partial file updates or appends. This patch
399 implements methods that do that, too.
400 
401]
402[mutable/checker.py and mutable/repair.py: Modify checker and repairer to work with MDMF
403Kevan Carstensen <kevan@isnotajoke.com>**20100819003216
404 Ignore-this: d3bd3260742be8964877f0a53543b01b
405 
406 The checker and repairer required minimal changes to work with the MDMF
407 modifications made elsewhere. The checker duplicated a lot of the code
408 that was already in the downloader, so I modified the downloader
409 slightly to expose this functionality to the checker and removed the
410 duplicated code. The repairer only required a minor change to deal with
411 data representation.
412]
413[client.py: learn how to create different kinds of mutable files
414Kevan Carstensen <kevan@isnotajoke.com>**20100814225711
415 Ignore-this: 61ff665bc050cba5f58bf2ed779d692b
416]
417[web: Alter the webapi to get along with and take advantage of the MDMF changes
418Kevan Carstensen <kevan@isnotajoke.com>**20100814081012
419 Ignore-this: 96c2ed4e4a9f450fb84db5d711d10bd6
420 
421 The main benefit that the webapi gets from MDMF, at least initially, is
422 the ability to do a streaming download of an MDMF mutable file. It also
423 exposes a way (through the PUT verb) to append to or otherwise modify
424 (in-place) an MDMF mutable file.
425]
426[scripts: tell 'tahoe put' about MDMF
427Kevan Carstensen <kevan@isnotajoke.com>**20100813234957
428 Ignore-this: c106b3384fc676bd3c0fb466d2a52b1b
429]
430[immutable/literal.py: implement the same interfaces as other filenodes
431Kevan Carstensen <kevan@isnotajoke.com>**20100810000633
432 Ignore-this: b50dd5df2d34ecd6477b8499a27aef13
433]
434[immutable/filenode.py: Make the immutable file node implement the same interfaces as the mutable one
435Kevan Carstensen <kevan@isnotajoke.com>**20100810000619
436 Ignore-this: 93e536c0f8efb705310f13ff64621527
437]
438[frontends/sftpd.py: Modify the sftp frontend to work with the MDMF changes
439Kevan Carstensen <kevan@isnotajoke.com>**20100809233535
440 Ignore-this: 2d25e2cfcd0d7bbcbba660c7e1da12f
441]
442[interfaces.py: Add #993 interfaces
443Kevan Carstensen <kevan@isnotajoke.com>**20100809233244
444 Ignore-this: b58621ac5cc86f1b4b4149f9e6c6a1ce
445]
446[src/allmydata/scripts/cli.py: fix pyflakes warning.
447david-sarah@jacaranda.org**20110728021402
448 Ignore-this: 94050140ddb99865295973f49927c509
449]
450[Fix the help synopses of CLI commands to include [options] in the right place. fixes #1359, fixes #636
451david-sarah@jacaranda.org**20110724225440
452 Ignore-this: 2a8e488a5f63dabfa9db9efd83768a5
453]
454[encodingutil: argv and output encodings are always the same on all platforms. Lose the unnecessary generality of them being different. fixes #1120
455david-sarah@jacaranda.org**20110629185356
456 Ignore-this: 5ebacbe6903dfa83ffd3ff8436a97787
457]
458[docs/man/tahoe.1: add man page. fixes #1420
459david-sarah@jacaranda.org**20110724171728
460 Ignore-this: fc7601ec7f25494288d6141d0ae0004c
461]
462[Update the dependency on zope.interface to fix an incompatiblity between Nevow and zope.interface 3.6.4. fixes #1435
463david-sarah@jacaranda.org**20110721234941
464 Ignore-this: 2ff3fcfc030fca1a4d4c7f1fed0f2aa9
465]
466[frontends/ftpd.py: remove the check for IWriteFile.close since we're now guaranteed to be using Twisted >= 10.1 which has it.
467david-sarah@jacaranda.org**20110722000320
468 Ignore-this: 55cd558b791526113db3f83c00ec328a
469]
470[Update the dependency on Twisted to >= 10.1. This allows us to simplify some documentation: it's no longer necessary to install pywin32 on Windows, or apply a patch to Twisted in order to use the FTP frontend. fixes #1274, #1438. refs #1429
471david-sarah@jacaranda.org**20110721233658
472 Ignore-this: 81b41745477163c9b39c0b59db91cc62
473]
474[misc/build_helpers/run_trial.py: undo change to block pywin32 (it didn't work because run_trial.py is no longer used). refs #1334
475david-sarah@jacaranda.org**20110722035402
476 Ignore-this: 5d03f544c4154f088e26c7107494bf39
477]
478[misc/build_helpers/run_trial.py: ensure that pywin32 is not on the sys.path when running the test suite. Includes some temporary debugging printouts that will be removed. refs #1334
479david-sarah@jacaranda.org**20110722024907
480 Ignore-this: 5141a9f83a4085ed4ca21f0bbb20bb9c
481]
482[docs/running.rst: use 'tahoe run ~/.tahoe' instead of 'tahoe run' (the default is the current directory, unlike 'tahoe start').
483david-sarah@jacaranda.org**20110718005949
484 Ignore-this: 81837fbce073e93d88a3e7ae3122458c
485]
486[docs/running.rst: say to put the introducer.furl in tahoe.cfg.
487david-sarah@jacaranda.org**20110717194315
488 Ignore-this: 954cc4c08e413e8c62685d58ff3e11f3
489]
490[README.txt: say that quickstart.rst is in the docs directory.
491david-sarah@jacaranda.org**20110717192400
492 Ignore-this: bc6d35a85c496b77dbef7570677ea42a
493]
494[setup: remove the dependency on foolscap's "secure_connections" extra, add a dependency on pyOpenSSL
495zooko@zooko.com**20110717114226
496 Ignore-this: df222120d41447ce4102616921626c82
497 fixes #1383
498]
499[test_sftp.py cleanup: remove a redundant definition of failUnlessReallyEqual.
500david-sarah@jacaranda.org**20110716181813
501 Ignore-this: 50113380b368c573f07ac6fe2eb1e97f
502]
503[docs: add missing link in NEWS.rst
504zooko@zooko.com**20110712153307
505 Ignore-this: be7b7eb81c03700b739daa1027d72b35
506]
507[contrib: remove the contributed fuse modules and the entire contrib/ directory, which is now empty
508zooko@zooko.com**20110712153229
509 Ignore-this: 723c4f9e2211027c79d711715d972c5
510 Also remove a couple of vestigial references to figleaf, which is long gone.
511 fixes #1409 (remove contrib/fuse)
512]
513[add Protovis.js-based download-status timeline visualization
514Brian Warner <warner@lothar.com>**20110629222606
515 Ignore-this: 477ccef5c51b30e246f5b6e04ab4a127
516 
517 provide status overlap info on the webapi t=json output, add decode/decrypt
518 rate tooltips, add zoomin/zoomout buttons
519]
520[add more download-status data, fix tests
521Brian Warner <warner@lothar.com>**20110629222555
522 Ignore-this: e9e0b7e0163f1e95858aa646b9b17b8c
523]
524[prepare for viz: improve DownloadStatus events
525Brian Warner <warner@lothar.com>**20110629222542
526 Ignore-this: 16d0bde6b734bb501aa6f1174b2b57be
527 
528 consolidate IDownloadStatusHandlingConsumer stuff into DownloadNode
529]
530[docs: fix error in crypto specification that was noticed by Taylor R Campbell <campbell+tahoe@mumble.net>
531zooko@zooko.com**20110629185711
532 Ignore-this: b921ed60c1c8ba3c390737fbcbe47a67
533]
534[setup.py: don't make bin/tahoe.pyscript executable. fixes #1347
535david-sarah@jacaranda.org**20110130235809
536 Ignore-this: 3454c8b5d9c2c77ace03de3ef2d9398a
537]
538[Makefile: remove targets relating to 'setup.py check_auto_deps' which no longer exists. fixes #1345
539david-sarah@jacaranda.org**20110626054124
540 Ignore-this: abb864427a1b91bd10d5132b4589fd90
541]
542[Makefile: add 'make check' as an alias for 'make test'. Also remove an unnecessary dependency of 'test' on 'build' and 'src/allmydata/_version.py'. fixes #1344
543david-sarah@jacaranda.org**20110623205528
544 Ignore-this: c63e23146c39195de52fb17c7c49b2da
545]
546[Rename test_package_initialization.py to (much shorter) test_import.py .
547Brian Warner <warner@lothar.com>**20110611190234
548 Ignore-this: 3eb3dbac73600eeff5cfa6b65d65822
549 
550 The former name was making my 'ls' listings hard to read, by forcing them
551 down to just two columns.
552]
553[tests: fix tests to accomodate [20110611153758-92b7f-0ba5e4726fb6318dac28fb762a6512a003f4c430]
554zooko@zooko.com**20110611163741
555 Ignore-this: 64073a5f39e7937e8e5e1314c1a302d1
556 Apparently none of the two authors (stercor, terrell), three reviewers (warner, davidsarah, terrell), or one committer (me) actually ran the tests. This is presumably due to #20.
557 fixes #1412
558]
559[wui: right-align the size column in the WUI
560zooko@zooko.com**20110611153758
561 Ignore-this: 492bdaf4373c96f59f90581c7daf7cd7
562 Thanks to Ted "stercor" Rolle Jr. and Terrell Russell.
563 fixes #1412
564]
565[docs: three minor fixes
566zooko@zooko.com**20110610121656
567 Ignore-this: fec96579eb95aceb2ad5fc01a814c8a2
568 CREDITS for arc for stats tweak
569 fix link to .zip file in quickstart.rst (thanks to ChosenOne for noticing)
570 English usage tweak
571]
572[docs/running.rst: fix stray HTML (not .rst) link noticed by ChosenOne.
573david-sarah@jacaranda.org**20110609223719
574 Ignore-this: fc50ac9c94792dcac6f1067df8ac0d4a
575]
576[server.py:  get_latencies now reports percentiles _only_ if there are sufficient observations for the interpretation of the percentile to be unambiguous.
577wilcoxjg@gmail.com**20110527120135
578 Ignore-this: 2e7029764bffc60e26f471d7c2b6611e
579 interfaces.py:  modified the return type of RIStatsProvider.get_stats to allow for None as a return value
580 NEWS.rst, stats.py: documentation of change to get_latencies
581 stats.rst: now documents percentile modification in get_latencies
582 test_storage.py:  test_latencies now expects None in output categories that contain too few samples for the associated percentile to be unambiguously reported.
583 fixes #1392
584]
585[docs: revert link in relnotes.txt from NEWS.rst to NEWS, since the former did not exist at revision 5000.
586david-sarah@jacaranda.org**20110517011214
587 Ignore-this: 6a5be6e70241e3ec0575641f64343df7
588]
589[docs: convert NEWS to NEWS.rst and change all references to it.
590david-sarah@jacaranda.org**20110517010255
591 Ignore-this: a820b93ea10577c77e9c8206dbfe770d
592]
593[docs: remove out-of-date docs/testgrid/introducer.furl and containing directory. fixes #1404
594david-sarah@jacaranda.org**20110512140559
595 Ignore-this: 784548fc5367fac5450df1c46890876d
596]
597[scripts/common.py: don't assume that the default alias is always 'tahoe' (it is, but the API of get_alias doesn't say so). refs #1342
598david-sarah@jacaranda.org**20110130164923
599 Ignore-this: a271e77ce81d84bb4c43645b891d92eb
600]
601[setup: don't catch all Exception from check_requirement(), but only PackagingError and ImportError
602zooko@zooko.com**20110128142006
603 Ignore-this: 57d4bc9298b711e4bc9dc832c75295de
604 I noticed this because I had accidentally inserted a bug which caused AssertionError to be raised from check_requirement().
605]
606[M-x whitespace-cleanup
607zooko@zooko.com**20110510193653
608 Ignore-this: dea02f831298c0f65ad096960e7df5c7
609]
610[docs: fix typo in running.rst, thanks to arch_o_median
611zooko@zooko.com**20110510193633
612 Ignore-this: ca06de166a46abbc61140513918e79e8
613]
614[relnotes.txt: don't claim to work on Cygwin (which has been untested for some time). refs #1342
615david-sarah@jacaranda.org**20110204204902
616 Ignore-this: 85ef118a48453d93fa4cddc32d65b25b
617]
618[relnotes.txt: forseeable -> foreseeable. refs #1342
619david-sarah@jacaranda.org**20110204204116
620 Ignore-this: 746debc4d82f4031ebf75ab4031b3a9
621]
622[replace remaining .html docs with .rst docs
623zooko@zooko.com**20110510191650
624 Ignore-this: d557d960a986d4ac8216d1677d236399
625 Remove install.html (long since deprecated).
626 Also replace some obsolete references to install.html with references to quickstart.rst.
627 Fix some broken internal references within docs/historical/historical_known_issues.txt.
628 Thanks to Ravi Pinjala and Patrick McDonald.
629 refs #1227
630]
631[docs: FTP-and-SFTP.rst: fix a minor error and update the information about which version of Twisted fixes #1297
632zooko@zooko.com**20110428055232
633 Ignore-this: b63cfb4ebdbe32fb3b5f885255db4d39
634]
635[munin tahoe_files plugin: fix incorrect file count
636francois@ctrlaltdel.ch**20110428055312
637 Ignore-this: 334ba49a0bbd93b4a7b06a25697aba34
638 fixes #1391
639]
640[corrected "k must never be smaller than N" to "k must never be greater than N"
641secorp@allmydata.org**20110425010308
642 Ignore-this: 233129505d6c70860087f22541805eac
643]
644[Fix a test failure in test_package_initialization on Python 2.4.x due to exceptions being stringified differently than in later versions of Python. refs #1389
645david-sarah@jacaranda.org**20110411190738
646 Ignore-this: 7847d26bc117c328c679f08a7baee519
647]
648[tests: add test for including the ImportError message and traceback entry in the summary of errors from importing dependencies. refs #1389
649david-sarah@jacaranda.org**20110410155844
650 Ignore-this: fbecdbeb0d06a0f875fe8d4030aabafa
651]
652[allmydata/__init__.py: preserve the message and last traceback entry (file, line number, function, and source line) of ImportErrors in the package versions string. fixes #1389
653david-sarah@jacaranda.org**20110410155705
654 Ignore-this: 2f87b8b327906cf8bfca9440a0904900
655]
656[remove unused variable detected by pyflakes
657zooko@zooko.com**20110407172231
658 Ignore-this: 7344652d5e0720af822070d91f03daf9
659]
660[allmydata/__init__.py: Nicer reporting of unparseable version numbers in dependencies. fixes #1388
661david-sarah@jacaranda.org**20110401202750
662 Ignore-this: 9c6bd599259d2405e1caadbb3e0d8c7f
663]
664[update FTP-and-SFTP.rst: the necessary patch is included in Twisted-10.1
665Brian Warner <warner@lothar.com>**20110325232511
666 Ignore-this: d5307faa6900f143193bfbe14e0f01a
667]
668[control.py: remove all uses of s.get_serverid()
669warner@lothar.com**20110227011203
670 Ignore-this: f80a787953bd7fa3d40e828bde00e855
671]
672[web: remove some uses of s.get_serverid(), not all
673warner@lothar.com**20110227011159
674 Ignore-this: a9347d9cf6436537a47edc6efde9f8be
675]
676[immutable/downloader/fetcher.py: remove all get_serverid() calls
677warner@lothar.com**20110227011156
678 Ignore-this: fb5ef018ade1749348b546ec24f7f09a
679]
680[immutable/downloader/fetcher.py: fix diversity bug in server-response handling
681warner@lothar.com**20110227011153
682 Ignore-this: bcd62232c9159371ae8a16ff63d22c1b
683 
684 When blocks terminate (either COMPLETE or CORRUPT/DEAD/BADSEGNUM), the
685 _shares_from_server dict was being popped incorrectly (using shnum as the
686 index instead of serverid). I'm still thinking through the consequences of
687 this bug. It was probably benign and really hard to detect. I think it would
688 cause us to incorrectly believe that we're pulling too many shares from a
689 server, and thus prefer a different server rather than asking for a second
690 share from the first server. The diversity code is intended to spread out the
691 number of shares simultaneously being requested from each server, but with
692 this bug, it might be spreading out the total number of shares requested at
693 all, not just simultaneously. (note that SegmentFetcher is scoped to a single
694 segment, so the effect doesn't last very long).
695]
696[immutable/downloader/share.py: reduce get_serverid(), one left, update ext deps
697warner@lothar.com**20110227011150
698 Ignore-this: d8d56dd8e7b280792b40105e13664554
699 
700 test_download.py: create+check MyShare instances better, make sure they share
701 Server objects, now that finder.py cares
702]
703[immutable/downloader/finder.py: reduce use of get_serverid(), one left
704warner@lothar.com**20110227011146
705 Ignore-this: 5785be173b491ae8a78faf5142892020
706]
707[immutable/offloaded.py: reduce use of get_serverid() a bit more
708warner@lothar.com**20110227011142
709 Ignore-this: b48acc1b2ae1b311da7f3ba4ffba38f
710]
711[immutable/upload.py: reduce use of get_serverid()
712warner@lothar.com**20110227011138
713 Ignore-this: ffdd7ff32bca890782119a6e9f1495f6
714]
715[immutable/checker.py: remove some uses of s.get_serverid(), not all
716warner@lothar.com**20110227011134
717 Ignore-this: e480a37efa9e94e8016d826c492f626e
718]
719[add remaining get_* methods to storage_client.Server, NoNetworkServer, and
720warner@lothar.com**20110227011132
721 Ignore-this: 6078279ddf42b179996a4b53bee8c421
722 MockIServer stubs
723]
724[upload.py: rearrange _make_trackers a bit, no behavior changes
725warner@lothar.com**20110227011128
726 Ignore-this: 296d4819e2af452b107177aef6ebb40f
727]
728[happinessutil.py: finally rename merge_peers to merge_servers
729warner@lothar.com**20110227011124
730 Ignore-this: c8cd381fea1dd888899cb71e4f86de6e
731]
732[test_upload.py: factor out FakeServerTracker
733warner@lothar.com**20110227011120
734 Ignore-this: 6c182cba90e908221099472cc159325b
735]
736[test_upload.py: server-vs-tracker cleanup
737warner@lothar.com**20110227011115
738 Ignore-this: 2915133be1a3ba456e8603885437e03
739]
740[happinessutil.py: server-vs-tracker cleanup
741warner@lothar.com**20110227011111
742 Ignore-this: b856c84033562d7d718cae7cb01085a9
743]
744[upload.py: more tracker-vs-server cleanup
745warner@lothar.com**20110227011107
746 Ignore-this: bb75ed2afef55e47c085b35def2de315
747]
748[upload.py: fix var names to avoid confusion between 'trackers' and 'servers'
749warner@lothar.com**20110227011103
750 Ignore-this: 5d5e3415b7d2732d92f42413c25d205d
751]
752[refactor: s/peer/server/ in immutable/upload, happinessutil.py, test_upload
753warner@lothar.com**20110227011100
754 Ignore-this: 7ea858755cbe5896ac212a925840fe68
755 
756 No behavioral changes, just updating variable/method names and log messages.
757 The effects outside these three files should be minimal: some exception
758 messages changed (to say "server" instead of "peer"), and some internal class
759 names were changed. A few things still use "peer" to minimize external
760 changes, like UploadResults.timings["peer_selection"] and
761 happinessutil.merge_peers, which can be changed later.
762]
763[storage_client.py: clean up test_add_server/test_add_descriptor, remove .test_servers
764warner@lothar.com**20110227011056
765 Ignore-this: efad933e78179d3d5fdcd6d1ef2b19cc
766]
767[test_client.py, upload.py:: remove KiB/MiB/etc constants, and other dead code
768warner@lothar.com**20110227011051
769 Ignore-this: dc83c5794c2afc4f81e592f689c0dc2d
770]
771[test: increase timeout on a network test because Francois's ARM machine hit that timeout
772zooko@zooko.com**20110317165909
773 Ignore-this: 380c345cdcbd196268ca5b65664ac85b
774 I'm skeptical that the test was proceeding correctly but ran out of time. It seems more likely that it had gotten hung. But if we raise the timeout to an even more extravagant number then we can be even more certain that the test was never going to finish.
775]
776[docs/configuration.rst: add a "Frontend Configuration" section
777Brian Warner <warner@lothar.com>**20110222014323
778 Ignore-this: 657018aa501fe4f0efef9851628444ca
779 
780 this points to docs/frontends/*.rst, which were previously underlinked
781]
782[web/filenode.py: avoid calling req.finish() on closed HTTP connections. Closes #1366
783"Brian Warner <warner@lothar.com>"**20110221061544
784 Ignore-this: 799d4de19933f2309b3c0c19a63bb888
785]
786[Add unit tests for cross_check_pkg_resources_versus_import, and a regression test for ref #1355. This requires a little refactoring to make it testable.
787david-sarah@jacaranda.org**20110221015817
788 Ignore-this: 51d181698f8c20d3aca58b057e9c475a
789]
790[allmydata/__init__.py: .name was used in place of the correct .__name__ when printing an exception. Also, robustify string formatting by using %r instead of %s in some places. fixes #1355.
791david-sarah@jacaranda.org**20110221020125
792 Ignore-this: b0744ed58f161bf188e037bad077fc48
793]
794[Refactor StorageFarmBroker handling of servers
795Brian Warner <warner@lothar.com>**20110221015804
796 Ignore-this: 842144ed92f5717699b8f580eab32a51
797 
798 Pass around IServer instance instead of (peerid, rref) tuple. Replace
799 "descriptor" with "server". Other replacements:
800 
801  get_all_servers -> get_connected_servers/get_known_servers
802  get_servers_for_index -> get_servers_for_psi (now returns IServers)
803 
804 This change still needs to be pushed further down: lots of code is now
805 getting the IServer and then distributing (peerid, rref) internally.
806 Instead, it ought to distribute the IServer internally and delay
807 extracting a serverid or rref until the last moment.
808 
809 no_network.py was updated to retain parallelism.
810]
811[TAG allmydata-tahoe-1.8.2
812warner@lothar.com**20110131020101]
813Patch bundle hash:
8145c91cd26a8438dc743cebd72eee4011160933295