Ticket #924: stop-writing-ctime-and-mtime.dpatch

File stop-writing-ctime-and-mtime.dpatch, 79.1 KB (added by davidsarah, at 2010-06-18T23:18:14Z)

dirnode.py: stop writing 'ctime' and 'mtime' fields. Includes documentation and test changes. (The doc needs to be changed slightly if we don't commit this for 1.7.0.)

Line 
1Sat Jun 19 00:01:19 GMT Daylight Time 2010  david-sarah@jacaranda.org
2  * dirnode.py: stop writing 'ctime' and 'mtime' fields. Includes documentation and test changes.
3
4New patches:
5
6[dirnode.py: stop writing 'ctime' and 'mtime' fields. Includes documentation and test changes.
7david-sarah@jacaranda.org**20100618230119
8 Ignore-this: 709119898499769dd64c7977db7c84a6
9] {
10hunk ./docs/frontends/webapi.txt 667
11 
12 ==== About the metadata ====
13 
14-  The value of the 'mtime' key and of the 'tahoe':'linkmotime' is updated
15-  whenever a link to a child is set. The value of the 'ctime' key and of the
16-  'tahoe':'linkcrtime' key is updated whenever a link to a child is created --
17-  i.e. when there was not previously a link under that name.
18+  The value of the 'tahoe':'linkmotime' key is updated whenever a link to a
19+  child is set. The value of the 'tahoe':'linkcrtime' key is updated whenever
20+  a link to a child is created -- i.e. when there was not previously a link
21+  under that name.
22 
23hunk ./docs/frontends/webapi.txt 672
24-  In Tahoe earlier than v1.4.0, only the 'mtime'/'ctime' keys were populated.
25-  Starting in Tahoe v1.4.0, the 'linkmotime'/'linkcrtime' keys in the 'tahoe'
26-  sub-dict are also populated. However, prior to v1.7.0, a bug caused the
27-  'tahoe' sub-dict to be deleted by webapi requests in which new metadata
28-  is specified, and not to be added to existing child links that lack it.
29+  Note however, that if the edge in the Tahoe filesystem points to a mutable
30+  file and the contents of that mutable file is changed, then the
31+  'tahoe':'linkmotime' value on that edge will *not* be updated, since the
32+  edge itself wasn't updated -- only the mutable file was.
33 
34hunk ./docs/frontends/webapi.txt 677
35-  The reason we added the new values in Tahoe v1.4.0 is that there is a
36+  The timestamps are represented as a number of seconds since the UNIX epoch
37+  (1970-01-01 00:00:00 UTC), excluding leap seconds.
38+
39+  In Tahoe earlier than v1.4.0, 'mtime' and 'ctime' keys were populated
40+  instead of the 'tahoe':'linkmotime' and 'tahoe':'linkcrtime' keys. Starting
41+  in Tahoe v1.4.0, the 'linkmotime'/'linkcrtime' keys in the 'tahoe' sub-dict
42+  are populated. However, prior to Tahoe v1.7beta, a bug caused the 'tahoe'
43+  sub-dict to be deleted by webapi requests in which new metadata is
44+  specified, and not to be added to existing child links that lack it.
45+
46+  From Tahoe v1.7.0 onward, the 'mtime' and 'ctime' fields are no longer
47+  populated or updated (see ticket #924), except by "tahoe backup" as
48+  explained below. For backward compatibility, when an existing link is
49+  updated and 'tahoe':'linkcrtime' is not present in the previous metadata
50+  but 'ctime' is, the old value of 'ctime' is used as the new value of
51+  'tahoe':'linkcrtime'.
52+
53+  The reason we added the new fields in Tahoe v1.4.0 is that there is a
54   "set_children" API (described below) which you can use to overwrite the
55hunk ./docs/frontends/webapi.txt 696
56-  values of the 'mtime'/'ctime' pair, and this API is used by the "tahoe
57-  backup" command (both in Tahoe v1.3.0 and in Tahoe v1.4.0) to set the
58-  'mtime' and 'ctime' values when backing up files from a local filesystem
59-  into the Tahoe filesystem. As of Tahoe v1.4.0, the set_children API cannot
60-  be used to set anything under the 'tahoe' key of the metadata dict -- if
61-  you include 'tahoe' keys in your 'metadata' arguments then it will silently
62+  values of the 'mtime'/'ctime' pair, and this API is used by the
63+  "tahoe backup" command (in Tahoe v1.3.0 and later) to set the 'mtime' and
64+  'ctime' values when backing up files from a local filesystem into the
65+  Tahoe filesystem. As of Tahoe v1.4.0, the set_children API cannot be used
66+  to set anything under the 'tahoe' key of the metadata dict -- if you
67+  include 'tahoe' keys in your 'metadata' arguments then it will silently
68   ignore those keys.
69 
70   Therefore, if the 'tahoe' sub-dict is present, you can rely on the
71hunk ./docs/frontends/webapi.txt 713
72   they like, and there is nothing to constrain their system clock from taking
73   any value.)
74 
75-  The meaning of the 'ctime'/'mtime' fields are slightly more complex.
76+  When an edge is created or updated by "tahoe backup", the 'mtime' and
77+  'ctime' keys on that edge are set as follows:
78 
79hunk ./docs/frontends/webapi.txt 716
80-  The meaning of the 'mtime' field is: whenever the edge is updated (by an HTTP
81-  PUT or POST, as is done by the "tahoe cp" command), then the mtime is set to
82-  the current time on the clock of the updating client. Whenever the edge is
83-  updated by "tahoe backup" then the mtime is instead set to the value which
84-  the updating client read from its local filesystem for the "mtime" of the
85-  local file in question, which means the last time the contents of that file
86-  were changed. Note however, that if the edge in the Tahoe filesystem points
87-  to a mutable file and the contents of that mutable file is changed then the
88-  "mtime" value on that edge will *not* be updated, since the edge itself
89-  wasn't updated -- only the mutable file was.
90+    * 'mtime' is set to the timestamp read from the local filesystem for the
91+      "mtime" of the local file in question, which means the last time the
92+      contents of that file were changed.
93 
94hunk ./docs/frontends/webapi.txt 720
95-  The meaning of the 'ctime' field is even more complex. Whenever a new edge is
96-  created (by an HTTP PUT or POST, as is done by "tahoe cp") then the ctime is
97-  set to the current time on the clock of the updating client. Whenever the
98-  edge is created *or updated* by "tahoe backup" then the ctime is instead set
99-  to the value which the updating client read from its local filesystem. On
100-  Windows, it reads the timestamp of when the local file was created and puts
101-  that into the "ctime", and on other platforms it reads the timestamp of the
102-  most recent time that either the contents or the metadata of the local file
103-  was changed and puts that into the ctime. Again, if the edge points to a
104-  mutable file and the content of that mutable file is changed then the ctime
105-  will not be updated in any case.
106+    * On Windows, 'ctime' is set to the creation timestamp for the file
107+      read from the local filesystem. On other platforms, 'ctime' is set to
108+      the UNIX "ctime" of the local file, which means the last time that
109+      either the contents or the metadata of the local file was changed.
110 
111hunk ./docs/frontends/webapi.txt 725
112-  Therefore there are several ways that the 'ctime' field could be confusing:
113+  There are several ways that the 'ctime' field could be confusing:
114 
115   1. You might be confused about whether it reflects the time of the creation
116hunk ./docs/frontends/webapi.txt 728
117-  of a link in the Tahoe filesystem or a timestamp copied in from a local
118-  filesystem.
119+     of a link in the Tahoe filesystem (by a version of Tahoe < v1.7.0) or a
120+     timestamp copied in by "tahoe backup" from a local filesystem.
121+
122+  2. You might be confused about whether it is a copy of the file creation
123+     time (if "tahoe backup" was run on a Windows system) or of the last
124+     contents-or-metadata change (if "tahoe backup" was run on a different
125+     operating system).
126 
127hunk ./docs/frontends/webapi.txt 736
128-  2. You might be confused about whether it is a copy of the file creation time
129-  (if "tahoe backup" was run on a Windows system) or of the last
130-  contents-or-metadata change (if "tahoe backup" was run on a different
131-  operating system).
132+  3. You might be confused by the fact that changing the contents of a
133+     mutable file in Tahoe don't have any effect on any links pointing at
134+     that file in any directories, although "tahoe backup" sets the link
135+     'ctime'/'mtime' to reflect timestamps about the local file corresponding
136+     to the Tahoe file to which the link points.
137 
138hunk ./docs/frontends/webapi.txt 742
139-  3. You might be confused by the fact that changing the contents of a mutable
140-  file in Tahoe don't have any effect on any links pointing at that file in any
141-  directories, although "tahoe backup" sets the link 'ctime'/'mtime' to reflect
142-  timestamps about the local file corresponding to the Tahoe file to which the
143-  link points.
144+  4. Also, quite apart from Tahoe, you might be confused about the meaning
145+     of the "ctime" in UNIX local filesystems, which people sometimes think
146+     means file creation time, but which actually means, in UNIX local
147+     filesystems, the most recent time that the file contents or the file
148+     metadata (such as owner, permission bits, extended attributes, etc.)
149+     has changed. Note that although "ctime" does not mean file creation time
150+     in UNIX, links created by a version of Tahoe prior to v1.7.0, and never
151+     written by "tahoe backup", will have 'ctime' set to the link creation
152+     time.
153 
154hunk ./docs/frontends/webapi.txt 752
155-  4. Also, quite apart from Tahoe, you might be confused about the meaning of
156-  the 'ctime' in UNIX local filesystems, which people sometimes think means
157-  file creation time, but which actually means, in UNIX local filesystems, the
158-  most recent time that the file contents or the file metadata (such as owner,
159-  permission bits, extended attributes, etc.) has changed. Note that although
160-  'ctime' does not mean file creation time in UNIX, it does mean link creation
161-  time in Tahoe, unless the "tahoe backup" command has been used on that link,
162-  in which case it means something about the local filesystem file which
163-  corresponds to the Tahoe file which is pointed at by the link. It means
164-  either file creation time of the local file (if "tahoe backup" was run on
165-  Windows) or file-contents-or-metadata-update-time of the local file (if
166-  "tahoe backup" was run on a different operating system).
167 
168 === Attaching an existing File or Directory by its read- or write- cap ===
169 
170hunk ./src/allmydata/dirnode.py 33
171     Timestamps are set according to the time 'now'."""
172 
173     if metadata is None:
174-        metadata = {'ctime': now,
175-                    'mtime': now,
176-                    'tahoe': {
177-                        'linkcrtime': now,
178-                        'linkmotime': now,
179-                        }
180-                    }
181+        metadata = {}
182+
183+    old_ctime = None
184+    if 'ctime' in metadata:
185+        old_ctime = metadata['ctime']
186 
187     if new_metadata is not None:
188         # Overwrite all metadata.
189hunk ./src/allmydata/dirnode.py 49
190         if 'tahoe' in metadata:
191             newmd['tahoe'] = metadata['tahoe']
192 
193-        # For backwards compatibility with Tahoe < 1.4.0:
194-        if 'ctime' not in newmd:
195-            if 'ctime' in metadata:
196-                newmd['ctime'] = metadata['ctime']
197-            else:
198-                newmd['ctime'] = now
199-        if 'mtime' not in newmd:
200-            newmd['mtime'] = now
201-
202         metadata = newmd
203hunk ./src/allmydata/dirnode.py 50
204-    else:
205-        # For backwards compatibility with Tahoe < 1.4.0:
206-        if 'ctime' not in metadata:
207-            metadata['ctime'] = now
208-        metadata['mtime'] = now
209 
210     # update timestamps
211     sysmd = metadata.get('tahoe', {})
212hunk ./src/allmydata/dirnode.py 55
213     if 'linkcrtime' not in sysmd:
214         # In Tahoe < 1.4.0 we used the word 'ctime' to mean what Tahoe >= 1.4.0
215-        # calls 'linkcrtime'.
216-        assert 'ctime' in metadata
217-        sysmd['linkcrtime'] = metadata['ctime']
218+        # calls 'linkcrtime'. This field is only used if it was in the old metadata,
219+        # and 'tahoe:linkcrtime' was not.
220+        if old_ctime is not None:
221+            sysmd['linkcrtime'] = old_ctime
222+        else:
223+            sysmd['linkcrtime'] = now
224+
225     sysmd['linkmotime'] = now
226     metadata['tahoe'] = sysmd
227 
228hunk ./src/allmydata/test/test_dirnode.py 749
229             d.addCallback(lambda res: n.get_metadata_for(u"child"))
230             d.addCallback(lambda metadata:
231                           self.failUnlessEqual(set(metadata.keys()),
232-                                               set(["tahoe", "ctime", "mtime"])))
233+                                               set(["tahoe"])))
234 
235             d.addCallback(lambda res:
236                           self.shouldFail(NoSuchChildError, "gcamap-no",
237hunk ./src/allmydata/test/test_dirnode.py 771
238                 child, metadata = res
239                 self.failUnlessEqual(child.get_uri(),
240                                      fake_file_uri)
241-                self.failUnlessEqual(set(metadata.keys()),
242-                                     set(["tahoe", "ctime", "mtime"]))
243+                self.failUnlessEqual(set(metadata.keys()), set(["tahoe"]))
244             d.addCallback(_check_child_and_metadata2)
245 
246             d.addCallback(lambda res:
247hunk ./src/allmydata/test/test_dirnode.py 779
248             def _check_child_and_metadata3(res):
249                 child, metadata = res
250                 self.failUnless(isinstance(child, dirnode.DirectoryNode))
251-                self.failUnlessEqual(set(metadata.keys()),
252-                                     set(["tahoe", "ctime", "mtime"]))
253+                self.failUnlessEqual(set(metadata.keys()), set(["tahoe"]))
254             d.addCallback(_check_child_and_metadata3)
255 
256             # set_uri + metadata
257hunk ./src/allmydata/test/test_dirnode.py 789
258                                                 {}))
259             d.addCallback(lambda res: n.get_metadata_for(u"c2"))
260             d.addCallback(lambda metadata:
261-                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
262+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
263 
264             # You can't override the link timestamps.
265             d.addCallback(lambda res: n.set_uri(u"c2",
266hunk ./src/allmydata/test/test_dirnode.py 807
267                                                 fake_file_uri, fake_file_uri))
268             d.addCallback(lambda res: n.get_metadata_for(u"c3"))
269             d.addCallback(lambda metadata:
270-                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
271+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
272 
273             # we can also add specific metadata at set_uri() time
274             d.addCallback(lambda res: n.set_uri(u"c4",
275hunk ./src/allmydata/test/test_dirnode.py 815
276                                                 {"key": "value"}))
277             d.addCallback(lambda res: n.get_metadata_for(u"c4"))
278             d.addCallback(lambda metadata:
279-                              self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
280+                              self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
281                                               (metadata['key'] == "value"), metadata))
282 
283             d.addCallback(lambda res: n.delete(u"c2"))
284hunk ./src/allmydata/test/test_dirnode.py 833
285                                           overwrite=False))
286             d.addCallback(lambda res: n.get_metadata_for(u"d2"))
287             d.addCallback(lambda metadata:
288-                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
289+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
290 
291             # if we don't set any defaults, the child should get timestamps
292             d.addCallback(lambda res: n.set_node(u"d3", n))
293hunk ./src/allmydata/test/test_dirnode.py 839
294             d.addCallback(lambda res: n.get_metadata_for(u"d3"))
295             d.addCallback(lambda metadata:
296-                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
297+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
298 
299             # we can also add specific metadata at set_node() time
300             d.addCallback(lambda res: n.set_node(u"d4", n,
301hunk ./src/allmydata/test/test_dirnode.py 846
302                                                 {"key": "value"}))
303             d.addCallback(lambda res: n.get_metadata_for(u"d4"))
304             d.addCallback(lambda metadata:
305-                          self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
306+                          self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
307                                           (metadata["key"] == "value"), metadata))
308 
309             d.addCallback(lambda res: n.delete(u"d2"))
310hunk ./src/allmydata/test/test_dirnode.py 877
311             d.addCallback(lambda children: self.failIf(u"new" in children))
312             d.addCallback(lambda res: n.get_metadata_for(u"e1"))
313             d.addCallback(lambda metadata:
314-                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
315+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
316             d.addCallback(lambda res: n.get_metadata_for(u"e2"))
317             d.addCallback(lambda metadata:
318hunk ./src/allmydata/test/test_dirnode.py 880
319-                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
320+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
321             d.addCallback(lambda res: n.get_metadata_for(u"e3"))
322             d.addCallback(lambda metadata:
323hunk ./src/allmydata/test/test_dirnode.py 883
324-                          self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
325+                          self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
326                                           (metadata["key"] == "value"), metadata))
327 
328             d.addCallback(lambda res: n.delete(u"e1"))
329hunk ./src/allmydata/test/test_dirnode.py 908
330             d.addCallback(lambda children: self.failIf(u"new" in children))
331             d.addCallback(lambda res: n.get_metadata_for(u"f1"))
332             d.addCallback(lambda metadata:
333-                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
334+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
335             d.addCallback(lambda res: n.get_metadata_for(u"f2"))
336             d.addCallback(lambda metadata:
337hunk ./src/allmydata/test/test_dirnode.py 911
338-                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
339+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
340             d.addCallback(lambda res: n.get_metadata_for(u"f3"))
341             d.addCallback(lambda metadata:
342hunk ./src/allmydata/test/test_dirnode.py 914
343-                          self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
344+                          self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
345                                           (metadata["key"] == "value"), metadata))
346 
347             d.addCallback(lambda res: n.delete(u"f1"))
348hunk ./src/allmydata/test/test_dirnode.py 927
349                                              {"tags": ["web2.0-compatible"], "tahoe": {"bad": "mojo"}}))
350             d.addCallback(lambda n1: n1.get_metadata_for(u"child"))
351             d.addCallback(lambda metadata:
352-                          self.failUnless((set(metadata.keys()) == set(["tags", "tahoe", "ctime", "mtime"])) and
353+                          self.failUnless((set(metadata.keys()) == set(["tags", "tahoe"])) and
354                                           metadata["tags"] == ["web2.0-compatible"] and
355                                           "bad" not in metadata["tahoe"], metadata))
356 
357hunk ./src/allmydata/test/test_dirnode.py 954
358 
359             d.addCallback(lambda res: n.get_metadata_for(u"timestamps"))
360             def _check_timestamp1(metadata):
361-                self.failUnless("ctime" in metadata)
362-                self.failUnless("mtime" in metadata)
363-                self.failUnlessGreaterOrEqualThan(metadata["ctime"],
364+                self.failUnlessEqual(set(metadata.keys()), set(["tahoe"]))
365+                tahoe_md = metadata["tahoe"]
366+                self.failUnlessEqual(set(tahoe_md.keys()), set(["linkcrtime", "linkmotime"]))
367+
368+                self.failUnlessGreaterOrEqualThan(tahoe_md["linkcrtime"],
369                                                   self._start_timestamp)
370                 self.failUnlessGreaterOrEqualThan(self._stop_timestamp,
371hunk ./src/allmydata/test/test_dirnode.py 961
372-                                                  metadata["ctime"])
373-                self.failUnlessGreaterOrEqualThan(metadata["mtime"],
374+                                                  tahoe_md["linkcrtime"])
375+                self.failUnlessGreaterOrEqualThan(tahoe_md["linkmotime"],
376                                                   self._start_timestamp)
377                 self.failUnlessGreaterOrEqualThan(self._stop_timestamp,
378hunk ./src/allmydata/test/test_dirnode.py 965
379-                                                  metadata["mtime"])
380+                                                  tahoe_md["linkmotime"])
381                 # Our current timestamp rules say that replacing an existing
382hunk ./src/allmydata/test/test_dirnode.py 967
383-                # child should preserve the 'ctime' but update the mtime
384-                self._old_ctime = metadata["ctime"]
385-                self._old_mtime = metadata["mtime"]
386+                # child should preserve the 'linkcrtime' but update the
387+                # 'linkmotime'
388+                self._old_linkcrtime = tahoe_md["linkcrtime"]
389+                self._old_linkmotime = tahoe_md["linkmotime"]
390             d.addCallback(_check_timestamp1)
391             d.addCallback(self.stall, 2.0) # accomodate low-res timestamps
392             d.addCallback(lambda res: n.set_node(u"timestamps", n))
393hunk ./src/allmydata/test/test_dirnode.py 976
394             d.addCallback(lambda res: n.get_metadata_for(u"timestamps"))
395             def _check_timestamp2(metadata):
396-                self.failUnlessEqual(metadata["ctime"], self._old_ctime,
397-                                     "%s != %s" % (metadata["ctime"],
398-                                                   self._old_ctime))
399-                self.failUnlessGreaterThan(metadata["mtime"], self._old_mtime)
400+                self.failUnlessIn("tahoe", metadata)
401+                tahoe_md = metadata["tahoe"]
402+                self.failUnlessEqual(set(tahoe_md.keys()), set(["linkcrtime", "linkmotime"]))
403+
404+                self.failUnlessEqual(tahoe_md["linkcrtime"], self._old_linkcrtime)
405+                self.failUnlessGreaterThan(tahoe_md["linkmotime"], self._old_linkmotime)
406                 return n.delete(u"timestamps")
407             d.addCallback(_check_timestamp2)
408 
409hunk ./src/allmydata/test/test_dirnode.py 985
410-            # also make sure we can add/update timestamps on a
411-            # previously-existing child that didn't have any, since there are
412-            # a lot of 0.7.0-generated edges around out there
413-            d.addCallback(lambda res: n.set_node(u"no_timestamps", n, {}))
414-            d.addCallback(lambda res: n.set_node(u"no_timestamps", n))
415-            d.addCallback(lambda res: n.get_metadata_for(u"no_timestamps"))
416-            d.addCallback(lambda metadata:
417-                          self.failUnlessEqual(set(metadata.keys()),
418-                                               set(["tahoe", "ctime", "mtime"])))
419-            d.addCallback(lambda res: n.delete(u"no_timestamps"))
420-
421             d.addCallback(lambda res: n.delete(u"subdir"))
422             d.addCallback(lambda old_child:
423                           self.failUnlessEqual(old_child.get_uri(),
424hunk ./src/allmydata/test/test_dirnode.py 1012
425                                                set([u"child", u"newfile"])))
426             d.addCallback(lambda res: n.get_metadata_for(u"newfile"))
427             d.addCallback(lambda metadata:
428-                          self.failUnlessEqual(set(metadata.keys()),
429-                                               set(["tahoe", "ctime", "mtime"])))
430+                          self.failUnlessEqual(set(metadata.keys()), set(["tahoe"])))
431 
432             uploadable3 = upload.Data("some data", convergence="converge")
433             d.addCallback(lambda res: n.add_file(u"newfile-metadata",
434hunk ./src/allmydata/test/test_dirnode.py 1022
435                           self.failUnless(IImmutableFileNode.providedBy(newnode)))
436             d.addCallback(lambda res: n.get_metadata_for(u"newfile-metadata"))
437             d.addCallback(lambda metadata:
438-                              self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
439+                              self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
440                                               (metadata['key'] == "value"), metadata))
441             d.addCallback(lambda res: n.delete(u"newfile-metadata"))
442 
443hunk ./src/allmydata/test/test_dirnode.py 1114
444         return d
445 
446     def test_update_metadata(self):
447-        (t1, t2, t3) = (626644800, 634745640, 892226160)
448+        (t1, t2, t3) = (626644800.0, 634745640.0, 892226160.0)
449 
450hunk ./src/allmydata/test/test_dirnode.py 1116
451-        md1 = dirnode.update_metadata({}, {"ctime": t1}, t2)
452-        self.failUnlessEqual(md1, {"ctime": t1, "mtime": t2,
453-                                   "tahoe":{"linkcrtime": t1, "linkmotime": t2}})
454+        md1 = dirnode.update_metadata({"ctime": t1}, {}, t2)
455+        self.failUnlessEqual(md1, {"tahoe":{"linkcrtime": t1, "linkmotime": t2}})
456 
457         md2 = dirnode.update_metadata(md1, {"key": "value", "tahoe": {"bad": "mojo"}}, t3)
458hunk ./src/allmydata/test/test_dirnode.py 1120
459-        self.failUnlessEqual(md2, {"key": "value", "ctime": t1, "mtime": t3,
460+        self.failUnlessEqual(md2, {"key": "value",
461                                    "tahoe":{"linkcrtime": t1, "linkmotime": t3}})
462 
463         md3 = dirnode.update_metadata({}, None, t3)
464hunk ./src/allmydata/test/test_dirnode.py 1124
465-        self.failUnlessEqual(md3, {"ctime": t3, "mtime": t3,
466-                                   "tahoe":{"linkcrtime": t3, "linkmotime": t3}})
467+        self.failUnlessEqual(md3, {"tahoe":{"linkcrtime": t3, "linkmotime": t3}})
468+
469+        md4 = dirnode.update_metadata({}, {"bool": True, "number": 42}, t1)
470+        self.failUnlessEqual(md4, {"bool": True, "number": 42,
471+                                   "tahoe":{"linkcrtime": t1, "linkmotime": t1}})
472 
473     def test_create_subdirectory(self):
474         self.basedir = "dirnode/Dirnode/test_create_subdirectory"
475hunk ./src/allmydata/test/test_web.py 243
476                       for (name,value)
477                       in data[1]["children"].iteritems()] )
478         self.failUnlessEqual(kids[u"sub"][0], "dirnode")
479-        self.failUnless("metadata" in kids[u"sub"][1])
480-        self.failUnless("ctime" in kids[u"sub"][1]["metadata"])
481-        self.failUnless("mtime" in kids[u"sub"][1]["metadata"])
482+        self.failUnlessIn("metadata", kids[u"sub"][1])
483+        self.failUnlessIn("tahoe", kids[u"sub"][1]["metadata"])
484+        tahoe_md = kids[u"sub"][1]["metadata"]["tahoe"]
485+        self.failUnlessIn("linkcrtime", tahoe_md)
486+        self.failUnlessIn("linkmotime", tahoe_md)
487         self.failUnlessEqual(kids[u"bar.txt"][0], "filenode")
488         self.failUnlessEqual(kids[u"bar.txt"][1]["size"], len(self.BAR_CONTENTS))
489         self.failUnlessEqual(kids[u"bar.txt"][1]["ro_uri"], self._bar_txt_uri)
490hunk ./src/allmydata/test/test_web.py 253
491         self.failUnlessEqual(kids[u"bar.txt"][1]["verify_uri"],
492                              self._bar_txt_verifycap)
493-        self.failUnlessEqual(kids[u"bar.txt"][1]["metadata"]["ctime"],
494-                             self._bar_txt_metadata["ctime"])
495+        self.failUnlessEqual(kids[u"bar.txt"][1]["metadata"]["tahoe"]["linkcrtime"],
496+                             self._bar_txt_metadata["tahoe"]["linkcrtime"])
497         self.failUnlessEqual(kids[u"n\u00fc.txt"][1]["ro_uri"],
498                              self._bar_txt_uri)
499 
500}
501
502Context:
503
504[configuration.txt and servers-of-happiness.txt: 1 <= happy <= N, not k <= happy <= N. Also minor wording changes.
505david-sarah@jacaranda.org**20100618050710
506 Ignore-this: edac0716e753e1f1c4c755c85bec9a19
507] 
508[test_cli.py: fix test failure in CLI.test_listdir_unicode_good due to filenames returned from listdir_unicode no longer being normalized.
509david-sarah@jacaranda.org**20100618045110
510 Ignore-this: 598ffaef02d71e075f7e08fac44f48ff
511] 
512[how_to_make_a_tahoe-lafs_release.txt: reordering, add fuse-sshfs@lists.sourceforge.list as place to send relnotes.
513david-sarah@jacaranda.org**20100618041854
514 Ignore-this: 2e380a6e72917d3a20a65ceccd9a4df
515] 
516[tahoe backup: unicode tests.
517david-sarah@jacaranda.org**20100618035211
518 Ignore-this: 88ebab9f3218f083fdc635bff6599b60
519] 
520[dirnodes: fix normalization hole where childnames in directories created by nodemaker.create_mutable/immutable_directory would not be normalized. Add a test that we normalize names coming out of a directory.
521david-sarah@jacaranda.org**20100618000249
522 Ignore-this: 46a9226eff1003013b067edbdbd4c25b
523] 
524[dirnode.py: comments about normalization changes.
525david-sarah@jacaranda.org**20100617041411
526 Ignore-this: 9040c4854e73a71dbbb55b50ea3b41b2
527] 
528[test_storage.py: print more information on test failures.
529david-sarah@jacaranda.org**20100617034623
530 Ignore-this: cc9a8656802a718ca4f2a6a530d35977
531] 
532[stringutils.py: remove unused import.
533david-sarah@jacaranda.org**20100617034440
534 Ignore-this: 16ec7d737c34665156c2ac486acd545a
535] 
536[test_stringutils.py: take account of the output of listdir_unicode no longer being normalized. Also use Unicode escapes, not UTF-8.
537david-sarah@jacaranda.org**20100617034409
538 Ignore-this: 47f3f072f0e2efea0abeac130f84c56f
539] 
540[test_dirnode.py: partial tests for normalization changes.
541david-sarah@jacaranda.org**20100617034025
542 Ignore-this: 2e3169dd8b120d42dff35bd267dcb417
543] 
544[CLI: allow Unicode patterns in exclude option to 'tahoe backup'.
545david-sarah@jacaranda.org**20100617033901
546 Ignore-this: 9d971129e1c8bae3c1cc3220993d592e
547] 
548[SFTP: get 'ctime' attribute from 'tahoe:linkmotime'.
549david-sarah@jacaranda.org**20100617033744
550 Ignore-this: b2fabe12235f2e2a487c0b56c39953e7
551] 
552[running.html: describe where 'bin/tahoe' is only once.
553david-sarah@jacaranda.org**20100617033603
554 Ignore-this: 6d92d9d8c77f3dfddfa7d061cbf2a791
555] 
556[stringutils.py: don't NFC-normalize the output of listdir_unicode.
557david-sarah@jacaranda.org**20100617015537
558 Ignore-this: 93c9b6f3d7c6812a0afa8d9e1b0b4faa
559] 
560[Merge using.html into running.html.
561david-sarah@jacaranda.org**20100617012857
562 Ignore-this: a0fa8b56621fdb976bef4e5f4f6c824a
563] 
564[Remove firewall section from running.html and say to read configuration.txt instead.
565david-sarah@jacaranda.org**20100617004513
566 Ignore-this: d2e46fffa4855b01093e8240b5fd1eff
567] 
568[running.html: fix overeager replacement of 'tahoe' with 'Tahoe-LAFS', and some simplifications.
569david-sarah@jacaranda.org**20100617000952
570 Ignore-this: 472b4b531c866574ed79f076b58495b5
571] 
572[Add a specification for servers of happiness.
573Kevan Carstensen <kevan@isnotajoke.com>**20100524003508
574 Ignore-this: 982e2be8a411be5beaf3582bdfde6151
575] 
576[Note that servers of happiness only applies to immutable files for the moment
577Kevan Carstensen <kevan@isnotajoke.com>**20100524042836
578 Ignore-this: cf83cac7a2b3ed347ae278c1a7d9a176
579] 
580[Add a note about running Tahoe-LAFS on a small grid to running.html
581zooko@zooko.com**20100616140227
582 Ignore-this: 14dfbff0d47144f7c2375108c6055dc2
583 also Change "tahoe" and "Tahoe" to "Tahoe-LAFS" in running.html
584 author: Kevan Carstensen
585] 
586[CLI.txt: introduce 'create-alias' before 'add-alias', document Unicode argument support, and other minor updates.
587david-sarah@jacaranda.org**20100610225547
588 Ignore-this: de7326e98d79291cdc15aed86ae61fe8
589] 
590[stringutils.py: Add encoding argument to quote_output. Also work around a bug in locale.getpreferredencoding on older Pythons.
591david-sarah@jacaranda.org**20100616042012
592 Ignore-this: 48174c37ad95205997e4d3cdd81f1e28
593] 
594[Provisional patch to NFC-normalize filenames going in and out of Tahoe directories.
595david-sarah@jacaranda.org**20100616031450
596 Ignore-this: ed08c9d8df37ef0b7cca42bb562c996b
597] 
598[test_system.py: investigate failure in allmydata.test.test_system.SystemTest.test_upload_and_download_random_key due to bytes_sent not being an int
599david-sarah@jacaranda.org**20100616001648
600 Ignore-this: 9c78092ab7bfdc909acae3a144ddd1f8
601] 
602[SFTP: remove a dubious use of 'pragma: no cover'.
603david-sarah@jacaranda.org**20100613164356
604 Ignore-this: 8f96a81b1196017ed6cfa1d914e56fa5
605] 
606[SFTP: test that renaming onto a just-opened file fails.
607david-sarah@jacaranda.org**20100612033709
608 Ignore-this: 9b14147ad78b16a5ab0e0e4813491414
609] 
610[SFTP: further small improvements to test coverage. Also ensure that after a test failure, later tests don't fail spuriously due to the checks for heisenfile leaks.
611david-sarah@jacaranda.org**20100612030737
612 Ignore-this: 4ec1dd3d7542be42007987a2f51508e7
613] 
614[SFTP: further improve test coverage (paths containing '.', bad data for posix-rename extension, and error in test of openShell).
615david-sarah@jacaranda.org**20100611213142
616 Ignore-this: 956f9df7f9e8a66b506ca58dd9a5dbe7
617] 
618[SFTP: improve test coverage for no-write on mutable files, and check for heisenfile table leaks in all relevant tests. Delete test_memory_leak since it is now redundant.
619david-sarah@jacaranda.org**20100611205752
620 Ignore-this: 88be1cf323c10dd534a4b8fdac121e31
621] 
622[SFTP: add test for extension of file opened with FXF_APPEND.
623david-sarah@jacaranda.org**20100610182647
624 Ignore-this: c0216d26453ce3cb4b92eef37d218fb4
625] 
626[NEWS: add UTF-8 coding declaration.
627david-sarah@jacaranda.org**20100609234851
628 Ignore-this: 3e6ef125b278e0a982c88d23180a78ae
629] 
630[tests: bump up the timeout on this iputil test from 2s to 4s
631zooko@zooko.com**20100609143017
632 Ignore-this: 786b7f7bbc85d45cdf727a6293750798
633] 
634[docs: a few tweaks to NEWS and CREDITS and make quickstart.html point to 1.7.0β!
635zooko@zooko.com**20100609142927
636 Ignore-this: f8097d3062f41f06c4420a7c84a56481
637] 
638[docs: Update NEWS file with new features and bugfixes in 1.7.0
639francois@ctrlaltdel.ch**20100609091120
640 Ignore-this: 8c1014e4469ef530e5ff48d7d6ae71c5
641] 
642[docs: wording fix, thanks to Jeremy Visser, fix #987
643francois@ctrlaltdel.ch**20100609081103
644 Ignore-this: 6d2e627e0f1cd58c0e1394e193287a4b
645] 
646[SFTP: fix most significant memory leak described in #1045 (due to a file being added to all_heisenfiles under more than one direntry when renamed).
647david-sarah@jacaranda.org**20100609080003
648 Ignore-this: 490b4c14207f6725d0dd32c395fbcefa
649] 
650[test_stringutils.py: Fix test failure on CentOS builder, possibly Python 2.4.3-related.
651david-sarah@jacaranda.org**20100609065056
652 Ignore-this: 503b561b213baf1b92ae641f2fdf080a
653] 
654[docs: update relnote.txt for Tahoe-LAFS v1.7.0β
655zooko@zooko.com**20100609054602
656 Ignore-this: 52e1bf86a91d45315960fb8806b7a479
657] 
658[setup: move the mock library from install_requires to tests_require (re: #1016)
659zooko@zooko.com**20100609050542
660 Ignore-this: c51a4ff3e19ed630755be752d2233db4
661] 
662[setup: show-tool-versions.py: print out the output from the unix command "locale" and re-arrange encoding data a little bit
663zooko@zooko.com**20100609040714
664 Ignore-this: 69382719b462d13ff940fcd980776004
665] 
666[setup: add zope.interface to the packages described by show-tool-versions.py
667zooko@zooko.com**20100609034915
668 Ignore-this: b5262b2af5c953a5f68a60bd48dcaa75
669] 
670[Fix for Unicode-related test failures on Zooko's OS X 10.6 machine.
671david-sarah@jacaranda.org**20100609055448
672 Ignore-this: 395ad16429e56623edfa74457a121190
673] 
674[stringutils.py, sftpd.py: Portability fixes for Python <= 2.5.
675david-sarah@jacaranda.org**20100609013302
676 Ignore-this: 9d9ce476ee1b96796e0f48cc5338f852
677] 
678[_auto_deps.py: allow Python 2.4.3 on Redhat-based distributions.
679david-sarah@jacaranda.org**20100609003646
680 Ignore-this: ad3cafdff200caf963024873d0ebff3c
681] 
682[CREDITS: update François's Description
683zooko@zooko.com**20100608155513
684 Ignore-this: a266b438d25ca2cb28eafff75aa4b2a
685] 
686[CREDITS: jsgf
687zooko@zooko.com**20100608143052
688 Ignore-this: 10abe06d40b88e22a9107d30f1b84810
689] 
690[setup: rename the setuptools_trial .egg that comes bundled in the base dir to not have "-py2.6" in its name, since it works with other versions of python as well
691zooko@zooko.com**20100608041607
692 Ignore-this: 64fe386d2e5fba0ab441116e74dad5a3
693] 
694[setup: rename the darcsver .egg that comes bundled in the base dir to not have "-py2.6" in its name, since it works with other versions of python as well
695zooko@zooko.com**20100608041534
696 Ignore-this: 53f925f160256409cf01b76d2583f83f
697] 
698[Back out Windows-specific Unicode argument support for v1.7.
699david-sarah@jacaranda.org**20100609000803
700 Ignore-this: b230ffe6fdaf9a0d85dfe745b37b42fb
701] 
702[SFTP: suppress NoSuchChildError if heisenfile attributes have been updated in setAttrs, in the case where the parent is available.
703david-sarah@jacaranda.org**20100608063753
704 Ignore-this: 8c72a5a9c15934f8fe4594ba3ee50ddd
705] 
706[SFTP: ignore permissions when opening a file (needed for sshfs interoperability).
707david-sarah@jacaranda.org**20100608055700
708 Ignore-this: f87f6a430f629326a324ddd94426c797
709] 
710[tests: bump up the timeout on these tests; MM's buildslave is sometimes extremely slow on tests, but it will complete them if given enough time. MM is working on making that buildslave more predictable in how long it takes to run tests.
711zooko@zooko.com**20100608033754
712 Ignore-this: 98dc27692c5ace1e4b0650b6680629d7
713] 
714[test_web.py: fix pyflakes warnings introduced by byterange patch.
715david-sarah@jacaranda.org**20100608042012
716 Ignore-this: a7612724893b51d1154dec4372e0508
717] 
718[Improve HTTP/1.1 byterange handling
719Jeremy Fitzhardinge <jeremy@goop.org>**20100310025913
720 Ignore-this: 6d69e694973d618f0dc65983735cd9be
721 
722 Fix parsing of a Range: header to support:
723  - multiple ranges (parsed, but not returned)
724  - suffix byte ranges ("-2139")
725  - correct handling of incorrectly formatted range headers
726    (correct behaviour is to ignore the header and return the full
727     file)
728  - return appropriate error for ranges outside the file
729 
730 Multiple ranges are parsed, but only the first range is returned.
731 Returning multiple ranges requires using the multipart/byterange
732 content type.
733 
734] 
735[test_cli.py: remove invalid 'test_listdir_unicode_bad' test.
736david-sarah@jacaranda.org**20100607183730
737 Ignore-this: fadfe87980dc1862f349bfcc21b2145f
738] 
739[check_memory.py: adapt to servers-of-happiness changes.
740david-sarah@jacaranda.org**20100608013528
741 Ignore-this: c6b28411c543d1aea2f148a955f7998
742] 
743[show-tool-versions.py: platform.linux_distribution() is not always available
744david-sarah@jacaranda.org**20100608004523
745 Ignore-this: 793fb4050086723af05d06bed8b1b92a
746] 
747[show-tool-versions.py: show platform.linux_distribution()
748david-sarah@jacaranda.org**20100608003829
749 Ignore-this: 81cb5e5fc6324044f0fc6d82903c8223
750] 
751[Remove the 'tahoe debug consolidate' subcommand.
752david-sarah@jacaranda.org**20100607183757
753 Ignore-this: 4b14daa3ae557cea07d6e119d25dafe9
754] 
755[tests: drastically increase timeout of this very time-consuming test in honor of François's ARM box
756zooko@zooko.com**20100607115929
757 Ignore-this: bf1bb52ffb6b5ccae71d4dde14621bc8
758] 
759[setup: update authorship, datestamp, licensing, and add special exceptions to allow combination with Eclipse- and QPL- licensed code
760zooko@zooko.com**20100607062329
761 Ignore-this: 5a1d7b12dfafd61283ea65a245416381
762] 
763[common_http.py, tahoe_cp.py: Fix an error in calling the superclass constructor in HTTPError and MissingSourceError (introduced by the Unicode fixes).
764david-sarah@jacaranda.org**20100607174714
765 Ignore-this: 1a118d593d81c918a4717c887f033aec
766] 
767[FTP-and-SFTP.txt: minor technical correction to doc for 'no-write' flag.
768david-sarah@jacaranda.org**20100607061600
769 Ignore-this: 66aee0c1b6c00538602d08631225e114
770] 
771[test_stringutils.py: trivial error in exception message for skipped test.
772david-sarah@jacaranda.org**20100607061455
773 Ignore-this: f261a5d4e2b8fe3bcc37e02539ba1ae2
774] 
775[setup: organize misc/ scripts and tools and remove obsolete ones
776zooko@zooko.com**20100607051618
777 Ignore-this: 161db1158c6b7be8365b0b3dee2e0b28
778 This is for ticket #1068.
779] 
780[More Unicode test fixes.
781david-sarah@jacaranda.org**20100607053358
782 Ignore-this: 6a271fb77c31f28cb7bdba63b26a2dd2
783] 
784[Unicode fixes for platforms with non-native-Unicode filesystems.
785david-sarah@jacaranda.org**20100607043238
786 Ignore-this: 2134dc1793c4f8e50350bd749c4c98c2
787] 
788[Unicode fixes.
789david-sarah@jacaranda.org**20100607010215
790 Ignore-this: d58727b5cd2ce00e6b6dae3166030138
791] 
792[quickstart.html: link to snapshots page, sorted with most recent first.
793david-sarah@jacaranda.org**20100606221127
794 Ignore-this: 93ea7e6ee47acc66f6daac9cabffed2d
795] 
796[setup: loosen the Desert Island test to allow it to check the network for new packages as long as it doesn't actually download any
797zooko@zooko.com**20100606175717
798 Ignore-this: e438a8eb3c1b0e68080711ec6ff93ffa
799 (You can look but don't touch.)
800] 
801[setup: have the buildbots print out locale.getpreferredencoding(), locale.getdefaultlocale(), locale.getlocale(), and os.path.supports_unicode_filenames
802zooko@zooko.com**20100605162932
803 Ignore-this: 85e31e0e0e1364e9215420e272d58116
804 Even though that latter one is completely useless, I'm curious.
805] 
806[quickstart.html: We haven't released 1.7beta yet.
807david-sarah@jacaranda.org**20100606220301
808 Ignore-this: 4e18898cfdb08cc3ddd1ff94d43fdda7
809] 
810[Raise Python version requirement to 2.4.4 for non-UCS-2 builds, to avoid a critical Python security bug.
811david-sarah@jacaranda.org**20100605031713
812 Ignore-this: 2df2b6d620c5d8191c79eefe655059e2
813] 
814[unicode tests: fix missing import
815zooko@zooko.com**20100604142630
816 Ignore-this: db437fe8009971882aaea9de05e2bc3
817] 
818[unicode: make test_cli test a non-ascii argument, and make the fallback term encoding be locale.getpreferredencoding()
819zooko@zooko.com**20100604141251
820 Ignore-this: b2bfc07942f69141811e59891842bd8c
821] 
822[unicode: always decode json manifest as utf-8 then encode for stdout
823zooko@zooko.com**20100604084840
824 Ignore-this: ac481692315fae870a0f3562bd7db48e
825 pyflakes pointed out that the exception handler fallback called an un-imported function, showing that the fallback wasn't being exercised.
826 I'm not 100% sure that this patch is right and would appreciate François or someone reviewing it.
827] 
828[fix flakes
829zooko@zooko.com**20100604075845
830 Ignore-this: 3e6a84b78771b0ad519e771a13605f0
831] 
832[fix syntax of assertion handling that isn't portable to older versions of Python
833zooko@zooko.com**20100604075805
834 Ignore-this: 3a12b293aad25883fb17230266eb04ec
835] 
836[test_stringutils.py: Skip test test_listdir_unicode_good if filesystem supports only ASCII filenames
837Francois Deppierraz <francois@ctrlaltdel.ch>**20100521160839
838 Ignore-this: f2ccdbd04c8d9f42f1efb0eb80018257
839] 
840[test_stringutils.py: Skip test_listdir_unicode on mocked platform which cannot store non-ASCII filenames
841Francois Deppierraz <francois@ctrlaltdel.ch>**20100521160559
842 Ignore-this: b93fde736a8904712b506e799250a600
843] 
844[test_stringutils.py: Add a test class for OpenBSD 4.1 with LANG=C
845Francois Deppierraz <francois@ctrlaltdel.ch>**20100521140053
846 Ignore-this: 63f568aec259cef0e807752fc8150b73
847] 
848[test_stringutils.py: Mock the open() call in test_open_unicode
849Francois Deppierraz <francois@ctrlaltdel.ch>**20100521135817
850 Ignore-this: d8be4e56a6eefe7d60f97f01ea20ac67
851 
852 This test ensure that open(a_unicode_string) is used on Unicode platforms
853 (Windows or MacOS X) and that open(a_correctly_encoded_bytestring) on other
854 platforms such as Unix.
855 
856] 
857[test_stringutils.py: Fix a trivial Python 2.4 syntax incompatibility
858Francois Deppierraz <francois@ctrlaltdel.ch>**20100521093345
859 Ignore-this: 9297e3d14a0dd37d0c1a4c6954fd59d3
860] 
861[test_cli.py: Fix tests when sys.stdout.encoding=None and refactor this code into functions
862Francois Deppierraz <francois@ctrlaltdel.ch>**20100520084447
863 Ignore-this: cf2286e225aaa4d7b1927c78c901477f
864] 
865[Fix handling of correctly encoded unicode filenames (#534)
866Francois Deppierraz <francois@ctrlaltdel.ch>**20100520004356
867 Ignore-this: 8a3a7df214a855f5a12dc0eeab6f2e39
868 
869 Tahoe CLI commands working on local files, for instance 'tahoe cp' or 'tahoe
870 backup', have been improved to correctly handle filenames containing non-ASCII
871 characters.
872   
873 In the case where Tahoe encounters a filename which cannot be decoded using the
874 system encoding, an error will be returned and the operation will fail.  Under
875 Linux, this typically happens when the filesystem contains filenames encoded
876 with another encoding, for instance latin1, than the system locale, for
877 instance UTF-8.  In such case, you'll need to fix your system with tools such
878 as 'convmv' before using Tahoe CLI.
879   
880 All CLI commands have been improved to support non-ASCII parameters such as
881 filenames and aliases on all supported Operating Systems except Windows as of
882 now.
883] 
884[stringutils.py: Unicode helper functions + associated tests
885Francois Deppierraz <francois@ctrlaltdel.ch>**20100520004105
886 Ignore-this: 7a73fc31de2fd39d437d6abd278bfa9a
887 
888 This file contains a bunch of helper functions which converts
889 unicode string from and to argv, filenames and stdout.
890] 
891[Add dependency on Michael Foord's mock library
892Francois Deppierraz <francois@ctrlaltdel.ch>**20100519233325
893 Ignore-this: 9bb01bf1e4780f6b98ed394c3b772a80
894] 
895[setup: adjust make clean target to ignore our bundled build tools
896zooko@zooko.com**20100604051250
897 Ignore-this: d24d2a3b849000790cfbfab69237454e
898] 
899[setup: bundle a copy of setuptools_trial as an unzipped egg in the base dir of the Tahoe-LAFS source tree
900zooko@zooko.com**20100604044648
901 Ignore-this: a4736e9812b4dab2d5a2bc4bfc5c3b28
902 This is to work-around this Distribute issue:
903 http://bitbucket.org/tarek/distribute/issue/55/revision-control-plugin-automatically-installed-as-a-build-dependency-is-not-present-when-another-build-dependency-is-being
904] 
905[setup: bundle a copy of darcsver in unzipped egg form in the root of the Tahoe-LAFS source tree
906zooko@zooko.com**20100604044146
907 Ignore-this: a51a52e82dd3a39225657ffa27decae2
908 This is to work-around this Distribute issue:
909 http://bitbucket.org/tarek/distribute/issue/55/revision-control-plugin-automatically-installed-as-a-build-dependency-is-not-present-when-another-build-dependency-is-being
910] 
911[setup: undo the previous patch to quote the executable in scripts
912zooko@zooko.com**20100604025204
913 Ignore-this: beda3b951c49d1111478618b8cabe005
914 The problem isn't in the script, it is in the cli.exe script that is built by setuptools. This might be related to
915 http://bugs.python.org/issue6792
916 and
917 http://bugs.python.org/setuptools/issue2
918 Or it might be a separate issue involving the launcher.c code e.g. http://tahoe-lafs.org/trac/zetuptoolz/browser/launcher.c?rev=576#L210 and its handling of the interpreter name.
919] 
920[quickstart.html: warn against installing Python at a path containing spaces.
921david-sarah@jacaranda.org**20100604032413
922 Ignore-this: c7118332573abd7762d9a897e650bc6a
923] 
924[setup: put quotes around the path to executable in case it has spaces in it, when building a tahoe.exe for win32
925zooko@zooko.com**20100604020836
926 Ignore-this: 478684843169c94a9c14726fedeeed7d
927] 
928[misc/show-tool-versions.py: Display additional Python interpreter encoding informations (stdout, stdin and filesystem)
929Francois Deppierraz <francois@ctrlaltdel.ch>**20100521094313
930 Ignore-this: 3ae9b0b07fd1d53fb632ef169f7c5d26
931] 
932[Fix test failures in test_web caused by changes to web page titles in #1062. Also, change a 'target' field to '_blank' instead of 'blank' in welcome.xhtml.
933david-sarah@jacaranda.org**20100603232105
934 Ignore-this: 6e2cc63f42b07e2a3b2d1a857abc50a6
935] 
936[Resolve merge conflict for sftpd.py
937david-sarah@jacaranda.org**20100603182537
938 Ignore-this: ba8b543e51312ac949798eb8f5bd9d9c
939] 
940[SFTP: possible fix for metadata times being shown as the epoch.
941david-sarah@jacaranda.org**20100602234514
942 Ignore-this: bdd7dfccf34eff818ff88aa4f3d28790
943] 
944[SFTP: further improvements to test coverage.
945david-sarah@jacaranda.org**20100602234422
946 Ignore-this: 87eeee567e8d7562659442ea491e187c
947] 
948[SFTP: improve test coverage. Also make creating a directory fail when permissions are read-only (rather than ignoring the permissions).
949david-sarah@jacaranda.org**20100602041934
950 Ignore-this: a5e9d9081677bc7f3ddb18ca7a1f531f
951] 
952[dirnode.py: fix a bug in the no-write change for Adder, and improve test coverage. Add a 'metadata' argument to create_subdirectory, with documentation. Also update some comments in test_dirnode.py made stale by the ctime/mtime change.
953david-sarah@jacaranda.org**20100602032641
954 Ignore-this: 48817b54cd63f5422cb88214c053b03b
955] 
956[dirnode.py: Fix bug that caused 'tahoe' fields, 'ctime' and 'mtime' not to be updated when new metadata is present.
957david-sarah@jacaranda.org**20100602014644
958 Ignore-this: 5bac95aa897b68f2785d481e49b6a66
959] 
960[SFTP: fix a bug that caused the temporary files underlying EncryptedTemporaryFiles not to be closed.
961david-sarah@jacaranda.org**20100601055310
962 Ignore-this: 44fee4cfe222b2b1690f4c5e75083a52
963] 
964[SFTP: changes for #1063 ('no-write' field) including comment:1 (clearing owner write permission diminishes to a read cap). Includes documentation changes, but not tests for the new behaviour.
965david-sarah@jacaranda.org**20100601051139
966 Ignore-this: eff7c08bd47fd52bfe2b844dabf02558
967] 
968[dirnode.py: Fix #1034 (MetadataSetter does not enforce restriction on setting 'tahoe' subkeys), and expose the metadata updater for use by SFTP. Also, support diminishing a child cap to read-only if 'no-write' is set in the metadata.
969david-sarah@jacaranda.org**20100601045428
970 Ignore-this: 14f26e17e58db97fad0dcfd350b38e95
971] 
972[SFTP: the same bug as in _sync_heisenfiles also occurred in two other places.
973david-sarah@jacaranda.org**20100530060127
974 Ignore-this: 8d137658fc6e4596fa42697476c39aa3
975] 
976[SFTP: another try at fixing the _sync_heisenfiles bug.
977david-sarah@jacaranda.org**20100530055254
978 Ignore-this: c15f76f32a60083a6b7de6ca0e917934
979] 
980[SFTP: fix silly bug in _sync_heisenfiles ('f is not ignore' vs 'not (f is ignore)').
981david-sarah@jacaranda.org**20100530053807
982 Ignore-this: 71c4bc62613bf8fef835886d8eb61c27
983] 
984[SFTP: log when a sync completes.
985david-sarah@jacaranda.org**20100530051840
986 Ignore-this: d99765663ceb673c8a693dfcf88c25ea
987] 
988[SFTP: fix bug in previous logging patch.
989david-sarah@jacaranda.org**20100530050000
990 Ignore-this: 613e4c115f03fe2d04c621b510340817
991] 
992[SFTP: more logging to track down OpenOffice hang.
993david-sarah@jacaranda.org**20100530040809
994 Ignore-this: 6c11f2d1eac9f62e2d0f04f006476a03
995] 
996[SFTP: avoid blocking close on a heisenfile that has been abandoned or never changed. Also, improve the logging to help track down a case where OpenOffice hangs on opening a file with FXF_READ|FXF_WRITE.
997david-sarah@jacaranda.org**20100530025544
998 Ignore-this: 9919dddd446fff64de4031ad51490d1c
999] 
1000[Move suppression of DeprecationWarning about BaseException.message from sftpd.py to main __init__.py. Also, remove the global suppression of the 'integer argument expected, got float' warning, which turned out to be a bug.
1001david-sarah@jacaranda.org**20100529050537
1002 Ignore-this: 87648afa0dec0d2e73614007de102a16
1003] 
1004[SFTP: cater to clients that assume a file is created as soon as they have made an open request; also, fix some race conditions associated with closing a file at about the same time as renaming or removing it.
1005david-sarah@jacaranda.org**20100529045253
1006 Ignore-this: 2404076b2154ff2659e2b10e0b9e813c
1007] 
1008[Change doc comments in interfaces.py to take into account unknown nodes.
1009david-sarah@jacaranda.org**20100528171922
1010 Ignore-this: d2fde6890b3bca9c7275775f64fbff56
1011] 
1012[Add must_exist, must_be_directory, and must_be_file arguments to DirectoryNode.delete. This will be used to fixes a minor condition in the SFTP frontend.
1013david-sarah@jacaranda.org**20100527194529
1014 Ignore-this: 6d8114cef4450c52c57639f82852716f
1015] 
1016[Trivial whitespace changes.
1017david-sarah@jacaranda.org**20100527194114
1018 Ignore-this: 98d611bc54ee20b01a5f6b334ff61b2d
1019] 
1020[SFTP: 'sync' any open files at a direntry before opening any new file at that direntry. This works around the sshfs misbehaviour of returning success to clients immediately on close.
1021david-sarah@jacaranda.org**20100525230257
1022 Ignore-this: 63245d6d864f8f591c86170864d7c57f
1023] 
1024[SFTP: handle removing a file while it is open. Also some simplifications of the logout handling.
1025david-sarah@jacaranda.org**20100525184210
1026 Ignore-this: 660ee80be6ecab783c60452a9da896de
1027] 
1028[SFTP: a posix-rename response should actually return an FXP_STATUS reply, not an FXP_EXTENDED_REPLY as Twisted Conch assumes. Work around this by raising an SFTPError with code FX_OK.
1029david-sarah@jacaranda.org**20100525033323
1030 Ignore-this: fe2914d3ef7f5194bbeaf3f2dda2ad7d
1031] 
1032[SFTP: fix problem with posix-rename code returning a Deferred for the renamed filenode, not for the result of the request (an empty string).
1033david-sarah@jacaranda.org**20100525020209
1034 Ignore-this: 69f7491df2a8f7ea92d999a6d9f0581d
1035] 
1036[SFTP: fix time handling to make sure floats are not passed into twisted.conch, and to print times in the future less ambiguously in directory listings.
1037david-sarah@jacaranda.org**20100524230412
1038 Ignore-this: eb1a3fb72492fa2fb19667b6e4300440
1039] 
1040[SFTP: name of the POSIX rename extension should be 'posix-rename@openssh.com', not 'extposix-rename@openssh.com'.
1041david-sarah@jacaranda.org**20100524021156
1042 Ignore-this: f90eb1ff9560176635386ee797a3fdc7
1043] 
1044[SFTP: avoid race condition where .write could be called on an OverwriteableFileConsumer after it had been closed.
1045david-sarah@jacaranda.org**20100523233830
1046 Ignore-this: 55d381064a15bd64381163341df4d09f
1047] 
1048[SFTP: log tracebacks for RAISEd exceptions.
1049david-sarah@jacaranda.org**20100523221535
1050 Ignore-this: c76a7852df099b358642f0631237cc89
1051] 
1052[Suppress 'integer argument expected, got float' DeprecationWarning everywhere
1053david-sarah@jacaranda.org**20100523221157
1054 Ignore-this: 80efd7e27798f5d2ad66c7a53e7048e5
1055] 
1056[SFTP: more logging to investigate behaviour of getAttrs(path).
1057david-sarah@jacaranda.org**20100523204236
1058 Ignore-this: e58fd35dc9015316e16a9f49f19bb469
1059] 
1060[SFTP: fix pyflakes warnings; drop 'noisy' versions of eventually_callback and eventually_errback; robustify conversion of exception messages to UTF-8.
1061david-sarah@jacaranda.org**20100523140905
1062 Ignore-this: 420196fc58646b05bbc9c3732b6eb314
1063] 
1064[SFTP: fixes and test cases for renaming of open files.
1065david-sarah@jacaranda.org**20100523032549
1066 Ignore-this: 32e0726be0fc89335f3035157e202c68
1067] 
1068[SFTP: Increase test_sftp timeout to cater for francois' ARM buildslave.
1069david-sarah@jacaranda.org**20100522191639
1070 Ignore-this: a5acf9660d304677048ab4dd72908ad8
1071] 
1072[SFTP: Fix error in support for getAttrs on an open file, to index open files by directory entry rather than path. Extend that support to renaming open files. Also, implement the extposix-rename@openssh.org extension, and some other minor refactoring.
1073david-sarah@jacaranda.org**20100522035836
1074 Ignore-this: 8ef93a828e927cce2c23b805250b81a4
1075] 
1076[SFTP: relax pyasn1 version dependency to >= 0.0.8a.
1077david-sarah@jacaranda.org**20100520181437
1078 Ignore-this: 2c7b3dee7b7e14ba121d3118193a386a
1079] 
1080[SFTP tests: fix test_openDirectory_and_attrs that was failing in timezones west of UTC.
1081david-sarah@jacaranda.org**20100520181027
1082 Ignore-this: 9beaf602beef437c11c7e97f54ce2599
1083] 
1084[SFTP: allow getAttrs to succeed on a file that has been opened for creation but not yet uploaded or linked (part of #1050).
1085david-sarah@jacaranda.org**20100520035613
1086 Ignore-this: 2f59107d60d5476edac19361ccf6cf94
1087] 
1088[SFTP: improve logging so that results of requests are (usually) logged.
1089david-sarah@jacaranda.org**20100520003652
1090 Ignore-this: 3f59eeee374a3eba71db9be31d5a95
1091] 
1092[SFTP: add tests for more combinations of open flags.
1093david-sarah@jacaranda.org**20100519053933
1094 Ignore-this: b97ee351b1e8ecfecabac70698060665
1095] 
1096[SFTP: allow FXF_WRITE | FXF_TRUNC (#1050).
1097david-sarah@jacaranda.org**20100519043240
1098 Ignore-this: bd70009f11d07ac6e9fd0d1e3fa87a9b
1099] 
1100[SFTP: remove another case where we were logging data.
1101david-sarah@jacaranda.org**20100519012713
1102 Ignore-this: 83115daf3a90278fed0e3fc267607584
1103] 
1104[SFTP: avoid logging all data passed to callbacks.
1105david-sarah@jacaranda.org**20100519000651
1106 Ignore-this: ade6d69a473ada50acef6389fc7fdf69
1107] 
1108[SFTP: fixes related to reporting of permissions (needed for sshfs).
1109david-sarah@jacaranda.org**20100518054521
1110 Ignore-this: c51f8a5d0dc76b80d33ffef9b0541325
1111] 
1112[SFTP: change error code returned for ExistingChildError to FX_FAILURE (fixes gvfs with some picky programs such as gedit).
1113david-sarah@jacaranda.org**20100518004205
1114 Ignore-this: c194c2c9aaf3edba7af84b7413cec375
1115] 
1116[SFTP: fixed bugs that caused hangs during write (#1037).
1117david-sarah@jacaranda.org**20100517044228
1118 Ignore-this: b8b95e82c4057367388a1e6baada993b
1119] 
1120[SFTP: work around a probable bug in twisted.conch.ssh.session:loseConnection(). Also some minor error handling cleanups.
1121david-sarah@jacaranda.org**20100517012606
1122 Ignore-this: 5d3da7c4219cb0c14547e7fd70c74204
1123] 
1124[SFTP: add pyasn1 as dependency, needed if we are using Twisted >= 9.0.0.
1125david-sarah@jacaranda.org**20100516193710
1126 Ignore-this: 76fd92e8a950bb1983a90a09e89c54d3
1127] 
1128[SFTP: Support statvfs extensions, avoid logging actual data, and decline shell sessions politely.
1129david-sarah@jacaranda.org**20100516154347
1130 Ignore-this: 9d05d23ba77693c03a61accd348ccbe5
1131] 
1132[SFTP: fix error in SFTPUserHandler arguments introduced by execCommand patch.
1133david-sarah@jacaranda.org**20100516014045
1134 Ignore-this: f5ee494dc6ad6aa536cc8144bd2e3d19
1135] 
1136[SFTP: implement execCommand to interoperate with clients that issue a 'df -P -k /' command. Also eliminate use of Zope adaptation.
1137david-sarah@jacaranda.org**20100516012754
1138 Ignore-this: 2d0ed28b759f67f83875b1eaf5778992
1139] 
1140[sftpd.py: 'log.OPERATIONAL' should be just 'OPERATIONAL'.
1141david-sarah@jacaranda.org**20100515155533
1142 Ignore-this: f2347cb3301bbccc086356f6edc685
1143] 
1144[Attempt to fix #1040 by making SFTPUser implement ISession.
1145david-sarah@jacaranda.org**20100515005719
1146 Ignore-this: b3baaf088ba567e861e61e347195dfc4
1147] 
1148[Eliminate Windows newlines from sftpd.py.
1149david-sarah@jacaranda.org**20100515005656
1150 Ignore-this: cd54fd25beb957887514ae76e08c277
1151] 
1152[Update SFTP implementation and tests: fix #1038 and switch to foolscap logging; also some code reorganization.
1153david-sarah@jacaranda.org**20100514043113
1154 Ignore-this: 262f76d953dcd4317210789f2b2bf5da
1155] 
1156[Change shouldFail to avoid Unicode errors when converting Failure to str
1157david-sarah@jacaranda.org**20100512060754
1158 Ignore-this: 86ed419d332d9c33090aae2cde1dc5df
1159] 
1160[Tests for new SFTP implementation
1161david-sarah@jacaranda.org**20100512060552
1162 Ignore-this: 20308d4a59b3ebc868aad55ae0a7a981
1163] 
1164[New SFTP implementation: mutable files, read/write support, streaming download, Unicode filenames, and more
1165david-sarah@jacaranda.org**20100512055407
1166 Ignore-this: 906f51c48d974ba9cf360c27845c55eb
1167] 
1168[allmydata.org -> tahoe-lafs.org in __init__.py
1169david-sarah@jacaranda.org**20100603063530
1170 Ignore-this: f7d82331d5b4a3c4c0938023409335af
1171] 
1172[small change to CREDITS
1173david-sarah@jacaranda.org**20100603062421
1174 Ignore-this: 2909cdbedc19da5573dec810fc23243
1175] 
1176[Resolve conflict in patch to change imports to absolute.
1177david-sarah@jacaranda.org**20100603054608
1178 Ignore-this: 15aa1caa88e688ffa6dc53bed7dcca7d
1179] 
1180[Minor documentation tweaks.
1181david-sarah@jacaranda.org**20100603054458
1182 Ignore-this: e30ae407b0039dfa5b341d8f88e7f959
1183] 
1184[title_rename_xhtml.dpatch.txt
1185freestorm77@gmail.com**20100529172542
1186 Ignore-this: d2846afcc9ea72ac443a62ecc23d121b
1187 
1188 - Renamed xhtml Title from "Allmydata - Tahoe" to "Tahoe-LAFS"
1189 - Renamed Tahoe to Tahoe-LAFS in page content
1190 - Changed Tahoe-LAFS home page link to http://tahoe-lafs.org (added target="blank")
1191 - Deleted commented css script in info.xhtml
1192 
1193 
1194] 
1195[tests: refactor test_web.py to have less duplication of literal caps-from-the-future
1196zooko@zooko.com**20100519055146
1197 Ignore-this: 49e5412e6cc4566ca67f069ffd850af6
1198 This is a prelude to a patch which will add tests of caps from the future which have non-ascii chars in them.
1199] 
1200[doc_reformat_stats.txt
1201freestorm77@gmail.com**20100424114615
1202 Ignore-this: af315db5f7e3a17219ff8fb39bcfcd60
1203 
1204 
1205    - Added heading format begining and ending by "=="
1206    - Added Index
1207    - Added Title
1208           
1209    Note: No change are made in paragraphs content
1210 
1211 
1212 **END OF DESCRIPTION***
1213 
1214 Place the long patch description above the ***END OF DESCRIPTION*** marker.
1215 The first line of this file will be the patch name.
1216 
1217 
1218 This patch contains the following changes:
1219 
1220 M ./docs/stats.txt -2 +2
1221] 
1222[doc_reformat_performance.txt
1223freestorm77@gmail.com**20100424114444
1224 Ignore-this: 55295ff5cd8a5b67034eb661a5b0699d
1225 
1226    - Added heading format begining and ending by "=="
1227    - Added Index
1228    - Added Title
1229         
1230    Note: No change are made in paragraphs content
1231 
1232 
1233] 
1234[doc_refomat_logging.txt
1235freestorm77@gmail.com**20100424114316
1236 Ignore-this: 593f0f9914516bf1924dfa6eee74e35f
1237 
1238    - Added heading format begining and ending by "=="
1239    - Added Index
1240    - Added Title
1241         
1242    Note: No change are made in paragraphs content
1243 
1244] 
1245[doc_reformat_known_issues.txt
1246freestorm77@gmail.com**20100424114118
1247 Ignore-this: 9577c3965d77b7ac18698988cfa06049
1248 
1249     - Added heading format begining and ending by "=="
1250     - Added Index
1251     - Added Title
1252           
1253     Note: No change are made in paragraphs content
1254   
1255 
1256] 
1257[doc_reformat_helper.txt
1258freestorm77@gmail.com**20100424120649
1259 Ignore-this: de2080d6152ae813b20514b9908e37fb
1260 
1261 
1262    - Added heading format begining and ending by "=="
1263    - Added Index
1264    - Added Title
1265             
1266    Note: No change are made in paragraphs content
1267 
1268] 
1269[doc_reformat_garbage-collection.txt
1270freestorm77@gmail.com**20100424120830
1271 Ignore-this: aad3e4c99670871b66467062483c977d
1272 
1273 
1274    - Added heading format begining and ending by "=="
1275    - Added Index
1276    - Added Title
1277             
1278    Note: No change are made in paragraphs content
1279 
1280] 
1281[doc_reformat_FTP-and-SFTP.txt
1282freestorm77@gmail.com**20100424121334
1283 Ignore-this: 3736b3d8f9a542a3521fbb566d44c7cf
1284 
1285 
1286    - Added heading format begining and ending by "=="
1287    - Added Index
1288    - Added Title
1289           
1290    Note: No change are made in paragraphs content
1291 
1292] 
1293[doc_reformat_debian.txt
1294freestorm77@gmail.com**20100424120537
1295 Ignore-this: 45fe4355bb869e55e683405070f47eff
1296 
1297 
1298    - Added heading format begining and ending by "=="
1299    - Added Index
1300    - Added Title
1301             
1302    Note: No change are made in paragraphs content
1303 
1304] 
1305[doc_reformat_configuration.txt
1306freestorm77@gmail.com**20100424104903
1307 Ignore-this: 4fbabc51b8122fec69ce5ad1672e79f2
1308 
1309 
1310 - Added heading format begining and ending by "=="
1311 - Added Index
1312 - Added Title
1313 
1314 Note: No change are made in paragraphs content
1315 
1316] 
1317[doc_reformat_CLI.txt
1318freestorm77@gmail.com**20100424121512
1319 Ignore-this: 2d3a59326810adcb20ea232cea405645
1320 
1321      - Added heading format begining and ending by "=="
1322      - Added Index
1323      - Added Title
1324           
1325      Note: No change are made in paragraphs content
1326 
1327] 
1328[doc_reformat_backupdb.txt
1329freestorm77@gmail.com**20100424120416
1330 Ignore-this: fed696530e9d2215b6f5058acbedc3ab
1331 
1332 
1333    - Added heading format begining and ending by "=="
1334    - Added Index
1335    - Added Title
1336             
1337    Note: No change are made in paragraphs content
1338 
1339] 
1340[doc_reformat_architecture.txt
1341freestorm77@gmail.com**20100424120133
1342 Ignore-this: 6e2cab4635080369f2b8cadf7b2f58e
1343 
1344 
1345     - Added heading format begining and ending by "=="
1346     - Added Index
1347     - Added Title
1348             
1349     Note: No change are made in paragraphs content
1350 
1351 
1352] 
1353[Correct harmless indentation errors found by pylint
1354david-sarah@jacaranda.org**20100226052151
1355 Ignore-this: 41335bce830700b18b80b6e00b45aef5
1356] 
1357[Change relative imports to absolute
1358david-sarah@jacaranda.org**20100226071433
1359 Ignore-this: 32e6ce1a86e2ffaaba1a37d9a1a5de0e
1360] 
1361[Document reason for the trialcoverage version requirement being 0.3.3.
1362david-sarah@jacaranda.org**20100525004444
1363 Ignore-this: 2f9f1df6882838b000c063068f258aec
1364] 
1365[Downgrade version requirement for trialcoverage to 0.3.3 (from 0.3.10), to avoid needing to compile coveragepy on Windows.
1366david-sarah@jacaranda.org**20100524233707
1367 Ignore-this: 9c397a374c8b8017e2244b8a686432a8
1368] 
1369[Suppress deprecation warning for twisted.web.error.NoResource when using Twisted >= 9.0.0.
1370david-sarah@jacaranda.org**20100516205625
1371 Ignore-this: 2361a3023cd3db86bde5e1af759ed01
1372] 
1373[docs: CREDITS for Jeremy Visser
1374zooko@zooko.com**20100524081829
1375 Ignore-this: d7c1465fd8d4e25b8d46d38a1793465b
1376] 
1377[test: show stdout and stderr in case of non-zero exit code from "tahoe" command
1378zooko@zooko.com**20100524073348
1379 Ignore-this: 695e81cd6683f4520229d108846cd551
1380] 
1381[setup: upgrade bundled zetuptoolz to zetuptoolz-0.6c15dev and make it unpacked and directly loaded by setup.py
1382zooko@zooko.com**20100523205228
1383 Ignore-this: 24fb32aaee3904115a93d1762f132c7
1384 Also fix the relevant "make clean" target behavior.
1385] 
1386[setup: remove bundled zipfile egg of setuptools
1387zooko@zooko.com**20100523205120
1388 Ignore-this: c68b5f2635bb93d1c1fa7b613a026f9e
1389 We're about to replace it with bundled unpacked source code of setuptools, which is much nicer for debugging and evolving under revision control.
1390] 
1391[setup: remove bundled copy of setuptools_trial-0.5.2.tar
1392zooko@zooko.com**20100522221539
1393 Ignore-this: 140f90eb8fb751a509029c4b24afe647
1394 Hopefully it will get installed automatically as needed and we won't bundle it anymore.
1395] 
1396[setup: remove bundled setuptools_darcs-1.2.8.tar
1397zooko@zooko.com**20100522015333
1398 Ignore-this: 378b1964b513ae7fe22bae2d3478285d
1399 This version of setuptools_darcs had a bug when used on Windows which has been fixed in setuptools_darcs-1.2.9. Hopefully we will not need to bundle a copy of setuptools_darcs-1.2.9 in with Tahoe-LAFS and can instead rely on it to be downloaded from PyPI or bundled in the "tahoe deps" separate tarball.
1400] 
1401[tests: fix pyflakes warnings in bench_dirnode.py
1402zooko@zooko.com**20100521202511
1403 Ignore-this: f23d55b4ed05e52865032c65a15753c4
1404] 
1405[setup: if the string '--reporter=bwverbose-coverage' appears on sys.argv then you need trialcoverage
1406zooko@zooko.com**20100521122226
1407 Ignore-this: e760c45dcfb5a43c1dc1e8a27346bdc2
1408] 
1409[tests: don't let bench_dirnode.py do stuff and have side-effects at import time (unless __name__ == '__main__')
1410zooko@zooko.com**20100521122052
1411 Ignore-this: 96144a412250d9bbb5fccbf83b8753b8
1412] 
1413[tests: increase timeout to give François's ARM buildslave a chance to complete the tests
1414zooko@zooko.com**20100520134526
1415 Ignore-this: 3dd399fdc8b91149c82b52f955b50833
1416] 
1417[run_trial.darcspath
1418freestorm77@gmail.com**20100510232829
1419 Ignore-this: 5ebb4df74e9ea8a4bdb22b65373d1ff2
1420] 
1421[docs: line-wrap README.txt
1422zooko@zooko.com**20100518174240
1423 Ignore-this: 670a02d360df7de51ebdcf4fae752577
1424] 
1425[Hush pyflakes warnings
1426Kevan Carstensen <kevan@isnotajoke.com>**20100515184344
1427 Ignore-this: fd602c3bba115057770715c36a87b400
1428] 
1429[setup: new improved misc/show-tool-versions.py
1430zooko@zooko.com**20100516050122
1431 Ignore-this: ce9b1de1b35b07d733e6cf823b66335a
1432] 
1433[Improve code coverage of the Tahoe2PeerSelector tests.
1434Kevan Carstensen <kevan@isnotajoke.com>**20100515032913
1435 Ignore-this: 793151b63ffa65fdae6915db22d9924a
1436] 
1437[Remove a comment that no longer makes sense.
1438Kevan Carstensen <kevan@isnotajoke.com>**20100514203516
1439 Ignore-this: 956983c7e7c7e4477215494dfce8f058
1440] 
1441[docs: update docs/architecture.txt to more fully and correctly explain the upload procedure
1442zooko@zooko.com**20100514043458
1443 Ignore-this: 538b6ea256a49fed837500342092efa3
1444] 
1445[Fix up the behavior of #778, per reviewers' comments
1446Kevan Carstensen <kevan@isnotajoke.com>**20100514004917
1447 Ignore-this: 9c20b60716125278b5456e8feb396bff
1448 
1449   - Make some important utility functions clearer and more thoroughly
1450     documented.
1451   - Assert in upload.servers_of_happiness that the buckets attributes
1452     of PeerTrackers passed to it are mutually disjoint.
1453   - Get rid of some silly non-Pythonisms that I didn't see when I first
1454     wrote these patches.
1455   - Make sure that should_add_server returns true when queried about a
1456     shnum that it doesn't know about yet.
1457   - Change Tahoe2PeerSelector.preexisting_shares to map a shareid to a set
1458     of peerids, alter dependencies to deal with that.
1459   - Remove upload.should_add_servers, because it is no longer necessary
1460   - Move upload.shares_of_happiness and upload.shares_by_server to a utility
1461     file.
1462   - Change some points in Tahoe2PeerSelector.
1463   - Compute servers_of_happiness using a bipartite matching algorithm that
1464     we know is optimal instead of an ad-hoc greedy algorithm that isn't.
1465   - Change servers_of_happiness to just take a sharemap as an argument,
1466     change its callers to merge existing_shares and used_peers before
1467     calling it.
1468   - Change an error message in the encoder to be more appropriate for
1469     servers of happiness.
1470   - Clarify the wording of an error message in immutable/upload.py
1471   - Refactor a happiness failure message to happinessutil.py, and make
1472     immutable/upload.py and immutable/encode.py use it.
1473   - Move the word "only" as far to the right as possible in failure
1474     messages.
1475   - Use a better definition of progress during peer selection.
1476   - Do read-only peer share detection queries in parallel, not sequentially.
1477   - Clean up logging semantics; print the query statistics whenever an
1478     upload is unsuccessful, not just in one case.
1479 
1480] 
1481[Alter the error message when an upload fails, per some comments in #778.
1482Kevan Carstensen <kevan@isnotajoke.com>**20091230210344
1483 Ignore-this: ba97422b2f9737c46abeb828727beb1
1484 
1485 When I first implemented #778, I just altered the error messages to refer to
1486 servers where they referred to shares. The resulting error messages weren't
1487 very good. These are a bit better.
1488] 
1489[Change "UploadHappinessError" to "UploadUnhappinessError"
1490Kevan Carstensen <kevan@isnotajoke.com>**20091205043037
1491 Ignore-this: 236b64ab19836854af4993bb5c1b221a
1492] 
1493[Alter the error message returned when peer selection fails
1494Kevan Carstensen <kevan@isnotajoke.com>**20091123002405
1495 Ignore-this: b2a7dc163edcab8d9613bfd6907e5166
1496 
1497 The Tahoe2PeerSelector returned either NoSharesError or NotEnoughSharesError
1498 for a variety of error conditions that weren't informatively described by them.
1499 This patch creates a new error, UploadHappinessError, replaces uses of
1500 NoSharesError and NotEnoughSharesError with it, and alters the error message
1501 raised with the errors to be more in line with the new servers_of_happiness
1502 behavior. See ticket #834 for more information.
1503] 
1504[Eliminate overcounting iof servers_of_happiness in Tahoe2PeerSelector; also reorganize some things.
1505Kevan Carstensen <kevan@isnotajoke.com>**20091118014542
1506 Ignore-this: a6cb032cbff74f4f9d4238faebd99868
1507] 
1508[Change stray "shares_of_happiness" to "servers_of_happiness"
1509Kevan Carstensen <kevan@isnotajoke.com>**20091116212459
1510 Ignore-this: 1c971ba8c3c4d2e7ba9f020577b28b73
1511] 
1512[Alter Tahoe2PeerSelector to make sure that it recognizes existing shares on readonly servers, fixing an issue in #778
1513Kevan Carstensen <kevan@isnotajoke.com>**20091116192805
1514 Ignore-this: 15289f4d709e03851ed0587b286fd955
1515] 
1516[Alter 'immutable/encode.py' and 'immutable/upload.py' to use servers_of_happiness instead of shares_of_happiness.
1517Kevan Carstensen <kevan@isnotajoke.com>**20091104111222
1518 Ignore-this: abb3283314820a8bbf9b5d0cbfbb57c8
1519] 
1520[Alter the signature of set_shareholders in IEncoder to add a 'servermap' parameter, which gives IEncoders enough information to perform a sane check for servers_of_happiness.
1521Kevan Carstensen <kevan@isnotajoke.com>**20091104033241
1522 Ignore-this: b3a6649a8ac66431beca1026a31fed94
1523] 
1524[Alter CiphertextDownloader to work with servers_of_happiness
1525Kevan Carstensen <kevan@isnotajoke.com>**20090924041932
1526 Ignore-this: e81edccf0308c2d3bedbc4cf217da197
1527] 
1528[Revisions of the #778 tests, per reviewers' comments
1529Kevan Carstensen <kevan@isnotajoke.com>**20100514012542
1530 Ignore-this: 735bbc7f663dce633caeb3b66a53cf6e
1531 
1532 - Fix comments and confusing naming.
1533 - Add tests for the new error messages suggested by David-Sarah
1534   and Zooko.
1535 - Alter existing tests for new error messages.
1536 - Make sure that the tests continue to work with the trunk.
1537 - Add a test for a mutual disjointedness assertion that I added to
1538   upload.servers_of_happiness.
1539 - Fix the comments to correctly reflect read-onlyness
1540 - Add a test for an edge case in should_add_server
1541 - Add an assertion to make sure that share redistribution works as it
1542   should
1543 - Alter tests to work with revised servers_of_happiness semantics
1544 - Remove tests for should_add_server, since that function no longer exists.
1545 - Alter tests to know about merge_peers, and to use it before calling
1546   servers_of_happiness.
1547 - Add tests for merge_peers.
1548 - Add Zooko's puzzles to the tests.
1549 - Edit encoding tests to expect the new kind of failure message.
1550 - Edit tests to expect error messages with the word "only" moved as far
1551   to the right as possible.
1552 - Extended and cleaned up some helper functions.
1553 - Changed some tests to call more appropriate helper functions.
1554 - Added a test for the failing redistribution algorithm
1555 - Added a test for the progress message
1556 - Added a test for the upper bound on readonly peer share discovery.
1557 
1558] 
1559[Alter various unit tests to work with the new happy behavior
1560Kevan Carstensen <kevan@isnotajoke.com>**20100107181325
1561 Ignore-this: 132032bbf865e63a079f869b663be34a
1562] 
1563[Replace "UploadHappinessError" with "UploadUnhappinessError" in tests.
1564Kevan Carstensen <kevan@isnotajoke.com>**20091205043453
1565 Ignore-this: 83f4bc50c697d21b5f4e2a4cd91862ca
1566] 
1567[Add tests for the behavior described in #834.
1568Kevan Carstensen <kevan@isnotajoke.com>**20091123012008
1569 Ignore-this: d8e0aa0f3f7965ce9b5cea843c6d6f9f
1570] 
1571[Re-work 'test_upload.py' to be more readable; add more tests for #778
1572Kevan Carstensen <kevan@isnotajoke.com>**20091116192334
1573 Ignore-this: 7e8565f92fe51dece5ae28daf442d659
1574] 
1575[Test Tahoe2PeerSelector to make sure that it recognizeses existing shares on readonly servers
1576Kevan Carstensen <kevan@isnotajoke.com>**20091109003735
1577 Ignore-this: 12f9b4cff5752fca7ed32a6ebcff6446
1578] 
1579[Add more tests for comment:53 in ticket #778
1580Kevan Carstensen <kevan@isnotajoke.com>**20091104112849
1581 Ignore-this: 3bb2edd299a944cc9586e14d5d83ec8c
1582] 
1583[Add a test for upload.shares_by_server
1584Kevan Carstensen <kevan@isnotajoke.com>**20091104111324
1585 Ignore-this: f9802e82d6982a93e00f92e0b276f018
1586] 
1587[Minor tweak to an existing test -- make the first server read-write, instead of read-only
1588Kevan Carstensen <kevan@isnotajoke.com>**20091104034232
1589 Ignore-this: a951a46c93f7f58dd44d93d8623b2aee
1590] 
1591[Alter tests to use the new form of set_shareholders
1592Kevan Carstensen <kevan@isnotajoke.com>**20091104033602
1593 Ignore-this: 3deac11fc831618d11441317463ef830
1594] 
1595[Refactor some behavior into a mixin, and add tests for the behavior described in #778
1596"Kevan Carstensen" <kevan@isnotajoke.com>**20091030091908
1597 Ignore-this: a6f9797057ca135579b249af3b2b66ac
1598] 
1599[Alter NoNetworkGrid to allow the creation of readonly servers for testing purposes.
1600Kevan Carstensen <kevan@isnotajoke.com>**20091018013013
1601 Ignore-this: e12cd7c4ddeb65305c5a7e08df57c754
1602] 
1603[Update 'docs/architecture.txt' to reflect readonly share discovery
1604kevan@isnotajoke.com**20100514003852
1605 Ignore-this: 7ead71b34df3b1ecfdcfd3cb2882e4f9
1606] 
1607[Alter the wording in docs/architecture.txt to more accurately describe the servers_of_happiness behavior.
1608Kevan Carstensen <kevan@isnotajoke.com>**20100428002455
1609 Ignore-this: 6eff7fa756858a1c6f73728d989544cc
1610] 
1611[Alter wording in 'interfaces.py' to be correct wrt #778
1612"Kevan Carstensen" <kevan@isnotajoke.com>**20091205034005
1613 Ignore-this: c9913c700ac14e7a63569458b06980e0
1614] 
1615[Update 'docs/configuration.txt' to reflect the servers_of_happiness behavior.
1616Kevan Carstensen <kevan@isnotajoke.com>**20091205033813
1617 Ignore-this: 5e1cb171f8239bfb5b565d73c75ac2b8
1618] 
1619[Clarify quickstart instructions for installing pywin32
1620david-sarah@jacaranda.org**20100511180300
1621 Ignore-this: d4668359673600d2acbc7cd8dd44b93c
1622] 
1623[web: add a simple test that you can load directory.xhtml
1624zooko@zooko.com**20100510063729
1625 Ignore-this: e49b25fa3c67b3c7a56c8b1ae01bb463
1626] 
1627[setup: fix typos in misc/show-tool-versions.py
1628zooko@zooko.com**20100510063615
1629 Ignore-this: 2181b1303a0e288e7a9ebd4c4855628
1630] 
1631[setup: show code-coverage tool versions in show-tools-versions.py
1632zooko@zooko.com**20100510062955
1633 Ignore-this: 4b4c68eb3780b762c8dbbd22b39df7cf
1634] 
1635[docs: update README, mv it to README.txt, update setup.py
1636zooko@zooko.com**20100504094340
1637 Ignore-this: 40e28ca36c299ea1fd12d3b91e5b421c
1638] 
1639[Dependency on Windmill test framework is not needed yet.
1640david-sarah@jacaranda.org**20100504161043
1641 Ignore-this: be088712bec650d4ef24766c0026ebc8
1642] 
1643[tests: pass z to tar so that BSD tar will know to ungzip
1644zooko@zooko.com**20100504090628
1645 Ignore-this: 1339e493f255e8fc0b01b70478f23a09
1646] 
1647[setup: update comments and URLs in setup.cfg
1648zooko@zooko.com**20100504061653
1649 Ignore-this: f97692807c74bcab56d33100c899f829
1650] 
1651[setup: reorder and extend the show-tool-versions script, the better to glean information about our new buildslaves
1652zooko@zooko.com**20100504045643
1653 Ignore-this: 836084b56b8d4ee8f1de1f4efb706d36
1654] 
1655[CLI: Support for https url in option --node-url
1656Francois Deppierraz <francois@ctrlaltdel.ch>**20100430185609
1657 Ignore-this: 1717176b4d27c877e6bc67a944d9bf34
1658 
1659 This patch modifies the regular expression used for verifying of '--node-url'
1660 parameter.  Support for accessing a Tahoe gateway over HTTPS was already
1661 present, thanks to Python's urllib.
1662 
1663] 
1664[backupdb.did_create_directory: use REPLACE INTO, not INSERT INTO + ignore error
1665Brian Warner <warner@lothar.com>**20100428050803
1666 Ignore-this: 1fca7b8f364a21ae413be8767161e32f
1667 
1668 This handles the case where we upload a new tahoe directory for a
1669 previously-processed local directory, possibly creating a new dircap (if the
1670 metadata had changed). Now we replace the old dirhash->dircap record. The
1671 previous behavior left the old record in place (with the old dircap and
1672 timestamps), so we'd never stop creating new directories and never converge
1673 on a null backup.
1674] 
1675["tahoe webopen": add --info flag, to get ?t=info
1676Brian Warner <warner@lothar.com>**20100424233003
1677 Ignore-this: 126b0bb6db340fabacb623d295eb45fa
1678 
1679 Also fix some trailing whitespace.
1680] 
1681[docs: install.html http-equiv refresh to quickstart.html
1682zooko@zooko.com**20100421165708
1683 Ignore-this: 52b4b619f9dde5886ae2cd7f1f3b734b
1684] 
1685[docs: install.html -> quickstart.html
1686zooko@zooko.com**20100421155757
1687 Ignore-this: 6084e203909306bed93efb09d0e6181d
1688 It is not called "installing" because that implies that it is going to change the configuration of your operating system. It is not called "building" because that implies that you need developer tools like a compiler. Also I added a stern warning against looking at the "InstallDetails" wiki page, which I have renamed to "AdvancedInstall".
1689] 
1690[Fix another typo in tahoe_storagespace munin plugin
1691david-sarah@jacaranda.org**20100416220935
1692 Ignore-this: ad1f7aa66b554174f91dfb2b7a3ea5f3
1693] 
1694[Add dependency on windmill >= 1.3
1695david-sarah@jacaranda.org**20100416190404
1696 Ignore-this: 4437a7a464e92d6c9012926b18676211
1697] 
1698[licensing: phrase the OpenSSL-exemption in the vocabulary of copyright instead of computer technology, and replicate the exemption from the GPL to the TGPPL
1699zooko@zooko.com**20100414232521
1700 Ignore-this: a5494b2f582a295544c6cad3f245e91
1701] 
1702[munin-tahoe_storagespace
1703freestorm77@gmail.com**20100221203626
1704 Ignore-this: 14d6d6a587afe1f8883152bf2e46b4aa
1705 
1706 Plugin configuration rename
1707 
1708] 
1709[setup: add licensing declaration for setuptools (noticed by the FSF compliance folks)
1710zooko@zooko.com**20100309184415
1711 Ignore-this: 2dfa7d812d65fec7c72ddbf0de609ccb
1712] 
1713[setup: fix error in licensing declaration from Shawn Willden, as noted by the FSF compliance division
1714zooko@zooko.com**20100309163736
1715 Ignore-this: c0623d27e469799d86cabf67921a13f8
1716] 
1717[CREDITS to Jacob Appelbaum
1718zooko@zooko.com**20100304015616
1719 Ignore-this: 70db493abbc23968fcc8db93f386ea54
1720] 
1721[desert-island-build-with-proper-versions
1722jacob@appelbaum.net**20100304013858] 
1723[docs: a few small edits to try to guide newcomers through the docs
1724zooko@zooko.com**20100303231902
1725 Ignore-this: a6aab44f5bf5ad97ea73e6976bc4042d
1726 These edits were suggested by my watching over Jake Appelbaum's shoulder as he completely ignored/skipped/missed install.html and also as he decided that debian.txt wouldn't help him with basic installation. Then I threw in a few docs edits that have been sitting around in my sandbox asking to be committed for months.
1727] 
1728[TAG allmydata-tahoe-1.6.1
1729david-sarah@jacaranda.org**20100228062314
1730 Ignore-this: eb5f03ada8ea953ee7780e7fe068539
1731] 
1732Patch bundle hash:
17338c1bc2e740154de1c93500887c62f80be9476a84