Ticket #641: half-fix-for-bug-_641_.dpatch

File half-fix-for-bug-_641_.dpatch, 23.4 KB (added by azazel, at 2009-02-25T01:10:03Z)
Line 
1Tue Feb 24 18:30:00 CET 2009  Alberto Berti <alberto@metapensiero.it>
2  * Half fix for bug #641.
3 
4  Instead of raising an exception and exit when a non backuppable file
5  is encountered if the '--skip-problematic' or '-s' is specified on the
6  command line the file will be skipped and backup will continue.
7 
8  Test not yet added because i'm unable to think to a platform-agnostic
9  way to test it. As soon as i've understood test_backup, i'll add one
10  for linux platform.
11
12Tue Feb 24 18:30:42 CET 2009  Alberto Berti <alberto@metapensiero.it>
13  * Added doc for '--skip-problematic' cli backup command.
14
15New patches:
16
17[Half fix for bug #641.
18Alberto Berti <alberto@metapensiero.it>**20090224173000
19 Ignore-this: 195d29650b661bca0d68d1daa2da79cb
20 
21 Instead of raising an exception and exit when a non backuppable file
22 is encountered if the '--skip-problematic' or '-s' is specified on the
23 command line the file will be skipped and backup will continue.
24 
25 Test not yet added because i'm unable to think to a platform-agnostic
26 way to test it. As soon as i've understood test_backup, i'll add one
27 for linux platform.
28] {
29hunk ./src/allmydata/scripts/cli.py 210
30         ("verbose", "v", "Be noisy about what is happening."),
31         ("no-backupdb", None, "Do not use the SQLite-based backup-database (always upload all files)."),
32         ("ignore-timestamps", None, "Do not use backupdb timestamps to decide if a local file is unchanged."),
33+        ("skip-problematic", "s", "Skip non backuppable files like dangling symlinks, devices, etc. instead of stop backup processing"),
34         ]
35 
36     vcs_patterns = ('CVS', 'RCS', 'SCCS', '.git', '.gitignore', '.cvsignore', '.svn',
37hunk ./src/allmydata/scripts/tahoe_backup.py 1
38-
39 import os.path
40 import time
41 import urllib
42hunk ./src/allmydata/scripts/tahoe_backup.py 132
43         self.directories_created = 0
44         self.directories_reused = 0
45         self.directories_checked = 0
46+        self.problematic_skipped = 0
47 
48     def run(self):
49         options = self.options
50hunk ./src/allmydata/scripts/tahoe_backup.py 206
51                     latest_backup_dircap = str(archives_dir[archive_name][1]["ro_uri"])
52 
53         # third step: process the tree
54-        new_backup_dircap = self.process(options.from_dir, latest_backup_dircap)
55+        new_backup_dircap = self.process(options.from_dir, latest_backup_dircap,
56+                                         self.options['skip-problematic'])
57 
58         # fourth: attach the new backup to the list
59         new_readonly_backup_dircap = readonly(new_backup_dircap)
60hunk ./src/allmydata/scripts/tahoe_backup.py 221
61 
62         if self.verbosity >= 1:
63             print >>stdout, (" %d files uploaded (%d reused), "
64-                             "%d directories created (%d reused)"
65+                             "%d directories created (%d reused), "
66+                             "%d problematic files skipped"
67                              % (self.files_uploaded,
68                                 self.files_reused,
69                                 self.directories_created,
70hunk ./src/allmydata/scripts/tahoe_backup.py 226
71-                                self.directories_reused))
72+                                self.directories_reused,
73+                                self.problematic_skipped))
74             if self.verbosity >= 2:
75                 print >>stdout, (" %d files checked, %d directories checked, "
76                                  "%d directories read"
77hunk ./src/allmydata/scripts/tahoe_backup.py 242
78         if self.verbosity >= 2:
79             print >>self.options.stdout, msg
80 
81-    def process(self, localpath, olddircap):
82+    def process(self, localpath, olddircap, skip_problematic=False):
83         # returns newdircap
84 
85         self.verboseprint("processing %s, olddircap %s" % (localpath, olddircap))
86hunk ./src/allmydata/scripts/tahoe_backup.py 259
87                 if olddircontents is not None and child in olddircontents:
88                     oldchildcap = olddircontents[child][1]
89                 # recurse on the child directory
90-                newchilddircap = self.process(childpath, oldchildcap)
91+                newchilddircap = self.process(childpath, oldchildcap, skip_problematic)
92                 newdircontents[child] = ("dirnode", newchilddircap, metadata)
93             elif os.path.isfile(childpath):
94                 newfilecap, metadata = self.upload(childpath)
95hunk ./src/allmydata/scripts/tahoe_backup.py 265
96                 newdircontents[child] = ("filenode", newfilecap, metadata)
97             else:
98-                raise BackupProcessingError("Cannot backup this file %r" % childpath)
99+                if skip_problematic:
100+                    self.problematic_skipped += 1
101+                    self.verboseprint("skipping problematic file %s.." % childpath)
102+                else:
103+                    raise BackupProcessingError("Cannot backup this file %r" % childpath)
104 
105         if (olddircap
106             and olddircontents is not None
107}
108[Added doc for '--skip-problematic' cli backup command.
109Alberto Berti <alberto@metapensiero.it>**20090224173042
110 Ignore-this: 76399da70f07042cffa6d07d77400580
111] hunk ./docs/frontends/CLI.txt 390
112   * .hgignore
113   * _darcs
114 
115+tahoe backup --skip-problematic ~ work:backups
116+
117+ With '--skip-problematic' (or '-s') option added, the backup command
118+ tree walker will skip files or filetypes that it can't backup yet,
119+ instead of surrender and stop the backup process, exiting with an
120+ error.
121+
122 == Virtual Drive Maintenance ==
123 
124 tahoe manifest tahoe:
125
126Context:
127
128[test_web: add (disabled) test to see what happens when deep-check encounters an unrecoverable directory. We still need code changes to improve this behavior.
129warner@lothar.com**20090224214017
130 Ignore-this: e839f1b0ec40f53fedcd809c2a30d5f9
131] 
132[test_repairer: change to use faster no_network.GridTestMixin, split Verifier tests into separate cases, refactor judgement funcs into shared methods
133warner@lothar.com**20090224041506
134 Ignore-this: 584ce72d6276da5edc00562793d4ee53
135] 
136[immutable/checker.py: trap ShareVersionIncompatible too. Also, use f.check
137warner@lothar.com**20090224041405
138 Ignore-this: b667e8d3192116293babcacdeed42898
139 instead of examining the value returned by f.trap, because the latter appears
140 to squash exception types down into their base classes (i.e. since
141 ShareVersionIncompatible is a subclass of LayoutInvalid,
142 f.trap(Failure(ShareVersionIncompatible)) == LayoutInvalid).
143 
144 All this resulted in 'incompatible' shares being misclassified as 'corrupt'.
145] 
146[immutable/layout.py: wrap to 80 cols, no functional changes
147warner@lothar.com**20090224005837
148 Ignore-this: 40019480180ec34141506a28d7711608
149] 
150[test_repairer: change Repairer to use much-faster no_network.GridTestMixin. As a side-effect, fix what I think was a bug: some of the assert-minimal-effort-expended checks were mixing write counts and allocate counts
151warner@lothar.com**20090223234227
152 Ignore-this: d58bd0a909f9939775730cda4a858cae
153] 
154[test/no_network.py: add a basic stats provider
155warner@lothar.com**20090223233937
156 Ignore-this: c9f3cc4eed99cfc36f68938ceff4162c
157] 
158[tests: stop using setUpClass/tearDownClass, since they've been deprecated in Twisted-8.2.0
159warner@lothar.com**20090223204312
160 Ignore-this: 24c6592141cf64103530c024f93a5b88
161] 
162[test_checker: improve test coverage for checker results
163warner@lothar.com**20090223201943
164 Ignore-this: 83e173602f0f4c811a7a9893d85385df
165] 
166[Two small fixes on documentation for cli backup command.
167Alberto Berti <alberto@metapensiero.it>**20090224223634
168 Ignore-this: 5634a6dadad6e4e43a112de7fe5c74c
169] 
170[Add elapsed timestamp to cli backup command final summary.
171Alberto Berti <alberto@metapensiero.it>**20090224171425
172 Ignore-this: 9a042d11f95ee9f6858a5096d513c0bc
173] 
174[Added documentation for '--exclude' and friends cli backup command.
175Alberto Berti <alberto@metapensiero.it>**20090224153049
176 Ignore-this: bbc791fa56e38535bb82cc3077ffde90
177] 
178[misc/*: remove RuntimeError too
179warner@lothar.com**20090222233401
180 Ignore-this: b76f8a184f75bb28eb9d8002f957936a
181] 
182[scripts: stop using RuntimeError, for #639
183warner@lothar.com**20090222233106
184 Ignore-this: 686a424442670fffbd4d1816c284a601
185] 
186[mutable/publish: stop using RuntimeError, for #639
187warner@lothar.com**20090222233056
188 Ignore-this: 2a80a661c7850d97357caddad48c6e9d
189] 
190[remove more RuntimeError from unit tests, for #639
191warner@lothar.com**20090222232855
192 Ignore-this: 1a1c3e1457f3f29ba7101fe406ee5f43
193] 
194[stop using RuntimeError in unit tests, for #639
195warner@lothar.com**20090222232722
196 Ignore-this: 475ce0c0dcd7a1f5ed83ef460312efea
197] 
198[ftpd/sftpd: stop using RuntimeError, for #639
199warner@lothar.com**20090222232426
200 Ignore-this: 97001362c4ba9e94b2e254e229b79987
201] 
202[docs: CREDITS to Alberto Berti
203zooko@zooko.com**20090222193314
204 Ignore-this: 74d370ada3234cce9e58aec15d739f71
205] 
206[Fixed tests again so they will pass on windows.
207Alberto Berti <alberto@metapensiero.it>**20090223003502
208 Ignore-this: 80d5074e7153642a2fa2a77958bfb50d
209] 
210[Added tests for the cse when listdir is an iterator
211Alberto Berti <alberto@metapensiero.it>**20090222224356
212 Ignore-this: 218fb2aba02c28b4b1e5324bdb5adeaa
213] 
214[Fixed tests so that they pass also on buildbots.
215Alberto Berti <alberto@metapensiero.it>**20090222224311
216 Ignore-this: fcb91cd6acf028382411d23d380a4576
217] 
218[Use failUnlessEqual instead of failUnless(a == b)
219Alberto Berti <alberto@metapensiero.it>**20090222224214
220 Ignore-this: 8f9144632e3ac9acb4726fb48a083bf4
221] 
222[Better implementation of filtering algorithm.
223Alberto Berti <alberto@metapensiero.it>**20090222224049
224 Ignore-this: 67a8bd2f99bcc87ca2443bef13370a87
225] 
226[Removed '.hgrags' from vcs excludes
227Alberto Berti <alberto@metapensiero.it>**20090222223946
228 Ignore-this: 3e94c22fc9d85f380ee11fb8bdb4d1e9
229] 
230[docs: move many specification-like documents into specifications/
231warner@lothar.com**20090222054054
232 Ignore-this: a4110cc478198c0611205aba1ccf54f4
233] 
234[test_web.py: increase test coverage of web.status.plural()
235warner@lothar.com**20090222000116
236 Ignore-this: 3138c9d5d2410d8e1121e9b2ed694169
237] 
238[crawler: fix performance problems: only save state once per timeslice (not after every bucket), don't start the crawler until 5 minutes after node startup
239warner@lothar.com**20090221205649
240 Ignore-this: e6551569982bd31d19779ff15c2d6f58
241] 
242[test_system: oops, don't assume that all files in storage/ are in a deep storage/shares/prefix/si/shnum path, since now the crawler pickle has a short path
243warner@lothar.com**20090221061710
244 Ignore-this: fde76d0e5cae853014d1bb18b5f17dae
245] 
246[crawler: tolerate low-resolution system clocks (i.e. windows)
247warner@lothar.com**20090221061533
248 Ignore-this: 57286a3abcaf44f6d1a78c3c1ad547a5
249] 
250[BucketCountingCrawler: store just the count, not cycle+count, since it's too easy to make usage mistakes otherwise
251warner@lothar.com**20090221035831
252 Ignore-this: 573b6f651af74380cdd64059fbbdda4b
253] 
254[test_storage: startService the server, as is now the standard practice
255warner@lothar.com**20090221035755
256 Ignore-this: 3999889bd628fe4039bbcf1b29160453
257] 
258[crawler: load state from the pickle in init, rather than waiting until startService, so get_state() can be called early
259warner@lothar.com**20090221035720
260 Ignore-this: ecd128a5f4364c0daf4b72d791340b66
261] 
262[BucketCountingCrawler: rename status and state keys to use 'bucket' instead of 'share', because the former is more accurate
263warner@lothar.com**20090221034606
264 Ignore-this: cf819f63fac9506c878d6c9715ce35b7
265] 
266[storage: also report space-free-for-root and space-free-for-nonroot, since that helps users understand the space-left-for-tahoe number better
267warner@lothar.com**20090221032856
268 Ignore-this: 9fdf0475f758acd98b73026677170b45
269] 
270[storage: add bucket-counting share crawler, add its output (number of files+directories maintained by a storage server) and status to the webapi /storage page
271warner@lothar.com**20090221030408
272 Ignore-this: 28761c5e076648026bc5f518506db65c
273] 
274[storage: move si_b2a/si_a2b/storage_index_to_dir out of server.py and into common.py
275warner@lothar.com**20090221030309
276 Ignore-this: 645056428ab797f0b542831c82bf192a
277] 
278[crawler: add get_progress, clean up get_state
279warner@lothar.com**20090221002743
280 Ignore-this: 9bea69f154c75b31a53425a8ea67789b
281] 
282[Added --exclude, --exclude-from and --exclude-vcs options to backup command.
283Alberto Berti <alberto@metapensiero.it>**20090222170829
284 Ignore-this: 4912890229cd54a2f61f14f06bc4afcc
285 
286 It is still impossible to specify absolute exclusion path, only
287 relative. I must check with tar or rsync how they allow them to be
288 specified.
289] 
290[Raise a more explanatory exception for errors encountered during backup processing.
291Alberto Berti <alberto@metapensiero.it>**20090222170252
292 Ignore-this: f6b8ffe2a903ba07a2c1c59130dac1e4
293] 
294[Added tests for the --exclude* options of backup command.
295Alberto Berti <alberto@metapensiero.it>**20090222165106
296 Ignore-this: f1b931cf2e7929ce47b737c022bca707
297] 
298[Added tests for the fixed alias related command's synopsis
299Alberto Berti <alberto@metapensiero.it>**20090222163732
300 Ignore-this: 4432b4e88e990ba53a5b3fe0f12db2ac
301] 
302[web/storage: make sure we can handle platforms without os.statvfs too
303warner@lothar.com**20090220220353
304 Ignore-this: 79d4cb8482a8543b9759dc949c86c587
305] 
306[crawler: provide for one-shot crawlers, which stop after their first full cycle, for share-upgraders and database-populaters
307warner@lothar.com**20090220211911
308 Ignore-this: fcdf72c5ffcafa374d376388be6fa5c5
309] 
310[web: add Storage status page, improve tests
311warner@lothar.com**20090220202926
312 Ignore-this: e34d5270dcf0237fe72f573f717c7a4
313] 
314[storage: include reserved_space in stats
315warner@lothar.com**20090220202920
316 Ignore-this: b5b480fe0abad0148ecad0c1fb47ecae
317] 
318[web/check_results: sort share identifiers in the sharemap display
319warner@lothar.com**20090220182922
320 Ignore-this: 5c7bfcee3e15c7082c3653eb8a460960
321] 
322[webapi: pass client through constructor arguments, remove IClient, should make it easier to test web renderers in isolation
323warner@lothar.com**20090220181554
324 Ignore-this: e7848cd1bee8faf2ce7aaf040b9bf8e3
325] 
326[test/no_network: do startService on the storage servers, make it easier to customize the storage servers
327warner@lothar.com**20090220022254
328 Ignore-this: e62f328721c007e4c5ee023a6efdf66d
329] 
330[crawler: modify API to support upcoming bucket-counting crawler
331warner@lothar.com**20090220013142
332 Ignore-this: 808f8382837b13082f8b245db2ebee06
333] 
334[test_backupdb: make the not-a-database file larger, since the older sqlite-2.3.2 on OS-X is easily fooled
335warner@lothar.com**20090220000409
336 Ignore-this: 694d2ca5053bb96e91670765d0cedf2e
337] 
338[web/reliability: add parameter descriptions, adapted from a patch from Terrell Russell.
339warner@lothar.com**20090219222918
340 Ignore-this: 835f5ab01e1aff31b2ff9febb9a51f3
341] 
342[test_crawler: hush pyflakes
343warner@lothar.com**20090219202340
344 Ignore-this: 765d22c9c9682cc86c5205dc130500af
345] 
346[test_crawler: disable the percentage-of-cpu-used test, since it is too unreliable on our slow buildslaves. But leave the code in place for developers to run by hand.
347warner@lothar.com**20090219201654
348 Ignore-this: ff7cf5cfa79c6f2ef0cf959495dd989a
349] 
350[reliability.py: fix the numpy conversion, it was completely broken. Thanks to Terrell Russell for the help.
351warner@lothar.com**20090219195515
352 Ignore-this: f2b1eb65855111b338e1487feee1bbcf
353] 
354[reliability: switch to NumPy, since Numeric is deprecated
355warner@lothar.com**20090219074435
356 Ignore-this: f588a68e9bcd3b0bc3653570882b6fd5
357] 
358[setup.py: fix pyflakes complaints
359warner@lothar.com**20090219073643
360 Ignore-this: a314e5456b0a796bc9f70232a119ec68
361] 
362[move show-tool-versions out of setup.py and into a separate script in misc/ , since setuptools is trying to build and install a bunch of stuff first
363warner@lothar.com**20090219073558
364 Ignore-this: 9e56bc43026379212e6b6671ed6a1fd4
365] 
366[test_crawler: don't require >=1 cycle on cygwin
367warner@lothar.com**20090219065818
368 Ignore-this: b8d2d40f26aeb30a7622479840a04635
369] 
370[setup.py: add show_tool_versions command, for the benefit of a new buildbot step
371warner@lothar.com**20090219062436
372 Ignore-this: 21d761c76a033e481831584bedc60c86
373] 
374[setup.py: wrap to 80 cols, no functional changes
375warner@lothar.com**20090219055751
376 Ignore-this: d29e57c6ee555f2ee435667b7e13e60b
377] 
378[crawler: use fileutil.move_info_place in preference to our own version
379warner@lothar.com**20090219051342
380 Ignore-this: ee4e46f3de965610503ba36b28184db9
381] 
382[fileutil: add move_into_place(), to perform the standard unix trick of atomically replacing a file, with a fallback for windows
383warner@lothar.com**20090219051310
384 Ignore-this: c1d35e8ca88fcb223ea194513611c511
385] 
386[crawler: fix problems on windows and our slow cygwin slave
387warner@lothar.com**20090219042431
388 Ignore-this: 8019cb0da79ba00c536183a6f57b4cab
389] 
390[#633: first version of a rate-limited interruptable share-crawler
391warner@lothar.com**20090219034633
392 Ignore-this: 5d2d30c743e3b096a8e775d5a9b33601
393] 
394[change StorageServer to take nodeid in the constructor, instead of assigning it later, since it's cleaner and because the original problem (Tubs not being ready until later) went away
395warner@lothar.com**20090218222301
396 Ignore-this: 740d582f20c93bebf60e21d9a446d3d2
397] 
398[test_system: split off checker tests to test_deepcheck.py, this file is too big
399warner@lothar.com**20090218214234
400 Ignore-this: 82bf8db81dfbc98224bbf694054a8761
401] 
402[break storage.py into smaller pieces in storage/*.py . No behavioral changes.
403warner@lothar.com**20090218204655
404 Ignore-this: 312d408d1cacc5a764d791b53ebf8f91
405] 
406[immutable/layout: minor change to repr name
407warner@lothar.com**20090218204648
408 Ignore-this: c8781ef15b7dea63b39236a1899b86ce
409] 
410[docs: add lease-tradeoffs diagram
411warner@lothar.com**20090218204137
412 Ignore-this: c22a589ad465dac846da834c30dc4083
413] 
414[Add missing synopsis and descriptions for alias commands.
415Alberto Berti <alberto@metapensiero.it>**20090221003106
416 Ignore-this: 8aedd03d36d92d912102c7f29e4ca697
417] 
418[interfaces.py: allow add/renew/cancel-lease to return Any, so that 1.3.1 clients (the first to use these calls) can tolerate future storage servers which might return something other than None
419warner@lothar.com**20090218192903
420 Ignore-this: dcbb704a05416ecc66d90fb486c3d75b
421] 
422[docs/debian.txt: minor edit
423warner@lothar.com**20090218032212
424 Ignore-this: 64ff1fb163ffca4bcfd920254f1cf866
425] 
426[add --add-lease to 'tahoe check', 'tahoe deep-check', and webapi.
427warner@lothar.com**20090218013243
428 Ignore-this: 176b2006cef5041adcb592ee83e084dd
429] 
430[change RIStorageServer.remote_add_lease to exit silently in case of no-such-bucket, instead of raising IndexError, because that makes the upcoming --add-lease feature faster and less noisy
431warner@lothar.com**20090218013053
432 Ignore-this: 6fdfcea2c832178f1ce72ab0ff510f3a
433] 
434[CLI #590: convert 'tahoe deep-check' to streaming form, improve display, add tests
435warner@lothar.com**20090217231511
436 Ignore-this: 6d88eb94b1c877eacc8c5ca7d0aac776
437] 
438[interfaces.py: document behavior of add_lease/renew_lease/cancel_lease, before I change it
439warner@lothar.com**20090217194809
440 Ignore-this: 703c6712926b8edb19d55d790b65a400
441] 
442[test_backupdb: improve error messages if the test fails
443warner@lothar.com**20090217170838
444 Ignore-this: ef657e87c66e4304d3e0aca9831b84c
445] 
446[webapi #590: add streaming deep-check. Still need a CLI tool to use it.
447warner@lothar.com**20090217053553
448 Ignore-this: a0edd3d2a531c48a64d8397f7e4b208c
449] 
450[test_web.Grid: change the CHECK() function to make it easier to test t= values with hyphens in them
451warner@lothar.com**20090217050034
452 Ignore-this: 410c08735347c2057df52f6716520228
453] 
454[test_web: improve checker-results coverage with a no-network -based test, enhance no-network harness to assist, fix some bugs in web/check_results.py that were exposed
455warner@lothar.com**20090217041242
456 Ignore-this: fe54bb66a9ae073c002a7af51cd1e18
457] 
458[web: fix handling of reliability page when Numeric is not available
459warner@lothar.com**20090217015658
460 Ignore-this: 9d329182f1b2e5f812e5e7eb5f4cf2ed
461] 
462[test/no_network: update comments with setup timing: no_network takes 50ms, SystemTestMixin takes 2s (on my laptop)
463warner@lothar.com**20090217000643
464 Ignore-this: cc778fa3219775b25057bfc9491f8f34
465] 
466[test_upload: rewrite in terms of no-network GridTestMixin, improve no_network.py as necessary
467warner@lothar.com**20090216234457
468 Ignore-this: 80a341d5aa3036d24de98e267499d70d
469] 
470[test_download: rewrite in terms of no-network GridTestMixin, improve no_network.py as necessary
471warner@lothar.com**20090216233658
472 Ignore-this: ec2febafd2403830519120fb3f3ca04e
473] 
474[test_dirnode.py: convert Deleter to new no-network gridtest
475warner@lothar.com**20090216232348
476 Ignore-this: 8041739442ec4db726675e48f9775ae9
477] 
478[test_cli.py: modify to use the new 'no-network' gridtest instead of SystemTestMixin, which speeds it up from 73s to 43s on my system
479warner@lothar.com**20090216232005
480 Ignore-this: ec6d010c9182aa72049d1fb894cf890e
481] 
482[tests: fix no_network framework to work with upload/download and checker
483warner@lothar.com**20090216231947
484 Ignore-this: 74b4dbd66b8384ae7c7544969fe4f744
485] 
486[client.py: improve docstring
487warner@lothar.com**20090216231532
488 Ignore-this: bbaa9e3f63fdb0048e3125c4681b2d1f
489] 
490[test_cli: add test coverage for help strings
491warner@lothar.com**20090216210833
492 Ignore-this: d2020849107f687448e159a19d0e5dab
493] 
494[test/no_network: new test harness, like system-test but doesn't use the network so it's faster
495warner@lothar.com**20090216205844
496 Ignore-this: 31678f7bdef30b0216fd657fc6145534
497] 
498[interfaces.py: minor docstring edit
499warner@lothar.com**20090216205816
500 Ignore-this: cec3855070197f7920b370f95e8b07bd
501] 
502[setup: if you sdist_dsc (to produce the input files for dpkg-buildpackage) then run darcsver first
503zooko@zooko.com**20090216201558
504 Ignore-this: b85be51b3d4a9a19a3366e690f1063e2
505] 
506[doc: a few edits to docs made after the 1.3.0 release
507zooko@zooko.com**20090216201539
508 Ignore-this: dbff3b929d88134d862f1dffd1ef068a
509] 
510[test_cli: improve test coverage slightly
511warner@lothar.com**20090216030451
512 Ignore-this: e01ccc6a6fb44aaa4fb14fe8669e2065
513] 
514[test_util: get almost full test coverage of dictutil, starting with the original pyutil tests as a base. The remaining three uncovered lines involve funny cases of ValueOrderedDict that I can't figure out how to get at
515warner@lothar.com**20090216023210
516 Ignore-this: dc1f0c6d8c003c0ade38bc8f8516b04d
517] 
518[provisioning/reliability: add tests, hush pyflakes, remove dead code, fix web links
519warner@lothar.com**20090215222451
520 Ignore-this: 7854df3e0130d9388f06efd4c797262f
521] 
522[util/statistics: add tests, fix mean_repair_cost
523warner@lothar.com**20090215222326
524 Ignore-this: c576eabc74c23b170702018fc3c122d9
525] 
526[test_repairer: hush pyflakes
527warner@lothar.com**20090215222310
528 Ignore-this: 875eb52e86077cda77efd02da77f8cfa
529] 
530[lossmodel.lyx: move draft paper into docs/proposed/, since it's unfinished
531warner@lothar.com**20090215221905
532 Ignore-this: 7f7ee204e47fd66932759c94deefe68
533] 
534[build a 'reliability' web page, with a simulation of file decay and repair over time
535warner@lothar.com**20090213234234
536 Ignore-this: 9e9623eaac7b0637bbd0071f082bd345
537] 
538[More lossmodel work, on repair.
539Shawn Willden <shawn-tahoe@willden.org>**20090116025648] 
540[Loss model work (temp1)
541Shawn Willden <shawn@willden.org>**20090115030058] 
542[Statistics module
543Shawn Willden <shawn-tahoe@willden.org>**20090114021235
544 
545 Added a statistics module for calculating various facets of
546 share survival statistics.
547] 
548[docs: relnotes-short.txt
549zooko@zooko.com**20090215163510
550 Ignore-this: 683649bb13499bbe0e5cea2e1716ff59
551 linkedin.com imposed a strict limit on the number of characters I could post.  This forced me to prune and prune and edit and edit until relnotes.txt was a quarter of its former size.  Here's the short version.
552] 
553[TAG allmydata-tahoe-1.3.0
554zooko@zooko.com**20090214000556
555 Ignore-this: aa6c9a31a14a58ad2298cb7b08d3ea70
556] 
557Patch bundle hash:
5584a6659f167f9c01bd644641e5785bda6724beddc