Ticket #1104: del-to-unlink.darcs.patch

File del-to-unlink.darcs.patch, 25.6 KB (added by davidsarah, at 2011-07-13T03:08:02Z)
  • WUI: change the label of the button to unlink a file from 'del' to 'unlink'. Also change some internal names to 'unlink', and allow 't=unlink' as a synonym for 't=delete' in the web-API interface. Incidentally, improve a test to check for the rename button as well as the unlink button. * docs: some changes of 'delete' or 'rm' to 'unlink'. fixes #1104
Line 
12 patches for repository davidsarah@dev.allmydata.org:/home/darcs/tahoe/trunk:
2
3Wed Jul 13 01:12:18 BST 2011  david-sarah@jacaranda.org
4  * WUI: change the label of the button to unlink a file from 'del' to 'unlink'. Also change some internal names to 'unlink', and allow 't=unlink' as a synonym for 't=delete' in the web-API interface. Incidentally, improve a test to check for the rename button as well as the unlink button. fixes #1104
5
6Wed Jul 13 01:27:22 BST 2011  david-sarah@jacaranda.org
7  * docs: some changes of 'delete' or 'rm' to 'unlink'. refs #1104
8
9New patches:
10
11[WUI: change the label of the button to unlink a file from 'del' to 'unlink'. Also change some internal names to 'unlink', and allow 't=unlink' as a synonym for 't=delete' in the web-API interface. Incidentally, improve a test to check for the rename button as well as the unlink button. fixes #1104
12david-sarah@jacaranda.org**20110713001218
13 Ignore-this: 3eef6b3f81b94a9c0020a38eb20aa069
14] {
15hunk ./docs/frontends/webapi.rst 91
16 operations are required to have no side-effects.
17 
18 PUT is used to upload new objects into the filesystem, or to replace an
19-existing object. DELETE it used to delete objects from the filesystem. Both
20+existing object. DELETE is used to delete objects from the filesystem. Both
21 PUT and DELETE are required to be idempotent: performing the same operation
22 multiple times must have the same side-effects as only performing it once.
23 
24hunk ./docs/frontends/webapi.rst 1162
25  into the subtree will see that the child subdirectories are not modified by
26  this operation. Only the link from the given directory to its child is severed.
27 
28+ In Tahoe-LAFS v1.9.0 and later, t=unlink can be used as a synonym for t=delete.
29+ If interoperability with older web-API servers is required, t=delete should
30+ be used.
31+
32+
33 Renaming A Child
34 ----------------
35 
36hunk ./src/allmydata/test/test_web.py 1088
37                                r'\s+<td align="right">%d</td>' % len(self.BAR_CONTENTS),
38                                ])
39             self.failUnless(re.search(get_bar, res), res)
40-            for line in res.split("\n"):
41-                # find the line that contains the delete button for bar.txt
42-                if ("form action" in line and
43-                    'value="delete"' in line and
44-                    'value="bar.txt"' in line):
45-                    # the form target should use a relative URL
46-                    foo_url = urllib.quote("%s/uri/%s/" % (ROOT, self._foo_uri))
47-                    self.failUnless(('action="%s"' % foo_url) in line, line)
48-                    # and the when_done= should too
49-                    #done_url = urllib.quote(???)
50-                    #self.failUnless(('name="when_done" value="%s"' % done_url)
51-                    #                in line, line)
52-                    break
53-            else:
54-                self.fail("unable to find delete-bar.txt line", res)
55+            for label in ['unlink', 'rename']:
56+                for line in res.split("\n"):
57+                    # find the line that contains the relevant button for bar.txt
58+                    if ("form action" in line and
59+                        ('value="%s"' % (label,)) in line and
60+                        'value="bar.txt"' in line):
61+                        # the form target should use a relative URL
62+                        foo_url = urllib.quote("%s/uri/%s/" % (ROOT, self._foo_uri))
63+                        self.failUnlessIn('action="%s"' % foo_url, line)
64+                        # and the when_done= should too
65+                        #done_url = urllib.quote(???)
66+                        #self.failUnlessIn('name="when_done" value="%s"' % done_url, line)
67+
68+                        # 'unlink' needs to use POST because it directly has a side effect
69+                        if label == 'unlink':
70+                            self.failUnlessIn('method="post"', line)
71+                        break
72+                else:
73+                    self.fail("unable to find '%s bar.txt' line" % (label,), res)
74 
75             # the DIR reference just points to a URI
76             sub_url = ("%s/uri/%s/" % (ROOT, urllib.quote(self._sub_uri)))
77hunk ./src/allmydata/test/test_web.py 2637
78         d.addCallback(self.failUnlessIsBarDotTxt)
79         return d
80 
81-    def test_POST_delete(self):
82-        d = self.POST(self.public_url + "/foo", t="delete", name="bar.txt")
83+    def test_POST_delete(self, command_name='delete'):
84+        d = self._foo_node.list()
85+        def _check_before(children):
86+            self.failUnless(u"bar.txt" in children)
87+        d.addCallback(_check_before)
88+        d.addCallback(lambda res: self.POST(self.public_url + "/foo", t=command_name, name="bar.txt"))
89         d.addCallback(lambda res: self._foo_node.list())
90hunk ./src/allmydata/test/test_web.py 2644
91-        def _check(children):
92+        def _check_after(children):
93             self.failIf(u"bar.txt" in children)
94hunk ./src/allmydata/test/test_web.py 2646
95-        d.addCallback(_check)
96+        d.addCallback(_check_after)
97         return d
98 
99hunk ./src/allmydata/test/test_web.py 2649
100+    def test_POST_unlink(self):
101+        return self.test_POST_delete(command_name='unlink')
102+
103     def test_POST_rename_file(self):
104         d = self.POST(self.public_url + "/foo", t="rename",
105                       from_name="bar.txt", to_name='wibble.txt')
106hunk ./src/allmydata/web/directory.py 205
107             d = self._POST_upload(ctx) # this one needs the context
108         elif t == "uri":
109             d = self._POST_uri(req)
110-        elif t == "delete":
111-            d = self._POST_delete(req)
112+        elif t == "delete" or t == "unlink":
113+            d = self._POST_unlink(req)
114         elif t == "rename":
115             d = self._POST_rename(req)
116         elif t == "check":
117hunk ./src/allmydata/web/directory.py 364
118         d.addCallback(lambda res: childcap)
119         return d
120 
121-    def _POST_delete(self, req):
122+    def _POST_unlink(self, req):
123         name = get_arg(req, "name")
124         if name is None:
125             # apparently an <input type="hidden" name="name" value="">
126hunk ./src/allmydata/web/directory.py 369
127             # won't show up in the resulting encoded form.. the 'name'
128-            # field is completely missing. So to allow deletion of an
129-            # empty file, we have to pretend that None means ''. The only
130-            # downside of this is a slightly confusing error message if
131-            # someone does a POST without a name= field. For our own HTML
132-            # this isn't a big deal, because we create the 'delete' POST
133-            # buttons ourselves.
134+            # field is completely missing. So to allow unlinking of a
135+            # child with a name that is the empty string, we have to
136+            # pretend that None means ''. The only downside of this is
137+            # a slightly confusing error message if someone does a POST
138+            # without a name= field. For our own HTML this isn't a big
139+            # deal, because we create the 'unlink' POST buttons ourselves.
140             name = ''
141         charset = get_arg(req, "_charset", "utf-8")
142         name = name.decode(charset)
143hunk ./src/allmydata/web/directory.py 379
144         d = self.node.delete(name)
145-        d.addCallback(lambda res: "thing deleted")
146+        d.addCallback(lambda res: "thing unlinked")
147         return d
148 
149     def _POST_rename(self, req):
150hunk ./src/allmydata/web/directory.py 647
151         root = get_root(ctx)
152         here = "%s/uri/%s/" % (root, urllib.quote(self.node.get_uri()))
153         if self.node.is_unknown() or self.node.is_readonly():
154-            delete = "-"
155+            unlink = "-"
156             rename = "-"
157         else:
158hunk ./src/allmydata/web/directory.py 650
159-            # this creates a button which will cause our child__delete method
160-            # to be invoked, which deletes the file and then redirects the
161+            # this creates a button which will cause our _POST_unlink method
162+            # to be invoked, which unlinks the file and then redirects the
163             # browser back to this directory
164hunk ./src/allmydata/web/directory.py 653
165-            delete = T.form(action=here, method="post")[
166-                T.input(type='hidden', name='t', value='delete'),
167+            unlink = T.form(action=here, method="post")[
168+                T.input(type='hidden', name='t', value='unlink'),
169                 T.input(type='hidden', name='name', value=name),
170                 T.input(type='hidden', name='when_done', value="."),
171hunk ./src/allmydata/web/directory.py 657
172-                T.input(type='submit', value='del', name="del"),
173+                T.input(type='submit', value='unlink', name="unlink"),
174                 ]
175 
176             rename = T.form(action=here, method="get")[
177hunk ./src/allmydata/web/directory.py 667
178                 T.input(type='submit', value='rename', name="rename"),
179                 ]
180 
181-        ctx.fillSlots("delete", delete)
182+        ctx.fillSlots("unlink", unlink)
183         ctx.fillSlots("rename", rename)
184 
185         times = []
186hunk ./src/allmydata/web/directory.xhtml 34
187       <td><n:slot name="filename"/></td>
188       <td align="right"><n:slot name="size"/></td>
189       <td><n:slot name="times"/></td>
190-      <td><n:slot name="delete"/></td>
191+      <td><n:slot name="unlink"/></td>
192       <td><n:slot name="rename"/></td>
193       <td><n:slot name="info"/></td>
194     </tr>
195}
196[docs: some changes of 'delete' or 'rm' to 'unlink'. refs #1104
197david-sarah@jacaranda.org**20110713002722
198 Ignore-this: 304d2a330d5e6e77d5f1feed7814b21c
199] {
200hunk ./docs/frontends/CLI.rst 47
201 The "``tahoe``" tool provides access to three categories of commands.
202 
203 * node management: create a client/server node, start/stop/restart it
204-* filesystem manipulation: list files, upload, download, delete, rename
205+* filesystem manipulation: list files, upload, download, unlink, rename
206 * debugging: unpack cap-strings, examine share files
207 
208 To get a list of all commands, just run "``tahoe``" with no additional
209hunk ./docs/frontends/CLI.rst 137
210 =======================
211 
212 These commands let you exmaine a Tahoe-LAFS filesystem, providing basic
213-list/upload/download/delete/rename/mkdir functionality. They can be used as
214+list/upload/download/unlink/rename/mkdir functionality. They can be used as
215 primitives by other scripts. Most of these commands are fairly thin wrappers
216 around web-API calls, which are described in `<webapi.rst>`_.
217 
218hunk ./docs/frontends/CLI.rst 351
219 
220  This uses the python 'webbrowser' module to cause a local web browser to
221  open to the web page for the given directory. This page offers interfaces to
222- add, download, rename, and delete files in the directory. If no alias or
223- path is given, this command opens the root directory of the default
224- ``tahoe:`` alias.
225+ add, download, rename, and unlink files and subdirectories in that directory.
226+ If no alias or path is given, this command opens the root directory of the
227+ default ``tahoe:`` alias.
228 
229 ``tahoe put file.txt``
230 
231hunk ./docs/frontends/CLI.rst 434
232  This copies a file from your ``tahoe:`` root to a different directory, set up
233  earlier with "``tahoe add-alias fun DIRCAP``" or "``tahoe create-alias fun``".
234 
235-``tahoe rm uploaded.txt``
236+``tahoe unlink uploaded.txt``
237 
238hunk ./docs/frontends/CLI.rst 436
239-``tahoe rm tahoe:uploaded.txt``
240+``tahoe unlink tahoe:uploaded.txt``
241 
242hunk ./docs/frontends/CLI.rst 438
243- This deletes a file from your ``tahoe:`` root.
244+ This unlinks a file from your ``tahoe:`` root (that is, causes there to no
245+ longer be an entry ``uploaded.txt`` in the root directory that points to it).
246+ Note that this does not delete the file from the grid.
247+ For backward compatibility, ``tahoe rm`` is accepted as a synonym for
248+ ``tahoe unlink``.
249 
250 ``tahoe mv uploaded.txt renamed.txt``
251 
252hunk ./docs/specifications/dirnodes.rst 391
253 and care about specific dirnodes can ask to keep them alive for a while, by
254 renewing a lease on them (with a typical period of one month). Clients are
255 expected to assist in the deletion of dirnodes by canceling their leases as
256-soon as they are done with them. This means that when a client deletes a
257+soon as they are done with them. This means that when a client unlinks a
258 directory, it should also cancel its lease on that directory. When the lease
259 count on a given share goes to zero, the storage server can delete the
260 related storage. Multiple clients may all have leases on the same dirnode:
261}
262
263Context:
264
265[add Protovis.js-based download-status timeline visualization
266Brian Warner <warner@lothar.com>**20110629222606
267 Ignore-this: 477ccef5c51b30e246f5b6e04ab4a127
268 
269 provide status overlap info on the webapi t=json output, add decode/decrypt
270 rate tooltips, add zoomin/zoomout buttons
271]
272[add more download-status data, fix tests
273Brian Warner <warner@lothar.com>**20110629222555
274 Ignore-this: e9e0b7e0163f1e95858aa646b9b17b8c
275]
276[prepare for viz: improve DownloadStatus events
277Brian Warner <warner@lothar.com>**20110629222542
278 Ignore-this: 16d0bde6b734bb501aa6f1174b2b57be
279 
280 consolidate IDownloadStatusHandlingConsumer stuff into DownloadNode
281]
282[docs: fix error in crypto specification that was noticed by Taylor R Campbell <campbell+tahoe@mumble.net>
283zooko@zooko.com**20110629185711
284 Ignore-this: b921ed60c1c8ba3c390737fbcbe47a67
285]
286[setup.py: don't make bin/tahoe.pyscript executable. fixes #1347
287david-sarah@jacaranda.org**20110130235809
288 Ignore-this: 3454c8b5d9c2c77ace03de3ef2d9398a
289]
290[Makefile: remove targets relating to 'setup.py check_auto_deps' which no longer exists. fixes #1345
291david-sarah@jacaranda.org**20110626054124
292 Ignore-this: abb864427a1b91bd10d5132b4589fd90
293]
294[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
295david-sarah@jacaranda.org**20110623205528
296 Ignore-this: c63e23146c39195de52fb17c7c49b2da
297]
298[Rename test_package_initialization.py to (much shorter) test_import.py .
299Brian Warner <warner@lothar.com>**20110611190234
300 Ignore-this: 3eb3dbac73600eeff5cfa6b65d65822
301 
302 The former name was making my 'ls' listings hard to read, by forcing them
303 down to just two columns.
304]
305[tests: fix tests to accomodate [20110611153758-92b7f-0ba5e4726fb6318dac28fb762a6512a003f4c430]
306zooko@zooko.com**20110611163741
307 Ignore-this: 64073a5f39e7937e8e5e1314c1a302d1
308 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.
309 fixes #1412
310]
311[wui: right-align the size column in the WUI
312zooko@zooko.com**20110611153758
313 Ignore-this: 492bdaf4373c96f59f90581c7daf7cd7
314 Thanks to Ted "stercor" Rolle Jr. and Terrell Russell.
315 fixes #1412
316]
317[docs: three minor fixes
318zooko@zooko.com**20110610121656
319 Ignore-this: fec96579eb95aceb2ad5fc01a814c8a2
320 CREDITS for arc for stats tweak
321 fix link to .zip file in quickstart.rst (thanks to ChosenOne for noticing)
322 English usage tweak
323]
324[server.py:  get_latencies now reports percentiles _only_ if there are sufficient observations for the interpretation of the percentile to be unambiguous.
325wilcoxjg@gmail.com**20110527120135
326 Ignore-this: 2e7029764bffc60e26f471d7c2b6611e
327 interfaces.py:  modified the return type of RIStatsProvider.get_stats to allow for None as a return value
328 NEWS.rst, stats.py: documentation of change to get_latencies
329 stats.rst: now documents percentile modification in get_latencies
330 test_storage.py:  test_latencies now expects None in output categories that contain too few samples for the associated percentile to be unambiguously reported.
331 fixes #1392
332]
333[corrected "k must never be smaller than N" to "k must never be greater than N"
334secorp@allmydata.org**20110425010308
335 Ignore-this: 233129505d6c70860087f22541805eac
336]
337[docs/running.rst: fix stray HTML (not .rst) link noticed by ChosenOne.
338david-sarah@jacaranda.org**20110609223719
339 Ignore-this: fc50ac9c94792dcac6f1067df8ac0d4a
340]
341[docs: revert link in relnotes.txt from NEWS.rst to NEWS, since the former did not exist at revision 5000.
342david-sarah@jacaranda.org**20110517011214
343 Ignore-this: 6a5be6e70241e3ec0575641f64343df7
344]
345[docs: convert NEWS to NEWS.rst and change all references to it.
346david-sarah@jacaranda.org**20110517010255
347 Ignore-this: a820b93ea10577c77e9c8206dbfe770d
348]
349[docs: remove out-of-date docs/testgrid/introducer.furl and containing directory. fixes #1404
350david-sarah@jacaranda.org**20110512140559
351 Ignore-this: 784548fc5367fac5450df1c46890876d
352]
353[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
354david-sarah@jacaranda.org**20110130164923
355 Ignore-this: a271e77ce81d84bb4c43645b891d92eb
356]
357[setup: don't catch all Exception from check_requirement(), but only PackagingError and ImportError
358zooko@zooko.com**20110128142006
359 Ignore-this: 57d4bc9298b711e4bc9dc832c75295de
360 I noticed this because I had accidentally inserted a bug which caused AssertionError to be raised from check_requirement().
361]
362[M-x whitespace-cleanup
363zooko@zooko.com**20110510193653
364 Ignore-this: dea02f831298c0f65ad096960e7df5c7
365]
366[docs: fix typo in running.rst, thanks to arch_o_median
367zooko@zooko.com**20110510193633
368 Ignore-this: ca06de166a46abbc61140513918e79e8
369]
370[relnotes.txt: don't claim to work on Cygwin (which has been untested for some time). refs #1342
371david-sarah@jacaranda.org**20110204204902
372 Ignore-this: 85ef118a48453d93fa4cddc32d65b25b
373]
374[relnotes.txt: forseeable -> foreseeable. refs #1342
375david-sarah@jacaranda.org**20110204204116
376 Ignore-this: 746debc4d82f4031ebf75ab4031b3a9
377]
378[replace remaining .html docs with .rst docs
379zooko@zooko.com**20110510191650
380 Ignore-this: d557d960a986d4ac8216d1677d236399
381 Remove install.html (long since deprecated).
382 Also replace some obsolete references to install.html with references to quickstart.rst.
383 Fix some broken internal references within docs/historical/historical_known_issues.txt.
384 Thanks to Ravi Pinjala and Patrick McDonald.
385 refs #1227
386]
387[docs: FTP-and-SFTP.rst: fix a minor error and update the information about which version of Twisted fixes #1297
388zooko@zooko.com**20110428055232
389 Ignore-this: b63cfb4ebdbe32fb3b5f885255db4d39
390]
391[munin tahoe_files plugin: fix incorrect file count
392francois@ctrlaltdel.ch**20110428055312
393 Ignore-this: 334ba49a0bbd93b4a7b06a25697aba34
394 fixes #1391
395]
396[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
397david-sarah@jacaranda.org**20110411190738
398 Ignore-this: 7847d26bc117c328c679f08a7baee519
399]
400[tests: add test for including the ImportError message and traceback entry in the summary of errors from importing dependencies. refs #1389
401david-sarah@jacaranda.org**20110410155844
402 Ignore-this: fbecdbeb0d06a0f875fe8d4030aabafa
403]
404[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
405david-sarah@jacaranda.org**20110410155705
406 Ignore-this: 2f87b8b327906cf8bfca9440a0904900
407]
408[remove unused variable detected by pyflakes
409zooko@zooko.com**20110407172231
410 Ignore-this: 7344652d5e0720af822070d91f03daf9
411]
412[allmydata/__init__.py: Nicer reporting of unparseable version numbers in dependencies. fixes #1388
413david-sarah@jacaranda.org**20110401202750
414 Ignore-this: 9c6bd599259d2405e1caadbb3e0d8c7f
415]
416[update FTP-and-SFTP.rst: the necessary patch is included in Twisted-10.1
417Brian Warner <warner@lothar.com>**20110325232511
418 Ignore-this: d5307faa6900f143193bfbe14e0f01a
419]
420[control.py: remove all uses of s.get_serverid()
421warner@lothar.com**20110227011203
422 Ignore-this: f80a787953bd7fa3d40e828bde00e855
423]
424[web: remove some uses of s.get_serverid(), not all
425warner@lothar.com**20110227011159
426 Ignore-this: a9347d9cf6436537a47edc6efde9f8be
427]
428[immutable/downloader/fetcher.py: remove all get_serverid() calls
429warner@lothar.com**20110227011156
430 Ignore-this: fb5ef018ade1749348b546ec24f7f09a
431]
432[immutable/downloader/fetcher.py: fix diversity bug in server-response handling
433warner@lothar.com**20110227011153
434 Ignore-this: bcd62232c9159371ae8a16ff63d22c1b
435 
436 When blocks terminate (either COMPLETE or CORRUPT/DEAD/BADSEGNUM), the
437 _shares_from_server dict was being popped incorrectly (using shnum as the
438 index instead of serverid). I'm still thinking through the consequences of
439 this bug. It was probably benign and really hard to detect. I think it would
440 cause us to incorrectly believe that we're pulling too many shares from a
441 server, and thus prefer a different server rather than asking for a second
442 share from the first server. The diversity code is intended to spread out the
443 number of shares simultaneously being requested from each server, but with
444 this bug, it might be spreading out the total number of shares requested at
445 all, not just simultaneously. (note that SegmentFetcher is scoped to a single
446 segment, so the effect doesn't last very long).
447]
448[immutable/downloader/share.py: reduce get_serverid(), one left, update ext deps
449warner@lothar.com**20110227011150
450 Ignore-this: d8d56dd8e7b280792b40105e13664554
451 
452 test_download.py: create+check MyShare instances better, make sure they share
453 Server objects, now that finder.py cares
454]
455[immutable/downloader/finder.py: reduce use of get_serverid(), one left
456warner@lothar.com**20110227011146
457 Ignore-this: 5785be173b491ae8a78faf5142892020
458]
459[immutable/offloaded.py: reduce use of get_serverid() a bit more
460warner@lothar.com**20110227011142
461 Ignore-this: b48acc1b2ae1b311da7f3ba4ffba38f
462]
463[immutable/upload.py: reduce use of get_serverid()
464warner@lothar.com**20110227011138
465 Ignore-this: ffdd7ff32bca890782119a6e9f1495f6
466]
467[immutable/checker.py: remove some uses of s.get_serverid(), not all
468warner@lothar.com**20110227011134
469 Ignore-this: e480a37efa9e94e8016d826c492f626e
470]
471[add remaining get_* methods to storage_client.Server, NoNetworkServer, and
472warner@lothar.com**20110227011132
473 Ignore-this: 6078279ddf42b179996a4b53bee8c421
474 MockIServer stubs
475]
476[upload.py: rearrange _make_trackers a bit, no behavior changes
477warner@lothar.com**20110227011128
478 Ignore-this: 296d4819e2af452b107177aef6ebb40f
479]
480[happinessutil.py: finally rename merge_peers to merge_servers
481warner@lothar.com**20110227011124
482 Ignore-this: c8cd381fea1dd888899cb71e4f86de6e
483]
484[test_upload.py: factor out FakeServerTracker
485warner@lothar.com**20110227011120
486 Ignore-this: 6c182cba90e908221099472cc159325b
487]
488[test_upload.py: server-vs-tracker cleanup
489warner@lothar.com**20110227011115
490 Ignore-this: 2915133be1a3ba456e8603885437e03
491]
492[happinessutil.py: server-vs-tracker cleanup
493warner@lothar.com**20110227011111
494 Ignore-this: b856c84033562d7d718cae7cb01085a9
495]
496[upload.py: more tracker-vs-server cleanup
497warner@lothar.com**20110227011107
498 Ignore-this: bb75ed2afef55e47c085b35def2de315
499]
500[upload.py: fix var names to avoid confusion between 'trackers' and 'servers'
501warner@lothar.com**20110227011103
502 Ignore-this: 5d5e3415b7d2732d92f42413c25d205d
503]
504[refactor: s/peer/server/ in immutable/upload, happinessutil.py, test_upload
505warner@lothar.com**20110227011100
506 Ignore-this: 7ea858755cbe5896ac212a925840fe68
507 
508 No behavioral changes, just updating variable/method names and log messages.
509 The effects outside these three files should be minimal: some exception
510 messages changed (to say "server" instead of "peer"), and some internal class
511 names were changed. A few things still use "peer" to minimize external
512 changes, like UploadResults.timings["peer_selection"] and
513 happinessutil.merge_peers, which can be changed later.
514]
515[storage_client.py: clean up test_add_server/test_add_descriptor, remove .test_servers
516warner@lothar.com**20110227011056
517 Ignore-this: efad933e78179d3d5fdcd6d1ef2b19cc
518]
519[test_client.py, upload.py:: remove KiB/MiB/etc constants, and other dead code
520warner@lothar.com**20110227011051
521 Ignore-this: dc83c5794c2afc4f81e592f689c0dc2d
522]
523[test: increase timeout on a network test because Francois's ARM machine hit that timeout
524zooko@zooko.com**20110317165909
525 Ignore-this: 380c345cdcbd196268ca5b65664ac85b
526 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.
527]
528[docs/configuration.rst: add a "Frontend Configuration" section
529Brian Warner <warner@lothar.com>**20110222014323
530 Ignore-this: 657018aa501fe4f0efef9851628444ca
531 
532 this points to docs/frontends/*.rst, which were previously underlinked
533]
534[web/filenode.py: avoid calling req.finish() on closed HTTP connections. Closes #1366
535"Brian Warner <warner@lothar.com>"**20110221061544
536 Ignore-this: 799d4de19933f2309b3c0c19a63bb888
537]
538[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.
539david-sarah@jacaranda.org**20110221015817
540 Ignore-this: 51d181698f8c20d3aca58b057e9c475a
541]
542[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.
543david-sarah@jacaranda.org**20110221020125
544 Ignore-this: b0744ed58f161bf188e037bad077fc48
545]
546[Refactor StorageFarmBroker handling of servers
547Brian Warner <warner@lothar.com>**20110221015804
548 Ignore-this: 842144ed92f5717699b8f580eab32a51
549 
550 Pass around IServer instance instead of (peerid, rref) tuple. Replace
551 "descriptor" with "server". Other replacements:
552 
553  get_all_servers -> get_connected_servers/get_known_servers
554  get_servers_for_index -> get_servers_for_psi (now returns IServers)
555 
556 This change still needs to be pushed further down: lots of code is now
557 getting the IServer and then distributing (peerid, rref) internally.
558 Instead, it ought to distribute the IServer internally and delay
559 extracting a serverid or rref until the last moment.
560 
561 no_network.py was updated to retain parallelism.
562]
563[TAG allmydata-tahoe-1.8.2
564warner@lothar.com**20110131020101]
565Patch bundle hash:
5661bd3d89e65fcd55f6ab19a05c274d8a1f0928611